name: skill-creator description: "Create new skills, modify and improve existing skills, and measure skill performance. Use when the user wants to create a skill from scratch, edit or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy. Trigger on: 'create a skill', 'make a skill', 'turn this into a skill', 'improve this skill', 'update skill', 'skill for X', 'save this workflow as a skill'." version: 1.0.0 source: "https://github.com/anthropics/skills/tree/main/skills/skill-creator"
A skill for creating new skills and iteratively improving them.
Capture intent → Draft SKILL.md → Run test cases (with-skill + baseline)
→ Human review (eval viewer) → Improve → Repeat until satisfied
→ Optimize description → Package
Figure out where the user is in this loop and jump in. If they say "I want to make a skill for X", start from the top. If they hand you a draft, go straight to testing.
Extract from conversation history first (tools used, steps taken, corrections made). Then ask:
Required frontmatter fields:
- name: skill identifier (lowercase, hyphens)
- description: This is the primary trigger mechanism. Include both what it does AND when to use it. Be slightly pushy — err toward over-triggering. Example: instead of "Builds dashboards", write "Builds dashboards. Use whenever user mentions dashboards, data visualization, internal metrics, or wants to display any company data — even if they don't say 'dashboard'."
skill-name/
├── SKILL.md ← required, keep under 500 lines
└── (optional)
├── scripts/ ← deterministic/repetitive code
├── references/ ← docs loaded on demand
└── assets/ ← templates, icons, fonts
Keep SKILL.md under 500 lines. If approaching limit, split into references/ files with clear pointers.
scripts/references/<variant>.mdFor each test case, spawn two subagents in the same turn: one with the skill, one without (baseline). Don't do with-skill first then come back for baseline.
<skill-name>-workspace/
└── iteration-1/
├── eval-<name>/
│ ├── with_skill/outputs/
│ ├── without_skill/outputs/ (or old_skill/ when improving)
│ ├── eval_metadata.json
│ └── timing.json
└── benchmark.json
Create directories as you go, not upfront.
{
"eval_id": 0,
"eval_name": "descriptive-name-not-eval-0",
"prompt": "The exact test prompt",
"assertions": []
}
{
"total_tokens": 84852,
"duration_ms": 23332,
"total_duration_seconds": 23.3
}
This data comes only in the task notification. Capture it immediately.
Good assertions are objectively verifiable and have descriptive names. Don't force assertions on subjective outputs — use human review instead.
Save to evals/evals.json:
{
"skill_name": "example-skill",
"evals": [
{
"id": 1,
"prompt": "User's task prompt",
"expected_output": "Description of expected result",
"assertions": []
}
]
}
Explain assertions to the user while waiting for runs.
Grade — run grader (see agents/grader.md). grading.json must use fields: text, passed, evidence (exact names — viewer depends on these).
Aggregate:
python -m scripts.aggregate_benchmark <workspace>/iteration-N --skill-name <name>
--static <output_path> instead of server):nohup python <skill-creator-path>/eval-viewer/generate_review.py \
<workspace>/iteration-N \
--skill-name "my-skill" \
--benchmark <workspace>/iteration-N/benchmark.json \
> /dev/null 2>&1 &
For iteration 2+: add --previous-workspace <workspace>/iteration-N-1.
IMPORTANT: Generate the eval viewer BEFORE evaluating outputs yourself. Get them in front of the human first.
Tell the user: "Two tabs — 'Outputs' to review each test case, 'Benchmark' for quantitative comparison. Come back when done."
After reading feedback:
scripts/.Rerun into iteration-<N+1>/, launch viewer with --previous-workspace, repeat until:
- User says they're happy
- All feedback is empty
- No meaningful progress being made
Generate 20 trigger eval queries (8–10 should-trigger, 8–10 should-not-trigger). Near-misses make the best negatives — adjacent domains, keyword overlap but different need.
Run optimization loop:
python -m scripts.run_loop \
--eval-set <path-to-trigger-eval.json> \
--skill-path <path-to-skill> \
--model <model-id-from-system-prompt> \
--max-iterations 5 \
--verbose
Apply best_description to frontmatter. Show user before/after + scores.
--static <output_path> for the viewerfeedback.json when user clicks "Submit All Reviews"name field and directory name exactly/tmp/skill-name/ before editing if the installed path may be read-onlyclaude -p via subprocess — only run after skill content is finalizedagents/grader.md — grading assertion outputsagents/comparator.md — blind A/B comparisonagents/analyzer.md — analyzing benchmark resultsreferences/schemas.md — JSON schemas for evals.json, grading.json, benchmark.json