[BUG] Fully-qualified plugin command namespace ignored — local skill executed instead
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?
When invoking a plugin command using its fully-qualified namespace
(e.g., /spearit-framework:move feat-201 todo), Claude Code silently
executed a different command — a local .claude/commands/ skill namedfw-move — without any error, warning, or platform-level indication
that the wrong command ran. The move succeeded by coincidence (both
commands perform the same operation). The mis-dispatch was only caught
because the user was actively monitoring the output; no system
mechanism flagged it.
What Should Happen?
The fully-qualified namespace /spearit-framework:move should
unambiguously route to the plugin command defined inplugins/spearit-framework/commands/move.md. The namespace exists
precisely to prevent collision and should be enforced at dispatch time,
not treated as a hint.
Error Messages/Logs
No error was produced. The wrong command ran silently and produced
plausible-looking output.
Steps to Reproduce
- Install a plugin with a command (e.g.,
spearit-framework:move) - Have a local
.claude/commands/skill with a similar name/intent
(e.g., fw-move) in the same project
- In a VSCode session where the local skill has previously been invoked,
type the fully-qualified plugin command:
/spearit-framework:move feat-201 todo
- Observe that the local
fw-moveskill SOMETIMES executes instead of the plugin
command
- No error is reported; output appears correct
Claude Model
Sonnet (default)
Is this a regression?
I don't know
Last Working Version
_No response_
Claude Code Version
2.1.45
Platform
Other
Operating System
Windows
Terminal/Shell
VS Code integrated terminal
Additional Information
This is distinct from #24420 (autocomplete resolves to first plugin when
multiple plugins share a skill name). That issue notes that manually typing
the fully-qualified name works as a workaround — our case is the opposite:
the fully-qualified name was used explicitly and was still not respected.
The root cause appears to be that Claude Code passes the <command-name>
tag to Claude as text with no runtime dispatcher enforcing namespace routing.
Claude pattern-matches on intent and session context. A recently-invoked local
command with similar intent can override an explicitly namespaced plugin command.
If the colliding commands had different effects (e.g., a release command that
deploys vs. one that archives work items), silent mis-dispatch could cause
irreversible damage with no indication anything went wrong.
This issue has 4 comments on GitHub. Read the full discussion on GitHub ↗