什么是 AGENTS.md
AGENTS.md 是 Codex CLI 的"项目记忆"机制。本质上是一个普通的 Markdown 文件,你用自然语言写入希望 Codex 记住的任何信息,Codex 在启动对话时会将其注入到系统上下文中。
它解决的核心问题是:AI 模型本身是无状态的,每次会话都从空白开始。AGENTS.md 提供了一种轻量、版本可控的方式,把项目专属知识持久化给 Codex 使用。
与 config.toml 的区别:.codex/config.toml 是技术配置(选哪个模型、沙箱等级、代理地址),AGENTS.md 是内容配置(项目是什么、怎么做事、禁止做什么)。两者配合使用效果最好。
Codex 如何读取 AGENTS.md
Codex 会按以下顺序查找并加载 AGENTS.md:
- 项目根目录(最常用):
<工作目录>/AGENTS.md - 当前文件所在子目录:如果你在处理
packages/api/src/auth.ts,Codex 还会查找packages/api/AGENTS.md和packages/AGENTS.md - 用户全局:
~/.codex/AGENTS.md(对所有项目生效,适合写个人偏好)
多个 AGENTS.md 会被合并读取,子目录的优先级高于父目录,从而实现 monorepo 的细粒度控制。
/init 命令:一键生成 AGENTS.md 草稿
不知道从哪里开始?在 Codex 交互界面的底部输入框输入 /init,Codex 会自动扫描当前项目目录,分析文件结构、检测技术栈,然后生成一份 AGENTS.md 草稿写入项目根目录。
# 在输入框中输入:
/init
生成后,请务必检查并手动补充——自动生成的草稿通常能识别技术栈和目录结构,但不知道你的代码规范、禁忌事项和业务背景。把这些手动加进去,才能发挥 AGENTS.md 的最大价值。
生成的 AGENTS.md 会自动写入项目根目录。如果文件已存在,Codex 会提示你确认是否覆盖。建议先备份再重新生成。
推荐的 AGENTS.md 结构
以下是一份经过实战验证的结构框架,按"最有价值"的信息优先排列:
# 项目简介(1-3 句话)
这是一个 SaaS 订阅管理平台,后端为 Node.js + Express + PostgreSQL,
前端为 React + TypeScript,使用 Stripe 处理支付。
## 目录结构
- `src/api/`:Express 路由和控制器
- `src/services/`:业务逻辑层,不含路由
- `src/models/`:Sequelize ORM 模型定义
- `src/frontend/`:React SPA 前端代码
- `tests/`:Jest 单元测试
- `generated/`:**自动生成,禁止手动修改**
## 技术栈
- 运行时:Node.js 22 LTS
- 数据库:PostgreSQL 16(本地用 Docker Compose)
- ORM:Sequelize v6
- 测试:Jest + Supertest
- CI:GitHub Actions
## 代码规范
- 使用 ESLint + Prettier(已在 .eslintrc 中配置,提交前会自动运行)
- 函数必须有 JSDoc 注释(如有参数或返回值)
- 所有数据库操作必须在 `src/services/` 层,不要在路由里直接查数据库
- 不使用 `any` 类型(TypeScript 严格模式)
## 常用命令
```bash
npm run dev # 启动开发服务器(端口 3000)
npm test # 运行全部测试
npm run db:migrate # 执行数据库迁移
docker-compose up -d # 启动本地 PostgreSQL
```
## 禁止事项
- 不要修改 `generated/` 目录下的任何文件
- 不要直接提交到 main 分支,请走 PR 流程
- 不要在代码中硬编码 API Key 或密码
- Stripe webhook 处理逻辑在 `src/api/webhooks.ts`,修改前请确认已理解验签逻辑
## 测试说明
- 单元测试:`npm test`,覆盖 services 和 models 层
- 集成测试需要 Docker Compose 环境运行(`npm run test:integration`)
- 新功能须附带单元测试,测试文件放在 `tests/` 对应子目录
实战示例
Node.js + TypeScript 项目
# 项目:用户认证服务
JWT 认证微服务,负责用户注册、登录、Token 刷新。
其他微服务通过 HTTP 调用本服务的 `/auth/verify` 接口验证 Token。
## 技术
Node.js 22 / Express 5 / TypeScript 5.4 / PostgreSQL / Redis(存 refresh token)
## 重要约定
- Token 签名密钥从环境变量 `JWT_SECRET` 读取,绝对不要硬编码
- 所有密码必须用 `bcryptjs` 哈希,轮数为 12
- 数据库连接池配置在 `src/db/pool.ts`,不要新建连接
- 错误响应统一格式:`{ error: string, code: string }`
## 命令
```bash
npm run dev # ts-node-dev 热重启
npm test # Jest
npm run build # tsc 编译到 dist/
```
Python 项目
# 项目:数据处理流水线
处理用户行为日志(CSV/Parquet),生成用户画像特征,输出到 ClickHouse。
每天凌晨 2 点由 Airflow 触发。
## 技术栈
Python 3.12 / Pandas / Polars / ClickHouse-driver / Poetry
## 代码规范
- 使用 Ruff 格式化(`poetry run ruff format .`)
- 类型注解:所有函数参数和返回值必须有类型
- 数据处理优先用 Polars(更快),只有在需要兼容 sklearn 时才用 Pandas
- 不要在 `pipelines/` 目录里放业务逻辑,只放编排代码
## 目录
- `src/processors/`:各类数据处理器
- `src/loaders/`:数据读写(ClickHouse、S3、本地文件)
- `pipelines/`:Airflow DAG 定义
- `tests/`:pytest 测试
- `data/samples/`:本地测试用小样本数据(gitignore)
## 测试
```bash
poetry run pytest # 全部测试
poetry run pytest -x -q # 快速失败模式
```
Monorepo / 多包项目
Monorepo 的最佳实践是:根目录 AGENTS.md 写全局约定,每个 package 目录放独立的 AGENTS.md 写包特有信息。
# 项目:全栈 SaaS 平台 Monorepo
pnpm workspace monorepo,包含 web 前端、api 后端、shared 共享库。
## Packages
- `packages/web/`:Next.js 14 前端
- `packages/api/`:Fastify API 服务
- `packages/shared/`:共享类型定义和工具函数
## 全局约定
- 包间依赖通过 `@myapp/shared` 引入,不要跨包直接引用源文件
- 根目录 `pnpm run build` 会按顺序构建所有包
- 提交信息格式:`feat(api): 添加用户头像上传接口`
## 禁止
- 不要在 packages/web 里引入 Node.js 专有模块
- packages/shared 里只放纯函数和类型,不放任何 I/O 逻辑
# API 服务(Fastify)
REST API,负责认证、用户管理、订单处理。PostgreSQL 数据库。
## 特有约定
- 路由定义在 `src/routes/`,每个资源一个文件
- 数据库操作只在 `src/repositories/` 层
- 所有接口必须有 Zod schema 验证(入参和响应)
- 错误处理用 `src/plugins/error-handler.ts`,不要 try/catch 全局 500
## 命令
```bash
pnpm dev # 启动(热重启)
pnpm test # Vitest
pnpm db:migrate # drizzle-kit push
```
嵌套 AGENTS.md 的工作机制
当 Codex 处理某个文件时,它会从该文件的目录开始向上逐层查找 AGENTS.md,直到项目根目录,将所有找到的内容合并使用。
| 场景 | Codex 会读取 |
|---|---|
处理 packages/api/src/auth.ts |
AGENTS.md(根)+ packages/AGENTS.md(若有)+ packages/api/AGENTS.md(若有) |
处理 src/components/Button.tsx |
AGENTS.md(根)+ src/AGENTS.md(若有) |
全局 codex exec 任务 |
~/.codex/AGENTS.md + AGENTS.md(根) |
所有 AGENTS.md 的内容都会消耗上下文窗口。如果你的 monorepo 层层嵌套了大量 AGENTS.md,可能会占用较多上下文空间,影响对话质量。保持每个文件简洁是关键。
全局 AGENTS.md:个人偏好
你还可以在 ~/.codex/AGENTS.md 写下适用于所有项目的个人偏好,例如:
# 个人偏好
- 代码注释和变量名使用英文
- 解释方案时先给出结论,再展开细节
- 生成代码时不要省略错误处理逻辑
- 如果任务不明确,先提问确认再开始写代码
- 不要自动安装 npm/pip 包,先告诉我你需要安装什么
## 我的技术偏好
- 前端:React + TypeScript(不用 Vue)
- CSS:Tailwind CSS 优先
- 测试:Vitest 优先于 Jest(新项目)
- 包管理:pnpm 优先
写 AGENTS.md 的最佳实践
✅ 写这些
- 项目一句话定位:告诉 Codex 这个项目是干什么的,服务哪些用户
- 关键目录说明:哪些目录不能动,哪些是自动生成的,哪些是核心业务代码
- 禁止事项:绝对不要做的操作(写死密钥、删除特定文件、绕过验证逻辑)
- 常用命令:启动开发服务器、运行测试、执行数据库迁移的具体命令
- 代码约定:Codex 无法从代码本身推断的风格要求(分层架构、命名规范)
- 重要上下文:技术选型的背景("用 Polars 而非 Pandas,原因是性能")
❌ 避免这些
- 冗长的历史背景:Codex 不需要知道这个项目是哪年立项的
- 重复代码本身能表达的内容:如果代码里已经有清晰的注释,不用在 AGENTS.md 里再写一遍
- 超长文件:AGENTS.md 会全部进入上下文。建议控制在 300-500 行以内
- 过于宽泛的指令:"写出高质量代码"这类话没有实际意义,改成具体的可测量要求
- 频繁变化的信息:版本号、API 端点等容易过时的信息放配置文件更合适
经验法则:每次你在对话中需要解释"这是一个……项目"或"不要修改……",就说明这个内容应该进 AGENTS.md,让下次不用再重复。
在 CI/CD 中使用 AGENTS.md
许多人不知道:codex exec(非交互式模式)也会读取项目中的 AGENTS.md。这意味着你在 GitHub Actions 或本地脚本中运行 Codex 自动化任务时,所有 AGENTS.md 中的约定都会生效。
# .github/workflows/codex-changelog.yml
name: Codex 生成 Changelog
on:
push:
branches: [main]
jobs:
changelog:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '22'
- run: npm install -g @openai/codex
- run: |
# codex exec 会自动读取 AGENTS.md,了解项目规范
codex exec "根据最新的 git diff 更新 CHANGELOG.md"
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
因为 AGENTS.md 里写明了"Changelog 条目格式用 Keep a Changelog 规范",Codex 自动生成的内容就符合格式,不需要在 prompt 里重复解释。
想了解更多 CI/CD 集成方式?查看 Codex CLI CI/CD 集成指南,包含 GitHub Actions 和 GitLab CI 的完整 YAML 配置示例。
AGENTS.md 纳入版本控制
强烈建议将 AGENTS.md 提交到 Git 仓库(不要加入 .gitignore)。理由:
- 团队共享:所有人用 Codex 时都获得一致的项目理解
- 历史追踪:可以查看约定是什么时候加入的,为什么加入
- CI/CD 生效:GitHub Actions 等 CI 环境 checkout 代码时会包含 AGENTS.md,让自动化任务也理解项目背景
- 文档价值:一份写得好的 AGENTS.md 本身就是优秀的新人上手文档
常见问题
AGENTS.md 放在哪里?
放在项目根目录(与 package.json 或 pyproject.toml 同级)。Codex 启动时会自动扫描并加载它。也可以在子目录放置嵌套的 AGENTS.md,Codex 在处理该子目录的文件时会同时读取。
AGENTS.md 和 .codex/config.toml 有什么区别?
config.toml 是技术配置(模型、沙箱模式、代理等),AGENTS.md 是项目上下文和行为指南(项目简介、代码规范、禁止操作、常用命令等)。两者互补:config.toml 控制 Codex 怎么跑,AGENTS.md 告诉 Codex 你的项目是什么。
AGENTS.md 越长越好吗?
不是。AGENTS.md 会消耗上下文窗口。建议控制在 400 行以内,优先写 Codex 最需要的信息:项目用途、目录结构、代码规范、禁止修改的文件、常用构建命令。避免堆砌无用的背景介绍。
codex exec 也会读取 AGENTS.md 吗?
是的。codex exec 同样会在启动时读取项目根目录(和相关子目录)中的 AGENTS.md,让非交互式执行也能理解项目背景。这是让自动化任务更准确的关键配置。
能禁用 AGENTS.md 吗?
可以在 .codex/config.toml 中设置 disable_agents_md = true 来禁用加载,但通常不建议这样做。如果某个文件内容让 Codex 困惑,更好的方案是修改文件内容,而不是整体禁用。
团队成员可以各自有不同的 AGENTS.md 吗?
可以,通过两层结合实现:项目的 AGENTS.md(提交到 Git,团队共享)写团队规范;每个人在 ~/.codex/AGENTS.md(全局,不提交到 Git)写个人偏好,例如"解释时先给结论"或"优先用某种框架"。两者会合并生效。