Skip to content

Releases

v0.1.0 — 首次发布

Choose a tag to compare

@zhengjy01 zhengjy01 released this 13 Sep 14:42

跟踪 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(tag dsh-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 个端到端更新场景(含失败回滚)。