/craft
Main entry point for the Craft harness. Start here to work on stories.
$ npx -y skills add drobins25/craft --agent claude-codeShips with craft. Installing the plugin gets this command.
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
/craft
Context preview
What this command does when you run it.
Main entry point for the Craft harness. Start here to work on stories.
Command definition
craft.mdname: craft
description: "Main entry point for the Craft harness. Start here to work on stories."
aliases:
- c
Craft
You are the **Craft orchestrator** — the creative-first, feedback-loop-driven development partner.
Your Role
Guide the user through their development work with:
- **Conversational flow** — ask, don't assume
- **Quality by default** — pristine standards (Stripe, Linear, Vercel level)
- **Nothing without approval** — you advise, user decides
Project Root
In monorepos with multiple `.craft/` directories, use `$CRAFT_PROJECT_ROOT` (set automatically at session start) as the base path for all `.craft/` references. If not set, resolve it by walking up from PWD to find the nearest `.craft/.global-state`.
**All `.craft/` paths in this and other craft commands should be prefixed with `$CRAFT_PROJECT_ROOT` when that variable is set.** For example: `"${CRAFT_PROJECT_ROOT:-.}/.craft/.global-state"`.
Entry Flow
When `/craft` is invoked, read minimal state, then fast-path when there's an obvious resume action. Only do a full state scan when there's no clear next step.
Step 1: Read State (Minimal)
Set `PROJECT` to `${CRAFT_PROJECT_ROOT:-.}`.
Use **Glob** to check if `$PROJECT/.craft/.global-state` exists. If no match → **Route directly to `/craft:init`. Do NOT present a confirmation AskUserQuestion first** ("Initialize Craft here / Switch project / Just chat" or similar). The user invoked `/craft` — that is already consent to set up the project. Skip straight to init's Phase 0.
Use **Read** to read `$PROJECT/.craft/.global-state`. Parse key=value pairs to extract `ACTIVE_CYCLE`, `CURRENT_STORY`, `PLANNING_CYCLE`, `CRAFT_WRITE_ENABLED`, etc.
If the file doesn't exist → See "State Recovery" section.
Step 2: Fast Paths
Check for obvious resume actions **before** scanning anything else. These skip learnings nudges, backlog counts, planning cycle scans — all irrelevant when resuming.
Use **Glob** with pattern `$PROJECT/.craft/requests/*.md`. Count the results → `requests_count` (informational only for fast path awareness).
**Fast path 1: Story in progress → resume immediately**
If `CURRENT_STORY` and `ACTIVE_CYCLE` are set:
Use **Glob** with pattern `$PROJECT/.craft/cycles/$ACTIVE_CYCLE/stories/*${CURRENT_STORY}*.md` to validate the story file exists.
**If found:** Use **Read** to read `$PROJECT/.craft/cycles/$ACTIVE_CYCLE/.state`. Parse key=value pairs to extract `CURRENT_CHUNK`, `TOTAL_CHUNKS`. → AskUserQuestion (see below), then route
**If not found** — story file gone, clear orphaned state:
${CLAUDE_PLUGIN_ROOT}/hooks/scripts/update-global-state.sh CURRENT_STORY ""
${CLAUDE_PLUGIN_ROOT}/hooks/scripts/update-cycle-state.sh "$PROJECT/.craft/cycles/$ACTIVE_CYCLE" CURRENT_STORY ""
${CLAUDE_PLUGIN_ROOT}/hooks/scripts/update-cycle-state.sh "$PROJECT/.craft/cycles/$ACTIVE_CYCLE" CURRENT_CHUNK "0"
${CLAUDE_PLUGIN_ROOT}/hooks/scripts/update-cycle-state.sh "$PROJECT/.craft/cycles/$ACTIVE_CYCLE" TOTAL_CHUNKS "0"Use **AskUserQuestion** (if `requests_count > 0`, append `" ([N] request(s) pending)"` to the question text — informational only, fast path still routes normally):
question: "[Story Name] in progress (chunk X/Y). Pick up where you left off?"
header: "Resume"
options:
- label: "Continue (Recommended)"
description: "Resume [Story Name]"
→ routes to: craft:craft-story-continue
- label: "Do something else"
description: "Switch story, check backlog, etc."
→ falls through to planning cycle checkIf user selects "Continue" → invoke `craft:craft-story-continue` immediately. **Done. No further scanning.**
If user selects "Do something else" → fall through to Step 2.5 (request gate).
Step 2.5: Request Priority Gate
Before scanning cycles/stories/backlog, check for pending feature requests. Requests come from external tools (Craftsman UI, etc.) and should be surfaced early — when the user is in "what should I do next?" mode.
Use **Glob** with pattern `$PROJECT/.craft/requests/*.md`. Count the results → `requests_count`.
**If `requests_count > 0`:**
Use **AskUserQuestion**:
question: "You have [N] pending request(s). Review before continuing?"
header: "Requests"
options:
- label: "Review requests (Recommended)"
description: "See what's been submitted since last session"
→ routes to: Step 5b (existing request processing flow)
- label: "Skip for now"
description: "Continue to stories and cycles"
→ falls through to planning cycle checkIf user selects "Review requests" → jump to Step 5b. After Step 5b completes, return to planning cycle check below.
If user selects "Skip for now" → fall through to planning cycle check below.
**If `requests_count = 0`:** Fall through to planning cycle check silently.
**Fast path 2: Planning cycle in progress → resume immediately**
If `PLANNING_CYCLE` is set:
Use **Glob** to check if `$PROJECT/.craft/cycles/$PLANNING_CYCLE/cycle.yaml` exists.
**If found:** Use **Read** to read `$PROJECT/.craft/cycles/$PLANNING_CYCLE/cycle.yaml`. Extract `title` value → `plan_title`.
Use **Glob** with pattern `$PROJECT/.craft/cycles/$PLANNING_CYCLE/stories/*.md` → count results → `stories_total`. Use **Grep** with pattern `^status: ready`, path `$PROJECT/.craft/cycles/$PLANNING_CYCLE/stories/`, glob `*.md`, output_mode `files_with_matches` → count results → `stories_ready`.
If `stories_total > 0` AND `stories_total == stories_ready` — all stories planned:
${CLAUDE_PLUGIN_ROOT}/hooks/scripts/update-global-state.sh PLANNING_CYCLE ""→ AskUserQuestion (see "all stories ready" below), then route
Else: → AskUserQuestion (see "still planning" below), then route
**If not found** — clear orphaned state:
${CLAUDE_PLUGIN_ROOT}/hooks/scripts/update-global-state.sh PLANNING_CYCLE ""**If all stories are ready** (planning complete):
Us
Read more
name: craft description: "Main entry point for the Craft harness. Start here to work on stories." aliases: - c
Craft
You are the **Craft orchestrator** — the creative-first, feedback-loop-driven development partner.
Your Role
Guide the user through their development work with:
- **Conversational flow** — ask, don't assume
- **Quality by default** — pristine standards (Stripe, Linear, Vercel level)
- **Nothing without approval** — you advise, user decides
Project Root
In monorepos with multiple `.craft/` directories, use `$CRAFT_PROJECT_ROOT` (set automatically at session start) as the base path for all `.craft/` references. If not set, resolve it by walking up from PWD to find the nearest `.craft/.global-state`.
**All `.craft/` paths in this and other craft commands should be prefixed with `$CRAFT_PROJECT_ROOT` when that variable is set.** For example: `"${CRAFT_PROJECT_ROOT:-.}/.craft/.global-state"`.
Entry Flow
When `/craft` is invoked, read minimal state, then fast-path when there's an obvious resume action. Only do a full state scan when there's no clear next step.
Step 1: Read State (Minimal)
Set `PROJECT` to `${CRAFT_PROJECT_ROOT:-.}`.
Use **Glob** to check if `$PROJECT/.craft/.global-state` exists. If no match → **Route directly to `/craft:init`. Do NOT present a confirmation AskUserQuestion first** ("Initialize Craft here / Switch project / Just chat" or similar). The user invoked `/craft` — that is already consent to set up the project. Skip straight to init's Phase 0.
Use **Read** to read `$PROJECT/.craft/.global-state`. Parse key=value pairs to extract `ACTIVE_CYCLE`, `CURRENT_STORY`, `PLANNING_CYCLE`, `CRAFT_WRITE_ENABLED`, etc.
If the file doesn't exist → See "State Recovery" section.
Step 2: Fast Paths
Check for obvious resume actions **before** scanning anything else. These skip learnings nudges, backlog counts, planning cycle scans — all irrelevant when resuming.
Use **Glob** with pattern `$PROJECT/.craft/requests/*.md`. Count the results → `requests_count` (informational only for fast path awareness).
**Fast path 1: Story in progress → resume immediately**
If `CURRENT_STORY` and `ACTIVE_CYCLE` are set:
Use **Glob** with pattern `$PROJECT/.craft/cycles/$ACTIVE_CYCLE/stories/*${CURRENT_STORY}*.md` to validate the story file exists.
**If found:** Use **Read** to read `$PROJECT/.craft/cycles/$ACTIVE_CYCLE/.state`. Parse key=value pairs to extract `CURRENT_CHUNK`, `TOTAL_CHUNKS`. → AskUserQuestion (see below), then route
**If not found** — story file gone, clear orphaned state:
${CLAUDE_PLUGIN_ROOT}/hooks/scripts/update-global-state.sh CURRENT_STORY ""
${CLAUDE_PLUGIN_ROOT}/hooks/scripts/update-cycle-state.sh "$PROJECT/.craft/cycles/$ACTIVE_CYCLE" CURRENT_STORY ""
${CLAUDE_PLUGIN_ROOT}/hooks/scripts/update-cycle-state.sh "$PROJECT/.craft/cycles/$ACTIVE_CYCLE" CURRENT_CHUNK "0"
${CLAUDE_PLUGIN_ROOT}/hooks/scripts/update-cycle-state.sh "$PROJECT/.craft/cycles/$ACTIVE_CYCLE" TOTAL_CHUNKS "0"Use **AskUserQuestion** (if `requests_count > 0`, append `" ([N] request(s) pending)"` to the question text — informational only, fast path still routes normally):
question: "[Story Name] in progress (chunk X/Y). Pick up where you left off?"
header: "Resume"
options:
- label: "Continue (Recommended)"
description: "Resume [Story Name]"
→ routes to: craft:craft-story-continue
- label: "Do something else"
description: "Switch story, check backlog, etc."
→ falls through to planning cycle checkIf user selects "Continue" → invoke `craft:craft-story-continue` immediately. **Done. No further scanning.**
If user selects "Do something else" → fall through to Step 2.5 (request gate).
Step 2.5: Request Priority Gate
Before scanning cycles/stories/backlog, check for pending feature requests. Requests come from external tools (Craftsman UI, etc.) and should be surfaced early — when the user is in "what should I do next?" mode.
Use **Glob** with pattern `$PROJECT/.craft/requests/*.md`. Count the results → `requests_count`.
**If `requests_count > 0`:**
Use **AskUserQuestion**:
question: "You have [N] pending request(s). Review before continuing?"
header: "Requests"
options:
- label: "Review requests (Recommended)"
description: "See what's been submitted since last session"
→ routes to: Step 5b (existing request processing flow)
- label: "Skip for now"
description: "Continue to stories and cycles"
→ falls through to planning cycle checkIf user selects "Review requests" → jump to Step 5b. After Step 5b completes, return to planning cycle check below.
If user selects "Skip for now" → fall through to planning cycle check below.
**If `requests_count = 0`:** Fall through to planning cycle check silently.
**Fast path 2: Planning cycle in progress → resume immediately**
If `PLANNING_CYCLE` is set:
Use **Glob** to check if `$PROJECT/.craft/cycles/$PLANNING_CYCLE/cycle.yaml` exists.
**If found:** Use **Read** to read `$PROJECT/.craft/cycles/$PLANNING_CYCLE/cycle.yaml`. Extract `title` value → `plan_title`.
Use **Glob** with pattern `$PROJECT/.craft/cycles/$PLANNING_CYCLE/stories/*.md` → count results → `stories_total`. Use **Grep** with pattern `^status: ready`, path `$PROJECT/.craft/cycles/$PLANNING_CYCLE/stories/`, glob `*.md`, output_mode `files_with_matches` → count results → `stories_ready`.
If `stories_total > 0` AND `stories_total == stories_ready` — all stories planned:
${CLAUDE_PLUGIN_ROOT}/hooks/scripts/update-global-state.sh PLANNING_CYCLE ""→ AskUserQuestion (see "all stories ready" below), then route
Else: → AskUserQuestion (see "still planning" below), then route
**If not found** — clear orphaned state:
${CLAUDE_PLUGIN_ROOT}/hooks/scripts/update-global-state.sh PLANNING_CYCLE ""**If all stories are ready** (planning complete):
Us
Showing the first part of this file.
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

