<?xml version="1.0" encoding="UTF-8"?>
<spec xmlns="https://vibevm.org/spec/1">
  <title id="root">Два дерева: что пишете вы и что пишет vibe</title>
  <status stage="doc" state="work" audience="user"/>
  <p p="1">Проект держит порознь два рода текста: правила, которые написала ваша команда, и копии общих правил, которые пришли с установленными пакетами. Установка пакета никогда не правит ваш текст. Удаление никогда не оставляет в нём следа.</p>
  <example ref="list" p="2"/>
  <section id="the-rule" title="Основное правило">
    <p p="3">Вспомните, как программа на C++ пользуется библиотекой: вы пишете `#include`, заголовки библиотеки читаются при сборке, но никто не вклеивает исходники библиотеки в ваши файлы. vibe следует тому же правилу для текста. Ваши [спецификации](../glossary/index.xml#specification) живут в `vibevm/vibespecs/`; пакеты, от которых вы зависите, копируются целиком и без изменений в `vibevm/vibedeps/`, по папке на пакет и версию. Два дерева никогда не смешиваются.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-workspace/PROP-009#TWO-TREES" p="4"/>
    <p p="5">Следствие просто сформулировать и легко забыть: каждый файл под `vibevm/vibedeps/` — копия чего-то, опубликованного в другом месте. Правка там ничего не меняет наверху и живёт только до следующей установки. Если хотите, чтобы пакет говорил иначе, измените пакет, опубликуйте новую версию и обновитесь.</p>
  </section>
  <section id="why-commit" title="Почему копии коммитятся">
    <p p="6">Скопированное дерево коммитится в ваш репозиторий, и это удивляет тех, кто ждёт, что каталог в духе `node_modules` будет проигнорирован. Причина — читатель: агент, который клонирует репозиторий, должен начать читать сразу, без сети, без инструмента и не зная, что vibe существует. Закоммиченное дерево превращает весь список чтения в набор обычных файлов чекаута, а ревью кода видит ровно тот текст, который агент прочитает после смены зависимости.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-workspace/PROP-009#VIBEDEPS-COMMITTED" p="7"/>
  </section>
  <section id="what-regenerates" title="Что и когда пересобирается">
    <p p="8">Три вещи в проекте выводятся из [манифеста](../glossary/index.xml#manifest) и [лок-файла](../glossary/index.xml#lock-file), и vibe пересобирает их по требованию: дерево зависимостей, сгенерированные стартовые файлы и [управляемый блок](../glossary/index.xml#managed-block) в файлах инструкций для агентов. `vibe reinstall` пересобирает все три из лок-файла и машинного [хранилища](../glossary/index.xml#store), не спрашивая ни один [реестр](../glossary/index.xml#registry); добавьте `--force`, чтобы скачать файлы пакетов заново из их источников.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-workspace/PROP-009#REINSTALL" p="9"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-workspace/PROP-011#BYPASS-REINSTALL" p="10"/>
    <p p="11">`vibe clean` идёт на шаг дальше и удаляет выведенное состояние целиком, сохраняя всё, что вы написали, лок-файл и машинное хранилище. Это команда для чистого старта перед сборкой, и она отказывается работать вне проекта, чтобы не вымести не ту папку.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-workspace/PROP-053#CLEAN-KEEPS-AUTHORED" p="12"/>
  </section>
  <section id="edge-cases" title="Особые случаи и правила">
    <p p="13">Папка пакета в дереве зависимостей названа по его группе, имени и версии, так что две версии одного пакета могут лежать рядом во время обновления, и ничего не перезаписывается на месте.</p>
    <p p="14">Если вы разрабатываете пакеты в том же репозитории, их исходники живут в третьем дереве, `vibevm/vibepacks/`, которое ваше и которое вы правите. Когда проект в этом репозитории требует один из них, vibe всё равно копирует его в дерево зависимостей, как любой другой пакет.</p>
    <p p="15">Два файла в стартовой папке ваши по закону: `vibevm/vibespecs/boot/00-core` и `90-user`, Markdown в проекте, который создаёт `vibe init`, и XML в проекте, написанном на диалекте. Ни установка, ни обновление, ни удаление их не пишут никогда.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-000#INV-USER-FILES" p="16"/>
    <p p="17">Управляемый блок в файле инструкций остаётся там, куда вы его поставили: vibe переписывает текст между маркерами и никогда не двигает сами маркеры, так что всё, что вы написали до или после блока, сохраняет своё место.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-workspace/PROP-012#POSITION-USERS" p="18"/>
  </section>
</spec>
