让 DeepSeek Harness(dsh)读取 Claude Code 的记忆层,自动注入,并共用同一批文件。
Claude Code 在 ~/.claude 下分两层,而 dsh 原生只认其中一层:
| 全局 | 项目 | dsh 原生支持 | |
|---|---|---|---|
| 规则 | ~/.claude/CLAUDE.md |
<项目>/CLAUDE.md |
✅ dsh-agent-instructions 把 CLAUDE.md 与 AGENTS.md 并列为候选 |
| 记忆 | ~/.claude/memory/ |
~/.claude/projects/<sanitized-cwd>/memory/ |
❌ 完全不认 |
dsh 自带的 195 个包里没有任何 memory 插件,也搜不到读 .claude/memory 的代码。结果是:你在 Claude Code 里沉淀的记忆,dsh 看不见。
本插件补上这一层,不新建第三套存储,直接读写 Claude Code 的原始文件。
dsh plugin --profile web add -w github:AINightCoder/dsh-claude-memory无构建步骤(lib/ 已提交),所以不需要在 pnpm-workspace.yaml 里配 allowBuilds。装完重启 dsh web 或 dsh-tui。
自动注入:每次组装提示词时,读取全局与当前项目的 MEMORY.md,把索引行注入上下文。
以下内容来自本地持久记忆索引(MEMORY.md)。...
全局记忆
- [用户基本信息](user_profile.md) - 姓名、生日、性格、家庭、时区
- [目标与核心原则](user_goals.md) - 终极目标、核心原则和当前项目优先级
当前项目记忆
- [Git 换行符约定](feedback_git_eol_lf.md) - 本仓库统一 LF
只注入索引,不注入正文。 正文由模型按需通过 claude_memory_get 读取,所以记忆条目再多,常驻开销也是平的。每层默认上限 12 条。
工具:
| 工具 | 作用 |
|---|---|
claude_memory_list |
列出记忆条目(不含正文);不传 scope 时两层都列 |
claude_memory_get |
按文件名读取某条记忆的完整正文 |
claude_memory_save |
写入一条持久记忆,Claude Code 那边立即可见 |
claude_memory_forget |
按文件名删除 |
项目记忆目录名是绝对路径把 :、\、/、. 全部替换成 -:
D:\Git\Unity\FrontKingTD -> ~/.claude/projects/D--Git-Unity-FrontKingTD/memory/
与 Claude Code 官方一致,实测吻合。
# ~/.dsh/cordis.patch.yml 或 profiles/<名>/cordis.patch.yml
- id: claude-memory
config:
maxEntriesPerScope: 12 # 每层注入的条目上限
claudeDirName: .claude # 目录名,一般不用改
homeDir: ~ # 家目录,一般不用改同步读取,没有缓存。 systemPrompt.context 的 provider 是同步的。第一版用异步缓存绕开,结果新会话的首轮永远读不到记忆,而首轮恰恰最需要。改成每次装配同步读两个小索引文件后,缓存、失效和过期窗口整套机制都删掉了,代码更短也更正确。
只有 host 面,没有浏览器半边。 注入和工具都从 host 平面生效,不需要自建 agent preset,web 与 TUI 通用。
存储层 lib/memory-store.js 来自作者为 OpenCode 写的 claude-memory-local 插件,纯 Node fs 实现、不依赖任何宿主 API,在此原样复用。
MIT