AGENTS.md 模板:可直接粘贴、又不浪费 token 的起步文件
下面这份模板大约 ~40 行,这是刻意控制的。每个会读取它的编程代理,都会在每个会话加载 `AGENTS.md`;所以每多一行,都是按次收税。复制它,填上你的项目细节,再删掉不适用的部分。
AGENTS.md 是给编程代理看的共享指令文件。现在 60k+ 个开源项目 都用它交代项目上下文:Codex、Cursor、VS Code agent mode 和 Windsurf 会直接读;Claude Code 则靠一行桥接文件读进去。多数仓库不是缺这个文件,而是把代理早就懂的常识又写了一遍。下面这份模板反过来做:只留下那些不写就真会出错的内容。
模板本体
# AGENTS.md
## Project
One paragraph: what this codebase does, the stack, and the one
architectural fact agents keep getting wrong about it.
(e.g. "API and worker share types from packages/core — change
them together or CI fails.")
## Commands
- Install: `pnpm install`
- Build: `pnpm build`
- Test one file: `pnpm vitest run <path>` # agents default to the
# full suite; give the fast path
- Lint + typecheck: `pnpm lint && pnpm tsc --noEmit`
- Never run: `pnpm deploy` (CI-only), `pnpm db:reset` (destructive)
## Conventions
- TypeScript strict. No `any` — fix the type, don't cast around it.
- Imports absolute from `src/`. No relative `../../`.
- Errors: throw typed `AppError` subclasses, never bare strings.
- New code follows the patterns of its nearest neighbor file.
## Boundaries
- Don't edit `src/generated/**` — regenerated on every build.
- Don't modify existing files in `db/migrations/` — append new ones.
- Secrets come from env vars. Never hardcode, never commit fixtures
containing real data.
## Done means
- `pnpm test` green, no new lint or type errors.
- If you changed behavior, you changed or added a test.
填上你的技术栈,删掉示例注释,五个标题保留。某个小节如果一写就超过 ~10 行,通常说明它该放进链接文档,而不是跟着每个编程代理的每轮上下文一起进场。
给 Claude Code 的桥接文件
Claude Code 不会原生读取 AGENTS.md。Anthropic 文档说得很直:“Claude Code reads CLAUDE.md, not AGENTS.md.” 它的入口是 CLAUDE.md,不是 AGENTS.md。官方推荐的桥接方式也很薄:建一个 CLAUDE.md,第一行导入共享文件:
# CLAUDE.md
@AGENTS.md
# Claude-only notes (only what differs from the shared file)
- Use the ripgrep MCP server for search, not bash grep.
这样只有一个事实源,所有工具都能读。Windows 上不要默认走软链:软链需要管理员权限,导入不需要。
为什么只要这五节,不要更多
Project防的是代理凭刚好打开的几个文件猜架构。给它一段项目定位,比让它每个会话都重新猜一遍可靠。Commands是收益最高的一节。单文件测试命令就足够值回整份模板:没有这行,代理很容易每改一次都跑全量测试。Never run那一行,是给破坏半径设刹车。Conventions只写合格模型仍会弄错的规则:你们偏离默认做法的地方,而不是完整风格指南。代理知道怎么写惯用的 TypeScript;它不知道你们禁止靠any绕过去。Boundaries拦的是最贵的失败:代理好心去“修”生成代码或旧迁移,最后你花一小时善后。Done means把“我觉得完成了”改成能检查的退出条件。条件写清楚,代理更容易停在该停的地方,也更愿意验证。
为什么要这么克制?因为坑已经被很多团队踩过了:指令文件会进入每一轮上下文,体积同时消耗 token 和注意力;共享文件一旦膨胀,成本会摊到团队里的每个工具上。社区也在往同一个方向收敛。最近还有文章建议用 RFC-2119 式的 MUST/NEVER 写法,让规则更短、更不含糊。你未必需要那套形式,但一定需要这份克制。
哪些内容别放进去
- 个人偏好(“我喜欢很详细的 commit message”):放进你自己的
~/.claude/CLAUDE.md或同类文件,不要放进共享文件。 - lint 已经管住的规则:代理会看到错误消息;再写一遍只是重复付费。
- 长篇架构文档:给链接就行,比如“见
docs/architecture.md”。让代理需要时再打开,不要每一轮都背着走。 - 工具专属配置:某个工具有自己的规则文件或 hooks,就放到那里。共享文件只写不管哪个代理进来都成立的事实。
Monorepo 写法
根目录放一份 AGENTS.md,写全局事实;每个包再放一份短文件,只补本地差异:
repo/
AGENTS.md # stack, shared commands, org-wide boundaries
apps/web/AGENTS.md # "Next.js app. Test: pnpm --filter web test"
packages/core/AGENTS.md
Cursor 会原生读取嵌套的 AGENTS.md 文件;Codex 会采用离当前目录最近的上级文件。Claude Code 这边,用每个目录里的 CLAUDE.md 桥接文件复刻同样结构:@../../AGENTS.md 再加本地补充;它的 memory 层级 会自上而下合并。
配套阅读
CLAUDE.mdvsAGENTS.md:Claude Code 到底读哪个?:标准现状,以及什么时候该让哪个文件当事实源。- 指令文件大到什么程度会伤性能?:体积预算背后的研究。
- 5 个悄悄烧 token 的习惯:给已经长胖的文件做审查清单。
- 如何写好
CLAUDE.md:文件叫什么不重要,写作原则是一样的。
这篇对你有帮助吗?