dsh-updater
Đã xác minhdsh-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/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