返回博客

AGENTS.md 模板与示例:复制即用(2026)

七套可直接复制的 AGENTS.md 模板,覆盖 TypeScript、Python、Go、monorepo 与终端代理;还讲清了格式规则、嵌套作用域,以及哪些内容不该写进去。

2026年9月22日

你手上的每一个编码代理,都可以指向同一个文件:AGENTS.md。它就是普通 Markdown,没有任何必填字段。按维护这个格式的官方站 agents.md 的说法,它已经被「超过 6 万个开源项目」使用。如果你的代理还是无视你的测试命令、又装了一个重复的 HTTP 库、或者顺手改了你没让它碰的六个文件——要修的多半不是提示词,而是一条它在动手之前会读到的书面指令。

这篇就是一个模板库:一张表讲清格式规则,一张只收录「当天能在官方文档里查到」的支持矩阵,再加七套覆盖真实项目形态的可粘贴模板。

一分钟看完:AGENTS.md 的格式规则

问题答案
它是什么「一种引导编码代理的简单开放格式」——写给机器看的 README
有必填字段吗没有:"AGENTS.md 就是标准 Markdown。想用什么标题都行,代理只是解析你写的文本"
放哪儿仓库根目录;大仓库再往每个包里放嵌套文件
冲突时听谁的"离被编辑文件最近的那个 AGENTS.md 生效;用户在对话里的明确指令覆盖一切"
该写什么项目概览、构建与测试命令、代码风格、测试说明、安全注意事项
谁能读Codex、Claude Code、Copilot CLI、Cursor、Devin Desktop、opencode、Warp 等,见下方矩阵
是否开放免费是;"现由 Linux 基金会旗下的 Agentic AI Foundation 托管"

到底哪些代理会读它

只列当天能拿出书面依据的工具,并且每一行引的是厂商自己的文档,而不是格式官网那张兼容名单。

