Claude Code 源码泄漏后,大家都知道了
npm 包里多了一个 .map 文件,512,000 行 TypeScript 就这么公开了。研究完它的源码后,我们的结论是:Claude Code 的记忆系统,比想象中初级。
它确实做了不少工作,分了好几层,甚至搞了一个让 agent 做梦的机制来整理记忆。听起来很高深。但摊开来看,本质上还是在一个 agent 的沙盒里打转,记忆出不去,也活不长。
第一层:CLAUDE.md,用户写给 agent 的规矩
CLAUDE.md 是一个 Markdown 文件,用户自己写,放在项目根目录下。内容可以是你想让 Claude 记住的任何规矩:代码风格约定、项目架构说明、测试命令、部署流程。
每次会话开始时,Claude Code 会把这个文件完整加载进 context。文件越短,Claude 遵写得越好。
它支持三个作用领域:项目级的 CLAUDE.md 放在项目根目录,个人级的放在 ~/.claude/CLAUDE.md,组织级的放在企业配置里。
第二层:Auto Memory,agent 自己记笔记
Auto Memory 就是干这个的:Claude 在工作中自己判断哪些信息值得记下来,写进一个独立的记忆目录里。
Claude 会把值得记住的东西分成四类:
- user 类:记录用户的角色和偏好
- feedback 类:记录用户的纠正和确认
- project 类:记录项目相关的决策和背景
- reference 类:记录外部资源的位置
这些记忆存在 ~/.claude/projects/<项目路径>/memory/ 目录下。每条记忆是一个独立的 Markdown 文件,带 frontmatter 标注类型和描述。
入口文件是 MEMORY.md,起索引作用,每行不超过 150 个字符,只存指针,不存内容。
第三层:Auto Dream,让 agent 做梦整理记忆
记忆写入的问题解决了,但跑了十几次会话之后,MEMORY.md 越来越乱。冗余的条目堆积起来就会出现相对时间(昨天、上周)不知道指哪一天。
Auto Dream 模拟的是人脑在睡眠中做的事:整理和巩固记忆。
它扫描现有记忆文件,翻阅历史会话记录,找到用户的反馈和反复提到的话题,然后做整合:把相对时间换成绝地日期,合并冗余条目,剔除超时内容,最终把 MEMORY.md 控制在 200 行以内。
触发条件两个同时满足:距离上次整合超过 24 小时,且积累了 5 次以上新会话。也可以手动输入"dream"触发。
第四层:KAIROS,泄露代码里还没上线的野心
KAIROS 在源码中出现了超过 150 次。这是一个后台守护进程模式,想把 Claude Code 从被动响应的工具变成主动观察的自治体。
KAIROS 维护 append-only 的日志文件,持续记录观察、决策和行动。它在固定间隔收到 <tick> 信号,自行决定是该主动做点什么,还是保持安静。
不过 KAIROS 目前被一个编译时 feature flag 控制,没有出现在任何公开版本里。
这套体系的天花板在哪?
用过一段时间就会发现几个绕不开的问题:
- 200行硬上限:MEMORY.md 最多 200 行,25KB。项目跑几个月,记忆就开始互相挤压。
- 只有 grep 检索:记忆的查找靠 grep 关键词匹配,没有语义理解。
- 细节容易丢:Auto Memory 记的是 agent 自己觉得重要的东西,粒度很粗。
- 层层修补的复杂度:CLAUDE.md 不够加 Auto Memory,Auto Memory 乱了加 Auto Dream,Dream 不够又搞 KAIROS。每一层都是在补上一层的问题。
- 跨工具不通用了:记忆锁在 Claude Code 一个工具里,换成 OpenCode、Codex CLI,从零开始。
- 终究是短期记忆:不管做不做梦,本质还是会话粒度的东西。
这不是 Claude Code 的设计失误。单 agent、会话粒度、本地存储,架构走到这里,天花板就在这里。