* feat(sdk): golden parity harness and query handler CJS alignment (#2302 Track A) Golden/read-only parity tests and registry alignment, query handler fixes (check-completion, state-mutation, commit, validate, summary, etc.), and WAITING.json dual-write for .gsd/.planning readers. Refs gsd-build/get-shit-done#2341 * fix(sdk): getMilestoneInfo matches GSD ROADMAP (🟡, last bold, STATE fallback) - Recognize in-flight 🟡 milestone bullets like 🚧. - Derive from last **vX.Y Title** before ## Phases when emoji absent. - Fall back to STATE.md milestone when ROADMAP is missing; use last bare vX.Y in cleaned text instead of first (avoids v1.0 from shipped list). - Fixes init.execute-phase milestone_version and buildStateFrontmatter after state.begin-phase (syncStateFrontmatter). * feat(sdk): phase list, plan task structure, requirements extract handlers - Register phase.list-plans, phase.list-artifacts, plan.task-structure, requirements.extract-from-plans (SDK-only; golden-policy exceptions). - Add unit tests; document in QUERY-HANDLERS.md. - writeProfile: honor --output, render dimensions, return profile_path and dimensions_scored. * feat(sdk): centralize getGsdAgentsDir in query helpers Extract agent directory resolution to helpers (GSD_AGENTS_DIR, primary ~/.claude/agents, legacy path). Use from init and docs-init init bundles. docs(15): add 15-CONTEXT for autonomous phase-15 run. * feat(sdk): query CLI CJS fallback and session correlation - createRegistry(eventStream, sessionId) threads correlation into mutation events - gsd-sdk query falls back to gsd-tools.cjs when no native handler matches (disable with GSD_QUERY_FALLBACK=off); stderr bridge warnings - Export createRegistry from @gsd-build/sdk; add sdk/README.md - Update QUERY-HANDLERS.md and registry module docs for fallback + sessionId - Agents: prefer node dist/cli.js query over cat/grep for STATE and plans * fix(sdk): init phase_found parity, docs-init agents path, state field extract - Normalize findPhase not-found to null before roadmap fallback (matches findPhaseInternal) - docs-init: use detectRuntime + resolveAgentsDir for checkAgentsInstalled - state.cjs stateExtractField: horizontal whitespace only after colon (YAML progress guard) - Tests: commit_docs default true; config-get golden uses temp config; golden integration green Refs: #2302 * refactor(sdk): share SessionJsonlRecord in profile-extract-messages CodeRabbit nit: dedupe JSONL record shape for isGenuineUserMessage and streamExtractMessages. * fix(sdk): address CodeRabbit major threads (paths, gates, audit, verify) - Resolve @file: and CLI JSON indirection relative to projectDir; guard empty normalized query command - plan.task-structure + intel extract/patch-meta: resolvePathUnderProject containment - check.config-gates: safe string booleans; plan_checker alias precedence over plan_check default - state.validate/sync: phaseTokenMatches + comparePhaseNum ordering - verify.schema-drift: token match phase dirs; files_modified from parsed frontmatter - audit-open: has_scan_errors, unreadable rows, human report when scans fail - requirements PLANNED key PLAN for root PLAN.md; gsd-tools timeout note - ingest-docs: repo-root path containment; classifier output slug-hash Golden parity test strips has_scan_errors until CJS adds field. * fix: Resolve CodeRabbit security and quality findings - Secure intel.ts and cli.ts against path traversal - Catch and validate git add status in commit.ts - Expand roadmap milestone marker extraction - Fix parsing array-of-objects in frontmatter YAML - Fix unhandled config evaluations - Improve coverage test parity mapping * docs(sdk): registry docs and gsd-sdk query call sites (#2302 Track B) Update CHANGELOG, architecture and user guides, workflow call sites, and read-guard tests for gsd-sdk query; sync ARCHITECTURE.md command/workflow counts and directory-tree totals with the repo (80 commands, 77 workflows). Address CodeRabbit: fix markdown tables and emphasis; align CLI-TOOLS GSDTools and state.read docs with implementation; correct roadmap handler name in universal-anti-patterns; resolve settings workflow config path without relying on config_path from state.load. Refs gsd-build/get-shit-done#2340 * test: raise planner character extraction limit to 48K * fix(sdk): resolve build TS error and doc conflict markers
287 lines
12 KiB
Markdown
287 lines
12 KiB
Markdown
<purpose>
|
|
Explore design directions through throwaway HTML mockups before committing to implementation.
|
|
Each sketch produces 2-3 variants for comparison. Saves artifacts to `.planning/sketches/`.
|
|
Companion to `/gsd-sketch-wrap-up`.
|
|
</purpose>
|
|
|
|
<required_reading>
|
|
Read all files referenced by the invoking prompt's execution_context before starting.
|
|
|
|
@~/.claude/get-shit-done/references/sketch-theme-system.md
|
|
@~/.claude/get-shit-done/references/sketch-variant-patterns.md
|
|
@~/.claude/get-shit-done/references/sketch-interactivity.md
|
|
@~/.claude/get-shit-done/references/sketch-tooling.md
|
|
</required_reading>
|
|
|
|
<process>
|
|
|
|
<step name="banner">
|
|
```
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
GSD ► SKETCHING
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
```
|
|
|
|
Parse `$ARGUMENTS` for:
|
|
- `--quick` flag → set `QUICK_MODE=true`
|
|
- `--text` flag → set `TEXT_MODE=true`
|
|
- Remaining text → the design idea to sketch
|
|
|
|
**Text mode (`workflow.text_mode: true` in config or `--text` flag):** Set `TEXT_MODE=true` if `--text` is present in `$ARGUMENTS` OR `text_mode` from init JSON is `true`. When TEXT_MODE is active, replace every `AskUserQuestion` call with a plain-text numbered list and ask the user to type their choice number. This is required for non-Claude runtimes (OpenAI Codex, Gemini CLI, etc.) where `AskUserQuestion` is not available.
|
|
</step>
|
|
|
|
<step name="setup_directory">
|
|
Create `.planning/sketches/` and themes directory if they don't exist:
|
|
|
|
```bash
|
|
mkdir -p .planning/sketches/themes
|
|
```
|
|
|
|
Check for existing sketches to determine numbering:
|
|
```bash
|
|
ls -d .planning/sketches/[0-9][0-9][0-9]-* 2>/dev/null | sort | tail -1
|
|
```
|
|
|
|
Check `commit_docs` config:
|
|
```bash
|
|
COMMIT_DOCS=$(gsd-sdk query config-get commit_docs 2>/dev/null || echo "true")
|
|
```
|
|
</step>
|
|
|
|
<step name="mood_intake">
|
|
**If `QUICK_MODE` is true:** Skip mood intake. Use whatever the user provided in `$ARGUMENTS` as the design direction. Jump to `decompose`.
|
|
|
|
**Otherwise:**
|
|
|
|
Before sketching anything, explore the design intent through conversation. Ask one question at a time using AskUserQuestion, with a paragraph of context and reasoning for each.
|
|
|
|
**Questions to cover (adapt to what the user has already shared):**
|
|
|
|
1. **Feel:** "What should this feel like? Give me adjectives, emotions, or a vibe." (e.g., "clean and clinical", "warm and playful", "dense and powerful")
|
|
2. **References:** "What apps, sites, or products have a similar feel to what you're imagining?" (gives concrete visual anchors)
|
|
3. **Core action:** "What's the single most important thing a user does here?" (focuses the sketch on what matters)
|
|
|
|
You may need more or fewer questions depending on how much the user shares upfront. After each answer, briefly reflect what you heard and how it shapes your thinking.
|
|
|
|
When you have enough signal, ask: **"I think I have a good sense of the direction. Ready for me to sketch, or want to keep discussing?"**
|
|
|
|
Only proceed when the user says go.
|
|
</step>
|
|
|
|
<step name="decompose">
|
|
Break the idea into 2-5 design questions. Present as a table:
|
|
|
|
| Sketch | Design question | Approach | Risk |
|
|
|--------|----------------|----------|------|
|
|
| 001 | Does a two-panel layout feel right? | Sidebar + main, variants: fixed/collapsible/floating | **High** — sets page structure |
|
|
| 002 | How should the form controls look? | Grouped cards, variants: stacked/inline/floating labels | Medium |
|
|
|
|
Each sketch answers one specific visual question. Good sketches:
|
|
- "Does this layout feel right?" — build with real-ish content
|
|
- "How should these controls be grouped?" — build with actual labels and inputs
|
|
- "What does this interaction feel like?" — build the hover/click/transition
|
|
- "Does this color palette work?" — apply to actual UI, not a swatch grid
|
|
|
|
Bad sketches:
|
|
- "Design the whole app" — too broad
|
|
- "Set up the component library" — that's implementation
|
|
- "Pick a color palette" — apply it to UI instead
|
|
|
|
Present the table and get alignment before building.
|
|
</step>
|
|
|
|
<step name="research_stack">
|
|
## Research the Target Stack
|
|
|
|
Before sketching, ground the design in what's actually buildable. Sketches are HTML, but they should reflect real constraints of the target implementation.
|
|
|
|
**a. Identify the target stack.** Check for package.json, Cargo.toml, etc. If the user mentioned a framework (React, SwiftUI, Flutter, etc.), note it.
|
|
|
|
**b. Check component/pattern availability.** Use context7 (resolve-library-id → query-docs) or web search to answer:
|
|
- What layout primitives does the target framework provide? (grid systems, nav patterns, panel components)
|
|
- Are there existing component libraries in use? (shadcn, Material UI, etc.) What components are available?
|
|
- What interaction patterns are idiomatic? (e.g., sheet vs modal vs dialog in mobile)
|
|
|
|
**c. Note constraints that affect design.** Some things that look great in HTML are painful or impossible in certain stacks:
|
|
- Platform conventions (iOS nav patterns, desktop menu bars, terminal grid constraints)
|
|
- Framework limitations (what's easy vs requires custom work)
|
|
- Existing design tokens or theme systems already in the project
|
|
|
|
**d. Let research inform variants.** Use findings to make variants that are actually buildable — at least one variant should follow the path of least resistance for the target stack.
|
|
|
|
**Skip when unnecessary.** If it's a greenfield project with no stack chosen, or the user explicitly says "just explore visually, don't worry about implementation," skip this step entirely. The point is grounding, not gatekeeping.
|
|
</step>
|
|
|
|
<step name="create_manifest">
|
|
Create or update `.planning/sketches/MANIFEST.md`:
|
|
|
|
```markdown
|
|
# Sketch Manifest
|
|
|
|
## Design Direction
|
|
[One paragraph capturing the mood/feel/direction from the intake conversation]
|
|
|
|
## Reference Points
|
|
[Apps/sites the user referenced]
|
|
|
|
## Sketches
|
|
|
|
| # | Name | Design Question | Winner | Tags |
|
|
|---|------|----------------|--------|------|
|
|
```
|
|
|
|
If MANIFEST.md already exists, append new sketches to the existing table.
|
|
</step>
|
|
|
|
<step name="create_theme">
|
|
If no theme exists yet at `.planning/sketches/themes/default.css`, create one based on the mood/direction from the intake step. See `sketch-theme-system.md` for the full template.
|
|
|
|
Adapt colors, fonts, spacing, and shapes to match the agreed aesthetic — don't use the defaults verbatim unless they match the mood.
|
|
</step>
|
|
|
|
<step name="build_sketches">
|
|
Build each sketch in order.
|
|
|
|
### For Each Sketch:
|
|
|
|
**a.** Find next available number by checking existing `.planning/sketches/NNN-*/` directories.
|
|
Format: three-digit zero-padded + hyphenated descriptive name.
|
|
|
|
**b.** Create the sketch directory: `.planning/sketches/NNN-descriptive-name/`
|
|
|
|
**c.** Build `index.html` with 2-3 variants:
|
|
|
|
**First round — dramatic differences:** Build 2-3 meaningfully different approaches to the design question. Different layouts, different visual structures, different interaction models.
|
|
|
|
**Subsequent rounds — refinements:** Once the user has picked a direction or cherry-picked elements, build subtler variations within that direction.
|
|
|
|
Each variant is a page/tab in the same HTML file. Include:
|
|
- Tab navigation to switch between variants (see `sketch-variant-patterns.md`)
|
|
- Clear labels: "Variant A: Sidebar Layout", "Variant B: Top Nav", etc.
|
|
- The sketch toolbar (see `sketch-tooling.md`)
|
|
- All interactive elements functional (see `sketch-interactivity.md`)
|
|
- Real-ish content, not lorem ipsum
|
|
- Link to `../themes/default.css` for shared theme variables
|
|
|
|
**All sketches are plain HTML with inline CSS and JS.** No build step, no npm, no framework. Opens instantly in a browser.
|
|
|
|
**d.** Write `README.md`:
|
|
|
|
```markdown
|
|
---
|
|
sketch: NNN
|
|
name: descriptive-name
|
|
question: "What layout structure feels right for the dashboard?"
|
|
winner: null
|
|
tags: [layout, dashboard]
|
|
---
|
|
|
|
# Sketch NNN: Descriptive Name
|
|
|
|
## Design Question
|
|
[The specific visual question this sketch answers]
|
|
|
|
## How to View
|
|
open .planning/sketches/NNN-descriptive-name/index.html
|
|
|
|
## Variants
|
|
- **A: [name]** — [one-line description of this approach]
|
|
- **B: [name]** — [one-line description]
|
|
- **C: [name]** — [one-line description]
|
|
|
|
## What to Look For
|
|
[Specific things to pay attention to when comparing variants]
|
|
```
|
|
|
|
**e.** Present to the user with a checkpoint:
|
|
|
|
╔══════════════════════════════════════════════════════════════╗
|
|
║ CHECKPOINT: Verification Required ║
|
|
╚══════════════════════════════════════════════════════════════╝
|
|
|
|
**Sketch {NNN}: {name}**
|
|
|
|
Open: `open .planning/sketches/NNN-name/index.html`
|
|
|
|
Compare: {what to look for between variants}
|
|
|
|
──────────────────────────────────────────────────────────────
|
|
→ Which variant feels right? Or cherry-pick elements across variants.
|
|
──────────────────────────────────────────────────────────────
|
|
|
|
**f.** Handle feedback:
|
|
- **Pick a direction:** "I like variant B" → mark winner in README, move to next sketch
|
|
- **Cherry-pick elements:** "Rounded edges from A, color treatment from C" → build a synthesis as a new variant, show again
|
|
- **Want more exploration:** "None of these feel right, try X instead" → build new variants
|
|
|
|
Iterate until the user is satisfied with a direction for this sketch.
|
|
|
|
**g.** Finalize:
|
|
1. Mark the winning variant in the README frontmatter (`winner: "B"`)
|
|
2. Add ★ indicator to the winning tab in the HTML
|
|
3. Update `.planning/sketches/MANIFEST.md` with the sketch row
|
|
|
|
**h.** Commit (if `COMMIT_DOCS` is true):
|
|
```bash
|
|
gsd-sdk query commit "docs(sketch-NNN): [winning direction] — [key visual insight]" .planning/sketches/NNN-descriptive-name/ .planning/sketches/MANIFEST.md
|
|
```
|
|
|
|
**i.** Report:
|
|
```
|
|
◆ Sketch NNN: {name}
|
|
Winner: Variant {X} — {description}
|
|
Insight: {key visual decision made}
|
|
```
|
|
</step>
|
|
|
|
<step name="report">
|
|
After all sketches complete, present the summary:
|
|
|
|
```
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
GSD ► SKETCH COMPLETE ✓
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
|
|
## Design Direction
|
|
{what we landed on overall}
|
|
|
|
## Key Decisions
|
|
{layout, palette, typography, spacing, interaction patterns}
|
|
|
|
## Open Questions
|
|
{anything unresolved or worth revisiting}
|
|
```
|
|
|
|
───────────────────────────────────────────────────────────────
|
|
|
|
## ▶ Next Up
|
|
|
|
**Package findings** — wrap design decisions into a reusable skill
|
|
|
|
`/gsd-sketch-wrap-up`
|
|
|
|
───────────────────────────────────────────────────────────────
|
|
|
|
**Also available:**
|
|
- `/gsd-plan-phase` — start building the real UI
|
|
- `/gsd-explore` — continue exploring the concept
|
|
- `/gsd-spike` — spike technical feasibility of a design pattern
|
|
|
|
───────────────────────────────────────────────────────────────
|
|
</step>
|
|
|
|
</process>
|
|
|
|
<success_criteria>
|
|
- [ ] `.planning/sketches/` created (auto-creates if needed, no project init required)
|
|
- [ ] Design direction explored conversationally before any code (unless --quick)
|
|
- [ ] Target stack researched — component availability, constraints, and idioms noted (unless greenfield/skipped)
|
|
- [ ] Each sketch has 2-3 variants for comparison (at least one follows path of least resistance for target stack)
|
|
- [ ] User can open and interact with sketches in a browser
|
|
- [ ] Winning variant selected and marked for each sketch
|
|
- [ ] All variants preserved (winner marked, not others deleted)
|
|
- [ ] MANIFEST.md is current
|
|
- [ ] Commits use `docs(sketch-NNN): [winner]` format
|
|
- [ ] Summary presented with next-step routing
|
|
</success_criteria>
|