前言¶
在 Windows 或 macOS 上维护开发环境,常见做法是分别打开 winget、Homebrew 或各软件自带的更新入口。应用一多,很难在一次操作里看清「哪些已装软件有新版本、安装包从哪来、能否静默装完」。DeepSeek Harness(DSH)把能力拆成插件;dsh-app-updater 由社区维护者 19952730389 发布,归类为「联网工具」,在 DSH 内完成「列清单 → 查新版本 → 从发布方官网拉全量安装包 → 静默安装」,检测过程不需要启动被测应用。社区目录页:SkillHub - dsh-app-updater;源码与说明:GitHub - 19952730389/dsh-app-updater。
这是什么¶
一句话:检测本机已安装应用是否有新版本,并从各自官网下载完整安装包,在 DSH 里一键静默更新;自动识别 Windows / macOS 以及 ARM64 / x64(Intel),按当前系统与芯片选包。Windows 侧依赖 winget 与注册表只读扫描;macOS 侧以 Homebrew 管理的一键更新为主,并对非 Homebrew 应用提供只读「官网版本」探测(Sparkle / Electron 等)。许可证为 MIT(见仓库 README)。
核心功能¶
Windows:winget + 注册表,官网安装包优先¶
| 步骤 | 实现(摘自 README) |
|---|---|
| 列出已装应用 | winget list,并读注册表三处 Uninstall 键,补齐 winget 未收录项;全程只读,不启动应用。 |
| 判断新版本 | winget upgrade --include-unknown,与清单按 Id 合并。 |
| 一键更新 | winget download 把发布方官网完整安装包下到指定目录,按清单核对 SHA-256;执行前插件再本地复核哈希(1.3.5 起);解析清单中的静默参数后静默安装;装完用 winget list --id 复核版本。 |
| 失败兜底 | 哈希与目录不一致或无法直接下载时,退回 winget upgrade --id <id> --exact --silent。 |
安装包 URL 来自 winget 清单里的 InstallerUrl(如 Git for Windows、Chrome、各厂商 CDN);默认下载目录为 %USERPROFILE%\Downloads\DSH App Updater,同目录会留 .yaml 清单便于核对 InstallerUrl / InstallerSha256 / 静默开关。
macOS:Homebrew 可更新项 + 非 brew 应用的展示与边界¶
- 从
/Applications等枚举应用,再反查是否由 Homebrew cask 管理;仅 Homebrew 管理的项计入默认可一键更新。拖 DMG / 手动安装的应用会列出,但不算「可更新」——一台全是拖装应用的 Mac 上出现「0 个可更新」是预期结论。 - 1.3.10 起:能对上 cask 且 cask 版本更新的非 Homebrew 应用,可执行
brew install --cask --force <token>收编并升级(README 说明为何不用--adopt做升级)。 - 1.3.9 起:对非 Homebrew 应用只读读取 Sparkle(
SUFeedURL→ appcast)或 Electron(app-update.yml)判断官网是否有新版,界面显示「官网有新版 / 需手动」;不会因此变成可一键更新。开关checkOfficialSources(默认true)可关闭这类探测及对应网络请求。
界面与操作¶
入口:DeepSeek Harness → 设置 → 应用更新。不会自动后台扫描,需点 刷新检测。列表可按「有新版本」排序,支持搜索与 全部 / 仅可更新 / 未收录(及 macOS 上「需手动」等)筛选;可勾选批量更新或单行 更新;进度条与日志可见,取消 仅停止尚未开始的项。打开下载目录 可在资源管理器 / Finder 中查看已下载的官网包。同一页 插件设置 可改下载目录、保留安装包、演练模式等。
状态含义(Windows 为主,macOS 有额外文案)包括:有新版本、已是最新、未收录;未收录原因含软件目录未收录、商店管理、版本未知、系统组件等。若扫描依据失效(如 Homebrew 命令失败),界面会出现红色警告横幅,此时「0 个可更新」不能当作「全部最新」。
安装与启用¶
推荐通过 npm 包安装(插件中心亦可一键安装):
dsh plugin --profile web add dsh-app-updater
新版本若被 pnpm 的 minimumReleaseAge 暂缓,可显式指定版本,例如:
dsh plugin --profile web add dsh-app-updater@1.2.0
也可从 GitHub 源码或 Release 的预构建包安装:
dsh plugin --profile web add github:19952730389/dsh-app-updater
dsh plugin --profile web add https://github.com/19952730389/dsh-app-updater/releases/latest/download/dsh-app-updater.tgz
装好后重启 DSH,在 设置 → 应用更新 使用。README 注明:桌面端(Electron 托管的 desktop profile)不允许 dsh plugin 直接改写,需在 profile 的 node_modules 下建 junction 并手动补 bundles。
运行环境(package.json):Node ^22.19.0 || >=24.0.0;DSH >=0.1.5-rc.1 <0.2.0-0 || >=0.2.0-rc.2 <0.3.0-0。
典型用法¶
- 安装插件并重启 DSH,打开 设置 → 应用更新。
- 点 刷新检测,等待列表出现本机应用与版本状态。
- 在 仅可更新 分段下勾选目标,点 全部更新 或行尾 更新;需要先看会下载什么时,在插件设置里打开 演练模式(
dryRun,只下载不安装)。 - 更新完成后,如需留档安装包,保持
keepInstallers为默认true,或用 打开下载目录 查看。
通过 HTTP API 改设置(与设置面板等价,适合脚本;须带 DSH 会话准入,见下节):
curl -X POST -H "Content-Type: application/json" \
-d '{"confirm":true,"settings":{"dryRun":true}}' \
http://127.0.0.1:<port>/dsh-app-updater/settings
状态与偏好保存在:
%USERPROFILE%\.dsh\dsh-app-updater\state.json
(macOS 为对应用户目录下的 .dsh/dsh-app-updater/state.json。)
常用设置键(默认值见 README):includeStoreApps、includeRegistryOnly(Windows)、includeUnmanagedApps(macOS)、checkOfficialSources(macOS)、downloadDir、keepInstallers、hashFallbackUpgrade、dryRun、matchSystemArch、autoElevate。
适用场景与注意¶
适合谁:在本机集中维护大量桌面应用、希望用 winget / Homebrew 目录对齐「官网全量包 + 静默安装」的 DSH 用户;不想为每次更新单独开 winget 终端或 brew 的人。
权限与安全:插件以当前 DSH 进程权限运行;Windows 上 autoElevate 默认开启时,需要管理员的包会通过 UAC 提权。写操作(扫描、更新、改设置等)须请求体带 confirm: true;路由默认走宿主 connection.admit,未授权返回 401/403/409。1.3.1 起不再仅凭 127.0.0.1 放行;旧宿主需显式 allowLegacyLoopback 或环境变量 DSH_APP_UPDATER_ALLOW_LEGACY_LOOPBACK=1(README「安全边界」有说明)。安装前建议自行阅读 仓库源码 与 MIT 许可证。
平台差异:Windows 侧 winget 未收录的注册表软件只能展示,不能由插件驱动更新;MSIX / 商店应用请用 Microsoft Store。macOS 侧非 Homebrew 且对不上 cask 的项仍需应用内或官网手动升级,即使界面显示「官网有新版」。
结尾¶
dsh-app-updater 把「本机应用有没有新版本」和「从发布方官网拿完整安装包并静默装完」收进 DSH 同一页,Windows 走 winget 与哈希复核,macOS 以 Homebrew 为主并补充只读官网版本信息。DeepSeek Harness 生态强调「一切皆插件」;SkillHub 等社区目录独立于 DeepSeek / 幻方,并非官方应用商店。
- 目录页:https://www.skillhub.cn/plugins/19952730389/dsh-app-updater
- GitHub:https://github.com/19952730389/dsh-app-updater