Appearance
AGENTS.md 实战:让 Codex 自动遵守项目规则
嘿,朋友们!今天聊一个我最近踩了不少坑才搞明白的东西——AGENTS.md。你有没有遇到过这种情况:每次让 Codex 干点活,都得先啰嗦一遍「别动我的工作树」「改完记得跑测试」「这个目录别碰」?说多了自己都烦,更别说有时候忘了提,它就真的给你搞出点意外来。我就因为忘说「别提交代码」,它帮我 git commit 了一堆调试日志,那叫一个酸爽。
后来我发现,这些问题其实都能用 AGENTS.md 一劳永逸地解决。它本质上是一份 Codex 每次进入工作区都会自动加载的执行约定,你把稳定的规则写进去,就不用每次都当复读机了。
什么应该写进去
先说哪些内容适合放进去,这些都是我实践下来觉得长期有用的:
- 项目是干嘛的、仓库边界在哪;
- 哪些目录能碰、哪些不能碰;
- 安装、测试、构建、格式化和预览的具体命令;
- 工作树安全、数据库迁移、凭证处理和发布红线;
- linter/formatter 管不着的代码风格约定;
- 特定子目录才有的局部规则;
- 什么情况下必须先停下来问你。
反过来,这些东西就别往里塞了:
- 只管当前这一次任务的临时要求;
- API Key、账号密码、Cookie 以及任何敏感数据(千万别放!);
- 大段的框架入门教程,那不是它的职责;
- formatter、lint 或者类型系统已经自动搞定的机械规则;
- 版本号和人员名单这种经常变但没人维护的信息。
一句话总结:AGENTS.md 回答的是「在这个仓库里怎么安全干活」,不是「这个技术栈怎么入门」。
Codex 怎样查找指令
搞清楚加载顺序很重要,不然你写了半天发现没生效,心态容易崩。Codex 每次启动时大概这么走:
- 先看用户级的
~/.codex/AGENTS.override.md,没有的话就看~/.codex/AGENTS.md; - 接着从项目根目录一路走到你当前的工作目录;
- 每一层目录都是优先读
AGENTS.override.md,没有才读AGENTS.md; - 越靠近当前目录的规则越晚加载,所以能覆盖上层的设定。
注意一个细节:同一目录下有 override 文件时,那个目录的普通 AGENTS.md 就不会生效了,二选一。还有,默认所有文件合并后上限是 32 KiB,超了的话 Codex 会截断。所以别写太啰嗦,真有长篇背景资料就拆到子目录去,或者放 README 里。
从一个可用的根文件开始
别想一口气写完美,先搞一个能用的版本放在仓库根目录就行。下面这个模板是我在好几个项目里验证过的:
md
# AGENTS.md
## Project
- This repository is a VitePress documentation site.
- Public pages live under `docs/`.
- Do not publish planning notes or credentials.
## Worktree safety
- Treat existing local changes as active work.
- Do not reset, checkout, restore, or delete unrelated changes.
- Before editing, run `git status --short --branch`.
- After editing, inspect the complete diff.
## Validation
- Run `npm run docs:build` after public page or config changes.
- Run `git diff --check` before handoff.
- For new pages, verify navigation, sidebar, links, and sitemap.
## Boundaries
- Do not commit, push, deploy, or publish unless the user explicitly asks.
- Never write real secrets into examples.这个文件通篇都在讲怎么安全协作,没有半句 VitePress 的教程——这就对了。
为子模块增加局部规则
真实项目不可能只有一个根文件搞定所有事。比如说你有一个后端仓库,支付服务需要特殊的测试和校验流程:
text
repo/
├── AGENTS.md
└── services/
└── payments/
└── AGENTS.mdservices/payments/AGENTS.md 可以这么写:
md
# Payments service rules
- Run `make test-payments` for changes in this directory.
- Preserve idempotency keys and existing webhook signatures.
- Do not run migrations against shared databases.
- Any change to amount, currency, refund, or reconciliation logic requires a regression test.重点来了:从 services/payments/ 目录启动任务时,Codex 会把根规则和局部规则一起加载,后面加载的局部规则会覆盖前面冲突的部分。我的踩坑经验是,局部文件一定要写清楚是在「补充」根规则还是「替代」某一条,不然 Codex 面对模糊措辞容易做出奇怪的选择。
什么时候使用 override
AGENTS.override.md 这个机制挺有用的,但也容易给自己挖坑。它适合临时或者明确要替代同层规则的情况,比如数据库迁移窗口期间你需要暂停某些自动检查。
但问题也在这——它是 override,不是 merge,同目录的普通 AGENTS.md 就直接被无视了。我自己就干过一件事:临时写了个 override 禁止自动跑测试,结果过了一周完全忘了这回事,还纳闷为什么测试一直没执行。
所以几个建议:
- 文件里写清楚它是干嘛的、什么时候该删掉;
- 要进版本控制的 override 必须团队 review 过;
- 用户级的临时 override(
~/.codex/AGENTS.override.md)用完立刻删; - 千万别同时维护两份内容互相打架的完整规则。
全局指令只放个人稳定偏好
~/.codex/AGENTS.md 这个文件是跨项目的,适合放一些你个人的稳定习惯:
- 默认用什么语言交流;
- 默认先做只读调查再看要不要改东西;
- 工作树安全的个人偏好;
- 你喜欢的验证报告格式。
反过来,别在全局文件里强行规定所有项目都用 npm、所有仓库跑同一套测试——这些应该交给每个项目的 AGENTS.md 来定。全局管个人习惯,项目管具体事实,各司其职。
验证 Codex 是否真的读到
写完规则别光靠信仰,验证一下它到底有没有生效。我一般这样测:
新开一个只读会话:
bash
codex --sandbox read-only --ask-for-approval never "列出本次加载的项目指令来源,并按优先级总结会影响当前目录的规则。不要修改文件。"再到子目录里试试:
bash
codex -C services/payments --sandbox read-only --ask-for-approval never "列出当前生效的测试和安全规则。不要修改文件。"看它的输出能不能同时识别根规则和局部规则,override 有没有按你预期的方式替换掉对应的文件。这个验证花不了两分钟,但能省掉后面无数莫名其妙的问题。
让规则可执行而不是口号化
这个坑我踩得尤其深刻。刚开始我写的规则是这样的:
text
写高质量代码,确保安全和性能。看着挺对,实际上啥用没有——Codex 根本没法执行。后来我改成这样:
text
- 修改鉴权逻辑时同时测试允许和拒绝路径。
- 新增数据库查询时检查租户过滤和索引使用。
- 公共 API 行为变化必须更新契约测试和迁移说明。一条好规则的特征:你能指着它说出一个具体的动作、一个检查手段、或者一个停下来的条件。模糊的口号留给 PPT,AGENTS.md 里就放能落地的东西。
常见失败
聊几个我见过(也犯过)的高频翻车场景:
文件太长
忍不住把架构背景、技术选型理由全塞进去了。结果就是超过 32 KiB 上限被 Codex 截断,真正重要的规则反而没加载到。把背景介绍放 README 或者正式文档里,AGENTS.md 专注影响执行的那部分。
命令已经过期
项目迁移了构建工具,但 AGENTS.md 里的验证命令还指着旧的脚本跑。规则变更要跟脚本、CI 一起审查,不然一条错误的验证命令比没有命令更危险——它会给你虚假的安全感。
上下层冲突
根文件说「所有模块跑 npm test」,支付模块说「跑 make test-payments」,措辞又不明确是在补充还是替代。Codex 面对这种模糊情况只能猜,猜错就是事故。写清楚局部规则是追加还是覆盖,必要时直接用 override。
把安全规则只写在提示词
每次任务开头在提示词里写「别提交代码」「别碰生产配置」,结果某次忘了写就出事了。长期的安全边界应该进 AGENTS.md、项目 Rules、Hooks 或者 CI,提示词只管当前这一次任务的额外约束。
完成门槛
- [ ] 根文件说明了项目边界、验证和工作树安全。
- [ ] 子模块规则只放局部差异。
- [ ] 没有任何真实凭证和私有数据。
- [ ] 已在根目录和至少一个子目录验证加载结果。
- [ ] 规则能映射到实际命令或决策。
下一步
继续学习 Codex config.toml 配置实战,把权限、搜索、MCP 和运行偏好放到正确的配置层。