<?xml version="1.0" encoding="UTF-8"?>
<spec xmlns="https://vibevm.org/spec/1">
  <title id="root">Перекиньте мост к чужому репозиторию</title>
  <status stage="doc" state="work" audience="author,user"/>
  <p p="1">Иногда текст, который должен читать ваш агент, живёт в репозитории, чей автор никогда не слышал о vibe. Пакет-мост делает его устанавливаемым всё равно: вы сопровождаете чужой репозиторий и публикуете обычный пакет, который его оборачивает, с авторством и лицензией оригинала, отделёнными от ваших.</p>
  <prompt id="bridge-a-repository" p="2">
    Создай в этом проекте пакет-мост org.example/spec-kit, который оборачивает репозиторий https://github.com/example/spec-kit на его текущем теге выпуска как источник по ссылке, держи авторов и лицензию оригинала отдельно от наших и проверь пакет, прежде чем я его опубликую.
    <needs>навык vibevm, установленный у вашего агента; доступ по сети к исходному репозиторию</needs>
    <outcome>слот пакета с `bridge = true` и одним `[[embedded_source]]`, называющим адрес, коммит и хеш исходника оригинала; `vibe check` не находит ошибок</outcome>
    <assert>vibe check --path vibevm/vibepacks/org.example/spec-kit/v0.1.0 --quiet</assert>
  </prompt>
  <section id="what-happens" title="Что происходит">
    <p p="3">Агент размечает пакет через `vibe init package`, помечает его мостом в манифесте и объявляет исходный репозиторий встроенным источником: его публичный адрес, точный коммит, хеш дерева исходников и лицензию оригинала. Установка пакета скачивает ровно этот исходник в машинное [хранилище](../glossary/index.xml#store) потребителя рядом с собственными файлами пакета. Мост никогда не становится вторым пакетом: обёрнутый репозиторий — это git-содержимое, о котором резолвер ничего не знает.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-registry/PROP-023#BRIDGE-DEF" p="4"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-registry/PROP-023#BRIDGE-FLAG" p="5"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-registry/PROP-021#NOT-A-PACKAGE" p="6"/>
  </section>
  <section id="three-classes" title="Три способа держать оригинал">
    <p p="7">Вендоренный: вы скопировали дерево оригинала в пакет и закоммитили. Это самый дешёвый мост, простые файлы и флаг, с [хуками](../glossary/index.xml#hook), если раскладку надо подправить. На подмодуле: ваш workspace ссылается на оригинал через git-подмодуль, который прямая git-установка сохраняет живым, а публикация сплющивает в обычные файлы. По ссылке: репозиторий пакета держит только ваши метаданные и адаптеры, а `[[embedded_source]]` называет адрес оригинала, неизменяемый коммит, хеш дерева исходников и лицензию; установка скачивает ровно этот исходник.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-registry/PROP-023#CLASS-VENDORED" p="8"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-registry/PROP-023#CLASS-SUBMODULE" p="9"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-registry/PROP-023#CLASS-REFERENCE" p="10"/>
    <fence lang="toml" p="11">[package]
name = "spec-kit"
group = "org.example"
kind = "flow"
version = "0.1.0"
bridge = true
license = "UPL-1.0"

[[embedded_source]]
name = "spec-kit"
url = "https://github.com/example/spec-kit"
commit = "0123456789abcdef0123456789abcdef01234567"
content_hash = "sha256:…"
upstream_authors = ["The Spec Kit contributors"]
upstream_license = "MIT"</fence>
    <p p="12">Объявленный источник аутентифицируется дважды, когда приходит: чекаут должен стоять на объявленном коммите, а хеш его дерева должен равняться объявленному. `ref_hint`, например имя тега, только для людей и никогда не выбирает байты.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-registry/PROP-021#FORM-DEPENDENCY-DECLARED" p="13"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-registry/PROP-021#DECLARED-SOURCE-AUTH" p="14"/>
  </section>
  <section id="whose-work" title="Чья это работа">
    <p p="15">`authors` в манифесте называет людей, которые написали мост, его метаданные и адаптеры, и никогда авторов обёрнутых байтов; каждый встроенный источник записывает собственных `upstream_authors`, а списки, локи и [индексы](../glossary/index.xml#index-registry) держат два списка порознь. То же с лицензиями: `license` описывает только мост, каждый источник записывает лицензию оригинала и неизменяемую ссылку на неё, и мост никогда не выдаёт байты оригинала за перелицензированные. [Координата](../glossary/index.xml#coordinate) называет продукт, который ставит потребитель, а не кодовую базу, в которой писали упаковку: мост к Spec Kit может жить по адресу `org.speckit/speckit`, кто бы его ни сопровождал.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-registry/PROP-023#AUTHORSHIP-SEPARATION" p="16"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-registry/PROP-023#LICENSE-BOUNDARY" p="17"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-registry/PROP-023#GROUP-PROVENANCE" p="18"/>
  </section>
  <section id="submodules" title="Подмодули на входе и на выходе">
    <p p="19">vibe скачивает подмодули пакета, когда скачивает пакет, обновляет их вместе с ним и делает их содержимое доступным везде, где пакет оказывается: копирует в снимок для копирующих режимов, оставляет живыми для чекаута на месте. Публикация — граница: репозиторий [реестра](../glossary/index.xml#registry) — самодостаточный снимок, поэтому публикатор проверяет, что каждый заполненный подмодуль стоит на своём проиндексированном коммите и чист, копирует его файлы внутрь, удаляет `.gitmodules` и сообщает, что сплющил.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-registry/PROP-021#WHAT-VVM-DOES" p="20"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-registry/PROP-021#PUBLISH-FLATTENS-GITLINKS" p="21"/>
  </section>
  <section id="edge-cases" title="Особые случаи и правила">
    <p p="22">Мост публикуется и ставится как любой пакет; добавляет он происхождение. Оригинал может уйти вперёд без вас: поднять мост — значит поменять объявленный коммит и хеш и опубликовать новую версию.</p>
  </section>
</spec>
