|
| 1 | +# Auto Dream — 自动记忆整理 |
| 2 | + |
| 3 | +## 概述 |
| 4 | + |
| 5 | +Auto Dream 是 Claude Code 的后台记忆整合机制。它在会话间自动审查、组织和修剪持久化记忆文件,确保未来会话能快速获得准确的上下文。 |
| 6 | + |
| 7 | +记忆系统存储在文件系统中(默认 `~/.claude/projects/<project-slug>/memory/`),由 `MEMORY.md` 索引文件和若干主题文件(如 `user_language.md`、`project_overview.md`)组成。随着会话积累,记忆会变得过时、冗余或矛盾——Dream 负责清理这些堆积。 |
| 8 | + |
| 9 | +## 架构 |
| 10 | + |
| 11 | +### 核心模块 |
| 12 | + |
| 13 | +| 模块 | 路径 | 职责 | |
| 14 | +|------|------|------| |
| 15 | +| 调度器 | `src/services/autoDream/autoDream.ts` | 时间/会话/锁三重门控,触发 forked agent | |
| 16 | +| 配置 | `src/services/autoDream/config.ts` | 读取 `isAutoDreamEnabled()` 开关 | |
| 17 | +| 提示词 | `src/services/autoDream/consolidationPrompt.ts` | 构建 4 阶段整理提示词 | |
| 18 | +| 锁文件 | `src/services/autoDream/consolidationLock.ts` | PID 锁 + mtime 作为 `lastConsolidatedAt` | |
| 19 | +| 任务 UI | `src/tasks/DreamTask/DreamTask.ts` | 后台任务注册,footer pill + Shift+Down 可见 | |
| 20 | +| 手动入口 | `src/skills/bundled/dream.ts` | `/dream` 命令,无条件可用 | |
| 21 | + |
| 22 | +### 记忆路径解析 |
| 23 | + |
| 24 | +优先级(`src/memdir/paths.ts`): |
| 25 | + |
| 26 | +1. `CLAUDE_COWORK_MEMORY_PATH_OVERRIDE` 环境变量(完整路径覆盖) |
| 27 | +2. `autoMemoryDirectory` 设置项(`settings.json`,支持 `~/` 展开) |
| 28 | +3. 默认:`<memoryBase>/projects/<sanitized-git-root>/memory/` |
| 29 | + |
| 30 | +其中 `memoryBase` = `CLAUDE_CODE_REMOTE_MEMORY_DIR` 或 `~/.claude`。 |
| 31 | + |
| 32 | +## 触发机制 |
| 33 | + |
| 34 | +### 自动触发(Auto Dream) |
| 35 | + |
| 36 | +每个对话轮次结束后,`executeAutoDream()` 按顺序检查三重门控: |
| 37 | + |
| 38 | +``` |
| 39 | +┌─────────────────────────────────────────────────────┐ |
| 40 | +│ Gate 1: 全局开关 │ |
| 41 | +│ isAutoMemoryEnabled() && isAutoDreamEnabled() │ |
| 42 | +│ 排除: KAIROS 模式 / Remote 模式 │ |
| 43 | +├─────────────────────────────────────────────────────┤ |
| 44 | +│ Gate 2: 时间门控 │ |
| 45 | +│ hoursSince(lastConsolidatedAt) >= minHours │ |
| 46 | +│ 默认: 24 小时 │ |
| 47 | +├─────────────────────────────────────────────────────┤ |
| 48 | +│ Gate 3: 会话门控 │ |
| 49 | +│ sessionsTouchedSince(lastConsolidatedAt) >= minSessions │ |
| 50 | +│ 默认: 5 个会话(排除当前会话) │ |
| 51 | +├─────────────────────────────────────────────────────┤ |
| 52 | +│ Lock: PID 锁文件 │ |
| 53 | +│ .consolidate-lock (mtime = lastConsolidatedAt) │ |
| 54 | +│ 死进程检测 + 1 小时过期 │ |
| 55 | +└─────────────────────────────────────────────────────┘ |
| 56 | +``` |
| 57 | + |
| 58 | +全部通过后,以 **forked agent**(受限子代理)方式运行整理任务: |
| 59 | + |
| 60 | +- Bash 工具限制为只读命令(`ls`、`grep`、`cat` 等) |
| 61 | +- 只能读写记忆目录内的文件 |
| 62 | +- 用户可在 Shift+Down 后台任务面板中查看进度或终止 |
| 63 | + |
| 64 | +### 手动触发(`/dream` 命令) |
| 65 | + |
| 66 | +通过 `/dream` 命令随时触发,无门控限制: |
| 67 | + |
| 68 | +- 在主循环中运行(非 forked agent),拥有完整工具权限 |
| 69 | +- 用户可实时观察操作过程 |
| 70 | +- 执行前自动更新锁文件 mtime |
| 71 | + |
| 72 | +### 配置开关 |
| 73 | + |
| 74 | +| 开关 | 位置 | 作用 | |
| 75 | +|------|------|------| |
| 76 | +| `autoDreamEnabled` | `settings.json` | `true`/`false` 显式开关 | |
| 77 | +| `autoMemoryEnabled` | `settings.json` | 总开关,关闭后所有记忆功能禁用 | |
| 78 | +| `CLAUDE_CODE_DISABLE_AUTO_MEMORY` | 环境变量 | `1`/`true` 关闭所有记忆功能 | |
| 79 | +| `tengu_onyx_plover` | GrowthBook | 官方远程配置,控制 `enabled`/`minHours`/`minSessions` | |
| 80 | + |
| 81 | +默认值(无 GrowthBook 连接时): |
| 82 | + |
| 83 | +```typescript |
| 84 | +minHours: 24 // 距上次整理至少 24 小时 |
| 85 | +minSessions: 5 // 至少有 5 个新会话 |
| 86 | +``` |
| 87 | + |
| 88 | +## 整理流程(4 阶段) |
| 89 | + |
| 90 | +Dream agent 执行的提示词包含 4 个阶段: |
| 91 | + |
| 92 | +### Phase 1 — 定位(Orient) |
| 93 | + |
| 94 | +- `ls` 记忆目录,查看现有文件 |
| 95 | +- 读取 `MEMORY.md` 索引 |
| 96 | +- 浏览现有主题文件,避免重复创建 |
| 97 | + |
| 98 | +### Phase 2 — 采集信号(Gather) |
| 99 | + |
| 100 | +按优先级收集新信息: |
| 101 | + |
| 102 | +1. **日志文件**(`logs/YYYY/MM/YYYY-MM-DD.md`,KAIROS 模式下的追加式日志) |
| 103 | +2. **过时记忆** — 与当前代码库状态矛盾的事实 |
| 104 | +3. **会话记录** — 窄关键词 grep JSONL 文件(不全文读取) |
| 105 | + |
| 106 | +### Phase 3 — 整合(Consolidate) |
| 107 | + |
| 108 | +- 合并新信号到现有主题文件,而非创建近似重复 |
| 109 | +- 将相对日期("昨天"、"上周")转为绝对日期 |
| 110 | +- 删除被推翻的事实 |
| 111 | + |
| 112 | +### Phase 4 — 修剪与索引(Prune) |
| 113 | + |
| 114 | +- `MEMORY.md` 保持在 200 行以内、25KB 以内 |
| 115 | +- 每条索引项一行,不超过 150 字符 |
| 116 | +- 移除过时/错误/被取代的指针 |
| 117 | + |
| 118 | +## 记忆类型 |
| 119 | + |
| 120 | +记忆系统使用 4 种类型(`src/memdir/memoryTypes.ts`): |
| 121 | + |
| 122 | +| 类型 | 用途 | 示例 | |
| 123 | +|------|------|------| |
| 124 | +| `user` | 用户角色、偏好、知识 | 用户是高级后端工程师,偏好中文交流 | |
| 125 | +| `feedback` | 工作方式指导 | 不要 mock 数据库测试;代码审查用 bundled PR | |
| 126 | +| `project` | 项目上下文(非代码可推导的) | 合并冻结从 3 月 5 日开始;认证重写是合规需求 | |
| 127 | +| `reference` | 外部系统指针 | Linear INGEST 项目跟踪 pipeline bugs | |
| 128 | + |
| 129 | +**不保存的内容**:代码模式、架构、文件路径(可从代码推导);Git 历史(`git log` 权威);调试方案(代码中已有)。 |
| 130 | + |
| 131 | +## 锁文件机制 |
| 132 | + |
| 133 | +`.consolidate-lock` 文件位于记忆目录内: |
| 134 | + |
| 135 | +- **文件内容**:持有者 PID |
| 136 | +- **mtime**:即 `lastConsolidatedAt` 时间戳 |
| 137 | +- **过期**:1 小时(防 PID 复用) |
| 138 | +- **竞态处理**:双进程同时写入时,后读验证 PID,失败者退出 |
| 139 | +- **回滚**:forked agent 失败或被用户终止时,mtime 回退到获取前的值 |
| 140 | + |
| 141 | +## 使用场景 |
| 142 | + |
| 143 | +### 场景 1:日常开发中的自动整理 |
| 144 | + |
| 145 | +开发者连续多天使用 Claude Code 处理不同任务。Auto Dream 在积累 5+ 个会话且距上次整理 24 小时后自动触发,整合分散在多次会话中的用户偏好和项目决策。 |
| 146 | + |
| 147 | +### 场景 2:手动整理记忆 |
| 148 | + |
| 149 | +用户发现 Claude 重复犯相同错误或遗忘之前的决策。输入 `/dream` 立即触发整理,无需等待自动触发周期。 |
| 150 | + |
| 151 | +### 场景 3:新会话快速上下文 |
| 152 | + |
| 153 | +新会话启动时,`MEMORY.md` 被加载到上下文中。经过 Dream 整理的记忆文件结构清晰、信息准确,让 Claude 快速了解用户和项目。 |
| 154 | + |
| 155 | +### 场景 4:KAIROS 模式下的日志蒸馏 |
| 156 | + |
| 157 | +KAIROS(长驻助手模式)中,agent 以追加方式写入日期日志文件。Dream 负责将这些日志蒸馏为主题文件和 `MEMORY.md` 索引。 |
| 158 | + |
| 159 | +## 与其他系统的关系 |
| 160 | + |
| 161 | +``` |
| 162 | +┌─────────────┐ ┌──────────────┐ ┌───────────────┐ |
| 163 | +│ 会话交互 │────▶│ 记忆写入 │────▶│ MEMORY.md │ |
| 164 | +│ (主 agent) │ │ (即时保存) │ │ + 主题文件 │ |
| 165 | +└─────────────┘ └──────────────┘ └───────┬───────┘ |
| 166 | + │ |
| 167 | + ┌───────────────────────────────────────┘ |
| 168 | + ▼ |
| 169 | +┌──────────────┐ ┌──────────────┐ |
| 170 | +│ Auto Dream │────▶│ 整理/修剪 │ |
| 171 | +│ (后台触发) │ │ 去重/纠错 │ |
| 172 | +└──────────────┘ └──────────────┘ |
| 173 | + ▲ |
| 174 | +┌──────────────┐ |
| 175 | +│ /dream 命令 │ |
| 176 | +│ (手动触发) │ |
| 177 | +└──────────────┘ |
| 178 | +``` |
| 179 | + |
| 180 | +- **extractMemories**(`src/services/extractMemories/`):每轮次结束时从对话中提取新记忆并写入。Dream 不负责提取,只负责整理。 |
| 181 | +- **CLAUDE.md**:项目级指令文件,加载到上下文中但不属于记忆系统。 |
| 182 | +- **Team Memory**(`TEAMMEM` feature):团队共享记忆目录,与个人记忆使用相同的 Dream 机制。 |
0 commit comments