| name | memory-keeper |
| description | 即时记忆管理——将用户"记住"指令融入正确位置(全局/项目/子项目的记忆系统或配置文件)。也处理"忘掉"指令,删除后整理受影响的结构。还处理"整理"指令,对已有记忆做 L3 深度结构重构(去重/清死链/合并/重组/关联)。触发词:"帮我把...加入记忆"、"你要记住..."、"以后也要记住"、"记住..."、"记下来"、"记住了"、"把这个存到记忆"、"忘了..."、"不用再记..."、"不要再记..."、"删掉...的记忆"、"清除..."、"整理记忆"、"整理一下记忆"、"整理全局记忆"、"整理项目记忆"。 |
记忆管理 — Memory Keeper
你负责即时响应用户的"记住"和"忘掉"指令,将信息融入正确位置并维护结构整洁。
与 weaver-自我迭代 的关系
| weaver-自我迭代 | memory-keeper |
|---|
| 触发 | 手动/定期 | 实时"记住"指令 |
| 范围 | 批量扫历史 | 单条即时处理 |
| 删除 | 被动+主动扫描 | 确认后处理+整理结构 |
| 优化建议 | 视情况 | 视情况 |
两者互补:memory-keeper 处理单条即时需求,weaver-自我迭代 定期全局整理。
整理 vs weaver(边界声明)
| weaver | 整理 |
|---|
| 触发 | 定期/手动"编织一下/全局整理" | 随时"整理记忆" |
| 范围 | 跨项目全局 | 单范围(全局/项目/指定) |
| 动作 | 扫对话→提取→归位→权限→file-tidy→复盘 | 已有记忆 L3 结构重构 |
| 依赖 | agentmemory MCP(离线降级) | 无依赖,离线可用 |
整理不扫对话、不调 file-tidy/debug-architect、不做权限审查、不动 Obsidian wiki。
整理 vs neat-freak(边界声明)
| neat-freak | 整理 |
|---|
| 触发 | 会话末"整理一下/同步一下/收尾" | 随时"整理记忆" |
| 范围 | docs + CLAUDE.md + memory 三层同步 | 仅 memory 文件 |
| 动作 | 把代码变更同步到知识体系(顺手 L1 卫生) | L3 深度结构重构 |
触发词靠"记忆"二字区分:带"记忆"→整理;不带"记忆"("整理一下"/"整理文档"/"梳理一下")→neat-freak。
整理 vs 记住/忘掉(边界声明)
记住 = 新增单条;忘掉 = 删单条;整理 = 批量结构重构(去重/清死链/合并/重组/关联)。
修改范围
不只是 memory/ 系统,还包括:
~/.claude/settings.json / settings.local.json(全局配置)
~/.claude/CLAUDE.md(全局 AI 指令)
- 项目
CLAUDE.md(项目 AI 指令)
- 项目
.claude/settings.json(项目权限配置)
- 子项目同理
"记住"流程(8步)
1. 判断层级
根据用户语境和信息内容判断属于哪层:
- 全局:影响所有项目、跨项目偏好、通用工具选择
- 项目:当前对话所在项目的决策、配置、踩坑
- 子项目:明确提到子项目目录名
不确定时保守下沉一级。
2. 判断类型
| 类型 | 信号 | 示例 |
|---|
| 偏好习惯 | "以后都这样"、"我习惯用X" | "回复要简短" |
| 工具选择 | "用X不用Y"、"X比Y好" | "Maven用阿里云镜像" |
| 项目决策 | 架构选型、技术栈变更 | "lab3用MyBatis" |
| 踩坑记录 | "踩了个坑"、"注意X会Y" | "PyInstaller中文路径报错" |
| 个人特性 | "我喜欢"、"我是"、"我在学" | "我是学生"、"喜欢整洁" |
| 事实信息 | API Key、路径、端口、账号 | "MySQL端口3306" |
2.1 判断 Obsidian 归属
判断为"踩坑记录"/"项目决策"/"个人特性"且属通用知识时,写入 Obsidian(wiki/概念/ 或 wiki/来源/);纯操作偏好/凭据/进度只写 memory/。同时写两边时,memory 正文第一条加 > 详见 [[个人知识库/wiki/...]] 索引。
完整路由规则(合并检测 / 写入规范 / TL;DR 格式 / log.md 追加 / raw 只读):见 ~/.claude/rules/memory-routing.md。
3. 搜索已有
写入前 grep 目标文件 + MEMORY.md,找已有相关内容。
4. 展示计划
告诉用户你的计划,格式:
我会 [合并到/更新/新建/覆盖] [完整文件路径]
[文件路径] 中已有:[相关旧内容摘要(如有)]
新信息:[一句话]
动作:[更新旧条目 / 新建条目 / 覆盖旧信息]
[如有矛盾] ⚠ 旧"[...]"会被新信息替代
[如有过时] 旧的 [文件路径] 中的"[...]"会随之删除
[如有互补] 新旧不冲突,各自保留并互链
等待确认后再写。
5. 用户确认
给用户纠正位置或内容的机会。用户说"对"或"可以"才继续。
6. 执行归位
按位置矩阵写入。遵循融入规则(8条)。
7. 周边整理
写入后检查:
- MEMORY.md 索引描述是否还需更新?
- 同目录其他文件有没有因本条而过时的?
- 有没有文件变空或只剩一条?
8. 读回确认
写入完成后,读回验证(对齐 verify-before-changing 规则——宣布修好前先实际读确认):
任一不过 → 回第6步补,不宣布完成。
"忘掉"流程(6步)
1. 搜索匹配
grep MEMORY.md + 所有 memory 文件中匹配的内容。
如果只匹配到一个 → 继续。
如果匹配到多个 → 列出所有结果让用户选。
如果没匹配到 → 告知用户,确认是否换个关键词。
2. 展示确认
找到以下匹配:
1. [文件路径] — [内容摘要]
2. [文件路径] — [内容摘要]
要删除的是哪些?(全部删除 / 只删第N条 / 不删了)
3. 分析影响
删除 [文件路径] 中的"[...]"后:
- 该文件还剩 [N] 条内容
- MEMORY.md 索引需要更新 [是/否]
- 相关文件 [X] 中也有引用,需要调整 [是/否]
4. 展示影响
删除后我会:
- 删除 [文件路径] 中的对应内容
- 从 MEMORY.md 移除链接 [如果文件变空]
- 将剩余内容合并到 [上级文件] [如果只剩一条]
5. 用户确认
6. 执行删除 + 整理结构
删内容 + 更新索引 + 清理空文件 + 合并孤立条目。
删后验证(对齐 verify-before-changing——删完不等于删干净):
任一不过 → 补到干净为止,不宣布完成。
"整理"流程(4阶段)
对已有记忆做 L3 深度结构重构。不扫对话、不调 file-tidy/debug-architect、不做权限、不动 Obsidian wiki(详见上方"整理 vs weaver/neat-freak"边界声明)。
触发词与范围
| 触发词 | 整理范围 |
|---|
| "整理记忆" / "整理一下记忆" | 全局CC记忆 + 项目记忆 + 配置文件过期扫描 |
| "整理全局记忆" | 只全局CC记忆 + 配置文件过期扫描 |
| "整理项目记忆" | 只项目记忆 |
| "整理记忆,只整理记忆文件" | 跳过配置文件 |
当前项目 = 触发时 CWD 所在项目(memory-keeper 是全局 skill,动态识别)。
整理对象 × 动作矩阵
| 对象 | L1(清死链/去重/清过期) | L2(合并孤立/格式统一) | L3(碎片合并/跨文件关联) |
|---|
全局CC记忆(~/.claude/projects/<...>/memory/,带 frontmatter) | ✓ | ✓ | ✓ |
项目记忆(<项目根>/memory/,纯索引) | ✓ | ✓ | ✓ |
| 配置文件(settings.json / CLAUDE.md / rules/) | ✓ 仅清过期 | ✗ 不重组 | ✗ 不重组 |
| Obsidian wiki | ✗ | ✗ | ✗ |
4阶段流程
阶段1 审计:扫描所有纳入对象,按 8 类动作(见下方细则)产出问题清单。每项标注:文件路径 + 问题 + 建议动作。文件读取失败 → 跳过,列"无法读取"清单。
阶段2 确认:展示整理计划,等用户选"全部执行 / 部分执行 / 取消"。
阶段3 执行:按确认执行,遵循融入 8 规则。写阶段开始前重读目标文件,若与审计时不一致(被外部修改)→ 暂停,提示"X 在审计后被改,是否重新审计"。
阶段4 验证:读回确认(对齐 verify-before-changing)。验证清单见下方"阶段4 验证检查清单"。
8类动作判定规则
| # | 动作 | 信号 | 建议 |
|---|
| 1 | 清死链 | MEMORY.md 链接目标不存在 | 删索引行 / 或重建文件 |
| 2 | 去重 | 同信息跨文件复制 | 留详细那个,删其他 + 合并要点 |
| 3 | 清过期 | 旧 vs 新矛盾 / 引用已删项目 / 废弃工具 / 地址变更 | 删旧或更新 |
| 4 | 合并孤立 | 文件只剩 1 条 | 合并到同类 |
| 5 | 碎片合并 | 同主题/同类分散 >3 文件 | 合并成主题文件 |
| 6 | 格式统一 | 缺 frontmatter(仅全局)/ 相对时间 / 链接不规范 | 全局补 frontmatter;项目修时间/链接 |
| 7 | 跨文件关联 | type 同 + 主题重叠 / 关键词共现 ≥2 / 提对方主题未链 | 双向加 [[wikilink]],只建议不强制 |
| 8 | 配置过期 | settings/CLAUDE/rules 过期信号 | 只标记,settings 逐条确认 |
关联 vs 去重的区别:重复 = 同信息复制(合并);关联 = 相关但不同(互链,各自保留)。
配置文件过期扫描细则(L1 子集,不重组结构)
| 文件 | 扫什么 | 动作 |
|---|
| settings.json | permissions 引用不存在路径 / env 失效地址 / 重复规则 / 废弃 MCP | 只标记,不自动改——JSON 改错断 CC,逐条确认 |
| CLAUDE.md(全局+项目) | 引用已删 skill 路径 / 废弃工具 / 与 rules 重复 / blockquote 历史叙事 / TODO | 删行 / 更新 / 标记 |
~/.claude/rules/*.md | 被新规则覆盖的旧规则 / 引用不存在文件 / 与其他 rules 矛盾 | 删文件 / 更新 / 标记矛盾让用户选 |
安全约束:settings.json 任何改动必须用户逐条确认,不批量执行。
阶段4 验证检查清单
整理边界场景
| 场景 | 处理 |
|---|
| 项目无 memory/ | 跳过该对象,审计报告注明 |
| 首次整理,系统不完整 | 正常整理,自动创建缺失的 MEMORY.md |
| 全局和项目对同一事实矛盾 | 列"需用户确认",不自动删 |
| settings.json 破坏性改动 | 逐条确认,不批量 |
| 整理中发现"该记住的新信息" | 不提取(weaver 的事),只整理已有 |
| 单文件 memory | 跳过 ④⑤,只做 ①②③⑥⑦ |
| 审计中文件读取失败 | 跳过,列"无法读取"清单 |
| 写阶段发现外部修改 | 暂停,提示重新审计 |
审计计划展示格式(阶段2确认用)
## 整理计划(YYYY-MM-DD)
扫描范围:全局CC记忆(N文件) + 项目记忆(M文件) + 配置文件(K处)
### 建议删除(死链/过期/无用)
1. memory/xxx.md — 死链,MEMORY.md 引用但文件不存在
2. ...
### 建议合并(孤立/碎片)
1. memory/orphan.md 只剩1条 → 合并到 memory/dev-env.md
2. 同类"API凭据"分散3文件 → 合并为 memory/api-credentials.md
### 建议关联(未互链)
1. memory/a.md ↔ memory/b.md 同根因 → 加 [[wikilink]]
### 需用户确认(跨层矛盾)
1. 全局说"JDK 24" vs 项目说"JDK 21" — 以哪个为准?
### 配置文件过期
1. settings.json — MCP 配置引用已废弃服务
2. CLAUDE.md — 引用已删除 skill 路径(第X行)
要执行哪些?(全部 / 仅删除 / 仅合并 / 指定编号 / 取消)
位置矩阵
| 类型 \ 层级 | 全局 | 项目 | 子项目 |
|---|
| 偏好习惯 | 全局 MEMORY | 项目 feedback-style | — |
| 工具选择 | settings.json / 全局 CLAUDE.md | 项目 CLAUDE.md | 子项目 CLAUDE.md |
| 项目决策 | — | 项目 CLAUDE.md / memory | 子项目 CLAUDE.md |
| 踩坑记录 | — | 项目 dev-lessons | 子项目 memory |
| 个人特性 | 全局 MEMORY (user-profile) | — | — |
| 事实信息 | settings.json / 全局 MEMORY | dev-env.md / memory | 子项目 memory |
| 通用知识 | — | Obsidian wiki/ + memory 索引 | Obsidian wiki/ + memory 索引 |
融入规则(8条)
- 先搜后写 — 写入前 grep 目标文件 + MEMORY.md。没搜就写等于盲写。
- 更新优于追加 — 旧条目能覆盖就在原处改,不追新条目。例:旧"JDK 21"→ 新"JDK 24",改数字,不在文末加"对了现在用24了"。
- 矛盾以新为准 — 新旧冲突 → 新替旧,旧内容删除。不同时保留两版。
- 互补建立链接 — 新旧相关但不重叠 → 各自保留,互相引用(
[[wikilinks]] 或文件内链接)。
- 删除不留残骸 — 删内容后:文件变空 → 删文件+从索引移除;只剩一条 → 考虑合并到上级;多条 → 保留。
- 绝对时间 — 所有时间用
YYYY-MM-DD 格式。
- 一条一事 — 每个记忆条目只说一件事。
- 面向读者 — 下一个 agent 只有 5 秒扫过。
详细示例见 references/merge-examples.md。
优化建议(视情况,不强制)
| 条件 | 建议 |
|---|
| 同层同类记忆 > 3 条分散 | "要不要合并成一个文件?" |
| 删除后周边孤立 | "旁边的 X 也跟这条相关,要不要一起整理?" |
| ≤3 条且不孤立 | 不说,不增加对话噪音 |
特殊情况
模糊匹配:关键词匹配到多个结果 → 列出让用户选。
没匹配到(忘掉时):告知用户,确认是否换个关键词。
首次使用:记忆系统可能不完整,正常处理,写入时自动创建缺失的文件结构。
跨层信息:一条信息同时影响全局和项目 → 两边都写,全局写原则、项目写具体。