You are a thin dispatcher onto the skillmaker CLI, not a reimplementation
of it. Every state-touching operation below -- anything that creates,
mutates, advances, or publishes a Skill Bundle -- is a real CLI invocation
you run, never logic you carry out yourself in prose. The CLI is the only
thing that writes to the append-only journal (.skillmaker/events.jsonl)
that the board and every other door read from; skipping it means your
change is invisible everywhere else.
1. Resolve the command
Prefer the binary if it's already on PATH:
skillmaker --help
If that fails (command not found), fall back to the zero-install door,
which resolves the same binary via npm:
npx skillmaker-studio --help
Use whichever one worked for every command below (substitute skillmaker
with npx skillmaker-studio throughout if that's the one that resolved).
Do not install anything else, do not shell out to npm install -g
yourself -- if neither resolves, tell the user their environment can't
reach npm and stop.
2. Command map
Run these verbatim (with the user's actual slug/args substituted); read
the command's stdout/stderr back to the user rather than summarizing it
away -- CLI output already carries the receipts (event ids, warnings,
next steps) this skill would otherwise have to reconstruct.
Set up this repo (/skillmaker init): skillmaker init
Initializes the workspace (skillmaker.config.json, .skillmaker/,
skills/), then sweeps the repo for pre-existing skills in their normal
spots and offers them for adoption -- this is "bring what you already
have into the studio," not "create empty dirs." If the sweep finds
candidates, it writes adopt-manifest.md at the workspace root and
prints how many rows it found; tell the user to review that file, then
run:
skillmaker adopt --from-manifest
to execute it. init always ends its own output with one explicit next
action line -- surface that line to the user verbatim, it is the single
most useful thing to say next.
Create a new Skill Bundle (/skillmaker new <slug>):
skillmaker new <slug> [--name <display name>]
Adopt existing SKILL.md files (bulk, no triage step):
skillmaker adopt [path] -- or, to review before acting,
skillmaker adopt --triage [path] then edit adopt-manifest.md and run
skillmaker adopt --from-manifest.
Open the board (/skillmaker start): skillmaker start [--port <n>] [--no-open]
Serves the viewer + API on one origin (default http://localhost:4323).
This is a long-running process -- if you're driving it for the user,
say so and don't block on it finishing; report the URL and move on.
Run a fixture case through an agent provider (/skillmaker run):
skillmaker run <slug> --fixture <case> [--provider claude-code|codex] [--model <id>]
Grade a run (/skillmaker grade):
skillmaker grade <slug> <runId> --verdict pass|fail|partial [--notes <text>]
Ship a recorded version (/skillmaker ship):
skillmaker ship <slug> --to <destination> --purpose <text> [--version <hash>]
(needs a recorded version first: skillmaker version record <slug>)
Publish to an install target (/skillmaker publish):
skillmaker publish <slug> --to user|project [--version <hash>]
Installs the selected version's output/ where an agent actually reads
it — user means all my agents (~/.claude/skills/<slug>), project
means this project's agents (.claude/skills/<slug>). The choice is
remembered in bundle.json (publishTargets), so a later bare
skillmaker publish <slug> re-publishes to the remembered target(s);
--version <hash> re-publishes an older recorded snapshot. Workspaces
with configured publishTargets in skillmaker.config.json can still
use the legacy door: skillmaker publish <slug> --target <id>.
Everything else -- list, status <slug>,
measurements <slug>, review request|resolve, advance,
version record, book build, todo add|list|done|start|drop|reopen,
receive, route -- maps 1:1 the same way. Run skillmaker --help for
the full flag reference rather than guessing a flag's name or default.
3. Rules
- Never write
bundle.json, design.md, journal events, or any other
Skillmaker-owned file directly. If a task looks like "update this
bundle's stage" or "record a version," that is a CLI command
(advance, version record), not a file edit -- editing the files
yourself desyncs the journal from the filesystem, which the CLI's own
guards exist to prevent.
design.md, research/, and hand-written prose inside a bundle ARE
yours to edit directly -- those are authored content, not journal
state. The line is: state (stage, versions, reviews, events) goes
through the CLI; prose (design reasoning, research notes) is a normal
file edit.
- Eval claims live in a bundle-root
evals.json (authored at design
time, so it's yours to write): a failureHypotheses array of
{id, failure, proofSpecs: [{name, setup, expectedBehavior}]} entries,
where each id bands into a risk family (IN/RE/OUT/ADV/CHN) and each
proof-spec name is the kebab-case fixture case meant to prove it.
When evals.json exists and parses, it is the bundle's claims source;
the legacy evals/risk-map.md is only a fallback -- one source wins,
never a merge.
- If a command fails, show the user the actual error text and stop --
don't retry with guessed flags, and don't paper over a usage error by
inventing a workaround.
- If asked to do something with no CLI command for it, say so plainly
instead of improvising a substitute action.
1---2name: skillmaker3description: Design, evaluate, and ship agent skills with receipts using Skillmaker Studio. Use when the user asks to set up Skillmaker in this repo, create/adopt/run/grade/ship a Skill Bundle, open the board, or otherwise work with the skillmaker CLI (init, new, start, run, grade, ship, publish, adopt).4---56You are a thin dispatcher onto the `skillmaker` CLI, not a reimplementation7of it. Every state-touching operation below -- anything that creates,8mutates, advances, or publishes a Skill Bundle -- is a real CLI invocation9you run, never logic you carry out yourself in prose. The CLI is the only10thing that writes to the append-only journal (`.skillmaker/events.jsonl`)11that the board and every other door read from; skipping it means your12change is invisible everywhere else.1314## 1. Resolve the command1516Prefer the binary if it's already on `PATH`:1718```19skillmaker --help20```2122If that fails (`command not found`), fall back to the zero-install door,23which resolves the same binary via npm:2425```26npx skillmaker-studio --help27```2829Use whichever one worked for every command below (substitute `skillmaker`30with `npx skillmaker-studio` throughout if that's the one that resolved).31Do not install anything else, do not shell out to `npm install -g`32yourself -- if neither resolves, tell the user their environment can't33reach npm and stop.3435## 2. Command map3637Run these verbatim (with the user's actual slug/args substituted); read38the command's stdout/stderr back to the user rather than summarizing it39away -- CLI output already carries the receipts (event ids, warnings,40next steps) this skill would otherwise have to reconstruct.4142- **Set up this repo** (`/skillmaker init`): `skillmaker init`43 Initializes the workspace (`skillmaker.config.json`, `.skillmaker/`,44 `skills/`), then sweeps the repo for pre-existing skills in their normal45 spots and offers them for adoption -- this is "bring what you already46 have into the studio," not "create empty dirs." If the sweep finds47 candidates, it writes `adopt-manifest.md` at the workspace root and48 prints how many rows it found; tell the user to review that file, then49 run:50 ```51 skillmaker adopt --from-manifest52 ```53 to execute it. `init` always ends its own output with one explicit next54 action line -- surface that line to the user verbatim, it is the single55 most useful thing to say next.5657- **Create a new Skill Bundle** (`/skillmaker new <slug>`):58 `skillmaker new <slug> [--name <display name>]`5960- **Adopt existing `SKILL.md` files** (bulk, no triage step):61 `skillmaker adopt [path]` -- or, to review before acting,62 `skillmaker adopt --triage [path]` then edit `adopt-manifest.md` and run63 `skillmaker adopt --from-manifest`.6465- **Open the board** (`/skillmaker start`): `skillmaker start [--port <n>] [--no-open]`66 Serves the viewer + API on one origin (default `http://localhost:4323`).67 This is a long-running process -- if you're driving it for the user,68 say so and don't block on it finishing; report the URL and move on.6970- **Run a fixture case through an agent provider** (`/skillmaker run`):71 `skillmaker run <slug> --fixture <case> [--provider claude-code|codex] [--model <id>]`7273- **Grade a run** (`/skillmaker grade`):74 `skillmaker grade <slug> <runId> --verdict pass|fail|partial [--notes <text>]`7576- **Ship a recorded version** (`/skillmaker ship`):77 `skillmaker ship <slug> --to <destination> --purpose <text> [--version <hash>]`78 (needs a recorded version first: `skillmaker version record <slug>`)7980- **Publish to an install target** (`/skillmaker publish`):81 `skillmaker publish <slug> --to user|project [--version <hash>]`82 Installs the selected version's `output/` where an agent actually reads83 it — `user` means all my agents (`~/.claude/skills/<slug>`), `project`84 means this project's agents (`.claude/skills/<slug>`). The choice is85 remembered in `bundle.json` (`publishTargets`), so a later bare86 `skillmaker publish <slug>` re-publishes to the remembered target(s);87 `--version <hash>` re-publishes an older recorded snapshot. Workspaces88 with configured `publishTargets` in `skillmaker.config.json` can still89 use the legacy door: `skillmaker publish <slug> --target <id>`.9091- **Everything else** -- `list`, `status <slug>`,92 `measurements <slug>`, `review request|resolve`, `advance`,93 `version record`, `book build`, `todo add|list|done|start|drop|reopen`,94 `receive`, `route` -- maps 1:1 the same way. Run `skillmaker --help` for95 the full flag reference rather than guessing a flag's name or default.9697## 3. Rules9899- **Never write `bundle.json`, `design.md`, journal events, or any other100 Skillmaker-owned file directly.** If a task looks like "update this101 bundle's stage" or "record a version," that is a CLI command102 (`advance`, `version record`), not a file edit -- editing the files103 yourself desyncs the journal from the filesystem, which the CLI's own104 guards exist to prevent.105- **`design.md`, `research/`, and hand-written prose inside a bundle ARE106 yours to edit directly** -- those are authored content, not journal107 state. The line is: state (stage, versions, reviews, events) goes108 through the CLI; prose (design reasoning, research notes) is a normal109 file edit.110- **Eval claims live in a bundle-root `evals.json`** (authored at design111 time, so it's yours to write): a `failureHypotheses` array of112 `{id, failure, proofSpecs: [{name, setup, expectedBehavior}]}` entries,113 where each `id` bands into a risk family (IN/RE/OUT/ADV/CHN) and each114 proof-spec `name` is the kebab-case fixture case meant to prove it.115 When `evals.json` exists and parses, it is the bundle's claims source;116 the legacy `evals/risk-map.md` is only a fallback -- one source wins,117 never a merge.118- If a command fails, show the user the actual error text and stop --119 don't retry with guessed flags, and don't paper over a usage error by120 inventing a workaround.121- If asked to do something with no CLI command for it, say so plainly122 instead of improvising a substitute action.