前言¶
在 DeepSeek Harness(DSH)上跑编码智能体时,同一个仓库往往会开很多轮会话。模型本身不会记住上一轮已经查过的根因,也不会记住项目里已经证伪过的改法,于是常见现象是:重复推导、重复踩坑。社区里有人用长 transcript 或手工贴笔记补上下文,但 transcript 体积大、噪声多,且容易把「猜测」和「已验证结论」混在一起。
下面介绍维护者 yuyuyyyyyyyyyyyy 发布的 dsh-project-memory(分类:记忆)。它在宿主侧为每个项目维护可持久化的工程结论记录,在智能体规划任务之前把少量相关条目召回进 prompt;存储的是结构化结论,而不是完整对话流水。
这是什么¶
dsh-project-memory 是一个 host-plane Cordis 插件:不修改 Harness 核心包,也不复制或编辑内置 preset。它通过 dsh.bundle.patch 挂载到 profile,提供 projectMemory 服务,并在每次组装 system prompt 时做 recall,同时向智能体注册一组 memory 工具。
插件当前版本为 1.1.1(见仓库 package.json),许可证 MIT,运行环境要求 Node >= 20。
核心能力¶
无需选择 preset / 模式¶
因为是 host-plane 插件,安装后对 所有 agent preset 生效(README 列举包括 standard、ptc、minimal、cordis 以及自写 preset)。模式选择器里没有名为 project-memory 的 preset 可选;若旧安装残留该 preset,文档建议删除,功能不依赖它。
注入时机与 standing contract¶
| 贡献 | Hook | 作用 |
|---|---|---|
projectMemory 服务 |
host plane | 按项目跨会话共享记录 |
project-memory:recall |
ctx.systemPrompt.context() |
在 prompt 组装阶段召回,早于智能体规划 |
project-memory:usage |
ctx.systemPrompt.section() |
约定:先搜再记;本轮产生可复用知识则写入;修正而非重复堆叠 |
memory_search |
ctx.tools.register() |
按文件、符号、错误文本、症状、特性等显式检索 |
memory_record |
ctx.tools.register() |
写入一条结构化结论 |
memory_correct |
ctx.tools.register() |
将旧结论标为 superseded / corrected / invalidated / confirmed,可关联替代记录 |
memory_forget |
ctx.tools.register() |
删除单条或有限批量 inactive 记录(带项目校验) |
memory_audit |
ctx.tools.register() |
查看召回/写入/修订内容及原因 |
记录结构(结论 vs 流水)¶
单条记录把观测、推断和结论分开,避免未证实的猜测被当成「历史」。字段分组包括:身份(id、project、project_path、session_id 等)、问题(problem、symptoms[])、facts[](观测)、hypotheses[](推断及 open|rejected|confirmed)、尝试与失败(attempts[]、failed_attempts[])、结论侧(root_cause、conclusion、verification)、结果(changes[]、constraints[])、召回信号(related_files[]、related_symbols[]、tags[])以及修订状态(status、superseded_by 等)。
memory_record 在 conclusion: "verified" 时要求 verification 非空,否则拒绝写入。
自动 Recall¶
每次组装 prompt 时,插件从会话日志构造查询:
- 最后一条人类消息(
source.kind === 'user',不含注入上下文或 tool 结果); - 近期
tool/call参数里 harvest 的文件路径与符号; - 当前会话
cwd。
候选记录仅保留同一项目,按路径、符号、标签、问题/症状词、失败尝试/约束等信号加权打分;默认最多保留 3 条(maxRecallRecords,配置可选)。得分低于 minScore 时不注入任何块,避免无关任务带来空块或额外成本。已被 supersede 或 invalidate 的记录会被过滤。
项目隔离由 projectIdOf(cwd)(规范化 cwd 的 slug + hash)实现;Windows 路径会 case-fold,分隔符会规范化。
审计与调试¶
每次 recall、写入、修订会写入有界 audit trail,可通过 memory_audit 按 action、项目过滤,查看 query、候选数、注入的 record id、相关性原因与注入体积。设置环境变量 DSH_PROJECT_MEMORY_DEBUG=1,或在插件 row 上设 debug: true,可在 info 级别打日志。
安装与启用¶
安装前请自行阅读仓库源码与 LICENSE;插件以当前 dsh 进程的权限读写宿主侧存储,安装即表示信任该包。
官方安装命令(README Install 节原文):
dsh plugin --profile web add github:yuyuyyyyyyyyyyyy/dsh-project-memory
将 web 换成你的 profile 名;github: 也可换成 registry 名、tarball 或本地路径。执行后重启 dsh 即完成安装。该包声明 dsh.bundle.patch,dsh plugin 会把它追加到 profile 的 dsh.profile.bundles,再由包内 cordis.patch.yml 在宿主侧挂载插件。
dsh plugin 会转发到 pnpm,因此需要 pnpm 在 PATH 上(例如 corepack enable pnpm 或 npm i -g pnpm)。包内无 install scripts。
无 pnpm 时可手动:把目录放到 $DSH_HOME/profiles/node_modules/dsh-project-memory/(或 profile 下 Node 能 walk 到的 node_modules),在 $DSH_HOME/profiles/<profile>/package.json 的 dsh.profile.bundles 数组中加入 "dsh-project-memory",然后重启 dsh。
可选配置(README Configuration 节,键均可选)示例片段:
- insert:
- id: project-memory
name: dsh-project-memory
config:
maxRecallRecords: 3
文档说明 patch row 的 name 必须是字面量字符串,不能是 !!js 表达式;改插件源码后需重启 dsh 才会加载新模块。同一 $DSH_HOME 下两个 dsh 进程不能共享同一会话(会 SessionAlreadyOwnedError)。
典型用法(智能体侧)¶
README 通过 project-memory:usage 约定行为,智能体在任务中应:
- 需要背景时先用
memory_search(或依赖每次 prompt 前的自动 recall); - 本轮得到可跨会话复用的根因、失败路径、约束时,用
memory_record写入; - 发现旧结论有误时,用
memory_correct标记修订关系,而不是再写一条重复结论; - 需要排查「为什么召回了这些、哪些被筛掉」时,用
memory_audit。
具体字段与工具参数以仓库 README 与源码为准。
适用场景与注意¶
适合:长期维护同一代码仓库、多 session 协作的 DSH 编码智能体;希望减少重复试错、把「已验证根因 / 已失败方案 / 项目约束」沉淀成可检索结论的团队或个人。
注意:
- 社区目录 SkillHub 插件页 与 GitHub 仓库由社区维护,与 DeepSeek / 幻方无官方从属关系;DSH 生态强调「一切皆插件」,安装来源请自行判断。
- 勿编造未在文档出现的配置项;完整配置键见 README(抓取资料中
Configuration一节有截断,以 GitHub 为准)。 - 并发:不同 session 可并行,但文档 Concurrent writers 一节说明了多写者对存储的影响,生产使用前建议阅读 README 全文。
链接¶
- 目录页:https://www.skillhub.cn/plugins/yuyuyyyyyyyyyyyy/dsh-project-memory
- 源码与文档:https://github.com/yuyuyyyyyyyyyyyy/dsh-project-memory
经过上面的步骤,一次 dsh plugin add 即可在全部 preset 下启用按项目隔离的工程记忆,并在规划前自动召回相关结论。