Skip to content
Development
Command

/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

From plugin
craft
4260 skills27 agents60 commands7 hooks
+1
Install
$ npx -y skills add drobins25/craft --agent claude-code

How 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.md

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
Read more
Ships withcraft

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

Get the whole plugin, auto-invoked
Stats
42
Stars
1
Views
5
Forks
Active
Maintenance
Shell
Language
MIT
License
21h ago
Last commit
3mo ago
Created

Repo: drobins25/craft