跳到主要内容

dsh-updater

已验证

dsh-updater · v1.0.22 · MIT · Web 界面

DeepSeek Harness 更新检查插件:检测当前 DSH 版本与 npm registry 最新版本,弹窗提示并在 full access 模式下自动更新

安装

dsh plugin add dsh-updater

dsh --profile default --dump-config 确认 layer 已生效 —— 参见安装指南

源码

发布到 npm 但没有公开仓库。安装前请检查包内容。

标签

作者

说明文档

dsh-updater

DeepSeek Harness(DSH)更新检查插件。在设置面板中新增「更新」页:显示当前 DSH 版本,一键检查 npm registry 上的最新版本,弹窗提示是否有新版本(含预览版醒目提示),并在 full access 沙箱模式下支持自动更新。

功能

  • 版本信息:进入页面即显示当前 DSH 版本(优先 dsh --version,回退读取 npx 缓存中的 @deepseek-ai/dsh/package.json
  • 检查更新:通过 npm registry 查询 @deepseek-ai/dshlatestnext(预览版)dist-tag
  • 插件自更新检测:查询 dsh-updater 包自身的 npm 最新版本,提示是否有插件新版本
  • 结果弹窗
    • 有正式版更新 → 「有新版版本号: xx」+ 更新/取消
    • 有预览版更新 → 「⚠️ 有预览版本号: xx」黄色警告横幅 + 更新预览版
    • 有插件新版本 → 「✨ 有插件新版本: xx」+ 复制命令
    • 无更新 → 「✅ 已是最新版本」
    • 查询失败 → 「❌ 查询失败」+ 诊断
  • 沙箱模式感知
    • danger-full-access → 弹窗显示 [自动更新](执行 npm install -g
    • workspace-write / read-only → 提示切换模式,并给出可复制的更新命令

目录结构

dsh-updater/
├── package.json      # 包声明(含 dsh.client 声明)
├── lib/
│   ├── index.js      # Host 端(Node):connection.rpc 注册 RPC 通道
│   └── client.js     # Client 端(浏览器):settings.section UI
├── README.md
└── LICENSE

实现说明

本插件是纯 JavaScript 手写实现,无需构建,可直接 npm publish

Host↔Client RPC(connection.rpc

  • Host 端lib/index.js):导出 apply(ctx),通过 ctx.get("connection").rpc.handle("/rpc/dsh-updater", handler, { authority: "loopback" }) 注册四个 RPC 端点:get-statecheck-npmcheck-selfperform-update
  • Client 端lib/client.js):window.__ModuleLoader__.load({ id, factory }) 注册,通过 ctx.get("connection").rpc.call("/rpc/dsh-updater", endpoint, payload) 调用 Host。

RPC 返回值遵循 DSH 的 RpcResult 协议:

// 成功
{ ok: true, value: { /* …业务数据… */ } }
// 失败
{ ok: false, error: { code: "internal", message: "错误描述", details: {} } }

Client UI

  • 通过 ctx.get("slots").inject("settings.section", …) 注册到设置面板
  • React 通过 require("react") 获取(由 DSH client module system 提供)
  • 样式用 document.head 注入 <style>,颜色走 DSH 主题变量(--dsw-alias-*

依赖

  • Host 端(通过 ctx.get 读取,均为可选):connectionshellsandboxPolicy
  • Client 端(通过 inject 声明):slotsconnection

版本维护

SELF_PACKAGESELF_VERSION 已经在模块加载时从 package.json 读取(通过 import.meta.url 定位自身所在目录),因此版本只有一处维护:改 package.jsonversion 即可,lib/index.js 无需再同步。仅当 package.json 读不到(异常兜底)时才用内置的兜底值。

插件自更新检测以实际安装位置的版本为准:运行时仍会从安装目录的 node_modules/dsh-updater/package.json 再读一次版本,捕捉安装后又改版的场景;读不到才回退到模块加载时读到的 SELF_VERSION

发布新版本时只需:

  1. 更新 package.jsonversion

name 同理,也仅由 package.json 决定。)

更新日志

1.0.22

  • git clone 源码用户检测到新版本时,给出「先切分支 → 拉取 → 安装构建」完整指引:新增 sourceRepoUpdateGuide(),当 DSH 是源码工作区、且 npm registry 有更高版本时,提示:
    • git checkout master(版本发布按 tag,master 即主分支最新;若在 detached HEAD 或其它分支,第一步即回到 master);
    • git pull 拿最新代码,然后 pnpm install / pnpm run build:lib / pnpm run build:web / pnpm dsh web
    • 附:若未安装 pnpm 的安装命令警告。
  • 复制命令 = git checkout master && git pull && pnpm install && pnpm run build:lib && pnpm run build:web && pnpm dsh web

1.0.21

  • 更新失败时给出可操作建议:新增 diagnoseUpdateFailure(),根据失败输出分类给出针对性提示——网络/registry 瞬时问题(重试一次往往成功)、镜像未同步(建议官方源)、pnpm store 不一致、构建脚本未放行、超时、锁文件/发布年龄、未知原因等。失败弹窗不再只有原始日志,而是「这是什么问题 + 下一步怎么办」。
  • 失败弹窗新增「重试」按钮:支持「第一次失败、重试成功」这类瞬时失败,用户可直接再点一次一键更新。
  • DSH 源码升级改为分步说明 + 完整构建命令:source-repo 类型的复制命令从 git pull && pnpm install && pnpm dsh 升级为 git pull && pnpm install && pnpm run build:lib && pnpm run build:web && pnpm dsh web;弹窗展示 5 步升级步骤表(拉取/安装/构建lib/构建web/启动)+ 未安装 pnpm 时的安装警告。

1.0.20

  • 修复一键更新进度不实时显示runPnpmAdd 改为 pnpm add --reporter=ndjson,pnpm 逐行流式输出进度(此前非 TTY 下几乎不流式,只到结束才一次性返回,client 轮询拿不到逐步进度,只显示「正在准备中」)。新增 summarizeNdjson() 把每行 JSON 解析成可读进度摘要(阶段 + 包 + 下载进度/大小),client 滚动台实时展示。
  • 修复更新成功后「插件版本」不刷新:插件自更新成功后再调 check-self 刷新 selfVersion,用户立即看到新版本号(此前保持旧值)。

1.0.19

  • 复制命令去掉 cd 前缀(方案 A):项目根目录已由【复制文件地址】按钮和弹窗「项目根目录」单独给到,命令保持短小 —— 用户先进入该目录再粘贴执行:
    • DSH(git 源码):复制 git pull && pnpm install && pnpm dsh
    • 插件:复制 pnpm add dsh-updater@<版本>
  • 避免与「已显示的项目根目录」重复、命令更清晰。

1.0.18

  • 插件自身更新也做成「项目根 + 三按钮」:插件自更新弹窗与 DSH 更新一致,提供【复制文件地址 / 复制命令 / 一键更新】。
  • 插件项目根动态定位(不再依赖用户路径):新增 findProfileRoot()——从插件实际加载位置向上找含 dsh.profile.bundles 标记的 package.json,即真实 profile 根(如任意用户的 $DSH_HOME/profiles/web),对任意 DSH_HOME / npm workspace 布局都成立,不再假设固定路径或层级。
  • 插件一键更新改为 pnpm add:在定位到的 profile 根直接 pnpm add dsh-updater@<版本>(官方源),返回正确命令与项目根目录。
  • 一键更新实时进度反馈:新增 updateProgress 单例 + get-update-progress 轮询端点;client 在【一键更新】时轮询并显示阶段 + 滚动输出台,用户能看到 pnpm 实时进度,不再觉得卡死。
  • 阶段识别:从 pnpm 输出粗判 resolving / downloading / linking / building / done,client 展示当前阶段。

1.0.17

  • 「打开目录」改为「复制目录地址」:实测 explorer.exechild_process.spawn 在 Windows 上常静默失败(探针启动但窗口不弹出),不可靠。改为复制项目根目录地址到剪贴板(100% 可用),用户粘贴到资源管理器地址栏或终端 cd 即可。
  • 移除不可靠的 open-dir RPC 端点与 openDirInExplorer()(Host 端死代码);client 端「打开目录」按钮替换为「复制目录地址 / 已复制地址」。
  • 保留 1.0.16 的「项目根目录显示 + 带 cd 命令」能力。

1.0.16

  • 显示项目根目录 + 带 cd 的命令(A 能力)
    • 新增 findGitRoot(),定位 git 源码仓库根目录(穿透 junction 后的真实路径)。
    • source-repo 类型弹窗显示「项目根目录:D:\...\deepseek-harness」,复制命令改为 带 cdcd /d "<项目根>" && git pull && pnpm install && pnpm dsh——任意 cmd 粘贴即可在正确目录执行。
  • 「打开目录」按钮(B 能力)
    • 新增 open-dir RPC 端点 + openDirInExplorer():Windows explorer.exe / macOS open / Linux xdg-open
    • 更新弹窗与失败结果弹窗都显示「项目根目录」和「打开目录」按钮,点一下在系统文件管理器里打开正确目录,用户可自行进去开终端操作。
  • get-state / check-npm / perform-update 统一返回 dir(项目根目录)。

1.0.15

  • 三类安装方式的提示各自准确,不再串味
    • git 源码 / workspace → 提示更新来自仓库,复制命令 git pull && pnpm install
    • npx 缓存 → 提示无常驻「一键更新」,复制命令 npx -y @deepseek-ai/dsh@latest(此前误给 npm install -g);
    • npm 全局 → 复制命令 npm install -g @deepseek-ai/dsh@latest
  • client 修复命令覆盖perform-update 返回的正确命令(result.command)覆盖 check 阶段存的旧 popup.command,结果弹窗复制/显示的不再是旧的 npm install
  • 不可一键类型隐藏「更新」按钮:git 源码 / npx / 未知方式点击更新会立刻被拒(本就不可能一键),弹窗隐藏「更新」主按钮,只保留对应命令的「复制」与指引,避免误导。

1.0.14

  • 按「DSH 安装方式」分类再决定能否一键更新:新增 detectDshInstallType() / classifyEntry(),探测 DSH 是 npx 缓存 / git 源码工作区 / npm 全局 / 局部安装:
    • realpathSync 穿透 junction/symlink,判断 dsh 真实指向(git 源码 → .git 在上级)。
    • npx 缓存 / git 源码(含 pnpm workspace-link)→ 不提供一键更新,只提示正确的升级方式(git pull && pnpm install / npx @deepseek-ai/dsh@latest),不再误装无关 npm 包进 profile
    • npm/pnpm 全局安装 → 仍可一键更新。
  • get-state 返回 installType / updatable,「版本信息」行显示「安装方式:源码工作区(需手动升级)」等。
  • 根治:此前「更新成功但运行版本没变 + 又提示有更新」的死循环,源于插件对 dev/workspace 运行也提供一键更新、误装 npm 包。此版在源头按安装方式拦截。

1.0.13

  • 修复「没有新版本却误报有更新」detectCurrentDshVersion() 原先会无脑遍历 npx 缓存、把任意历史版本(如 0.1.0-rc.7)当成「当前 DSH 版本」,导致 compareVersions 把现有 0.1.1-rc.x 错判为「有更新」。重写为先定位真正运行的入口process.argv[1]):
    • 入口落在某 npx 缓存 → 只读那个缓存的版本(精确锚定 _npx\...\node_modules\@deepseek-ai\dsh);
    • 入口是 dev 仓库源码(apps/cli 等)→ 向上读其 package.json 的真实版本(dev-repo);
    • 只有确认了运行来源才采信其版本;无法确证时不再把任意 npx 缓存当当前版本。
  • 版本唯一来源:配合运行状态清理后,DSH 版本由实际运行入口决定,避免「dev checkout 与 profile 双 DSH」导致的探测漂移。

