Plugin skills not shown in /skills dialog

Resolved 💬 3 comments Opened Mar 27, 2026 by MissingHandle Closed Mar 31, 2026

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

  1. Install a plugin that provides skills via a skills/ directory (e.g., a plugin with 8 skills defined as skills/<name>/SKILL.md)
  2. Verify the plugin is installed and enabled (settings.jsonenabledPlugins)
  3. Run /skills in 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-name slash 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 8 SKILL.md files
  • Plugin has .claude-plugin/plugin.json (no skills field — relies on auto-discovery of skills/ dir)

Workaround

Skills work correctly when invoked directly (e.g., /engineering:doc-review). The issue is purely a display bug in the /skills dialog.

View original on GitHub ↗

This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