MemoryLake
返回全部文章
Tutorial2026 年 9 月 4 日·11 分钟阅读

如何在不丢失上下文的情况下从 Claude Code 迁移到 Amp (2026)

这是一次罕见的迁移,其第一步是什么都不做,而这恰恰是它的危险所在。

Amp 会读取你的 CLAUDE.md。不是通过转换,也不是通过导入器——而是直接读取,这是官方文档中说明的行为。将 Amp 指向为 Claude Code 设置的仓库,你的项目指令就已经生效了。这感觉像是同类工具中最干净利落的切换。

然后读一下让它发挥作用的这句话:"如果目录中不存在 AGENTS.md,但确实存在名为 AGENT.md(不带 S)或 CLAUDE.md 的文件,则该文件将被包含在内。"

如果不存在 AGENTS.md 这是一个备用方案。一旦你团队中的任何人运行了 Amp 的生成器,或者为另一个工具提交了 AGENTS.md,该备用方案在那个目录下就会停止适用,你的 CLAUDE.md 就会静默失效。没有错误,没有警告,而文件依然完好地躺在那里。

这是本次迁移隐藏的两件事中的第一件。第二件更大:Claude Code 拥有第二个记忆系统,而 Amp 完全没有与之对应的功能。

在我们开始之前,先划定一个界限。本文是关于从 Claude Code 迁移到 Amp 的。如果你打算继续使用 Amp,而你的问题是它在每个任务上加载了太多内容,那么解决方法是另一种机制——将 Amp 的指令范围限制在它们适用的文件上 涵盖了这一内容。

实际转移的内容

你的 CLAUDE.md 会有条件地原样转移。 如上所述。请将其视为一个过渡期,而不是最终目的地:在同一个目录下出现 AGENTS.md 之前,它都是有效的。

加载模型非常相似,令人放心。 Claude Code 在启动时会加载“工作目录上方目录层级中的 CLAUDE.md 和 CLAUDE.local.md 文件...”,而“当 Claude 读取这些目录中的文件时,子目录中的文件会按需加载”。Amp 几乎完全相同:“当前工作目录(或编辑器工作区根目录)以及 父目录(最高到 $HOME)中的 AGENTS.md 文件总是会被包含在内”,并且“当智能体读取子树中的文件时,子树中的 AGENTS.md 文件会被包含在内”。

相同的结构,相同的子树延迟加载。你心智模型中的这一半得以保留。

个人和系统范围在双方都存在,只是路径不同。 Claude Code 在加载顺序上有四个已记录的范围:托管策略、用户(~/.claude/CLAUDE.md)、项目和 ./CLAUDE.local.md。Amp 拥有仓库文件,外加用于“在提交前在本地测试的个人偏好、设备特定命令和指南”的 "$HOME/.config/amp/AGENTS.md""$HOME/.config/AGENTS.md",以及位于 /etc/ampcode/AGENTS.md/Library/Application Support/ampcode/AGENTS.md%ProgramData%\ampcode\AGENTS.md 的系统级文件,用于“针对所有 Amp 会话的系统级或组织托管的指南”。

Amp 的所有非仓库文件都是“如果存在,则总是包含在内”。因此,你的用户范围内容可以干净地映射;路径发生了变化,且双方的加载都是无条件的。

条件规则可以转移,而且变得更好。 这是真正的升级。Claude Code 通过 .claude/rules/ 前置元数据(frontmatter)中的 paths 字段来限制指令范围,其中“当 Claude 读取与模式匹配的文件时,会触发路径范围的规则”。Amp 通过带有 globs 列表的 @ 提及文件来完成同样的工作:“只有当 Amp 读取了与任何 glob 匹配的文件时,带有 globs 的被提及文件才会被包含在内。”

转换时需要了解两件事。单纯的提及是无条件的——“如果没有指定 globs,那么在被 @ 提及的时候,该文件总是会被包含在内”——所以前置元数据是核心所在。此外,glob 解析有其自身的规则:“Globs 默认会隐式添加 **/ 前缀,除非它们以 .././ 开头,在这种情况下,它们指的是相对于被提及文件的路径。”

