MemoryLake
返回全部文章
Tutorial2026 年 8 月 21 日·10 分钟阅读

如何在不丢失上下文的情况下将 CLAUDE.md 迁移到 AGENTS.md (2026)

如果你的仓库中有一个 CLAUDE.md、一个 .cursorrules,可能还有一个 .windsurfrules,你肯定已经知道问题所在了:这三个文件说的内容大致相同,却以三种不同的速度各自演变、逐渐偏离。

AGENTS.md 是整个生态系统达成共识的统一目标。它对自己的描述刻意保持低调——“一个用于引导编码 agent 的简单、开放格式,已被超过 60k 个开源项目使用”——其核心卖点是它是“agent 的 README:一个专门的、可预测的提供上下文和指令的地方”。支持的 agent 列表很长:Codex、Cursor、Zed、Devin、Windsurf、GitHub Copilot 的编码 agent、Jules、Aider、goose、opencode、Warp、Amp、Gemini CLI、Junie 等等。

Claude Code 是一个有趣的例外,也是这次迁移需要周密计划而不是直接运行 git mv 的原因。它的官方文档写得很清楚:“Claude Code 读取 CLAUDE.md,而不是 AGENTS.md。”

好消息是 Anthropic 的文档中提供了桥接方法,因此你可以统一到这一标准,同时保持 Claude Code 正常工作。本文将详细介绍具体可以迁移哪些内容、文档中记录的两种连接方式、CLAUDE.md 中三个没有 AGENTS.md 对应项的特性,以及应该将这两个文件都无法承载的知识存放在哪里。

实际可以迁移的内容

纯文本指令内容可以完全迁移。 设置命令、代码风格、测试指令、PR 规范、架构约束——这些是大多数 CLAUDE.md 文件的大部分内容,而 AGENTS.md 也是一样:一个不需要任何特定前置元数据(frontmatter)的 Markdown 指令文件。

全局启用的作用域可以迁移,但每个工具都有其注意事项。 根目录下的 AGENTS.md 会被读取它的工具视为全局启用。Codex “在开始任何工作之前都会读取 AGENTS.md 文件”。Zed “支持将 AGENTS.md 作为个人和项目级 agent 引导的主要指令文件”。Cursor 将 AGENTS.md 列为支持嵌套子目录的“.cursor/rules 的简单替代方案”。Devin “将根据你代码库中的特定文件(包括……CLAUDE.mdAGENTS.md)自动拉取并更新知识(Knowledge)”。

目录级作用域可以迁移,但其运行机制有所不同。 两种格式都支持按目录配置的文件。Claude Code 会从你的工作目录向上遍历目录树,并将找到的文件拼接起来,顺序为“从文件系统根目录向下到你的工作目录”。Codex 也以相同的方向构建其链条——“Codex 从根目录向下拼接文件,用空行连接。更接近当前目录的文件会覆盖先前的引导,因为它们在合并后的提示词中出现得更晚。”Cursor 的嵌套 AGENTS.md 文件会“与父目录合并,更具体的指令具有更高的优先级”。

相同的形式,三种不同的加载器。嵌套指令是可行的,但不要假设它们的优先级语义完全相同。

一个文件,四种不同的加载器

在合并之前值得了解的是:在每个工具中,“读取 AGENTS.md”的含义略有不同,这些差异决定了你该如何组织该文件。

Codex 每次运行都会构建一次指令链。它从 Codex 主目录中的全局文件开始,然后从项目根目录向下遍历到你的工作目录,每个目录最多获取一个文件,并自上而下进行拼接。它还对整个链条设置了上限——“一旦合并后的大小达到 project_doc_max_bytes 定义的限制(默认 32 KiB),就会停止添加文件”。

Cursor 将根目录下的 AGENTS.md 视为 .cursor/rules 的免配置替代方案,嵌套文件会“与父目录合并,更具体的指令具有更高的优先级”。

Zed 将其作为个人和项目范围的主要指令文件——个人配置位于 ~/.config/zed/AGENTS.md,项目文件则在“冲突时覆盖个人 AGENTS.md”。它的项目加载器会从列表中获取第一个匹配的文件,这就是为什么过期的规则文件会产生影响的原因。

