Repository navigation
feat(claude): the skill picker lists skills from enabled plugins - #175
Conversation
The Claude skill picker scanned only the user skills folder and the project's .claude/skills folder. A skill that ships in a Claude Code plugin never appeared, so it could not be picked. Discovery now also reads plugins/installed_plugins.json and the enabledPlugins setting, and lists the skills of every plugin that is installed and switched on. They are named plugin:skill, as the CLI names them, and a pick goes out as /plugin:skill, the only form the CLI runs. Web and mobile mark these rows Plugin. A missing or malformed plugin file drops only that plugin. Ordinary skills are listed as before.
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: Scenario and decoded snapshot size10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
|
Code review, two axes. Each finding has a confidence and an estimated severity. StandardsStandards review, PR 175: no code finding should block a merge. One hard breach sits in the pull request body, not the code. Hard violations
Judgement calls on documented standards
Baseline smells
Clean
Blocking: none of the code findings. Finding 1 is the only one a merge gate could hold on. Notes: this fork leaves the model and harness line out of pull requests on purpose (finding 2). The screenshots from the real run were not uploaded (finding 1); the body describes them. SpecSpec review: PR 175No finding blocks a merge. One needs a decision first (finding 1). I read the code and the PR body. I ran no tests. (a) Missing or partial
(b) Not asked for
(c) Implemented, looks wrong
Verified fine
Outcome: no finding blocks the merge. Spec finding 1 (plugins synced from the account stay hidden) goes forward as a follow-up, not a change to this pull request. |
Problem
The Claude skill picker listed only skills from
<claude config dir>/skillsand<cwd>/.claude/skills. A skill that ships in a Claude Code plugin never appeared, so it could not be picked.Reproduction
On this PC the plugin
frontend-design@claude-plugins-officialis installed and enabled. The CLI lists its skill asfrontend-design:frontend-design. The picker did not.The new test
lists the skills of an installed, enabled plugin under plugin:skillbuilds the same layout in a temp folder. Onmainit fails: discovery returns only the ordinary skill.How the CLI resolves plugin skills
Read from Claude Code 2.1.296. I let the CLI install made-up plugins into a temp config folder, then read the
skillsandpluginslists in its stream-json init message for each case. That needs no signed-in session.enabledPluginshastruefor the idenabledPluginshasfalseenabledPluginsfalse, project.claude/settings.jsontruetrue,.claude/settings.local.jsonfalsedirname, frontmattername: frontmatter-nameplugin:dirnameplugin.jsonnamediffers from the idplugin.jsonnameplugin.jsonplugin.jsondoes not parseinstallPathfolder missingplugin.jsonskillsnames extra foldersskills/installed_plugins.jsonmalformed or missingskillOverridesset tooffforplugin:skillor the bare nameenabledPluginsorderThe invoked form, checked against the real CLI with the real plugin and a one-word prompt on a small model:
/frontend-design:frontend-design/frontend-design$frontend-design:frontend-designSo a pick has to go out as
/plugin:skill.Fix
ClaudePluginSkills.tsfinds the skill folders of installed, enabled plugins by the rules above.ClaudeSkills.tsadds those folders after the user and project ones. Each skill is namedplugin:skillwith scopeplugin.skillOverridesis not applied to them.$alpha:hellogoes out as/alpha:helloonce the name is in the discovered list.enabledPluginsorder decides.Upstream has no plugin skill support yet, checked on
upstream/mainata1db449fe4. This is a fork change, sofork-features.jsonhas a new entry,claude-plugin-skills.Clients
$picker: the row readsFrontend Design, with aPlugin Skillbadge./menu:/skill:Frontend Design, with aPluginbadge.frontend-design:frontend-designand the labelPlugin. Changed by code and typecheck only. I did not run the mobile app.Pdf Viewer Annotate.Tests
ClaudePluginSkills.test.tshas 12 tests. They cover: enabled plugin listed, disabled and unnamed plugins hidden, settings precedence, malformedinstalled_plugins.json, malformed install entries and manifests, a settings file that does not parse,plugin.jsonnaming and extra folders, project-scoped installs, same-name plugins,skillOverrides, and the/plugin:skillrewrite.providerSkills.test.tsgains two tests for the label. All use made-up plugin folders in a temp directory.Each fails on
main. Proof: I putmain'sClaudeSkills.tsandproviderSkills.tsback in place and ran the new tests.Real run
Dev server on a new empty home under the temp folder, web app in a headless browser, a small Claude model.
$frontin the composer. The picker listedFrontend Designwith thePlugin Skillbadge.LOADED.The three disabled
enabledPluginsentries on this PC did not appear. The server and the browser are stopped.No before and after images are attached. I had no way to upload images to GitHub from this session.
Left out
syncedfolder andinstalled_plugins.jsondoes not list them. On this PC that ispdf-viewer,cowork-plugin-management,modern-web-guidanceand theanthropic-skills:*set. They still do not show in the picker.SKILL.mdat the plugin root.enabledPluginsorder. I could not check this without a signed-in session on made-up plugins.enabledPlugins. The path is read, but I could not test it on this PC.Found on the way, not changed here: the CLI lists a user skill whose frontmatter does not parse, and the picker hides it.
Checks
Run on Windows, on the final commit.
The server suite has 17 failures on this Windows PC and the fork features check has 11. None is in a file this change touches. Both new test files pass inside the fork features check.
16 of the 17 server failures also fail on
main(8cd0f93d30), run from the same folder:The 17th is
src/git/GitManager.test.ts > returns existing cross-repo PR metadata found under the bare branch name. It timed out at 12000ms inside batch 2. Run alone on this branch it passes:The 11 fork features failures are all in
scripts/build-desktop-artifact.test.ts. The same 11 fail onmain:CI on this pull request runs the same suites on Linux.