From build-skill
Design a new SKILL.md — pick the structure that fits the job, encode only what the model would otherwise get wrong, and refine through real-use retrospectives. Use when the user wants to create or rewrite a skill.
How this skill is triggered — by the user, by Claude, or both
Slash command
/build-skill:build-skillThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
**Argument:** the name or purpose of the skill the user wants to write. If unclear, ask once before drafting.
Argument: the name or purpose of the skill the user wants to write. If unclear, ask once before drafting.
references/ siblings — it promotes them to skill-level visibility and confuses the loader.references/EXAMPLES.md, references/COMMANDS.md, etc., loaded on demand.| Name | Meaning |
|---|---|
| Frontmatter | YAML at the top. Loaded every turn (cost-bearing). Standard fields: name, description, allowed-tools, optionally argument-hint. |
| Body | The SKILL.md content below frontmatter. Loaded only on invocation. |
| References | Sibling files (references/*.md, scripts/*) loaded on demand. Zero context cost until used. |
| Genre | The shape pattern that fits the skill's job — see §2. |
| Section | Standard parts: Trigger, Posture, Boundary, Vocabulary, Workflow, Gotchas. Use only what earns its place. |
Before drafting anything, find out:
If you can't answer all four, ask the user. Don't fill in defaults.
If the task is one-off, the answer might be "don't make a skill" — a one-liner instruction at invocation time is cheaper than a skill nobody invokes again.
Match the skill's job to a known shape. Most polished skills fit one of these:
If the skill spans genres, pick the dominant one and treat the others as sections within it.
The pattern-language master frame fits all of these: Context (when this applies) → Forces (constraints pulling in different directions) → Solution (what to do) → Consequences (what you trade off). Use it as a sanity check.
Write only the SKILL.md body. Defer references and scripts until §5.
For each candidate section, ask: "If I removed this, would the model still do the right thing?" Cut anything that survives the question.
Front-load critical content. Models attend more to the start and end of long contexts than to the middle, so Posture and Boundary should appear before Workflow.
Phrase positively wherever you can. Imperative > negation.
For every line, ask whether a competent model would do this without being told. If yes, cut it. The risk of leaving it in isn't neutrality — obedience reinforcement makes the model follow the spelled-out instruction even when its own judgment would have produced a better result.
This is the hardest step. Authors who care about a domain instinctively over-specify. Resist.
Extract material to references/ siblings (no frontmatter on them — see Boundary). Common patterns: references/EXAMPLES.md, references/COMMANDS.md, references/REFERENCE.md. Reference them by name from the spine; the loader brings them in on demand.
The skill is not finished until it has been invoked on a real instance of the work it's meant to do. Models behave differently than reviewers predict. Reality beats simulation.
After each real invocation, scan the session log for friction. Session JSONLs live in ~/.claude/projects/<project-path>/<session-id>.jsonl and are usually too large to read directly — use focused subagents.
The pattern that works:
Agent subagents in parallel. Each gets the same session file path and a different question:
tail and Read with offset (so it doesn't read the whole 4MB JSONL).Iterate until new sessions surface only objections you've already overruled. That's the stop signal.
AskUserQuestion availability is unreliable. It can be listed in allowed-tools yet have no schema loaded (verify with ToolSearch select:AskUserQuestion). If the new skill uses it, include a plain-text fallback path.allowed-tools doesn't restrict. It pre-approves listed tools (skipping per-use prompts) but doesn't prevent the agent from using others. It's also CLI-only — has no effect in the SDK.description field is loaded every turn. Keep it under ~30 words and front-load the trigger context.Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub quad/vibes --plugin build-skill