One git checkout drops a shared AI coding setup (skills, subagents, MCP servers, OpenSpec scaffolding) into any
project.
For developers and teams running multiple AI coding agents across multiple repos. Every project drifts (different
prompt files, skill versions, MCP configs, subagent definitions). This repo is the single source: import once, pull
updates with one git fetch. Used across every project in the portfolio.
Consumer projects pull only production-ready content: skills, generated subagent files, the preflight gate, the MCP configs, and the shipped docs. The canonical subagents/ source and tools/ generator stay here.
The canonical source is .agents/skills/, which Codex, OpenCode, Kilo Code, and every GitHub Copilot surface read natively. The layout follows the cross-tool AGENTS.md and SKILL.md conventions, so the setup stays portable across the supported agents rather than tied to one tool.
Four things. The first two matter in every project, the last two depend on your platform and on which agents you run.
- Git. The import is a selective checkout from a second remote, so nothing else installs the files.
- Python 3 on your path, under either name. Every hook in .agents/hooks/ is a Python script, and
every wiring throws away a failed call so a broken gate can never break a session. Each POSIX wiring resolves
python3first and falls back topython, which is the name the python.org installer puts on a Windows path, so either name is enough. With neither on the path the gate reads as an allow, which means it is silently off rather than loudly broken. Check before you trust it. - Windows only: Developer Mode (Settings, System, For developers) plus git told to honour symlinks. Three paths in the import are symlinks, and without both git writes each one out as a text file holding its target path.
- Node, only if you run OpenCode or Kilo Code. Their gate adapter is .agents/plugin/hooks.js, loaded by their own runtime. The other three agents need none.
Confirm the interpreter. PowerShell:
python --versionUnix shell:
python3 --versionIf that prints nothing, install Python 3 before you go on, or the gate will allow every call it was meant to block.
On Windows, turn on Developer Mode first, then set the symlink option inside the project you are importing into. PowerShell:
git config core.symlinks trueUnix shell:
git config core.symlinks trueAdding --global to that command sets it once for every repository on the machine, including clones you have not
made yet, which is the form to use if you import the standards more than once.
Add the upstream remote. PowerShell:
git remote add agent-standards https://github.com/Lukk17/agent-standardsUnix shell:
git remote add agent-standards https://github.com/Lukk17/agent-standardsPoint its push URL at nothing, so a stray push cannot reach it. PowerShell:
git remote set-url --push agent-standards no_pushUnix shell:
git remote set-url --push agent-standards no_pushFetch it. PowerShell:
git fetch agent-standardsUnix shell:
git fetch agent-standardsCheck out the production-ready paths. PowerShell:
git checkout agent-standards/master -- .agents .claude .opencode .kilo .codex .github/agents .github/hooks .vscode/mcp.json .mcp.json .github/mcp.json opencode.json docs/AGENT_TOOLING.md docs/MCP_SETUP.md docs/GLOBAL_SETUP.md docs/AGENTS-UPDATE.md AGENTS.md.exampleUnix shell:
git checkout agent-standards/master -- .agents .claude .opencode .kilo .codex .github/agents .github/hooks .vscode/mcp.json .mcp.json .github/mcp.json opencode.json docs/AGENT_TOOLING.md docs/MCP_SETUP.md docs/GLOBAL_SETUP.md docs/AGENTS-UPDATE.md AGENTS.md.exampleRename the one template. PowerShell:
Rename-Item AGENTS.md.example AGENTS.mdUnix shell:
mv AGENTS.md.example AGENTS.mdAdd the agent task list to your own ignore file, because the task-list hook writes it every session. PowerShell:
Add-Content .gitignore "`n/tasks.md"Unix shell:
printf '\n/tasks.md\n' >> .gitignoreThat's it. Open the project in Claude Code, Kilo Code, OpenCode, Codex, or GitHub Copilot and skills are live.
The MCP config files arrive as real files, ready to use, so nothing else needs renaming:
.mcp.json for Claude Code, opencode.json for OpenCode and Kilo Code,
.codex/config.toml for Codex, .vscode/mcp.json for Copilot in VS Code, and
.github/mcp.json for the Copilot CLI. AGENTS.md.example is the only template left in the repo.
Human-side MCP setup (keys, environment variables, the two Copilot surfaces that get no file) lives in docs/MCP_SETUP.md.
Full walkthrough lives in docs/AGENT_TOOLING.md.
The Quickstart above is the recommended path and stays right for most projects: it pulls the whole setup once and every agent then finds what it reads. If a project only ever sees one agent, the subsection for that agent pulls just its share instead.
Run the first three Quickstart commands once so the read-only remote exists (git remote add,
git remote set-url --push agent-standards no_push, and git fetch agent-standards), then follow the single
subsection you need. Adding a second agent later is nothing more than running its subsection too, because the shared
paths are the same files.
Claude Code 2.1.277 and later reads AGENTS.md natively, but only while the project holds no CLAUDE.md, so this
setup ships none and you add none (why). It is the one agent that does not
read .agents/skills/ on its own, so it gets the skills through the .claude/skills symlink,
subagents from .claude/agents/, hooks from .claude/settings.json, and MCP
servers from .mcp.json at the project root.
.claude/skills is a symlink, so Windows needs Developer Mode on (Settings, System, For developers) and git told to
honour symlinks. Without both, git writes a text file holding the target path and Claude Code sees no skills at all.
PowerShell:
git config core.symlinks trueThe Unix shells need nothing here.
Pull what Claude Code reads. PowerShell:
git checkout agent-standards/master -- .agents/skills .agents/hooks .claude .mcp.json AGENTS.md.example docs/AGENT_TOOLING.md docs/MCP_SETUP.md docs/GLOBAL_SETUP.md docs/AGENTS-UPDATE.mdUnix shell:
git checkout agent-standards/master -- .agents/skills .agents/hooks .claude .mcp.json AGENTS.md.example docs/AGENT_TOOLING.md docs/MCP_SETUP.md docs/GLOBAL_SETUP.md docs/AGENTS-UPDATE.mdRename the template so Claude Code reads it as AGENTS.md. PowerShell:
Rename-Item AGENTS.md.example AGENTS.mdUnix shell:
mv AGENTS.md.example AGENTS.mdTo update later, fetch first. PowerShell:
git fetch agent-standardsUnix shell:
git fetch agent-standardsThen pull upstream's half back over your tree. Your AGENTS.md, .claude/settings.json, and .mcp.json are left
out on purpose, because they become yours at import. PowerShell:
git checkout agent-standards/master -- .agents/skills .agents/hooks .claude/agents .claude/workflows docs/AGENT_TOOLING.md docs/MCP_SETUP.md docs/GLOBAL_SETUP.md docs/AGENTS-UPDATE.mdUnix shell:
git checkout agent-standards/master -- .agents/skills .agents/hooks .claude/agents .claude/workflows docs/AGENT_TOOLING.md docs/MCP_SETUP.md docs/GLOBAL_SETUP.md docs/AGENTS-UPDATE.mdCodex reads AGENTS.md and .agents/skills/ natively, and it follows symlinks while scanning
them, so nothing has to be bridged. Custom agents come from .codex/agents/ as TOML,
and .codex/config.toml carries both the [mcp_servers] tables and the preflight hooks as inline
[[hooks.*]] tables. No symlink is involved in this set, so Windows needs neither Developer Mode nor
git config core.symlinks true.
Pull what Codex reads. PowerShell:
git checkout agent-standards/master -- .agents/skills .agents/hooks .codex AGENTS.md.example docs/AGENT_TOOLING.md docs/MCP_SETUP.md docs/GLOBAL_SETUP.md docs/AGENTS-UPDATE.mdUnix shell:
git checkout agent-standards/master -- .agents/skills .agents/hooks .codex AGENTS.md.example docs/AGENT_TOOLING.md docs/MCP_SETUP.md docs/GLOBAL_SETUP.md docs/AGENTS-UPDATE.mdRename the template. PowerShell:
Rename-Item AGENTS.md.example AGENTS.mdUnix shell:
mv AGENTS.md.example AGENTS.mdCodex loads a project's .codex/ layer only after you trust the project once, so approve it on first run or none of
the hooks and none of the MCP servers apply.
To update later, fetch first. PowerShell:
git fetch agent-standardsUnix shell:
git fetch agent-standardsThen pull upstream's half back. .codex/config.toml stays out of it, because your MCP servers and the hook tables
share that one file, so merge an upstream change there by hand. PowerShell:
git checkout agent-standards/master -- .agents/skills .agents/hooks .codex/agents docs/AGENT_TOOLING.md docs/MCP_SETUP.md docs/GLOBAL_SETUP.md docs/AGENTS-UPDATE.mdUnix shell:
git checkout agent-standards/master -- .agents/skills .agents/hooks .codex/agents docs/AGENT_TOOLING.md docs/MCP_SETUP.md docs/GLOBAL_SETUP.md docs/AGENTS-UPDATE.mdOpenCode reads AGENTS.md and .agents/skills/ natively. Subagents arrive through the
.opencode/agents symlink into .agents/agents/. opencode.json at the
project root declares the gate plugin by path in its plugin array and carries the MCP servers under its mcp key.
That file has to stay at the root, because inside .opencode/ it is ignored.
.opencode/agents is a symlink, so Windows needs Developer Mode on (Settings, System, For developers) and git told to
honour symlinks, or OpenCode ends up with no subagents. PowerShell:
git config core.symlinks trueThe Unix shells need nothing here.
Pull what OpenCode reads. PowerShell:
git checkout agent-standards/master -- .agents/skills .agents/agents .agents/hooks .agents/plugin .opencode opencode.json AGENTS.md.example docs/AGENT_TOOLING.md docs/MCP_SETUP.md docs/GLOBAL_SETUP.md docs/AGENTS-UPDATE.mdUnix shell:
git checkout agent-standards/master -- .agents/skills .agents/agents .agents/hooks .agents/plugin .opencode opencode.json AGENTS.md.example docs/AGENT_TOOLING.md docs/MCP_SETUP.md docs/GLOBAL_SETUP.md docs/AGENTS-UPDATE.mdRename the template. PowerShell:
Rename-Item AGENTS.md.example AGENTS.mdUnix shell:
mv AGENTS.md.example AGENTS.mdTo update later, fetch first. PowerShell:
git fetch agent-standardsUnix shell:
git fetch agent-standardsThen pull upstream's half back. opencode.json stays out, because it holds your MCP servers and the plugin
declaration together. PowerShell:
git checkout agent-standards/master -- .agents/skills .agents/agents .agents/hooks .agents/plugin docs/AGENT_TOOLING.md docs/MCP_SETUP.md docs/GLOBAL_SETUP.md docs/AGENTS-UPDATE.mdUnix shell:
git checkout agent-standards/master -- .agents/skills .agents/agents .agents/hooks .agents/plugin docs/AGENT_TOOLING.md docs/MCP_SETUP.md docs/GLOBAL_SETUP.md docs/AGENTS-UPDATE.mdKilo Code works like OpenCode. It reads AGENTS.md and .agents/skills/ natively, takes its
subagents through the .kilo/agents symlink into .agents/agents/, and accepts
the root opencode.json as a project config file, so it picks up the gate plugin and the MCP block
from the same file OpenCode uses.
Kilo is stricter than OpenCode about substitution. A {env:VAR} anywhere in a project config file is a fatal error
for Kilo, and it rejects that entire file rather than leaving the token literal, which would cost it the MCP servers
and the gate plugin in one go. The shipped opencode.json therefore carries no tokens at all. Local servers still get
their secrets, because both tools start them with the environment of the process that started the agent, so exporting
the variable is enough. The single value that cannot be inherited is the Context7 API key, which travels in an HTTP
header, so context7 ships unauthenticated on the free tier. Adding a paid key is a global-config change, described
in docs/MCP_SETUP.md.
.kilo/agents is a symlink, so Windows needs Developer Mode on (Settings, System, For developers) and git told to
honour symlinks, or Kilo Code ends up with no subagents. PowerShell:
git config core.symlinks trueThe Unix shells need nothing here.
Pull what Kilo Code reads. PowerShell:
git checkout agent-standards/master -- .agents/skills .agents/agents .agents/hooks .agents/plugin .kilo opencode.json AGENTS.md.example docs/AGENT_TOOLING.md docs/MCP_SETUP.md docs/GLOBAL_SETUP.md docs/AGENTS-UPDATE.mdUnix shell:
git checkout agent-standards/master -- .agents/skills .agents/agents .agents/hooks .agents/plugin .kilo opencode.json AGENTS.md.example docs/AGENT_TOOLING.md docs/MCP_SETUP.md docs/GLOBAL_SETUP.md docs/AGENTS-UPDATE.mdRename the template. PowerShell:
Rename-Item AGENTS.md.example AGENTS.mdUnix shell:
mv AGENTS.md.example AGENTS.mdTo update later, fetch first. PowerShell:
git fetch agent-standardsUnix shell:
git fetch agent-standardsThen pull upstream's half back, leaving opencode.json alone for the same reason as OpenCode. PowerShell:
git checkout agent-standards/master -- .agents/skills .agents/agents .agents/hooks .agents/plugin docs/AGENT_TOOLING.md docs/MCP_SETUP.md docs/GLOBAL_SETUP.md docs/AGENTS-UPDATE.mdUnix shell:
git checkout agent-standards/master -- .agents/skills .agents/agents .agents/hooks .agents/plugin docs/AGENT_TOOLING.md docs/MCP_SETUP.md docs/GLOBAL_SETUP.md docs/AGENTS-UPDATE.mdCopilot reads AGENTS.md and .agents/skills/ natively on every surface: VS Code, the JetBrains
plugin, the CLI, and the cloud agent. No bridge file, and no symlink either, so Windows needs
neither Developer Mode nor git config core.symlinks true. Subagents have to be Copilot's own *.agent.md format in
.github/agents/, and the gate rides .github/hooks/preflight.json
with camelCase event names. The JetBrains plugin reads AGENTS.md in agent mode too, per the March 2026 changelog,
even though GitHub's published support matrix still leaves JetBrains out of that column.
MCP is the part that splits per surface. The CLI reads its own .github/mcp.json, literal values
only, because it has no substitution engine for Claude Code's ${VAR:-default} syntax in .mcp.json. VS
Code needs .vscode/mcp.json. The JetBrains plugin reads a global path only and gets no project
file at all, and the cloud agent takes JSON pasted into a repository settings page. Both manual blocks live in
docs/MCP_SETUP.md.
The CLI is also documented as capable of reading .mcp.json itself, and its own precedence rule makes
that file win over .github/mcp.json whenever both exist in the same directory and name the same
server, which is true for all eight servers here. The full Quickstart above pulls both files, so on a project
imported that way the CLI currently resolves every server from .mcp.json, with its ${VAR:-default}
placeholders left as literal unresolved strings, rather than from the clean file shipped for it. Measurement and full
detail: docs/MCP_SETUP.md.
Pull what Copilot reads. PowerShell:
git checkout agent-standards/master -- .agents/skills .agents/hooks .github/agents .github/hooks .vscode/mcp.json .github/mcp.json AGENTS.md.example docs/AGENT_TOOLING.md docs/MCP_SETUP.md docs/GLOBAL_SETUP.md docs/AGENTS-UPDATE.mdUnix shell:
git checkout agent-standards/master -- .agents/skills .agents/hooks .github/agents .github/hooks .vscode/mcp.json .github/mcp.json AGENTS.md.example docs/AGENT_TOOLING.md docs/MCP_SETUP.md docs/GLOBAL_SETUP.md docs/AGENTS-UPDATE.mdRename the template. PowerShell:
Rename-Item AGENTS.md.example AGENTS.mdUnix shell:
mv AGENTS.md.example AGENTS.mdTo update later, fetch first. PowerShell:
git fetch agent-standardsUnix shell:
git fetch agent-standardsThen pull upstream's half back, leaving both MCP files alone because they are yours after the import. PowerShell:
git checkout agent-standards/master -- .agents/skills .agents/hooks .github/agents .github/hooks docs/AGENT_TOOLING.md docs/MCP_SETUP.md docs/GLOBAL_SETUP.md docs/AGENTS-UPDATE.mdUnix shell:
git checkout agent-standards/master -- .agents/skills .agents/hooks .github/agents .github/hooks docs/AGENT_TOOLING.md docs/MCP_SETUP.md docs/GLOBAL_SETUP.md docs/AGENTS-UPDATE.mdThe update commands above pull every skill and subagent back, including ones you deleted on purpose. As soon as you start adding or removing skills locally, switch to the selective refresh in docs/AGENTS-UPDATE.md, which refreshes only what is already in your working tree.
graph LR
subgraph AS[agent-standards repo]
ASK[.agents/skills/<br/>canonical SKILL.md files]
SU[subagents/<br/>canonical sources]
GEN[tools/gen_subagents.py]
SU --> GEN
end
AS -->|git checkout production-ready dirs only| P[Your project]
P --> SK[.agents/skills/]
P --> OA[.agents/agents/<br/>generated, OpenCode format]
P --> CA[.claude/agents/<br/>generated]
P --> CXA[.codex/agents/<br/>generated TOML]
P --> GH[.github/agents/<br/>generated .agent.md]
P --> AG[AGENTS.md]
SK -.symlink.-> CL[.claude/skills]
OA -.symlink.-> OCL[.opencode/agents]
OA -.symlink.-> KIL[.kilo/agents]
CL --> Claude[Claude Code]
SK --> OpenCode[OpenCode]
SK --> Kilo[Kilo Code]
SK --> Codex[Codex]
SK --> Copilot[GitHub Copilot]
OCL --> OpenCode
KIL --> Kilo
CA --> Claude
CXA --> Codex
GH --> Copilot
AG --> OpenCode
AG --> Kilo
AG --> Codex
AG --> Copilot
AG -.imported.-> Claude
classDef src fill:#ede0ff,stroke:#7c3aed,color:#1a1033
classDef consumer fill:#fff7e0,stroke:#d97706,color:#1a1033
classDef tool fill:#e0f2fe,stroke:#0284c7,color:#1a1033
class AS,ASK,SU,GEN src
class P,SK,CA,OA,CXA,GH,AG,CL,OCL,KIL consumer
class Claude,Kilo,OpenCode,Codex,Copilot tool
Two canonical sources in this repo: .agents/skills/ and subagents/. Consumers receive
.agents/skills/ plus four generated subagent trees (.agents/agents/ in OpenCode
format, .claude/agents/, .codex/agents/ in TOML, and
.github/agents/ as *.agent.md). OpenCode and Kilo Code share the OpenCode-format tree through the
.opencode/agents and .kilo/agents symlinks rather than getting a copy each. The subagents/ source and
the tools/ generator never ship downstream.
Full agent compatibility matrix (what each agent reads and where): docs/agent-compatibility.md. Full repository layout and per-agent instruction precedence: docs/repository-layout.md.
The second diagram is the path of one tool call. Every agent takes it, because every agent's hook wiring calls the same script, and the denial is what turns the written rule into an enforced one.
sequenceDiagram
accTitle: Preflight gate on one tool call
accDescr: The agent calls a tool, the hook runs the shared gate script, and the gate allows or denies with text telling the caller to delegate.
participant M as Main thread
participant H as Agent hook surface
participant G as preflight_gate.py
participant S as Subagent
M->>H: Edit README.md
H->>G: hook payload on stdin
G-->>H: deny, the path is inside the repo
H-->>M: "delegate this change to a subagent that owns the area"
M->>S: spawn markdown-writer
S->>H: Edit README.md
H->>G: hook payload, agent_type set
G-->>H: allow, the subagent declares skills
H-->>S: write applied
A missing interpreter, an unreadable script, or an unparseable payload all resolve to allow, so the arrow that says deny is the only one that stops anything. That is why Python 3 is a prerequisite rather than an optional extra.
All five agents read AGENTS.md natively, Claude Code only while the project holds no CLAUDE.md. Four read
.agents/skills/ natively, and Claude Code gets a symlink for the skills, a pattern its own
documentation supports. Subagents and MCP are per tool because no shared format exists. Full per-surface detail,
including what each hook surface can actually block, lives in
docs/agent-compatibility.md.
| Agent | Instructions | Skills | Subagents | Preflight | MCP config |
|---|---|---|---|---|---|
| Claude Code | AGENTS.md (native, with no CLAUDE.md) |
.claude/skills (symlink) |
.claude/agents/ |
hooks in .claude/settings.json, blocks tools and replies |
.mcp.json |
| OpenCode | AGENTS.md (native) |
.agents/skills/ (native) |
.opencode/agents (symlink) |
shared plugin, blocks tools | opencode.json |
| Kilo Code | AGENTS.md (native) |
.agents/skills/ (native) |
.kilo/agents (symlink) |
the same plugin, blocks tools | opencode.json |
| Codex | AGENTS.md (native) |
.agents/skills/ (native) |
.codex/agents/ (TOML) |
inline hooks in .codex/config.toml, blocks tools |
.codex/config.toml |
| GitHub Copilot | AGENTS.md (native) |
.agents/skills/ (native) |
.github/agents/ (*.agent.md) |
.github/hooks/preflight.json, blocks tools, no agent identity |
.vscode/mcp.json, CLI uses .github/mcp.json |
- .agents/skills/: canonical
SKILL.mdfiles. Source of truth, shared by every agent, shipped to consumers. Each one carries standard front matter (name,description, and optionallylicenseorcompatibility) following the open Agent Skills specification, a description written as the phrases that should trigger it, and its depth in areferences/subdirectory rather than in the manifest. Browse the catalogue to see what's available. - .agents/hooks/: four Python scripts, all standard library only, all run on
-S -Eunder whichever ofpython3andpythonthe wiring resolves first. .agents/hooks/preflight_gate.py is the one shared gate rule every agent surface wires into. .agents/hooks/no_ai_markers_check.py rejects a reply whose prose carries a dash, a semicolon, or a bold or italic marker. .agents/hooks/markdown_lint_check.py reports lint violations back as context after an edit to a linted file. .agents/hooks/task_list_sync.py mirrors the live task list intotasks.mdat the project root and injects it again after a compaction, so the session's own plan survives.tasks.mdis per-session working state: add it to your.gitignorerather than committing it. .agents/hooks/copilot/prompt_reminder.py appends the gate text to every GitHub Copilot prompt, and sits one level down so the OpenCode and Kilo Code runner never spawns it. .agents/plugin/hooks.js: the OpenCode and Kilo Code adapter, a runner that hands every tool call to every hook in that directory. Contract: docs/hooks-contract.md. - subagents/ (this repo only): canonical subagent sources. Generator emits the per-tool copies. Each source names the skills its agent preloads, and the generator refuses to run when one of those names has no folder under .agents/skills/, so a renamed skill fails the build instead of silently doing nothing.
- tools/ (this repo only): the subagent generator, the markdown linter, the badge-count linter, the
AGENTS.mdsize guard, and the pytest suite for the shared hook scripts in tools/tests/. The generator emits four subagent trees (.agents/agents/, .claude/agents/, .codex/agents/, .github/agents/) and maintains the.opencode/agentsand.kilo/agentssymlinks. It also emits a per-format tools list, including Copilot's own tool names, setspermissionMode: planon Claude Code for the read-only agents, and acceptsmodel: inheritfor an agent that should run on whatever the session already uses. - .claude/: Claude Code's own folder, with a
skillssymlink, a generatedagents/tree, and the hooks insettings.json. It holds noCLAUDE.md, because anyCLAUDE.mdstops Claude Code readingAGENTS.md. - .claude/workflows/skill-audit.js: a saved Claude Code workflow, run as
/skill-audit, that audits the skills. See docs/AGENT_TOOLING.md. - OpenSpec scaffold (consumer side only, this repo ships no
openspec-*skills of its own, because OpenSpec is a consumer concern): spec-driven workflow. Initialise it with the vendor-neutralopenspec init --tools agents, which writes into.agents/skills/and creates no per-tool directories. That one target covers every agent, since Codex, OpenCode, Kilo Code, and Copilot read.agents/skills/natively and Claude Code reaches the same files through its.claude/skillssymlink. Later,openspec updateregenerates the per-agent files for the tools already configured in the project and takes no tools flag. Skip the per-tool targets: on top of fragmenting a layout built for one skills directory, OpenSpec 1.10.0 still hardcodes the abandoned.kilocodepath for its Kilo target. See docs/AGENT_TOOLING.md. - Companion OpenSpec schema (optional):
Lukk17/openspec-schemas ships an
e2e-runbooksschema for spec-driven end-to-end capability tests through OpenSpec's lifecycle. Install steps and the invocation live in docs/AGENT_TOOLING.md. - AGENTS.md: shared instructions read natively by Codex, OpenCode, Kilo Code, and GitHub Copilot.
AGENTS.md.example is the one template left, renamed to
AGENTS.mdon import. - GitHub Copilot: .github/agents/ holds generated
*.agent.mdsubagents, and .github/hooks/preflight.json wires the gate through camelCase hook events. Copilot readsAGENTS.mdand.agents/skills/natively on every surface, so no bridge instruction file ships. The JetBrains plugin readsAGENTS.mdin agent mode too, per the March 2026 changelog, though GitHub's own support matrix still omits it. - MCP config: .mcp.json (Claude Code), opencode.json (OpenCode and Kilo Code), .codex/config.toml (Codex), .vscode/mcp.json (Copilot in VS Code), and .github/mcp.json (the Copilot CLI). Five real files, one per agent surface, not templates.
Server list and configuration live in docs/MCP_SETUP.md. Claude Code's file uses ${VAR} with
defaults. The others hardcode their URLs because their substitution syntax has no fallback, and the shared OpenCode
and Kilo file carries no substitution tokens at all, because Kilo Code rejects a whole project config file that
contains one.
There are no ports and no service to run. Everything is files, and they split into three groups.
MCP servers live in five files, one per agent surface, all carrying the same eight servers and differing only in the
top-level key, the type value, and the substitution syntax: .mcp.json,
opencode.json, .codex/config.toml, .vscode/mcp.json, and
.github/mcp.json. Change one, change all five. Keys, environment variables per operating system,
and the two Copilot surfaces that get no project file at all are in docs/MCP_SETUP.md.
Hook wiring lives beside them, one file per agent, all calling the same scripts in
.agents/hooks/: .claude/settings.json, the inline [[hooks.*]] tables in
.codex/config.toml, the plugin array of opencode.json, and
.github/hooks/preflight.json.
Which agent reads which of those, and what each hook surface can actually block, is the Agent support table above. Per-surface detail is in docs/agent-compatibility.md.
| Approach | What you get | Trade-off |
|---|---|---|
Copy-paste a single AGENTS.md |
Fast start, one file | Drifts the moment upstream changes; no skills, no subagents, no MCP |
| Personal dotfiles repo | Total control | Manual sync, and not designed for cross-tool agent setup |
| Tool-native rules (Cursor rules, Claude Projects) | Works in that tool | Locks you in, no portability across the supported agents |
| Awesome lists / prompt collections | Inspiration | Curated reading, not an installable setup |
| agent-standards | One git checkout brings skills, subagents, MCP servers across every supported agent |
Adds an agent-standards git remote; Windows symlinks need Developer Mode |
Where this loses: setup overhead (one-time), the remote dependency, and Windows symlink ergonomics.
Where it wins: a single source for the whole agent surface (skills, subagents, MCP, OpenSpec scaffolding), refreshed
with one git fetch.
The specialised subagents live as one canonical Markdown file each in subagents/ (this repo's root, not shipped to consumer projects). A generator emits the four tool-specific trees that are shipped, and maintains the two symlinks that let OpenCode and Kilo Code share one of them.
After editing any canonical file:
python tools/gen_subagents.pyCI gate (fails if generated tree is stale relative to canonical):
python tools/gen_subagents.py --checkRules:
- Edit subagents/.md only. The generator overwrites all four trees: .agents/agents/, .claude/agents/, .codex/agents/, and .github/agents/.
- Each tool gets its own format. Claude Code, Codex (TOML), and GitHub Copilot (
*.agent.md) each need their own. OpenCode and Kilo Code take the same OpenCode-format markdown and both follow symlinks when scanning an agent directory, so they share .agents/agents/ through.opencode/agentsand.kilo/agents. - Run the generator after any canonical change and commit both the source and the generated output. It also repairs the two symlinks if they went missing.
- Every skill a canonical file lists has to exist as a folder under .agents/skills/. The generator exits with an error naming the dangling entries rather than emitting an agent that preloads nothing.
- Consumer projects pull only the generated trees. They never see subagents/ or tools/.
Adding a new subagent: drop a frontmatter-headed Markdown file in subagents/ and re-run the generator.
Removing one: delete the canonical file and re-run. Orphaned outputs are pruned automatically.
Updates are driven from docs/AGENTS-UPDATE.md, a doc shipped from upstream that refreshes itself on every run. It contains bash and PowerShell commands that:
- Refresh the four shipped docs (docs/AGENT_TOOLING.md, docs/MCP_SETUP.md, docs/GLOBAL_SETUP.md, and docs/AGENTS-UPDATE.md itself).
- Refresh all four hook scripts in
.agents/hooks/, the OpenCode and Kilo plugin in.agents/plugin/, and the Copilot hook file in.github/hooks/. - Enumerate the skills already in the consumer's
.agents/skills/and pull only those (no surprise additions). - Enumerate the subagents already in the four generated trees (
.agents/agents/,.claude/agents/,.codex/agents/,.github/agents/) and pull only those. - Enumerate the saved Claude Code workflows already in
.claude/workflows/and pull only those.
The per-agent update commands earlier in this README work differently: they check out whole folders such as
.agents/skills, .claude/agents and .claude/workflows, so they also bring in skills, subagents and workflows your
project did not have yet.
Files intentionally NOT touched by the update: the three symlinks (.claude/skills, .opencode/agents,
.kilo/agents, all of which follow their canonical directories anyway), AGENTS.md.example, the consumer's
customised AGENTS.md, and the six configuration files (.mcp.json, opencode.json,
.vscode/mcp.json, .github/mcp.json, .codex/config.toml, .claude/settings.json). Three of those six hold gate
wiring next to something of yours, so a checkout would take your MCP servers or your permissions with it.
A project imported before agent-standards stopped shipping .claude/CLAUDE.md deletes it once, as
retiring .claude/CLAUDE.md describes, because any CLAUDE.md stops
Claude Code reading AGENTS.md natively.
When you do want an upstream change in one of the six, each shell section of that doc ends with a diff command and a checkout for all six, and what this skips says which half of each file is yours and which should track upstream.
If your project was imported before this doc shipped and has no docs/AGENTS-UPDATE.md, pull it with a one-off
git checkout agent-standards/master -- docs/AGENTS-UPDATE.md, then use it for every later refresh.
Full walkthrough lives in docs/AGENT_TOOLING.md.
Naming convention: UPPERCASE filenames ship to consumer projects via the git checkout above, lowercase
filenames stay in this repo only.
| File | What's in it |
|---|---|
| docs/AGENT_TOOLING.md | Initial import flow, future updates, subagents, MCP overview, full OpenSpec integration and workflow. |
| docs/MCP_SETUP.md | The real MCP config files, prerequisites, keys, env-var export per OS, the manual JetBrains and cloud-agent blocks, verification. |
| docs/AGENTS-UPDATE.md | Per-shell selective update commands including the diff-first configuration-file pair, the Windows symlink prerequisite, and the OpenSpec init and update guidance. Refreshes itself. |
| docs/GLOBAL_SETUP.md | Installing the same skills, subagents and gate into your home directory so every project on the machine inherits them, per agent and per shell. |
| File | What's in it |
|---|---|
| docs/agent-compatibility.md | Per-surface matrix of what each agent reads and what its hook surface can actually block. |
| docs/repository-layout.md | Canonical versus generated versus symlink, the full tree, and instruction precedence per agent. |
| docs/hooks-contract.md | The hook runner contract: discovery, the JSON envelope, ordering, exit codes, and the fail-open rules for writing a new hook. |
| docs/manual-setup.md | Fallback steps when the standard git checkout flow needs manual help (symlink recreation per OS) plus per-agent start commands. |
| docs/bootstrap-prompt.md | First-run verification prompt to paste into the agent after import. Checks skills, subagents, symlinks, the gate, MCP, and OpenSpec. |
| AGENTS.md | How to work on the standards themselves: canonical versus generated trees, repo conventions, and the local verification commands. |
| CONTRIBUTING.md | Branching, commit style, the pipeline triggers, and the local checks a pull request has to pass. |
| CHANGELOG.md | Release history in Keep a Changelog form. |
| sandbox-agent/README.md | Containerised end-to-end sandbox. Installs all five agent CLIs, imports the standards into a throwaway project, and asserts each agent discovers them. |
| e2e/README.md | The capability test suites the sandbox runs, one spec per behaviour, plus how to run a single test or the whole sweep. |
| File | What's in it |
|---|---|
| AGENTS.md.example | The one remaining template. Rename to AGENTS.md after import, then fill the project-specific sections. |
Issues and pull requests welcome. For non-trivial changes please open an issue first to discuss the approach. The repo is opinionated by design and direction matters.
Maintained by Łukasz Sarna.
MIT, see LICENSE.
