Claude Code 2.1.277 宣布支持 AGENTS.md。在一个没有 CLAUDE.md 的项目中,它本应转而读取 AGENTS.md。我在 shell 中关闭了遥测,而在我的仓库里,这个文件从未被加载。Issue #95690 解释了原因,我也在其中补充了自己的测量结果。这篇文章将这些内容汇总在一处。
该加载器以一个名为 agents-md 的内置插件形式发布。它在 2.1.280 bundle 中的注册代码如下:
var W = !1; var B = () => Oa("tengu_agents_md_mod", W); var H = "AGENTS.md as project instructions: by default loaded where the project has no CLAUDE.md; ...";
W 是该插件的 isOnByDefault 值,它为 false。B 是 isAvailable,它会查询一个名为 tengu_agents_md_mod 的远程特性开关,默认回退值为 false。当 Claude Code 无法获取该开关时,插件不可用,本地文件也就永远不会被读取。从工作目录读取一个 markdown 文件完全不需要网络,但在这里它却要等待服务端的开关。
我创建了一个空目录,其中只放一个带有金丝雀词(canary word)的 AGENTS.md,然后用 claude -p 询问这个词。每种配置运行两个会话,因为新配置下的第一个会话只是获取开关,第二个会话才使用它。
echo 'The canary word is PERIWINKLE.' > AGENTS.md claude -p 'What is the canary word from the project instructions? Answer NONE if you have none. Do not read files.'
我的测量结果
- 如该 issue 所说,CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 会阻断该功能。
- DISABLE_TELEMETRY=1 同样会阻断它。只要设置了这两个变量中的任何一个,AGENTS.md 都不会加载,所以我必须把两个都清掉。
- 将任一变量设为 0 也无济于事,阻断仍然生效。环境变量文档中说任何值都算启用,但当你想开启某个功能时,这一点很容易被忽略。
- 在项目的 .claude/settings.json 中用 env 块清除这两个变量没有任何效果。没有办法为单个仓库开启该功能。
- 会话级覆盖从第二个会话开始生效:
claude --settings '{"env":{"DISABLE_TELEMETRY":"","CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC":""}}'
以上所有情形都不会打印任何警告。会话正常启动,模型在没有项目指令的情况下作答,没有任何提示告诉你某个文件被跳过了。该 issue 还指出,第三方网关、Bedrock 和 Vertex 存在同样的问题,因为在那里该开关也无法解析为 true。
CLAUDE.md 支持 @path 导入,而这些导入不依赖该开关。在 AGENTS.md 旁边放一个只有一行的 CLAUDE.md,就可以在遥测关闭的情况下加载它:
echo '@AGENTS.md' > CLAUDE.md
有了这个文件,即使在 CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 仍然生效的情况下,同样的金丝雀测试也能返回正确答案。代价是每个仓库多出一个文件,而这正是 AGENTS.md 支持本应消除的东西。
我是有意关闭遥测的,我预期这个选择只会让我损失一些诊断数据,仅此而已。而在这里,它却让我默默失去了一个读取我自己磁盘上文件的功能。对于一个需要与服务器通信的功能,远程开关或许合理,但这个功能唯一需要的输入已经在工作目录里了。
这一门槛还恰恰影响到了最可能在意 AGENTS.md 的人群。为多个 agent 维护同一份指令文件的人,通常会很谨慎地控制每个工具向外发送的内容;而使用 Bedrock、Vertex 或网关的团队,往往按政策禁用非必要流量。他们全都面对一个被宣布为可用、随后却毫无作用的功能。