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 | 你发消息时 | 记录你的输入 |
| PostToolUse | Claude 调用工具后 | 记录操作的观察结果 |
| Stop | Claude 完成回复 | 触发记录 |
| SessionEnd | session 结束 | 生成本次会话摘要 |
数据存在本地 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。