dsh-memory-archiver:在记忆目录内免审批写文件的 DSH 插件

前言

DSH 的文件沙箱只有 read-only / workspace-write / danger-full-access 三档,不支持再加一个”可写根”;审批策略也只有 ask / never,没有 allow-always。于是”只让记忆归档免审批、其他操作照旧弹审批”这件事,用现有配置表达不了。

dsh-memory-archiver 就是为这个缺口写的插件。下面介绍它的定位、工具、安装与配置。

这是什么

imaused/dsh-memory-archiver 由 imaused 维护,给 DSH 增加四个记忆归档工具:memory_archive、memory_index、memory_patch、memory_supersede。

它的做法与常规配置方案不同:插件用自己的代码写文件(走 node:fs,不经过 ctx.fs),因此不进文件沙箱、也不触发审批;同时把可写范围校验在 allowedRoots 内,超出范围的请求一律拒绝。除这四个工具之外的操作,仍然走 workspace-write + ask,照旧弹审批。

四个工具

工具 作用
memory_archive 写一个记忆文件(dir + file + content,默认拒绝覆盖;覆盖前自动备份;UTF-8 无 BOM)
memory_index 往索引文件追加一行,或按锚点插入(保持原 BOM 与换行;重复行跳过)
memory_patch 就地替换一段文本(替换前自动备份;要求唯一匹配,或显式 replaceAll)
memory_supersede 一次完成”写新文件 + 旧文件标 status: superseded + 备份”,不删除任何文件

需要留意的是,这个插件没有删除工具,清理只发生在 .backup/ 内的旧备份上。

安装

安装命令来自项目 README,插件需要从源码打包或直接指向目录:

npm pack
dsh plugin --profile <profile> add file:<tgz 的绝对路径>

也可以直接指向源码目录:

dsh plugin --profile <profile> add file:<repo 目录>

装完重启 DSH,并新开一个会话,因为工具在会话创建时绑定。卸载:

dsh plugin --profile <profile> remove dsh-memory-archiver

默认根与配置

默认只允许一个根:~/.dsh/memory(~ 解析为 USERPROFILE / HOME)。要加更多根,有两种方式。

环境变量方式,用系统路径分隔符分隔(Windows 用 ;,类 Unix 用 :):

DSH_MEMORY_ROOTS=C:/work/memory;D:/notes/memory

或者在 profile 的 cordis.patch.yml 里按 id 覆盖:

- id: memory-archiver
  name: dsh-memory-archiver
  config:
    allowedRoots:
      - 'C:/Users/you/.dsh/memory'
      - 'D:/work/memory'

优先级是配置高于环境变量,环境变量高于默认值。

备份与保留策略

覆盖或就地更正前,旧文件会自动备份到 <记忆目录>/.backup/<原名>.<时间戳>.md,返回值会多出 backup 字段。备份写完后会自动清理旧的:

配置键 默认 作用
backupRetentionDays 30 删除超过 N 天的旧备份;<= 0 关闭时间清理
backupMaxBytes 0 备份目录总大小上限(字节);0 表示不设上限,超限从最旧删
- id: memory-archiver
  name: dsh-memory-archiver
  config:
    backupRetentionDays: 30
    backupMaxBytes: 52428800

清理只针对 .backup/ 里的 .md 备份,不碰记忆正文。

典型用法

写一个新记忆文件:

memory_archive(dir: ".dsh/memory", file: "projects/foo.md", content: "...")

文件已存在时默认拒绝,需要覆盖就显式传 overwrite。更正原文里的一段文本时用 memory_patch,目标文本必须在文件中唯一匹配,否则拒绝;确要全部替换时显式传 replaceAll。

当同一主题有了新的结论,用 memory_supersede 一次写完新文件、把旧文件标成 status: superseded 并备份,不需要先删旧文件。旧文件标记会配合配套插件 dsh-kb-lite 在检索中降权。

本插件负责”写”,dsh-kb-lite 负责”读”:kb-lite 把同一批记忆根索引起来、带引用地检索。两个插件可以单独用,一起装则”写入 + 检索”完整。

项目源码自带验证脚本:

npm test          # node --test test/core.test.mjs,16 项
node test/smoke.mjs

适用场景与注意

适合已经在用 DSH,且希望把记忆归档从”模型走沙箱”换成”插件直写”的开发者:需要免审批地维护记忆文件,同时把可写范围严格限制在记忆目录。

两点需要明确。第一,插件运行在 DSH 主进程内,不受文件沙箱约束——这是 DSH 的设计,沙箱防的是模型而不是插件;本插件把该能力收窄为只能写 allowedRoots 内的 .md,越界(含 ..、junction、symlink 逃逸)一律拒绝,不写凭据、不联网、不 spawn 子进程。第二,安装前应先检查源码与许可证(项目声明 MIT)。

小结与链接

dsh-memory-archiver 的价值在于把一个原本无法用配置表达的诉求——“记忆归档免审批、其余照旧”——实现成四个有边界、有备份、无删除能力的工具。目录页:https://www.skillhub.cn/plugins/imaused/dsh-memory-archiver ,源码:https://github.com/imaused/dsh-memory-archiver 。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