Adapter support matrix¶
Which agent tools the catalogue projects to, what each one receives, and where a tool's own limits mean you get less than the full loop. The README's "any agent that reads a skill file inherits it" is true for the universal layer (the AGENTS.md conventions every tool reads); this page is the honest detail underneath it — the tool-native primitives, and the caveats.
Source of truth. The projection columns below are read from the adapter contract, packages/agentbundle/agentbundle/_data/adapter.toml (each adapter's [[adapter.<name>.projection]] rules). If this table and the contract ever disagree, the contract wins and the drift is a bug — file it. The caveats are the verified runtime findings recorded in the specs linked per row.
The matrix¶
| Tool | Skill | Subagent | Slash command | Hook | Tier |
|---|---|---|---|---|---|
| Claude Code | ✅ native | ✅ native | ✅ native | ✅ native + settings.json merge | Full |
| Codex | ✅ native | ✅ native (.codex/agents/*.toml) | ❌ tool-side | ✅ native + .codex/hooks.json merge | Full¹ |
| Copilot | ✅ native (SKILL.md) | ✅ native (web on CLI/app) | ❌ tool-side | ⚠️ user-scope fires; repo-scope trust-gated | Partial |
| Cursor | ✅ native | ⚠️ native, no tool allowlist | ✅ native | ✅ native + .cursor/hooks.json merge | Full² |
| Gemini CLI | ✅ native | ✅ native (tool allowlist mapped) | ✅ native | ✅ native + .gemini/settings.json merge | Full³ |
| Kiro CLI | ✅ native | ✅ native | ❌ tool-side | ✅ body + wiring | Near-full |
| Kiro IDE | ✅ native | ✅ native | ❌ tool-side | ⚠️ bodies + .kiro.hook events; embedded wiring dropped | Partial |
Any AGENTS.md reader (…) | ➖ via AGENTS.md | ❌ | ❌ | ❌ | Universal layer |
Legend. ✅ native — projected to a tool-native file. ➖ — delivered through the shared AGENTS.md universal layer, not a per-tool file. ⚠️ — projected but with a runtime caveat (see the note). ❌ — not projected.
¹ "Full" bar slash commands — a tool-side limit for Codex and Kiro. Claude Code, Cursor, and Gemini CLI are the three tools that project commands natively (see the note on commands).
² Cursor projects all five primitives, including native slash commands and hooks. The one fidelity caveat is the subagent tool allowlist — see the note below.
³ Gemini CLI projects all five primitives natively, and — unlike Cursor — Gemini has a real per-agent tool allowlist, so the source tools: is kept and name-mapped to Gemini's tool ids (no fidelity loss). The canonical AGENTS.md is bridged into Gemini's context discovery via a managed context.fileName entry in .gemini/settings.json. See the gemini-full-parity note below.
What "Universal layer" means¶
Every tool in the matrix — and any future tool that reads AGENTS.md — inherits the universal layer: the AGENTS.md conventions, the source-of-truth map, and the work-loop discipline, inlined as text the agent reads on every session. That is the floor, and it is the same everywhere. The columns above are what each tool gets on top of that floor as tool-native primitives. A tool with no native primitives still runs the loop through AGENTS.md; it just doesn't get per-tool subagent/command/hook files. (Gemini CLI used to be such a tool — it is now a full-parity adapter, and still reads AGENTS.md via the context.fileName bridge.)
Per-tool caveats¶
- Slash commands project to Claude Code, Cursor, and Gemini CLI; they're dropped on the others — and that's a tool limit, not a catalogue gap. Codex deprecated custom prompts in favour of skills (which the catalogue does project to Codex, at
.agents/skills/); the Copilot CLI won't load custom slash-command files by design — prompt files were superseded by skills there too (copilot-cli#618/#1113), and the catalogue projects Copilot skills as instruction files (.github/instructions/); and Kiro ships no standalone command-file primitive for the catalogue to project (Kiro IDE still surfaces slash commands via manual-trigger hooks andinclusion: manualsteering). So on those tools what drops is the slash-invocation surface, not reusable prompt content — that lives on as skills. Cursor and Gemini CLI, by contrast, read native command files (.cursor/commands/<name>.md;.gemini/commands/<...>/<name>.toml), so the catalogue projects commands there natively. The contract markscommandasdroppedfor the rest rather than inventing one; when a tool ships a command-file surface, the mapping is added and tested — not projected speculatively. - Gemini CLI — full parity, tool allowlist kept. Gemini projects all five primitives to
.gemini/*at repo and user scope. Unlike Cursor, Gemini has a real per-agent tool allowlist, so the sourcetools:is kept and name-mapped to Gemini tool ids (Read→read_file,Bash→run_shell_command, …);modelaliases map tier-preserving to the Gemini 2.5 line. Commands serialise to TOML (prompt+ optionaldescription), fail-closed on positional$Nargs. Hook wiring and a managedcontext.fileName = ["AGENTS.md", "GEMINI.md"]bridge land in one.gemini/settings.jsonmerge, so the canonicalAGENTS.mdis read. Seegemini-full-parity. - Cursor — subagents have no per-agent tool allowlist. Cursor subagents inherit all parent tools, so the source
tools:allowlist is dropped on projection; for a non-mutating agent (one declaring none ofEdit/Write/MultiEdit/NotebookEdit) the catalogue derivesreadonly: trueso reviewer/retrieval subagents stay least-privilege, and a mutating agent inherits all tools (noreadonlyemitted). Documented degradation. Seecursor-full-parity. - Copilot — subagents get the
webtool on the CLI + app. Custom Copilot agents resolveWebFetch/WebSearchto Copilot'swebtool (the custom-agents reference documentswebaliasing both), so theresearchpack's retrieval subagents keep live web access — they are not degraded. The only non-coverage is the Copilot cloud agent (served via repo.github/only), which has nowebtool. (An earlier "no web tool" finding from a confounded CLI 1.0.59 probe is corrected incopilot-skills-and-web/ RFC-0024 § Errata E1.) - Copilot — repo-scope hooks load only when the folder is trusted. Repo-scope
.github/hooks/*.jsonwiring is byte-correct and correctly placed, and.github/hooks/is a loaded hook source in the current CLI — but loading is conditional on folder-trust, and in prompt mode (-p) on an opt-in, per the copilot-cli changelog (1.0.8 / 1.0.41 / 1.0.51). The AC23 acceptance smoke on CLI 1.0.60 saw the repo-scope hook not fire while the identical user-scope hook (~/.copilot/hooks/) did — the trust gate is the likely cause, not a scope-wide regression. One open conditional bug also skips repo hooks on--resume(copilot-cli#1503). Re-checked against CLI 1.0.61 (2026-06-09); tracked in thecopilot-full-parityfollow-ons. - Kiro IDE — hooks split three ways. Hook bodies project (to
tools/hooks/), and standalone.kiro.hookIDE-event files do project now — thekiro-ide-hookprimitive is active (.kiro/hooks/<pack>--<name>.kiro.hook, full IDE event vocabulary; RFC-0022, Q6 probe 2026-06-01). What drops is agent-embedded hook-wiring: the IDE loader silently drops any agent carrying ahookskey (RFC-0022 E2), so packs expressing hooks through the cross-adapterhook-wiringprimitive get less here than on Kiro CLI, which retains it. Both Kiro targets also read the universalAGENTS.mdlayer via Kiro steering. Seekiro-adapter-split.
Choosing a tool¶
- Want the whole loop with every primitive? Claude Code or Cursor (Cursor projects skills, subagents, slash commands, and hooks natively; the only fidelity loss is the per-agent tool allowlist, replaced by a derived
readonlyflag). - Terminal-native with near-full parity? Codex or Kiro CLI (you lose only slash commands, which those tools don't have).
- On Copilot, expect skills (native
SKILL.md) + subagents (with web on the CLI + app) + user-scope hooks to work, and plan around the repo-hook caveat above. - On any other
AGENTS.md-aware tool, you still get the loop and the conventions through the universal layer — just no tool-native extras.