Skills diagnostics, global master toggle, and ID-matching fix (step 5) - #146
Merged
yikkuro merged 5 commits intoJul 30, 2026
Conversation
Fix per-agent skill binding: OpenClaw filters agents.list[*].skills against each skill's frontmatter name, not its slug. Add SKILL_MATCH_NAMES + resolveSkillFilterNames and write resolved match-names to openclaw.json (seeding + set-agent-skills), while keeping the UI/IPC input slug-based. Round-trip reads recognize both slug- and name-form stored values via matchesSkill. Add dev-only diagnostics: skills:get-status IPC runs the OpenClaw CLI directly (skills list/check --json) to surface each skill's gating status and missing requirements, rendered as badges + reasons in SkillsDevPanel with a Model-visible summary and Refresh. Add a per-skill global master toggle: skills:set-global-enabled IPC manages both skills.entries[key].enabled and skills.allowBundled (bundled only), mirroring the set-agent-skills atomic-write + single managed-gateway restart with rollback. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 1fe75171-fea2-45ef-9401-bf8a4ea0f2ba
Raise SKILLS_STATUS_TIMEOUT_MS to 120s so the cold OpenClaw CLI (52-81s to emit JSON) is not killed before producing output, and drop the redundant 'skills check' spawn since 'skills list --json' already carries every per-skill boolean and missing-requirement the panel uses. Add a visible 'checking status' loading line during the ~1 minute wait. Redesign SkillsDevPanel as a single-column vertical list: skill name + status/reason/missing on the left, per-agent 'This agent' and 'Global' toggles right-aligned, no horizontal overflow or clipped labels. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 1fe75171-fea2-45ef-9401-bf8a4ea0f2ba
yikkuro
pushed a commit
that referenced
this pull request
Jul 30, 2026
… branch Clean auto-merge; took #146's constants.ts/main.ts/SkillsDevPanel.vue; i18n unioned. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 1fe75171-fea2-45ef-9401-bf8a4ea0f2ba
Show a muted 'Not installed' badge for catalog slugs (e.g. canvas) that return no record once status has loaded successfully, instead of a bare disabled Global switch. Make the per-skill Global master toggle deferred like the per-agent toggle: flipping it only stages a pending change, and a single 'Apply & reload' now persists BOTH the per-agent allowlist and every global on/off change in ONE atomic config write + ONE gateway restart via the new skills:apply-agent-config IPC. Factor the config mutations into shared skill-config helpers (applyAgentSkillsToConfig / applyGlobalSkillChange) reused by the existing set-agent-skills and set-global-enabled handlers, and unit-test them. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 1fe75171-fea2-45ef-9401-bf8a4ea0f2ba
yikkuro
pushed a commit
that referenced
this pull request
Jul 30, 2026
…nto integration branch Clean auto-merge; adds skill-config.ts/.test.ts; took #146 skills files; i18n unioned. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 1fe75171-fea2-45ef-9401-bf8a4ea0f2ba
The status check cold-starts the OpenClaw CLI (~60s), so stop auto-running it on mount and on every agent switch. Agent switches are now instant: the fast config read still populates the per-agent checkboxes, and status badges come from a per-agent cache (populated by Refresh status / Apply) or show a 'Status not checked' hint when this agent hasn't been checked yet. The deferred-global baseline is recomputed from the selected agent's cached status. Only 'Refresh status' (and Apply) spawn the ~1 minute CLI. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 1fe75171-fea2-45ef-9401-bf8a4ea0f2ba
yikkuro
pushed a commit
that referenced
this pull request
Jul 30, 2026
…ntegration branch Clean auto-merge; renderer-only SkillsDevPanel.vue + i18n; adds skills.dev.statusNotChecked. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 1fe75171-fea2-45ef-9401-bf8a4ea0f2ba
Hoist the SkillsDevPanel status cache to module scope so cached badges survive the panel unmounting/remounting and agent switches. Replace the per-agent Refresh with a Refresh-all that fetches every catalog agent sequentially (current agent first) with a progress indicator, caching each result. Store both ok and error outcomes. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 1fe75171-fea2-45ef-9401-bf8a4ea0f2ba
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Step 5 of the stacked dev Skills feature. Depends on #144 — base branch is
sunt-microsoft-feat-dev-skills-panel.1. Fix agent-skill ID matching bug
OpenClaw filters
config.agents.list[*].skillsagainst each skill's frontmattername, not its directory slug. Five catalog slugs have a display name that differs from the slug and were being silently excluded. IntroducesSKILL_MATCH_NAMES+resolveSkillFilterNames()as the single source of truth, and writes resolved match-names toopenclaw.jsonat both persona seeding and theskills:set-agent-skillshandler. The renderer UI, IPC input, and validation stay slug-based; slug→name resolution happens only at write time. Round-trip reads recognize both slug- and name-form stored values viamatchesSkill().canvasis documented as resolving to no installed skill (kept inALL_SKILL_IDSfor sync).2. Dev UI — per-skill requirement/gating status
New
skills:get-statusIPC spawns the same node + openclaw entry the gateway uses and runsskills list/check --agent <id> --json(CLI reads config from disk; gateway need not be up), strips the config banner, and merges into normalized per-skill records.SkillsDevPanel.vueshows a status badge, a reason when not model-visible (global allowlist / agent allowlist / disabled / missing requirements + specific bins/env/config/os), aModel-visible: X / Nsummary, and a Refresh button.3. Dev UI — global master on/off toggle per skill
New
skills:set-global-enabledIPC manages both gating layers:skills.entries[key].enabledand (for bundled skills)skills.allowBundled. Mirrorsskills:set-agent-skillsrobustness — validates against discovered skills, atomic config write, single managed-gateway restart with rollback. Panel adds a per-rowGlobalswitch distinct from the per-agentThis agenttoggle and re-fetches status after a successful toggle. i18n added to bothen-USandzh-CN.SKILL_MATCH_NAMES
Validation
tsc --noEmit✓ ·vue-tsc --noEmit✓ ·vite build✓import.meta.env.DEVfolds tofalsein the release bundle (dev button + panel gated out of the DOM)main.tspreserve-caught-error left untouched)