1.0.12

  • 按运行模式正确判断「能否一键更新 DSH」detectCurrentDshVersion() 三级探测当前版本(dsh --version → 全局 npm 包 → npx 缓存),check-npm/get-state 返回带来源;「版本信息」行标注来源(本机运行 / 全局安装 / npx 缓存)。
  • perform-update 前进 assertUpdatable():只在 DSH 是 npm 全局安装时才允许一键更新;若是源码工作区 / npx 运行,明确提示「此刻一键更新无法生效」,并给出正确升级命令,避免装出一个与运行代码无关的 npm 包。
  • 修复「复制命令」无效manualCommand()npx ... --version(只是打印版本)改为 npm install -g @deepseek-ai/dsh@<ver>(真正执行全局更新)。
  • 一键不再依赖 full access 模式:DSH 更新与插件自更新一样走独立 dsh plugin add(child_process),client 端更新按钮恒为「更新」,并附「复制命令」兜底。
  • latestFromNpm 失败时给出明确报错("npm registry 不可达")而非静默失败。

1.0.10

  • 修复「点击更新 更新失败:'dsh.cmd' is not recognized:更新/自更新不再依赖 PATH 上的 dsh
    • 优先重召启动本进程的 CLI 入口process.argv[1]),PATH 上的裸 dsh 仅作兜底;
    • 给子进程 PATH 追加运行中 Node 所在目录(nodeBinDir),并记住装好 pnpm 后的全局 bin 目录;
    • Windows .cmd shim 改用 cmd.exe /d /s /c + 逐 token 引用,避开 Node 已废弃的 shell:true
  • 健壮性:超时改为杀整个进程树(Windows taskkill /t /f、POSIX 进程组 SIGTERM→SIGKILL),不再遗留 pnpm 孙进程。
  • 安全:安装目标经中央白名单 TARGET_RE 校验,拒绝 ; / $() / 含空格等注入载荷。
  • 可操作错误信息:缺少 pnpm 时自动安装(corepack → npm -g → 记录全局 bin),失败按原因(ENOENT/EEXIST/EPERM/网络)给出可执行的安装命令建议;spawn 失败时提示手动命令与 npm install -g @deepseek-ai/dsh 建议。
  • readCurrentVersiondsh --version 也走重召 CLI,没有 PATH dsh 时也能读到正确版本。
  • 单点维护SELF_PACKAGE / SELF_VERSION 改为模块加载时从 package.json 读取,版本/名称只在一处决定,不再与代码里的硬编码漂移。

