AI 博客

AGENTS.md、CLAUDE.md、Cursor rules 与 Agent Skills 对比

所有人都在争哪个文件名会赢,而文件名几乎什么也决定不了。真正把这四者分开的,是那段文字在什么时候进入上下文窗口——始终、路径匹配时、模型主动要的时候,还是只有人显式调用时——以及谁被允许把它放进去。

作者 智能体 AI 维基 23 分钟读完

关于「常驻指令」的争论已经围着文件名转了一年,而文件名是桌面上最无关紧要的那样东西。真正把 AGENTS.md、CLAUDE.md、Cursor 的 .mdc rules 与 Agent Skills 分开的,是它们的文字在什么时候进入上下文窗口——每一轮都进、路径匹配时才进、模型自己判断需要时才进,还是只有人打出它的名字才进——以及首先是谁被允许把文字放进那里。照这个方式归类,两件事会发生:可移植性之争塌缩成一个符号链接,而你一直没在做的那个决定浮出水面,那就是你的指引里有多少本该待在「始终加载」这一档之外。

一眼看全

四种格式,各问一个问题:谁会读它,以及什么会让它加载?

格式谁会读何时加载它住在哪个作用域
AGENTS.md 约 30 个 harness;由 Agentic AI Foundation 治理 始终,每一轮 仓库,可按目录嵌套
CLAUDE.md Claude Code 始终,每一轮 仓库、用户与企业三层
.cursor/rules/*.mdc Cursor 可声明:始终、按 glob、模型主动要,或手动 仓库与用户
SKILL.md 包 Claude Code、Cursor、Codex、Gemini CLI、Antigravity 名称与描述始终在;正文按需 仓库、用户、市场
Agent harnesses that read each format natively Horizontal bar chart. AGENTS.md is read by roughly thirty coding agents, SKILL.md by around five harnesses, while CLAUDE.md and Cursor's .mdc rules are each read by one vendor's own tooling, with a fallback path from Claude Code to AGENTS.md. Harnesses reading the format natively (approximate) 10 20 30 AGENTS.md ~30 SKILL.md (skills) ~5 CLAUDE.md 1 .cursor/rules/*.mdc 1 Counts are of agent harnesses, not repositories. AGENTS.md is used in 60,000+ repositories and is governed by the Agentic AI Foundation at the Linux Foundation.
截至 2026 年 9 月下旬的可移植性。这是赢家最清楚、后果也最小的那根轴。

为什么「何时加载」就是全部的决定

Four moments standing instructions can enter the context window Four rungs feeding one context window: always-on text loaded every turn, path-matched text loaded when a file is touched, model-requested text loaded when a description matches the task, and human-invoked text loaded only on explicit mention. Each rung is annotated with what it costs and what can fail. The context window this turn Always — every turn, no condition AGENTS.md · CLAUDE.md · alwaysApply: true Cost: paid on every request Fails by: crowding out the task Path-matched — when a file is touched globs: ["**/*.tsx"] Cost: only in matching sessions Fails by: the glob never matching Model-requested — on description match SKILL.md front-matter · Agent Requested Cost: the description, always Fails by: never being retrieved Human-invoked — only when asked for @rule-name · /command Cost: nothing until used Fails by: nobody remembering it The format argument is about rung one. The engineering decision is how much guidance you move down to rungs two and three. Every rung below the first trades a context cost for a retrieval risk, and only one vendor lets you declare which rung a file sits on.
一条常驻指令可以到达的四个时刻。每往下一档,都是用一份上下文代价换一份检索风险。

始终加载的文字是一笔带复利的税

一个始终被加载的指令文件,会在项目的整个生命周期里被前置到每一个请求上。一份 3,000 token 的代码风格文档,就是模型在读你的问题之前先读的 3,000 token,在一次四十轮的会话里每一轮都读一遍,而代价不只是账单。长上下文的退化是有选择性的:处在一大段前言中部的指令,被遵循的可靠性不如同样的指令处在一段短前言里——于是把一切都写下来的团队,得到的服从率反而不如只写了五件事的团队。这就是值得内化的那个反直觉结论:过了某个长度之后,再加一条规则会降低对已有规则的遵循。机理在有效上下文与标称上下文里。

按需加载的文字把「服从」变成了一个检索问题

把同一份文档挪到一个「模型拿去做匹配的描述」后面,代价就降到了一句话——但你刚刚获得了一种不产生任何报错的新失效模式。一个从不被触发的技能,看起来和一个毫无效果的技能完全一样;而它唯一始终在上下文里的部分是那段描述,这意味着描述就是全部的接口,也是你唯一能调试的东西。团队常常写出一份出色的 400 行技能正文,配一句含糊的一行描述,然后得出「技能不管用」的结论。

