Skill tool cannot invoke custom slash commands from .claude/commands/ or .claude/skills/
Description
The Skill tool cannot programmatically invoke custom slash commands defined in .claude/commands/ or .claude/skills/. Only built-in bundled skills (e.g., simplify, batch, claude-api) work via the Skill tool.
Expected Behavior
Custom slash commands (.claude/commands/*.md) and custom skills (.claude/skills/*/SKILL.md) should be invokable via the Skill tool, enabling Claude to trigger them programmatically during a conversation — not just when the user types /command directly.
Actual Behavior
.claude/commands/plan.md->Skill("plan")returns: "Skill plan is not a prompt-based skill".claude/skills/plan/SKILL.md(withnamefield) -> same error: "Skill plan is not a prompt-based skill".claude/skills/test-skill/SKILL.md(created mid-session) -> "Unknown skill: test-skill"- Built-in
Skill("simplify")-> works correctly
Reproduction Steps
- Create
.claude/commands/mycommand.mdwith valid frontmatter:
``yaml``
---
description: A test command.
---
Do something with $ARGUMENTS
- In a conversation, have Claude invoke
Skill("mycommand") - Error: "Skill mycommand is not a prompt-based skill"
- Alternatively, create
.claude/skills/mycommand/SKILL.mdwith:
``yaml``
---
name: mycommand
description: A test skill.
---
Do something with $ARGUMENTS
- Same error (or "Unknown skill" if created mid-session)
Tested Variations
| Location | Frontmatter | Result |
|----------|------------|--------|
| .claude/commands/plan.md | description: only | "not a prompt-based skill" |
| .claude/skills/plan/SKILL.md | description: only | "not a prompt-based skill" |
| .claude/skills/plan/SKILL.md | name: + description: | "not a prompt-based skill" |
| .claude/skills/plan/SKILL.md | With old command removed | "not a prompt-based skill" |
| .claude/skills/test-skill/SKILL.md | Created mid-session | "Unknown skill" |
| Built-in simplify | N/A | Works |
Environment
- Claude Code CLI (Opus 4.6)
- macOS Darwin 25.2.0
- Permissions:
Skill(*)explicitly allowed in.claude/settings.local.json
Why This Matters
We have a plugin (claude-specify) that installs a pipeline of slash commands (/specify -> /plan -> /tasks -> /implement). The workflow requires Claude to invoke the next pipeline stage programmatically. Currently, only the user can trigger each stage by manually typing the /command, which breaks the autonomous pipeline flow.
The skills documentation suggests custom skills should be invokable by Claude, but this does not work in practice.
This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