AINightCoder/dsh-claude-memory

Read Claude Code's memory layer from DeepSeek Harness: auto-injected index over ~/.claude/memory and ~/.claude/projects/<key>/memory, plus read/write tools over the same files.

★ 0Forks 0JavaScriptGitHub ↗Compare

README

dsh-claude-memory

让 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,在此原样复用。

License

MIT

Contributors

AINightCoder

Issues