From build
Create new skills, modify and improve existing skills, and measure skill performance. Use when the user wants to "create a skill", "add a skill", "build a skill", "scaffold a skill", "new skill for [X]", "write a skill that does X", run evals on a skill, benchmark skill performance, or optimize a skill's description for better triggering accuracy. Also use when the user wants to capture or automate a workflow, turn a conversation into a reusable skill, or improve how an existing skill triggers.
How this skill is triggered — by the user, by Claude, or both
Slash command
/build:build-skillThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
A skill for creating new skills and iteratively improving them.
LICENSE.txtagents/analyzer.mdagents/comparator.mdagents/grader.mdassets/eval_review.htmleval-viewer/generate_review.pyeval-viewer/viewer.htmlreferences/description-optimization.mdreferences/eval-workflow.mdreferences/platform-notes.mdreferences/schemas.mdreferences/skill-writing-guide.mdscripts/__init__.pyscripts/aggregate_benchmark.pyscripts/generate_report.pyscripts/improve_description.pyscripts/package_skill.pyscripts/quick_validate.pyscripts/run_eval.pyscripts/run_loop.pyA skill for creating new skills and iteratively improving them.
At a high level, the process of creating a skill goes like this:
eval-viewer/generate_review.py script to show the user the results for them to look at, and also let them look at the quantitative metricsYour job when using this skill is to figure out where the user is in this process and then jump in and help them progress through these stages. So for instance, maybe they're like "I want to make a skill for X". You can help narrow down what they mean, write a draft, write the test cases, figure out how they want to evaluate, run all the prompts, and repeat.
On the other hand, maybe they already have a draft of the skill. In this case you can go straight to the eval/iterate part of the loop.
Of course, you should always be flexible and if the user is like "I don't need to run a bunch of evaluations, just vibe with me", you can do that instead.
Then after the skill is done (but again, the order is flexible), you can also run the skill description improver, which we have a whole separate script for, to optimize the triggering of the skill.
The skill creator is liable to be used by people across a wide range of familiarity with coding jargon. If you haven't heard (and how could you, it's only very recently that it started), there's a trend now where the power of Claude is inspiring plumbers to open up their terminals, parents and grandparents to google "how to install npm". On the other hand, the bulk of users are probably fairly computer-literate.
So please pay attention to context cues to understand how to phrase your communication! In the default case, just to give you some idea:
It's OK to briefly explain terms if you're in doubt, and feel free to clarify terms with a short definition if you're unsure if the user will get it.
Before eliciting, confirm a skill is the right artifact. Full decision matrix: primitive-routing.md.
Ask: "Building this as a skill (triggered instruction set) — right primitive?" Redirect if:
/wos:build-hook/wos:build-rule/wos:build-subagentProceed without a gate if intent is unambiguous; ask one clarifying question if uncertain.
Start by understanding the user's intent. The current conversation might already contain a workflow the user wants to capture (e.g., they say "turn this into a skill"). If so, extract answers from the conversation history first — the tools used, the sequence of steps, corrections the user made, input/output formats observed. The user may need to fill the gaps, and should confirm before proceeding to the next step.
Proactively ask questions about edge cases, input/output formats, example files, success criteria, and dependencies. Wait to write test prompts until you've got this part ironed out.
Also probe for structural decisions that shape how the skill is built — derive these from the conversation where possible; only ask if the answer isn't clear:
disable-model-invocation, and the won't-do scope in Key Instructions. For any irreversible action, document recovery steps in ## Key Instructions or ## Handoff. (check-skill #21, #23)paths frontmatter. Relevant especially in monorepos. (check-skill #17)user-invocable: false is the right pattern.config.json setup pattern.Check available MCPs - if useful for research (searching docs, finding similar skills, looking up best practices), research in parallel via subagents if available, otherwise inline. Come prepared with context to reduce burden on the user.
Based on the user interview, fill in these components. Most skills need only name + description — reach for the others when the use case calls for it:
"[skill name and description]") (check-skill #20)true so users can invoke with /skill-name. Set to false for background knowledge skills — hides from the / menu, designed to be preloaded into an agent rather than called directly. (check-skill #17)true for dangerous or consequential skills (deploy, destructive ops) that should only fire on explicit user invocation — never auto-triggered. (check-skill #23)haiku for fast lookups, opus for complex multi-step work.low/medium/high/max). Use low for templating, high for code review or analysis.agent: to set the subagent type. When using context: fork, declare the subagent's operational scope in ## Key Instructions (read-only, write-gated, requires approval, etc.). (check-skill #18)paths: "packages/backend/**". (check-skill #17)[sonnet, haiku]); omit if untested. (check-skill #2)After drafting, also include in ## Key Instructions at least one explicit won't-have — a negative scope boundary ("Won't…", "Does not…", "Excluded:"). Missing negative rules leave scope undefined. (check-skill #11)
Read references/skill-writing-guide.md before drafting. It covers anatomy,
progressive disclosure patterns, on-demand hooks, config.json setup, skill
composition, persistent state, writing style, writing patterns, and the full
quality requirements checklist.
Before running lint or asking for approval, walk the user through the key design choices in the draft. Keep it to 3–6 bullets. Cover:
disable-model-invocation: true because this deploys to production — it should never fire unless you explicitly invoke it."context: fork — you'll want to see the intermediate steps while we iterate; we can add it later if the skill gets noisy."The goal is that a user who doesn't know skill authoring can read the narration and understand — and disagree with — any structural choice. If you can't explain a choice clearly, revisit it before presenting.
Example narration:
disable-model-invocation: true— this pushes to production; shouldn't ever fire on its own- Gate before the push step — CI must be green first; I made that an explicit check rather than a comment
- No reference files yet — the workflow fits in the body at ~80 lines; would split if it grows
- Didn't use
context: fork— you'll want to see tool calls while we're still iterating on the skill
Before writing to disk, run lint and reindex:
python scripts/lint.py --root <project-root> --no-urls # fix any skill quality findings
python scripts/reindex.py --root <project-root> # update _index.md navigation
Write to skills/<name>/SKILL.md. Do not write until the user approves the draft. After writing, invoke /check-skill on the new skill — surface any findings and offer the repair loop before moving to test cases.
After writing the skill draft, come up with 2-3 realistic test prompts — the kind of thing a real user would actually say. Share them with the user: [you don't have to use this exact language] "Here are a few test cases I'd like to try. Do these look right, or do you want to add more?" Then run them.
Save test cases to evals/evals.json. Don't write assertions yet — just the prompts. You'll draft assertions in the next step while the runs are in progress.
{
"skill_name": "example-skill",
"evals": [
{
"id": 1,
"prompt": "User's task prompt",
"expected_output": "Description of expected result",
"files": []
}
]
}
See references/schemas.md for the full schema (including the assertions field, which you'll add later).
Read references/eval-workflow.md for the full step-by-step process. Summary:
spawn with-skill and baseline runs in the same turn (Step 1), draft assertions
while runs are in progress (Step 2), capture timing on completion (Step 3),
grade + aggregate + launch viewer (Step 4), read feedback.json (Step 5).
This is the heart of the loop. You've run the test cases, the user has reviewed the results, and now you need to make the skill better based on their feedback.
Generalize from the feedback. The big picture thing that's happening here is that we're trying to create skills that can be used a million times (maybe literally, maybe even more who knows) across many different prompts. Here you and the user are iterating on only a few examples over and over again because it helps move faster. The user knows these examples in and out and it's quick for them to assess new outputs. But if the skill you and the user are codeveloping works only for those examples, it's useless. Rather than put in fiddly overfitty changes, or oppressively constrictive MUSTs, if there's some stubborn issue, you might try branching out and using different metaphors, or recommending different patterns of working. It's relatively cheap to try and maybe you'll land on something great.
Keep the prompt lean. Remove things that aren't pulling their weight. Make sure to read the transcripts, not just the final outputs — if it looks like the skill is making the model waste a bunch of time doing things that are unproductive, you can try getting rid of the parts of the skill that are making it do that and seeing what happens.
Explain the why. Try hard to explain the why behind everything you're asking the model to do. Today's LLMs are smart. They have good theory of mind and when given a good harness can go beyond rote instructions and really make things happen. Even if the feedback from the user is terse or frustrated, try to actually understand the task and why the user is writing what they wrote, and what they actually wrote, and then transmit this understanding into the instructions. If you find yourself writing 'always' or 'never' in all caps, or using super rigid structures, that's a yellow flag — if possible, reframe and explain the reasoning so that the model understands why the thing you're asking for is important. That's a more humane, powerful, and effective approach.
Look for repeated work across test cases. Read the transcripts from the test runs and notice if the subagents all independently wrote similar helper scripts or took the same multi-step approach to something. If all 3 test cases resulted in the subagent writing a create_docx.py or a build_chart.py, that's a strong signal the skill should bundle that script. Write it once, put it in scripts/, and tell the skill to use it. This saves every future invocation from reinventing the wheel.
Take your time here — write a draft revision, then read it fresh before finalizing. Get into the head of the user: understand what they actually want and why they're asking.
After improving the skill:
iteration-<N+1>/ directory, including baseline runs. If you're creating a new skill, the baseline is always without_skill (no skill) — that stays the same across iterations. If you're improving an existing skill, use your judgment on what makes sense as the baseline: the original version the user came in with, or the previous iteration.--previous-workspace pointing at the previous iterationKeep going until:
For situations where you want a more rigorous comparison between two versions of a skill (e.g., the user asks "is the new version actually better?"), there's a blind comparison system. Read agents/comparator.md and agents/analyzer.md for the details. The basic idea is: give two outputs to an independent agent without telling it which is which, and let it judge quality. Then analyze why the winner won.
This is optional, requires subagents, and most users won't need it. The human review loop is usually sufficient.
After the skill is stable and the user is happy with the outputs, offer to optimize the description for better triggering accuracy. The description is the primary mechanism Claude uses to decide whether to invoke a skill, and undertriggering is a documented bias worth addressing.
Read references/description-optimization.md for the full process: generating eval queries, reviewing them with the user, running the optimization loop, and applying the result.
present_files tool is available)Check whether you have access to the present_files tool. If you don't, skip this step. If you do, package the skill and present the .skill file to the user:
python -m scripts.package_skill <path/to/skill-folder>
After packaging, direct the user to the resulting .skill file path so they can install it.
If you're on Claude.ai or Cowork, some mechanics differ from the standard Claude Code workflow — subagent availability, browser access, and feedback collection all vary. Read references/platform-notes.md for the full details on what to skip, adapt, or substitute for your environment.
The agents/ directory contains instructions for specialized subagents. Read them when you need to spawn the relevant subagent.
agents/grader.md — How to evaluate assertions against outputsagents/comparator.md — How to do blind A/B comparison between two outputsagents/analyzer.md — How to analyze why one version beat anotherThe references/ directory has additional documentation:
references/schemas.md — JSON structures for evals.json, grading.json, etc.references/platform-notes.md — Claude.ai and Cowork mechanics (subagents, browser, feedback)references/description-optimization.md — Full process for optimizing skill triggering accuracyReceives: Skill name and intent (or path to existing SKILL.md for improvement); or no argument if the user wants to capture the current conversation as a skill
Produces: SKILL.md written to skills/<name>/SKILL.md; optionally: evals.json, eval workspace with benchmark and grading results, optimized description
Chainable to: check-skill (to audit quality after writing)
references/ when approaching the limitcheck-skill against it — build-skill must produce skills that pass all 22 criteria it enforcesRepeating one more time the core loop here for emphasis:
eval-viewer/generate_review.py to help the user review themPlease add steps to your TodoList, if you have such a thing, to make sure you don't forget. If you're in Cowork, please specifically put "Create evals JSON and run eval-viewer/generate_review.py so human can review test cases" in your TodoList to make sure it happens.
npx claudepluginhub bcbeidel/toolkit --plugin buildCreates, edits, and optimizes skills with iterative evaluation and benchmarking. Guides users through drafting, testing, and refining skills with qualitative and quantitative analysis.
Creates, edits, and optimizes skills with iterative evaluation and benchmarking. Guides users through drafting, testing, and refining skills.
Creates new Claude Code skills, modifies existing ones, runs evaluations and benchmarks with variance analysis, and optimizes descriptions for better triggering.