导入语法的含义发生了变化,而不仅仅是拼写。 Claude Code 的 @path/to/import 会在启动时引入一个文件:“导入的文件会在启动时展开并加载到上下文中,与引用它们的 CLAUDE.md 一起”,并且“最大深度为四跳”。Amp 的 @ 提及看起来一样,并且可以是条件性的。两者都会跳过代码块——Claude Code 的“导入解析会跳过 Markdown 代码跨度和围栏代码块”,Amp 的“代码块中的 @ 提及会被忽略,以避免误报”——因此反引号中的路径在两者中都保持字面意思。

需要注意的一个区别:“相对路径是相对于包含该提及的智能体文件来解析的”,而不是相对于你的工作目录。Claude Code 的解析方式相同,因此直接复制通常有效,但如果你将文件向上或向下移动一级,就会破坏它自己的提及。

自动记忆无法转移。因为没有可以承载它的地方。 Claude Code 运行着两个系统,而不是一个。除了你编写的文件之外,“自动记忆让 Claude 能够在你不编写任何内容的情况下跨会话积累知识”,并按类型进行标记:user 代表“你的角色、专业知识和工作偏好”,feedback 代表“你给 Claude 的纠正和确认的方法”,project 代表“Claude 无法从代码或 git 历史记录中推导出的进行中的工作、截止日期和决策”,以及 reference 代表外部指针。

它默认开启,保存在 ~/.claude/projects/<project>/memory/ 下的本地文件中,并带有 MEMORY.md 索引,其范围是“每个仓库,跨工作树共享”,并且加载的片段是有界的:“每个会话(前 200 行或 25KB)”。

Amp 文档中记录的持久化方式是你编写的 AGENTS.md 文件外加线程(threads),而线程是对话而不是存储库——目前没有文档记录的与自动写入记忆目录相对应的功能。因此,你 Claude Code 配置中自动积累的那一半内容——你给出的纠正、它推断出的偏好——没有去处。

线程不是记忆层,Amp 也没有这样声称。 它们在保持工作连续性方面确实设计得很好:一个线程有一个 URL,“同一个线程可以在 Web 应用、CLI、适用于 iOS 和 macOS 的 Amp 应用中打开”,并且“智能体运行的地方与你查看它的地方是分开的”。建议是每个任务一个线程,因为“混合了无关工作的线程会给智能体提供更糟糕的推理上下文”,并且在线程变大时有一个文档记录的逃生通道——“让智能体‘移交并……’,它就会启动一个带有重要上下文的新线程”。

很有用。但它也不是保存事实的地方,因为移交只携带智能体认为相关的内容,而不是关于你项目的全部真实情况。

手动迁移

步骤 1:刻意重命名,然后按触发器拆分

不要依赖备用方案。在你的 CLAUDE.md 文件所在的相同路径上创建真正的 AGENTS.md 文件,这样行为就是显式的,而不是取决于以后是否有人添加文件。

然后进行拆分,因为 Amp 要求你这样做:“在包含多个子项目的大型仓库中,我们建议保持顶层 AGENTS.md 的通用性,并在每个子项目的子树中创建更具体的 AGENTS.md 文件。”Claude Code 从另一个方向给出了相同的建议——“目标是每个 CLAUDE.md 文件控制在 200 行以下。更长的文件会消耗更多上下文并降低遵循度”——所以如果你已经在这个上限之下,这基本上只是复制。

接下来转换你的 .claude/rules/ 条目。带有 paths 字段的规则会变成一个从 AGENTS.md 引用的文件,并在其前置元数据中包含一个 globs 列表。没有该字段的规则是无条件加载的,因此它属于通用文件,而不是作为单纯的提及。

~/.claude/CLAUDE.md 的内容移动到 $HOME/.config/amp/AGENTS.md。对于 CLAUDE.local.md 中的任何内容——你没有纳入版本控制的“个人项目特定偏好”——Amp 的 $HOME/.config 文件是最接近的归宿,区别在于它们适用于所有地方,而不是仅适用于一个项目。