1.0.9

  • 修复插件自更新成功但提示不清晰的问题;更新按钮在受限模式下改为「复制命令」。

安装

前提

  • 已安装 DeepSeek Harness(DSH)
  • PATH 中有 pnpmdsh plugin 通过 pnpm 安装)

方式一:dsh plugin 一键安装(推荐)

dsh-updater 已声明 dsh.bundle,因此可直接一键安装并自动激活:

dsh plugin --profile web add dsh-updater

安装完成后重启 DSH,设置面板中即出现「更新」页。

dsh plugin add 会通过 pnpm 把包装进 profile,并因 dsh.bundle.patch 自动把它加入 profile 的 layer 栈——无需手动编辑 cordis.patch.yml

方式二:手动安装

cd $DSH_HOME/profiles          # Windows: %USERPROFILE%\.dsh\profiles
npm install dsh-updater

然后编辑 $DSH_HOME/profiles/web/cordis.patch.yml(web profile),追加:

- insert:
    - id: dsh-updater
      name: 'dsh-updater'

重启 DSH。

本地安装(开发调试)

cd $DSH_HOME/profiles
npm install <path-to-this-package>

同样需要步骤 2(手动 insert)和重启。

发布

# npm(发布前请确认 name 未被占用,必要时改为 scope 如 @yourname/dsh-updater)
npm publish --dry-run
npm publish

# GitHub
git init && git add . && git commit -m "feat: dsh-updater plugin"
git remote add origin https://github.com/<your-org>/dsh-updater.git
git push -u origin main

License

MIT