如何让 Claude Code 跨会话记住东西
给 Claude Code 装上 Lore:新会话拿到启动记忆,每条提示可以召回,用过的事实也能留下来。
Claude Code 每次打开都是新的。昨天定下来的做法、找了一个小时的命令、纠正过两遍的规矩,只要你不写回 CLAUDE.md、不在提示词里再贴一遍,它就不知道。CLAUDE.md 是这台机器上的一个文件,它记不住哪条事实真正被用过,第二个项目也没法各自留一份。
Lore 是 Agent 通过工具读写的记忆服务。装一次之后,新的 Claude Code 会话会先拿到一份启动基线,每条提示词可以带上几条相关记忆,Claude 也可以把一条事实写进去,留给下一次会话去找。
这篇按 Loremem 云服务来写,地址是 https://app.loremem.com。同一套安装程序也可以用 Docker 在你自己的机器上起服务,步骤在用 Docker 安装。
给 Claude Code 装上 Lore
需要 Node.js 20 或更高版本,并且 claude 命令在 PATH 里。打开 https://app.loremem.com/login,用 GitHub 或 Google 登录。第一次登录会建一个个人组织和一个默认项目。进入这个项目,打开 Install 页,令牌备注填 laptop 这种说明用途的词,点 Create token。对话框关掉之前把命令复制走,令牌只显示一次。
在你用 Claude Code 的那台机器上运行页面给的命令,并指定 Claude Code 这个通道:
npx @loremem/cli install --base-url https://api.loremem.com --api-token lm_your_token --channels claudecode--channels claudecode 只装 Claude Code。不加 --channels 时,安装程序会把这台机器上找得到的运行时都接上。claude 不在 PATH 里,这个通道会被记成跳过。
安装程序把 ~/.lore/claudecode/ 注册成本地插件市场,并装上 lore@lore。连接信息写进 ~/.claude/settings.json 的 env 块:LORE_BASE_URL、LORE_HOME、LORE_CLIENT_TYPE(值为 claudecode)、LORE_SKILLS_ENABLED,传了令牌时还有 LORE_API_TOKEN。同一组服务器地址和令牌也写进 ~/.lore/config.json,钩子优先读这个文件。装完重启 Claude Code。钩子和 MCP 配置在进程启动时加载,已经开着的会话还是旧配置。
确认装上了:
npx @loremem/cli status里claudecode一行应是installed。claude plugin list的输出里应有lore@lore。- 新开一个会话,让 Claude 调用
lore_status。服务正常时,它会告诉你记忆后端在线。
Claude Code 里 Lore 的工具带 mcp__plugin_lore_lore__ 前缀,搜索工具显示为 mcp__plugin_lore_lore__lore_search。跟 Claude 说话时仍然叫它 lore_search 就行,各运行时的参数名是一样的。
--api-token 会把令牌留在 shell 历史里。令牌放进密码管理器,不要贴进共享日志。令牌形如 lm_your_token,之后可以在 Tokens 页撤销。
Claude Code 自己还有一套自动记忆。如果只想留 Lore,在 ~/.claude/settings.json 里把 autoMemoryEnabled 设为 false,或者在同一文件的 env 块里把 CLAUDE_CODE_DISABLE_AUTO_MEMORY 设为 1。Lore 不会去写 CLAUDE.md。
新会话一开始就有什么
新开一个会话,问 Claude 启动时加载了什么。回答应来自 boot 节点,而不是当前目录。
会话开始时 Lore 注入四个固定节点:
| 节点 | 放什么 |
|---|---|
core://agent | 所有运行时共用的工作规则 |
core://soul | 语气和人设 |
preferences://user | 关于你的稳定背景 |
core://agent/claudecode | 只对 Claude Code 成立的规则 |
这些内容在控制台里改。新服务的设置步骤会给出默认文本,之后随时能改。boot 节点不会出现在召回结果里,因为会话已经有了。boot 块还会列出最近写入的五条记忆,只给路径、优先级和 disclosure,不给正文。
走通用 MCP 客户端时没有这步注入,得自己调用 lore_boot。Claude Code 的 SessionStart 钩子替你做了。每个钩子最多等 10 秒。服务连不上时钩子什么都不返回,Claude 这一步就在没有记忆的情况下继续。
一条提示词上 Claude 看到什么
发一条用到已有记忆里那些词的提示。Claude 的上下文里会出现这样一块:
<recall session_id="sess_8f3c" query_id="q_41" phase="prompt">
0.82 | project://checkout_api/webhooks
0.71 | project://checkout_api/testing
</recall>每一行是分数和 URI。低于展示阈值的候选不会出现,这个块只保留得分最高的几条。一条都没过线时,就没有这个块。新项目里这是正常的。自托管的 Lore 会在 URI 后面再印出和提示词对上的词。
这一行是线索,不是事实本身。要用之前,Claude 用 lore_get_node 打开节点,并把标签上的 session_id 和 query_id 传回去:
{
"uri": "project://checkout_api/webhooks",
"session_id": "sess_8f3c",
"query_id": "q_41"
}这两个标识是 Lore 用来记录“这条被召回的记忆真的被打开过”。不传也能拿到正文,只是召回分析里不会把它算作已使用。
查询太慢时,召回会被跳过,而不是卡住这条提示。在 Loremem 云服务上,打开 Overview 可以确认请求到了:每发一条提示,Queries 的计数会往上走。自托管服务器的同一项计数在 Analytics 里。
让 Claude 把下一条事实写进去
空的记忆图没什么可召回的,先写一条以后还会用到的事实。说清它该放在哪,并让 Claude 先找已有节点:
把下面这条存成 checkout_api 项目的长期记忆。先搜索,如果已有节点讲的就是这件事,就更新它。父节点 project://checkout_api 不存在的话先建好。然后创建 project://checkout_api/webhooks,优先级 1,disclosure 写成改退款或支付 webhook 时召回,glossary 用 refund webhook、idempotency key、stripe。正文:退款 webhook 按 event.id 做幂等,测试必须把同一条事件重放两次,并断言只产生一行退款。存下来的节点是这样:
URI: project://checkout_api/webhooks
Priority: 1
Disclosure: When changing refund or payment webhooks in checkout-api
Glossary: refund webhook, idempotency key, stripe
Content: Refund webhooks are idempotent by event.id. Tests must replay the same event twice and assert a single refund row.路径命名的是概念。用小写 snake_case,不要把日期写进路径。子路径的父节点必须先存在,而且父节点自己要有正文、disclosure 和 glossary。优先级 1 给关键事实,Lore 最多允许 15 条优先级 1、5 条优先级 0,其余用 2 或更高。disclosure 写的是以后会在什么情形下用到它,不是正文的摘要。glossary 是你真正会打出来的词,包括另一种语言和错误名。
Claude 用 lore_create_node 写入。已经有节点讲这件事时,用 lore_update_node,只传要改的字段,没传的保持原样。不要把 API key、令牌(包括 lm_ 开头的)、密码或带凭据的连接串写进记忆。历史和备份都留着旧版本,事后删掉正文也清不掉这个密钥。
然后检查召回。发一句「checkout_api 的退款 webhook 该怎么测」,让 Claude 把它收到的 <recall> 块原文贴出来。新记忆出现在其中一行,下一次会话就不用你再贴一遍。
每个字段怎么写、什么该进记忆,在写出好的记忆。这个运行时的安装细节在 Claude Code。