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/dsh的latest与next(预览版)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-state、check-npm、check-self、perform-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读取,均为可选):connection、shell、sandboxPolicy - Client 端(通过
inject声明):slots、connection
版本维护
SELF_PACKAGE 与 SELF_VERSION 已经在模块加载时从 package.json 读取(通过 import.meta.url 定位自身所在目录),因此版本只有一处维护:改 package.json 的 version 即可,lib/index.js 无需再同步。仅当 package.json 读不到(异常兜底)时才用内置的兜底值。
插件自更新检测以实际安装位置的版本为准:运行时仍会从安装目录的 node_modules/dsh-updater/package.json 再读一次版本,捕捉安装后又改版的场景;读不到才回退到模块加载时读到的 SELF_VERSION。
发布新版本时只需:
- 更新
package.json的version
(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@<版本>
- DSH(git 源码):复制
- 避免与「已显示的项目根目录」重复、命令更清晰。
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.exe经child_process.spawn在 Windows 上常静默失败(探针启动但窗口不弹出),不可靠。改为复制项目根目录地址到剪贴板(100% 可用),用户粘贴到资源管理器地址栏或终端cd即可。 - 移除不可靠的
open-dirRPC 端点与openDirInExplorer()(Host 端死代码);client 端「打开目录」按钮替换为「复制目录地址 / 已复制地址」。 - 保留 1.0.16 的「项目根目录显示 + 带 cd 命令」能力。
1.0.16
- 显示项目根目录 + 带 cd 的命令(A 能力):
- 新增
findGitRoot(),定位 git 源码仓库根目录(穿透 junction 后的真实路径)。 - source-repo 类型弹窗显示「项目根目录:
D:\...\deepseek-harness」,复制命令改为 带 cd 的cd /d "<项目根>" && git pull && pnpm install && pnpm dsh——任意 cmd 粘贴即可在正确目录执行。
- 新增
- 「打开目录」按钮(B 能力):
- 新增
open-dirRPC 端点 +openDirInExplorer():Windowsexplorer.exe/ macOSopen/ Linuxxdg-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。
- git 源码 / workspace → 提示更新来自仓库,复制命令
- 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 缓存当当前版本。
- 入口落在某 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
.cmdshim 改用cmd.exe /d /s /c+ 逐 token 引用,避开 Node 已废弃的shell:true。
- 优先重召启动本进程的 CLI 入口(
- 健壮性:超时改为杀整个进程树(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建议。 readCurrentVersion的dsh --version也走重召 CLI,没有 PATH dsh 时也能读到正确版本。- 单点维护:
SELF_PACKAGE/SELF_VERSION改为模块加载时从package.json读取,版本/名称只在一处决定,不再与代码里的硬编码漂移。
1.0.9
- 修复插件自更新成功但提示不清晰的问题;更新按钮在受限模式下改为「复制命令」。
安装
前提
- 已安装 DeepSeek Harness(DSH)
- PATH 中有
pnpm(dsh 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