# Memory Keeper

> 即时记忆管理——将用户"记住"指令融入正确位置（全局/项目/子项目的记忆系统或配置文件）。也处理"忘掉"指令，删除后整理受影响的结构。还处理"整理"指令，对已有记忆做 L3 深度结构重构（去重/清死链/合并/重组/关联）。触发词："帮我把...加入记忆"、"你要记住..."、"以后也要记住"、"记住..."、"记下来"、"记住了"、"把这个存到记忆"、"忘了..."、"不用再记..."、"不要再记..."、"删掉...的记忆"、"清除..."、"整理记忆"、"整理一下记忆"、"整理全局记忆"、"整理项目记忆"。

- **Type:** Skill
- **Install:** `agentstack add skill-2021291696-weaver-evolve-memory-keeper`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [2021291696](https://agentstack.voostack.com/s/2021291696)
- **Installs:** 0
- **Category:** [Agent Skills](https://agentstack.voostack.com/c/agent-skills)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [2021291696](https://github.com/2021291696)
- **Source:** https://github.com/2021291696/weaver-evolve/tree/master/skills/memory-keeper

## Install

```sh
agentstack add skill-2021291696-weaver-evolve-memory-keeper
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# 记忆管理 — 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` 规则——宣布修好前先实际读确认）：

- [ ] Read 目标文件，确认新内容真在、格式没坏
- [ ] grep MEMORY.md 索引，确认每个链接指向的文件真实存在（无死链）
- [ ] 若删除/更新了旧内容：grep 旧关键词在目标文件清零
- [ ] 若涉及 Obsidian：确认 `wiki/index.md` 已更新、`wiki/log.md` 已追加

任一不过 → 回第6步补，**不宣布完成**。

## "忘掉"流程（6步）

### 1. 搜索匹配

grep MEMORY.md + 所有 memory 文件中匹配的内容。

如果只匹配到一个 → 继续。
如果匹配到多个 → 列出所有结果让用户选。
如果没匹配到 → 告知用户，确认是否换个关键词。

### 2. 展示确认

```
找到以下匹配：
1. [文件路径] — [内容摘要]
2. [文件路径] — [内容摘要]

要删除的是哪些？（全部删除 / 只删第N条 / 不删了）
```

### 3. 分析影响

```
删除 [文件路径] 中的"[...]"后：
- 该文件还剩 [N] 条内容
- MEMORY.md 索引需要更新 [是/否]
- 相关文件 [X] 中也有引用，需要调整 [是/否]
```

### 4. 展示影响

```
删除后我会：
- 删除 [文件路径] 中的对应内容
- 从 MEMORY.md 移除链接 [如果文件变空]
- 将剩余内容合并到 [上级文件] [如果只剩一条]
```

### 5. 用户确认

### 6. 执行删除 + 整理结构

删内容 + 更新索引 + 清理空文件 + 合并孤立条目。

删后验证（对齐 `verify-before-changing`——删完不等于删干净）：

- [ ] grep 已删内容的关键词，在所有 memory 文件清零
- [ ] grep MEMORY.md，确认对应索引链接已移除（无指向已删文件的死链）
- [ ] 若删了整个文件：确认该文件已不存在，无残留空文件

任一不过 → 补到干净为止，**不宣布完成**。

## "整理"流程（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 验证检查清单

- [ ] 每个改动文件 Read 一遍，确认内容真在、格式没坏
- [ ] MEMORY.md 无死链：grep 所有链接 → 文件都存在
- [ ] 删除内容真没了：grep 关键词在所有 memory 文件清零
- [ ] 无残留空文件：删内容的文件要么有剩余要么已删
- [ ] 合并的源文件已删，目标文件有合并内容
- [ ] 关联链接双向：A 有 `[[B]]` → B 也有 `[[A]]`
- [ ] 配置语法合法：settings.json JSON 解析验证；CLAUDE.md 无断裂引用
- [ ] 时间格式：`grep -E "今天|昨天|最近|刚刚"` 在改动文件清零

### 整理边界场景

| 场景 | 处理 |
|------|------|
| 项目无 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条）

1. **先搜后写** — 写入前 grep 目标文件 + MEMORY.md。没搜就写等于盲写。
2. **更新优于追加** — 旧条目能覆盖就在原处改，不追新条目。例：旧"JDK 21"→ 新"JDK 24"，改数字，不在文末加"对了现在用24了"。
3. **矛盾以新为准** — 新旧冲突 → 新替旧，旧内容删除。不同时保留两版。
4. **互补建立链接** — 新旧相关但不重叠 → 各自保留，互相引用（`[[wikilinks]]` 或文件内链接）。
5. **删除不留残骸** — 删内容后：文件变空 → 删文件+从索引移除；只剩一条 → 考虑合并到上级；多条 → 保留。
6. **绝对时间** — 所有时间用 `YYYY-MM-DD` 格式。
7. **一条一事** — 每个记忆条目只说一件事。
8. **面向读者** — 下一个 agent 只有 5 秒扫过。

详细示例见 `references/merge-examples.md`。

## 优化建议（视情况，不强制）

| 条件 | 建议 |
|------|------|
| 同层同类记忆 > 3 条分散 | "要不要合并成一个文件？" |
| 删除后周边孤立 | "旁边的 X 也跟这条相关，要不要一起整理？" |
| ≤3 条且不孤立 | 不说，不增加对话噪音 |

## 特殊情况

**模糊匹配**：关键词匹配到多个结果 → 列出让用户选。
**没匹配到**（忘掉时）：告知用户，确认是否换个关键词。
**首次使用**：记忆系统可能不完整，正常处理，写入时自动创建缺失的文件结构。
**跨层信息**：一条信息同时影响全局和项目 → 两边都写，全局写原则、项目写具体。

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [2021291696](https://github.com/2021291696)
- **Source:** [2021291696/weaver-evolve](https://github.com/2021291696/weaver-evolve)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-2021291696-weaver-evolve-memory-keeper
- Seller: https://agentstack.voostack.com/s/2021291696
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
