One typed configuration
A single agent-bundle.config.ts holds identity, targets, and policy. The src/ conventions fill in everything it leaves silent, and config always wins when both describe the same thing.
Describe skills, hooks, MCP servers, and scripts once. Compile installable output for Claude Code, Codex, Cursor, and experimental Amp.
A single agent-bundle.config.ts holds identity, targets, and policy. The src/ conventions fill in everything it leaves silent, and config always wins when both describe the same thing.
One directory per Skill with its SKILL.md and resources, discovered without a declaration and validated against the pinned Agent Skills specification.
Seven events from sessionStart to workspaceOpen, written once in TypeScript and compiled into the wrapper each host actually spawns.
Hand-written stdio servers, or generated servers where each tool, resource, and prompt is one module. Browser MCP Apps compile to self-contained HTML.
Plain or rendered scripts, byte-for-byte assets, and a CLI bin or library entry emitted from the same project, one build, both outputs.
agent-bundle dev serves a loopback application tree and route workspace with rendered results, invocation traces, diagnostics, and advanced protocol and artifact tools.
Route, protocol, CLI, packed, and host-install proof levels turn "it builds" into recorded evidence, and a pass at one level is never reported as a receipt for another.
Eval suites with pass, fail, and inconclusive semantics, run against the real emitted artifact rather than a mock of it.
The artifact root is the unit you install, every selected host's manifest sits in its own dotfolder over shared Skills, hooks, and MCP entries, beside a generated INSTALL.md and agent-bundle.manifest.json, the artifact index that install, doctor, validation, MCP, hooks, and evals read.
The input is one config file and a conventional src/ tree. The output is one composite plugin
root: every selected host's manifest in its own dotfolder over shared component directories,
generated wrappers, installation instructions written with the bundle's real names, and the
agent-bundle.manifest.json the whole artifact is validated against. Every host installs that
same directory.
Skills, the MCP server, and the script are picked up by convention. Only the hook needs a declaration, because a handler has to be bound to an event.
Every selected host reads this one directory as its plugin root: Claude Code finds
.claude-plugin/, hooks/hooks.json, and .mcp.json; Codex finds .codex-plugin/ and the
marketplace under .agents/; Agent Plugins clients find plugin.json and mcp.json. Skills,
compiled MCP entries, and scripts are emitted once, never copied per host.
The Agent Plugins open standard has no hook surface. The hook above declares no targets, so it
inherits only the selected targets that support hooks, claude and codex, and is compiled
once per host it reaches, which is why two wrappers appear. portable is skipped without a
diagnostic; naming it explicitly, targets: ['portable'], is AB4204 at build time instead.
Generated wrapper names carry a short digest of the declaration they were compiled from, not of
their contents. agent-bundle.manifest.json records every emitted file with its SHA-256, so later
validation compares real bytes rather than checking that a path exists.
Write agent-bundle.config.ts and put Skills, hooks, MCP routes, and scripts under src/.
agent-bundle inspect shows the normalized model, so you can confirm which files were picked up
by convention and which were claimed by config.
agent-bundle dev rebuilds on every change and serves the developer
Workbench on loopback: select any plugin surface in one
Application tree, run executable leaves, inspect rendered results, and follow invocation traces
and diagnostics.
Test against the artifact with proof levels that stay distinct, from route-unit tests up to a bundle installed through the real host CLI, and run evaluations whose results are pass, fail, or inconclusive.
agent-bundle build validates the project and writes one composite plugin root.
Validation checks the artifact against its manifest, and
installation points each host's own install path at that
root.
targets selects which host projections the one root carries; omit it and the root carries
portable alone. Experimental Amp reads its nested directory plugin; the other rows read the composite root.
Hosts differ in what they can load, so the compiler says so at build time: a surface you select
for a target that cannot express it is a reported diagnostic, never a quiet omission. The one
deliberate exception is a hook with no targets of its own, which inherits only the hosts that
support hooks, as the tree above shows, rather than failing. Two selected hosts that would
write the same path with different bytes cannot share one root, and the build says so with
AB4103. Every diagnostic has a stable AB code documented in the
diagnostics reference.
create-agent-bundle
scaffolder.agent-bundle export.