值得抓住的那份不对称:一条始终加载的规则吵吵闹闹地失败——你会看见智能体在遵循一条过时的指令——而一条按需加载的规则安静地失败,方式是干脆没到场。所以正确的迁移次序是:先把最大、最不普适的那些文档往下挪一档,而把那些短小、真正普适的约束原封不动留在原处。

AGENTS.md——可移植的那一个,也是已经尘埃落定的那一个

它是什么

仓库根目录下一个没有 schema 的纯 Markdown 文件:构建命令、测试命令、约定,以及一个新贡献者会问的那些事。它被 Codex、Cursor、Copilot、Gemini CLI、Aider、Windsurf、Zed、Jules 以及约二十个其他工具原生读取,出现在六万多个仓库里,而它的治理已连同 MCP 与 goose 一起移交给 Linux Foundation 之下的 Agentic AI Foundation。嵌套的行为符合开发者的预期:子目录里的一份文件适用于其下的工作。

它不是什么

它不是一套激活机制。没有 front-matter、没有条件加载、除目录树之外没有作用域划分——这恰恰是它能如此轻易地移植到三十个工具的原因,也恰恰是它无法表达「只在动到 migrations 时」的原因。一个文件、始终加载、每个目录一份。它的胜利是真实的,它的天花板是低的,而两者都来自同一个设计选择。

它适合谁

每一个仓库,作为那个短小的普适层。如果你的 AGENTS.md 超过一页,那你几乎肯定往里放了本该往下挪一档的东西。

CLAUDE.md——同一档,而自九月起多了一条兜底

它是什么

Claude Code 自己的指令文件,带着一套 AGENTS.md 没有的分层模型:企业托管、用户级与项目级文件会合并,于是一个组织可以下推仓库无法覆盖的指引。真正实质性的差别是那套分层,而不是那个名字。

那次收敛

Claude Code 2.1.277 加入了对 AGENTS.md 的原生支持,以一个内置 mod 的形式交付;到 2026 年 9 月 19 日的 2.1.278,行为已经定下来了:如果没有 CLAUDE.md,Claude Code 就去读 AGENTS.md。两者同时存在时,CLAUDE.md 默认优先,而配置可以让两者都加载。这就是这场争论现已结束的那部分——那个长期挂着的「双读」请求落地了,而这两个文件剩下的差别是分层与优先级次序,不是可移植性。

它适合谁

当你需要企业层或用户层,或者需要写会让别的工具犯糊涂的 Claude 专属指引时,留着 CLAUDE.md。否则就写 AGENTS.md,让兜底去干活——这比人们一直在维护的符号链接和双文件同步脚本都要好。

Cursor rules——唯一一处「何时加载」可被声明的地方

它是什么

