dsh-update-guard:DeepSeek Harness 更新前的兼容檢查與啓動自愈

前言

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

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

小夜