dsh-project-automemory
面向 DeepSeek Harness(DSH)的项目级自动记忆插件。为每个项目在 DSH 主目录下建立独立的私有记忆目录,每次对话自动加载该项目记忆,并提供 memory 工具让模型维护记忆。
记忆保存在项目目录之外,因此:
- 不会像
~/.dsh/AGENTS.md那样被所有项目共享、相互干扰; - 不会像项目里的
AGENTS.md那样被同一目录下其他 agent 读到; - 换到另一个项目开会话时,加载的是另一个项目的记忆。
设计取向参考 Claude Code 的 auto memory:项目私有、自动加载、模型可维护、人类可读。
分发方式:通过 GitHub(Git)安装,不发布 npm 包。仓库内的
index.js/lib/是可直接运行的 ES 模块,无构建步骤。
安装
需要 DSH 版本 ^0.2.1-rc.5(包内已声明 engines.dsh,不匹配的 DSH 版本会拒绝激活该 bundle)。
方式一:Git 安装(推荐)
在 DSH Web 的 Plugins 页面选择从 Git 安装,输入仓库地址:
https://github.com/ThereWasAYang/dsh-project-automemory.git
或使用 CLI:
dsh plugin --profile <profile> add https://github.com/ThereWasAYang/dsh-project-automemory.git
也可以让 agent 调 plugin_manager:
install_bundle target = https://github.com/ThereWasAYang/dsh-project-automemory.git
固定到某个版本(推荐,避免跟随 main 漂移):
install_bundle target = https://github.com/ThereWasAYang/dsh-project-automemory.git#v0.1.0
方式二:本地目录(开发用)
install_bundle target = /path/to/dsh-project-automemory
安装后对新会话立即生效;已存在的会话会在下一轮对话开始时加载记忆。
更新
DSH 目前只为 registry 包提供版本更新按钮,Git 安装需要"移除后重装":
remove_bundle target = dsh-project-automemory
install_bundle target = https://github.com/ThereWasAYang/dsh-project-automemory.git
或重新执行一次 CLI 的 dsh plugin ... add <git 地址> 前先 remove。
记忆目录
$DSH_HOME/projects/<项目 slug>/memory/ # 默认 ~/.dsh/projects/...
├── .project.json # 记忆身份:绝对项目路径 + 创建时间
├── MEMORY.md # 索引(默认第一个加载)
└── topics/… # 细节文件,通过 memory 工具按需读写
- 项目:从会话工作目录向上找到第一个包含
.git的目录作为项目根;找不到时就用工作目录本身。可通过projectRootMarkers配置改变标记名。 - slug:把项目绝对路径中除
[A-Za-z0-9_-]外的字符替换成-,例如/Users/yang/Work/demo→-Users-yang-Work-demo。若两个项目编码后同名,第二个会追加路径 SHA-1 前 8 位作为后缀;.project.json记录真实路径,保证不同项目不会共用记忆。 - 自动加载:目录下所有顶层
*.md文件都会在每轮对话的第一步被读取并注入,其中indexFile(默认MEMORY.md)排在最前,其余按文件名排序;受maxBytes字节预算约束,超预算时从后往前整文件舍去,最后才截断索引文件。 - 更新检测:每轮开始时对比目录指纹与已注入快照的内容摘要。记忆被修改、删除,或因压缩从历史中丢失时,下一轮会重新注入完整的最新快照并用 "replaced the previously loaded project memory" 措辞说明;内容未变则完全不占用额外 token。
注入内容是一条带 source.kind = "project-memory" 的普通 user 消息(<system-reminder> 包裹),因此可重放、可压缩、可恢复,与 DSH 会话日志机制一致。
memory 工具
模型可通过 memory 工具维护当前项目的记忆,路径均相对于该项目的 memory 目录:
| command | 参数 | 作用 |
|---|---|---|
view |
path(省略或 / 表示列目录) |
列出目录或读取文件内容 |
create |
path、file_text |
新建文件(已存在则报错) |
str_replace |
path、old_str、new_str |
替换在文件中恰好出现一次的文本 |
insert |
path、insert_line、insert_text |
在指定行(0 基)插入文本 |
delete |
path |
删除文件 |
rename |
old_path、new_path |
重命名/移动文件 |
工具描述里已包含「记忆是项目私有、每次对话自动加载、MEMORY.md 作索引、不要存密钥」等使用约束,模型会主动在学到值得长期保留的项目知识时写入。
也可直接编辑 ~/.dsh/projects/<slug>/memory/ 下的 Markdown 文件(人类可读,无需工具),改动会在该会话下一轮或之后的新会话中生效。
配置
在 profile 的 cordis.patch.yml 中按行 id project-memory 覆盖:
- id: project-memory
name: 'dsh-project-automemory'
config:
maxBytes: 16384 # 注入上下文的字节预算
maxSourceBytes: 262144 # 单个记忆源文件上限
projectRootMarkers: ['.git'] # 项目根标记
indexFile: MEMORY.md # 优先加载的索引文件名
与 AGENTS.md 的关系
本插件是增量机制,不改变 DSH 既有的 AGENTS.md 加载行为:
~/.dsh/AGENTS.md仍是用户全局指令,所有项目共享 —— 适合放跨项目的个人偏好,不适合放项目细节;- 项目里的
AGENTS.md仍是仓库级工作区指令,同一目录下每个 agent 都会读到 —— 适合提交进仓库的团队约定; - 本插件提供项目私有记忆,只属于你这个用户、这个项目、这台机器 —— 适合放"我上次做到哪、这个项目有哪些坑、这个目录下我偏好的做法"。
建议把 ~/.dsh/AGENTS.md 中已有的项目相关段落迁移到对应项目的 memory 目录,只保留真正跨项目的偏好。
与其它 DSH 记忆插件的区别
- 记忆存放在
~/.dsh之下、项目目录之外:不随仓库分发,不干扰在同一 checkout 里工作的其他 agent,也不需要提交进 Git。 - 记忆由模型直接维护(
memory工具),不需要人工审批流程;同时记忆是普通 Markdown,人可以随时直接改。 - 每轮对话自动加载并在变化时自动替换旧快照,不需要手动
/memory命令。 - 采用**项目根(
.git)**作为归属单位:monorepo 内共享一份记忆,不同仓库相互独立。
开发与测试
# 需要 Node.js 24+
node --test # 38 个单元测试
npm pack --dry-run # 可选:检查打包内容(本项目通过 Git 分发,不需要发布 npm)
本地开发时用目录方式安装,改完代码后重新执行一次安装即可热更新:
install_bundle target = /path/to/dsh-project-automemory
发版(维护者)
- 更新
package.json的version和CHANGELOG.md; - 提交并打标签推送:
git add -A && git commit -m "release: v0.1.1"
git tag v0.1.1
git push origin main --tags
- 在 GitHub Releases 页面用该标签发布说明,用户即可按
#v0.1.1固定安装。
限制
- 自动加载仅限 memory 目录顶层的
*.md文件;其他文件(含子目录、非 md 文件)只能通过memory工具的view读取。 - 记忆按「项目根(
.git)」归属:monorepo 内所有子目录共享同一份记忆;多个仓库共用同一父目录时各自独立。 - 外部编辑(非本插件工具写入)在下一轮对话开始时生效;同一轮内的改动不会即时重注入。
- 记忆是本机
~/.dsh数据,不随仓库同步;maxBytes控制每次对话的记忆 token 开销。 - 不要存放密钥;slug 与项目路径的对应关系记录在
.project.json。
License
MIT © 2026 ThereWasAYang
No comments yet. Be the first to write one.