Devin 根本不把它作为指令加载;它“将根据你代码库中的特定文件(包括……CLAUDE.mdAGENTS.md)自动拉取并更新知识(Knowledge)”。这些知识是否能进入会话取决于固定(pinning)和触发器描述。

这四个工具的实际结论是一致的:保持根文件简短,并将具体细节推到目录级文件中。这样可以同时满足 Codex 的上限、Cursor 的优先级以及 Zed 的覆盖行为。

在连接这些文件时,有一个小小的安慰:@AGENTS.md 导入不会触发 Claude Code 的外部导入审批对话框。该对话框只有在导入“解析到工作目录之外”时才会出现——而仓库根目录下的 AGENTS.md 就在工作目录内部,因此导入加载时不会弹出提示。

无法迁移的内容——有三点,这也是你保留 CLAUDE.md 而不是直接删除它的原因:

@path 导入。Claude Code 的导入语法在 AGENTS.md 中没有对应项。

CLAUDE.local.md。在每个目录中附加在 CLAUDE.md 之后的、未提交的个人笔记。没有对应项。

任何 Claude Code 自己写入的内容。根据定义,自动生成的记忆是 Claude 特有的。

手动迁移步骤

文档中记录了两种路径。根据你是否需要 Claude 特有的内容来进行选择。

步骤 1:将共享内容移入 AGENTS.md

在仓库根目录下创建 AGENTS.md,并将所有与工具无关的内容移入其中——包括设置、测试、风格、规范。然后阅读 CLAUDE.md 中剩余的内容并进行分类:真正属于 Claude 特有的指令保留,其他内容全部移除。

在此过程中,对于那些已经不再适用的部分,请直接删除而不是迁移。合并文件是删除描述已停用服务的段落的最佳时机。

如果你的仓库中还有 .cursorrules.windsurfrules.clinerules,现在也把它们合并进来。有几个工具会原生读取 AGENTS.md,而 Zed 的项目指令加载器会从一个列表中获取第一个匹配的文件,该列表包括 .rules.cursorrules.windsurfrules.clinerules.github/copilot-instructions.mdAGENT.mdAGENTS.mdCLAUDE.mdGEMINI.md——因此,留下一个过期的 .cursorrules 可能会完全遮蔽你新创建的 AGENTS.md

步骤 2:将 Claude Code 连接到同一个文件

Anthropic 的文档记录了两种方法。导入版本,允许你保留 Claude 特有的补充内容:

@AGENTS.md

## Claude Code

对 `src/billing/` 下的更改使用 plan 模式。

根据文档,“Claude 会在会话开始时加载导入的文件,然后追加其余内容”。或者使用软链接(symlink),“如果你不需要添加 Claude 特有的内容”:

ln -s AGENTS.md CLAUDE.md

直接来自官方文档的两点验证说明:“该命令在成功时不输出任何内容。在你的下一个会话中,运行 /context 并确认 CLAUDE.md 出现在 Memory files(记忆文件)下。”而在 Windows 上,“创建软链接需要管理员权限或开发人员模式,因此请改用 @AGENTS.md 导入方式。”

如果你不想手动分类,有一个值得了解的捷径:/init “读取 .cursor/rules/.cursorrules 中的 Cursor 规则,以及 .github/copilot-instructions.md 中的 Copilot 规则,并将相关部分合并到生成的 CLAUDE.md 中。在设置 CLAUDE_CODE_NEW_INIT=1 的情况下,/init 还会读取 AGENTS.md.devin/rules/.windsurf/rules/.windsurfrules 以及 .clinerules。”注意方向——这是从你的其他文件生成 CLAUDE.md,这与你在这里想要的操作相反,但这是在分类之前,在一个地方查看你积累的所有内容的最快方法。

然后检查你的大小预算。Codex “一旦合并后的大小达到 project_doc_max_bytes 定义的限制(默认 32 KiB),就会停止添加文件”,并建议在达到限制时提高限制或拆分到嵌套目录中。Claude Code 的指导原则是,文件越长消耗的上下文越多,且会降低指令遵循度。合并为一个文件是目标,但合并为一个巨大的文件则不是。

更好的方法:保持文件简短并使知识可检索

