dsh-update-guard: DeepSeek Harness Pre-Update Compatibility Check and Startup Self-Healing

前言

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 桌面端。作者说明完整流程尚未在真实版本升级上跑通,使用前宜结合仓库内的真实环境清单自行验证。

核心功能

更新前检查

应用下载完更新、尚未安装时,守卫会:

  1. 从安装包解出两套「接口面」:客户端侧共享 UI 模块导出了哪些成员(浏览器半侧插件用);宿主侧运行时提供了哪些服务名(纯宿主、inject: [...] 类插件用)。
  2. 扫描已装插件实际引用了什么。
  3. 只报告用到了新版本里没有的插件。

命中后可在 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
羽毛球分组比赛记分
小程序二维码

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

Xiaoye