# Написать пакет lang {#root}

@status:doc/work @audience:author

[p01] Пакет lang учит агента писать на языке или в нотации: идиомы, ограничения, форма хорошего файла. Эта страница пишет такой пакет и объясняет, как vibe распознаёт в нём языковую дисциплину.

[p02]
```prompt
Создай пакет lang org.acme/sql-style в текущем проекте VibeVM, как пакет в дереве под vibevm/vibepacks/: руководство о том, как наша команда пишет SQL. Дай ему стартовый фрагмент, который называет три правила, которым агент должен следовать всегда, и документ-руководство с полными идиомами, примерами и причинами. Запусти на нём vibe check.
```

- needs: навык vibevm, установленный у вашего агента; проект с `vibe.toml` в корне

outcome: `vibevm/vibepacks/org.acme/sql-style/v0.1.0/vibe.toml` объявляет `kind = "lang"` со стартовым фрагментом; у руководства под `vibevm/vibespecs/` разделы с якорями, которые цитирует фрагмент; `vibe check` не находит ошибок

- assert: `vibe check --path vibevm/vibepacks/org.acme/sql-style/v0.1.0 --quiet`
- assert: `grep -q "kind = \"lang\"" vibevm/vibepacks/org.acme/sql-style/v0.1.0/vibe.toml`

## Что происходит {#what-happens}

[p03] Агент создаёт скелет пакета, пишет руководство и его фрагмент так же, как пишут их для flow, и ставит вид `lang`. От flow это отличается жанром, а не механикой. Flow говорит, как работает команда; пакет lang говорит, как писать на чём-то. Вид сообщает агенту, [реестру](../glossary/index.xml#registry) и сайту, что перед ними, ещё до того, как файл открыт.

> [p04] `kind ∈ {flow, feat, stack, tool, mcp, lang, doc, app}` — eight kinds; `mcp` shipped with [PROP-027](../modules/vibe-mcp/PROP-027-mcp-packages.xml); `doc` and `app` admitted by [PROP-057](PROP-057-documentation-packages-and-site.xml) through the `VIBEVM-SPEC.md` §4.1 amendment of 2026-09-12 (pending the owner's ratification at the merge of the docs-2026-09 branch; the code learns the two kinds in that campaign's phase 2). (§Invariants `INV-VOCABULARY` in this file carries the same list.)
>
> <spec://org.vibevm.core/vibevm/common/PROP-000#KIND-SET>

## Что такое пакет lang, а что нет {#what-a-lang-is}

[p05] Жанр шире языков программирования: подходит руководство по языку запросов, нотации конфигурации, диалекту документации или домашнему стилю языка. Не подходит связка инструментов; это stack. Примеры в публичном реестре — руководства по языкам AI-Native для Rust, TypeScript и Go, каждое поставляет руководство, набор карточек и запускаемый тулчейн.

[p06] Язык AI-Native распознаётся ровно по одному признаку: по зависимости от общего ядра дисциплины, `org.vibevm.ai-native/core-ai-native`. Не по группе и не по имени. Третья сторона может опубликовать собственную языковую дисциплину в своей группе, и её распознают так же, так что дисциплина — не закрытый клуб.

> [p07] **`core-ai-native`** (flow) — the language-neutral discipline core. It stands
>   ALONE: it is the shared foundation every language family requires, not itself
>   an aggregator (there is nothing to aggregate beneath a foundation), so no
>   `core-ai-native-lang` / `-mcp` exist. Each `<family>-lang` requires it.
>
> <spec://org.vibevm.core/vibevm/common/PROP-028#FAM-CORE>

## Когда язык приносит инструменты {#families}

[p08] Языковое руководство, которое поставляет ещё и инструменты, проверщик, форматер, оракул типов, становится [семейством](../glossary/index.xml#family). Пакет руководства — `<family>-lang`; пакет сервера `<family>-mcp` обслуживает те же инструменты для агентов; бандл `<family>` закрепляет оба на одной версии. Участники двигаются в унисон; потребитель требует бандл и получает проверенный набор.

> [p09] A **package family** is a set of packages sharing a `<family>` stem and
> delivering one coherent capability across three roles:
>
> <spec://org.vibevm.core/vibevm/common/PROP-028#FAMILY-DEF>

> [p10] Within a family the members move in **unison**: a content change to any member
>   bumps EVERY member of that family to one shared version, and the aggregator's
>   version IS that family version.
>
> <spec://org.vibevm.core/vibevm/common/PROP-028#UNISON-LAW>

[p11] Основа семейства ведёт каждую именованную поверхность: крейты, бинарники, [навыки](../glossary/index.xml#skill) и сервер несут префикс `<family>`, так что всё одного языка сортируется и читается вместе.

> [p12] The family stem is language-FIRST and reaches every named surface a family
> ships, not only the package identities. Each crate, binary, agent skill, and
> MCP server carries the `<family>` prefix:
>
> <spec://org.vibevm.core/vibevm/common/PROP-028#SURFACE-NAMING-LAW>

## Руками {#by-hand}

[p13] 1. Создайте слот пакета, затем поставьте `kind = "lang"` в его [манифесте](../glossary/index.xml#manifest):

[p14] Example `init-lang` is copied from the source page at projection time.

[p15] 2. Внутри слота напишите `vibevm/vibespecs/boot/sql-style.xml` с правилами, которым агент должен следовать каждый раз. Руководство положите под `vibevm/vibespecs/lang/sql-style/`, с причинами, идиомами и примерами.

[p16] 3. Объявите `[boot_snippet] source = "vibevm/vibespecs/boot/sql-style.xml"`, `category = "stack"`, чтобы правила языка шли после flow-пакетов команды в списке чтения потребителя.

[p17] 4. Проверьте: `vibe check --path vibevm/vibepacks/org.acme/sql-style/v0.1.0`.

## Особые случаи и правила {#edge-cases}

[p18] Что из принесённого языком можно запустить, отвечает `vibe tools`, а не вид: [стартовая полоса](../glossary/index.xml#boot-lane) говорит, какие дисциплины установлены, реестр инструментов — что они принесли.

[p19] Пока вида `lang` не было, языковые руководства были stack-пакетами; пакет `stack`, который на самом деле руководство, должен перейти в `lang` при следующей версии, чтобы слово значило одно.