合并可以让你用一个文件代替三个文件。但这并不会改变文件本身擅长的事情——指令文件擅长的是引导方向,而不是承载你项目的推理过程。

上述每个加载器都会在每次运行时将全局启用的内容拼接进上下文中。这正是大小限制存在的原因。因此,你最希望 agent 了解的部分——为什么架构是这样的、你已经尝试并放弃了哪些方法、使某个奇怪决定变得正确的约束条件——恰恰是不属于随每次请求一起发送的文件中的内容。

这就是 MemoryLake 的用武之地:将你持久的项目知识保存在一个工具可以读取的层中,从而使 AGENTS.md 保持简短,同时使推理过程随时可用。设置只需三个步骤。

步骤 1:创建 API 密钥

登录 MemoryLake 并创建一个 API 密钥。一个凭证即可连接你使用的所有工具。

在将 CLAUDE.md 合并到 AGENTS.md 的同时创建 MemoryLake API 密钥
在将 CLAUDE.md 合并到 AGENTS.md 的同时创建 MemoryLake API 密钥

步骤 2:上传你的第一批记忆

在整理 CLAUDE.md 时,你会发现第三堆既不属于这两个文件的内容。将这些内容写成简短的条目,每条记录一个断言:

将决策和被否决的方法写成简短的 MemoryLake 条目
将决策和被否决的方法写成简短的 MemoryLake 条目

带有产生这些决策的约束条件的决策。 “写入操作通过 outbox 表进行,因为支付服务商在没有幂等键的情况下会进行重试。”规则只说明了前半部分;只有这个版本才能阻止 agent 再次提出替代方案。

已被排除的方法。 这是价值最高的一类,也是代码库中任何地方都不存在的内容。

跨仓库知识。 适用于你拥有的每个项目的领域词汇和标准。AGENTS.md 在设计上是针对单个仓库的;而这并非如此。

你进行过不止一次的纠正。 如果你已经说过两次,说明这是一个缺失的条目——而且原因应该写在它旁边。

步骤 3:连接你的 AI 和 agent

连接你使用的工具。MemoryLake 可以通过 MCP 和 API 访问,因此支持原生 MCP 的 agent(包括 Claude Code、Codex 和 OpenClaw)可以通过指向 MCP 服务器进行连接,而其他助手则通过 API 读取相同的记忆。

将 Claude Code、Codex 和 Cursor 连接到同一个共享记忆层
将 Claude Code、Codex 和 Cursor 连接到同一个共享记忆层

三个客观的局限性。MemoryLake 并不是 AGENTS.md 的替代品——你仍然需要该文件,上述合并工作本身就非常有价值。它只保存你或你的 agent 写入其中的内容,因此步骤 2 是手动的。此外,指令文件是上下文,而不是强制性的配置;记忆层并不能改变这一点。

这在实践中带来了什么改变

一个文件,且保持准确。 三个逐渐偏离的副本合而为一,原生读取 AGENTS.md 的工具无需针对每个工具进行单独配置即可直接使用。

Claude Code 保持正常工作。 @AGENTS.md 导入是官方文档中记录的、只有一行且可逆。你无需在标准和现有设置之间做出妥协。

大小限制不再是问题。 对于引导方向来说,32 KiB 非常宽裕,但对于知识库来说则远远不够。将这两项工作分开,可以让你保持在限制之内。

过期的规则文件不会遮蔽你的新文件。 一旦你了解了 Zed 会从其列表中获取第一个匹配的文件,删除 .cursorrules 就成了迁移工作的一部分,而不是三周后让你百思不得其解的谜团。

接入新工具零成本。 列表中的大多数工具已经可以读取 AGENTS.md,而任何不读取它的工具都可以通过 MCP 读取记忆层——这种形式在在 Cursor 和 Claude Code 之间共享同一个记忆中有所介绍。

合并指令文件的最佳实践

将共享内容放在 AGENTS.md 中,将 Claude 特有的内容放在导入行下方。 这是官方文档推荐的模式,它能保持 diff 的可读性。

合并后删除 .cursorrules.windsurfrules 否则,采用“首次匹配”的加载器可能会选中过期的文件。

