Write a lang package
01A lang package teaches an agent how to write in a language or a notation: the idioms, the constraints, the shape of a good file. This page writes one and explains how vibe recognises it as a language discipline.
Create a lang package org.acme/sql-style in the current VibeVM project, as an in-tree package under vibevm/vibepacks/: a guide on how our team writes SQL. Give it a boot snippet that names the three rules an agent must always follow, and a guide document with the full idioms, examples and the reasons behind them. Run vibe check on it.
the vibevm skill installed for your agent; a project with vibe.toml at the root
vibevm/vibepacks/org.acme/sql-style/v0.1.0/vibe.toml declares kind = "lang" with a boot snippet; the guide under vibevm/vibespecs/ has anchored sections the snippet cites; vibe check reports no errors
vibe check --path vibevm/vibepacks/org.acme/sql-style/v0.1.0 --quietgrep -q "kind = \"lang\"" vibevm/vibepacks/org.acme/sql-style/v0.1.0/vibe.toml
What happens
03The agent creates the package skeleton, writes the guide and its snippet the way a flow's are written, and sets the kind to lang. The difference from a flow is the genre, not the mechanics. A flow says how the team works; a lang package says how to write in something. The kind tells an agent, a registry and the site which is which before the file is opened.
04kind ∈ {flow, feat, stack, tool, mcp, lang, doc, app}— eight kinds;mcpshipped with PROP-027;docandappadmitted by PROP-057 through theVIBEVM-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). (§InvariantsINV-VOCABULARYin this file carries the same list.)
What a lang package is, and is not
05The genre is wider than programming languages: a guide to a query language, a configuration notation, a documentation dialect or a house style of a language all fit. What does not fit is a bundle of tools; that is a stack. The examples in the public registry are the AI-Native language guides for Rust, TypeScript and Go, each shipping a guide, a set of cards and a runnable toolchain.
06An AI-Native language is recognised by one thing only: its dependency on the shared discipline core, org.vibevm.ai-native/core-ai-native. Not by its group, not by its name. A third party may publish its own language discipline in its own group and be recognised the same way, so the discipline is not a closed club.
07core-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 nocore-ai-native-lang/-mcpexist. Each<family>-langrequires it.
When a language brings tools
08A language guide that also ships tools, a checker, a formatter, a type oracle, becomes a family. The guide package is <family>-lang; a server package <family>-mcp serves the same tools to agents; a bundle <family> pins both at one version. The members move in unison; a consumer requires the bundle and gets a tested set.
09
A package family is a set of packages sharing a <family> stem and
delivering one coherent capability across three roles:
10 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.
11The family stem leads every named surface: crates, binaries, skills and the server all carry the <family> prefix, so everything of one language sorts and reads together.
12
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:
By hand
131. Create the package slot, then set kind = "lang" in its manifest:
vibe init package org.acme/sql-style
Creating package `org.acme/sql-style` in `<TMP>/work`
✓ created vibevm/vibepacks/org.acme/sql-style/v0.1.0/vibe.toml
✓ created vibevm/vibepacks/org.acme/sql-style/v0.1.0/vibevm/vibespecs/boot/10-tool-sql-style.md
✓ created vibevm/vibepacks/org.acme/sql-style/v0.1.0/README.md
• kept vibevm/vibespecs/boot/INDEX.md (regenerated)
• kept CLAUDE.md (regenerated)
• kept AGENTS.md (regenerated)
• kept GEMINI.md (regenerated)
Done. Project `org.acme/sql-style`: 3 files created, 4 kept.
Next:
• edit vibevm/vibespecs/boot/00-core.md and vibevm/vibespecs/common as your project takes shape
• install packages with `vibe install <kind>:<name>` (e.g. flow:wal)
152. Inside the slot, write vibevm/vibespecs/boot/sql-style.xml with the rules an agent must follow every time. Put the guide under vibevm/vibespecs/lang/sql-style/, with the reasons, the idioms and the examples.
163. Declare [boot_snippet] source = "vibevm/vibespecs/boot/sql-style.xml", category = "stack", so that the language rules come after the team's flows in a consumer's reading list.
174. Check: vibe check --path vibevm/vibepacks/org.acme/sql-style/v0.1.0.
Edge cases and rules
18What a language brought that can be run is answered by vibe tools, not by the kind: the boot lane says which disciplines are installed, the tools registry says what they brought.
19Before the lang kind existed, language guides were stacks; a stack package that is really a guide should move to lang at its next version, so that the word means one thing.