A skill is a folder, a markdown file and one line that decides whether it ever fires. Most broken skills are broken in that one line.
Last updated: 2026-09-21 · Paths and frontmatter fields checked against the official Claude Code skills documentation on this date.
A skill is a named procedure you can call by name, and that Claude can reach for on its own when the moment matches. It is one file:
mkdir -p .claude/skills/ship-check
$EDITOR .claude/skills/ship-check/SKILL.md
Then, inside that file:
---
name: ship-check
description: Pre-commit gate. Run tests, lint and type check; report PASS/FAIL
per step and anything that could not run. Use before any commit or PR.
---
1. Read `CLAUDE.md` for the test / lint / typecheck commands.
2. Run each one. Capture the exit code and the last 20 lines of output.
3. Report a table: Step | PASS/FAIL | detail. A step that couldn't run is FAIL,
never skipped silently.
4. If anything failed, say what to fix first. Don't fix it unless asked.
Start a session in that repo and type /ship-check. That is the whole mechanism. Everything below is the part people get wrong on the second one.
The one hard rule. The opening --- must be the very first line of the file. If anything precedes it — a blank line, a title, a stray space — Claude Code treats the entire file as instructions and never parses the frontmatter. The skill still “works” when you call it by name, which is exactly why this one is hard to spot: it simply never fires on its own.
| Scope | Path | Loads when |
|---|---|---|
| Project | .claude/skills/<name>/SKILL.md | You are working in that repo. Commit it to share with the team. |
| Personal | ~/.claude/skills/<name>/SKILL.md | Every project on your machine. |
| Monorepo subdir | <subdir>/.claude/skills/<name>/SKILL.md | Claude is working on files in that subdirectory. |
| Plugin | <plugin>/skills/<name>/SKILL.md | The plugin is installed. Invoked as /plugin-name:skill-name. |
The folder name is the command. .claude/skills/deploy-staging/ gives you /deploy-staging. The name: field in the frontmatter is a display name — renaming it does not rename the command, which is worth knowing before you spend ten minutes wondering why /my-nice-name is not found.
Every frontmatter field is optional. description is the one that matters, because it is not a label — it is the trigger. Claude reads it to decide whether to apply the skill without being asked.
So write it as when, not what:
| Never fires | Fires |
|---|---|
description: Ship check | description: Run tests, lint and type check and report PASS/FAIL per step. Use before any commit or PR. |
description: Diff helper | description: Explain the current git diff in plain English and flag the risky lines. Use when the user asks what changed or wants a second read before pushing. |
The first column is what a person would name a file. The second is what someone would say when they want it. Write the second and the skill starts showing up on its own.
While you are tuning it, you can always invoke a skill directly by name as a slash command — the two paths are independent, so a skill that never auto-fires is still perfectly usable.
| Field | What it does |
|---|---|
description | When to use the skill. The auto-invocation trigger. |
allowed-tools | Pre-approves tools for this skill only, e.g. Bash(git *) Read. Narrow beats broad. |
disallowed-tools | Removes tools while the skill runs. |
disable-model-invocation | Only you can call it; Claude will not reach for it. Good for anything destructive. |
paths | Globs that limit when the skill is in play, e.g. src/**/*.ts. |
model / effort | Override the session model or effort level for this skill. |
A skill can also be a folder rather than a lone file: put reference.md or scripts/helper.sh beside SKILL.md and refer to them from the steps. That is usually the right move once a skill's instructions pass a screenful.
Three things get confused constantly, and only one of them is a skill:
.claude/settings.json is what stops the “can I run npm test?” prompt for the fortieth time.If your complaint is “it asks permission for everything”, no skill will fix it — that is the allowlist: Claude Code keeps asking permission. If it is “it re-learns my repo every session”, that is CLAUDE.md: Claude Code forgets my project.
/ and look for the folder name. Missing means the path or the filename is wrong — it is SKILL.md, capitalised, inside a folder named for the command.description is a label, not a trigger.The ship-check skill above is not an illustration — it is the real file from our free starter repo, MIT licensed. The repo also ships new-feature and explain-diff, a .claude/settings.json with the allow and deny lists already filled in, a CLAUDE.md to copy, and a formatter hook. No dependencies, no telemetry. Read the whole thing in five minutes.
Want the same three skills as installable plugins instead of copied files? kit-plugins, also free.
Free first — the starter above is a complete setup and costs nothing. Two paid rungs exist for the two reasons people give up on doing it themselves:
| Rung | What you get | Clock |
|---|---|---|
| Free — starter repo | Three skills, the allowlist, a CLAUDE.md, a hook. Generic on purpose. | now |
| $29 — Skills & Hooks Pack | A download: more skills and hooks to copy, with install notes. Still your writing job, just less of it. | instant |
| $29 — Setup Lite | Written from your repo: a CLAUDE.md with your real commands, the allowlist and one skill, handed back as a pull request you read and merge. | 24 hours from a complete intake |
Clocks run from a complete intake, not from the Stripe receipt. We use AI tools including Claude to produce the work, and a person reviews every deliverable before it ships.