mirror of
https://github.com/openclaw/openclaw.git
synced 2026-07-14 12:06:17 +00:00
* feat(ui): fold Skills and Skill Workshop into a Plugins hub One sidebar entry (Plugins) now covers plugins, skills, and skill-workshop routes via a shared hub tab strip (Installed / Discover / Skills / Workshop). Routes and URLs are unchanged; /settings/plugins gains ?tab= deep links and the sidebar highlights Plugins for all hub routes. Also latches Skill Workshop proposal loading so updated() no longer re-kicks loads while one is pending or after one fails - the early-return finally used to spin the page at 100% CPU whenever skills.proposals.list stalled. * feat(mock): plugin catalog and skill-workshop fixtures for the mock harness * docs(web): describe the Plugins hub tabs in the Control UI guide * test(ui): backfill initialTab in plugins route-data fixtures * fix(ui): review fixes for the plugins hub - plugins route declares loaderDeps on the ?tab= param so query-only navigation and back/forward re-run the loader instead of reusing the cached match with the previous tab - catalog tab clicks navigate so the URL and history stay in sync with the documented ?tab=discover deep link (local switch stays instant) - skill-workshop error banner gains a Try again button so a transient proposals-list failure is recoverable without remounting the route * fix(ui): restore the Installed tab on bare plugins URLs in history navigation * fix(ui): manual-activation hub tablist with cross-route focus hand-off Arrow keys only move focus now; activation stays on click/Enter so arrowing can never unmount the strip under the user's focus. Keyboard activation of a cross-route tab hands focus to the destination strip's active tab, and the hub-route set uses a Set per lint. * fix(ui): defer hub-tab focus reclaim until the strip is connected * fix(ui): skip focus recovery for same-tab hub activation * docs(css): note the hub-panel flex ownership for the workshop board * fix(ui): adapt hub test to retired Overview route * chore(i18n): sync locale bundles for the plugins hub keys * docs(map): regenerate for the plugins hub section