Skills Manager v1.30.0
发布日期:2026-08-07
递交范围:v1.29.0...v1.30.0
发布概览
- macOS 现在可以在应用内完成更新,各平台都会在有新版本时主动提醒。更新与否始终由你决定:不会自行下载,也不会自行安装。
- 设置页的 Agent 列表改为优先展示在你机器上真实检测到的 Agent,不再依赖一份手工维护的「主流」名单。
用户可见更新
- macOS 支持应用内更新 —— 有新版本时,设置页会直接给出安装更新,不再只有一个跳转 GitHub 的链接。这是在构建改用 Developer ID 证书签名并通过公证之后才成立的:替换进去的应用包带着 macOS 持续信任的签名。旁边仍保留下载按钮,习惯手动安装的用户不受影响。Linux 继续跳转发布页 —— 只有 AppImage 能原地替换,而 .deb / .rpm 安装在这里无法区分。
- 本次改动从「由这一版往后升级」才开始生效 —— 更新区显示哪些按钮,属于你已经装好的那个版本,所以 v1.29.0 升级到这一版时,macOS 用户仍需去 GitHub 下载一次。从这一版起,macOS 更新在应用内完成。
- 有新版本会主动提醒 —— 应用启动后不久会检查是否有新版本,有的话弹出提醒,并在侧边栏的「设置」上标记。它只负责告知,下载和安装仍然要你点击。不存在应用自动更新,也不打算做。(设置里那个「技能自动更新」是另一回事,只管技能,未作改动。)
- 更新后何时重启由你决定 —— 更新装好后会弹出带立即重启的提醒并一直等待。不会自行重启,所以更新永远不会打断你手上的事。
- 代理环境下更新可用了 —— 安装时会使用设置里配置的代理。此前只有「检查版本」走代理、「下载安装」不走,导致通过代理访问 GitHub 的用户被告知有新版本,却装不上。
- 不再是更新到最后才失败 —— 从挂载的 .dmg 里运行、或运行在 macOS 的隔离沙箱副本中时,应用内更新不可能成功:替换后的应用会被写到一个随后即被丢弃的位置。现在会提前识别并提示先把应用移到「应用程序」文件夹,而不是下载完才失败。
- Agent 列表按「你机器上有什么」分组 —— 此前设置页用一份手工维护的名单把 Agent 分成「内建」和「更多」,而这份名单已经跑偏:Pi 和 WorkBuddy 排在最前,OpenHands、Cline、Goose、Continue 这些使用量高得多的却被折叠起来。现在分成已检测到的 Agent(在本机找到的)和其他支持的 Agent,列表顶部就是你真正能同步过去的那些,而且会随你安装或卸载自动保持准确。
- 折叠区按使用广度排序 —— 那一区实际是「我还能装点什么」的清单,所以按使用广度排列,而不是随意顺序。你自己拖拽过的顺序仍然优先。
开发者与治理更新
restart_app与quit_app共用teardown_before_exit,确保「选择重启而非退出」不会跳过退出前的本地备份提交 —— 直接重启会把它悄悄丢掉。- 重启走
AppHandle::request_restart而非restart。后者在主线程上会 spawn 出新进程后直接退出,全程不发出RunEvent::Exit,而tauri-plugin-single-instance只在该事件里清理自己的 socket。旧进程通常会先于新进程连接完成而退出,但没有任何机制保证这个顺序;一旦输掉这场竞态,新实例会认为已有活跃单例而立即退出 —— 结果是应用被关掉,而不是重启。 update_install_blocker只报告更新器无法自救的两种状态:被 Gatekeeper 隔离运行的副本,以及探测应用包父目录时返回EROFS。刻意不做通用的可写性判断 —— 归属另一个管理员账户的/Applications副本对本进程同样不可写,而那种情况下更新器自己的提权授权是能成功的。- macOS 发布任务现在会解包它刚生成的
.app.tar.gz,对解包出的应用包跑完整的签名、hardened runtime、staple 与spctl断言。用户更新时被解包覆盖到运行中安装位置的正是这个归档,而不是.app或.dmg,所以它才是决定「更新后还能不能启动」的产物。断言逻辑抽成共享 shell 函数,没有复制粘贴。 - 版本检查与更新器保持两条独立数据源(GitHub Releases API 与
latest.json)。合并到更新器的check()意味着:一旦平台条目缺失或更新器请求失败,用户会被告知「已是最新版本」,连下载入口也一并消失。 - 未引入
tauri-plugin-process:AppHandle::restart本就在 Tauri core 中,该插件只是它的 IPC 包装。 - 移除
MAINSTREAM_AGENT_KEYS。分组改读后端本就返回的ToolInfo.installed,不再需要任何人随着产品起落去重新策展一份名单 —— 上一份在编辑后几天内就已过时。 DEFAULT_PRIORITY_ORDER从 9 项扩为 23 项的排序头部,数据于 2026-08-07 实测:开源 Agent 取 GitHub star,闭源取市场地位。排序依据、具体数值,以及「star 会高估通用型助理」这一注意事项都写在列表旁边,让下一次修改从证据出发而不是凭印象。已保存的拖拽顺序仍然优先,本次改动只影响从未拖拽过的用户所看到的顺序。
当前校验状态
- ✅ 跨平台构建通过(macOS Intel / macOS ARM / Windows x64 / Linux x64)
- ✅ TypeScript typecheck 通过
English release notes
Release date: 2026-08-07
Commit range: v1.29.0...v1.30.0
Release Overview
- macOS can now install updates from inside the app, and every platform tells you when a new version exists. Updating stays a decision you make: nothing is ever downloaded or installed on its own.
- The agent list in Settings leads with the agents actually found on your machine instead of a hand-kept "mainstream" list.
User-facing
- In-app updates on macOS — When an update is available, Settings offers Install Update instead of only a link to GitHub. This became possible once builds were signed with a Developer ID certificate and notarized, because the replacement bundle now carries a signature macOS keeps trusting. The Download link stays alongside it for anyone who prefers installing by hand. Linux still links to the release page: only the AppImage can be replaced in place, and a .deb or .rpm install is indistinguishable from it here.
- This change first pays off when updating from this release — Which buttons the update section shows is part of the app you already have installed, so v1.29.0 still sends macOS users to GitHub for this one upgrade. From this release onward, macOS updates happen in place.
- A new version now announces itself — The app checks for a newer version shortly after launch and, if one exists, shows a notification and marks Settings in the sidebar. It only tells you; downloading and installing still require your click. There is no automatic app update, and none is planned. (The separate Skill Auto-Update setting is unchanged and still governs skills only.)
- Restarting after an update is your call — Once an update is installed, a notification offers Restart Now and waits. Nothing restarts on its own, so an update can never interrupt what you were doing.
- Updates work behind a proxy — The installer now uses the proxy configured in Settings. Previously the version check honoured that proxy while the download did not, so anyone reaching GitHub through one was told a new version existed and then could not install it.
- A clear message instead of a failed update — Updating from inside a mounted .dmg, or from a copy macOS is running in its quarantine sandbox, cannot work: the replaced app is written somewhere that gets discarded. The app now detects this and asks you to move it to Applications first, rather than downloading the update and failing at the end.
- The agent list groups by what you actually have — Settings used to split agents into "Built-in" and "More Agents" by a hand-kept list, which had drifted: Pi and WorkBuddy sat up top while OpenHands, Cline, Goose and Continue — each far more widely used — were folded away. The split is now Detected Agents (found on this machine) and Other Supported Agents, so the top of the list is the agents you can actually sync to, and it stays accurate on its own as you install or remove them.
- The rest of the list is ordered by how widely used each agent is — The collapsed section reads as a "what else could I install" list, so it is ranked rather than arbitrary. Your own drag-and-drop ordering still wins wherever you have set one.
Developer & Governance
restart_appandquit_appshareteardown_before_exit, so the exit-time local backup commit cannot be skipped by restarting instead of quitting — restarting outright would have silently dropped it.- Restart goes through
AppHandle::request_restartrather thanrestart. On the main thread the latter spawns the replacement process and exits without emittingRunEvent::Exit, andtauri-plugin-single-instanceremoves its socket only on that event. The old process normally exits before the new one can connect, but nothing enforces that ordering, and losing the race means the new instance sees a live singleton and exits — taking the app down instead of restarting it. update_install_blockerreports only the two states the updater cannot recover from: a Gatekeeper-translocated copy, and anEROFSfailure when probing the bundle's parent directory. A general writability test was rejected deliberately — a/Applicationscopy owned by another admin account is not writable by this process either, and there the updater's own privileged prompt succeeds.- The macOS release job now unpacks the
.app.tar.gzit produced and runs the full signature, hardened-runtime, staple andspctlassertions against the extracted bundle. That archive, not the.appor the.dmg, is what the updater unpacks over a running install, so it is the artifact whose signature decides whether an updated copy still launches. The assertions were factored into a shared shell function rather than duplicated. - The version check and the updater keep separate sources (GitHub Releases API and
latest.json). Collapsing them onto the updater'scheck()would mean a missing platform entry or a failed updater request reports "you're on the latest version" and hides the download link too. - No
tauri-plugin-processdependency:AppHandle::restartis in Tauri core, and the plugin only wraps it for IPC. MAINSTREAM_AGENT_KEYSis gone. Grouping now readsToolInfo.installed, which the backend already reported, so nobody has to re-curate a membership list as products rise and fall — the previous one had gone stale within days of being edited.DEFAULT_PRIORITY_ORDERgrew from 9 entries to a ranked head of 23, measured 2026-08-07 from GitHub stars for the open-source agents and market position for the closed-source ones. The rationale, the numbers and the caveat that stars overstate general-purpose assistants are recorded next to the list, so the next edit starts from evidence rather than impressions. Existing saved orders still take precedence; this only changes what a user who has never dragged sees.
Current Verification
- ✅ Cross-platform build passed (macOS Intel / macOS ARM / Windows x64 / Linux x64)
- ✅ TypeScript typecheck passed
完整变更:v1.29.0...v1.30.0