craft-annotate
CommandPoint at anything in a live browser tab - every pin gets a live attempt on the page the moment you SEND it, and the session keeps…
Post-cycle analysis — QA, UX, Creative, and Style audits using MCP browser tools.
> /plugin marketplace add drobins25/craft> /plugin install craft@craft
name: analyze description: "Post-cycle analysis — QA, UX, Creative, and Style audits using MCP browser tools."
Run comprehensive analysis on what you've built. Findings persist between sessions — nothing gets lost.
| Type | Agent | Finds | |------|-------|-------| | **QA** | qa-analyzer | Bugs, errors, edge cases | | **UX** | ux-analyzer | Friction, accessibility, heuristic violations | | **Creative** | creative-analyzer | Delight opportunities, feature ideas | | **Style** | style-analyzer | Token violations, pattern drift | | **Walkthrough** | walkthrough-analyzer | "Does it actually work for a human?" - clicks everything, checks every state |
QA and Walkthrough file the defects they find as bugs in `.craft/bugs/`. UX, Creative, and Style queue their findings for review.
Before any new analysis, check for existing pending findings of the requested type. Only UX, Creative, and Style keep a pending queue (`.craft/analysis/pending/ux.yaml`, `creative.yaml`, `style.yaml`). A QA or Walkthrough request skips this step and goes to Step 2, since their defects are filed as bugs and nothing queues.
**If pending findings exist:**
> "You have [N] pending [type] findings from [date]: > > **Critical/High:** [count] > **Medium:** [count] > **Low:** [count] > > What would you like to do?"
Use **AskUserQuestion**:
question: "What would you like to do with pending findings?"
header: "Pending"
options:
- label: "Review pending findings now"
description: "Go through existing findings before new analysis"
- label: "Continue analysis (keep pending)"
description: "Run new analysis, existing findings stay queued"
- label: "Clear pending and start fresh"
description: "Dismiss old findings, start new analysis"**If user provides custom text:** Ask a clarifying AskUserQuestion before proceeding.
**If user chooses "Review pending"** → Go to Step 5 (Review Findings)
**If user chooses "Continue" or "Clear"** → Proceed to Step 2
> "What kind of analysis?"
Use **AskUserQuestion**:
question: "What kind of analysis?"
header: "Type"
options:
- label: "QA Pass"
description: "Find bugs and errors"
- label: "UX Insights"
description: "Usability and accessibility review"
- label: "Creative Exploration"
description: "Find delight opportunities"
- label: "Style Audit"
description: "Design consistency check"
- label: "Walkthrough"
description: "Click everything in the live app, report what doesn't feel right"**Note:** "Full Analysis" runs all types sequentially. If user selects "Other" and mentions "full" or "all", run all types.
**If user provides custom text:** Ask a clarifying AskUserQuestion to confirm which analysis type(s) they want.
**Resolve the cycle first.** Read `ACTIVE_CYCLE` from `$PROJECT/.craft/.global-state` and take the title from that cycle's `cycle.yaml`. When `ACTIVE_CYCLE` is empty (a cycle just closed), look up the last completed cycle:
bash "${CLAUDE_PLUGIN_ROOT}/hooks/scripts/get-latest-cycle.sh" "$PROJECT" --status=completeIts `CYCLE_TITLE` is the title. When that comes back empty too, there is no cycle.
> "What should I analyze?"
Use **AskUserQuestion**:
question: "What should I analyze?"
header: "Scope"
options:
- label: "Current cycle"
description: "All stories in <title>"
- label: "Specific story"
description: "Pick one story from the cycle"
- label: "Specific pages"
description: "I'll specify which pages/URLs"
- label: "Whole application"
description: "Full app analysis"The first option reads `Current cycle` when a cycle is active, `Last completed cycle (<title>)` when only a completed one exists, and is omitted when neither exists. "Specific story" picks from that same resolved cycle.
The confirmed scope yields two values the later steps use:
**If user provides custom text:** Ask a clarifying AskUserQuestion to confirm the scope.
**If user selects "Specific pages":**
Use **AskUserQuestion**:
question: "Which pages should I analyze?"
header: "Pages"
options:
- label: "[Known page 1]"
description: "Based on project structure"
- label: "[Known page 2]"
- label: "[Known page 3]"**If scope is ambiguous or Claude is unsure:**
Use **AskUserQuestion**:
question: "I want to make sure I analyze the right things. Can you confirm?" header: "Clarify" options: - label: "[Option based on understanding]" - label: "[Alternative interpretation]" - label: "Let me explain differently"
**IMPORTANT:** Always confirm scope before running analysis. If uncertain about:
Ask first. Don't assume.
**Check MCP availability first.** Chrome-devtools MCP should be available — the Craft plugin bundles it automatically.
If chrome-devtools MCP tools are not available:
> "Chrome DevTools MCP should be available through the Craft plugin, but I'm not seeing it. > > Try restarting Claude Code (`exit` then `claude`) to reload the plugin's MCP servers. > > Then run `/craft:analyze` again."
**If MCP is available**, **INVOKE the appropriate analyzer agent using the Task tool**:
Pass the confirmed scope a
Point at anything in a live browser tab - every pin gets a live attempt on the page the moment you SEND it, and the session keeps…
Consult a craft agent. Routes your question to the best mind in the workshop - not a menu, a recommendation.
Agent crystallization command. Studies a tool, role, or person and produces a portable 9-section agent that inhabits the domain -…
File a bug without fixing it, from a person mid-conversation or an agent mid-run. One door, a complete record on disk, nobody…
Complete a cycle. Triggers reflection if pending learnings, then archives.
Implement tasks incrementally — build, test, verify, commit. Add "auto" to run the whole plan in one approved pass.