.cursor/rules/*.mdc 文件,带三个 front-matter 字段——description、globs、alwaysApply——它们组合出四种激活模式:给普适约束用的 Always Apply、在 glob 匹配上当前涉及的文件时的 Auto Attached、由模型读描述自行决定的 Agent Requested,以及只在 @rule-name 被提及时才加载的 Manual。老的单文件 .cursorrules 在功能上已被这个目录取代。

为什么这件事比「绑在一家厂商上」更要紧

没有别的格式让你说出一个文件坐在哪一档。这让 Cursor rules 成了这个问题上现成最好的思考工具——即便你一条都不打算交付:把你自己那份始终加载的文件过一遍,对每一段问一句,它该属于那四种模式里的哪一种。实践中,多数仓库会落在「一页普适约束、三四个按 glob 限定的约定文件、一两份手动引用」上——而发现这件事本身就是价值,因为同一种划分用技能与目录嵌套在别处也实现得出来。

它适合谁

以 Cursor 为主的团队,以及任何想审一审自己那份指令文件究竟在要求什么的人。代价是这些东西一点都不能移植:它们只被一个工具读,所以一个混用工具的团队是在 AGENTS.md 之外额外维护它们,而不是用它们取代 AGENTS.md。

Agent Skills——按需那一档,以及一种不同性质的制品

它是什么

一个文件夹,含 SKILL.md 以及可选的脚本、模板与参考文件,以渐进式披露加载:harness 把名称与描述留在上下文里,只在任务匹配时才把正文拉进来。这个格式由 Anthropic 在 2025 年 10 月引入,如今被 Claude Code、Cursor——它在 2.4 版加入 Agent Skills,读取 .cursor/skills/,并为兼容性读取 .claude/skills/ 与 .codex/skills/——以及 Codex、Gemini CLI 与 Antigravity 读取。它是继 AGENTS.md 本身之后,第二个真正立住的跨厂商约定。

技能是动词,其余的是形容词

让这场比较保持诚实的那个区分:AGENTS.md 与 rules 描述你的项目是什么,而一个技能描述智能体能做什么——而且可以挂上可执行脚本与参考材料,这是任何指令文件都没有的。这也让技能成了一件供应链制品而不是一份文档:它能携带代码、它从市场里来,而且无论它是不是 Markdown,它都是代码,依智能体技能。

它适合谁

任何长过一段、却只适用于少数会话的流程:发布手册、一份迁移配方、你部署流程的那八个步骤。请把描述当成一个检索键来写,而不是当成一个标题——「在本仓库里编写或修改数据库 migration 时使用」远胜过「Migrations 指南」,而那一句话是你唯一能调试的部分。

真正把它们分开的那几根轴

Three axes that separate the four formats Sort by these, not by file name When it loads Who can put it there What a mistake costs Decides: context budget and whether the rule is ever seen Decides: whether a fork can steer your agent Decides: how hard the failure is to notice at all Winner: Cursor rules — the only declarable one Winner: user-scope files; repo files are untrusted Winner: always-on — loud, cheap to debug Check it: count the tokens loaded before your first word Check it: open a fork's PR and read its instruction files Check it: log which files loaded, per session Portability is a symlink problem. Activation is an architecture problem.
这三根轴里有两根,跟你选了哪个文件名毫无关系。

第二根轴是没人放进对比表、却会被安全评审第一个问到的那一根。这一页上每一种仓库作用域的格式,在你检出别人分支的那一刻都是受攻击者控制的:一个 fork 的 AGENTS.md、一个 PR 分支的 .mdc rules、一个被内嵌进来的技能包。这些文件是在你的第一条消息之前被加载的,而它们在功能上就是一份由「提出这个 pull request 的人」提供的系统提示词。评审一段动到指令文件的 diff,值得你给一次 CI 修改的那份注意力;而在一个不可信分支上跑智能体,值得你给「运行它的代码」的那份注意力——这与上下文污点追踪里描述的档位混淆是同一回事。

第三根轴解释了为什么那些「试过技能又回到一个大文件」的团队,通常是出于错的理由做了对的决定。始终加载的指引容易调试,因为你在每一份对话记录里都看得见它;按需加载的指引要求你先按会话记录下「哪些文件被加载了」,才谈得上对它做推理。如果你的 harness 不告诉你这件事,诚实的选择就是留在始终加载那一档,直到它告诉你为止。

什么时候选哪个

你想要……用因为
把构建、测试与约定的基本事项说一次,给所有工具用AGENTS.md三十个 harness 会读它,包括经由兜底的 Claude Code
下推你的仓库无法覆盖的指引CLAUDE.md 的企业层它是这里唯一带托管层级的格式
只对某些文件类型施加约定带 globs 的 Cursor rule路径匹配让它不进到无关的会话里
交付一份只在少数任务里用到的长流程技能包渐进式披露把正文挡在基础开销之外
给一个流程挂上脚本或模板技能包没有哪个指令文件能携带可执行文件
不让你的智能体去遵循一个 fork 里的指令用户作用域文件加评审仓库作用域的文件是不可信输入

常见问题

Claude Code 现在会读 AGENTS.md 吗?

会,但有一个条件:自 Claude Code 2.1.277 起、并在 2026 年 9 月 19 日的 2.1.278 定下来,它在没有 CLAUDE.md 时会读 AGENTS.md。两者同时存在时 CLAUDE.md 默认优先,而配置可以让两者都加载——所以对常见情形来说,那些符号链接的绕法已经不必要了。

我该删掉 CLAUDE.md、只留 AGENTS.md 吗?

在一个没有托管策略的单仓库项目里,该——一个被所有东西读的文件,胜过两个需要保持同步的文件。如果你依赖企业层或用户层,或者你有会误导其他工具的 Claude 专属指令,那就留着 CLAUDE.md。

一份始终加载的指令文件该多长?

短到你能凭记忆把里头的东西一一说出来。一页以内是个好目标;实用的信号是:当你加了一条规则、而对已有规则的遵循度下降时,你已经越过了有用的长度,而下一条要加的东西该进技能或按 glob 限定的 rule。

技能是要取代 rules 和指令文件吗?

不是——它们占的是不同的档位。你仍然需要始终加载的文字来承载适用于每一个任务的约束,因为一条必须永远成立的规则,不能依赖于「它被检索到了」。技能取代的是一份大指令文件里那些只在某些时候才要紧的部分。

这些文件的安全暴露面是什么?

它们是在你的第一条消息之前被加载的,所以在一个不可信分支上,它们的作用等同于一份由攻击者提供的系统提示词;而一个技能包还能额外携带可执行脚本。请把指令文件的 diff 当代码评审来对待,并把「在一个刚克隆的不可信仓库里启动智能体」当作「运行那个仓库」来对待。

延伸阅读

本站相关:

项目文档: