前言¶
在 DeepSeek Harness(DSH)里跑多个实例时,每个实例往往各自挂载 @a9i5k4/dsh-auto-memory,用户级记忆按 DSH_HOME 隔离。于是「哪些规则是所有实例都必须遵守的」没有单一真源:要么在每个实例的 MEMORY.md 里重复写,要么指望按需加载的 SKILL.md——前者在 auto-memory 的规则层里会被 200 字符截断,后者又不带「每轮必读」属性。
下面介绍维护者 ShukebtAb 发布的 dsh-cross-memory(GitHub:ShukebtAb/Dsh-Cross-Memory,社区目录:skillhub 条目)。它是 auto-memory 的增量插件,不替代本体、不改本体代码与数据,只补本体没有的两块能力:跨实例规则全文注入,以及记忆文件锚点结构修复。
这是什么¶
- 名称:
dsh-cross-memory(npm 包名同仓库名) - 分类:记忆
- 当前版本(资料中的安装示例):
v0.4.0 - 许可:MIT;运行需 Node.js ≥ 20,peer 依赖
@deepseek-ai/cordis^4.0.1 - 关系:与
@a9i5k4/dsh-auto-memory互不 import、不读写对方数据;auto-memory 未安装时,本插件的注入通道仍可工作,只是「跨实例统一约束」这一缺口在单插件场景下意义变小
能力一:跨实例硬约束注入¶
解决什么问题¶
auto-memory 的用户级记忆目录随实例的 userMemoryDir 隔离,子实例看不到主实例里沉淀的全局约束。本插件从固定绝对路径读取共享规则文件,在每轮上下文中注入 cross:begin 与 cross:end 之间的条目——改一处,所有开启注入的实例同步生效。
规则文件约定¶
路径硬编码为 ~/.dsh/memory/cross/RULES.md(不受 wsKey 与 userMemoryDir 影响):
# …头部说明(不注入)…
<!-- cross:begin -->
- 【必须遵守】第一条……
- 【禁止】第二条……
<!-- cross:end -->
| 约定 | 说明 |
|---|---|
| 生效区间 | 仅注释标记之间的内容;头部说明不注入 |
| 行格式 | 以 - 开头即一条;不设标记词白名单 |
| 单条长度 | 建议 ≤260 字符(含 -);资料注明可因完整错解否定保留报错串而有个别例外 |
| 编码 | UTF-8 无 BOM、LF |
定位区间时用完整注释串 <!-- cross:begin -->,避免头部说明里字面出现 cross:begin 时误匹配。
与写进 MEMORY.md 的差异(资料实测口径)¶
资料在「22 条规则、本机实测」下对比过承载方式:插件全文注入约 3786 字符且错解否定完整保留;同样条目分散写入各实例 MEMORY.md 约 4444 字符且规则段会被 auto-memory rules-layer.js 的 200 字符渲染截断。长约束若要每轮完整进入模型上下文,走本插件注入是资料给出的路径之一。
注入行为¶
- 通道:
systemPrompt.context()(user-role,追加在历史尾部),不击穿 DeepSeek 前缀缓存 - 顺序:
order: 10001,排在 auto-memory(SECTION_ORDER = 10000)之后 - 缓存:按文件
mtimeMs,未变不重读 - 失败:文件缺失、读失败、锚点缺失时静默空串,不报错、不影响会话
- 正文:不截断,原样注入
能力二:锚点结构修复工具¶
auto-memory 用 <!-- memory:mem_<32hex> --> 作为唯一条目分隔符。结构损坏可能导致整文件 fail-closed 拒写,或新内容进不了注入面;本体没有「修复锚点结构」的工具。本插件提供 cross_memory_fix_bare_entries。
三类病灶¶
| 类 | 现象 | 处置 |
|---|---|---|
| A 无锚点裸条 | 条目无锚点(常见于 memoryAnchorEnabled=false 时的 append) |
在对应 ## 行之前插入锚点行 |
| B 空锚点 orphan | 锚点后无非空行,整篇可能永久拒写 | 在锚点行之后补中性占位行 |
| C 重复锚点 | 同一 mem_<32hex> 多次出现 |
只报告,不自动删 |
资料强调:B、C 与 memoryAnchorEnabled 开关无关,手工编辑、并发写入、复制段落都可能产生;只要仍用锚点分隔,就需要这类修复通路。
参数与保证¶
| 参数 | 说明 |
|---|---|
scope |
'workspace'(默认)或 'user'(用户级 ~/.dsh/memory/MEMORY.md) |
memoryFile |
scope='workspace' 时必填,目标 MEMORY.md 绝对路径 |
apply |
默认 false 只出方案;true 才写盘 |
硬保证:
- 只插入新行,过滤锚点行后与原文逐行 diff 必须为 0
apply=true时先留.pre-write-<stamp>基线,写后自检;A/B 仍存在则整份回滚并回报rolledBack: true
幂等:同一文件第二次执行通常 changed: false。
典型调用(来自 README):
cross_memory_fix_bare_entries(
scope = 'workspace',
memoryFile = '<工作区绝对路径>\MEMORY.md'
)
cross_memory_fix_bare_entries(..., apply = true)
工具:cross_memory_status¶
输出 JSON,包含 rulesPath、ok、sha256、bytes、mtimeMs、itemsParsed、injectEnabled、itemsInjected 等。用途之一:主实例定期比对 RULES.md 的 sha256——资料指出该文件目前无写保护,DSH 的 write/edit 等工具在权限允许下可直接覆写,校验哈希是「位置隔离 + SHA256」方案里校验侧的可操作手段。auto-memory 的 memory_status 不包含 cross/RULES.md 路径。
安装与启用¶
安装命令(资料原文)¶
# 从 GitHub(推荐,锁定 commit/tag 可复现)
dsh plugin --profile web add github:ShukebtAb/Dsh-Cross-Memory#v0.4.0
# 本地开发期(示例路径以 README 为准)
dsh plugin --profile web add file:D:\Study\Product\dsh-cross-memory
安装后须确认:dependencies 中出现该包,且 dsh.profile.bundles 里也列出它;缺后者不会生效。
inject 开关(每个实例显式声明)¶
插件不猜测主/子实例;内容指纹去重对「重写版」RULES.md 不可靠。在该实例 profile 的 cordis.patch.yml 中配置:
- id: cross-memory
name: 'dsh-cross-memory'
config:
inject: true # 子实例:注入全部跨实例规则
| 角色 | 配置 | 效果 |
|---|---|---|
| 主实例(规则段即真源) | inject: false(缺省) |
不注入;仍可使用两个工具 |
| 特化子实例 | inject: true |
每轮注入全部跨实例条目 |
资料建议主实例也安装本插件,以便使用 cross_memory_status 与 cross_memory_fix_bare_entries。
适用场景与注意¶
适合谁
- 多 DSH 实例(主 + 特化子实例)需要一份共享、每轮必达的硬约束
- 使用 auto-memory 且记忆文件出现裸条、空锚点、重复锚点等结构问题,需要可审计的「只插入、不改写」修复
注意
- 插件以当前 DSH 进程的权限运行;安装前请自行查看仓库源码与 MIT 许可证
- 社区目录 skillhub.cn 为独立生态站点,与 DeepSeek / 幻方无官方从属关系
- 跨实例规则依赖本机固定路径
~/.dsh/memory/cross/RULES.md;迁移或多机同步需自行管理该文件
结尾¶
dsh-cross-memory 在 auto-memory 之外补了两条窄而明确的链路:共享 RULES.md 的全文注入,以及锚点结构的三分类修复。若你的痛点正是「全实例同一套硬约束」或「记忆文件因锚点损坏拒写」,可按上文安装、配置 inject,并用两个工具做状态校验与结构修复。
- 社区目录:https://www.skillhub.cn/plugins/ShukebtAb/Dsh-Cross-Memory
- GitHub:https://github.com/ShukebtAb/Dsh-Cross-Memory
- 相关本体:https://github.com/Aik358/dsh-auto-memory(资料参考版本 3.2.5)