Repository navigation
Releases
Releases · zhengjy01/dsh-updater
v0.1.0 — 首次发布
跟踪 DSH 官方版本并在页面上完成更新的插件。四个能力:跟踪最新版本(npm dist-tags latest / next / alpha)、展示更新点(当前版本到目标版本之间每一个版本的变更,来自 GitHub Release 双语正文)、一键更新(分离助手:mv 原子备份 → npm install -g --prefix → 校验 → 原命令重启 → 失败自动回滚)、分级风险提示。
安装
dsh plugin --profile web add @zhengjunyao/dsh-updater
# 或从 GitHub
dsh plugin --profile web add github:zhengjy01/dsh-updater装完需要重启 DSH(宿主侧插件只有换一个 dsh web 进程才生效)。
界面
[0.1.0] - 2026-09-13
首次发布:跟踪 DSH 官方版本、展示更新点、一键更新并给出分级风险清单。
新增 (Added)
- 版本跟踪:跟随 npm dist-tags
latest/next/alpha(channel配置),
合并 GitHub Release(tagdsh-v<version>,双语正文,中文段优先、英文段回退)作为变更说明来源;
后台定时检查(checkIntervalMinutes,默认 180)+ 启动后检查(checkOnBoot),
结果按cacheTtlMinutes(默认 30)缓存到cache/registry.json与cache/releases.json。 - 更新点:从 npm 的已发布版本列表取
(当前版本, 目标版本]区间内的每一个版本
(取自 npm 保证可安装性),逐版本按 release 正文的<h3>/#标题分组渲染条目;
没有对应 release 的版本明确标记「没有找到该版本的发布说明」,只在 GitHub 发布、
npm 上不存在的版本从可选目标里排除并说明。 - 一键更新:交给分离助手
helper/update-helper.mjs(零依赖纯 Node ESM,宿主死后继续运行)——
mv(rename)把当前安装原子移开做备份 →npm install -g --prefix <当前安装前缀> @deepseek-ai/dsh@<版本>
→ 校验package.json版本、lib/bin.js入口脚本与node_modules/@deepseek-ai完整性
→ 用完全相同的 file/argv/cwd/env 重新拉起 → 启动失败自动rename恢复备份并拉起旧版本。
--prefix永远显式传入,不使用npm config get prefix。 - 三重就绪判定:端口应答 + 进程存活 + 启动输出无 boot 致命行,先守
readyConfirmMs(默认 4s)再确认;
此后继续观察bootWatchMs(默认 30s),把「报了就绪又自己死掉」改判为失败。 - 更新风险引擎(
src/risk.ts):分级(high/warn/info)+ 加权score(0–100)vetted标志,逐项检查预发布目标、破坏性变更措辞扫描、迁移/改名措辞、跨版本幅度、
更新说明缺失、只在 GitHub 发布的版本、无法识别的运行安装、本机多份安装与PATH首选不一致、
npm 前缀漂移、已装插件的dsh.engines.dsh范围兼容性、备份与自动回滚可用性、会话中断。
含 7 项预检(目标版本 / 安装根 / 安装目录可写 / 安装完整性 / npm 可用 / 前缀可推导 / 磁盘空间)。
confirmOn(默认high)决定拦截门槛,被拦时返回 428 或requiresRiskConfirmation。
- 五个 HTTP 路由组(
/api/dsh-updater/*,loopback-only + 同源守卫):
probe(存活探针)/status(宿主+助手+配置+安装+备份+历史)/
check(解析通道、拉取说明、评级)/update(交接,回 202 后退出宿主;409 已最新;
428 需风险确认)/logs、history、failure、installs、config、helper、
helper/{retry|rollback|recheck}。 - 三个 Agent 工具:
dsh_update_status(只读)、dsh_update_check(只读:更新点 + 风险清单)、
dsh_update(真正安装;必须confirm: true,有high风险项时还需confirmRisk: true,
且必须先取得用户明确同意——更新必然重启 DSH)。 - 恢复控制台(分离助手自带,默认
http://127.0.0.1:3098,占用则依次试 +1…+9):
阶段与安装步骤、完整 npm 命令行、npm 输出、启动日志、疑似报错行、失败原因与退出码,
以及「重试启动 / 回滚到旧版本 / 重新检测」三个动作;GET /report提供可整段复制的失败报告。 - 失败报告:失败时写成
DSH_HOME/dsh-updater/last-failure.md,成功启动后删除。 - 更新历史与对账:每次请求一条记录(
history.json),宿主启动时按status.json里的
目标版本与来源版本对账,补回outcome与landedVersion。 - launchd 托管:宿主由 launchd 管理时助手进入
observe模式(执行托管方的 kick 命令、
跟随其 stdout/stderr 日志判断存活),绝不自己再 spawn 一个宿主去抢端口。 - 插件设置:29 个字段全部可配且有钳制区间,配置存
DSH_HOME/dsh-updater/config.json(0600,
可用DSH_UPDATER_HOME/DSH_UPDATER_CONFIG覆盖),首次加载时按插件行种子生成、之后文件为准。 - 上游故障降级:registry 或 GitHub 拉取失败时沿用上一次成功结果,并在
upstream.warnings
里标注可能过期——「连不上 GitHub」不会被显示成「没有新版本」。
兼容性 (Compatibility)
- DSH:
>=0.1.5-rc.1 - Node:
^22.19.0 || >=24.0.0 - peer:
@deepseek-ai/dsh-*范围为^0.1.0-rc.6 || ^0.1.1-rc.1 || ^0.1.2-alpha.1 || ^0.1.5-rc.1;
react/react-dom^18.2.0 - 运行时依赖:无(分离助手是零依赖纯 Node ESM)
已知限制 (Known limitations)
- 更新会中断当前回合并重启宿主;回滚恢复的是更新前那一份安装,不保证与更新后写下的数据/配置兼容。
- 备份是安装目录同级的
rename,因此必须与安装目录在同一文件系统;跨文件系统时不备份并中止,没有慢速复制降级。 - 预发布版本(
-rc.*/-alpha.*/-beta.*)官方未标为稳定版。 - 磁盘预检按「含一份完整备份」估算 600 MB 需求。
- 恢复控制台是开放 CORS 的本地 HTTP 服务,仅应存在于一次更新的存活期间。
- 仓库随附
tests/:smoke/versions/risk/helper/routes/handoff(npm test)。
其中tests/helper.mjs用假安装根 + 假 npm 在/tmp里对真实的helper/update-helper.mjs
做端到端验证(覆盖 ok / wrong-version / missing-entry / empty-deps / npm-fails / boot-fails /
boot-really-fails / prune / restart-only 九个场景),这一写动作有意不进可移植性脚本门禁,
因为它会碰真实全局安装。 - 已知状态:发布时
lib/仍是旧构建产物(lib/index.js编译自重启插件,导出里没有
parseRegistryDoc/assessRisk),且tests/仍在改写中;npm run build之后跑npm test
才是有效结果。
完整变更:https://github.com/zhengjy01/dsh-updater/blob/main/CHANGELOG.md
可移植性验证:npm run verify:full ✅ 通过(隔离 DSH_HOME 的空 profile 装 tarball → 独立实例 → 健康路由 → 客户端 bundle 进 __DSH_BOOT__.entries → 就绪后再守 30 秒,15 次探测同一 pid)。
测试:6 个套件 517 项断言全绿,其中 tests/helper.mjs 在临时目录里自建假安装根与假 npm,对真助手跑 9 个端到端更新场景(含失败回滚)。
