dsh-upgrade-assistant:在 DSH 插件页集中检查与一键升级

前言

DeepSeek Harness(DSH)采用「一切皆插件」的扩展方式:Harness 本体与各类能力都以 bundle 形式安装、迭代。插件一多,版本往往分散在各自目录、pnpm-lock 与 npm registry 之间;若新版本在 package.json 里声明了 engines.dsh,还会在 DSH 版本不满足时被安装器挡在门外。手工逐个 pnpm update、对照 semver 与 DSH 门控,既慢也容易在「版本太新还不能装」或「传递依赖根本没动」这类细节上踩坑。下面介绍社区维护的 dsh-upgrade-assistant(GitHub:zhangrui824/dsh-upgrade-assistant):在 DSH Web UI 的 Plugins 页增加 Upgrades 标签,把已安装插件的 npm 比对、engines.dsh 预检与就地升级收到同一界面,失败原因用可读文案说明。

这是什么

dsh-upgrade-assistant 是面向 DSH 的升级助手插件,维护者为 zhangrui824,在 SkillHub 目录中归类为 admin-security。它在插件管理页提供 Upgrades 标签:对每条已安装的 npm bundle 做更新检查(尊重 profile 镜像与约 5 分钟缓存、并发 3),对 Harness 本体做 npm 最新版比对;在升级前按 DSH 同款 semver 规则评估目标版本的 engines.dsh,不满足时显示 Needs newer DSH 并隐藏升级按钮;满足条件时可一键就地执行升级,并在跑完后从 node_modules 回读实际版本,避免「pnpm 成功但未真正升版」被误报为成功。

核心功能

Upgrades 标签里的信息结构

界面顶部有自检条(例如包管理器、语言、bundle 数量、当前 DSH 版本)。主体包括:

  • Harness (DSH):当前版本 / npm 最新版,以及 Check DSH updates。
  • Installed plugins:Check plugin updates 后,每行显示 bundle 名、版本对比(如 0.77.0 → 0.78.1)、状态(Upgrade available、Up to date、Not on npm — skipped 等),以及 engines.dsh 摘要。
  • Version exemptions:当前生效的、可跳过 DSH 门控的 package@version 许可说明。
  • When an upgrade fails:四类常见失败原因的说明。

更新检查

Check plugin updates 将各已安装 bundle 与 npm 比对(使用 profile 配置的 registry,默认 npmjs)。从 GitHub 或本地路径安装的 bundle 没有 npm 版本可比,会标记 Not on npm — skipped;对这类 GitHub 来源、且带有 npm 传递依赖的 bundle,可提供 Refresh bundled family,在父包 semver 允许范围内刷新依赖,而不是误用 --latest 去动传递链。

Check DSH updates 将当前运行的 Harness 与 npm 上最新发布比对。

就地升级机制

用户点击绿色 Upgrade available 后的 Upgrade(内联确认后执行):

  • npm 直装插件:执行 pnpm update --latest --config.minimumReleaseAge=0 <name>。仅在用户点击时关闭 pnpm 默认约 24 小时的「新版本冷却」限制,减少「版本太新无法安装」类失败。
  • 传递依赖族(由 GitHub 来源 bundle 拉入的 npm 依赖):因 pnpm update --latest 无法单独推高传递依赖,插件改为在范围内刷新:pnpm update <deps> --config.minimumReleaseAge=0。
  • 事后校验:从 node_modules 读取实际安装版本;若 pnpm 退出成功但未改变版本,报告为 stale,不算成功。
  • 防降级:当 npm latest 标签低于已安装版本(官方 @deepseek-ai/* 等场景较常见)时拒绝更新。

engines.dsh 预检

目标新版本若声明 engines.dsh,在升级前用与 DSH 门控一致的 semver 评估(node-semver 语义,includePrerelease: true)。不满足的 bundle 显示 Needs newer DSH,不展示升级按钮。解析不了的 range 语法不会阻塞升级,仅原文展示,最终以真实安装结果为准。

安全模型

自定义 Web 路由不经过 DSH Web UI 的 cookie 认证,本插件对所有路由自建信任边界(与社区 dsh-update 同级):

  • 仅允许回环地址(127/8、::1)且 Host 为回环。
  • 浏览器请求须同源(Origin 匹配,sec-fetch-site 非 cross-site)。
  • 不信任 X-Forwarded-For;拒绝时返回 403 与 JSON 原因。
  • 更新路由额外要求:POST、包名 allow-list 正则(防注入与路径穿越)、4 KB 请求体上限、single-flight(同一时刻仅一个 pnpm 操作)、10 分钟超时并强制结束进程(Windows 用 taskkill,Unix 用进程组)。

安装与启用

从 GitHub 安装(README 推荐方式):

dsh plugin --profile <your-profile> add github:zhangrui824/dsh-upgrade-assistant

插件 package.json 声明 engines.dsh: >=0.2.1-rc.2,node: >=22。许可证为 MIT。

Host 侧改动需 重启 Harness 一次后,更新相关服务才会就绪;仅改客户端时刷新页面即可。若点击升级提示更新服务尚未就绪,通常也是 Host 未重启所致。

典型用法

  1. 侧栏进入 Plugins,打开 Upgrades 标签。
  2. 点击 Check plugin updates,查看各 bundle 与 npm 的版本差与 engines.dsh 状态。
  3. 对 Upgrade available 行点击 Upgrade 完成就地升级;对 Needs newer DSH 行先升级 Harness,再回来升级插件。
  4. 需要时点击 Check DSH updates 检查 Harness 本体是否有 npm 新版本。
  5. 对 Not on npm — skipped 的 GitHub 来源 bundle,若存在 npm 依赖族,可使用 Refresh bundled family 刷新传递依赖。

与 dsh-update 的分工:dsh-update 侧重其作者 @linxin666/* 族与 release notes;本插件覆盖全局 npm bundle 视图,并显式区分直接依赖 --latest 与传递依赖 in-range 刷新两种模式。

适用场景与注意

适合在本地或内网长期运行 DSH、安装较多 npm/GitHub 混合来源插件、需要统一看版本与 DSH 兼容性的开发者与运维。插件以 当前 DSH 进程权限 执行 pnpm 与 HTTP 路由;安装前请阅读仓库源码与 MIT 许可证,自行评估是否纳入环境。

已知限制(来自 README):运行中 DSH 版本来自 DSH_CLIENT_VERSION 或从入口脚本向上查找 @deepseek-ai/dsh manifest,否则显示 unknown(其余功能仍可用);需认证的私有 registry 可能失败并显示原因;从本地路径安装时插件无法升级自身(发布到 npm 后可使用界面自举升级)。

结尾

dsh-upgrade-assistant 把插件与 Harness 的版本检查、engines.dsh 预检和一键就地升级集中到 Upgrades 标签,并对 npm 直装与传递依赖族、防降级与事后校验做了区分处理;安全上限制回环与同源,并对升级接口做并发与超时控制。目录页:https://www.skillhub.cn/plugins/zhangrui824/dsh-upgrade-assistant;源码与完整说明:https://github.com/zhangrui824/dsh-upgrade-assistant。

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

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

小夜