然后进行验证,使用为此构建的命令:“要查看 Amp 正在使用的智能体文件,请从命令面板中选择 agents-md list。”从几个不同的目录运行它,并在智能体读取了不同的文件类型之后运行。这相当于在 Claude Code 中检查 /context 中的 Memory files(记忆文件),这也是你捕获在移动中因相对路径损坏而失效的提及的方法。

步骤 2:在停止使用 Claude Code 之前,读取你的自动记忆

这一步没有工具支持,而且是人们最容易跳过的一步。

打开 ~/.claude/projects/<project>/memory/。这些文件是带有 MEMORY.md 索引的纯 Markdown 文件,它们之所以可读,正是因为 Claude 是写给它自己看的。阅读它们。

你会发现那是数月来纠正留下的残留物,边读边整理是非常值得的。读起来像指令的条目——例如格式偏好、你不断重申的规则——可以变成你新的 AGENTS.md 或 glob 范围文件中的内容。读起来像关于项目的事实条目——例如截止日期、决策及其原因、为什么存在某种临时解决方案——根本不属于指令文件,我们稍后会回到这些内容。

还要注意 Claude Code 刻意没有记录的内容,因为这会改变你预期能找到的东西:“Claude 会跳过任何它可以从代码库中推导出的内容”,并且“还会跳过你的 CLAUDE.md 文件中已经说明的任何内容”。因此,自动记忆是你文件的补充,而不是它们的副本。里面的所有内容都是代码无法告诉你的——这也是为什么它是最值得挽救的部分,也是为什么 Claude Code 在丢失这些文件时会忘记项目上下文背后的规律。

更好的方法:保留在两个工具之外积累的那一半

重命名是机械式的,glob 转换是一次升级。让这次迁移耗费真正时间的是积累下来的那一半——而且在下一次切换时你还会再次为此付出代价,因为积累下来的东西被存储在了一个工具内部。

Claude Code 自身的设计框架指出了原因。它将你编写的内容与智能体学到的内容分开,并将两者都视为上下文而不是配置:“Claude 将它们视为上下文,而不是强制配置。”Amp 保留了第一类,丢弃了第二类。这两个工具都没有错;这个类别只是需要一个不属于任何工具的归宿。

将积累的那一半放入记忆层,迁移就缩减为了简单的重命名。MemoryLake 只需三步即可设置完成。

步骤 1:创建 API 密钥

登录并在你的控制面板中生成一个 API 密钥。它不是编辑器设置,也不是智能体的本地目录,因此它不具备引发这次迁移的属性——它没有任何部分是另一个文件可以静默超越的备用方案。

创建 MemoryLake API 密钥,以便一个存储库同时服务于 Claude Code 和 Amp
创建 MemoryLake API 密钥,以便一个存储库同时服务于 Claude Code 和 Amp

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

这就是步骤 2 中第二堆内容的去处:决策及其原因、截止日期、领域词汇、为什么存在某种临时解决方案,以及你已经给出不止一次的纠正。

将没有任何指令文件保存的积累知识上传到 MemoryLake
将没有任何指令文件保存的积累知识上传到 MemoryLake

将行为留在 AGENTS.md 中,并在适用模式的地方使用 globs 限制范围。这两个层承担着不同的工作,将它们混在一起会导致指令文件膨胀到无法被遵循的程度。

步骤 3:连接你的 AI 和智能体

将 Amp 指向该存储库。你的 AGENTS.md 文件将保持简短且专注于行为,新线程将从你项目的事实开始,而不是从移交摘要开始,并且这些知识在你评估下一个工具时依然能够存活——正如跨智能体记忆中所阐述的观点。

通过 MCP 和 API 将 Amp 和 Claude Code 连接到同一个 MemoryLake 存储库
通过 MCP 和 API 将 Amp 和 Claude Code 连接到同一个 MemoryLake 存储库

这在实践中改变了什么

第一个变化是备用方案不再承担重任。显式的 AGENTS.md 文件加上外部存储库意味着你的配置中没有任何部分依赖于某个文件存在。

