更新于

Codex 项目级 AGENTS.md 编写指南


很多团队第一次用 Codex,会把关键约束全塞进临时 prompt:先说代码风格,再说测试命令,再补一句“别动生产配置”,下一次开新会话还得重讲一遍。OpenAI 官方把这类需要长期跟着代码仓库走的约束放到了 AGENTS.md 里,让它在每次任务开始前就被加载。

问题在于,知道“有这个文件”不等于会写。AGENTS.md 写得过短,Codex 不知道你的工程约束;写得过长,它又会变成一份没人维护的项目宣言。真正有用的写法,不是把所有流程复制进去,而是把每次都必须生效的仓库级规则放在最小可维护的结构里。

一、先理解它怎么被发现:根目录不是唯一入口

OpenAI 官方当前文档给出的规则很清楚:Codex 启动时会构建一条 instruction chain,先读全局层,再从项目根目录一路走到当前工作目录;每一级目录至多纳入一个指令文件,后面的层覆盖前面的层。默认会优先找 AGENTS.override.md,其次是 AGENTS.md,如果都没有,还可以在配置里通过 project_doc_fallback_filenames 指定备用名字。

这意味着项目级 AGENTS.md 不是孤立文件,而是分层体系的一部分:

层级典型位置适合放什么
全局层~/.codex/AGENTS.md个人通用偏好、默认工作方式
仓库根层<repo>/AGENTS.md整个项目通用的 build/test/style 规则
子目录层<repo>/packages/api/AGENTS.md仅对某个模块有效的特殊约束

写项目级文件时,最容易犯的错就是把个人偏好、团队约定、子目录细则全堆到仓库根层。结果不是更清晰,而是更难维护。仓库根文件应该解决“这个 repo 里无论做什么都要知道的事”;子目录文件才负责局部例外。

二、根目录 AGENTS.md 应该写什么,不该写什么

如果你把根目录文件当“项目 README 的重复版”,很快就会失控。更稳的判断标准是:只有那些缺了就容易让 Codex做错事的规则,才值得放进去。

比较适合放在根目录的内容通常有这些:

  1. 项目结构概览:核心代码在哪,测试在哪,生成物在哪。
  2. 必跑命令:例如 npm testpnpm lintpython -m pytest
  3. 编辑约束:哪些目录不能改,哪些文件需要生成而不是手写。
  4. 提交与验证规则:是否要求先跑某个校验、是否一文件一提交。
  5. 安全边界:不要碰密钥、不要提交 .env、不要连生产库。

反过来,不适合塞进根目录的内容包括:

  • 团队文化口号或泛泛的工程价值观
  • 很少触发、只对单个子系统有效的细节
  • 能从工具自动推断的事实,比如“这是一个 Node 项目”
  • 每周都在变、且没有版本管理流程的临时通知

一个好用的项目级 AGENTS.md 应该更像操作合同,而不是文档中心。站内已有 Codex CLI 国内配置与使用指南 讲启动与接入,本文关注的是“接入以后怎样让它长期按你的项目方式工作”。

三、什么时候要拆成嵌套 AGENTS,什么时候不要

OpenAI 官方之所以支持从根目录一路走到当前目录加载规则,就是为了让不同子树有自己的约束。比如 monorepo 里,前端和后端的测试命令、生成流程、发布边界可能完全不同;这时候把所有细节都塞进根层,只会让每个任务都先吞下一大坨不相关信息。

实务上可以用下面这张表判断:

场景做法
整个仓库统一用一种测试/格式化流程只放根目录 AGENTS
某个子包有完全不同的 build 命令在子目录再放一份 AGENTS
某个目录禁止手改、必须走代码生成在对应目录局部声明
只是想重复根目录内容不要再拆,避免重复覆盖

嵌套规则的价值在于“补充差异”,不在于“复制总则”。 如果一个 packages/mobile/AGENTS.md 里又把根目录那套提交规则、测试规则、风格规则抄一遍,你等于平白制造了一份未来会漂移的副本。

四、最实用的写法:短、硬、可执行

官方文档和实战案例都在强调一件事:AGENTS.md 要偏紧凑,最好直接告诉 Codex“做什么”和“别做什么”,而不是讲一大段背景故事。因为它的任务不是培训新人,而是让 agent 在执行时少犯低级错

一份项目级文件,通常用这种骨架就够了:

# AGENTS.md

## Project overview
- Web app lives in `apps/web/`
- API server lives in `services/api/`
- Shared libraries live in `packages/*`

## Commands
- Install: `pnpm install`
- Test: `pnpm test`
- Lint: `pnpm lint`
- Build: `pnpm build`

## Editing rules
- Do not edit generated files under `src/generated/`
- Run `pnpm codegen` after schema changes
- Keep commits focused and avoid unrelated refactors

## Safety
- Never modify deployment secrets or `.env` files
- Do not run destructive database commands

这里最关键的不是格式有多漂亮,而是每一条都能转成可执行判断。比如“保持代码优雅”没有操作价值;“改 schema 后必须跑 pnpm codegen”就有明确约束。

五、用 /init 起步,但不要停在脚手架

如果仓库里还没有 AGENTS.md,OpenAI 官方开发者命令页明确建议直接运行 /init 生成初稿。这个命令的价值不在于“它会自动写出完美规则”,而在于它能给你一个足够像样的骨架,省掉从空白文件起手的成本。

但更重要的是第二步:一定要把脚手架改成你仓库自己的语言。常见需要手改的地方包括:

  • 把泛化表述替换成真实命令
  • 删掉对你项目无意义的段落
  • 加上最容易出事故的局部约束
  • 明确哪些验证是提交前强制门禁

很多团队的问题不是“没有 AGENTS”,而是“有一份从没维护过的 AGENTS”。这种文件和没有差别不大,因为 Codex 会照着读,但读到的是过期规则。

六、一个判断标准:它能不能替你省下重复口头提示

要判断项目级 AGENTS.md 写得好不好,可以不用看它有多长,而看一个更实际的问题:如果拿掉这份文件,团队每次开新任务时是否又得重复讲同一批提醒?

如果答案是肯定的,那这些提醒就应该沉淀进去。典型例子包括:

  • “改完必须跑这三个命令”
  • “这里的 SQL 迁移不能手写,要跑生成器”
  • “前端包管理器只能用 pnpm,别混用 npm”
  • “这个目录是镜像同步来的,不要直接编辑”

这类规则一旦进入 AGENTS.md,Codex 才会把它们当作启动时上下文,而不是本轮对话里的偶发补充。对长期维护的仓库来说,这一点比在 prompt 里临时强调更稳定,也比把所有细节埋进 README 更直接。

七、结论:先写最小合同,再按目录分层细化

项目级 AGENTS.md 最容易走向两个极端:要么什么都不写,导致每次任务都重头解释;要么把仓库知识全堆进去,最后没人敢改。更稳的路线其实很简单:先在根目录写一份最小而刚性的执行合同,只覆盖项目通用规则;等到某个子目录确实有明显不同,再拆出局部 AGENTS.md

你可以把它当成“仓库给 Codex 的长期 onboarding”。写得好的文件,应该能减少重复沟通、降低误改概率,并把真正重要的命令和边界放到最前面。至于 README、架构文档、设计记录,仍然继续承担“解释背景”的角色;AGENTS.md 负责的是“告诉 agent 现在该怎么做”。

八、相关阅读

如果你希望把 Codex、Claude Code、Cursor 等多种开发工具接到同一套模型入口里统一管理,YoTradeApi 可以帮你减少不同协议和供应商切换时的接入成本。