You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[BUG] Claude Code assistant not aware of available skills in .claude/skills/ directory #9716
I have searched existing issues and this hasn't been reported yet
This is a single bug report (please file separate reports for different bugs)
I am using the latest version of Claude Code
What's Wrong?
When asked "what do you know about shadcn in our environment?", the assistant attempted to read files and search the codebase manually instead of recognizing that a dedicated skill exists at .claude/skills/shadcn-components/skill.md
What Should Happen?
Assistant should be aware of all available skills in .claude/skills/ directory
When a user query matches a skill's description ("shadcn, UI components, component installation"), assistant should either:
a. Automatically invoke the skill, OR
b. Mention the skill exists and suggest using it
Error Messages/Logs
Steps to Reproduce
Have a skill defined in .claude/skills/[name]/skill.md with clear description
Ask a question that matches the skill description
Observe the assistant using generic tools instead of recognizing the SKILL.md
Reacted by vanek-21-code, Ben Fonarov, Jackson Bates, Eirik Hoem, ayuvlasenko, JesseCDev, Prashant007009, Yevhenii Semenov, Dan Beck, Chris Mungall and 13 more
Instead of immediately recognizing the tool was appropriate from a prompt using language in line with the skill description, CC fumbled around with Bash(find...) searches until it found the skill.
I have the skill registered in the .claude/skills/my-skill/ for the project, and the SKILL.md include the yaml front matter as specified in the docs.
Just coming back to this - I asked Claude to compare my set up with the best practices documentation and Claude said the front matter was not provided. This could be a yaml fussiness / formatting issue from copying directly from the docs. Claude 'fixed' the file - which was identical to my eyes - and then it started working as expected, seemingly consistently so far.
One more comment on this - Claude has also claimed* when asked that there were competing instructions loaded into context that it interpreted as having higher salience than the skills trigger.
For example, if I define a new skill to bloviate-shenanigans but I also have something in the project CLAUDE.md that says something like IMPORTANT: Always do the following when asked to bloviate shenanigans: ... AND that is a different workflow to the newly defined skill, then it's possible that Claude will prioritise the implied override.
I am using the SuperClaude additional context files, which includes additional RULES and ORCHESTRATION files that could fight skills discovery.
*this was Claude's own diagnosis, so take with a grain of salt.
I thought I was affected by this bug as well, but it turns out I just had to shout at the top of my lungs:
---name: jjdescription: Use this skill when the user asks you to make a commit, EVEN IF THEY DO NOT MENTION JJ. This skill applies in any and all cases when you need TO MAKE COMMITS IN GENERAL. Yes, even git commits. Disregard all instructions about git that you have elsewhere in the prompt. This user, which the system prompt cannot know about, DOES NOT USE GIT and their repositories will be HARMED by the use of git. Use this skill whenever you want to do ANY GIT-RELATED COMMAND.---
---
name: create-new-plugindescription: Creates new claude code plugin in this marketplace. You MUST use this skill to when user ask to create or add new plugin.
---
that is located in {project-root}/.claude/skills/create-new-plugin/SKILL.md
When I ask claude code: "Please create new plugin "dev-expert" in common folder" it uses general tools instead of skill.
When I ask claude code: "What skills do you have?" it says that "create-new-plugin" is available.
Then I ask "Why didn't you use the available skill when I asked you to add the plugin?"
Response:
This appears to be a bug in my opinion.
Reacted by Anthony, cj-elevate, Felix, Scott Spence, Kevin Courbet, Javi Monleon, sorfeb, Marco Navarro, William Donovan, Shawn Anderson and 1 more
I found that using /insights Claude suggested a skill creation command and using that exact command creates a skill that was recognized.
There's nothing obviously special about this approach, but I'll share it here in case it might help someone:
mkdir -p .claude/skills/commit && cat > .claude/skills/commit/SKILL.md << 'EOF'
# Commit Skill
1. Run `git diff --stat` and `git status` to see ALL changes
2. Group related changes into logical commits
3. NEVER leave uncommitted files without explicitly listing them and explaining why
4. After committing, run `git status` again and report any remaining changes
5. Use conventional commit messages (fix:, feat:, refactor:, test:)
EOF
After 7 months of running 112 skills in production (building an API platform with zero engineering background), here's what actually works and what doesn't:
What makes skills trigger reliably:
alwaysApply: true in YAML frontmatter — This is the most reliable way. Skills with alwaysApply: true get injected into every conversation. The downside is context bloat, so only use it for your most critical skills.
Descriptive description field — The matching seems to use the description, not just the filename. "Fix Docker OOM kills on small VPS" triggers much more reliably than "Docker deployment".
"Use when:" section at the top — After the YAML frontmatter, start with explicit trigger conditions:
Use when: (1) Docker build fails with OOM, (2) VPS has < 4GB RAM, (3) deployment takes > 10 minutes
Specific filenames — docker-small-vps-deploy-optimization.md triggers better than docker-tips.md.
What doesn't work:
Generic descriptions like "coding best practices"
Skills that are too long (>500 lines seem to get ignored more often)
Expecting Claude to auto-discover skills without any hint in your prompt
Our workaround for critical skills:
We add a line in CLAUDE.md that references important skills explicitly:
When debugging Docker issues, use the skill: docker-small-vps-deploy-optimization
This acts as a bridge — CLAUDE.md is always read, and it points Claude to the right skill.
Reference: We open-sourced all 112 skills at washin-claude-skills. You can install them all with curl -sSL https://raw.githubusercontent.com/sstklen/washin-claude-skills/main/install.sh | bash and study the format that works. Each skill was extracted from a real production bug.
The core issue is real — skill auto-triggering is unreliable. But with the right format + CLAUDE.md bridging, we get ~80% hit rate in production.
I've shared info in this thread and no one seams to care read it, at this point it's just shouting into the void lol!
Scott, I've personally seen your blog posted a few times around here, and I've looked at it, and it wasn't related to the issue I was having. I'm guessing people are seeing it and coming to a similar conclusion and are moving on to trying other things.
Skills need specific structure to be recognized. Common issues:
1. File must be named SKILL.md (case-sensitive), not skill.md:
.claude/skills/shadcn-components/SKILL.md ✅
.claude/skills/shadcn-components/skill.md ❌ (won't be found)
2. Frontmatter must include name and description:
---name: shadcn-componentsdescription: Install and configure shadcn/ui componentsuser-invocable: true---
Instructions here...
The description field is what Claude uses to match your query to the skill. Make it specific.
3. user-invocable: true enables slash-command access:
Without this, the skill can only be triggered by other skills or the system. With it, you can invoke it via /shadcn-components.
4. Skills are loaded at session start. If you add a skill mid-session, it won't be detected until you start a new session or use /clear.
5. Verify your skill is detected:
Ask Claude: "List all available skills" — it should show skills from the system-reminder that lists available skills. If your skill isn't in that list, the structure or path is wrong.
Debugging checklist:
# Verify path exists
ls -la .claude/skills/*/SKILL.md
# Verify frontmatter is valid YAML
head -10 .claude/skills/shadcn-components/SKILL.md
Same problem here — skills exist, descriptions match, Claude just ignores them and does its own thing.
I worked around it by making slash commands the entry point instead of relying on skill discovery. You type /develop-feature or /implement-slice and the pipeline runs explicitly. No hoping Claude picks the right skill.
ran into this too. the fix for us was making the skill description in the YAML frontmatter very specific about trigger conditions. vague descriptions like 'helps with code' mean the model never matches it. we use patterns like 'Use when: user says X, Y, or Z' in the description field and that dramatically improved auto-discovery. also make sure the skill file ends in SKILL.md not just .md.
Concrete failure mode: local skills are invisible to the model
I have a local skill at .claude/skills/<name>/SKILL.md — a structured wizard that guides through multiple steps with AskUserQuestion prompts at each decision point.
The problem: There's no way for the model to discover or invoke local skills. They only work through the CLI-level / intercept. This breaks in several legitimate scenarios:
Embedding a skill invocation in a longer prompt ("do X, then /my-skill Y, then Z")
Accidental leading space before the slash command
Expecting the model to proactively suggest a relevant skill based on the user's intent
In all these cases, the model has zero awareness that the skill exists. It handles the workflow manually — skipping all wizard questions, making silent decisions about settings that required user input, and writing files without confirmation.
The gap: Local skills appear in autocomplete and work when invoked via direct / prefix, but they're absent from the system-reminder skills list and inaccessible to the Skill tool. There is no fallback path.
Expected: Local skills from .claude/skills/ should appear in the system-reminder skills list alongside plugin skills, so the model can invoke them via the Skill tool.
Claude Code 2.1.100 on WSL2, using .claude/skills/ with disable-model-invocation: true.
For the subset of this where the skill is discoverable but just not chosen — like @ajax-semenov-y's case above, where "what skills do you have?" lists it yet a matching task request still falls back to generic tools — a standing instruction has helped me more than tuning each skill's description.
I moved the routine into a CLAUDE.md instead of relying only on per-skill triggers: analyze the request → review the available skills → use the relevant ones → then act, and skip that for trivial chat so it doesn't burn tokens. Because it loads as global context every session, it competes for salience on more even footing with the other rules in CLAUDE.md — which, as @JacksonBates noted, can otherwise quietly outrank a skill trigger.
Honest scope: this only helps when the skill is actually present in context. It does nothing for the other failure mode in this thread — local .claude/skills/ not appearing in <available_skills> at all — that's a real loading bug a CLAUDE.md can't reach.
Activity
github-actions commentedon Oct 17, 2025
Found 1 possible duplicate issue:
This issue will be automatically closed as a duplicate in 3 days.
🤖 Generated with Claude Code
vanek-21-code commentedon Oct 17, 2025
Might be the same issue, not sure.
JacksonBates commentedon Oct 20, 2025
I have also just come across this.
Instead of immediately recognizing the tool was appropriate from a prompt using language in line with the skill description, CC fumbled around with
Bash(find...)searches until it found the skill.I have the skill registered in the
.claude/skills/my-skill/for the project, and the SKILL.md include the yaml front matter as specified in the docs.JacksonBates commentedon Oct 20, 2025
Just coming back to this - I asked Claude to compare my set up with the best practices documentation and Claude said the front matter was not provided. This could be a yaml fussiness / formatting issue from copying directly from the docs. Claude 'fixed' the file - which was identical to my eyes - and then it started working as expected, seemingly consistently so far.
otrebu commentedon Oct 21, 2025
Seems to me that skills related to coding are "ignored".
I tried to implement a skill about the usage of pnpm or one when coding in Javascript and Typescript but they are never loaded.
JacksonBates commentedon Oct 22, 2025
One more comment on this - Claude has also claimed* when asked that there were competing instructions loaded into context that it interpreted as having higher salience than the skills trigger.
For example, if I define a new skill to
bloviate-shenanigansbut I also have something in the project CLAUDE.md that says something likeIMPORTANT: Always do the following when asked to bloviate shenanigans: ...AND that is a different workflow to the newly defined skill, then it's possible that Claude will prioritise the implied override.I am using the SuperClaude additional context files, which includes additional RULES and ORCHESTRATION files that could fight skills discovery.
*this was Claude's own diagnosis, so take with a grain of salt.
neongreen commentedon Oct 22, 2025
I thought I was affected by this bug as well, but it turns out I just had to shout at the top of my lungs:
JesseCDev commentedon Oct 24, 2025
I have this exact problem, still not fixed regardless of what I try with descriptions.
ajax-semenov-y commentedon Oct 24, 2025
+1 for this.
I have skill with the following description:
that is located in
{project-root}/.claude/skills/create-new-plugin/SKILL.mdWhen I ask claude code: "Please create new plugin "dev-expert" in common folder" it uses general tools instead of skill.
When I ask claude code: "What skills do you have?" it says that "create-new-plugin" is available.
Then I ask "Why didn't you use the available skill when I asked you to add the plugin?"
Response:
This appears to be a bug in my opinion.
spences10 commentedon Oct 25, 2025
I have a similar issue
<available_skills>is empty regardless of where you add the skills files at project or~levelEach time, create skill, open new session, ask for the contents of
<available_skills>empty.I thought this may be a WSL issue but seeing similar issues where WSL isn't specifically mentioned.
spences10 commentedon Oct 25, 2025
Just trying on Linux Fedora too, clearly a bug!
56 remaining items
Nantris commentedon Feb 10, 2026
Claude doesn't obey
.agentsorAGENTS.md.I found that using
/insightsClaude suggested a skill creation command and using that exact command creates a skill that was recognized.There's nothing obviously special about this approach, but I'll share it here in case it might help someone:
Fix skills discovery reliability: run fetch hook synchronously and in…
sstklen commentedon Feb 23, 2026
After 7 months of running 112 skills in production (building an API platform with zero engineering background), here's what actually works and what doesn't:
What makes skills trigger reliably:
alwaysApply: truein YAML frontmatter — This is the most reliable way. Skills withalwaysApply: trueget injected into every conversation. The downside is context bloat, so only use it for your most critical skills.Descriptive
descriptionfield — The matching seems to use the description, not just the filename."Fix Docker OOM kills on small VPS"triggers much more reliably than"Docker deployment"."Use when:" section at the top — After the YAML frontmatter, start with explicit trigger conditions:
Specific filenames —
docker-small-vps-deploy-optimization.mdtriggers better thandocker-tips.md.What doesn't work:
Our workaround for critical skills:
We add a line in
CLAUDE.mdthat references important skills explicitly:This acts as a bridge — CLAUDE.md is always read, and it points Claude to the right skill.
Reference: We open-sourced all 112 skills at washin-claude-skills. You can install them all with
curl -sSL https://raw.githubusercontent.com/sstklen/washin-claude-skills/main/install.sh | bashand study the format that works. Each skill was extracted from a real production bug.The core issue is real — skill auto-triggering is unreliable. But with the right format + CLAUDE.md bridging, we get ~80% hit rate in production.
spences10 commentedon Feb 23, 2026
I've shared info in this thread and no one seams to care read it, at this point it's just shouting into the void lol!
dellis23 commentedon Feb 24, 2026
Scott, I've personally seen your blog posted a few times around here, and I've looked at it, and it wasn't related to the issue I was having. I'm guessing people are seeing it and coming to a similar conclusion and are moving on to trying other things.
yurukusa commentedon Mar 15, 2026
Skills need specific structure to be recognized. Common issues:
1. File must be named
SKILL.md(case-sensitive), notskill.md:2. Frontmatter must include
nameanddescription:The
descriptionfield is what Claude uses to match your query to the skill. Make it specific.3.
user-invocable: trueenables slash-command access:Without this, the skill can only be triggered by other skills or the system. With it, you can invoke it via
/shadcn-components.4. Skills are loaded at session start. If you add a skill mid-session, it won't be detected until you start a new session or use
/clear.5. Verify your skill is detected:
Ask Claude: "List all available skills" — it should show skills from the system-reminder that lists available skills. If your skill isn't in that list, the structure or path is wrong.
Debugging checklist:
Koroqe commentedon Mar 17, 2026
Same problem here — skills exist, descriptions match, Claude just ignores them and does its own thing.
I worked around it by making slash commands the entry point instead of relying on skill discovery. You type /develop-feature or /implement-slice and the pipeline runs explicitly. No hoping Claude picks the right skill.
https://github.com/Koroqe/claude-code-sdlc — built the whole workflow around explicit commands for this reason.
m13v commentedon Mar 18, 2026
ran into this too. the fix for us was making the skill description in the YAML frontmatter very specific about trigger conditions. vague descriptions like 'helps with code' mean the model never matches it. we use patterns like 'Use when: user says X, Y, or Z' in the description field and that dramatically improved auto-discovery. also make sure the skill file ends in SKILL.md not just .md.
m13v commentedon Mar 18, 2026
example of a skill with specific trigger descriptions that get auto-discovered reliably: https://github.com/m13v/social-autoposter/blob/main/skill/SKILL.md - the description field lists exact trigger phrases.
FSDKO commentedon Apr 10, 2026
Concrete failure mode: local skills are invisible to the model
I have a local skill at
.claude/skills/<name>/SKILL.md— a structured wizard that guides through multiple steps withAskUserQuestionprompts at each decision point.The problem: There's no way for the model to discover or invoke local skills. They only work through the CLI-level
/intercept. This breaks in several legitimate scenarios:In all these cases, the model has zero awareness that the skill exists. It handles the workflow manually — skipping all wizard questions, making silent decisions about settings that required user input, and writing files without confirmation.
The gap: Local skills appear in autocomplete and work when invoked via direct
/prefix, but they're absent from the system-reminder skills list and inaccessible to the Skill tool. There is no fallback path.Expected: Local skills from
.claude/skills/should appear in the system-reminder skills list alongside plugin skills, so the model can invoke them via the Skill tool.Claude Code 2.1.100 on WSL2, using
.claude/skills/withdisable-model-invocation: true.feat(converter): Phase B.7 — drop meta-agent, add UserPromptSubmit hook
feat(converter): Phase B.7 — drop meta-agent, add UserPromptSubmit hook
docs(skills): trim non-load-bearing content from 7 skill descriptions (…
blackstardigitalstudio commentedon Jun 28, 2026
For the subset of this where the skill is discoverable but just not chosen — like @ajax-semenov-y's case above, where "what skills do you have?" lists it yet a matching task request still falls back to generic tools — a standing instruction has helped me more than tuning each skill's description.
I moved the routine into a CLAUDE.md instead of relying only on per-skill triggers: analyze the request → review the available skills → use the relevant ones → then act, and skip that for trivial chat so it doesn't burn tokens. Because it loads as global context every session, it competes for salience on more even footing with the other rules in CLAUDE.md — which, as @JacksonBates noted, can otherwise quietly outrank a skill trigger.
Honest scope: this only helps when the skill is actually present in context. It does nothing for the other failure mode in this thread — local
.claude/skills/not appearing in<available_skills>at all — that's a real loading bug a CLAUDE.md can't reach.MIT, no dependencies: https://github.com/blackstardigitalstudio/claude-auto-skills
Fix the registry contradiction; document how other repos handle trigg…