Multi-Tool Parity
RDF emits governance, commands, and skills for several AI coding tools from one canonical source. Reach (Wave 2) recasts the tool set around three first-class citizens — Claude Code, Codex CLI, and Antigravity CLI — plus one frozen legacy tier, Gemini CLI (enterprise). Design rationale lives in docs/specs/2026-07-15-scale-reach-design.md §13.
1. Matrix
| Tool | Command surface | Skill surface (.agents/skills/) | Context file | Hooks | Generate target |
|---|---|---|---|---|---|
| Claude Code | .claude/skills/<cmd>/SKILL.md + intent description: frontmatter (same adp_emit_skills library emitter as .agents/skills/, own output tree) | own skills/ tree, not the shared one | CLAUDE.md (NOT AGENTS.md) | hooks.json (manual merge) | claude-code |
| Codex CLI | .agents/skills/<cmd>/SKILL.md (native scan) | shared .agents/skills/ | AGENTS.md (Agent Skills + AGENTS.md composite) | deferred (openai.yaml, §13.7) | codex |
| Antigravity CLI | skills (fuzzy-matched slash) | shared .agents/skills/ | AGENTS.md + GEMINI.md | deferred (.agents/hooks.json, §13.7) | antigravity (composite) |
| Gemini CLI (enterprise) | .gemini/commands/*.toml | via agy plugin import gemini | GEMINI.md | — | gemini-cli |
Tiers: the first three rows are first-class; Gemini CLI is legacy / frozen (kept for enterprise paid-API users, changed only for the TOML-escaping fix).
Claude Code — plugin install vs. symlink deploy. The Claude Code row above describes the symlink deploy (rdf deploy claude-code), which also populates the ~/.rdf/state/ session-state helpers. A plugin install (/plugin install rdf@rdf) ships commands and agents plus a SessionStart hook that bootstraps the same ~/.rdf/state/ helpers on the plugin’s first session start after install — so the 10 state-backed commands (r-spec, r-plan, r-build, r-ship, r-status, r-save, r-refresh, r-context-audit, r-vpe, r-util-mem-compact) run in a degraded mode only before that first restart. r-start degrades gracefully (probe + fallback); the others require the helpers for full session-scoped state.
2. The .agents/skills/ shared convention
.agents/skills/ is a workspace-level shared directory at the repo root — one tree that Codex, Antigravity, and every AAIF-compliant client read. Because it is shared, it is emitted exactly once by a dedicated adapter:
rdf generate agent-skills # emits .agents/skills/<cmd>/SKILL.md
It is NOT duplicated into per-tool output trees. Each emitted SKILL.md carries name + description frontmatter only (name equals the command basename and the parent directory name, per the AAIF constraint); optional AAIF fields (license, metadata, allowed-tools) are deliberately not emitted (§13.4).
Deploy targets a workspace root:
rdf deploy --project-root /path/to/workspace agent-skills
This symlinks .agents/skills/ into the target workspace so rdf generate agent-skills updates deployed skills in place. agent-skills is the one project-scoped deploy target whose --project-root defaults to the current directory; agents-md, codex, and antigravity require it.
2b. Composites and AGENTS.md
codex and antigravity are the same composite on both verbs — the .agents/skills/ symlink plus AGENTS.md (copy-skip: an existing file is left alone unless --force):
rdf generate --project-root /path/to/proj antigravity # optional here
rdf deploy --project-root /path/to/proj antigravity # required here
agents-md is also a standalone generate/deploy target. Generating it with a --project-root composes <root>/AGENTS.md from that repo’s own CLAUDE.md — falling back to its .rdf/governance/index.md, then a stub — and refuses a root that is not a git repository. Without --project-root, generate refreshes this checkout’s tracked adapters/agents-md/output/AGENTS.md: RDF’s self case, and the file that rdf deploy agents-md copies into a project root. rdf generate accepts its flags and target in any order.
rdf init --tools codex|antigravity|agent-skills|agents-md does both steps at init time — the composites expand to agent-skills agents-md, so skills are symlinked into the new project and its AGENTS.md is composed from the CLAUDE.md that init just wrote (spec docs/specs/2026-09-02-skills-native-adapter-consolidation-design.md §5).
Bounded surface. The shared skills tree covers the 10 lifecycle commands — /r-spec, /r-plan, /r-build, /r-ship, /r-start, /r-save, /r-status, /r-audit, /r-refresh, /r-init — not all 37 RDF commands (source of truth: adapters/agent-skills/skill-meta.json). Utility commands stay Claude-Code-only for now.
3. Gemini `` lossy edge
Gemini CLI command TOML uses token substitution. RDF command bodies are **not translated**: the canonical body is emitted verbatim into the prompt, so a body that reads `$ARGUMENTS` keeps that literal token — Gemini performs no substitution on it. What RDF adds is a **NOTE** comment (emitted only when the body references `$ARGUMENTS`) documenting that Gemini exposes just (the whole invocation string) and does not tokenize positional forms: a command invoked as /r-build 3 receives the raw 3, unbound to any placeholder. The body’s $ARGUMENTS therefore stays unsubstituted on the Gemini surface — an accepted limitation of the frozen legacy tier. The NOTE flags it so a Gemini CLI user knows to pass the argument through the `` form instead.
4. Legacy gemini-cli tier
Gemini CLI stopped serving free/Pro/Ultra tiers on 2026-06-18; enterprise and paid-API users are unaffected and the OSS repo stays active. RDF keeps the gemini-cli adapter frozen for those users: its GEMINI.md context and command TOML are unchanged except the one TOML-escaping fix.
- TOML
'''-literal fix. The canonical command body contains characters that basic TOML strings ("...","""...""") interpret as escapes (regex\b, sed\|). Emitting those bodies into'''-literal multi-line strings — which do not process backslash escapes — makes the output parse strictly. - Migration source.
agy plugin import geminiconverts.gemini/commands/*.tomlINTO Antigravity skills, so strictly-valid TOML is the migration source. Fixing the escaping directly serves Antigravity adoption — a frozen legacy artifact that doubles as the transition input.
5. Deferred surfaces (probe-gated)
The following ship only after a live-docs probe confirms a stable schema, per the audit lesson that runtime-observed facts get an engineer-validation pass before code. Cross-reference spec §13.7:
- Antigravity hooks (
<workspace>/.agents/hooks.json) — schema undocumented. - Antigravity subagents (markdown) — schema actively churning.
- Antigravity plugins (
~/.gemini/antigravity-cli/plugins/<name>/plugin.json). - Codex
agents/openai.yamlper-skill metadata — Codex-specific, optional. - Global/user-level
~/.agents/skills/scanning — unverified. - SKILL.md optional AAIF fields (
license,metadata,allowed-tools). - MCP server work — a standing §3 non-goal.