Skills Manager v1.32.0
发布日期:2026-08-11
递交范围:v1.31.0...v1.32.0
发布概览
- 部署技能不会再删掉不是 Skills Manager 建的目录。所有对 Agent 目录的写入,都必须先证明目标属于自己才会替换;无法证明的一律原样保留并明确告知。
用户可见更新
- 部署不再覆盖不属于我们的内容(#363) —— 如果某个技能的名字和你自己建的目录重名,该目录连同内容会被静默删除,而且操作还提示成功。现在只有三种情况才会写入:目标不存在、已经是指向该技能的软链、或应用有记录的既有部署。其余一律逐字节保留并说明原因,你可以把现有目录导入技能库,或先移到别处再继续。
skills export --dest不再清空目标目录 —— 导出到一个已存在的路径会把它递归删除,--dest ~/Documents会只剩一个SKILL.md。现在目标非空即拒绝,确实要覆盖时用--force。- 关闭技能会保留替换过它的内容 —— 取消部署、切换 preset、关闭 Agent 开关,此前都会直接删除记录所指向的东西。如果你把某个受管技能换成了自己的目录,现在该目录会被保留并告知,而不是被删掉。
- 失败会说明原因 —— 从技能库添加技能、应用 preset 时,原本只提示「有 N 个 Skill 添加失败」。现在会显示涉及的路径、拒绝原因,以及该怎么处理。
- 已部署的技能可以从软链切换到复制模式 —— 此前每次都会因为一个误报的「无限递归」错误而失败。
开发者与治理更新
sync_engine::sync_skill新增显式的ReplacePolicy(NoClobber/Recorded { mode }/UserConfirmed),九个调用点必须各自声明被授权销毁什么。删除操作按对象类型执行,堵住了「检查之后对象被换掉、仍被递归删除」的时间窗。- 批量部署在写入任何内容前先预检全部条目,并按目标路径汇集归属证据:共享同一 skills 目录的多个 Agent 能正常部署,记录相互矛盾时则拒绝。
- 归属拒绝由
sync_desired_targets上报而非抛出:启动流程只记录日志,不会因为一次目录重名而无法启动;用户主动发起的操作则以错误形式呈现。 - 新增 17 个回归测试,覆盖授权判定表、启动行为、共享 skills 目录、矛盾记录、以及取消部署时的内容保留。
- 文档:补充官网 skillsmanager.dev 链接,并将支持的 Agent 数量更正为 51。
当前校验状态
- ✅ 跨平台构建通过(macOS Intel / macOS ARM / Windows x64 / Linux x64)
- ✅ TypeScript typecheck 通过
English release notes
Release date: 2026-08-11
Commit range: v1.31.0...v1.32.0
Release Overview
- Deploying a skill can no longer delete a directory Skills Manager did not create. Every write to an Agent directory now has to prove the target is ours before replacing it, and anything it cannot vouch for is left untouched and reported.
User-facing
- Deployment refuses to overwrite content that is not ours (#363) — A skill whose name collides with a directory you created yourself was silently deleted, and the operation reported success. Deployment now replaces only an absent target, a link already pointing at the skill, or a deployment the app has a record of. Anything else is left byte-for-byte intact and the reason is shown. Adopt the existing directory into the library, or move it aside, to continue.
skills export --destno longer wipes the destination — Exporting to a path that already existed deleted it recursively;--dest ~/Documentsleft nothing but aSKILL.md. A non-empty destination is now refused, with--forceto overwrite deliberately.- Turning a skill off keeps content that replaced it — Undeploy, preset switching, and the Agent toggle deleted whatever the app's records pointed at. If you had replaced a managed skill with your own directory, that directory is now preserved and reported instead of deleted.
- Failures explain themselves — Adding skills from the library, or applying a preset, used to report only "N skills failed". The affected path, the reason, and what to do about it now appear in the message.
- Switching an already-deployed skill from symlink to copy mode works — It previously failed every time with a spurious "infinite recursion" error.
Developer & Governance
sync_engine::sync_skilltakes an explicitReplacePolicy(NoClobber/Recorded { mode }/UserConfirmed), so all nine call sites must state what they are authorized to destroy. Removal is type-specific, closing the window where an object swapped in after the check could be recursively deleted.- Batch deployment preflights every pair before writing anything and pools ownership evidence per target path, so Agents sharing one skills directory deploy correctly while contradictory records refuse.
- Ownership refusals are reported rather than thrown from
sync_desired_targets; startup logs them and cannot be blocked from launching by a collision, while explicit user actions surface them as errors. - 17 regression tests covering the authorization table, startup behavior, shared skills directories, contradictory records, and preservation on undeploy.
- Documentation: link the official site at skillsmanager.dev, and correct the supported agent count to 51.
Current Verification
- ✅ Cross-platform build passed (macOS Intel / macOS ARM / Windows x64 / Linux x64)
- ✅ TypeScript typecheck passed
完整变更:v1.31.0...v1.32.0