前言¶
DeepSeek Harness(DSH)的配置文件里,通过 npm 或 Git 安装的插件会停留在安装当天 pnpm 解析到的版本。Web 界面里的 Plugins 页只对安装包自带的官方目录条目提供 Update;list_bundles 只会报告已安装版本和保存的 spec,不会对比 registry 上的最新发布;install_bundle 对已安装的包会返回 already-installed,因此升级只能是「先卸载、再安装」。手工做这套流程容易漏步骤,也容易在失败时把插件弄丢。下面介绍社区插件 dsh-plugin-update:在单个插件的详情页回答「有没有新版本」,并在条件允许时一键完成更新。
这是什么¶
dsh-plugin-update 由维护者 YiZhiQvQ 发布,在 SkillHub 社区目录中归类为「联网工具」。它不往侧边栏加菜单,而是通过 Cordis patch 扩展 Plugins 页的插件详情视图,把「检查更新」和「一键更新」放在与原有开关、卸载同一区域。插件当前版本为 0.1.0,许可证 MIT,源码与说明见 GitHub 仓库。
它解决什么问题¶
已安装插件若来自 npm,会长期停在旧版本,界面没有统一提示;官方 Update 不覆盖你从 npm 或 Git 自行添加的 bundle。本插件补的是「对当前 profile 里每个可远程查询的依赖,对比已装版本与远端最新版本,并在 DSH 版本兼容时执行与 plugin_manager 相同的 remove + install」。
核心功能¶
详情页上的控件与信息¶
| 位置 | 内容 |
|---|---|
| 详情页头部 | Check for updates(检查更新),与 bundle 开关、卸载并列 |
| 标题旁 | 存在更新时显示 New version x.y.z |
| 页面内容下方 | 已安装版本 → 最新版本、应答来源;检查失败或最新版需要更高 DSH 时给出原因 |
支持的来源¶
- npm:通过 profile 的 plugin manager 使用的 registry 顺序查询 registry 文档的
latest标签;若 profile 使用registry.npmmirror.com等镜像,则对镜像查询,而非固定走 npmjs。 - Git:从默认分支读取仓库根目录
package.json的version字段。支持github:、gitlab:、bitbucket:、git+https://,以及git@host:owner/repo等形式。Git 依赖通常写分支而非版本号,更新时会用同一 spec 重装,由分支提供新代码。
本地 link:、tarball、file: 或别名没有可对比的远端,页面会说明原因,不提供无效按钮。自托管 Git 若无法通过 HTTPS 读取 raw 文件,同样按不支持处理。
检查的五种状态¶
- update — 存在更新,且
engines.dsh(或@deepseek-ai/dsh的 peer 范围)允许当前运行的 DSH 版本;可一键更新。 - incompatible — 远端有更新,但要求更高的 DSH;展示要求及来源,不出现更新按钮。
- current — 已装版本即为最新。
- error — 无法读取远端(离线、404、文档 malformed 等);展示原因,Check for updates 可重试。
- unsupported — 本地链接、tarball、别名或无法读取的 Git 主机;不会尝试修改安装。
打开某一插件详情页时,只对该包发起即时查询;其他 bundle 的检查结果来自约 十分钟 的缓存。
更新如何执行¶
Host 侧调用 profile 自带的 pluginManager 服务,与 Plugins 页、plugin_manager 工具一致:
removeBundle(name)— 取消选中、卸载行、执行pnpm remove。installBundle(spec, { enabled, registry })— 安装新版本并重新选中;enabled保留用户曾关闭的 bundle 状态。- 若第 2 步失败,会用之前的 spec 再装回去,避免更新失败后插件缺失。
保存的 spec 会保留原有范围运算符:例如 ^4.8.1 会变为 ^4.10.0,而不是裸版本号;若 profile 钉死精确版本则仍钉死;Git 依赖保持 Git 地址。
Git 更新会重新 clone 仓库,因此在卸载前会先验证主机可达;检查与 git 使用相同的无代理条件,避免「已卸载但 clone 失败」。启用 HMR 时替换可无需重启;自启动以来一直在跑的 bundle 可能报告 restart-required,页面会说明。
本 bundle 不能更新自身:卸载它会卸掉处理请求的 routes。
重装后 bundle 会排到 dsh.profile.bundles 末尾(与官方 Update 相同副作用),影响配置 precedence;两个 bundle 覆盖同一 row 时,更新后的那个之后生效。
HTTP 接口(Client ↔ Host)¶
纯 JS bundle 无法生成 @Remote 命名空间,因此暴露三条路由:
GET /plugin-update/state -> { ok, report, checking }
POST /plugin-update/check -> { ok, report } body: { refresh?: boolean, names?: string[] }
POST /plugin-update/update -> { ok, result, report } body: { name }
变更类请求需要请求头 x-plugin-update: 1,跨站表单无法设置,跨域 fetch 也无法在无 CORS 预检应答的情况下发送该头。
配置¶
无独立配置项。使用 plugin manager 的 registry 与 fallbackRegistries 决定问哪些 npm registry;Git 的 manifest 经 HTTPS 读取,在设置 HTTPS_PROXY / HTTP_PROXY 或 Windows 用户代理时会走相应代理。
安装与启用¶
从 GitHub 直接安装(无需先下载仓库):
dsh plugin --profile <profile> install https://github.com/YiZhiQvQ/dsh-plugin-update
本地 checkout 开发(路径改为你的绝对路径):
dsh plugin --profile <profile> install /absolute/path/to/dsh-plugin-update
从 Releases 安装 tarball 时:
dsh plugin --profile <profile> install /absolute/path/to/dsh-plugin-update-0.1.0.tgz
tarball 会记录 file: 依赖并钉在该文件路径,移动 .tgz 后需重装;目录安装记录 link:;GitHub URL 安装记录 Git 地址,便于 pnpm 再次拉取。
安装后无需额外配置;Client 注入 @deepseek-ai/dsh-client-ui-plugin-manager,在 Web 的 Plugins 详情页即可使用。
典型用法¶
- 打开 DSH Web UI 的 Plugins,进入某个已安装插件的详情页。
- 点击 Check for updates(或依赖缓存结果查看标题旁是否已有新版本提示)。
- 状态为 update 时,在页面上执行一键更新;若为 incompatible,先升级 profile 使用的 DSH 再试。
- 对 npm 源插件,更新后 spec 中的 semver 范围会随最新版抬升;对 Git 源,确认网络与代理下
git能访问主机后再更新。
维护者在仓库中提供的测试命令(用于验证 bundle 逻辑,非终端用户日常步骤):
node --test test/helpers.test.js test/update.test.js
node test/dry-run.mjs
适用场景与注意¶
适合:profile 里混有 npm 与 Git 来源的社区插件、需要与官方目录无关的「有没有新版本」提示,并希望在详情页完成 remove + install 而不手写命令的场景。
注意:
- 插件以当前 dsh 进程权限 运行,安装前请阅读源码与 MIT 许可证,确认可接受其行为(包括调用
pluginManager卸载并重装其他 bundle)。 - 社区目录 SkillHub 插件页 与 DeepSeek / 幻方无官方从属关系,仅为社区索引。
- Git 更新依赖本机
git环境与代理;与检查阶段不一致的代理可能导致更新失败,bundle 会在可能时回滚 spec。 - 本地 link、tarball 与无法读取的 Git 主机不会提供更新按钮,属预期行为。
结尾¶
dsh-plugin-update 把「查 npm / Git 最新版」和「按 profile 规则一键重装」收进 Plugins 详情页,补上了官方 Update 未覆盖的自装插件路径。进一步了解可访问 SkillHub 目录页 与 GitHub:YiZhiQvQ/dsh-plugin-update。