工具它自己的文档怎么写(2026 年 9 月)
OpenAI Codex"Codex 会在动手之前读取 AGENTS.md。" 先读 ~/.codex 里的全局文件,再从仓库根一路读到当前工作目录
Claude Code更新日志 2.1.277:"项目里没有 CLAUDE.md 时,Claude Code 转而读取 AGENTS.md";开关在 /config
GitHub Copilot CLICLAUDE.mdGEMINI.md 一起被发现;/instructions 能看到实际加载了哪些文件
Cursor四类规则之一:"Cursor 支持项目根目录和子目录里的 AGENTS.md"
Devin Desktop(原 Windsurf)根目录文件"按 always-on 规则处理";子目录文件变成作用于 <directory>/** 的 glob 规则;agents.md 也认
opencode"你可以通过创建 AGENTS.md 文件给 opencode 提供自定义指令。" /init 能生成一份
Warp默认的项目规则文件;同目录下 WARP.md 仍然优先;"文件名必须全大写才会被识别"
Gemini CLI按 agents.md 记录的配置开启:{ "context": { "fileName": "AGENTS.md" } } 写进 .gemini/settings.json
Aider需要显式开:.aider.conf.yml 里写 read: AGENTS.md;Aider 官方文档把这个位置留给 CONVENTIONS.md
OpenClaw同名不同用途:"AGENTS.md——操作指令……每个会话开始时加载";其中 ## Tools 段"并不控制工具可用性,只是提示"

agents.md 上还列了 Factory、goose、Zed、Devin、UiPath、Junie、Amp、RooCode、Kilo Code、Phoenix、Semgrep、Ona、Windsurf、Augment Code、Jules、VS Code 为兼容方,这里不再逐一展开。

文件放哪、谁覆盖谁

根目录是默认答案。大仓库里官方建议写得很直接:"在每个包里再放一个 AGENTS.md。代理会自动读取目录树里离它最近的那份,因此最近的一份优先,每个子项目都能带上量身定制的指令。" agents.md 同时提到,OpenAI 主仓库里有 88 个 AGENTS.md 文件。

一旦开始嵌套,有三条机制必须知道:

  • 是合并还是替换。 Codex 从根目录往下拼接到当前工作目录,所以嵌套文件是追加在根文件之后,靠"出现得更晚"来覆盖。Devin Desktop 则从位置推断激活方式:根目录=始终生效,子目录=按 glob 生效。
  • 体积上限。 拼接后的指令达到 project_doc_max_bytes(官方写"默认 32 KiB")就不再加文件。官方给的解法是调高上限,或者把指令拆到嵌套目录里。
  • 对话永远压过文件。 用户在对话里的明确指令覆盖一切;而只要你列了测试命令,代理"会尝试执行相关的程序化检查,并在收尾前修掉失败项"。

最小骨架

下面七套模板都是它的变体——能稳定起作用的最短版本。

# AGENTS.md

## Project

Next.js 15 app router 后台,Postgres。产品背景看 README.md。

## Commands

- 安装:pnpm install
- 开发:pnpm dev
- 静态检查:pnpm lint
- 测试:pnpm test
- 单个测试:pnpm test -- <path>

## Rules

- TypeScript 严格模式;没有 `// reason:` 注释不许写 `any`
- 优先改现有文件,而不是新建文件
- 绝不提交 .env 或任何像密钥的东西

七套可直接复制的 AGENTS.md 模板

抄之前先读两份真实的:agents.md 直接链了 openai/codexapache/airflowtemporalio/sdk-javaPlutoLang/Pluto 里的线上文件,还给了 path:AGENTS.md 的 GitHub 代码搜索。下面这七套就是这些文件反复收敛出的形态。

1. TypeScript / React 应用

# AGENTS.md

## Stack

Vite + React 19 + TypeScript(严格)+ Tailwind。包管理器只用 pnpm。

## Commands, in order

1. `pnpm install --frozen-lockfile`
2. `pnpm typecheck`
3. `pnpm lint`
4. `pnpm test`
5. `pnpm build`
   第一步失败就停下并汇报,不要继续往下跑。

## Conventions

- 组件:一个文件一个,用具名导出,不要 default export
- 取数逻辑放 `src/hooks/use-*.ts`,不要写在组件体里
- 公共类型放 `src/types/`;同一个 props 类型别在原地重复声明
- 要加新依赖:动手前先在总结里写出名字和体积

## Do not

- 不要顺手重构你没被要求触碰的 class 组件
- 不要加 `use client` 标记——这是 Vite SPA

2. Python 服务或 CLI

# AGENTS.md

## Environment

Python 3.12,用 uv 管理。装依赖用 `uv sync`,不要手敲 `pip install`。

## Commands

- 运行:`uv run python -m app.cli --help`
- 测试:`uv run pytest -q`
- 单个测试:`uv run pytest tests/test_orders.py::test_refund -q`
- 检查:`uv run ruff check . && uv run ruff format --check .`
- 类型:`uv run mypy app/`

## Conventions

- 所有公开函数带类型标注;签名里不许出现 `typing.Any`
- 异常统一从 `app/errors.py` 抛;库代码里不要 `print()`
- 用 `httpx` 而不是 `requests`;边界上用 Pydantic 模型
- 每个 bug 修复都要有回归测试;收尾前先跑一遍 pytest

3. Go 或 Rust 命令行工具

# AGENTS.md

## Go

- 构建:`go build ./...` 测试:`go test ./...`
- 检查:`gofmt -l .` 必须无输出,然后 `golangci-lint run`
- 错误:用 `fmt.Errorf("...: %w", err)` 包;库代码里绝不 panic
- 测试用表驱动:`name`、`input`、`want`,每个用例一个 `t.Run`
- 新增模块依赖前,先说清标准库为什么不够

## Rust equivalents

- `cargo fmt --check`、`cargo clippy -- -D warnings`、`cargo test`
- `src/` 里不要 `.unwrap()`;返回 `Result` 并用 `?`

4. Monorepo 根文件

# AGENTS.md

## Layout

- `packages/ui` —— 纯展示组件,不碰数据
- `packages/core` —— 领域逻辑,不依赖框架
- `apps/web`、`apps/api` —— 只做组装

## Working in this repo

- 一切走 turbo 过滤:`pnpm turbo run test --filter=<pkg>`
- 新加包之后:`pnpm install --filter <pkg>`,workspace 才看得见
- 跨包引用只走某个包的公开入口,不要写很深的内部路径

## Nested instructions

每个包都有自己的 AGENTS.md。读最近那份;本文件只是公共底线。

5. 严格门禁版(测试与 lint 是硬卡点)

# AGENTS.md

## Definition of done —— 四项必须按顺序通过

1. `pnpm typecheck`
2. `pnpm lint --max-warnings 0`
3. `pnpm test -- --coverage`(改动文件覆盖率 80%)
4. `pnpm build`

## Hard rules

- 检查没过就先去修,别继续写新代码。绝不留着红色测试收尾。
- 不要为了让 CI 变绿就削弱断言、删测试或加 skip——
  把冲突报出来,而不是自己悄悄解决。
- 没被要求就不要动 `pnpm-lock.yaml`、迁移文件和生成物。

## 这些情况要问,不要猜

- 需要改表结构、加环境变量或引入新依赖
- 仓库里两条约定互相矛盾

6. 终端代理的全局文件(Codex 等)

全局指令放在工具自己的 home 目录里,这样每个仓库都能继承。Codex 对应的是 ~/.codex/AGENTS.md(同目录下的 AGENTS.override.md 会顶掉它,CODEX_HOME 可以换目录)。

# ~/.codex/AGENTS.md

## Working agreements

- 要改超过两个文件,先用三条要点说方案。
- 用 `rg` 找代码,别用 `ls` 一层层翻。
- 每批改动之后就跑一次仓库的测试命令,不要留到最后。
- 加生产依赖前先问。

## Never

- 不 `git push`、不 `--force`、不改不是你提交的 commit。
- 不提交生成物和任何像密钥的内容。

要验证而不是假设。Codex 官方给的检查看法是:codex --ask-for-approval never "Summarize the current instructions." 它应当按优先级顺序复述出全局与项目两层文件。

7. 分层架构 + 依赖方向约束

价值最高的 AGENTS.md,往往写的是代理光看文件名推不出来的架构约束。

# AGENTS.md

## Architecture

`core/`(基础设施)← `modules/`(业务逻辑)← `routes/`(HTTP)← `components/`(UI)。
引用只允许一个方向。任何模块都不许被别处 import 内部实现。

## Per-module shape

- `modules/<name>/service.ts` —— 纯函数,不 import 框架
- `routes/api/<name>.ts` —— 鉴权、解析入参、调 service、返回统一信封
- 响应统一 `{ code, message, data }`;错误也是同一个结构

## Forbidden

- service 文件之外出现 SQL
- 因为某个 handler"看着是内部的"就跳过鉴权
- 跨模块引用(有一个已记录的例外,先问再说)

什么值得写,什么会让代理变笨

值得写的是代码里看不见的东西:命令顺序、散落三处却从没落纸的约定、绝对不能碰的文件、以及它该停下来提问的边界。凡是能从仓库里自己推出来的,一律不写。

Devin Desktop 的文档把判断标准说得很直白——"具体的例子和明确的约定,比含糊的准则更有效",并且拿 Use TypeScript strict modeWrite good code 做了对照。

上面这些工具都适用的经验:

值得写噪音,删掉
带参数、按执行顺序写清的确切命令"跑一下常规检查"
停止条件;什么时候该问而不是该猜仓库其实并没有遵守的理想化风格
哪些是生成文件、不许编辑README.md 的复制品
忽略就会出事的依赖与目录规则每个嵌套文件里重复抄一遍全局规则——文档说"子文件会继承父目录"
一到两个示范代码片段对着代码逐行解释代码自己已经说明的东西

保持简短。超出某个工具体积上限的指令文件不会大声报错——Codex 会截断,而最先被砍掉的是文件底部那几条。

常见问题

AGENTS.md 有强制格式或 schema 吗? 没有。官方 FAQ 回答「有必填字段吗」时写的是:"没有。AGENTS.md 就是标准 Markdown。想用什么标题都行,代理只是解析你写的文本。"分节是习惯,不是语法。

该写 AGENTS.md 还是 CLAUDE.md? 只要用不止一个代理,就写 AGENTS.md:它是跨工具的名字,而 Claude Code 在没有 CLAUDE.md 时会转去读它(更新日志 2.1.277)。Copilot CLI 会在同一轮发现里同时看 AGENTS.mdCLAUDE.mdGEMINI.md,所以一份公共文件就能覆盖三家。只有 Claude 专有设置才留在 CLAUDE.md

Python、Go 项目能用吗,还是只适合 TypeScript? 能用,格式与语言无关。变的只有命令本身:模板 2 用 uv/ruff/mypy,模板 3 用 gofmt/golangci-lint。把确切调用写出来,因为代理没写在纸面上就会做错的就是这一步。

能当 Codex 的全局配置用吗? 可以。Codex 会先读 ~/.codex/AGENTS.md(或 AGENTS.override.md),再读项目文件,所以可复用的工作约定放全局,仓库特有的留在仓库。project_doc_fallback_filenames 还能把 TEAM_GUIDE.md 这类历史文件名加进发现列表。

AGENTS.md 要提交进 git 吗? 要——这正是别人机器上的代理拿到同一套指令的方式,opencode 文档也是这么建议的。例外是 OpenClaw 那类代理工作区用法:那里的 AGENTS.md 属于私人状态,官方文档建议把该工作区放进私有仓库。

为什么我的代理还是无视这个文件? 文档里能查到的原因有四个:附近有个 AGENTS.override.md(Codex)或同目录有 WARP.md(Warp)抢了优先级;拼接后超过体积上限;文件名大小写不对(Warp 要求全大写,不过 Devin Desktop 两种都认);或者你对话里的指令本身优先级更高。Copilot CLI 的 /instructions 和 Codex 的指令复述探针,都能看到实际加载了什么。

相关阅读

一份范围合适的 AGENTS.md 大概一小时能写完,而且不像提示词那样很快过期。从骨架起步,加上你的代理最容易做错的两条命令,然后就可以收手了。