第二个变化是丢失自动记忆的代价变小了。这是一个很好的功能,Amp 没有它是真正的差距——但这也仅仅针对那些无处安放的知识而言。

第三个变化是 glob 范围的指南可以保持精简。Amp 的条件加载确实比一直开启的文件更好,而且当你要限制的内容是指令而不是项目事实的档案柜时,它的效果最好——正如通过记忆层减少 Token 使用量中所论证的。

从 Claude Code 迁移到 Amp 的最佳实践

  • 创建真正的 AGENTS.md 文件。 CLAUDE.md 备用方案仅在不存在 AGENTS.md 的地方适用。
  • 拆分根文件。 Amp 建议使用通用的顶层文件和特定的子树文件。
  • paths 转换为 globs 并且记住,单纯的 @ 提及是无条件的。
  • 注意 glob 解析。 除非模式以 ./../ 开头,否则会隐式添加 **/ 前缀。
  • 移动文件后检查提及路径。 它们是相对于包含该提及的文件来解析的。
  • 先读取你的自动记忆目录。 纯 Markdown 格式,由 MEMORY.md 索引,且没有任何工具可以导出它。
  • 使用 agents-md list 进行验证。 从多个目录运行,并在接触不同的文件类型之后运行。
  • 不要将线程视为存储。 每个任务一个线程,且移交只携带智能体认为相关的内容。

结论

Amp 读取 CLAUDE.md 让这看起来像是同类中最简单的迁移,对于文件那一半来说也确实几乎如此——它带来了一个比你之前拥有的更好的条件加载模型。

让人痛苦的是自动写入的那一半。Claude Code 将你的纠正积累到本地的 Markdown 中;Amp 没有这样的层,也没有导入器来处理它。在离开之前阅读该目录,将指令与事实分开,并将事实放在下一次工具切换无法波及的地方。

常见问题

Amp 会读取我现有的 CLAUDE.md 吗?

是的,但有条件:“如果目录中不存在 AGENTS.md,但确实存在名为 AGENT.md(不带 S)或 CLAUDE.md 的文件,则该文件将被包含在内。”这是一个针对每个目录的备用方案,因此一旦它旁边出现 AGENTS.md,你的 CLAUDE.md 就会在那个地方停止被读取。

Amp 有类似于 Claude Code 自动记忆的功能吗?

没有文档记录的相关功能。Amp 文档中记录的持久化方式是你编写的 AGENTS.md 文件外加线程。Claude Code 的自动记忆会将自己的笔记写入 ~/.claude/projects/<project>/memory/ 下的四种类型中,并在每个会话中加载“前 200 行或 25KB”,而 Amp 目前没有文档记录的功能可以接收它。

如何转换路径范围的规则?

带有 paths 字段的 .claude/rules/ 文件会变成一个从 AGENTS.md 中被 @ 提及的文件,并在其前置元数据中包含一个 globs 列表。只有当“Amp 读取了与任何 glob 匹配的文件”时,Amp 才会包含它,因此限制条件取决于智能体的实际读取操作。

我的用户级 CLAUDE.md 应该放在哪里?

放到 $HOME/.config/amp/AGENTS.md(或 $HOME/.config/AGENTS.md),只要它们存在,Amp 总是会包含它们。请注意,这些适用于你所有的工作,因此任何真正特定于项目的内容都需要另一个归宿。

线程可以替代我正在丢失的记忆吗?

对于事实来说不行。线程在保持工作连续性方面非常出色——一个 URL,可以从 Web、CLI 和应用中打开——并且 Amp 的建议是每个任务一个线程。移交会“启动一个带有重要上下文的新线程”,这是关于相关性的主观判断,而不是持久的记录。

我该如何确认 Amp 实际加载了什么?

从命令面板中选择 agents-md list。从不同的目录运行它,并在智能体读取了不同的文件类型之后运行,因为子树文件和受 glob 限制的文件只有在其触发器触发后才会出现——正如编码智能体实际读取的内容中所描述的普遍习惯。