Keep One Agents Md Cursor Claude Copilot

Cursor, Claude, and GitHub Copilot will all accept a "how we work" file. If you write three of them from memory, they will disagree about the never-list by the end of the week.
Keep one AGENTS.md as the canon. Then fork a thin adapter for each host. Matching generators for Cursor rules, Copilot instructions, and Claude Project instructions are in the PromptDig library (Browse more prompts). This is not the standing-brief post about Custom GPTs, Gems, and system prompts. That card is product voice. This card is repo policy for coding agents.
The canon is a card, not a README
AGENTS.md is the always-on file. It is not a getting-started guide. A README tells a human how to clone. The agent file tells a model what it is allowed to touch.
Put only facts you can prove:
- What this repo is for, in one paragraph
- Commands that actually run (test, lint, dev)
- What a PR must include
- Never-list: files, APIs, and guesses the agent must not make
- Where secrets live, and that agents must not print them
- Path exceptions: which folders have extra rules
If a stack version is not in the tree, do not write it. "Use Node 20" that nobody pinned is how the agent "upgrades" you in a PR you did not ask for.
A skeleton for the canon:
Repo: [name and job].
Stack I can prove from the tree: [list].
Commands that work: [test, lint, dev].
PR bar: [tests, screenshots, migration note].
Never: [print env files, invent IDs, live network in unit tests, commit secrets].
Secrets: [path to example env]. Copy the example. Do not dump values.
Path exceptions: [folder -> extra rule].
If a version, API, or ID is not in this file or the tree, ask. Do not guess.
That block is the product. Cursor, Claude, and Copilot all get a translation of it. They do not each get a new philosophy.
Cursor: root AGENTS.md plus scoped mdc
Cursor reads a root AGENTS.md, then path-scoped rules (mdc files with YAML front matter and globs). Put the always-on policy in AGENTS.md. Put sharp edges in mdc files with alwaysApply: false and a glob that matches a real path: a NOAA client, an e2e folder, a migrations directory.
Do not revive a single legacy .cursorrules dump. That file is how never-lists get buried under style opinions.
Use the Cursor AGENTS.md and Project Rules MDC Generator when you need the map plus valid front matter. Humans still fill versions. The generator should refuse fake CI badges and invented runtimes.
Claude: CLAUDE.md or Project instructions, not both as sources
If the team lives in the repo, a CLAUDE.md at the root is the adapter: same never-list, same commands, a little more "how to read this tree." If the team lives in a Claude Project with uploaded knowledge, use Claude Project custom instructions (Claude Project Custom Instructions Knowledge Memory Guardrails) and treat the repo AGENTS.md as a file you upload, not a second policy you rewrite from scratch.
Memory is not a second never-list. If memory and AGENTS.md conflict, AGENTS.md wins. Say so in the Project instructions.
Do not paste Cursor YAML globs into Claude. Claude will treat them as prose and ignore the glob.
Copilot: one instructions.md, headings not YAML
GitHub Copilot wants .github/copilot-instructions.md. It does not want Cursor globs. Translate path exceptions as headings. Keep the never-list in the same words as the canon.
The GitHub Copilot instructions.md Generator is the fork, not a new policy.
From this AGENTS.md canon, write Copilot instructions.md.
Do not emit Cursor mdc or YAML globs.
Keep the never-list verbatim.
Path notes as headings.
Install path: .github/copilot-instructions.md
If a runtime version is not in the canon, omit it.
Change the canon first
When you add "never invent station IDs," add it to AGENTS.md, then regenerate the adapters the same day. Drift is how Cursor refuses a live unit-test call and Copilot happily writes one.
Name the files so a stranger can find them: AGENTS.md, .cursor/rules/*.mdc, CLAUDE.md or the Project paste, .github/copilot-instructions.md. Store the generator prompts next to them. When a rule actually catches a bad edit, share that never-list (Share a prompt) with the repo job in the title.
You do not need three brains. You need one card, then three install paths. Write the policy once. Fork the control surface.