Claude Code 跨会话记忆方案:claude-mem 配置实战

25 阅读1分钟

Claude Code 有个老毛病——关掉终端,下次再开,它对你的项目毫无记忆。上次调到哪了、改了哪些文件、踩过什么坑,全部清零。

项目小的时候还好。但如果你在连续开发一个中型项目,每次开 session 都要把"我们用的 Next.js 15 + Prisma + PostgreSQL,上次改了 auth 模块的 token 刷新逻辑,之前试过 JWT 但因为 XXX 原因放弃了"这种话重复一遍,你会发现这个重复劳动比写代码还累。

claude-mem 是一个 Claude Code 插件,GitHub 上目前 42K star。思路很直接:Claude Code 运行时自动记笔记,下次开 session 时把相关笔记注入进去。

我用了三天,把配置过程和踩过的坑记录下来。

环境准备

先确认你有这几样东西:

  • Node.js 18 或以上
  • Bun(worker 服务用 Bun 跑)
  • Claude Code 支持 plugin 功能的版本

Bun 如果没装:

curl -fsSL https://bun.sh/install | bash
bun --version

安装

在 Claude Code 终端里执行:

/plugin marketplace add thedotmack/claude-mem
/plugin install claude-mem

装完重启 Claude Code。打开 http://localhost:37777,看到 Web 界面说明 worker 在跑了。

37777 端口被占的情况后面会讲。

工作原理

插件注册了 5 个生命周期 Hook:

Hook触发时机做什么
SessionStart新 session 启动从数据库捞相关历史上下文注入
UserPromptSubmit你发消息时记录你的输入
PostToolUseClaude 调用工具后记录操作的观察结果
StopClaude 完成回复触发记录
SessionEndsession 结束生成本次会话摘要

数据存在本地 SQLite,路径 ~/.claude-mem/。语义搜索用的 Chroma 向量数据库。

可以直接打开 SQLite 看原始数据:

sqlite3 ~/.claude-mem/memory.db
SELECT id, type, summary, created_at FROM observations ORDER BY created_at DESC LIMIT 10;

三层渐进式搜索

搜索历史记忆有 4 个 MCP 工具。官方推荐三层渐进,核心目的是控制 token 消耗。

第一层:search——看索引

// 每条结果 50-100 token
search(query="authentication bug", type="bugfix", limit=10)

返回精简列表:ID、时间、简短描述。不拉全文。

第二层:timeline——看前后文

timeline(query="authentication bug", around_id=123)

第三层:get_observations——拉完整内容

// 每条 500-1000 token
get_observations(ids=[123, 456])

跳过前两层直接拉全量历史,token 消耗大概 10 倍。先粗筛再精取,省 token。

配置调优

几个实际用下来值得调的环境变量:

# 注入上下文的最大 token 数
# 默认值偏大,建议从 2000 开始
export CLAUDE_MEM_MAX_CONTEXT_TOKENS=2000

# Worker 端口(默认 37777)
export CLAUDE_MEM_PORT=37778

# 排除敏感文件,不记录到 SQLite
export CLAUDE_MEM_EXCLUDE_PATTERNS=".env,secrets/*,*.key"

写进 shell 配置文件:

echo 'export CLAUDE_MEM_MAX_CONTEXT_TOKENS=2000' >> ~/.zshrc
echo 'export CLAUDE_MEM_EXCLUDE_PATTERNS=".env,secrets/*,*.key"' >> ~/.zshrc
source ~/.zshrc

实际效果

在一个 Next.js 项目上用了三天。说说好的和不好的。

省事的地方:

Prisma migration 报错调了半天,关掉 session 后再开,自动注入了"上次你在处理 Prisma migration,遇到外键约束冲突,最后的方案是先 drop constraint 再 alter column"。不用再讲一遍背景。

连续写同一个功能时,每次开 session Claude 已经知道技术栈、改到哪一步、还剩什么。这个体验和第一次打开时差别很大。

用 search 搜之前踩过的坑,比翻 terminal 历史快。

不好的地方:

跑了三天后,SessionStart 注入的历史信息占了好几千 token。把 CLAUDE_MEM_MAX_CONTEXT_TOKENS 设成 2000 后控制住了,但合适的值要自己试。

Chroma 向量数据库偶尔启动失败。我遇到过两次 port 冲突,解决办法:

# 找到占用端口的进程
lsof -i :37777
# 杀掉
kill -9 <PID>
# 或者直接改端口
export CLAUDE_MEM_PORT=37778

记忆注入的相关性有时候偏。我在写前端组件,它给我注入了三天前改后端 API 的记忆。有关系,但不是当下最需要的。这个暂时没法调。

和 CLAUDE.md 的关系

不是替代关系。

CLAUDE.md 是你手动写的静态说明——"这个项目用 Next.js 15 + Prisma + PostgreSQL,部署在 Vercel 上"。你不改它,它不变。

claude-mem 是自动产生的动态记忆——"昨天把 Redis 换成了 Upstash,遇到连接超时,调了 timeout 参数后解决了"。这种细节你不会往 CLAUDE.md 里写,但下次接着开发时有用。

我的用法:CLAUDE.md 管宏观,claude-mem 管细节。两个一起用。

什么时候值得装

连续开发同一个项目、每天都要开 Claude Code、项目超过 20 个文件——这种情况装一个省事。

一次性脚本、小项目、偶尔用一次 Claude Code——不值得。worker 进程和数据库的开销在小项目上不划算。

完整安装流程

# 1. 确认 Bun
bun --version

# 2. 安装插件(Claude Code 终端里)
/plugin marketplace add thedotmack/claude-mem
/plugin install claude-mem

# 3. 配置环境变量
export CLAUDE_MEM_MAX_CONTEXT_TOKENS=2000
export CLAUDE_MEM_PORT=37777
export CLAUDE_MEM_EXCLUDE_PATTERNS=".env,secrets/*,*.key"

# 4. 重启 Claude Code

# 5. 验证 worker
curl -s http://localhost:37777/health | python3 -c "import json,sys; print(json.load(sys.stdin))"

打开 http://localhost:37777 能看到 Web 界面就行了。遇到问题先查端口占用,再看 ~/.claude-mem/ 下面的 log。