Files
claude-code/docs/features/auto-dream.md
2026-04-04 16:28:09 +08:00

183 lines
8.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Auto Dream — 自动记忆整理
## 概述
Auto Dream 是 Claude Code 的后台记忆整合机制。它在会话间自动审查、组织和修剪持久化记忆文件,确保未来会话能快速获得准确的上下文。
记忆系统存储在文件系统中(默认 `~/.claude/projects/<project-slug>/memory/`),由 `MEMORY.md` 索引文件和若干主题文件(如 `user_language.md``project_overview.md`组成。随着会话积累记忆会变得过时、冗余或矛盾——Dream 负责清理这些堆积。
## 架构
### 核心模块
| 模块 | 路径 | 职责 |
|------|------|------|
| 调度器 | `src/services/autoDream/autoDream.ts` | 时间/会话/锁三重门控,触发 forked agent |
| 配置 | `src/services/autoDream/config.ts` | 读取 `isAutoDreamEnabled()` 开关 |
| 提示词 | `src/services/autoDream/consolidationPrompt.ts` | 构建 4 阶段整理提示词 |
| 锁文件 | `src/services/autoDream/consolidationLock.ts` | PID 锁 + mtime 作为 `lastConsolidatedAt` |
| 任务 UI | `src/tasks/DreamTask/DreamTask.ts` | 后台任务注册footer pill + Shift+Down 可见 |
| 手动入口 | `src/skills/bundled/dream.ts` | `/dream` 命令,无条件可用 |
### 记忆路径解析
优先级(`src/memdir/paths.ts`
1. `CLAUDE_COWORK_MEMORY_PATH_OVERRIDE` 环境变量(完整路径覆盖)
2. `autoMemoryDirectory` 设置项(`settings.json`,支持 `~/` 展开)
3. 默认:`<memoryBase>/projects/<sanitized-git-root>/memory/`
其中 `memoryBase` = `CLAUDE_CODE_REMOTE_MEMORY_DIR``~/.claude`
## 触发机制
### 自动触发Auto Dream
每个对话轮次结束后,`executeAutoDream()` 按顺序检查三重门控:
```
┌─────────────────────────────────────────────────────┐
│ Gate 1: 全局开关 │
│ isAutoMemoryEnabled() && isAutoDreamEnabled() │
│ 排除: KAIROS 模式 / Remote 模式 │
├─────────────────────────────────────────────────────┤
│ Gate 2: 时间门控 │
│ hoursSince(lastConsolidatedAt) >= minHours │
│ 默认: 24 小时 │
├─────────────────────────────────────────────────────┤
│ Gate 3: 会话门控 │
│ sessionsTouchedSince(lastConsolidatedAt) >= minSessions │
│ 默认: 5 个会话(排除当前会话) │
├─────────────────────────────────────────────────────┤
│ Lock: PID 锁文件 │
│ .consolidate-lock (mtime = lastConsolidatedAt) │
│ 死进程检测 + 1 小时过期 │
└─────────────────────────────────────────────────────┘
```
全部通过后,以 **forked agent**(受限子代理)方式运行整理任务:
- Bash 工具限制为只读命令(`ls``grep``cat` 等)
- 只能读写记忆目录内的文件
- 用户可在 Shift+Down 后台任务面板中查看进度或终止
### 手动触发(`/dream` 命令)
通过 `/dream` 命令随时触发,无门控限制:
- 在主循环中运行(非 forked agent拥有完整工具权限
- 用户可实时观察操作过程
- 执行前自动更新锁文件 mtime
### 配置开关
| 开关 | 位置 | 作用 |
|------|------|------|
| `autoDreamEnabled` | `settings.json` | `true`/`false` 显式开关 |
| `autoMemoryEnabled` | `settings.json` | 总开关,关闭后所有记忆功能禁用 |
| `CLAUDE_CODE_DISABLE_AUTO_MEMORY` | 环境变量 | `1`/`true` 关闭所有记忆功能 |
| `tengu_onyx_plover` | GrowthBook | 官方远程配置,控制 `enabled`/`minHours`/`minSessions` |
默认值(无 GrowthBook 连接时):
```typescript
minHours: 24 // 距上次整理至少 24 小时
minSessions: 5 // 至少有 5 个新会话
```
## 整理流程4 阶段)
Dream agent 执行的提示词包含 4 个阶段:
### Phase 1 — 定位Orient
- `ls` 记忆目录,查看现有文件
- 读取 `MEMORY.md` 索引
- 浏览现有主题文件,避免重复创建
### Phase 2 — 采集信号Gather
按优先级收集新信息:
1. **日志文件**`logs/YYYY/MM/YYYY-MM-DD.md`KAIROS 模式下的追加式日志)
2. **过时记忆** — 与当前代码库状态矛盾的事实
3. **会话记录** — 窄关键词 grep JSONL 文件(不全文读取)
### Phase 3 — 整合Consolidate
- 合并新信号到现有主题文件,而非创建近似重复
- 将相对日期("昨天"、"上周")转为绝对日期
- 删除被推翻的事实
### Phase 4 — 修剪与索引Prune
- `MEMORY.md` 保持在 200 行以内、25KB 以内
- 每条索引项一行,不超过 150 字符
- 移除过时/错误/被取代的指针
## 记忆类型
记忆系统使用 4 种类型(`src/memdir/memoryTypes.ts`
| 类型 | 用途 | 示例 |
|------|------|------|
| `user` | 用户角色、偏好、知识 | 用户是高级后端工程师,偏好中文交流 |
| `feedback` | 工作方式指导 | 不要 mock 数据库测试;代码审查用 bundled PR |
| `project` | 项目上下文(非代码可推导的) | 合并冻结从 3 月 5 日开始;认证重写是合规需求 |
| `reference` | 外部系统指针 | Linear INGEST 项目跟踪 pipeline bugs |
**不保存的内容**代码模式、架构、文件路径可从代码推导Git 历史(`git log` 权威);调试方案(代码中已有)。
## 锁文件机制
`.consolidate-lock` 文件位于记忆目录内:
- **文件内容**:持有者 PID
- **mtime**:即 `lastConsolidatedAt` 时间戳
- **过期**1 小时(防 PID 复用)
- **竞态处理**:双进程同时写入时,后读验证 PID失败者退出
- **回滚**forked agent 失败或被用户终止时mtime 回退到获取前的值
## 使用场景
### 场景 1日常开发中的自动整理
开发者连续多天使用 Claude Code 处理不同任务。Auto Dream 在积累 5+ 个会话且距上次整理 24 小时后自动触发,整合分散在多次会话中的用户偏好和项目决策。
### 场景 2手动整理记忆
用户发现 Claude 重复犯相同错误或遗忘之前的决策。输入 `/dream` 立即触发整理,无需等待自动触发周期。
### 场景 3新会话快速上下文
新会话启动时,`MEMORY.md` 被加载到上下文中。经过 Dream 整理的记忆文件结构清晰、信息准确,让 Claude 快速了解用户和项目。
### 场景 4KAIROS 模式下的日志蒸馏
KAIROS长驻助手模式agent 以追加方式写入日期日志文件。Dream 负责将这些日志蒸馏为主题文件和 `MEMORY.md` 索引。
## 与其他系统的关系
```
┌─────────────┐ ┌──────────────┐ ┌───────────────┐
│ 会话交互 │────▶│ 记忆写入 │────▶│ MEMORY.md │
│ (主 agent) │ │ (即时保存) │ │ + 主题文件 │
└─────────────┘ └──────────────┘ └───────┬───────┘
┌───────────────────────────────────────┘
┌──────────────┐ ┌──────────────┐
│ Auto Dream │────▶│ 整理/修剪 │
│ (后台触发) │ │ 去重/纠错 │
└──────────────┘ └──────────────┘
┌──────────────┐
│ /dream 命令 │
│ (手动触发) │
└──────────────┘
```
- **extractMemories**`src/services/extractMemories/`每轮次结束时从对话中提取新记忆并写入。Dream 不负责提取,只负责整理。
- **CLAUDE.md**:项目级指令文件,加载到上下文中但不属于记忆系统。
- **Team Memory**`TEAMMEM` feature团队共享记忆目录与个人记忆使用相同的 Dream 机制。