dsh-upgrade-guard:DSH 升级前的兼容盘点、契约扫描与启动冒烟

前言

DeepSeek Harness(DSH)发版节奏快,每次核心升级都可能收紧插件依赖的契约:模块表变严、服务注入缺字段就抛错、UI 导出改名、会话消息格式变更。社区里常见的结果是页面报 Failed to load plugins、插件链里大量 PENDING,或跑完任务才在格式化消息处失败。手工对照 changelog 和逐个试升级成本高,也容易漏掉「静态代码里还在引用已删除的服务名」这类问题。

下面介绍维护者 wqx11235 在 SkillHub 插件目录 发布的 dsh-upgrade-guard(分类:工作流)。它把历次升级事故里总结出的检查固化成三条可重复执行的动作:升级前盘点、升级后扫契约、切流量前做启动冒烟。

这是什么

dsh-upgrade-guard 是面向 DSH 0.1.x / 0.2.x 的升级安全网插件(当前包版本 0.2.0,MIT 许可证,要求 Node >= 22)。它不替代官方发布说明,而是对已知的破坏性契约做离线扫描,在升级前对照 npm 上的插件兼容声明做预检,并在临时端口上拉起一次宿主做启动级验证。

插件在 Web 配置档(profiles/web)与官方桌面端(profiles/desktop)共用同一套逻辑:宿主侧不 import @deepseek-ai/* 包,通过 webServer 服务挂路由;客户端遵循 0.1.2+ 的 inject / slots 约定,只 require('react'),以降低「宿主契约变了、插件还在引旧包」这类历史故障面。

核心功能:三个动作

README 将能力归纳为下表对应的三项(名称与时机以仓库文档为准)。

动作 时机 作用
Contract scan(契约扫描) 随时 / 升级后 离线、秒级:对照 KNOWN_RULES 目录,扫描已安装插件是否触犯已知破坏性契约(已移除/重命名的服务、session 消息 v4 的 source 形态、引用宿主 ui-primitives 中不存在的导出等)
Preflight(预检) 升级前 在线、约 10–40 秒:逐插件看声明的兼容范围、npm 最新版、是否支持目标宿主版本,输出「能否升级、需联动升级谁、建议先禁用谁」
Boot smoke(启动冒烟) 切换端口前 约 30–90 秒:在测试端口启动临时宿主,读启动摘要(SKIPPED / DEGRADED / PENDING 等),探测各 client bundle 可达性,结束后结束测试进程

契约扫描的规则类型在 lib/guard.mjs 的 KNOWN_RULES 中维护,文档列出的类别包括:removed-service、session-source-v4、missing-host-export、pinned-exact。新事故以「补一条规则」的方式扩展目录,而不是泛化猜测。

安装与启用

安装命令以 GitHub README 为准。典型 Web 配置档路径如下(PowerShell 示例):

cd $env:USERPROFILE\.dsh\profiles\web
pnpm add github:wqx11235/dsh-upgrade-guard

随后在该 profile 的 package.json 里,把 "dsh-upgrade-guard" 加入 dsh.profile.bundles。

无网络时可手动把整个仓库放到 %USERPROFILE%\.dsh\profiles\web\node_modules\dsh-upgrade-guard,同样写入 dsh.profile.bundles。桌面端把路径中的 web 换成 desktop。

完成依赖安装与 bundle 登记后,重启宿主、强刷页面,在界面打开 设置 → 通用 → 升级守卫。

说明:本文不给出 git clone 或凭插件名拼接的 dsh plugin add 命令;请以 README 中的 pnpm add github:wqx11235/dsh-upgrade-guard 为准。

典型用法

图形界面

路径:Settings → General → Upgrade guard(中文:设置 → 通用 → 升级守卫)。三个按钮对应上述三项能力;页脚会标明结果所依据的宿主版本、运行时与 ui-primitives 来源,避免「磁盘上的 primitives 副本与运行中宿主不一致」时误判导出是否存在。

  • Contract scan:摘要形如 critical N / warn N (scanned M plugins),并列出发现项。
  • Preflight:摘要含目标版本、插件数量与有更新的数量,并给出列表。
  • Boot smoke:PASS / FAIL,并附带关键行(如 ROOT?、PENDING、SKIPPED、DEGRADED、BADBUNDLE)。

命令行(同一套引擎)

控制台输出刻意使用英文/ASCII(避免 Windows cmd 代码页 936 下 UTF-8 中文乱码);中文报告写入 --report 指定文件(默认目录为 $DSH_HOME/upgrade-guard/)。

node lib/guard.mjs scan      --json --report scan.md [--profile <dir>] [--primitives <dir>]
node lib/guard.mjs preflight --json --report preflight.md --target 0.1.8-rc.1 [--no-network]
node lib/guard.mjs smoke     --bin <.../dsh/lib/bin.js> --cwd <dir> --port 3099 --timeout 120 [--keep]

常用环境变量:DSH_HOME(默认 ~/.dsh)、DSH_PROFILE、DSH_PRIMITIVES、DSH_SMOKE_BIN、DSH_SMOKE_PORT、DSH_SMOKE_CWD、DSH_SMOKE_TIMEOUT、DSH_SMOKE_KEEP=1。

HTTP 接口

宿主注册 POST /api/dsh-upgrade-guard,README 示例:

{ "action": "status" }
{ "action": "scan" }
{ "action": "preflight", "target": "latest" }
{ "action": "smoke", "port": 3099 }

分别返回路径与宿主信息、扫描统计与报告路径、预检行数据、冒烟结论与报告路径等(字段以实际响应为准)。

适用场景与限制

适合谁:经常在单机或团队环境里升级 DSH 核心、且 profile 里挂了大量社区插件的维护者;希望在「改生产端口」之前先看到启动链路与 bundle 层面的红灯。

运行权限:插件与当前 DSH 宿主同一进程权限执行;安装前请自行审阅 GitHub 仓库 源码与 MIT 许可证,勿在未检查的情况下在生产环境直接启用冒烟或预检(预检会访问 npm registry)。

文档明确写的限制(节选):

  • 冒烟只覆盖启动阶段(插件树加载、服务依赖、client bundle 可达性);渲染期错误(例如 primitives 改名导致的 Minified React error #130)要靠契约扫描兜底。
  • 契约扫描只覆盖已知目录;全新类型的破坏在规则补齐前不可见。
  • Preflight 需要能访问 npm;从 git/url 安装的插件无法自动比对新版本,会标为需人工核对。
  • 被宿主 peer 兼容门跳过(SKIPPED)不等于崩溃;重装往往要配合 dsh plugin allow-version 等显式豁免。
  • 打包后的桌面运行时(入口在 app.asar 内)下冒烟会报告 UNSUPPORTED 并给出替代说明,而不是静默失败。

生态上,DSH 强调「一切皆插件」;SkillHub 是社区目录站点,与 DeepSeek / 幻方无官方从属关系。仓库当前 GitHub 星标为 2(以目录页/仓库页面为准)。

结尾

经过上面的步骤,你可以在升级 DSH 前用 Preflight 看清插件矩阵,升级后用 Contract scan 扫一遍已知契约,切端口前用 Boot smoke 确认启动摘要没有隐藏的 PENDING 根因。更多信息见目录页 wqx11235/dsh-upgrade-guard 与源码 github.com/wqx11235/dsh-upgrade-guard(含中文说明 README.zh.md)。

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

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

小夜