<?xml version="1.0" encoding="UTF-8"?>
<spec xmlns="https://vibevm.org/spec/1">
  <title id="root">Что лежит в проекте</title>
  <status stage="doc" state="work" audience="user"/>
  <p p="1">После первой установки в проекте лежит горстка файлов, которые написали вы, и набор побольше, который vibe написал за вас. Эта страница называет каждый из них и говорит, кому можно его менять, чтобы ничего из вашего не было перезаписано и ничего из сгенерированного не правили руками.</p>
  <example ref="tree" p="2"/>
  <section id="the-files" title="Файлы, один за другим">
    <p p="3">Начните с двух файлов в корне, потому что всё остальное выводится из них.</p>
    <p p="4">`vibe.toml` — это *[манифест](../glossary/index.xml#manifest)*. Его пишете вы, или `vibe init` пишет первую версию за вас. Он называет проект, перечисляет нужные пакеты с диапазоном версий для каждого и перечисляет [реестры](../glossary/index.xml#registry), откуда их брать. Это единственный файл, который нужен коллеге, чтобы воспроизвести вашу настройку, вместе с [лок-файлом](../glossary/index.xml#lock-file) рядом.</p>
    <p p="5">`vibe.lock` — это *лок-файл*. Его пишет vibe, вы его коммитите и никогда не правите. Он записывает точную версию каждого установленного пакета, включая те, что притянули ваши пакеты, и [отпечаток](../glossary/index.xml#fingerprint) содержимого каждого. С ним свежий клон ставит те же байты на любой машине.</p>
    <p p="6">Ниже лежит один каталог, `vibevm/`, с тремя детьми. Эта раскладка одинакова в каждом проекте и каждом пакете, и она не настраивается.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-052#THE-LAYOUT" p="7"/>
    <p p="8">`vibevm/vibespecs/` — *ваше* дерево: [спецификации](../glossary/index.xml#specification) и правила, которые пишет сам этот проект, в Markdown или в XML-диалекте проекта. vibe читает его и никогда в него не пишет, с одним исключением, описанным ниже.</p>
    <p p="9">`vibevm/vibedeps/` — дерево *vibe*: по папке на установленный пакет и версию, с опубликованными файлами этого пакета как есть. Вы его коммитите, чтобы свежий клон читался без запуска чего бы то ни было, но никогда не правите. Правка там исчезает при следующей установке.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-workspace/PROP-009#VIBEDEPS-COMMITTED" p="10"/>
    <p p="11">В `vibevm/vibepacks/` лежат пакеты, которые этот репозиторий разрабатывает на месте: проект, который и сам публикует пакеты, держит их исходники здесь, и vibe считает этот каталог маленьким локальным реестром. У большинства проектов его нет.</p>
  </section>
  <section id="the-boot-files" title="Стартовые файлы">
    <p p="12">Исключение в вашем дереве — `vibevm/vibespecs/boot/`. Два файла там ваши: `00-core` держит основы проекта, `90-user` — ваши личные переопределения, и vibe не трогает ни тот, ни другой. Два файла там сгенерированы: `INDEX.md`, манифест того, что читает агент, есть всегда, а `STATIC.md`, текст, который он читает первым и целиком, есть только когда какой-то пакет попросил читать себя именно так. Оба несут заголовок о том, что они сгенерированы; этот заголовок не украшение.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-workspace/PROP-009#ARTIFACTS-GENERATED" p="13"/>
    <p p="14">Агент находит стартовые файлы через короткий [управляемый блок](../glossary/index.xml#managed-block) в конце `CLAUDE.md`, `AGENTS.md` и `GEMINI.md`, между строками `&lt;vibevm&gt;` и `&lt;/vibevm&gt;`. vibe переписывает то, что между двумя маркерами, и ничего больше в этих файлах; остальной файл ваш, и место блока, раз он появился, — тоже ваше.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-workspace/PROP-012#OUTSIDE-PRESERVED" p="15"/>
  </section>
  <section id="who-writes-what" title="Кто что пишет">
    <table p="16">
      <tr>
        <td>Файл или каталог</td>
        <td>Кто пишет</td>
        <td>Коммитится</td>
        <td>Правится руками</td>
      </tr>
      <tr>
        <td>`vibe.toml`</td>
        <td>вы (первую версию — `vibe init`)</td>
        <td>да</td>
        <td>да</td>
      </tr>
      <tr>
        <td>`vibe.lock`</td>
        <td>vibe</td>
        <td>да</td>
        <td>никогда</td>
      </tr>
      <tr>
        <td>`vibevm/vibespecs/`</td>
        <td>вы</td>
        <td>да</td>
        <td>да</td>
      </tr>
      <tr>
        <td>`vibevm/vibespecs/boot/00-core`, `90-user`</td>
        <td>вы</td>
        <td>да</td>
        <td>да</td>
      </tr>
      <tr>
        <td>`vibevm/vibespecs/boot/INDEX.md`, `STATIC.md`</td>
        <td>vibe</td>
        <td>да</td>
        <td>никогда</td>
      </tr>
      <tr>
        <td>`vibevm/vibedeps/`</td>
        <td>vibe</td>
        <td>да</td>
        <td>никогда</td>
      </tr>
      <tr>
        <td>`vibevm/vibepacks/`</td>
        <td>вы, когда репозиторий разрабатывает пакеты</td>
        <td>да</td>
        <td>да</td>
      </tr>
      <tr>
        <td>блок `&lt;vibevm&gt;` в файлах инструкций для агентов</td>
        <td>vibe</td>
        <td>да</td>
        <td>только его место</td>
      </tr>
      <tr>
        <td>`.vibe/`</td>
        <td>vibe</td>
        <td>нет</td>
        <td>никогда</td>
      </tr>
    </table>
    <p p="17">Последняя строка — черновая область проекта: кэши и внутреннее состояние, которые git игнорирует и которые можно спокойно удалить. Машинное [хранилище](../glossary/index.xml#store) скачанных пакетов лежит в другом месте, в вашем домашнем каталоге, и его делят все проекты на машине.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-000#VIBE-DIR-IGNORED" p="18"/>
    <p p="19">Ещё одна папка появляется, когда проект начинает вести учёт, какие правила своих пакетов он принял: `vibefacts/`, коммитится, по маленькому TOML-файлу на пакет. Установка пакета не копирует туда ни одного статуса автора; принять их — осознанное действие, `vibe facts adopt`, а `vibe facts` — рычаг для всего остального: перечислить, задать статус по адресу, синхронизировать и отчитаться. Удаление пакета спрашивает, оставить ли его файл принятия или убрать; `vibe facts clean` удаляет файлы исчезнувших пакетов, а после обновления `vibe facts sync` сообщает о [якорях](../glossary/index.xml#anchor), которые пропали или переехали.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-046#REGISTRY-HOME" p="20"/>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-046#LAW-SOVEREIGNTY" p="21"/>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-046#CLI-FACTS" p="22"/>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-046#LAW-LIFECYCLE" p="23"/>
  </section>
  <section id="edge-cases" title="Особые случаи и правила">
    <p p="24">Если вы удалите `vibevm/vibedeps/` или сгенерированные стартовые файлы, `vibe reinstall` восстановит их из лок-файла и хранилища, не трогая сеть.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-workspace/PROP-009#REINSTALL-NO-FORCE" p="25"/>
    <p p="26">Если проект из времён до нынешней раскладки несёт корневую папку `spec/`, vibe останавливается с рецептом миграции, а не гадает. Старые раскладки молча не читаются.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-052#NO-LEGACY-LAYOUT" p="27"/>
    <p p="28">Если вы случайно напишете в `vibevm/vibedeps/`, сразу ничего не сломается; следующая установка перезапишет правку, потому что папка пакета там — дословная копия опубликованного.</p>
  </section>
</spec>
