github xingkongliang/skills-manager v1.28.5
Skills Manager v1.28.5

latest releases: v1.40.0, v1.39.0, v1.38.0...
one month ago

Skills Manager v1.28.5

发布日期:2026-08-04
递交范围:v1.28.4...v1.28.5

发布概览

  • 检查更新时不再一直占着技能仓库:同时进行的安装、更新、重新链接不会再报「仓库忙」,「检查全部更新」本身也快了很多。另外修掉一组标签筛选的问题——它们会让列表静默变空且无从恢复。

用户可见更新

  • 检查更新时的「skills repository is busy」已修复 —— 检查更新要向每个远端问一次最新版本号,在被限流时这一步能耗 30–57 秒。过去整个网络往返都握着中央仓库锁,于是你这期间做的任何操作——安装、更新、重新链接——等满 20 秒后直接失败并报 skills repository is busy。现在四条检查路径(检查全部、单个技能、托盘的「检查更新」、后台每一轮自动更新)都是先在锁外问完远端,再取锁写一笔状态,锁只被持有毫秒级。(#315)
  • 「检查全部更新」快了很多 —— 过去远端是一个个串行去问的,一个慢远端就拖住整批。现在改为并发解析(最多同时 8 个),并且按远端去重:装自同一个 monorepo 不同子目录的技能,过去每个都要问一遍,现在总共只问一次。
  • 删掉某个标签下的最后一个技能,列表不再永久空白 —— 标签的 pill 消失了,可它的筛选还生效,于是列表静默变空,而界面上已经没有可关掉的筛选了。现在失效的筛选会被自动清除,「我的技能」、工作区、项目详情页都已接入。(#318)
  • 「未标记」筛选同样修复 —— 那个 pill 也是条件显示的,所以先按「未标记」筛选、再把所有未标记的技能删光,会撞上一模一样的死胡同。
  • 「我的技能」可以清除筛选了 —— 它是唯一没有重置入口的列表,任何匹配不到内容的筛选组合都是死胡同。现在只要有筛选生效,空状态就会给出「清除筛选」。
  • 重命名标签后筛选不再丢失 —— 筛选本已跟着改名迁移过去,却在一瞬后被误清除,原因是标签列表是异步刷新的。
  • 切换项目时不再显示别的项目的技能 —— 一次慢扫描的响应可能在你已经切到另一个项目之后才返回,把上一个项目的技能塞进当前页面。

开发者与治理更新

  • 批量更新检查改为两段式:第一段在中央仓库锁、按 (clone_url, branch) 去重、最多 8 个并发 git ls-remote,把每个不同的远端解析一次;第二段才逐技能取锁,只用来写状态列。resolve_remote_revision 可以安全并发:它调用 git ls-remote 子进程,libgit2 回退路径每次新建一个 uuid 命名的临时裸仓库。
  • 把「解析」和「写入」拆开后引入了一个已合并 PR 未覆盖的竞态:重装会保留技能原有记录、只改写来源(update_skill_after_reinstall),于是从旧远端读到的版本号可能被写到新来源上。现在每个预取结果都带着它被解析时的 (clone_url, branch),写入侧从重新读到的记录重算这个键并比对,不匹配就丢弃。
  • check_skill_update_internal_with_remote 在契约上不再联网——没有可用预取的技能会留到下一轮,而不是当场解析;后者会在检查 TTL 的边界上把 ls-remote 又放回锁内。check_skill_update_internal 现在等于 prefetch_skill_remote 加上这一步写入,其契约是调用方不得持有仓库锁(目前只有 CLI 的 check 在用)。
  • pruneStaleTagFilters 在没有失效项时返回同一个 Set 引用(避免重渲染循环);技能列表为空时跳过清理(空列表说明不了哪些标签有效);并把「已加载技能自身携带的标签」也算作有效——正是这一条堵上了重命名的时间窗。ProjectDetail 的技能加载补上了 WorkspaceView 早就在用的 request-id 守卫。
  • Rust 测试 401 项全绿,新增覆盖预取键校验、预取失败仍要落 error 状态、以及并发解析契约。

当前校验状态

  • ✅ 跨平台构建通过(macOS Intel / macOS ARM / Windows x64 / Linux x64)
  • ✅ TypeScript typecheck 通过

English release notes

Release date: 2026-08-04
Commit range: v1.28.4...v1.28.5

Release Overview

  • Update checks no longer hold the skills repository while they talk to the network, so an install, update, or relink started at the same time stops failing with "repository is busy" — and "check all updates" itself got substantially faster. Plus a round of tag-filter fixes for lists that could go silently empty with no way back.

User-facing

  • "Skills repository is busy" during an update check is fixed — Checking for updates asks each remote for its newest revision, which can take 30–57 seconds when the query is throttled. That entire round-trip ran while holding the central-repo lock, so anything you started meanwhile — install, update, relink — waited 20 seconds and then failed with skills repository is busy. All four check paths (check all, single skill, the tray's "check for updates", and each background auto-update round) now resolve remotes before taking the lock, which is then held only for the status write. (#315)
  • "Check all updates" is much faster — Remotes were queried one at a time, so a single slow remote stalled the whole batch. They are now resolved concurrently (up to 8 at once) and deduplicated per remote: skills installed from different subdirectories of one monorepo cost one query in total instead of one each.
  • Deleting a tag's last skill no longer empties the list for good — The tag's pill disappeared while its filter stayed active, so the list silently rendered empty with no visible filter left to turn off. Stale filters are now dropped automatically in My Skills, Workspace, and a project's detail page. (#318)
  • The same fix for "Untagged" — That pill is conditional too, so filtering by Untagged and then deleting every untagged skill hit the identical dead end.
  • My Skills can clear its filters — It was the only list without a reset control, so any filter combination matching nothing was a dead end. Its empty state now offers "Clear filters" whenever a filter is active.
  • Renaming a tag keeps your filter — The filter followed the rename, then was dropped a moment later because the tag list refreshes asynchronously.
  • Switching projects no longer shows another project's skills — A slow skill scan's response could land after you had already moved to a different project, swapping its skills in under the current route.

Developer & Governance

  • The batch update check is now two phases: resolve every distinct remote once — keyed by (clone_url, branch), bounded at 8 concurrent git ls-remote calls — off the central-repo lock, then take the lock per skill only to write the status columns. resolve_remote_revision is safe to run concurrently: it shells out to git ls-remote, and its libgit2 fallback builds a fresh uuid-named bare repo per call.
  • Splitting resolve from apply opened a race the merged PR did not cover: a reinstall keeps a skill's row and repoints its source (update_skill_after_reinstall), so a revision read from the old remote could be written against the new one. Every prefetched revision now carries the (clone_url, branch) it was resolved for, and the apply side re-derives that key from the freshly read record and discards anything that no longer matches.
  • check_skill_update_internal_with_remote is network-free by contract — a skill with no usable prefetch is deferred to the next round rather than resolved inline, which would have put an ls-remote back under the lock at the check-TTL boundary. check_skill_update_internal is now prefetch_skill_remote plus that apply step, and its contract is that the caller does not hold the lock (only the CLI's check uses it).
  • pruneStaleTagFilters returns the same Set reference when nothing is stale (avoiding a re-render loop), skips pruning while the skill list is empty (an empty list says nothing about which tags are valid), and counts tags carried by a loaded skill as available — which is what closes the rename window. ProjectDetail's skill load gained the request-id guard WorkspaceView already used.
  • Rust test suite at 401 passing, including new coverage for the prefetch key check, the failed-prefetch status write, and the concurrent resolution contract.

Current Verification

  • ✅ Cross-platform build passed (macOS Intel / macOS ARM / Windows x64 / Linux x64)
  • ✅ TypeScript typecheck passed

完整变更v1.28.4...v1.28.5

Full changelog files: English | 中文

Don't miss a new skills-manager release

NewReleases is sending notifications on new releases.