{
  "$schema": "https://humangarden.ai/.well-known/skill-spec.schema.json",
  "canonical_url": "https://humangarden.ai/skills/skill-creator/spec.json",
  "slug": "skill-creator",
  "last_tested": "2026-06-05",
  "tested_by": "humangarden",
  "verdict_one_line": "method doc + small Python toolbox — followed end-to-end it produces a valid runnable skill (SKILL.md + script + example) packaged into a real .skill bundle in under a minute; the bundled scripts only work via `python -m scripts.X` from the skill-creator dir",
  "fires_when": [
    "user says \"make a skill for X\" or \"turn this into a skill\"",
    "user has a draft SKILL.md and wants to iterate on it with evals + benchmarks",
    "user wants to optimize a skill's description for better triggering",
    "user wants to package a folder into a .skill bundle for distribution",
    "skill author is auditing their own skill before publishing"
  ],
  "skip_when": [
    "user wants a one-shot generator with no human-in-the-loop iteration (skill-creator's spine is \"draft → run → review → improve\")",
    "user is on Claude.ai with no filesystem (the bundled scripts assume a writeable cwd and Python)",
    "user wants to evaluate a skill that depends on paid third-party APIs the session lacks",
    "user just wants a SKILL.md template and not the whole eval/benchmark/packaging apparatus (overkill for that)"
  ],
  "inputs": [
    {
      "type": "prompt",
      "format": "natural-language",
      "constraint": "a description of what the new skill should do, when it should trigger, and what it should output; skill-creator's \"Capture Intent\" step pulls answers from chat history when possible"
    },
    {
      "type": "file",
      "format": "existing skill folder",
      "constraint": "for the improve / package / description-optimize paths, pass the existing skill directory"
    }
  ],
  "outputs": [
    {
      "type": "file",
      "format": "skill folder (SKILL.md + scripts/ + references/ + assets/)",
      "quality_note": "SKILL.md passes the bundled quick_validate.py; structure follows the three-level progressive-disclosure pattern documented in the skill"
    },
    {
      "type": "file",
      "format": ".skill bundle (zip archive)",
      "quality_note": "produced by `python -m scripts.package_skill` — validates the folder first, then zips; emits to the skill-creator parent dir by default (not next to the input folder)"
    },
    {
      "type": "structured-data",
      "format": "evals.json + benchmark.json + grading.json",
      "quality_note": "only produced if you run the full eval loop; on Claude.ai or \"vibe with me\" runs these are explicitly skipped per the skill's own guidance"
    }
  ],
  "installation": {
    "pip": [
      "pyyaml"
    ],
    "npm": [],
    "system": {
      "notes": "Pure Python; no system deps for the create/validate/package path. The eval-viewer path additionally wants a browser; in Cowork/headless use --static."
    },
    "notes": "No requirements.txt ships with skill-creator. quick_validate.py needs pyyaml (you'll get ModuleNotFoundError on first run otherwise). Every bundled script must be invoked as `python -m scripts.X` from inside the skill-creator directory — `python scripts/X.py` fails with `ModuleNotFoundError: No module named 'scripts'` because of the relative imports in utils.py. SKILL.md uses the correct form, but a casual reader running `python scripts/package_skill.py ./my-skill` will hit it."
  },
  "artifacts": [
    {
      "kind": "text",
      "inline": "---\nname: extract-emojis\ndescription: Extract every emoji from a block of text along with counts, surrounding context, and a coarse category (face, hand, animal, food, symbol, flag, other). Use whenever a user wants to inventory, audit, or analyze the emoji usage in a string, file, chat log, social-media post, or any other text payload, even if they don't explicitly say \"extract\" — phrases like \"what emojis are in this\", \"count the emojis\", \"emoji breakdown\", or \"give me the emojis from X\" should all trigger this skill.\n---\n\n# extract-emojis\n\nA small but real skill: given any text, produce a structured JSON inventory of the emoji it contains.\n\n## When to use this skill\n\nTrigger whenever the user wants to know which emojis appear in a piece of text, how often, in what context, or grouped by kind. Examples of triggering phrases:\n\n- \"what emojis are in this Slack thread\"\n- \"count emoji usage in my README\"\n- \"emoji breakdown of this chat log\"\n- \"pull the emojis out of this string and group them\"\n- \"audit my tweets for emoji usage\"\n\nDo not use this skill for:\n\n- *Generating* emoji from text (sentiment-to-emoji translation)\n- Removing emoji from text (the script reports them, doesn't strip them)\n- OCR-ing emoji from images (this is text-only)\n\n## How it works\n\nThe skill bundles a single Python script, `scripts/extract_emojis.py`, that does the actual work. Run it on a text file and it writes a JSON inventory.\n",
      "caption": "Frontmatter + opening of the generated extract-emojis/SKILL.md. Passes skill-creator's own quick_validate.py.",
      "role": "output",
      "hero": true
    },
    {
      "kind": "text",
      "file": "https://humangarden.ai/spec-artifacts/skill-creator/generated-skill/SKILL.md",
      "caption": "Full generated SKILL.md (4.6 KB) — the artifact the skill produced",
      "role": "output",
      "hero": false
    },
    {
      "kind": "text",
      "file": "https://humangarden.ai/spec-artifacts/skill-creator/generated-skill/scripts/extract_emojis.py",
      "caption": "The bundled script — 168 lines, handles ZWJ joiners, skin tones, flag sequences, falls back to unicodedata if `emoji` package missing",
      "role": "output",
      "hero": false
    },
    {
      "kind": "text",
      "file": "https://humangarden.ai/spec-artifacts/skill-creator/generated-skill/example/input.txt",
      "caption": "The tiny fixture the skill ships for smoke-testing",
      "role": "output",
      "hero": false
    },
    {
      "kind": "text",
      "file": "https://humangarden.ai/spec-artifacts/skill-creator/generated-skill/example/expected_output.json",
      "caption": "Smoke-test expected output — 5 unique emojis, 8 total, categorized",
      "role": "output",
      "hero": false
    },
    {
      "kind": "text",
      "file": "https://humangarden.ai/spec-artifacts/skill-creator/extract-emojis.skill",
      "caption": "Packaged .skill bundle (5.9 KB zip) produced by `python -m scripts.package_skill`",
      "role": "output",
      "hero": false
    },
    {
      "kind": "text",
      "file": "https://humangarden.ai/spec-artifacts/skill-creator/transcript.txt",
      "caption": "Full transcript — happy path, three edge cases, skill-creator's own validator, and the packaging step",
      "role": "reference",
      "hero": false
    },
    {
      "kind": "text",
      "file": "https://humangarden.ai/spec-artifacts/skill-creator/prompt.txt",
      "caption": "The prompt fed to skill-creator to start the run",
      "role": "input",
      "hero": false
    }
  ],
  "caveats": [
    "quick_validate.py imports pyyaml but skill-creator ships no requirements.txt — first run dies with ModuleNotFoundError until you `pip install pyyaml` yourself",
    "every bundled script must be invoked as `python -m scripts.X` from inside the skill-creator dir; `python scripts/X.py` fails on relative imports (utils.py is `from scripts.utils import ...`). SKILL.md uses the right form but a casual user copying the path will hit this",
    "package_skill.py writes the .skill bundle into the *current* working directory (the skill-creator folder), not next to the input skill. Easy to lose track of in a multi-skill workspace",
    "the eval/benchmark/grading loop is the meat of the skill but requires subagents or the `claude` CLI in $PATH; on Claude.ai and Cowork the skill's own guidance is \"skip benchmarking, do qualitative only\" — so for ~50% of users the rigorous half is non-functional",
    "description optimization (`run_loop.py`) shells out to `claude -p` and is silently a no-op without Claude Code installed — there is no preflight check",
    "the skill encourages \"pushy\" descriptions to combat undertriggering; for a curator this is a double-edged sword (we got a 700-char description that does its job but reads like SEO copy)",
    "no schema validation on test-case JSON beyond the inline example — malformed evals.json fails at run_eval.py time, not at lint time"
  ],
  "needs_credentials": [],
  "source_repo": "https://github.com/anthropics/skills/tree/main/skill-creator",
  "human_review_url": "https://humangarden.ai/skills/skill-creator/"
}