<?xml version="1.0" encoding="UTF-8"?>
<spec xmlns="https://vibevm.org/spec/1">
  <title id="root">Манифест: vibe.toml</title>
  <status stage="doc" state="work" audience="user,author"/>
  <p p="1">`vibe.toml` — единственный файл, который вы пишете, чтобы описать проект или пакет: его имя, от чего он зависит, откуда берутся пакеты и что он доставляет. Эта страница перечисляет каждую таблицу и поле с их смыслом.</p>
  <section id="one-file" title="Один файл, три роли">
    <p p="2">У каждого узла, будь то проект-потребитель, публикуемый пакет или корень рабочего пространства, есть файл с именем `vibe.toml`. Присутствующие таблицы решают роль: `[project]` помечает потребителя, который никогда не публикуется, `[package]` — публикуемый пакет, `[workspace]` — координатора участников; первые две исключают друг друга, третья сочетается с любой из них или ни с одной.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-workspace/PROP-007#ONE-MANIFEST" p="3"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-workspace/PROP-007#PACKAGE-XOR-PROJECT" p="4"/>
    <p p="5">Неизвестные ключи отвергаются, а не игнорируются: [манифест](../glossary/index.xml#manifest), написанный для более нового vibe, чем тот, что его читает, не разбирается, и ошибка называет виновный ключ.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-resolver/PROP-003#DENY-UNKNOWN-FIELDS" p="6"/>
  </section>
  <section id="package-table" title="[package]">
    <table p="7">
      <tr>
        <td>Поле</td>
        <td>Смысл</td>
      </tr>
      <tr>
        <td>`name`</td>
        <td>имя пакета, kebab-case, уникальное внутри группы</td>
      </tr>
      <tr>
        <td>`group`</td>
        <td>пространство имён издателя, перевёрнутый домен вроде `org.vibevm.world`; обязательно; `(group, name)` — идентичность</td>
      </tr>
      <tr>
        <td>`kind`</td>
        <td>один из восьми видов; метаданные, а не идентичность</td>
      </tr>
      <tr>
        <td>`version`</td>
        <td>семантическая версия этого пакета</td>
      </tr>
      <tr>
        <td>`epoch`, `format`</td>
        <td>эпоха манифеста пакета и форма его содержимого (`simple` по умолчанию, `normal` для раскладки из contract и source)</td>
      </tr>
      <tr>
        <td>`authors`, `license`, `description`, `homepage`, `keywords`</td>
        <td>карточка, которую показывает каждый реестр</td>
      </tr>
      <tr>
        <td>`title`, `abstract`</td>
        <td>человекочитаемое имя и сводка из четырёх вопросов, показываемые на полках документации; обязательны для пакетов `doc`, иначе необязательны</td>
      </tr>
      <tr>
        <td>`authorship`</td>
        <td>кто написал прозу пакета `doc`: `human`, `ai` или `mixed`; фильтр читателя, а не атрибуция коммитов</td>
      </tr>
      <tr>
        <td>`describes`</td>
        <td>Package URL исходной библиотеки, которую этот пакет документирует или оборачивает, для поиска по совпадению версий</td>
      </tr>
      <tr>
        <td>`publish`</td>
        <td>позиция участника рабочего пространства при публикации</td>
      </tr>
    </table>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-registry/PROP-008#GROUP-MANDATORY" p="8"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-registry/PROP-008#GROUP-GRAMMAR" p="9"/>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-057#CARD-FIELDS" p="10"/>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-057#CARD-AUTHORSHIP" p="11"/>
    <p p="12">`[project]` несёт те же описательные поля для потребителя, без строки версии и без вида.</p>
  </section>
  <section id="requirements" title="[requires] и его соседи">
    <table p="13">
      <tr>
        <td>Таблица</td>
        <td>Смысл</td>
      </tr>
      <tr>
        <td>`[requires.packages]`</td>
        <td>по ключу на требуемую координату; значение — строка ограничения или инлайновая таблица с `version`, источником `git` или `path`, `link` для типа включения в старт и метками видимости `access`, `friend` и `exclude`</td>
      </tr>
      <tr>
        <td>`[visibility]`</td>
        <td>`friends`, `unfriend`, `allow-friends` и `ignore-concept-warnings` для пакета в целом; см. [Видимость зависимостей](../model/dependency-visibility.xml)</td>
      </tr>
      <tr>
        <td>`[override]` (таблица)</td>
        <td>переписывает метки видимости на рёбрах, которыми вы не владеете, ключом `"a -&gt; b"`, или `allow-friends` провайдера, ключом по его координате</td>
      </tr>
      <tr>
        <td>`[requires] capabilities`</td>
        <td>абстрактные умения, которые может удовлетворить любой провайдер, `namespace:name@constraint`</td>
      </tr>
      <tr>
        <td>`[[requires_any]]`</td>
        <td>дизъюнкция: ровно одно из `one_of` должно быть удовлетворено</td>
      </tr>
      <tr>
        <td>`[provides] capabilities`</td>
        <td>умения, которые предлагает этот пакет</td>
      </tr>
      <tr>
        <td>`[obsoletes]`, `[conflicts]`</td>
        <td>пакеты, которые этот вытесняет, и пакеты, которые не могут сосуществовать с ним</td>
      </tr>
      <tr>
        <td>`[features]`</td>
        <td>необязательные, аддитивные наборы содержимого со списком `default`; фичи могут зависеть от фич</td>
      </tr>
      <tr>
        <td>`[compatibility]`</td>
        <td>`min_vibe_version` и `requires_kinds`</td>
      </tr>
    </table>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-workspace/PROP-009#SCHEMA-LINK-FIELD" p="14"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-resolver/PROP-003#FEATURES-TABLE" p="15"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-registry/PROP-002#CAP-REQUIRES-PACKAGES" p="16"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-registry/PROP-002#CAP-REQUIRES-CAPABILITIES" p="17"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-registry/PROP-002#CAP-REQUIRES-ANY" p="18"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-registry/PROP-002#CAP-PROVIDES" p="19"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-registry/PROP-002#CAP-OBSOLETES" p="20"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-registry/PROP-002#CAP-CONFLICTS" p="21"/>
    <p p="22">[Фича](../glossary/index.xml#feature) добавляет содержимое и никогда ничего не убирает и не противоречит; `default` перечисляет фичи, активные, когда ничего не сказано, а `--no-default-features` их опускает. Когда два пакета требуют один пакет с разными фичами, резолвер материализует его один раз с объединением. В командной строке активацией управляют `vibe install &lt;coordinate&gt; --features a,b`, `--no-default-features` и `--all-features`.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-resolver/PROP-003#KEEP-ADDITIVE" p="23"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-resolver/PROP-003#KEEP-DEFAULT" p="24"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-resolver/PROP-003#KEEP-UNIFICATION" p="25"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-resolver/PROP-003#CLI-INSTALL-FEATURES" p="26"/>
  </section>
  <section id="sources" title="Откуда берутся пакеты">
    <table p="27">
      <tr>
        <td>Таблица</td>
        <td>Смысл</td>
      </tr>
      <tr>
        <td>`[[registry]]`</td>
        <td>упорядоченный список источников пакетов: `name`, `url` (корень организации), `naming`, `auth`, необязательные `index_url` и `token_env`</td>
      </tr>
      <tr>
        <td>`[[mirror]]`</td>
        <td>альтернативный адрес для одного реестра или для любого, пробуется по `priority` и проверяется по отпечатку</td>
      </tr>
      <tr>
        <td>`[[override]]`</td>
        <td>замена источника для одной координаты, в обход реестров</td>
      </tr>
      <tr>
        <td>`[boot]`</td>
        <td>настройки загрузки для всего рабочего пространства; сегодня `link` по умолчанию</td>
      </tr>
      <tr>
        <td>`[i18n]`</td>
        <td>языки `preferred` и `fallback` в проекте; `canonical` и `available` в пакете</td>
      </tr>
      <tr>
        <td>`[workspace] members`</td>
        <td>пути участников рабочего пространства, глобы разрешены</td>
      </tr>
    </table>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-registry/PROP-002#REGISTRY-ARRAY" p="28"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-registry/PROP-002#MIRROR-LAYER" p="29"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-resolver/PROP-003#I18N-DECISION" p="30"/>
    <p p="31">Локализованный файл лежит рядом с каноническим, с тегом языка перед расширением, `README.ru.md` рядом с `README.md`. Каждый пакет поставляет каноническую форму каждого файла, который перечисляет, а переводы только добавляют к ней, так что проект без перевода на предпочитаемый язык ставится без ошибки. `vibe install --language ru` задаёт предпочтение на один запуск.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-resolver/PROP-003#SIDECAR-PATTERN" p="32"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-resolver/PROP-003#I18N-CANONICAL-INVARIANT" p="33"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-resolver/PROP-003#PREF-CLI-FLAG" p="34"/>
  </section>
  <section id="deliveries" title="Что доставляет пакет">
    <table p="35">
      <tr>
        <td>Таблица</td>
        <td>Смысл</td>
        <td>Где законна</td>
      </tr>
      <tr>
        <td>`[boot_snippet]`</td>
        <td>`source`, файл фрагмента внутри пакета, и `category` для его места в порядке старта; необязательные `when` и предлагаемый `link`</td>
        <td>все виды, кроме `doc`</td>
      </tr>
      <tr>
        <td>`[[skill]]`</td>
        <td>`name`, `path`, `description`, необязательные целевые `agents`: [навык](../glossary/index.xml#skill), который агент может установить</td>
        <td>все виды</td>
      </tr>
      <tr>
        <td>`[[binary]]`</td>
        <td>`name` и `crate`: инструмент, который vibe собирает при установке и запускает через `vibe bin exec`</td>
        <td>виды с кодом; не `doc`</td>
      </tr>
      <tr>
        <td>`[[mcp_server]]`</td>
        <td>`name`, `binary`, `args`: сервер, регистрируемый у агентов</td>
        <td>только `mcp`</td>
      </tr>
      <tr>
        <td>`[hooks]`</td>
        <td>базовые пути скриптов `pre-install` и `post-install`</td>
        <td>пакеты</td>
      </tr>
      <tr>
        <td>`[[extension]]`</td>
        <td>`id`, `point`, `handler`, необязательные селектор и config: вклад в жизненный цикл</td>
        <td>пакеты и проекты</td>
      </tr>
      <tr>
        <td>`[[embedded_source]]`</td>
        <td>неизменяемый внешний источник, на который пакет ссылается, не вендоря его</td>
        <td>пакеты-мосты</td>
      </tr>
    </table>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-workspace/PROP-009#SCHEMA-BOOT-SNIPPET" p="36"/>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-018#SKILL-TABLE-SHAPE" p="37"/>
    <p p="38">[Навык](../glossary/index.xml#skill) — секция манифеста, а не отдельный вид. `include` сужает, какие файлы из `path` проецируются в папку навыков агента, а его отсутствие проецирует всё дерево. Навык может взять своё тело из объявленного `[[embedded_source]]` и добавить ресурсы под папкой `references/`, с тем же отбором include и теми же проверками обхода.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-018#SKILL-SECTION-NOT-KIND" p="39"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-mcp/PROP-015#INCLUDE-SELECTIVE" p="40"/>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-018#SKILL-EXTERNAL-SHAPE" p="41"/>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-018#SKILL-EXTERNAL-LAWS" p="42"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-workspace/PROP-025#BINARY-TABLE" p="43"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-mcp/PROP-027#TABLE-ONLY-IN-KIND" p="44"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-workspace/PROP-020#HOOKS-TABLE" p="45"/>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-054#CONTRIB-GRAMMAR" p="46"/>
  </section>
  <section id="documentation-tables" title="Документация и её предметы">
    <table p="47">
      <tr>
        <td>Таблица</td>
        <td>Смысл</td>
        <td>Где законна</td>
      </tr>
      <tr>
        <td>`[[documents]]`</td>
        <td>`package` и ограничение `version`: [предмет](../glossary/index.xml#subject), который описывает эта документация; обязательно, повторяемо</td>
        <td>`doc`</td>
      </tr>
      <tr>
        <td>`[documentation]`</td>
        <td>`primary` (не больше одной координаты) и `official` (сколько угодно): документация, которую пакет называет своей</td>
        <td>все виды</td>
      </tr>
      <tr>
        <td>`[translates]`</td>
        <td>`package` и `version` документации, которую зеркалит этот перевод</td>
        <td>`doc`</td>
      </tr>
      <tr>
        <td>`[navigation]`</td>
        <td>`pinned`, пути документов, которые перечисляются первыми, и строки `[[navigation.section]]` с `id` и `title` для папок дерева страниц</td>
        <td>`doc`</td>
      </tr>
      <tr>
        <td>`[media]`</td>
        <td>`icon`, `banner`, `preview`: исходные файлы изображений в пределах ограничений карточки</td>
        <td>все виды</td>
      </tr>
    </table>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-057#REL-DOCUMENTS-REQUIRED" p="48"/>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-057#REL-DOCUMENTATION-UNVERSIONED" p="49"/>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-057#LOC-PACKAGE-PER-LANGUAGE" p="50"/>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-057#CARD-MEDIA-SOURCE" p="51"/>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-057#NAV-PINNED" p="52"/>
  </section>
  <section id="example-manifest" title="Полный пример">
    <fence lang="text" p="53"># Written by `vibe doc build-site`: the level-0 view of one published version
# (PROP-057 `##LEVEL-ZERO`). It is a render input and never a package.

[package]
name = "vibevm-docs-ru"
group = "org.vibevm.core"
version = "1.0.0"
kind = "doc"
title = "Руководство VibeVM"
abstract = "Что покрывает: что такое VibeVM и как он даёт агенту-кодеру нужный текст для чтения; установку vibe; создание проекта; пакеты, реестры, лок-файл и машинный store; установку, обновление, публикацию и работу без сети; навык vibevm для агента и работу через него; жизненный цикл от проверки до выкладки; полный справочник команд, манифеста, лок-файла и настроек; написание пакетов всех видов, включая документацию и её адаптации.\nДля кого: для тех, кто запускает vibe в своих проектах, для тех, кто пишет пакеты, и для агентов, которые читают за них.\nЧто считает известным: как пользоваться терминалом и текстовым редактором, что такое агент-кодер и что делает менеджер пакетов для языка программирования.\nЧего не покрывает: сами нормативные спецификации (руководство их цитирует, а не пересказывает), внутреннее устройство отдельных агентов и историю проектирования vibe."
description = "Руководство VibeVM по-русски: установить vibe, понять пакеты и стартовую полосу, работать с агентом, писать и публиковать пакеты."
authorship = "ai"
authors = ["Oleg Chirukhin"]

[i18n]
canonical = "ru"

[[documents]]
package = "org.vibevm.core/vibevm"
version = "^1.0"

[translates]
package = "org.vibevm.core/vibevm-docs"
version = "^1.0"

[navigation]
pinned = ["start/what-vibevm-is", "start/index"]

[[navigation.section]]
id = "start"
title = "Старт"

[[navigation.section]]
id = "model"
title = "Модель"

[[navigation.section]]
id = "howto"
title = "Как сделать"

[[navigation.section]]
id = "agent"
title = "Агент"

[[navigation.section]]
id = "lifecycle"
title = "Жизненный цикл"

[[navigation.section]]
id = "authoring"
title = "Авторам"

[[navigation.section]]
id = "reference"
title = "Справочник"

[[navigation.section]]
id = "architecture"
title = "Архитектура"

[[navigation.section]]
id = "diagnostics"
title = "Диагностика"

[[navigation.section]]
id = "faq"
title = "Вопросы"

[[navigation.section]]
id = "glossary"
title = "Глоссарий"</fence>
    <p p="54">Манифест этого перевода, сгенерированный из самого пакета, показывает пакет `doc` с карточкой, [предметом](../glossary/index.xml#subject) и таблицей `[translates]`, которая называет источник.</p>
  </section>
</spec>
