前言¶
DeepSeek Harness(DSH)桌面端可以按需装社区插件,版本一升级,常见问题不是「装不上新客户端」,而是某个已装插件仍调用旧版共享 UI 或宿主服务,界面卡在加载、日志里出现 is not a function。内置更新流程会问你是否安装,但通常不会替你逐项核对已装插件与新包是否仍匹配。
下面介绍的 dsh-update-guard(更新守卫)由社区维护者 jiuyuan-yi 发布,分类为工作流,在 SkillHub 目录与 GitHub 上均可找到;当前仓库标注为测试版能力,MIT 许可。它做两件事:在待安装更新就绪时做兼容预检(必要时锁定有风险的插件配置),并在启用启动包装器后,对启动失败与插件配置被清空做有限自愈。插件不联网、不上报数据。
这是什么¶
dsh-update-guard 是给 DSH 桌面端用的插件:更新前检查已装插件会不会因接口缺失而失效;可选地在启动失败时重试、询问是否停用第三方插件,并在配置被官方「禁用第三方」等操作清空时,从备份做外科式还原(默认跳过仍有问题的条目)。
运行环境要求:Node.js 18+、Windows(启动包装器依赖 wscript.exe)、已安装 DSH 桌面端。作者说明完整流程尚未在真实版本升级上跑通,使用前宜结合仓库内的真实环境清单自行验证。
核心功能¶
更新前检查¶
应用下载完更新、尚未安装时,守卫会:
- 从安装包解出两套「接口面」:客户端侧共享 UI 模块导出了哪些成员(浏览器半侧插件用);宿主侧运行时提供了哪些服务名(纯宿主、
inject: [...]类插件用)。 - 扫描已装插件实际引用了什么。
- 只报告用到了新版本里没有的插件。
命中后可在 cordis.patch.yml 里把对应条目的 disabled 设为 true(只改配置字段,逐字节可还原)。两层证据的自动锁定策略不同:
| 证据 | 缺失后果 | 自动锁定 |
|---|---|---|
客户端成员(如 UiPrimitives.xxx) |
渲染抛错、界面崩 | 会锁(在开启 autoLock 等策略下) |
宿主服务(inject: [...] 里的服务名) |
插件无法激活;required 插件可能导致整应用起不来 | 只提示,不自动锁 |
宿主服务不自动锁,是为避免扫描器未建模的动态服务误报。没有可用解压器时不会整体失败,会降级为只比对 engines.dsh / peerDependencies 等版本声明——与加载器自身检查同级,面板与 CLI 会标为部分检查,不会伪装成「完整通过」。
解压 NSIS 安装包时,探测顺序包括环境变量 DSH_7Z / DSH_7ZA、包内 vendor/7z.exe、PATH 上的 7-Zip 系工具、注册表与常见安装目录;均无则降级。设 DSH_UPDATE_GUARD_NO_EXTRACTOR=1 可强制降级。
启动失败与配置还原(自愈腿)¶
可选安装桌面启动包装器(wscript、隐藏窗口、无控制台):
- 启动失败 → 重试 → 仍失败则弹框询问是否停用第三方插件(默认「否」)。
- 发现插件配置被清空 → 从备份还原,只跳过有问题的那个。
- 桌面快捷方式被改回直连 exe → 下次启动可改回包装器路径。
- 同一时刻只允许一个启动器;DSH 已在运行时不启第二个进程。
该腿默认关闭(installLauncher: false),开启会改桌面图标,关闭会还原。
检查状态表述¶
完整检查、部分检查、发现风险、没有待装更新四种状态在面板与 CLI 中区分明确;部分检查不会显示为「没有发现不兼容」。
明确不做的事¶
不改插件源码;不碰 !!js 等条件值;不判断守卫自身;不写死绝对路径(安装目录来自注册表 InstallLocation,profile 来自 DSH_PROFILE_DIR 或 ~/.dsh/profiles/<名>)。接口面比对覆盖 4 个共享 UI 模块与宿主服务名注册形式,宿主 API 行为变化(签名、语义)不在范围内。
安装与启用¶
需要 Node.js 18+、Windows、DSH 桌面端。官方 README 给出的步骤如下。
第一步,将仓库放到 desktop profile 的 node_modules(路径以 %USERPROFILE% 为例):
git clone <repo> "%USERPROFILE%\.dsh\profiles\desktop\node_modules\dsh-update-guard"
将 <repo> 换为 https://github.com/jiuyuan-yi/dsh-update-guard.git。
第二步,编辑该 profile 下的 package.json,把包名加入 bundle 列表:
{
"dsh": {
"profile": {
"bundles": [ "...", "dsh-update-guard" ]
}
}
}
重启应用后,在 设置 → 通用 中会出现三行开关。配置文件位于 <profile>/.dsh-update-guard.json。
| 键 | 默认 | 说明 |
|---|---|---|
preflightOnStartup |
true |
启动时跑检查 |
autoLock |
false |
命中直接锁定,不询问 |
maxAutoLock |
3 |
一次最多锁几个 |
autoRestore |
true |
配置被清空时从备份还原 |
installLauncher |
false |
是否接管桌面快捷方式(自愈腿) |
典型用法¶
在插件目录或通过 node 调用 bin/guard.mjs。
检查待安装的更新:
node bin/guard.mjs check
node bin/guard.mjs check --json
锁定、解锁与还原预演:
node bin/guard.mjs lock
node bin/guard.mjs unlock
node bin/guard.mjs restore
node bin/guard.mjs restore --apply
改配置并查看状态:
node bin/guard.mjs config --set autoLock --value true
node bin/guard.mjs status
启动器相关:
node bin/guard.mjs launcher status
node bin/guard.mjs launcher restore --dry-run
node bin/guard.mjs launcher restore
node bin/guard.mjs launcher uninstall
退出码:0 正常,2 发现不兼容,1 出错。
无人值守或测试时可使用 DSH_LAUNCHER_PROFILE、DSH_LAUNCHER_EXE / DSH_LAUNCHER_ARGS、DSH_LAUNCHER_ANSWER、DSH_LAUNCHER_QUIET=1 等环境变量(详见 README)。
适用场景与注意¶
适合经常在 DSH 桌面端堆第三方插件、又希望在大版本更新前先看到「谁可能断」的开发者。自动还原依赖启动器记录的上次清单与补丁层证据,首次运行无记录时不做推断;还原只做结构校验,不启动插件验证运行时行为,结构完整但接口仍不兼容的条目还原后仍可能出问题。
DSH 插件与宿主同一进程权限运行,安装前应阅读源码与 MIT 许可证,自行评估信任边界。社区目录 SkillHub 插件页 与 DeepSeek / 幻方无官方从属关系,并非官方应用商店。
结尾¶
dsh-update-guard 把「更新前接口面 + 版本声明」与可选的「启动包装 + 配置还原」拆成两条可配置的腿,并区分完整检查与部分检查,避免把没解包说成通过。目录与源码:
- 目录页:https://www.skillhub.cn/plugins/jiuyuan-yi/dsh-update-guard
- GitHub:https://github.com/jiuyuan-yi/dsh-update-guard