dsh-plugin-updates
Verified@shellraining/dsh-plugin-updates · v0.2.5 · MIT · Web UI
检查 npm 插件更新,支持批量更新和安装指定版本。
Install
dsh plugin add @shellraining/dsh-plugin-updates Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Published to npm without a public repository. Inspect the package contents before installing.
Tags
Readme
插件更新
检查 npm 插件更新,支持批量更新和安装指定版本。插件页的「已安装插件」列表里可以逐个更新或全部更新,插件详情页里还能挑一个版本安装。
安装
dsh plugin --profile web add @shellraining/dsh-plugin-updates
使用
- 已安装插件列表:有新版本时,「已安装插件」标题旁出现「全部更新(N)」,对应插件卡片的开关左边出现「更新到 x.y.z」。点卡片其他位置照常进入详情页。
- 插件详情页:有新版本时,标题旁显示「可更新」标签,右上角多一个「更新到 x.y.z」按钮。页面底部有版本列表,每个版本都能单独安装,不兼容当前 DSH 的版本不能点。
只检查依赖记录为 包名@版本范围 的插件。Git、本地目录、tarball 来源的插件和 DSH 官方插件都会跳过。
打开插件页或详情页时检查一次,结果缓存 10 分钟,过期后再打开会重新查询。查询直接从浏览器读 npm registry,用的是 profile 中 pnpm 配置的源,查不到时再试插件管理器配置的备选源(默认是 npmmirror)。需要认证的私有源无法检查。
更新是怎么做的
插件不改 profile 文件,所有改动都调用宿主插件管理器的接口:先卸载旧版本,再安装 包名@版本,用精确版本号保存,并保留原来的启用状态。版本兼容检查、构建脚本审批和锁文件回滚都由宿主处理。
操作前会重新读取安装状态,已经是目标版本时跳过;精确版本声明与实际安装版本不一致时,会停止更新,提示先修复安装。卸载失败后停止安装;原来启用的插件若仍是同来源、同版本,会尝试重新启用,恢复失败会和原错误一起显示,不会断言安装状态完全没变。bundle-in-use 表示宿主仍在运行插件实例,需要检查启用状态、完整退出并重开 DSH 后再试,插件不会强制删除或覆盖正在使用的包。
没有启用 HMR 时,宿主可能用 stop-profile 拒绝卸载。只有这一种情况会改用宿主允许的覆盖安装,安装完成后仍需重启 DSH。
卸载后安装失败时,已安装列表下方会保留完整错误、日志路径和「恢复」按钮,按原来的版本重新安装;恢复失败后可以再次重试。只有确认卸载成功后才提供恢复,不会覆盖随后通过其他入口安装的版本。错误摘要优先显示错误行,不会把 pnpm 开头的成功检查信息当成失败原因。
发布不足 24 小时的版本会标为「新发布」,pnpm 开启 minimumReleaseAge 时,这类版本可能装不上。如果出现 ERR_PNPM_RESOLUTION_POLICY_VIOLATIONS_UNHANDLED,说明 pnpm 的策略处理发生内部错误,不代表供应链校验通过就能继续安装;插件会停止操作并保留日志,不会关闭安全策略。
官方列表没有给卡片开放扩展点,列表上的按钮靠 data-plugin-group="bundles"、data-plugin-package 和开关的 role="switch" 这几个语义属性定位,见 src/client/anchors.ts。DSH 改了这部分结构时,列表上的按钮会消失,详情页不受影响。
更新本插件自己
在页面里卸载本插件时,负责后续安装的浏览器代码也会被卸掉,所以本插件的更新交给它的宿主半侧执行。详情页有新版本时会出现「更新到 x.y.z」,确认后浏览器只发一个请求,宿主在后台依次完成:
- 卸载当前版本,再按精确版本安装新版本,保持启用。
- 确认卸载成功、新版本安装失败且包仍未安装时,装回原来的版本,并保留新版本的错误和日志路径;如果已经装上某个版本,不再覆盖它。
- 卸载失败时,仅在同来源、同版本仍安装的情况下恢复原启用状态;恢复失败也会保留诊断。无 HMR 的
stop-profile按前述覆盖安装流程处理。
宿主保存的是插件管理器服务本身,本插件的上下文在卸载时释放,不影响后续步骤。进度写在 profile 的 .dsh-plugin-updates/self-update.json,新版本加载后读取这个文件,提示一次结果。更新期间插件页上本插件的按钮会暂时消失,装好后自动回来。
接口挂在宿主 Connection 的 /api/dsh-plugin-updates.self-update 上,沿用宿主的登录 cookie 和同源检查,只接受精确版本号,包名在代码里固定为本插件。确认对话框里也列出了 dsh plugin 命令,原版本也装不回时,可以退出 DSH 后在终端手动安装。
开发
开发使用仓库根目录的 Node 24.9+ / pnpm 环境,依赖版本统一由根 pnpm-workspace.yaml 的 catalog 管理。build.ts 调用共享 Vite 构建,构建前先执行 TypeScript 7 原生 tsc 类型检查。客户端保持 DSH ModuleLoader 加载方式,宿主入口和发布路径不变。
pnpm --filter @shellraining/dsh-plugin-updates build
宿主半侧在 src/host/,只负责自更新;浏览器半侧在 src/client/,两边共用的接口约定在 src/shared/。semver 打包进 lib/client.js,React、React DOM 和 @deepseek-ai/dsh-client-ui-primitives 由宿主提供。
许可
MIT