[BUG] Project skill display in slash command but plugin skill doesn't
Open 💬 27 comments Opened Jan 10, 2026 by elct9620
Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet
- [x] This is a single bug report (please file separate reports for different bugs)
- [x] I am using the latest version of Claude Code
What's Wrong?
According to CHANGELOG.md, since v2.1.3, the slash command and skill are merged.
When skill is located in .claude/skills/my-skill, the /my-skill slash command is available.
However, when the skill is from a plugin e.g., plugin-skill, but /plugin:plugin-skill or /plugin-skill, both are not available.
What Should Happen?
Not sure which behavior is correct
| Type | Project | Plugin |
|------|---------|-------|
| Command | Visible | Visible |
| Skill | Current Visible | Current Invisible |
If the changelog is correct, all scenarios should be visible in /[command]
Error Messages/Logs
Steps to Reproduce
- Create a new plugin with plugin
- Install plugin in project-level or use
--plugin-dirto load it - Check
/skillsto ensure skill is available - Check
/[...]-> not visible if in the plugin
Claude Model
Opus
Is this a regression?
I don't know
Last Working Version
_No response_
Claude Code Version
2.1.3
Platform
Anthropic API
Operating System
macOS
Terminal/Shell
Other
Additional Information
_No response_
27 Comments
I'm seeing the same issue on macos. +1
Root Cause Analysis
I independently encountered this bug and did systematic testing to isolate the cause. Adding my findings here.
Finding: The
namefrontmatter field removes the plugin prefixWhen a file in the
commandsarray has anamefield in its frontmatter, Claude Code:namefield value as the command identifierSince skills require a
namefield in their frontmatter (it's part of the skill format), they lose their plugin prefix when added to the commands array and behave inconsistently in the autocomplete.Test Results
All files placed in
./commands/folder and added to thecommandsarray:| File | Frontmatter Fields | Result | Has Prefix? | In Autocomplete? |
|------|-------------------|--------|-------------|------------------|
|
test-command-format.md|description,allowed-tools|/rdc-os:test-command-format| ✅ Yes | ✅ Yes ||
test-with-version.md|description,version,allowed-tools|/rdc-os:test-with-version| ✅ Yes | ✅ Yes ||
test-with-invocable.md|description,user-invocable,allowed-tools|/rdc-os:test-with-invocable| ✅ Yes | ✅ Yes ||
test-with-name.md|description,name,allowed-tools|/test-with-name| ❌ No | ✅ Yes ||
test-skill-format.md|description,name,version,user-invocable|/test-skill-format| ❌ No | ⚠️ Partial |Additional Observations
user-invocable: truein theskillsarray don't appear in autocomplete at all (even though docs suggest they should)commandsarray as a workaround partially works - commands can be invoked by typing directly (e.g.,/my-skillworks) but only some appear in autocomplete dropdownExpected Behavior
The
namefield should set the identifier after the prefix:name: my-skill→/my-skillname: my-skill→/plugin-name:my-skillOr alternatively,
user-invocable: truein skills should make them appear in autocomplete with proper namespacing, without needing the commands array workaround.---
Cross-reference: I initially filed #17509 before finding this issue. Closing that as duplicate.
Workaround Found
For skills that need both auto-activation AND slash menu visibility with proper plugin prefix:
Steps:
namefield from skill frontmatter (this causes the command to use the filename instead)SKILL.mdto<skillname>.md(e.g.,sre.md)ln -s <skillname>.md SKILL.md(so the skills array still finds it for auto-activation)./skills/<name>/<name>.mdto thecommandsarray in marketplace.json./skills/<name>in theskillsarray (for auto-activation)Result:
/plugin-name:skillnameappears in autocomplete with proper prefix ✅Example structure:
marketplace.json:
Downside: Maintenance burden - each patched skill needs file rename, symlink, and frontmatter edit. Will need to unwind once the bug is fixed.
Note on symlinks: Git supports symlinks on macOS/Linux. Windows users may need
core.symlinks=trueconfigured.Great find @aaaaaandrew 🙏🏼 A useful middle ground for the time being.
Experiencing the same issue.
But adding some info.
It appears on the VSCode extension it does see the slash commands without the need of a workaround.
The same issue with v2.1.12
Workaround: Symlink plugin skills to
~/.claude/skills/Finding: This bug only affects skills. When plugins are enabled in
.claude/settings.json:/plugin:commandappears in autocomplete) ✓subagent_type="plugin:agent"✓/scientific-skills:anndata) but do not appear in autocomplete ✗Workaround: Symlink plugin skills to
~/.claude/skills/- this makes them appear as "user skills" which do show in autocomplete.Drawback: Symlinked skills lose the plugin namespace. They appear as
/skillnamerather than/plugin:skillnamebecause skills have aname:field in their YAML frontmatter that controls the display name (overriding the symlink filename). To preserve namespacing, plugin authors would need to remove thename:field from their skills (see this comment for that approach).Script: https://gist.github.com/shntnu/276e9b7309a14602955b3bda916d707c
The specific problem looks to be that directory skills and commands are treated differently than plugin skills
Root Cause
Two separate code paths for loading skills, visibility handled differently:
1. User Directory Skills (properly working)
Skills from
.claude/commands/and.claude/skillsloaded in a way such thatuser-invocablefrontmatter value is properly read2. Plugin Skills (broken)
Skills from plugins (marketplaces and
--plugin-dir) loaded in such a way thatuser-invocablefrontmatter value is just ignored, defaulting toisHidden: trueisHiddencontrols the visibility in/helpand general slash command completion. Since it's hardcoded totruefor plugin skills, they just never appear - regardless of whatuser-invocableis set to in the frontmatterProposed Fix
Respect the
user-invocablefrontmatter value for plugin skills, potentially just change the default, certainlyuser-invocable: trueshould make plugin skills visibleAdding skill directories directly to the commands array works without symlinks or file renames.
Keep the name field in SKILL.md frontmatter - it controls the display name in the slash menu. Directory paths (not SKILL.md files) in the commands array. Commands appear without plugin prefix, confirming @ts-shu's analysis that isHidden defaults to true for plugin skills regardless of user-invocable frontmatter.
Tested on v2.1.15, macOS.
@k3KAW8Pnf7mkmdSMPHz27 That workaround works great! However, I've noticed two caveats:
claude plugin marketplace addandclaude plugin install. I only tested this with a GitHub repo, so it's possible it works in other contexts.Not a big deal, but I thought I'd mention them.
For what it's worth @k3KAW8Pnf7mkmdSMPHz27's workaround works perfectly for me as of v2.1.20 if I install the plugin using
/pluginand if you omit thenameproperty insideSKILL.mdthen the plugin name prefix works as expected.@k3KAW8Pnf7mkmdSMPHz27 That workaround works great! Thank you! One caveat I noticed:
With v2.1.14 on Linux: If a skill is added into the "commands" list, when it gets invoked by /<this_skill>, Claude will use the current working directory as its base dir, so if its SKILL.md uses relative paths like "python3 scripts/a.py", the path to the script can be messed up depending on where Claude is launched etc.
But if the skill is not added to the "commands" list and is invoked by natural language, Claude uses the skill's dir as its base dir, and relative paths like above can work.
@abdcdd @k3KAW8Pnf7mkmdSMPHz27 the solution works as far as it shows in the autocomplete slash commands but it appears that any more complex skills with scripts/reference files stop working since they ignore the files inside. Treating it as command is not sufficient.
Could a fix be prioritized? 🙏
Simpler Workaround Discovered
We independently discovered a simpler workaround that doesn't require symlinks or file renaming:
Just Remove the
nameFieldDiscovery: Plugin skills appear correctly in slash autocomplete when the
name:field is completely removed from frontmatter.Verified:
/plugin-name:skill-namein autocompleteBefore (broken):
Result: Skill does NOT appear in
/plugin-name:autocomplete ❌After (works):
Result: Skill appears as
/plugin-name:my-skillin autocomplete ✅Evidence
Tested on plugin with 14 skills:
name:field - zero appeared in autocompletename:field from 3 skills - those 3 immediately appearedname:from all 14 skills - all 14 now appearWhy This Works
Per @aaaaaandrew's root cause analysis, the
namefield strips the plugin prefix. The official docs saynameis optional and defaults to directory name. Removing it entirely allows Claude Code to use the directory name AND preserve the plugin namespace.Environment
Recommendation
Until this bug is fixed, plugin developers should omit the
name:field from skill frontmatter entirely. The field provides no benefit (directory name is used anyway) and actively breaks slash command registration.Tested the "remove name field" workaround on macOS with Claude Code CLI and
--plugin-dir:/autocomplete after removing thenamefield from frontmatterWe verified skills are loaded correctly by invoking them directly with the full slash command (e.g.,
/bmad:teach-me-testing). This is how we've always checked skill loading — even before finding this issue and thecommandsarray workaround.Our current working workaround remains: adding skill directories to the
commandsarray inplugin.jsonand prefixing thenamefield in SKILL.md frontmatter with the plugin name (e.g.,name: bmad-teach-me-testing). This produces autocomplete entries like/bmad-teach-me-testing. The key goal is autocomplete visibility — without it, users have to know and type the exact command name.Environment: macOS, Claude Code CLI, local plugin via
--plugin-dir.@PabloLION That is my experience as well.
I can invoke the skill (by typing if fully as a slash command), but autocomplete does not work
@PabloLION I also can attest this doesn't work
I think may be a difference between a locally installed plugin vs GitHub installed.
My setup is installed through GitHub and this doesn't work for me
The symlink approach does work partially (I see the skills in the autocomplete) but it also shuts down the ability for the skill to utilize reference files like packaged scripts etc since it treats it as a command
Ok. I found a cleaner solution that works for complex skills with supporting files and subdirectories.
Instead of using the symlink workaround, put thin wrapper commands in the
commands/folder withdisable-model-invocation: true, and move the actual implementation to hidden skills inskills/_name/withuser-invocable: false.The wrapper just says "Invoke the plugin:_name skill with $ARGUMENTS". Commands get proper namespace prefixes in autocomplete, the hidden skills stay out of the menu but can still be invoked programmatically, and you keep full support for reference files, task subdirectories, etc.
This issue seems fixed on v2.1.29, can you confirm? At least, I did not do any workaround and suddenly skills start to appear on the command palette and autocomplete.
I can see the autocomplete in v2.1.29
Yes, I can confirm it works for me as well now with v2.1.29
Update: Confirmed fixed in v2.1.29 🎉
Following up on my earlier test — the fix is now working. We've successfully removed all workarounds from our plugin:
name: bmad-*from all 34 SKILL.md frontmatterscommandsarray from plugin.jsonAll skills now appear correctly in
/bmad:autocomplete with the proper namespace format.Simple test to verify:
Environment: macOS, Claude Code CLI v2.1.29, local plugin via
--plugin-dirThis issue can likely be closed now. Thanks for the fix!
Adding a real-world use case that highlights the severity of this issue at scale.
I maintain StratArts, a marketplace plugin with 27 business strategy skills (e.g.,
business-idea-validator,market-opportunity-analyzer,brand-identity-designer, etc.).Because the
namefrontmatter field strips the plugin namespace prefix, all 27 skills appear in the/autocomplete menu as standalone entries (/business-idea-validator,/brand-identity-designer, etc.) instead of namespaced entries (/stratarts:business-idea-validator,/stratarts:brand-identity-designer).This creates two problems:
/stratartsto filter to just our plugin's skills.competitive-intelligenceorpricing-strategy-architectcould easily collide with skills from other plugins as the marketplace grows.The symlink workaround described above is not practical for 27 skills — it would require 27 renames, 27 symlinks, 27 frontmatter edits, and a 27-entry
commandsarray in plugin.json. That's a significant maintenance burden.Preferred fix: The
namefield in SKILL.md frontmatter should preserve the plugin namespace prefix, so/stratarts:business-idea-validatorappears in autocomplete instead of/business-idea-validator. This is howcommands/*.mdalready works — skills should behave identically.Simply removing the
namefrom the skill did work for me with a local plugin.name: ...from plugin skillcc 2.1.49
https://github.com/anthropics/claude-code/issues/17271#issuecomment-3818154966
Hit this bug with a plugin that has 14 skills, all with
name:in frontmatter. Decompiledcli.js, found the exact line, patched it, verified it works. Here's everything.---
TL;DR — Problem:
userFacingName()returns"my-skill"instead of"my-plugin:my-skill". Autocomplete usesuserFacingName()for matching, so/my-plugin:my-skillnever matches — falls back to the last registered skill.TL;DR — Fix (verified on v2.1.81):
One unique string in the file. Restart Claude Code. Done.
---
What happens
Typing
/my-plugin:in autocomplete always resolves to the same wrong skill — whichever was added last to the plugin. It's not random:/my-plugin:anythingalways resolved toskill-13(the last one added)/my-plugin:anythingnow always resolves toskill-14/my-plugin:— it always picks the same oneWhat works fine:
/my-skill(without prefix) → shows disambiguation menu, I pick the right one ✓Skill("my-plugin:my-skill")via the Skill tool → resolves correctly ✓So the slash command autocomplete is broken, but the internal Skill tool resolution isn't. That's what pointed me to
userFacingName()vsnameas two separate code paths.This is NOT the same bug fixed in v2.1.29
v2.1.29 fixed plugin skills not appearing in autocomplete (
isHidden). This is different — skills appear but/plugin:skillresolves to the wrong one whenname:is in frontmatter.| Bug | Fixed in v2.1.29? | Status |
|-----|-------------------|--------|
| Plugin skills don't appear in autocomplete | Yes | Fixed |
|
/plugin:skillresolves to wrong skill | No | Still broken in v2.1.81 |Why "remove
name:" doesn't work for everyoneThe workaround adopted by most people in this thread works for simple skills. But it breaks skills that rely on
namefor:---
Reproduction
| Action | Expected | Actual |
|--------|----------|--------|
| Type
/my-plugin:my-skillin autocomplete | Resolves to my-skill | Always resolves to last skill added || Type
/my-skillin autocomplete | Shows disambiguation | Shows disambiguation ✓ || Skill tool:
Skill("my-plugin:my-skill")| Loads my-skill | Loads my-skill ✓ ||
skill.name|"my-plugin:my-skill"|"my-plugin:my-skill"✓ ||
skill.userFacingName()|"my-plugin:my-skill"|"my-skill"✗ |---
Root Cause (source code)
Decompiled
cli.jsv2.1.81. The plugin skill constructor builds the name correctly butuserFacingName()drops the prefix.Variable names
ZandAare the actual minified names fromcli.js:---
Fix
The pattern
userFacingName(){return Z||A}occurs exactly once incli.js(v2.1.81).Three options compared:
| | Code | Example: dir=
my-skill/, frontmattername: cool-skill| Notes ||---|---|---|---|
| Current (broken) |
return Z \|\| A|"cool-skill"— no prefix | Autocomplete can't match/my-plugin:*|| Option 1 (tested) |
return A|"my-plugin:my-skill"— uses directory | Ignores frontmatternamefor display. Works when dir name = frontmatter name. || Option 2 (recommended) |
return Z ? prefix+':'+Z : A|"my-plugin:cool-skill"— uses frontmatter | Preserves custom name with prefix. Respects plugin author's intent. |Option 1 — always use the computed name (this is what I tested):
Option 2 — preserve frontmatter name, add plugin prefix:
---
How to apply option 1 (all OS)
cli.js:1):1):/my-plugin:my-skill— resolves correctly.Quick test without patching your install:
---
Related Issues
All closed as duplicates of this one:
Before fix —
/my-plugin:always resolves to the wrong skill:<img width="615" height="128" alt="Image" src="https://github.com/user-attachments/assets/b2a2884a-5a25-4d7b-a83d-482e76e3b6a5" />
After fix —
/my-plugin:resolves correctly:<img width="531" height="234" alt="Image" src="https://github.com/user-attachments/assets/d2d2cf7e-e9f4-4194-83b4-e2c9df363e98" />
This is the same issue as #18949 — plugin-installed skills don't appear in slash command autocomplete, while locally installed skills do.
See workarounds in my comment on #18949: https://github.com/anthropics/claude-code/issues/18949#issuecomment-4159551466
TL;DR:
~/.claude/skills/for autocomplete