cavemem
AI编程助手跨会话持久记忆系统,本地SQLite存储+Caveman压缩语法+MCP接口
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
AI编程助手跨会话持久记忆系统,本地SQLite存储+Caveman压缩语法+MCP接口
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
"why agent forget when agent can remember" —— 这是 Julius Brussee 创建 cavemem 时在 README 开头写下的第一句话。这个来自荷兰的独立开发者,在 2024-2025 年间,围绕"让 AI 编程工具真正记住工作上下文"这一主题,连续推出了四个项目,统称为 Caveman Ecosystem。截至 2026 年初,cavemem 已在 GitHub 积累超过 550 颗星,是其中增速最快的子项目。
每一个用过 Claude Code、Cursor 或 GitHub Copilot 的开发者都经历过这样的场景:上午让 AI 帮你实现了一个复杂的认证中间件,下午想让 AI 在此基础上加一个新功能——结果 AI 完全不记得上午的上下文,把认证逻辑重写了一遍,甚至引入了与之前不一致的命名风格。
这不是 AI 的缺陷,而是架构层面的必然:主流 AI 编程工具的上下文窗口是单次会话制的。会话结束,工作记忆随之消散。长期积累的项目理解、业务逻辑、架构决策,全都随着一个 Ctrl+C 化为乌有。
cavemem 的核心价值主张就是解决这一个问题:它为 AI 编程助手提供跨会话的持久化记忆层,让 Claude Code 或 Cursor 下次启动时,能够回溯到上一个会话中断的地方继续工作。
cavemem 解决记忆存储有两个技术亮点值得关注。
亮点一:无损压缩的 Caveman 语法。 AI 编程会话会产生大量文本日志——工具调用、思考过程、代码片段、错误堆栈。如果原样存储,token 消耗惊人。cavemem 实现了一套确定性压缩算法,将自然语言描述压缩到原始长度的约 25%(减少 75% prose token),同时保证代码块、URL、文件路径、版本号等技术符号完全逐字节保留。压缩效果示例:
| 原始输入 | 存储后 |
|---|---|
| "The auth middleware throws a 401 when the session token expires; we should add a refresh path." | "auth mw throws 401 @ session token expires. add refresh path." |
压缩后仍可完整还原(expand),但存储体积大幅缩小。这个算法是纯规则驱动的,无需调用任何 LLM API,做到了真正的离线运行。
亮点二:混合检索策略。 cavemem 的搜索融合了两种检索方式:基于 SQLite FTS5 的 BM25 关键词检索,以及基于本地向量索引(Transformers.js / Ollama / OpenAI)的语义相似度检索。用户可通过 search.alpha 参数调整两种信号的权重比例。这种设计让搜索在无 GPU 的普通机器上也能跑起来(默认使用 Xenova/all-MiniLM-L6-v2 轻量模型,本地 CPU 推理),同时允许有条件的用户切换到更强的 embedding 提供商。
cavemem 采用 pnpm workspaces 构建的 TypeScript monorepo,共包含 8 个子包,依赖方向严格向下:
packages/config ← settings schema, loader
packages/compress ← 核心压缩引擎 + lexicon
packages/storage ← SQLite + FTS5 + 向量适配器
packages/core ← MemoryStore facade + ranker
packages/embedding ← 本地/ollama/openai embedding provider
packages/hooks ← IDE 生命周期 hook handlers
packages/installers← Claude Code / Cursor / Gemini CLI / OpenCode / Codex 各 IDE 安装器
apps/cli ← 用户命令行工具
apps/worker ← 后台 HTTP daemon(viewer + embedding 回填循环)
apps/mcp-server ← stdio MCP 服务端
写入路径(50ms 级完成):IDE hook 触发 → CLI hook run 执行 → redactPrivate() 剥离隐私内容 → compress() 压缩 → Storage.insertObservation() 提交 SQLite → 异步触发 worker 的 embedding 回填。
读取路径:AI 助手通过 MCP stdio 连接 mcp-server,使用 search / timeline / get_observations 三个工具按需拉取记忆。用户则可通过 cavemem viewer 打开本地浏览器(端口 37777)查看人类可读的会话历史。
值得注意的是,worker 是懒加载的:首次 hook 触发时自动在后台 spawn,处理完 embedding 后空闲退出,下次有新数据再重新拉起。完全不需要用户手动管理进程。
cavemem 的 MCP 工具设计遵循"渐进式披露"(Progressive Disclosure)原则,避免一次性返回大量上下文造成 token 浪费:
search(query) / list_sessions() → 返回 ID + snippet + score,体积极小timeline(session_id) → 返回某会话内的时间线,ID 列表get_observations(ids[]) → 才返回完整的 observation 内容体这种设计让 AI 助手在需要某个记忆片段时才去获取完整内容,相比直接 dump 全部历史,token 消耗可降低约 10 倍。
隐私保护不是事后添加的过滤器,而是写进了 CLAUDE.md 的"非谈判规则":
<private>...</private> 标签内的内容在写入层被强制剥离excludePatterns(如 **/.env)的文件永远不被读取127.0.0.1,不暴露任何端口到网络cavemem 刻意将 embedding provider 默认为本地(Transformers.js),而非云端 API,确保即使在处理敏感代码时也不会产生数据外传。
从用户视角,cavemem 的部署体验接近零门槛:
npm install -g cavemem
cavemem install # 注册 Claude Code hooks + MCP
cavemem install --ide cursor # 或其他 IDE
cavemem viewer # 打开 http://127.0.0.1:37777
没有 Dockerfile,没有 docker-compose,不依赖任何容器运行时。数据默认存储在 ~/.cavemem/data.db。对于需要在团队共享记忆的场景,目前还不支持——这既是局限性,也是设计上"Local by default"理念的体现。
Julius Brussee 的四个项目形成了一个互补的 token 优化体系:
| 组件 | 作用层次 | 解决的问题 |
|---|---|---|
| caveman | Agent 输出压缩 | 让 AI 回复更短 |
| cavemem | Agent 记忆压缩 | 让 AI 记得更久 |
| cavekit | Agent 构建循环 | 让 AI 按规格执行 |
| cavegemma | 模型权重层 | 让压缩成为模型本能 |
四个项目各自独立可用,但组合起来构成了一条完整的"AI 编程效率栈"。这种以 token 成本为优化目标的设计哲学,在 LLM 调用按 token 收费的商业模式下,具有直接的实用价值。
适合谁:重度使用 Claude Code / Cursor / OpenCode 等 AI 编程工具、日均编程时长超过 2 小时的开发者。
不适合:轻度用户(偶尔用 AI 辅助编程)、需要团队共享记忆的场景(当前仅支持本地存储)、需要 GPU 加速 embedding 的环境(默认 CPU 模型,百万级观察记录后检索可能偏慢)。
一句话总结:cavemem 让 AI 编程工具拥有了真正的长期记忆,压缩存储,本地运行,MCP 接口一键接入,是 AI 编程重度用户的效率倍增器。