Plugin skills not shown in /skills dialog
Description
Plugin skills loaded from a plugin's skills/ directory do not appear in the /skills dialog. The dialog shows "No skills found" even though the skills are correctly loaded and functional.
Steps to Reproduce
- Install a plugin that provides skills via a
skills/directory (e.g., a plugin with 8 skills defined asskills/<name>/SKILL.md) - Verify the plugin is installed and enabled (
settings.json→enabledPlugins) - Run
/skillsin Claude Code
Expected: Plugin skills appear in the dialog under "Plugin skills"
Actual: Dialog shows "No skills found" / empty state
Evidence that skills ARE loaded correctly
Running with --debug-file shows the skills load successfully:
[DEBUG] getPluginSkills: Processing 1 enabled plugins
[DEBUG] Checking plugin engineering: skillsPath=exists, skillsPaths=0 paths
[DEBUG] Loaded 8 skills from plugin engineering default directory
[DEBUG] Total plugin skills loaded: 8
[DEBUG] getSkills returning: 0 skill dir commands, 8 plugin skills, 8 bundled skills, 0 builtin plugin skills
[DEBUG] Sending 14 skills via attachment (initial, 14 total sent)
[DEBUG] Skill prompt: showing "engineering:doc-review" (userFacingName="doc-review")
The skills are:
- Sent to the model via the system prompt (confirmed via
--debug-file) - Invocable via
/plugin-name:skill-nameslash commands - Listed by the model when asked "what skills do you see"
They just don't appear in the /skills TUI dialog.
Root Cause Analysis
From analyzing the binary, the /skills dialog receives its data from options.commands and filters with:
// M4K filter
function filter(cmd) {
return cmd.type === "prompt" && (
cmd.loadedFrom === "skills" ||
cmd.loadedFrom === "commands_DEPRECATED" ||
cmd.loadedFrom === "plugin" ||
cmd.loadedFrom === "mcp"
);
}
Plugin skills loaded via getPluginSkills (ee6) have loadedFrom: "plugin" and should pass this filter. However, options.commands — the array passed to the dialog component — does not include plugin skills. Plugin skills are loaded into the system prompt via a separate path (Sv9/getSkills) but are never merged into the options.commands array that the /skills dialog reads.
Environment
- Claude Code version: 2.1.86
- Platform: macOS (Darwin 25.3.0, arm64)
- Plugin: custom internal plugin with
skills/directory containing 8SKILL.mdfiles - Plugin has
.claude-plugin/plugin.json(noskillsfield — relies on auto-discovery ofskills/dir)
Workaround
Skills work correctly when invoked directly (e.g., /engineering:doc-review). The issue is purely a display bug in the /skills dialog.
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