Chuyển đến nội dung chính

dsh-updater

Đã xác minh

dsh-updater · v1.0.22 · MIT · Giao diện web

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

Cài đặt

dsh plugin add dsh-updater

Xác nhận layer đã áp bằng dsh --profile default --dump-config — xem hướng dẫn cài plugin.

Mã nguồn

Phát hành lên npm mà không có repository công khai. Hãy kiểm tra nội dung package trước khi cài.

Thẻ

Tác giả

Readme

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