Guides creation of Claude Code skills with proper SKILL.md format and progressive disclosure.
Procedure for authoring Claude Code Agent Skills. A skill is a directory with a SKILL.md file; optional bundled scripts and reference .md files sit beside it and load only when needed.
At startup Claude preloads only the name + description of every installed skill into its system prompt. When a task matches, Claude reads the full SKILL.md body into context. Bundled files (reference/*.md, scripts/*) are read only when the body points to them. This is progressive disclosure: metadata → body → bundled files. Design each level to be the smallest thing that lets Claude decide whether to go deeper.
skills/<kebab-name>/SKILL.md. Directory name is the on-disk identity — don't rename it after wiring.description is the single highest-impact line — write it as a routing rule, not a summary.reference/*.md files and link them.Claude Code reads a fixed set of keys and silently ignores unknown ones (so a typo'd field just disappears — no error).
name: Skill Name # REQUIRED. Display label. Max 64 chars. Keep stable — wiring references it.
description: > # REQUIRED. The routing engine (see below). Use > or | for multi-line.
What it does. Use when <triggers>.
disable-model-invocation: true # Hide from Claude's auto-trigger AND remove description from context.
user-invocable: false # Hide from the / menu but keep in context for auto-trigger.
argument-hint: "[arg]" # Autocomplete hint for invocable skills.
allowed-tools: Read, Grep # Pre-approves these tools so the skill's procedure doesn't prompt.
# ADDITIVE only — does not restrict what's available.
context: fork # Run the skill in an isolated subagent context window.
model: sonnet # Per-skill model override (sonnet | opus | haiku).
Scope allowed-tools Bash where you can: Bash(git *), Bash(python3 *). Never list a tool the procedure doesn't actually run.
The description is Claude's decision engine for whether to load the skill — not documentation for humans. Write it for the model.
Shape: <what it does>. Use when <concrete trigger scenarios + words a user would actually type>.
Worked example — turning a weak description into a routing rule:
# WEAK — describes, doesn't route. Claude can't tell when to fire it.
description: Documentation standards for the project.
# STRONG — states the job, then enumerates concrete triggers.
description: >
Documentation standards and code-to-docs sync — JSDoc/TSDoc, README/CHANGELOG
structure, auto-generated API reference, staleness detection. Use when writing or
reviewing docs, adding JSDoc to exported functions, structuring a docs/ tree, or
running /forge:docs-status, /forge:docs-audit, /forge:docs-update.
The body stays in context for the rest of the turn once loaded, so every line is recurring token cost. Keep SKILL.md a lean overview + navigation; push depth into bundled files.
When to split a section out to reference/<topic>.md:
SKILL.md is heading past ~500 lines.Link from the body with a resources section so Claude knows the file exists and when to read it:
## Additional resources
- For the OWASP Top-10 mapping, see [reference/owasp.md](reference/owasp.md)
- For fillable-PDF form handling, see [reference/forms.md](reference/forms.md)
Claude reads a linked file only when the current task needs it — bundled context is effectively unbounded because it isn't all paid for up front.
If a step is deterministic and error-prone for a model (sorting, parsing, extracting PDF form fields, computing a hash), ship a real runnable script in scripts/ and tell the body to run it rather than reason through it. In the body, be explicit whether Claude should execute a file or read it as reference — the two modes look identical on disk.
Only add a script if it is complete and runnable. A stub script is worse than inline prose guidance.
whenToUse (camelCase — the valid field is the snake_case when_to_use), shortname, avatar, exampleQueries. Put trigger phrases in description or the valid when_to_use field, not in an invented key. (Note: when_to_use is valid on skills but NOT on agents — agents fold "when to use" into description with <example> blocks.)disable-model-invocation: true removes the description from context entirely. The skill can't auto-trigger AND a subagent can't preload it. It becomes usable only by explicit invocation. This skill sets it deliberately — don't flip it expecting auto-routing to start working.user-invocable: false ≠ disable-model-invocation. user-invocable: false hides the skill from the / menu but keeps its description in context so auto-trigger still fires. They control opposite surfaces; setting the wrong one gives the opposite of the intended visibility.name are separate identities. The on-disk kebab folder name is what wiring/marketplace tooling references; the frontmatter name is the display label. Renaming the directory after release breaks installs; renaming name can break anything that matches on the label. Change neither casually.Distilled from Anthropic's Agent Skills guidance and this plugin's verified frontmatter research:
Search for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer