/mockup-inline
<!-- DO NOT SIMPLIFY THIS SCHEMA. Mockup records anchor agent recovery, graduation backlinks, and status surfacing. Every frontmatter field below is read by name somewhere (status, craft:status; agent_session, recovery; graduated_to, ramps). muse_session records a completed
$ npx -y skills add drobins25/craft --agent claude-codeHow it fires
How this command gets triggered: by you, by Claude, or both.
- Fires itselfClaude auto-loads it when your prompt matches the work.
- You can call itInvoke it directly when you want it.
- Slash command
/mockup-inline
Context preview
What this command does when you run it.
<!-- DO NOT SIMPLIFY THIS SCHEMA. Mockup records anchor agent recovery, graduation backlinks, and status surfacing. Every frontmatter field below is read by name somewhere (status, craft:status; agent_session, recovery; graduated_to, ramps). muse_session records a completed
Command definition
mockup-inline.mdMockup Funnel (reference - read inline by the craft:mockup shell)
<!-- DO NOT SIMPLIFY THIS SCHEMA. Mockup records anchor agent recovery, graduation backlinks, and status surfacing. Every frontmatter field below is read by name somewhere (status, craft:status; agent_session, recovery; graduated_to, ramps). muse_session records a completed one-shot muse spawn - it is NEVER a re-anchor target; recovery re-anchors against agent_session only. Verbatim reactions are the convergence history - paraphrasing destroys them. One sanctioned exception: a labeled `Settled:` sub-line beneath a verbatim reaction (see the settle gate) - explicitly derived, marked as derived, and never replacing or rewording the verbatim line above it.
Materials is read by the graduation ramps (story-from-mockup and the
tweak port) and by recovery - the material's identity ports onward, never the inlined bytes. -->
A converged mockup is design truth the user approved in their browser. This flow gets there through three rounds of real reactions - diverge, refine, polish - then solidifies new design values to tokens.yaml BEFORE any destination artifact exists, so every downstream gate (binding contracts, chunk-validator, style-analyzer) enforces the mockup because the bible already agrees with it. The shell has already parsed the subject and run the single-session guard - this file owns everything else.
**At most three taste AskUserQuestion calls exist in this flow: vibe (Brief - not rendered on the muse path, where the built spread is the checkpoint), solidify (acceptance), destination (fork). One first-run pre-flight AUQ (Setup - Step 1) may precede them, on a project's first-ever mockup only.** Round picks and reactions are conversational text - a widget between the user and their taste kills the funnel. The taste budget is at most three, permanently: pre-flight is logistics, not taste, and deletes itself once a mockup record exists; nothing else may add a widget to this flow.
All writes live under the project's own `.craft/` (cold path: `$MOCKUP_ROOT/.craft/` - see Step 1) - the write gate never opens for a mockup.
Step 1: Brief
**Cold-start determination - runs FIRST, before anything is created.** Ask whether this project is onboarded, using find-workshop.sh's exact semantic: `CRAFT_PROJECT_ROOT` is set, OR a walk-up from PWD finds `.craft/.global-state` or `.craft/project.md`.
- **Warm (a craft root resolves):** everything below runs exactly as written - the cold-start machinery does not exist on this path.
- **Cold (no root resolves):** run one cheap visual-file check - a Glob pass over `.tsx .jsx .vue .svelte .css .scss .sass .less`, excluding `.craft/`, `node_modules`, `.git`, `dist`, `build`, `.next`. Never invoke the project-scanner for this.
- **Zero visual files -> route to `/craft:init`.** No confirmation AskUserQuestion (invoking the command is consent - the same rule /craft itself uses to route to init) and no auto-resume: the funnel STOPS here and init takes over. The user re-invokes `/craft:mockup` after init completes. If they already gave rich mockup detail before the gate, capture it to the notebook AFTER init exists (notebook needs a resolvable root) - never at the gate itself.
- **Visual files present -> the cold path.** Set `MOCKUP_ROOT` to the git toplevel (`git rev-parse --show-toplevel`) when in a repo, else PWD - never a subdirectory. Every mockup write lives under `$MOCKUP_ROOT/.craft/`, created on demand - only the subdirectories the mockup itself needs. The cold path NEVER writes `.craft/.global-state` or `.craft/project.md`: their absence is craft's "not yet onboarded" signal, and writing either would silently kill the init offer. Run the funnel below reading `${CRAFT_PROJECT_ROOT:-.}` as `$MOCKUP_ROOT`.
**Pre-flight copy rules (locked).** The pre-flight question below is transcribed copy - never re-voiced, never "improved". No pre-flight string may contain "guess" or "guessing": the alchemist reads real code on both paths (the never-fabricate rule below - "no default palette ever reaches a brief"), and guess-language is the generic-AI framing this funnel is not. Never escalate: this is one honest ask, all options stay first-class permanently, and no future pass may add urgency, warn harder about what is "lost", re-order or re-weight options, or otherwise tune this beat to drive init adoption. The one sanctioned weight is the "(Recommended)" marker on "Init first" - owner-locked copy (2026-07-17), not a later escalation; no pass may remove it. Init is never pitched as a feature list, and "Go from what's on disk" is never written as the lesser option - for someone whose shipped code already is what they want, it is the right call. The pre-flight is a substep of Brief: substeps never become tasks, so it gets no entry on the task rail.
**Pre-flight (first mockup only) - Setup.** One conditional question that teaches what the funnel never says out loud: init is a design session this mockup could grow from. It gates on one check - `.craft/mockups/` holds no `*/record.md`, resolved against the funnel's own root (`$MOCKUP_ROOT` on the cold path, `${CRAFT_PROJECT_ROOT:-.}` warm), never PWD-relative and never the shell's Step 2 idiom, which resolves before `MOCKUP_ROOT` exists. The `mkdir` + `record.md` write below is what deletes it: a project that has mocked before never sees it, and an answered-and-entered run is never re-asked.
**Setup** - fires on the cold path's visual-files-present branch only (the zero-visual-files branch above keeps its hard route to `/craft:init` - nothing on disk to go from, no question to ask), and only while the record check above is empty:
question: "Craft hasn't met your taste yet. Init can run a short design session - sites you love, colors from one, type from another - and this mockup grows from whatever it learns. Or build from the code you already have."
header: "Setup"
options:
- la
Read more
Mockup Funnel (reference - read inline by the craft:mockup shell)
<!-- DO NOT SIMPLIFY THIS SCHEMA. Mockup records anchor agent recovery, graduation backlinks, and status surfacing. Every frontmatter field below is read by name somewhere (status, craft:status; agent_session, recovery; graduated_to, ramps). muse_session records a completed one-shot muse spawn - it is NEVER a re-anchor target; recovery re-anchors against agent_session only. Verbatim reactions are the convergence history - paraphrasing destroys them. One sanctioned exception: a labeled `Settled:` sub-line beneath a verbatim reaction (see the settle gate) - explicitly derived, marked as derived, and never replacing or rewording the verbatim line above it.
Materials is read by the graduation ramps (story-from-mockup and the
tweak port) and by recovery - the material's identity ports onward, never the inlined bytes. -->
A converged mockup is design truth the user approved in their browser. This flow gets there through three rounds of real reactions - diverge, refine, polish - then solidifies new design values to tokens.yaml BEFORE any destination artifact exists, so every downstream gate (binding contracts, chunk-validator, style-analyzer) enforces the mockup because the bible already agrees with it. The shell has already parsed the subject and run the single-session guard - this file owns everything else.
**At most three taste AskUserQuestion calls exist in this flow: vibe (Brief - not rendered on the muse path, where the built spread is the checkpoint), solidify (acceptance), destination (fork). One first-run pre-flight AUQ (Setup - Step 1) may precede them, on a project's first-ever mockup only.** Round picks and reactions are conversational text - a widget between the user and their taste kills the funnel. The taste budget is at most three, permanently: pre-flight is logistics, not taste, and deletes itself once a mockup record exists; nothing else may add a widget to this flow.
All writes live under the project's own `.craft/` (cold path: `$MOCKUP_ROOT/.craft/` - see Step 1) - the write gate never opens for a mockup.
Step 1: Brief
**Cold-start determination - runs FIRST, before anything is created.** Ask whether this project is onboarded, using find-workshop.sh's exact semantic: `CRAFT_PROJECT_ROOT` is set, OR a walk-up from PWD finds `.craft/.global-state` or `.craft/project.md`.
- **Warm (a craft root resolves):** everything below runs exactly as written - the cold-start machinery does not exist on this path.
- **Cold (no root resolves):** run one cheap visual-file check - a Glob pass over `.tsx .jsx .vue .svelte .css .scss .sass .less`, excluding `.craft/`, `node_modules`, `.git`, `dist`, `build`, `.next`. Never invoke the project-scanner for this.
- **Zero visual files -> route to `/craft:init`.** No confirmation AskUserQuestion (invoking the command is consent - the same rule /craft itself uses to route to init) and no auto-resume: the funnel STOPS here and init takes over. The user re-invokes `/craft:mockup` after init completes. If they already gave rich mockup detail before the gate, capture it to the notebook AFTER init exists (notebook needs a resolvable root) - never at the gate itself.
- **Visual files present -> the cold path.** Set `MOCKUP_ROOT` to the git toplevel (`git rev-parse --show-toplevel`) when in a repo, else PWD - never a subdirectory. Every mockup write lives under `$MOCKUP_ROOT/.craft/`, created on demand - only the subdirectories the mockup itself needs. The cold path NEVER writes `.craft/.global-state` or `.craft/project.md`: their absence is craft's "not yet onboarded" signal, and writing either would silently kill the init offer. Run the funnel below reading `${CRAFT_PROJECT_ROOT:-.}` as `$MOCKUP_ROOT`.
**Pre-flight copy rules (locked).** The pre-flight question below is transcribed copy - never re-voiced, never "improved". No pre-flight string may contain "guess" or "guessing": the alchemist reads real code on both paths (the never-fabricate rule below - "no default palette ever reaches a brief"), and guess-language is the generic-AI framing this funnel is not. Never escalate: this is one honest ask, all options stay first-class permanently, and no future pass may add urgency, warn harder about what is "lost", re-order or re-weight options, or otherwise tune this beat to drive init adoption. The one sanctioned weight is the "(Recommended)" marker on "Init first" - owner-locked copy (2026-07-17), not a later escalation; no pass may remove it. Init is never pitched as a feature list, and "Go from what's on disk" is never written as the lesser option - for someone whose shipped code already is what they want, it is the right call. The pre-flight is a substep of Brief: substeps never become tasks, so it gets no entry on the task rail.
**Pre-flight (first mockup only) - Setup.** One conditional question that teaches what the funnel never says out loud: init is a design session this mockup could grow from. It gates on one check - `.craft/mockups/` holds no `*/record.md`, resolved against the funnel's own root (`$MOCKUP_ROOT` on the cold path, `${CRAFT_PROJECT_ROOT:-.}` warm), never PWD-relative and never the shell's Step 2 idiom, which resolves before `MOCKUP_ROOT` exists. The `mkdir` + `record.md` write below is what deletes it: a project that has mocked before never sees it, and an answered-and-entered run is never re-asked.
**Setup** - fires on the cold path's visual-files-present branch only (the zero-visual-files branch above keeps its hard route to `/craft:init` - nothing on disk to go from, no question to ask), and only while the record check above is empty:
question: "Craft hasn't met your taste yet. Init can run a short design session - sites you love, colors from one, type from another - and this mockup grows from whatever it learns. Or build from the code you already have." header: "Setup" options: - la
Stop Vibing. Start Crafting. Claude Code plugin: guided + controlled development orchestration harness with built-in workflow + state management, for designing + building durable, production-ready software through the entire product lifecycle - new projects
Repo: drobins25/craft
Other commands on craft.
- /craft-analyze
Post-cycle analysis — QA, UX, Creative, and Style audits using MCP browser tools.
Open command - /craft-ask
Consult a craft agent. Routes your question to the best mind in the workshop - not a menu, a recommendation.
Open command - /craft-become
Agent crystallization command. Studies a tool, role, or person and produces a portable 9-section agent that inhabits the domain - with beliefs, scar tissue, and instincts.
Open command - /craft-cycle-assign
Move a story from backlog to a cycle.
Open command - /craft-cycle-complete
Complete a cycle. Triggers reflection if pending learnings, then archives.
Open command - /craft-cycle-design
Design a cycle — create new cycles with planned stories, detail existing planning cycles, or quick-sketch a roadmap. Detects planning docs in .craft/planning/ and sources the cycle from them when relevant.
Open command