如果你有 Claude 特有的指令,请使用导入方式,而不是软链接。 在 Windows 上,无论如何都请使用导入方式。

使用 /context 进行验证。 在你的下一个会话中,确认 CLAUDE.md 出现在 Memory files(记忆文件)下,而不是凭空假设。

保持在限制大小之内,并在文件增大时按目录拆分。 Codex 的默认限制是整个链条 32 KiB;嵌套文件是官方文档中推荐的保持在限制之内的方法。

不要将文档直接粘贴进去。 而是引用它们。随着代码的变化,副本会变得过时——这也是为什么 agent 会忽略你编写的指令文件背后的核心观点。

将其提交到 git。 这正是让合并后的文件成为团队资产而非个人资产的关键。

不要将原因写在文件中,而是放在可检索的层中。 AGENTS.md 负责引导方向,记忆负责论证。这种分离才能让文件保持足够简短,从而真正被遵循。

结论

AGENTS.md 凭借其“平淡无奇”赢得了胜利:一个名称可预测的开放 Markdown 文件,已有超过 60k 个仓库和大多数主流 agent 在读取它。合并到该文件可以消除三个文件各自演变、逐渐偏离的问题,而 Claude Code——这个读取 CLAUDE.md 而不是 AGENTS.md 的著名工具——在官方文档中提供了一个一行的桥接方法,即通过 @AGENTS.md 导入,或者在没有 Claude 特有内容需要添加时使用软链接。

合并无法解决的是指令文件本就不该承担的部分。每个加载器都会在每次请求时发送全局启用的内容,这就是为什么它们都有大小限制。因此,将共享指令移入 AGENTS.md,将 Claude 特有的内容保留在导入行下方,删除过期的规则文件,并将你的决策、约束条件和被否决的方法放在你的 agent 可以查询的层中。一个能被切实遵循的简短文件,胜过一个会被截断的冗长文件。

常见问题

Claude Code 会读取 AGENTS.md 吗?

不直接读取。Anthropic 的官方文档指出,Claude Code 读取的是 CLAUDE.md,而不是 AGENTS.md,并建议创建一个导入 AGENTS.mdCLAUDE.md,这样两个工具就可以读取相同的指令,而无需重复内容。

我应该使用 @AGENTS.md 导入还是软链接?

如果你希望在共享指令的同时保留 Claude 特有的指令,请使用导入方式——Claude 会在会话开始时加载导入的文件,然后追加其余内容。当你不需要 Claude 特有的内容时,软链接非常适用。在 Windows 上,官方文档建议使用导入方式,因为创建软链接需要管理员权限或开发人员模式。

哪些工具原生支持读取 AGENTS.md

该格式自身的列表包括 Codex、Cursor、Zed、Devin、Windsurf、GitHub Copilot 的编码 agent、Jules、Aider、goose、opencode、Warp、Amp、Gemini CLI 和 Junie 等。具体行为在细节上有所不同——Cursor 支持嵌套文件,其中更具体的指令具有更高的优先级;Zed 将其加载为个人和项目指令;而 Devin 会自动将其拉入知识(Knowledge)中。

迁移后我可以删除 CLAUDE.md 吗?

只有在你不需要 @path 导入、CLAUDE.local.md 或 Claude 特有指令,并且使用的是软链接时才可以。否则,请保留一个导入了 AGENTS.md 的简短 CLAUDE.md——因为这三个特性在 AGENTS.md 中没有对应项。

AGENTS.md 有大小限制吗?

这取决于具体的工具。Codex 一旦合并后的指令链达到 project_doc_max_bytes(默认 32 KiB),就会停止添加文件,并建议提高该限制或拆分到嵌套目录中。Claude Code 的指导原则是,文件越长消耗的上下文越多,且会降低指令遵循度。请将这些限制视为一个信号,即指令文件是用于引导方向的,而不是用于写文档的。

我旧的 .cursorrules 文件会怎么样?

一旦其内容合并到 AGENTS.md 中,请将其删除。保留它可能会带来负面影响:Zed 的项目指令加载器会使用列表中的第一个匹配文件,而在该列表中 .cursorrules 排在 AGENTS.md 之前,因此过期的文件可能会遮蔽你的新文件。