前置条件
- 1已安装至少一个支持 AGENTS.md 的 AI 编程客户端(Claude Code 2.1.277+ / Codex CLI / Cursor / Trae)
- 2有一个实际的 Git 仓库用于实践
- 3了解基本的 Markdown 语法
腾讯智能体开发平台 ADP
新客首月专属价,最高直降 880 元,构建/分发/治理企业级 Agent
AGENTS.md 统一配置实战
前置准备
- 已安装至少一个支持 AGENTS.md 的 AI 编程客户端
- 有一个实际的 Git 仓库用于实践
- 了解基本的 Markdown 语法
一、为什么现在必须学这个
1.1 一个真实的痛点
去年你可能遇到过这种情况:
1项目根目录/
2├── CLAUDE.md # 给 Claude Code 看的
3├── .cursorrules # 给 Cursor 看的
4├── .windsurfrules # 给 Windsurf 看的
5├── copilot-instructions.md # 给 GitHub Copilot 看的
6└── AGENTS.md # 给 Codex 看的五份文件,内容 80% 重复,改一处要同步五处。 而且它们迟早会不同步——改了 CLAUDE.md 忘了改 .cursorrules,然后 Cursor 生成的代码风格就跟 Claude Code 的对不上,Code Review 时谁也说不清为什么。
1.2 2026 年 9 月发生了什么
2026 年 9 月 19 日,Claude Code v2.1.277 发布了一个不起眼但影响深远的改动:
信息
当目录下没有 CLAUDE.md 时,Claude Code 会回退读取 AGENTS.md。
AGENTS.md 是 OpenAI 在 2025 年捐给 Agentic AI Foundation 的开放规范,目前已被 6 万多个开源项目采用。
这条改动的意义:
| 之前 | 之后 |
|---|---|
| Claude Code 只读 CLAUDE.md | Claude Code 优先 CLAUDE.md,缺失时读 AGENTS.md |
| Codex 只读 AGENTS.md | 不变 |
| 需要维护两份 | 一份 AGENTS.md 通吃 |
一个文件驱动所有工具,这件事终于成立了。
1.3 支持现状矩阵
| 客户端 | AGENTS.md 支持 | 子目录就近覆盖 | 版本要求 |
|---|---|---|---|
| Claude Code | ✅ 原生(回退) | ✅ | 2.1.277+ |
| Codex CLI | ✅ 原生(首选) | ✅ | 全版本 |
| Cursor | ✅ | ❌ 仅根目录 | 2025 底+ |
| Trae | ✅ | ❌ 仅根目录 | 2026+ |
| GitHub Copilot | ⚠️ 部分 | ❌ | 实验性 |
| Cline | ❌ | — | 暂不支持 |
| Windsurf | ❌ | — | 暂不支持 |
二、规范字段全解
2.1 文件位置与加载规则
1仓库根/
2├── AGENTS.md ← 全局约定(必读)
3├── src/
4│ ├── AGENTS.md ← src/ 下的约定
5│ └── api/
6│ └── AGENTS.md ← src/api/ 下的约定(最具体)
7└── tests/
8 └── AGENTS.md加载顺序(以在 src/api/user.ts 工作为例):
11. 仓库根/AGENTS.md 优先级 低
22. src/AGENTS.md ↓
33. src/api/AGENTS.md 优先级 高全部拼接注入,不是覆盖。后面的内容在上下文里靠后,对模型的影响更大。
警告
⚠️ Cursor 和 Trae 只加载根目录那一份。子目录的 AGENTS.md 对它们无效。所以根目录那一份必须自包含——即使子目录文件不生效,Agent 也不会做出违反规范的事。
2.2 推荐结构(8 个区块)
1# 项目名称
2
3一句话说明这个项目做什么,以及它的核心约束。
4
5## 技术栈
6(语言 / 框架 / 版本 / 包管理器 / 关键依赖)
7
8## 常用命令
9(构建 / 测试 / lint / 迁移,可直接复制执行)
10
11## 代码规范
12(命名 / 文件组织 / 注释 / 错误处理 / 类型)
13
14## 测试要求
15(什么必须测 / 覆盖率 / 怎么跑)
16
17## 架构速览
18(目录职责 + 关键模块关系)
19
20## 禁区
21(绝对不能做的事,含原因)
22
23## 工作流约定
24(分支 / 提交 / PR / Code Review)
25
26## 环境说明
27(环境变量 / 本地启动 / 依赖服务)2.3 每个区块怎么写才有用
技术栈:写版本号,不写「最新版」
1## 技术栈
2- TypeScript 5.6(strict 模式,**不要关 strict**)
3- Next.js 14.2 App Router(不要用 Pages Router)
4- Tailwind CSS 3.4(不要升 4.x,配置文件格式变了)
5- PostgreSQL 15 + Prisma 5.22
6- 包管理器:pnpm 9(**不要用 npm/yarn**)为什么必须钉版本:模型 training data 里 Next.js 14 和 15 的写法混在一起。你不写死版本,它有 50% 概率给你 Pages Router 的写法或者 React Server Component 的旧语法。
常用命令:给完整可复制的命令
1## 常用命令
2# 开发
3pnpm dev # 启动开发服务器 localhost:3000
4
5# 测试
6pnpm test # 跑全部单测
7pnpm test -- --watch # 监听模式
8pnpm test:integration # 集成测试(需要本地 Postgres 起来)
9
10# 质量
11pnpm lint # ESLint
12pnpm typecheck # tsc --noEmit
13pnpm format # Prettier 写入
14
15# 数据库
16pnpm prisma migrate dev # 本地建迁移
17pnpm prisma studio # 可视化查看数据关键:pnpm test:integration 后面的括号注释不是废话。没有它,Agent 会在集成测试失败时不告诉你「你忘了起 Postgres」,而是开始瞎改代码。
禁区:必须写原因
1## 禁区
2
31. **禁止直接改 `prisma/schema.prisma` 后手动写 SQL 迁移**
4 原因:本项目用 `prisma migrate dev` 自动生成迁移,手写会导致迁移历史与 schema 不一致。
5
62. **禁止在 `app/` 目录下写 `console.log`**
7 原因:CI 有 lint 规则拦截,且线上日志采集用的是 `lib/logger.ts`。
8
93. **禁止删除 `lib/legacy/` 下的任何文件**
10 原因:这批文件在灰度切流中,还有 12% 流量依赖,删除即 P0。
11
124. **禁止在组件里直接 fetch,一律走 `lib/api/client.ts`**
13 原因:统一的错误处理和鉴权拦截在那里面。
14
155. **禁止提交 `.env*` 文件**
16 原因:历史上有过一次密钥泄露事故。写原因和不写原因的区别是巨大的:
- 不写原因:Agent 不知道边界在哪,遇到边缘情况会自作主张
- 写原因:Agent 能推断出「什么情况下这条规则可以例外」
第 3 条尤其重要——「灰度切流中,还有 12% 流量依赖」这种信息,Agent 不可能猜到,但它决定了 Agent 会不会去动那批文件。
三、四个客户端的具体配置
3.1 Claude Code
配置位置:仓库根 AGENTS.md(或 CLAUDE.md,二选一)
优先级规则(v2.1.277+):
11. 当前目录及祖先目录的 CLAUDE.md(如果存在)
22. 否则回退到 AGENTS.md
33. 用户级 ~/.claude/CLAUDE.md
44. 项目级 .claude/CLAUDE.local.md(本地私有,不提交)验证是否生效:
1# 让 Claude Code 自己说出来
2claude -p "列出你当前加载的所有记忆文件内容来源"一个有用的技巧:把个人偏好(不是团队规范)放进 .claude/CLAUDE.local.md 并加进 .gitignore。团队规范进 AGENTS.md 提交到仓库,个人偏好不污染仓库。
3.2 Codex CLI
配置位置:AGENTS.md(首选),Codex 从 2025 年起就原生支持。
1# 初始化
2codex
3
4# 指定工作目录(影响 AGENTS.md 加载路径)
5codex --cd ./src/apiCodex 的一个特殊行为:它会同时读取 AGENTS.md 和 ~/.codex/instructions.md。后者是全局指令,对所有项目生效。
3.3 Cursor
配置位置:仓库根 AGENTS.md
.cursorrules 迁移:
1# 把旧的 .cursorrules 内容合并进 AGENTS.md 的「代码规范」区块
2cat .cursorrules >> /tmp/old_rules.md
3# 手动整理后合并,然后删除
4rm .cursorrules限制:
- 只读根目录的 AGENTS.md,子目录那份会被忽略
- 不支持
@file引用语法(会当纯文本) .cursor/rules/*.mdc仍然优先级更高,如果两者冲突,以.cursor/rules为准
3.4 Trae
配置位置:仓库根 AGENTS.md
Trae 支持最基础的版本:只读根目录一份,不解析 @ 引用。写法上不要依赖任何高级语法,用纯 Markdown 就行。
3.5 兼容写法速查
| 语法 | Claude Code | Codex | Cursor | Trae | 建议 |
|---|---|---|---|---|---|
| 普通 Markdown | ✅ | ✅ | ✅ | ✅ | 主力使用 |
@path/to/file 引用 | ✅ | ✅ | ❌ | ❌ | 用普通链接代替 |
| 代码块命令 | ✅ | ✅ | ✅ | ✅ | 安全 |
| 表格 | ✅ | ✅ | ✅ | ✅ | 安全 |
| HTML 注释 | ✅ | ✅ | ⚠️ | ⚠️ | 少用 |
| 子目录就近覆盖 | ✅ | ✅ | ❌ | ❌ | 根目录自包含 |
四、从 CLAUDE.md 迁移的五步法
Step 1:盘点现有配置
1ls -la | grep -iE "claude|cursor|agents|windsurf|copilot"列出所有配置文件,逐个看内容。
Step 2:合并去重
把内容按本文 2.2 的 8 个区块重新归类。重复的内容只保留一份,冲突的内容人工裁决。
典型冲突及裁决原则:
| 冲突 | 裁决 |
|---|---|
| 两个文件规定了不同的缩进(2 空格 vs 4 空格) | 以 .editorconfig / Prettier 配置为准 |
| 一个说用 npm,一个说用 pnpm | 以 package.json 的 packageManager 字段为准 |
| 一个禁止某操作,另一个没提 | 保留禁止项 |
| 测试覆盖率要求不同 | 取更严格的那个 |
Step 3:改名为 AGENTS.md
1git mv CLAUDE.md AGENTS.md保留 git 历史,别直接新建+删除。
Step 4:加兼容软链(可选)
如果团队里有人还在用旧版 Claude Code(< 2.1.277),加一个软链:
1ln -s AGENTS.md CLAUDE.md
2echo "CLAUDE.md" >> .gitignore # 软链不提交信息
注意:软链在 Windows 上麻烦,Windows 团队直接复制一份并加进 .gitignore,用一个 pre-commit hook 保证同步。
Step 5:验证四个工具都能读到
1# Claude Code
2claude -p "你读到的项目规范第一条是什么"
3
4# Codex
5codex "你读到的项目规范第一条是什么"
6
7# Cursor / Trae
8# 在对话框里问同样的问题四个工具给出一致答案 = 迁移成功。
五、10 个可直接抄的片段
片段 1:编码规范(TypeScript)
1## 代码规范
2
3### TypeScript
4- strict 模式全开,禁止 `any`(确需时用 `unknown` + 类型守卫)
5- 导出组件用命名导出,不用 default 导出
6- 类型定义放 `types/` 目录,不要散落在组件文件里
7- 异步函数一律返回 `Result<T, E>`,不用 try/catch 吞异常
8- 禁止 `as` 断言,用类型守卫函数
9
10### 命名
11- 文件名:kebab-case(`user-profile.tsx`)
12- 组件:PascalCase
13- 函数/变量:camelCase
14- 常量:SCREAMING_SNAKE_CASE
15- 数据库表:snake_case 复数(`user_profiles`)
16
17### 注释
18- 只写「为什么」,不写「做了什么」
19- 每个导出函数必须有 JSDoc
20- 禁止注释掉的代码,直接删(git 里有历史)片段 2:测试要求
1## 测试要求
2
3- 每个 service 方法必须有单测,覆盖率门槛 70%
4- 涉及金额/权限/状态机的逻辑,覆盖率必须 100%
5- 测试文件命名 `*.test.ts`,与源码同目录
6- 用 `describe` 描述被测对象,`it` 描述预期行为(用中文也行,但要一致)
7- **禁止 mock 数据库**,用 testcontainers 起真实 Postgres
8- 集成测试标记 `@integration`,CI 单独跑片段 3:Git 工作流
1## 工作流约定
2
3- 分支:`feature/xxx` `fix/xxx` `chore/xxx`
4- 提交信息:Conventional Commits(`feat:` `fix:` `chore:`)
5- 提交前必跑:`pnpm lint && pnpm typecheck && pnpm test`
6- PR 描述必须包含:改了什么 / 为什么改 / 怎么验证
7- **禁止 force push 到 main**
8- PR 单文件改动超 500 行要拆分(审查不过来)片段 4:架构速览(带 ASCII 图)
1## 架构速览
2
3\`\`\`
4┌─────────────┐
5│ app/ │ Next.js App Router 页面
6├─────────────┤
7│ components/ │ 纯展示组件,不含业务逻辑
8├─────────────┤
9│ lib/ │ 业务逻辑层
10│ ├ api/ │ 外部 API 封装
11│ ├ db/ │ Prisma 数据访问
12│ └ utils/ │ 纯函数工具
13├─────────────┤
14│ types/ │ 全局类型
15└─────────────┘
16\`\`\`
17
18关键约定:
19- `app/` 只做路由和布局,不写业务逻辑
20- `components/` 不直接调 API,通过 props 接收数据
21- `lib/db/` 是唯一允许直接操作 Prisma 的地方片段 5:错误处理约定
1## 错误处理
2
3统一使用 `Result<T, E>` 模式:
4
5\`\`\`typescript
6type Result<T, E = AppError> =
7 | { ok: true; value: T }
8 | { ok: false; error: E };
9\`\`\`
10
11规则:
12- 不抛异常,返回 Result
13- 错误信息必须包含上下文(哪个操作、哪个 id)
14- 面向用户的错误走 `AppError`,内部错误记日志
15- **禁止空 catch 块**(`catch {}`)片段 6:环境变量说明
1## 环境说明
2
3必需环境变量(缺一个启动失败):
4- `DATABASE_URL` Postgres 连接串
5- `REDIS_URL` Redis 连接串
6- `JWT_SECRET` JWT 签名密钥
7
8可选:
9- `LOG_LEVEL` 默认 info
10- `SENTRY_DSN` 不配则不启用错误上报
11
12本地启动:
131. `docker compose up -d` 起 Postgres + Redis
142. `cp .env.example .env`
153. `pnpm prisma migrate dev`
164. `pnpm dev`片段 7:性能约束
1## 性能约束
2
3- 单页面首屏 JS bundle < 200KB(CI 有门禁)
4- 数据库查询必须走索引,`EXPLAIN` 确认无全表扫描
5- 列表查询一律分页,单页最多 100 条
6- **禁止在循环里查数据库**(N+1),用 `include` 或批量查询
7- 图片一律走 next/image,禁止裸 `<img>`片段 8:安全约定
1## 安全约定
2
3- 所有用户输入必须校验,用 zod schema
4- SQL 一律用 Prisma 参数化查询,禁止字符串拼接
5- 敏感字段(密码/token/身份证)响应前必须剔除
6- **禁止把密钥写进代码**,走环境变量
7- 接口鉴权用 `lib/auth/middleware.ts`,不要自己实现片段 9:AI 协作特别约定
1## AI 协作约定
2
3- 改动前先说明你要改哪些文件,等我确认
4- 一次只改一个关注点,不要顺手重构无关代码
5- 不确定 API 是否存在时去查 `node_modules` 里的类型定义,不要凭印象写
6- 生成的代码必须通过 `pnpm typecheck`,不通过不要交付
7- 如果发现 AGENTS.md 的规范与实际情况冲突,**告诉我,不要自行违反**片段 10:禁区(带原因)
1## 禁区
2
31. 禁止修改 `lib/legacy/` —— 灰度中,12% 流量依赖
42. 禁止改 `prisma/migrations/` 下已提交的迁移 —— 会导致线上 schema 漂移
53. 禁止在 `app/api/` 写业务逻辑 —— 那层只做参数校验和转发
64. 禁止引入新的 UI 库 —— 已在去 antd 化的过程中
75. 禁止提交 `console.log` —— CI 拦截六、完整范本
一个真实的中型项目 AGENTS.md(可直接改改就用):
1# 电商中台 API
2
3基于 Next.js 14 App Router 的电商中台后端,为 B 端商家后台和 C 端小程序提供接口。
4核心约束:金额计算必须用 Decimal,禁止浮点数。
5
6## 技术栈
7- TypeScript 5.6(strict,禁止 any)
8- Next.js 14.2 App Router
9- Prisma 5.22 + PostgreSQL 15
10- Redis 7(缓存 + 会话)
11- pnpm 9(不要用 npm/yarn)
12
13## 常用命令
14pnpm dev 开发服务器 :3000
15pnpm test 单测
16pnpm test:integration 集成测试(需先 docker compose up -d)
17pnpm lint && pnpm typecheck 提交前必跑
18pnpm prisma migrate dev 建迁移
19
20## 代码规范
21- 金额一律用 Decimal.js,禁止 number 做金额运算
22- 所有 service 返回 Result<T>
23- 文件名 kebab-case,类型定义进 types/
24- 禁止 console.log,用 lib/logger
25
26## 测试要求
27- service 层覆盖率 ≥70%,金额/库存逻辑 100%
28- 禁止 mock 数据库,用 testcontainers
29- 每个 PR 必须带测试
30
31## 架构速览
32app/api/ 路由层(只做校验转发)
33lib/service/ 业务逻辑(主要在这里写代码)
34lib/db/ 数据访问(唯一允许用 Prisma 的地方)
35lib/cache/ Redis 封装
36types/ 全局类型
37
38## 禁区
391. 禁止金额用 number —— 浮点精度会导致对账不平,出过一次 P0
402. 禁止直接改已提交的迁移文件
413. 禁止在 service 里直接写 SQL
424. 禁止提交 .env
43
44## 工作流
45- 分支 feature/xxx,Conventional Commits
46- PR 必须说明:改了什么 / 为什么 / 怎么验证
47- 单 PR 不超 500 行改动这份文件 60 行,覆盖了 Agent 需要知道的 90% 信息。 不需要更长。
七、分层配置实战
7.1 根目录写什么
只写全项目通用的、不会频繁变的东西:技术栈、命令、全局规范、禁区、工作流。
7.2 子目录写什么
只写该目录特有的、与全局不同的东西:
1<!-- src/api/legacy/AGENTS.md -->
2# 遗留接口层特别约定
3
4这里是 2024 年的老接口,正在逐步迁移到 src/api/v2/。
5
6## 特别约定
7- 不要在这里新增接口,新增一律去 v2
8- 修改时**不要顺手重构**,保持最小改动(这批接口没有测试覆盖)
9- 命名风格是 snake_case(与全局 kebab-case 不同,是历史遗留,不要改)
10- 如果要动这里的逻辑,先告诉我迁移计划,我评估后再动7.3 分层的三个原则
| 原则 | 说明 |
|---|---|
| 不重复 | 子目录不写根目录已有的内容 |
| 只写例外 | 子目录只声明「与全局不同之处」 |
| 就近优先 | 越靠近当前文件的优先级越高 |
反面例子(不要这么写):
1<!-- src/components/AGENTS.md -->
2# 组件规范
3- 用 TypeScript ← 根目录已写,重复
4- 命名用 PascalCase ← 根目录已写,重复
5- 组件不超过 200 行 ← 这才是该写的例外八、故障排查表
| # | 现象 | 原因 | 解决 |
|---|---|---|---|
| 1 | Claude Code 完全不读 AGENTS.md | 版本 < 2.1.277 | 升级:npm i -g @anthropic-ai/claude-code |
| 2 | 有 CLAUDE.md 时 AGENTS.md 被忽略 | 优先级规则:CLAUDE.md 优先 | 删掉 CLAUDE.md 或改名成 AGENTS.md |
| 3 | Cursor 不读子目录的 AGENTS.md | Cursor 只支持根目录 | 把关键约定上移到根目录 |
| 4 | @file 引用在 Cursor 里不生效 | Cursor 不支持该语法 | 改成普通 Markdown 链接或直接内联内容 |
| 5 | Agent 仍然用错的包管理器 | package.json 没写 packageManager 字段 | 加 "packageManager": "pnpm@9.0.0" |
| 6 | 上下文被吃满,回答变慢 | AGENTS.md 太长 | 压到 150 行内,细节挪到 docs/ |
| 7 | 团队配置和个人配置冲突 | 都写在仓库里 | 个人偏好放 .claude/CLAUDE.local.md 并 gitignore |
| 8 | Windows 软链 CLAUDE.md 失效 | Git Bash 创建的是文件不是链接 | 直接复制一份 + pre-commit 同步脚本 |
| 9 | 子目录规范没生效 | 路径不在当前工作目录的祖先链上 | 确认 pwd 在正确的目录 |
| 10 | Agent 说「没看到任何项目规范」 | 文件没提交或编码问题 | 确认文件已 git add;编码用 UTF-8 无 BOM |
| 11 | 中文内容乱码 | 文件保存成 GBK | 转 UTF-8:iconv -f GBK -t UTF-8 AGENTS.md |
| 12 | Codex 读到的是全局指令不是项目规范 | ~/.codex/instructions.md 覆盖了 | 检查全局文件,把项目专属内容挪回 AGENTS.md |
| 13 | 规范写了但 Agent 违反 | 写了「不要做 X」没写原因 | 补上原因,Agent 才能推断边界 |
| 14 | 多个子目录规范互相矛盾 | 分层没设计好 | 矛盾项统一上移到根目录 |
| 15 | Trae 读一半就停 | 文件里有特殊字符 | 去掉 HTML 注释和特殊符号 |
| 16 | 改了 AGENTS.md 但会话里没生效 | 会话缓存了旧的上下文 | 开新会话(Claude Code 用 /clear) |
| 17 | PR 里混入了 CLAUDE.local.md | 没加 gitignore | 加 .claude/CLAUDE.local.md 到 .gitignore |
| 18 | 团队不同步,有人用旧格式 | 没有 CI 校验 | 加 CI 检查:禁止提交 .cursorrules / CLAUDE.md |
九、CI 校验(防止配置分裂回潮)
加一个 GitHub Action,拦截旧格式文件:
1# .github/workflows/agents-md.yml
2name: AGENTS.md 规范检查
3on: [pull_request]
4
5jobs:
6 check:
7 runs-on: ubuntu-latest
8 steps:
9 - uses: actions/checkout@v4
10
11 - name: 禁止提交旧的配置文件
12 run: |
13 for f in .cursorrules .windsurfrules copilot-instructions.md CLAUDE.md; do
14 if [ -f "$f" ]; then
15 echo "❌ 发现 $f,请合并到 AGENTS.md 后删除"
16 exit 1
17 fi
18 done
19
20 - name: AGENTS.md 必须存在
21 run: |
22 test -f AGENTS.md || { echo "❌ 缺少 AGENTS.md"; exit 1; }
23
24 - name: 长度检查(根目录不超过 200 行)
25 run: |
26 lines=$(wc -l < AGENTS.md)
27 if [ "$lines" -gt 200 ]; then
28 echo "❌ AGENTS.md 有 $lines 行,超过 200 行上限,请精简"
29 exit 1
30 fi
31
32 - name: 必须包含核心区块
33 run: |
34 for sec in "技术栈" "常用命令" "代码规范" "禁区"; do
35 grep -q "## $sec" AGENTS.md || { echo "❌ 缺少区块:$sec"; exit 1; }
36 done十、常见问题
Q1:AGENTS.md 会被提交到 Git 吗?
必须提交。它是团队共享的项目规范,和 README 一个性质。
个人偏好(比如「回答用中文」「别给我写代码注释」)不要放这里,放 .claude/CLAUDE.local.md 并 gitignore。
Q2:和 README.md 有什么区别?
| 文件 | 读者 | 内容 |
|---|---|---|
| README.md | 人 | 项目介绍、快速开始、贡献指南 |
| AGENTS.md | AI | 精确的技术约束、命令、禁区 |
不要合并。README 里的「欢迎贡献 PR」对 AI 是噪音;AGENTS.md 里的「禁止 force push」对人不重要。
Q3:Monorepo 怎么办?
每个包一个 AGENTS.md,根目录放全局约定:
1monorepo/
2├── AGENTS.md ← 全局:包管理器、Node 版本、CI 流程
3├── packages/
4│ ├── web/AGENTS.md ← Next.js 相关
5│ ├── api/AGENTS.md ← 后端相关
6│ └── shared/AGENTS.md ← 公共库相关Q4:能不能引用外部文件?
Claude Code 和 Codex 支持 @path/to/file 语法,Cursor / Trae 不支持。
跨工具兼容的写法:用普通 Markdown 链接 + 一句「需要时读取」:
1详细的 API 设计规范见 [docs/api-conventions.md](./docs/api-conventions.md)。
2涉及接口设计时先读这份文档。Q5:多久更新一次?
每次技术栈变动时立即更新。过期的 AGENTS.md 比没有更糟——Agent 会按错误的规范写,而且你很难发现。
建议:把它加进 PR 模板的检查项。
1<!-- .github/pull_request_template.md -->
2- [ ] 本次改动是否涉及技术栈/规范变化?是 → 已同步更新 AGENTS.mdQ6:怎么验证 AGENTS.md 真的生效了?
最直接的方法——故意问一个只有 AGENTS.md 里有答案的问题:
1claude -p "这个项目里金额用什么类型?为什么?"如果它答出「Decimal,因为浮点精度会导致对账不平,出过一次 P0」,说明读到了。
十一、相关教程
- Qwen3 接入 Claude Code — 换模型不改工作流
- DeepSeek V4.1 Flash 接入 VS Code — 长上下文代码模型
- Cline 接入 VS Code — 另一种 Agent 模式
- MCP 接入 Cursor — 扩展 Agent 工具能力
小结
AGENTS.md 本质上解决的是规范碎片化问题。三个落地要点:
- 钉死版本,写清原因。版本号防止模型用过时写法,原因帮助模型推断规则边界。
- 根目录自包含,控制在 150 行。Cursor / Trae 只读根目录那份,且这份每次会话都进上下文。
- 禁区必须写原因。这是唯一能让 Agent 理解「为什么不能动」的方式。
以及一条组织纪律:
信息
加 CI 拦截旧配置文件。不然三个月后 .cursorrules 会自己长回来。
常见问题
QAGENTS.md 和 CLAUDE.md 到底留哪个?
新项目只留 AGENTS.md,它是跨工具规范,Claude Code 2.1.277+ 已经原生支持回退读取。已有 CLAUDE.md 的老项目,如果只用 Claude Code 可以不迁;一旦引入第二个工具(Codex / Cursor / Trae),就必须合并成 AGENTS.md,否则两套配置会打架——不同工具读到不同规范,行为不一致且极难排查。
Q子目录里的 AGENTS.md 会覆盖根目录的吗?
不会覆盖,是就近追加。客户端会把从仓库根到当前工作目录路径上的所有 AGENTS.md 全部拼接起来,越靠近当前文件的优先级越高。所以根目录只写全局约定(技术栈、编码规范、禁区),子目录只写该模块的特殊约定。别在子目录重复根目录内容,会白白吃掉上下文。
QAGENTS.md 写多长合适?
根目录控制在 150 行以内,全文不超过 400 行。它每次会话都会被注入上下文,写长了等于长期缴一笔上下文税。实测一个 900 行的 AGENTS.md 会让每次请求多花 12K tokens,一个月下来在多 Agent 场景下是实打实的成本。把细节挪到 docs/ 里,用链接指过去,让 Agent 按需读取。
QCursor 和 Trae 真的读 AGENTS.md 吗?
读,但支持程度不同。Cursor 从 2025 年底开始支持项目根 AGENTS.md;Trae 在 2026 年跟进。两者都不支持子目录就近覆盖(只有根目录那份生效),且对 @引用 语法支持不完整。本文第 4 节给了完整的兼容矩阵,照着写就能四个工具都跑通。