关于 dream
dream 是面向 Claude Code 的记忆整理技能,定期从会话记录中提取偏好、纠正和决策,并合并到现有记忆文件。它支持多种记忆目录布局,并通过钩子触发后台整理、清理过期内容和维护索引。
主要功能
- 01识别多种记忆系统布局
- 02从近期会话提取重要信息
- 03合并并更新主题记忆文件
- 04清理过期或矛盾条目
- 05维护记忆索引与行数限制
- 06通过 Claude Code 钩子定期触发
适用场景
- 01定期整理 Claude Code 会话记忆
- 02将用户偏好与纠正写入记忆
- 03清理过期或重复的记忆条目
- 04为多个项目维护精简记忆索引
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ grandamenium/ dream-skill --skill dream安装后在 Claude Code 中输入/dream确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
test-dream.shinstall.shshould-dream.shREADME.mddream-hook.sh详细介绍
Dream - Claude Code 的记忆整合
你的 AI Agent 也会像你一样做梦。在你睡觉时整合记忆。
入门指南(设置完成后删除本节)
欢迎!请按顺序完成以下步骤。确认设置无误后,最后删除本文件中 ## ONBOARDING 与 ## END ONBOARDING 之间的所有内容。
第 1 步:检测记忆系统
首先,检测正在使用的记忆系统。运行以下检查:
# Check 1: Native Claude Code auto-memory
ls ~/.claude/projects/*/memory/MEMORY.md 2>/dev/null && echo "DETECTED: native-claude-code"
# Check 2: OpenClaw-style (memory/ folder in project root with daily logs)
ls ./memory/20*.md 2>/dev/null && echo "DETECTED: openclaw-daily-logs"
# Check 3: Project-root MEMORY.md (custom setup)
ls ./MEMORY.md 2>/dev/null && echo "DETECTED: project-root-memory"
# Check 4: Nothing found
echo "If none detected above: no memory system found"
根据检测结果,设置 DREAM_MEMORY_TYPE:
| 检测结果 | DREAM_MEMORY_TYPE | 记忆位置 | 会话记录 |
|---|---|---|---|
存在 ~/.claude/projects/*/memory/MEMORY.md | native | ~/.claude/projects/<project>/memory/ | ~/.claude/projects/<project>/sessions/*.jsonl |
存在 ./memory/20*.md 每日日志文件 | openclaw | ./memory/(项目根目录) | ~/.claude/projects/<project>/sessions/*.jsonl |
项目根目录中存在 ./MEMORY.md | project-root | ./(项目根目录,MEMORY.md + 主题文件) | ~/.claude/projects/<project>/sessions/*.jsonl |
| 未找到任何内容 | native(默认) | ~/.claude/projects/<project>/memory/ | ~/.claude/projects/<project>/sessions/*.jsonl |
如果未找到记忆系统,默认使用原生 Claude Code 记忆。 这是标准配置,无需额外设置——启用自动记忆后,Claude Code 会自动创建目录。
将检测到的类型写入配置,以便 dream 知道要查找的位置:
echo "DREAM_MEMORY_TYPE=native" > ~/.claude/skills/dream/.dream-config
echo "DREAM_MEMORY_PATH=~/.claude/projects" >> ~/.claude/skills/dream/.dream-config
如果检测到的是 openclaw 或 project-root,请将 native 替换为相应类型。对于 openclaw 或 project-root,还需设置路径:
# For openclaw:
echo "DREAM_MEMORY_TYPE=openclaw" > ~/.claude/skills/dream/.dream-config
echo "DREAM_MEMORY_PATH=$(pwd)/memory" >> ~/.claude/skills/dream/.dream-config
# For project-root:
echo "DREAM_MEMORY_TYPE=project-root" > ~/.claude/skills/dream/.dream-config
echo "DREAM_MEMORY_PATH=$(pwd)" >> ~/.claude/skills/dream/.dream-config
第 2 步:安装 Stop 钩子
将 dream 触发器添加到 Claude Code 设置中:
SETTINGS="$HOME/.claude/settings.json"
[ ! -f "$SETTINGS" ] && echo '{}' > "$SETTINGS"
python3 -c "
import json
with open('$HOME/.claude/settings.json') as f:
s = json.load(f)
s.setdefault('hooks', {}).setdefault('Stop', [])
if not any('dream' in h.get('command','') for h in s['hooks']['Stop']):
s['hooks']['Stop'].append({
'type': 'command',
'command': 'bash \$HOME/.claude/skills/dream/should-dream.sh && touch \$HOME/.claude/.dream-pending || true'
})
with open('$HOME/.claude/settings.json', 'w') as f:
json.dump(s, f, indent=2)
f.write('\n')
print('Stop hook installed')
"
作用: 退出任何 Claude Code 会话时,Stop 钩子会检查距上次 dream 是否已过去 24 小时或更久。如果是,则创建 .dream-pending 标记文件。下次启动会话时,Claude 会看到该标记,并以后台子 Agent 的方式运行 /dream。
第 3 步:安装会话启动检查
将以下内容添加到全局 ~/.claude/CLAUDE.md(或项目的 CLAUDE.md)中:
## Auto Dream
If the file `~/.claude/.dream-pending` exists at session start, run `/dream` as a subagent in the background, then delete the flag file: `rm ~/.claude/.dream-pending`. This is the memory consolidation system - it runs automatically every 24 hours.
第 4 步:将 should-dream.sh 设为可执行文件
chmod +x ~/.claude/skills/dream/should-dream.sh
第 5 步:测试
运行一次测试 dream,验证整个流程:
# Force the dream to trigger by creating the flag
touch ~/.claude/.dream-pending
然后告诉 Claude:“.dream-pending 标记已存在。现在运行 /dream。”
完成后,请确认:
- 标记文件
~/.claude/.dream-pending已删除 - 已检查并整合记忆文件
- 已在记忆目录中写入
.last-dream时间戳 - 记忆文件中不再有相对日期
- MEMORY.md 索引少于 200 行
第 6 步:清理入门指南
一切正常。现在从此 SKILL.md 文件中删除整个入门指南部分(即 ## ONBOARDING 与 ## END ONBOARDING 之间的所有内容)。技能已完成设置,将通过 Stop 钩子每 24 小时自动触发一次。
END ONBOARDING
工作原理
Dream 分 4 个连续阶段运行。请按顺序执行,不要跳过任何阶段。
ORIENT --> GATHER SIGNAL --> CONSOLIDATE --> PRUNE & INDEX
自动触发流程(原生 Claude Code 钩子)
Session ends
--> Stop hook fires should-dream.sh (~10ms)
--> Checks: 24hrs passed? 5+ sessions?
--> If NO: exits silently, zero overhead
--> If YES: creates ~/.claude/.dream-pending flag
Next session starts
--> Claude reads CLAUDE.md, sees .dream-pending exists
--> Spawns /dream as background subagent
--> Dream runs all 4 phases
--> Writes .last-dream timestamp, deletes .dream-pending
--> Timer resets for next 24hrs
阶段 1:定向
目标: 在进行任何更改之前,了解记忆的当前状态。
步骤 0:读取配置
cat ~/.claude/skills/dream/.dream-config 2>/dev/null || echo "DREAM_MEMORY_TYPE=native"
这会告诉你要处理哪种记忆系统:
native- 扫描~/.claude/projects/*/memory/openclaw- 扫描项目根目录中的memory/文件夹(每日日志 + MEMORY.md)project-root- 扫描项目根目录中的 MEMORY.md 和主题文件
步骤
- 根据类型查找记忆目录:
# native (default)
ls -d ~/.claude/projects/*/memory/ 2>/dev/null
# openclaw
ls ./memory/ 2>/dev/null
# project-root
ls ./MEMORY.md ./memory/ 2>/dev/null
- 读取检测到类型对应的记忆目录:
# native
ls ~/.claude/projects/*/memory/ 2>/dev/null
# openclaw - also list daily logs
ls ./memory/*.md 2>/dev/null
-
读取每个项目记忆目录中的
MEMORY.md(索引文件)。记录:- 主题文件的数量
- MEMORY.md 的总行数
- 最后修改日期
- 看起来已过时的条目(例如没有参照日期的相对日期,如“昨天”“上周”)
-
阅读每个主题文件,了解其中已有的内容。
本阶段产出
现在你应该已经对以下内容有了初步了解:
- 哪些项目有记忆文件
- 涵盖了哪些主题
- 记忆文件有多大
- 哪些内容可能已过时或存在矛盾
第 2 阶段:收集信号
目标: 从近期会话中提取重要信息,无需通读所有内容。
在哪里查找会话记录
find ~/.claude/projects/*/sessions/ -name "*.jsonl" -mtime -7 2>/dev/null | sort -t/ -k6 -r
此命令会查找过去 7 天内修改的 JSONL 会话文件,并按时间从新到旧排序。可调整 -mtime -7 来设置不同的时间范围。
扫描哪些内容
使用定向 grep,而不是通读文件。每个模式都针对一种特定的信号类型:
用户更正(优先级最高):
grep -il "actually\|no,\|wrong\|incorrect\|not right\|stop doing\|don't do\|I said\|I meant\|that's not\|correction" ~/.claude/projects/*/sessions/*.jsonl 2>/dev/null
偏好和配置:
grep -il "I prefer\|always use\|never use\|I like\|I don't like\|I want\|from now on\|going forward\|remember that\|keep in mind\|make sure to\|default to" ~/.claude/projects/*/sessions/*.jsonl 2>/dev/null
重要决策:
grep -il "let's go with\|I decided\|we're using\|the plan is\|switch to\|move to\|chosen\|picked\|decision\|we agreed" ~/.claude/projects/*/sessions/*.jsonl 2>/dev/null
重复出现的模式:
grep -il "again\|every time\|keep forgetting\|as usual\|same as before\|like last time\|we always\|the usual" ~/.claude/projects/*/sessions/*.jsonl 2>/dev/null
如何阅读匹配结果
对于每个匹配的文件,只阅读匹配项周围的上下文(不要通读整个会话)。JSONL 文件每行包含一个 JSON 对象。重点查看 type 为 "human" 的行(用户消息)以及紧接其后的 "assistant" 回复。
grep -n "I prefer\|always use\|never use" <session_file> | head -20
提取哪些内容
对于每项发现,记录:
- 事实 - 说了什么或做了什么决定
- 日期 - 根据会话文件的修改时间推断
- 置信度 - 是明确指示(高),还是隐含偏好(中)?
- 矛盾 - 这是否与当前记忆中的内容冲突?
第 3 阶段:整合
目标: 将新发现合并到现有记忆中。这是最需要谨慎处理的阶段。
规则
-
绝不重复。 添加任何内容之前,先检查记忆中是否已有该内容。如果已有,就更新现有条目,而不是新建条目。
-
将相对日期转换为绝对日期。 如果 3 月 15 日的会话中说“昨天我更改了 API 密钥”,就在记忆中写入“2026-03-14:更改了 API 密钥”。绝不要记录“昨天”或“上周”。
-
删除与新事实矛盾的内容。 如果记忆中写着“偏好使用制表符”,但近期会话中用户说“使用空格”,就删除旧条目并写入新条目。添加备注:“(更新于 YYYY-MM-DD,先前为:制表符)”。
-
保留来源归属。 添加新的记忆条目时,注明来源:“(来自 YYYY-MM-DD 的会话)”。
-
按主题组织文件。 将相关记忆归入主题文件:
preferences.md- 用户喜欢的处理方式decisions.md- 选择及其理由corrections.md- 用户更正过的内容patterns.md- 重复出现的工作流、常见任务facts.md- 项目专属知识、架构说明- 只有现有文件都不适用时,才创建新的主题文件
-
条目格式。 每条记忆都应简洁:
- [YYYY-MM-DD] The fact or preference. (source: session, confidence: high/medium)
如何写入
使用 Edit 工具修改现有记忆文件,或使用 Write 创建新的主题文件。编辑文件前务必先阅读文件内容。
第 4 阶段:清理并建立索引
目标: 让 MEMORY.md 保持精简,作为索引使用。删除过时内容,并遵守大小限制。
MEMORY.md 规则
MEMORY.md 是索引文件,不是内容存储文件。其中应包含:
- 指向主题文件的链接或引用
- 对每个主题文件内容的简短(一行)总结
- 每个主题文件的最后更新日期
MEMORY.md 绝不应包含:
- 完整的记忆条目(这些应放在主题文件中)
- 冗长的描述
- 主题文件中已有的重复内容
大小限制:200 行
如果整合后 MEMORY.md 超过 200 行:
- 将其中的内联内容移到相应的主题文件
- 将冗长条目替换为一行摘要和链接
- 删除指向已删除或为空的主题文件的条目
- 如果仍超过 200 行,将最旧的条目移至
archive.md主题文件
清理过时条目
删除或归档以下条目:
- 超过 90 天且近期会话中没有提及的条目
- 与较新条目矛盾的条目(应已在第 3 阶段发现)
- 涉及
~/.claude/projects/中已不存在的项目或仓库的条目
最终索引格式
# Memory Index
Last consolidated: YYYY-MM-DD
## Topic Files
| File | Summary | Updated |
|------|---------|---------|
| preferences.md | Editor, formatting, communication style preferences | YYYY-MM-DD |
| decisions.md | Architecture choices, tool selections, project direction | YYYY-MM-DD |
| corrections.md | Past mistakes to avoid repeating | YYYY-MM-DD |
| patterns.md | Common workflows and recurring tasks | YYYY-MM-DD |
| facts.md | Project knowledge, API details, system architecture | YYYY-MM-DD |
## Quick Reference
- Fact 1
- Fact 2
“快速参考”部分用于记录每次加载记忆时都应看到的重要事实。最多保留 10 项。
记录梦境时间戳
完成全部 4 个阶段后,写入时间戳,让自动触发器知道你上次做梦的时间:
date +%s > ~/.claude/projects/<project>/memory/.last-dream
rm -f ~/.claude/.dream-pending
安全
- 切勿在没有替换内容的情况下删除记忆。 如果移除某条记录,要么是因为它已被证伪(由更新的记录替代),要么是因为它已被移至主题文件或归档。切勿直接删除。
- 首次运行前备份。 首次针对某个项目运行时,复制记忆目录:
cp -r ~/.claude/projects/<project>/memory/ ~/.claude/projects/<project>/memory-backup-$(date +%Y%m%d)/
- 试运行选项。 首次使用时,阅读全部 4 个阶段,但只打印你将要进行的更改,不写入任何内容。应用更改前请先征求用户确认。
验证
运行后,验证整合结果:
- 对 MEMORY.md 运行
wc -l——行数应少于 200 行 - 检查主题文件中是否存在重复条目
- 确认没有剩余的相对日期(“昨天”“上周”等)
- 验证 MEMORY.md 中引用的所有主题文件确实存在
- 打印摘要:新增条目、已更新条目、已归档条目、已解决的矛盾