jettypod 4.4.120 → 4.4.121
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env +2 -1
- package/Cargo.lock +6450 -0
- package/Cargo.toml +35 -0
- package/README.md +5 -1
- package/TAURI-MIGRATION-PLAN.md +840 -0
- package/apps/dashboard/app/connect-claude/page.tsx +5 -6
- package/apps/dashboard/app/decision/[id]/page.tsx +54 -49
- package/apps/dashboard/app/demo/gates/page.tsx +3 -5
- package/apps/dashboard/app/design-system/page.tsx +1 -1
- package/apps/dashboard/app/globals.css +74 -2
- package/apps/dashboard/app/install-claude/page.tsx +3 -5
- package/apps/dashboard/app/login/page.tsx +17 -20
- package/apps/dashboard/app/page.tsx +101 -48
- package/apps/dashboard/app/settings/page.tsx +60 -12
- package/apps/dashboard/app/signup/page.tsx +14 -17
- package/apps/dashboard/app/subscribe/page.tsx +0 -2
- package/apps/dashboard/app/tests/page.tsx +37 -4
- package/apps/dashboard/app/welcome/page.tsx +12 -15
- package/apps/dashboard/app/work/[id]/page.tsx +90 -75
- package/apps/dashboard/app/work/[id]/proof/page.tsx +1489 -0
- package/apps/dashboard/components/AppShell.tsx +70 -61
- package/apps/dashboard/components/CardMenu.tsx +0 -1
- package/apps/dashboard/components/ClaudePanel.tsx +541 -283
- package/apps/dashboard/components/ClaudePanelInput.tsx +23 -4
- package/apps/dashboard/components/ConnectClaudeScreen.tsx +1 -5
- package/apps/dashboard/components/CopyableId.tsx +1 -2
- package/apps/dashboard/components/DetailReviewActions.tsx +11 -20
- package/apps/dashboard/components/DragContext.tsx +132 -62
- package/apps/dashboard/components/DraggableCard.tsx +3 -5
- package/apps/dashboard/components/DropZone.tsx +5 -6
- package/apps/dashboard/components/EditableDetailDescription.tsx +6 -12
- package/apps/dashboard/components/EditableDetailTitle.tsx +6 -13
- package/apps/dashboard/components/EditableTitle.tsx +0 -1
- package/apps/dashboard/components/ElapsedTimer.tsx +15 -3
- package/apps/dashboard/components/EpicGroup.tsx +100 -70
- package/apps/dashboard/components/GateCard.tsx +0 -1
- package/apps/dashboard/components/GateChoiceCard.tsx +1 -2
- package/apps/dashboard/components/InstallClaudeScreen.tsx +1 -5
- package/apps/dashboard/components/JettyLoader.tsx +0 -1
- package/apps/dashboard/components/KanbanBoard.tsx +319 -173
- package/apps/dashboard/components/KanbanCard.tsx +341 -107
- package/apps/dashboard/components/LazyCard.tsx +62 -0
- package/apps/dashboard/components/LazyMarkdown.tsx +0 -1
- package/apps/dashboard/components/MainNav.tsx +24 -25
- package/apps/dashboard/components/MessageBlock.tsx +93 -16
- package/apps/dashboard/components/ModeStartCard.tsx +0 -1
- package/apps/dashboard/components/OnboardingWelcome.tsx +0 -1
- package/apps/dashboard/components/PlaceholderCard.tsx +0 -1
- package/apps/dashboard/components/ProjectSwitcher.tsx +20 -20
- package/apps/dashboard/components/PrototypeTimeline.tsx +47 -26
- package/apps/dashboard/components/RealTimeKanbanWrapper.tsx +308 -223
- package/apps/dashboard/components/RealTimeTestsWrapper.tsx +303 -160
- package/apps/dashboard/components/ReviewFooter.tsx +12 -14
- package/apps/dashboard/components/SessionList.tsx +0 -1
- package/apps/dashboard/components/SubscribeContent.tsx +40 -11
- package/apps/dashboard/components/TestTree.tsx +1 -2
- package/apps/dashboard/components/TipCard.tsx +2 -4
- package/apps/dashboard/components/Toast.tsx +0 -1
- package/apps/dashboard/components/TypeIcon.tsx +7 -8
- package/apps/dashboard/components/ViewModeToolbar.tsx +104 -0
- package/apps/dashboard/components/WaveCompletionAnimation.tsx +5 -17
- package/apps/dashboard/components/WelcomeScreen.tsx +2 -6
- package/apps/dashboard/components/WorkItemHeader.tsx +0 -1
- package/apps/dashboard/components/WorkItemTree.tsx +2 -4
- package/apps/dashboard/components/settings/AccountSection.tsx +27 -13
- package/apps/dashboard/components/settings/AiContextSection.tsx +89 -0
- package/apps/dashboard/components/settings/ContextDocumentsSection.tsx +317 -0
- package/apps/dashboard/components/settings/EnvVarsSection.tsx +20 -73
- package/apps/dashboard/components/settings/GeneralSection.tsx +137 -26
- package/apps/dashboard/components/settings/ProjectStackSection.tsx +948 -0
- package/apps/dashboard/components/settings/SettingsLayout.tsx +0 -1
- package/apps/dashboard/components/ui/Button.tsx +1 -1
- package/apps/dashboard/components/ui/Input.tsx +1 -1
- package/apps/dashboard/components.json +1 -1
- package/apps/dashboard/contexts/ClaudeSessionContext.tsx +611 -358
- package/apps/dashboard/contexts/ConnectionStatusContext.tsx +0 -1
- package/apps/dashboard/contexts/UsageContext.tsx +62 -31
- package/apps/dashboard/dev.sh +35 -0
- package/apps/dashboard/eslint.config.mjs +9 -9
- package/apps/dashboard/hooks/useWebSocket.ts +138 -83
- package/apps/dashboard/index.html +73 -0
- package/apps/dashboard/lib/data-bridge.ts +722 -0
- package/apps/dashboard/lib/db.ts +69 -1302
- package/apps/dashboard/lib/environment-config.ts +173 -0
- package/apps/dashboard/lib/environment-verification.ts +119 -0
- package/apps/dashboard/lib/kanban-utils.ts +226 -26
- package/apps/dashboard/lib/proof-run.ts +495 -0
- package/apps/dashboard/lib/proof-scenario-runner.ts +346 -0
- package/apps/dashboard/lib/service-recovery.ts +326 -0
- package/apps/dashboard/lib/session-state-machine.ts +1 -0
- package/apps/dashboard/lib/session-state-utils.ts +0 -164
- package/apps/dashboard/lib/session-stream-manager.ts +253 -122
- package/apps/dashboard/lib/stream-manager-registry.ts +46 -6
- package/apps/dashboard/lib/tauri-bridge.ts +102 -0
- package/apps/dashboard/lib/tauri.ts +106 -0
- package/apps/dashboard/lib/utils.ts +3 -3
- package/apps/dashboard/next-env.d.ts +1 -1
- package/apps/dashboard/package.json +21 -33
- package/apps/dashboard/public/bug-icon.png +0 -0
- package/apps/dashboard/public/buoy-icon.png +0 -0
- package/apps/dashboard/public/in-flight-seagull.png +0 -0
- package/apps/dashboard/public/pier-icon.png +0 -0
- package/apps/dashboard/public/star-icon.png +0 -0
- package/apps/dashboard/public/wrench-icon.png +0 -0
- package/apps/dashboard/scripts/tauri-build.js +228 -0
- package/apps/dashboard/scripts/upload-tauri-to-r2.js +125 -0
- package/apps/dashboard/src/main.tsx +12 -0
- package/apps/dashboard/src/router.tsx +107 -0
- package/apps/dashboard/src/vite-env.d.ts +1 -0
- package/apps/dashboard/tsconfig.json +7 -12
- package/apps/dashboard/tsconfig.tsbuildinfo +1 -1
- package/apps/dashboard/vite.config.ts +33 -0
- package/apps/update-server/src/index.ts +167 -30
- package/claude-hooks/global-guardrails.js +14 -13
- package/crates/jettypod-cli/Cargo.toml +19 -0
- package/crates/jettypod-cli/src/commands.rs +1249 -0
- package/crates/jettypod-cli/src/main.rs +595 -0
- package/crates/jettypod-core/Cargo.toml +26 -0
- package/crates/jettypod-core/build.rs +98 -0
- package/crates/jettypod-core/migrations/V1__baseline.sql +197 -0
- package/crates/jettypod-core/migrations/V2__work_items_indexes.sql +6 -0
- package/crates/jettypod-core/migrations/V3__qa_steps.sql +2 -0
- package/crates/jettypod-core/src/auth.rs +294 -0
- package/crates/jettypod-core/src/config.rs +397 -0
- package/crates/jettypod-core/src/db/mod.rs +507 -0
- package/crates/jettypod-core/src/db/recovery.rs +114 -0
- package/crates/jettypod-core/src/db/startup.rs +101 -0
- package/crates/jettypod-core/src/db/validate.rs +149 -0
- package/crates/jettypod-core/src/error.rs +76 -0
- package/crates/jettypod-core/src/git.rs +458 -0
- package/crates/jettypod-core/src/lib.rs +20 -0
- package/crates/jettypod-core/src/sessions.rs +625 -0
- package/crates/jettypod-core/src/skills.rs +556 -0
- package/crates/jettypod-core/src/work.rs +1086 -0
- package/crates/jettypod-core/src/worktree.rs +628 -0
- package/crates/jettypod-core/src/ws.rs +767 -0
- package/cucumber-test.cjs +6 -0
- package/jettypod.js +96 -4
- package/lib/bdd-preflight.js +96 -0
- package/lib/merge-lock.js +111 -253
- package/lib/migrations/030-rejection-round-columns.js +54 -0
- package/lib/migrations/031-session-isolation-index.js +17 -0
- package/lib/work-commands/index.js +58 -16
- package/lib/work-tracking/index.js +108 -8
- package/package.json +1 -1
- package/skills-templates/bug-mode/SKILL.md +43 -1
- package/skills-templates/chore-mode/SKILL.md +40 -1
- package/skills-templates/design-system-selection/SKILL.md +273 -0
- package/skills-templates/epic-planning/SKILL.md +14 -0
- package/skills-templates/feature-planning/SKILL.md +90 -1
- package/skills-templates/production-mode/SKILL.md +20 -0
- package/skills-templates/simple-improvement/SKILL.md +39 -2
- package/skills-templates/speed-mode/SKILL.md +10 -15
- package/skills-templates/stable-mode/SKILL.md +47 -0
- package/apps/dashboard/README.md +0 -36
- package/apps/dashboard/app/api/claude/[workItemId]/message/route.ts +0 -446
- package/apps/dashboard/app/api/claude/[workItemId]/pin/route.ts +0 -24
- package/apps/dashboard/app/api/claude/[workItemId]/route.ts +0 -280
- package/apps/dashboard/app/api/claude/sessions/[sessionId]/content/route.ts +0 -52
- package/apps/dashboard/app/api/claude/sessions/[sessionId]/message/route.ts +0 -525
- package/apps/dashboard/app/api/claude/sessions/[sessionId]/pin/route.ts +0 -24
- package/apps/dashboard/app/api/claude/sessions/cleanup/route.ts +0 -34
- package/apps/dashboard/app/api/claude/sessions/route.ts +0 -184
- package/apps/dashboard/app/api/decisions/[id]/route.ts +0 -25
- package/apps/dashboard/app/api/internal/set-project/route.ts +0 -17
- package/apps/dashboard/app/api/kanban/route.ts +0 -15
- package/apps/dashboard/app/api/settings/env-vars/route.ts +0 -125
- package/apps/dashboard/app/api/settings/general/route.ts +0 -21
- package/apps/dashboard/app/api/tests/route.ts +0 -9
- package/apps/dashboard/app/api/tests/run/route.ts +0 -82
- package/apps/dashboard/app/api/tests/run/stream/route.ts +0 -71
- package/apps/dashboard/app/api/tests/undefined/route.ts +0 -9
- package/apps/dashboard/app/api/usage/route.ts +0 -17
- package/apps/dashboard/app/api/work/[id]/description/route.ts +0 -21
- package/apps/dashboard/app/api/work/[id]/epic/route.ts +0 -21
- package/apps/dashboard/app/api/work/[id]/order/route.ts +0 -21
- package/apps/dashboard/app/api/work/[id]/route.ts +0 -35
- package/apps/dashboard/app/api/work/[id]/status/route.ts +0 -63
- package/apps/dashboard/app/api/work/[id]/title/route.ts +0 -21
- package/apps/dashboard/app/layout.tsx +0 -55
- package/apps/dashboard/components/UpgradeBanner.tsx +0 -30
- package/apps/dashboard/electron/ipc-handlers.js +0 -1026
- package/apps/dashboard/electron/main.js +0 -2306
- package/apps/dashboard/electron/preload.js +0 -125
- package/apps/dashboard/electron/session-manager.js +0 -163
- package/apps/dashboard/electron-builder.config.js +0 -357
- package/apps/dashboard/hooks/useClaudeSessions.ts +0 -299
- package/apps/dashboard/lib/backlog-parser.ts +0 -50
- package/apps/dashboard/lib/claude-process-manager.ts +0 -529
- package/apps/dashboard/lib/db-bridge.ts +0 -283
- package/apps/dashboard/lib/prototypes.ts +0 -202
- package/apps/dashboard/lib/test-results-db.ts +0 -307
- package/apps/dashboard/lib/tests.ts +0 -282
- package/apps/dashboard/next.config.js +0 -66
- package/apps/dashboard/postcss.config.mjs +0 -7
- package/apps/dashboard/public/bug-icon.svg +0 -9
- package/apps/dashboard/public/buoy-icon.svg +0 -9
- package/apps/dashboard/public/file.svg +0 -1
- package/apps/dashboard/public/globe.svg +0 -1
- package/apps/dashboard/public/in-flight-seagull.svg +0 -9
- package/apps/dashboard/public/next.svg +0 -1
- package/apps/dashboard/public/pier-icon.svg +0 -14
- package/apps/dashboard/public/star-icon.svg +0 -9
- package/apps/dashboard/public/vercel.svg +0 -1
- package/apps/dashboard/public/window.svg +0 -1
- package/apps/dashboard/public/wrench-icon.svg +0 -9
- package/apps/dashboard/scripts/download-node.js +0 -104
- package/apps/dashboard/scripts/upload-to-r2.js +0 -89
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
# Design System Selection Skill
|
|
2
|
+
|
|
3
|
+
Walks users through discovering, configuring, and documenting their project's design system. Produces a standardized Brand Kit page.
|
|
4
|
+
|
|
5
|
+
## When to Use
|
|
6
|
+
|
|
7
|
+
Invoke when the user says things like:
|
|
8
|
+
- "set up my design system"
|
|
9
|
+
- "configure design system"
|
|
10
|
+
- "help me with my brand kit"
|
|
11
|
+
- "add my design tokens"
|
|
12
|
+
|
|
13
|
+
## Instructions
|
|
14
|
+
|
|
15
|
+
### Opening
|
|
16
|
+
|
|
17
|
+
Start the conversation with enthusiasm. Design systems are the foundation of a polished product — they deserve excitement. Open with something like:
|
|
18
|
+
|
|
19
|
+
> Design systems are one of the highest-leverage things you can set up. Once Claude knows your colors, typography, spacing, and component patterns, every piece of UI it builds will feel like *your* product — not a generic template.
|
|
20
|
+
>
|
|
21
|
+
> I'm going to walk you through a few decisions, scan your project for what you already have, and we'll leave with two things:
|
|
22
|
+
>
|
|
23
|
+
> 1. **Your design system directory configured** — so Claude always has your tokens as context
|
|
24
|
+
> 2. **A Brand Kit page** — a living reference you (and Claude) can always check
|
|
25
|
+
>
|
|
26
|
+
> Here's what a finished Brand Kit looks like: `app/design-system/page.tsx` in this project.
|
|
27
|
+
>
|
|
28
|
+
> Let's start.
|
|
29
|
+
|
|
30
|
+
**Then proceed to Step 1.**
|
|
31
|
+
|
|
32
|
+
### Step 1: Scan for What Exists
|
|
33
|
+
|
|
34
|
+
Before asking questions, scan the project to understand what's already in place. Run these in parallel:
|
|
35
|
+
|
|
36
|
+
**Directory search:**
|
|
37
|
+
```bash
|
|
38
|
+
find . -maxdepth 3 -type d \( -name "design-system" -o -name "design-tokens" -o -name "tokens" -o -name "theme" -o -name "styles" -o -name "ui-kit" -o -name "foundations" -o -name "primitives" \) -not -path "*/node_modules/*" -not -path "*/.git/*" 2>/dev/null
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**File pattern search** (use Glob tool):
|
|
42
|
+
- `**/tokens.{css,scss,json,ts,js}`
|
|
43
|
+
- `**/theme.{css,scss,json,ts,js}`
|
|
44
|
+
- `**/variables.{css,scss}`
|
|
45
|
+
- `**/_variables.scss`
|
|
46
|
+
- `**/design-tokens/**`
|
|
47
|
+
- `**/globals.css`
|
|
48
|
+
- `**/tailwind.config.*`
|
|
49
|
+
|
|
50
|
+
**Content signals** (use Grep tool):
|
|
51
|
+
- CSS custom properties: `--color-`, `--spacing-`, `--font-`
|
|
52
|
+
- Tailwind theme config: `colors:`, `spacing:`, `fontFamily:`
|
|
53
|
+
- Design token patterns: `$color-`, `$spacing-`
|
|
54
|
+
|
|
55
|
+
**Present what you found:**
|
|
56
|
+
|
|
57
|
+
If tokens/theme files exist:
|
|
58
|
+
> I found some existing design assets. Here's what I see:
|
|
59
|
+
> - [list files with brief content summary]
|
|
60
|
+
>
|
|
61
|
+
> Let me ask you a few questions to fill in the gaps.
|
|
62
|
+
|
|
63
|
+
If nothing found:
|
|
64
|
+
> Starting fresh — that's fine. Let me walk you through the key decisions.
|
|
65
|
+
|
|
66
|
+
### Step 2: Walk Through Decisions
|
|
67
|
+
|
|
68
|
+
Guide the user through each design system category. For each, present a focused question. Don't overwhelm — one topic at a time.
|
|
69
|
+
|
|
70
|
+
**2a. Brand Palette**
|
|
71
|
+
|
|
72
|
+
> **Colors first.** Every brand needs at minimum:
|
|
73
|
+
> - **Primary** — your main action color (buttons, links, active states)
|
|
74
|
+
> - **Accent** — warm emphasis (CTAs, highlights, banners)
|
|
75
|
+
> - **Neutral black** — text, borders, outlined buttons
|
|
76
|
+
>
|
|
77
|
+
> Do you have brand colors already? Paste hex codes, a brand guide link, or describe the vibe you want (e.g., "calm and professional", "bold and energetic").
|
|
78
|
+
|
|
79
|
+
**WAIT for user response.**
|
|
80
|
+
|
|
81
|
+
For each color, derive three shades:
|
|
82
|
+
- **Solid** — the main color (buttons, fills)
|
|
83
|
+
- **Tint** — light background version (badges, callouts) — mix ~85% white
|
|
84
|
+
- **Text** — darker version for text on the tint — darken ~30%
|
|
85
|
+
|
|
86
|
+
**2b. Typography**
|
|
87
|
+
|
|
88
|
+
> **Typography.** What font does your project use? Check your CSS/config, or tell me what you'd like.
|
|
89
|
+
>
|
|
90
|
+
> I also need to know your heading style preference — tight tracking (modern/bold) or normal tracking (classic/readable)?
|
|
91
|
+
|
|
92
|
+
**WAIT for user response.**
|
|
93
|
+
|
|
94
|
+
**2c. Surface & Elevation**
|
|
95
|
+
|
|
96
|
+
> **Surfaces.** Two quick decisions:
|
|
97
|
+
> 1. **Background warmth** — Pure white canvas, or slightly warm (cream/gray tint)?
|
|
98
|
+
> 2. **Cards** — Separated by borders, or by shadow + background contrast (no borders)?
|
|
99
|
+
|
|
100
|
+
**WAIT for user response.**
|
|
101
|
+
|
|
102
|
+
**2d. Border Philosophy**
|
|
103
|
+
|
|
104
|
+
> **Borders.** I recommend the binary approach: thick borders (2px) on interactive elements (inputs, outlined buttons), and NO borders on containers (use shadow + background contrast instead). Sound good, or do you prefer a different approach?
|
|
105
|
+
|
|
106
|
+
**WAIT for user response.**
|
|
107
|
+
|
|
108
|
+
**2e. Spacing & Radius**
|
|
109
|
+
|
|
110
|
+
> **Last two quick ones:**
|
|
111
|
+
> - **Border radius** — Rounded (16px cards, 12px buttons) or sharp (4-8px everywhere)?
|
|
112
|
+
> - **Spacing** — Generous (lots of breathing room) or compact (dense, information-heavy)?
|
|
113
|
+
|
|
114
|
+
**WAIT for user response.**
|
|
115
|
+
|
|
116
|
+
### Step 3: Configure the Design System Directory
|
|
117
|
+
|
|
118
|
+
Based on the scan results from Step 1, identify or create the design system directory.
|
|
119
|
+
|
|
120
|
+
**If a clear candidate exists:**
|
|
121
|
+
> I'll configure `[path]` as your design system directory.
|
|
122
|
+
|
|
123
|
+
**If no directory exists, create one:**
|
|
124
|
+
> I'll create a `design-system/` directory with your tokens.
|
|
125
|
+
|
|
126
|
+
Write a CSS tokens file with all the decisions from Step 2:
|
|
127
|
+
|
|
128
|
+
```css
|
|
129
|
+
/* design-system/tokens.css */
|
|
130
|
+
:root {
|
|
131
|
+
/* Brand Palette - Primary */
|
|
132
|
+
--color-primary: [solid];
|
|
133
|
+
--color-primary-tint: [tint];
|
|
134
|
+
--color-primary-text: [text-on-tint];
|
|
135
|
+
|
|
136
|
+
/* Brand Palette - Accent */
|
|
137
|
+
--color-accent: [solid];
|
|
138
|
+
--color-accent-tint: [tint];
|
|
139
|
+
--color-accent-text: [text-on-tint];
|
|
140
|
+
|
|
141
|
+
/* Brand Palette - Neutral */
|
|
142
|
+
--color-black: [black];
|
|
143
|
+
|
|
144
|
+
/* Surfaces */
|
|
145
|
+
--color-background: [background];
|
|
146
|
+
--color-card: [card];
|
|
147
|
+
|
|
148
|
+
/* Typography */
|
|
149
|
+
--font-sans: [font];
|
|
150
|
+
--font-mono: [mono font];
|
|
151
|
+
|
|
152
|
+
/* Spacing */
|
|
153
|
+
--space-xs: [value];
|
|
154
|
+
--space-sm: [value];
|
|
155
|
+
--space-md: [value];
|
|
156
|
+
--space-lg: [value];
|
|
157
|
+
--space-xl: [value];
|
|
158
|
+
|
|
159
|
+
/* Radius */
|
|
160
|
+
--radius-sm: [value];
|
|
161
|
+
--radius-md: [value];
|
|
162
|
+
--radius-lg: [value];
|
|
163
|
+
|
|
164
|
+
/* Shadows */
|
|
165
|
+
--shadow-sm: [value];
|
|
166
|
+
--shadow-md: [value];
|
|
167
|
+
--shadow-lg: [value];
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Then configure it:
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
node -e "
|
|
175
|
+
const fs = require('fs');
|
|
176
|
+
const path = require('path');
|
|
177
|
+
const dir = path.resolve('<selected-directory>');
|
|
178
|
+
const configPath = '.jettypod/config.json';
|
|
179
|
+
const config = fs.existsSync(configPath) ? JSON.parse(fs.readFileSync(configPath, 'utf-8')) : {};
|
|
180
|
+
config.designSystemDir = dir;
|
|
181
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
182
|
+
console.log('Set designSystemDir to:', dir);
|
|
183
|
+
"
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
Regenerate CLAUDE.md:
|
|
187
|
+
```bash
|
|
188
|
+
jettypod claude generate
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Verify:
|
|
192
|
+
```bash
|
|
193
|
+
grep -c "design_system" CLAUDE.md
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### Step 4: Generate the Brand Kit Page
|
|
197
|
+
|
|
198
|
+
**This is the key deliverable.** Create a standardized Brand Kit page that serves as a living reference.
|
|
199
|
+
|
|
200
|
+
The page MUST follow this exact structure (same sections, same order, every time):
|
|
201
|
+
|
|
202
|
+
```
|
|
203
|
+
app/design-system/page.tsx
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
**Required sections (in order):**
|
|
207
|
+
|
|
208
|
+
| # | Section | What it shows |
|
|
209
|
+
|---|---------|---------------|
|
|
210
|
+
| 0 | Border Philosophy | Binary borders rule — thick on interactive, none on containers |
|
|
211
|
+
| 1 | Brand Palette | Each color with solid/tint/text swatches + in-context badges |
|
|
212
|
+
| 2 | Surface Hierarchy | Background → card → content layering with actual nesting demo |
|
|
213
|
+
| 3 | Elevation Scale | Shadow levels (sm/md/lg/overlay) with visual boxes |
|
|
214
|
+
| 4 | Typography | Full type scale from display (4xl) to caption (xs) |
|
|
215
|
+
| 5 | Motion & Easing | Duration, easing, and live hover demos |
|
|
216
|
+
| 6 | Border Radius | Visual comparison of radius tiers |
|
|
217
|
+
| 7 | Button Variants | All variants × all sizes, including loading states |
|
|
218
|
+
| 8 | Hover/Active/Disabled | Interactive state demos |
|
|
219
|
+
| 9 | Input Focus States | Resting vs focused with live interaction |
|
|
220
|
+
| 10 | Focus Rings | Tab-accessible focus-visible demos |
|
|
221
|
+
| 11 | Loading States | Skeletons and spinners |
|
|
222
|
+
| 12 | Toast Patterns | Success, error, info, warning static examples |
|
|
223
|
+
| 13 | Composition Examples | Cards with actions, forms, banners — how pieces fit together |
|
|
224
|
+
| 14 | Design Decisions | Resolved decisions (with DECIDED labels) and open questions |
|
|
225
|
+
|
|
226
|
+
**Each section uses:**
|
|
227
|
+
- `<Section title="N. Section Name" description="One-line explanation">` wrapper
|
|
228
|
+
- `<Card>` container with shadow (no borders)
|
|
229
|
+
- Monospace labels (`text-xs font-mono text-zinc-400`) for technical annotations
|
|
230
|
+
- Live interactive demos where applicable (hover, focus, click)
|
|
231
|
+
|
|
232
|
+
**Page infrastructure:**
|
|
233
|
+
- Dark mode toggle in header
|
|
234
|
+
- `max-w-5xl mx-auto` content width
|
|
235
|
+
- `space-y-20` between sections
|
|
236
|
+
- Helper components: `Section`, `ColorSwatch`, `Card`
|
|
237
|
+
|
|
238
|
+
**The page should use the user's actual tokens from Step 2** — not placeholder values. Every color swatch, button, and example should reflect their real brand.
|
|
239
|
+
|
|
240
|
+
Present the generated page to the user:
|
|
241
|
+
|
|
242
|
+
> Here's your Brand Kit page. It's a living reference — you and Claude can always check `app/design-system/page.tsx` to see your design system in action.
|
|
243
|
+
>
|
|
244
|
+
> Every section is interactive: hover the cards, click the inputs, tab through the buttons.
|
|
245
|
+
|
|
246
|
+
### Step 5: Wrap Up
|
|
247
|
+
|
|
248
|
+
Summarize what was accomplished:
|
|
249
|
+
|
|
250
|
+
> **Done! Here's what we set up:**
|
|
251
|
+
>
|
|
252
|
+
> 1. **Design system directory** — `[path]` configured in `.jettypod/config.json`
|
|
253
|
+
> 2. **CLAUDE.md updated** — Claude now sees your design tokens as context in every conversation
|
|
254
|
+
> 3. **Brand Kit page** — `app/design-system/page.tsx` is your living reference
|
|
255
|
+
>
|
|
256
|
+
> From now on, when Claude builds UI for you, it'll use your exact colors, typography, spacing, and component patterns. No more generic-looking output.
|
|
257
|
+
|
|
258
|
+
## Clearing
|
|
259
|
+
|
|
260
|
+
If user wants to remove the design system:
|
|
261
|
+
|
|
262
|
+
```bash
|
|
263
|
+
node -e "
|
|
264
|
+
const fs = require('fs');
|
|
265
|
+
const configPath = '.jettypod/config.json';
|
|
266
|
+
const config = fs.existsSync(configPath) ? JSON.parse(fs.readFileSync(configPath, 'utf-8')) : {};
|
|
267
|
+
delete config.designSystemDir;
|
|
268
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
269
|
+
console.log('Removed designSystemDir');
|
|
270
|
+
"
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
Then: `jettypod claude generate`
|
|
@@ -221,6 +221,14 @@ Based on [epic name], here are the features I recommend:
|
|
|
221
221
|
**Feature 3: [Name]** - [Brief description]
|
|
222
222
|
...
|
|
223
223
|
|
|
224
|
+
**UX Completeness Check:**
|
|
225
|
+
For each feature above, I've considered:
|
|
226
|
+
- How users discover/reach it (entry point)
|
|
227
|
+
- What they see while waiting (loading states)
|
|
228
|
+
- What they see when there's no data (empty states)
|
|
229
|
+
- What feedback they get after actions (success/error)
|
|
230
|
+
- How screens transition between states
|
|
231
|
+
|
|
224
232
|
**Questions:**
|
|
225
233
|
- [Any clarifying questions about scope]
|
|
226
234
|
- [Missing features to consider]
|
|
@@ -335,6 +343,12 @@ This creates a worktree at `.jettypod-work/prototype-<id>-<slug>-<approach>/` wh
|
|
|
335
343
|
|
|
336
344
|
**Sub-step 2: Build prototypes in the worktree**
|
|
337
345
|
|
|
346
|
+
**Design system check:** Before building, check if a design system directory is configured:
|
|
347
|
+
```bash
|
|
348
|
+
node -e "const c=JSON.parse(require('fs').readFileSync('.jettypod/config.json','utf-8')); c.designSystemDir && console.log(c.designSystemDir)"
|
|
349
|
+
```
|
|
350
|
+
If a path is returned, read the files in that directory and apply the project's design tokens (colors, typography, spacing, border radii, component patterns) to all prototypes.
|
|
351
|
+
|
|
338
352
|
1. Build prototypes using **absolute paths** to the worktree:
|
|
339
353
|
- `<worktree_path>/prototypes/epic-${EPIC_ID}-${APPROACH_NAME}/`
|
|
340
354
|
2. Build 2-3 working prototypes demonstrating the architectural difference
|
|
@@ -169,6 +169,12 @@ This creates a worktree at `.jettypod-work/prototype-<id>-<slug>-<approach>/` wh
|
|
|
169
169
|
|
|
170
170
|
**Sub-step 2: Build prototypes in the worktree**
|
|
171
171
|
|
|
172
|
+
**Design system check:** Before building, check if a design system directory is configured:
|
|
173
|
+
```bash
|
|
174
|
+
node -e "const c=JSON.parse(require('fs').readFileSync('.jettypod/config.json','utf-8')); c.designSystemDir && console.log(c.designSystemDir)"
|
|
175
|
+
```
|
|
176
|
+
If a path is returned, read the files in that directory and apply the project's design tokens (colors, typography, spacing, border radii, component patterns) to all prototypes. Prototypes should look like they belong to the product, not use generic browser defaults.
|
|
177
|
+
|
|
172
178
|
1. **Build prototypes** using **absolute paths** to the worktree:
|
|
173
179
|
- `<worktree_path>/prototypes/feature-[id]-[approach-name]/`
|
|
174
180
|
2. **Name format**: `YYYY-MM-DD-[feature-slug]-[option].ext`
|
|
@@ -247,6 +253,59 @@ User picks winner. Note their choice - you'll record it formally in Step 11 when
|
|
|
247
253
|
jettypod workflow checkpoint <feature-id> --step=5
|
|
248
254
|
```
|
|
249
255
|
|
|
256
|
+
**Proceed to Step 5B.**
|
|
257
|
+
|
|
258
|
+
### Step 5B: UX States Inventory
|
|
259
|
+
|
|
260
|
+
**CRITICAL:** Before defining scenarios, enumerate every UI state the feature will need. Features fail QA when states like loading, empty, and transition are left unspecified — Claude implements the literal happy path and skips everything else.
|
|
261
|
+
|
|
262
|
+
**For each screen/view/component the chosen approach touches, list:**
|
|
263
|
+
|
|
264
|
+
```
|
|
265
|
+
UX States Inventory
|
|
266
|
+
|
|
267
|
+
**[Screen/View/Component 1: e.g., Login Form]**
|
|
268
|
+
| State | What the user sees |
|
|
269
|
+
|-------|-------------------|
|
|
270
|
+
| Default | [Initial state when user arrives] |
|
|
271
|
+
| Loading | [What shows during async operations — spinner, skeleton, disabled button, etc.] |
|
|
272
|
+
| Success | [Feedback after successful action — toast, redirect, animation, message] |
|
|
273
|
+
| Empty | [What shows when there's no data — illustration, CTA, placeholder text] |
|
|
274
|
+
| Partial | [What shows when some data is loaded but not all — progressive loading] |
|
|
275
|
+
|
|
276
|
+
**[Screen/View/Component 2: e.g., Dashboard after login]**
|
|
277
|
+
| State | What the user sees |
|
|
278
|
+
|-------|-------------------|
|
|
279
|
+
| Default | [...] |
|
|
280
|
+
| Loading | [...] |
|
|
281
|
+
| ... | ... |
|
|
282
|
+
|
|
283
|
+
**Micro-interactions:**
|
|
284
|
+
- [Button click] → [immediate visual feedback: disable + spinner? ripple? color change?]
|
|
285
|
+
- [Form submission] → [what happens between click and response?]
|
|
286
|
+
- [Data appears] → [instant swap? fade in? skeleton → content?]
|
|
287
|
+
- [Navigation] → [instant page swap? transition animation?]
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
**What to inventory (checklist):**
|
|
291
|
+
- [ ] Every screen/view the feature adds or modifies
|
|
292
|
+
- [ ] Loading states for every async operation (API calls, file uploads, data fetches)
|
|
293
|
+
- [ ] Success feedback for every user action (toasts, redirects, inline messages)
|
|
294
|
+
- [ ] Empty states where data might not exist yet
|
|
295
|
+
- [ ] Transition animations between states
|
|
296
|
+
- [ ] Button/input states (default, hover, active, disabled, loading)
|
|
297
|
+
- [ ] What happens between user action and system response (micro-interactions)
|
|
298
|
+
|
|
299
|
+
**Display the inventory to user and ask:**
|
|
300
|
+
|
|
301
|
+
```
|
|
302
|
+
Does this cover all the states? Anything missing for how this should feel?
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
**WAIT for user confirmation or additions.**
|
|
306
|
+
|
|
307
|
+
Store the confirmed UX States Inventory — it feeds into BDD scenarios (Step 8) and chore UX acceptance criteria (Step 10).
|
|
308
|
+
|
|
250
309
|
**Proceed to Step 6.**
|
|
251
310
|
|
|
252
311
|
### Step 6: Define Integration Contract
|
|
@@ -435,6 +494,11 @@ Does this capture the feature correctly? Any scenarios to add/change?
|
|
|
435
494
|
- NO error handling scenarios (added in stable mode)
|
|
436
495
|
- NO validation failures (added in stable mode)
|
|
437
496
|
- NO security/compliance scenarios (added in production mode)
|
|
497
|
+
- **Incorporate UX states from Step 5B** into scenario Then/And steps:
|
|
498
|
+
- Loading indicators: "And I see a loading indicator while [action] completes"
|
|
499
|
+
- Success feedback: "And I see a success confirmation"
|
|
500
|
+
- Empty states: "Then I see an empty state with [description]"
|
|
501
|
+
- Transitions: "And the [content] appears with [transition description]"
|
|
438
502
|
|
|
439
503
|
**WAIT for user confirmation.**
|
|
440
504
|
|
|
@@ -702,6 +766,11 @@ Based on the scenario and my understanding of the codebase, here are the chores
|
|
|
702
766
|
• Files to create/modify: [specific paths]
|
|
703
767
|
• Patterns to follow: [reference existing similar code]
|
|
704
768
|
• Key functions/components needed: [list]
|
|
769
|
+
- UX acceptance criteria (from Step 5B):
|
|
770
|
+
• [Loading state: what shows during async operations in this chore's scope]
|
|
771
|
+
• [Success feedback: what the user sees after the action completes]
|
|
772
|
+
• [Empty state: what shows when there's no data, if applicable]
|
|
773
|
+
• [Micro-interactions: button states, transitions, visual feedback]
|
|
705
774
|
- Verification:
|
|
706
775
|
• [Which step definitions should pass]
|
|
707
776
|
|
|
@@ -760,7 +829,7 @@ jettypod work create --from=/tmp/jettypod-create.json
|
|
|
760
829
|
|
|
761
830
|
Replace `${FEATURE_ID}` with actual ID. Example: Write `{"type":"chore","title":"Set up auth routes","description":"Create login/logout endpoints...","parent":42}` to `/tmp/jettypod-create.json`, then run `jettypod work create --from=/tmp/jettypod-create.json`.
|
|
762
831
|
|
|
763
|
-
**CRITICAL: Copy the EXACT proposal from Step 10 into each chore description.** Do not paraphrase or summarize - the implementation guidance must be preserved verbatim:
|
|
832
|
+
**CRITICAL: Copy the EXACT proposal from Step 10 into each chore description.** Do not paraphrase or summarize - the implementation guidance AND UX acceptance criteria must be preserved verbatim:
|
|
764
833
|
|
|
765
834
|
```
|
|
766
835
|
[Technical description from Step 10]
|
|
@@ -773,6 +842,9 @@ Implementation guidance:
|
|
|
773
842
|
• Patterns to follow: [EXACT references from Step 10]
|
|
774
843
|
• Key functions/components needed: [EXACT list from Step 10]
|
|
775
844
|
|
|
845
|
+
UX acceptance criteria:
|
|
846
|
+
• [EXACT UX criteria from Step 10 — loading states, success feedback, empty states, micro-interactions]
|
|
847
|
+
|
|
776
848
|
Verification:
|
|
777
849
|
• [EXACT step definitions from Step 10]
|
|
778
850
|
```
|
|
@@ -827,6 +899,8 @@ The BDD files were written in Step 9. Now merge them to main.
|
|
|
827
899
|
jettypod work tests merge ${FEATURE_ID}
|
|
828
900
|
```
|
|
829
901
|
|
|
902
|
+
**If merge fails with `Uncommitted changes detected`:** `git stash` from main repo CWD → create a work item for the stashed changes → `jettypod work start <id>` → `git stash pop` in that worktree → commit → merge → cleanup → then retry your original merge.
|
|
903
|
+
|
|
830
904
|
```bash
|
|
831
905
|
# Step 2: cd to main repo
|
|
832
906
|
cd <main-repo-path>
|
|
@@ -968,6 +1042,20 @@ If you skip `work start` or proceed when worktree creation failed, the merge wor
|
|
|
968
1042
|
|
|
969
1043
|
**User picks:** Option 1 (Simple inline form)
|
|
970
1044
|
|
|
1045
|
+
**UX States Inventory:**
|
|
1046
|
+
|
|
1047
|
+
| State | Login Form | Dashboard (after login) |
|
|
1048
|
+
|-------|-----------|----------------------|
|
|
1049
|
+
| Default | Email + password fields, "Sign In" button | N/A (redirected here) |
|
|
1050
|
+
| Loading | Button shows spinner, fields disabled | Skeleton cards for activity |
|
|
1051
|
+
| Success | Brief checkmark animation, then redirect | Full dashboard with welcome toast |
|
|
1052
|
+
| Empty | N/A | "No recent activity" with illustration |
|
|
1053
|
+
|
|
1054
|
+
**Micro-interactions:**
|
|
1055
|
+
- Sign In click → button disabled + spinner → redirect on success
|
|
1056
|
+
- "Remember me" checkbox → toggle animation
|
|
1057
|
+
- Page transition → fade/slide to dashboard
|
|
1058
|
+
|
|
971
1059
|
**Scenarios generated (speed mode - all success paths):**
|
|
972
1060
|
```gherkin
|
|
973
1061
|
Feature: Email/Password Login
|
|
@@ -1002,6 +1090,7 @@ Before completing feature planning, ensure:
|
|
|
1002
1090
|
- [ ] Epic's architectural decision is shown (if exists)
|
|
1003
1091
|
- [ ] Exactly 3 approaches suggested
|
|
1004
1092
|
- [ ] Winner chosen (with prototypes or without)
|
|
1093
|
+
- [ ] **UX States Inventory completed** (all screens/states/micro-interactions enumerated, confirmed by user)
|
|
1005
1094
|
- [ ] **Integration Contract defined** (entry point, caller code, integration scenario)
|
|
1006
1095
|
- [ ] **Test worktree created** with `work tests start` (Step 7)
|
|
1007
1096
|
- [ ] **Integration Scenario is FIRST scenario** in proposed scenarios
|
|
@@ -444,6 +444,26 @@ Once all production chores complete:
|
|
|
444
444
|
2. Can be deployed to external environment
|
|
445
445
|
3. Meets all standards for scale, security, compliance
|
|
446
446
|
|
|
447
|
+
**Prove It Works (REQUIRED):**
|
|
448
|
+
|
|
449
|
+
Before completing the feature, demonstrate it works in practice — not just that tests pass.
|
|
450
|
+
|
|
451
|
+
1. **Run or build the actual code** — compile, start the server, execute the command, or trigger the relevant workflow
|
|
452
|
+
2. **Show real output** — display console output, build result, or observable behavior
|
|
453
|
+
3. **Confirm it matches expectations** — verify the output is what was requested
|
|
454
|
+
|
|
455
|
+
**Display:**
|
|
456
|
+
|
|
457
|
+
```
|
|
458
|
+
Verifying in practice...
|
|
459
|
+
|
|
460
|
+
[Actual output from running/building the code]
|
|
461
|
+
|
|
462
|
+
Verified: [what was confirmed]
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
**If the change cannot be run directly** (requires hardware, external service, or manual UI interaction), state what the user should verify manually and why you can't verify it yourself.
|
|
466
|
+
|
|
447
467
|
**WORKFLOW INTEGRATION: Complete workflow**
|
|
448
468
|
|
|
449
469
|
When all production chores are complete:
|
|
@@ -281,6 +281,26 @@ Verifying...
|
|
|
281
281
|
|
|
282
282
|
**If verification passes:**
|
|
283
283
|
|
|
284
|
+
**Prove It Works (REQUIRED):**
|
|
285
|
+
|
|
286
|
+
Before committing, demonstrate the change works in practice.
|
|
287
|
+
|
|
288
|
+
1. **Run or build the actual code** — compile, start the server, execute the command, or trigger the relevant workflow
|
|
289
|
+
2. **Show real output** — display console output, build result, or observable behavior
|
|
290
|
+
3. **Confirm it matches expectations** — verify the output is what was requested
|
|
291
|
+
|
|
292
|
+
**Display:**
|
|
293
|
+
|
|
294
|
+
```
|
|
295
|
+
Verifying in practice...
|
|
296
|
+
|
|
297
|
+
[Actual output from running/building the code]
|
|
298
|
+
|
|
299
|
+
Verified: [what was confirmed]
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
**If the change cannot be run directly** (requires hardware, external service, or manual UI interaction), state what the user should verify manually and why you can't verify it yourself.
|
|
303
|
+
|
|
284
304
|
**WORKTREE PATH REQUIRED:** Use the `WORKTREE_PATH` captured in Step 3.
|
|
285
305
|
|
|
286
306
|
```bash
|
|
@@ -309,9 +329,11 @@ jettypod work merge <chore-id>
|
|
|
309
329
|
jettypod work cleanup <chore-id>
|
|
310
330
|
```
|
|
311
331
|
|
|
312
|
-
**If merge fails
|
|
332
|
+
**If merge fails with `Uncommitted changes detected`:** `git stash` from main repo CWD → create a work item for the stashed changes → `jettypod work start <id>` → `git stash pop` in that worktree → commit → merge → cleanup → then retry your original merge.
|
|
333
|
+
|
|
334
|
+
**If merge fails with merge conflicts:**
|
|
313
335
|
|
|
314
|
-
When `jettypod work merge` encounters
|
|
336
|
+
When `jettypod work merge` encounters a merge conflict, the worktree is preserved for debugging.
|
|
315
337
|
|
|
316
338
|
```
|
|
317
339
|
Merge failed: [error message from git]
|
|
@@ -340,6 +362,21 @@ Do NOT attempt to auto-resolve conflicts - let the user handle them manually.
|
|
|
340
362
|
**The merge command automatically sets the feature as ready for review.**
|
|
341
363
|
It will appear with accept/reject buttons on the kanban board. Do NOT call `jettypod work status <feature-id> done` — that bypasses the review gate.
|
|
342
364
|
|
|
365
|
+
**Generate QA checklist:**
|
|
366
|
+
|
|
367
|
+
Based on the change you just made, generate specific QA steps a tester can verify manually. Write a JSON array to `/tmp/qa-steps.json`:
|
|
368
|
+
```json
|
|
369
|
+
[
|
|
370
|
+
{"section": "Section Name", "text": "Action to perform and expected result", "detail": "Additional context"},
|
|
371
|
+
...
|
|
372
|
+
]
|
|
373
|
+
```
|
|
374
|
+
Be specific (e.g., "Click the Save button — confirmation toast appears") not generic. 3-8 steps for simple improvements.
|
|
375
|
+
|
|
376
|
+
```bash
|
|
377
|
+
jettypod work set-qa-steps <chore-id> --from=/tmp/qa-steps.json
|
|
378
|
+
```
|
|
379
|
+
|
|
343
380
|
**Emit gate signal:**
|
|
344
381
|
|
|
345
382
|
```bash
|
|
@@ -350,9 +350,10 @@ sqlite3 .jettypod/work.db "SELECT wi.id, wi.title, wi.description, wi.parent_id,
|
|
|
350
350
|
**Check for breadcrumbs** by examining the chore's description for:
|
|
351
351
|
- "Scenario steps addressed:"
|
|
352
352
|
- "Implementation guidance:"
|
|
353
|
+
- "UX acceptance criteria:" (loading states, success feedback, empty states, micro-interactions)
|
|
353
354
|
- "Verification:"
|
|
354
355
|
|
|
355
|
-
If
|
|
356
|
+
If at least "Scenario steps addressed:", "Implementation guidance:", and "Verification:" exist, use them. "UX acceptance criteria:" is optional but MUST be implemented if present — these define the visual states and micro-interactions the user expects to see during QA.
|
|
356
357
|
|
|
357
358
|
**Then read the scenario file** using the Read tool on the path returned by `scenario_file`.
|
|
358
359
|
|
|
@@ -376,6 +377,9 @@ Scenario steps addressed:
|
|
|
376
377
|
Implementation guidance:
|
|
377
378
|
[Files, patterns, functions from breadcrumbs]
|
|
378
379
|
|
|
380
|
+
UX acceptance criteria:
|
|
381
|
+
[Loading states, success feedback, empty states, micro-interactions from breadcrumbs — if present]
|
|
382
|
+
|
|
379
383
|
Verification:
|
|
380
384
|
[Step definitions from breadcrumbs]
|
|
381
385
|
|
|
@@ -732,6 +736,8 @@ git add . && git commit -m "feat: [brief description of what was implemented]"
|
|
|
732
736
|
jettypod work merge [current-chore-id]
|
|
733
737
|
```
|
|
734
738
|
|
|
739
|
+
**If merge fails with `Uncommitted changes detected`:** `git stash` from main repo CWD → create a work item for the stashed changes → `jettypod work start <id>` → `git stash pop` in that worktree → commit → merge → cleanup → then retry your original merge.
|
|
740
|
+
|
|
735
741
|
```bash
|
|
736
742
|
# Step 2: cd to main repo
|
|
737
743
|
cd /path/to/main/repo
|
|
@@ -819,8 +825,8 @@ git add . && git commit -m "feat: [brief description of what was implemented]"
|
|
|
819
825
|
```
|
|
820
826
|
|
|
821
827
|
```bash
|
|
822
|
-
# Step 1: Merge
|
|
823
|
-
jettypod work merge [current-chore-id]
|
|
828
|
+
# Step 1: Merge (works from anywhere — ALWAYS include chore ID)
|
|
829
|
+
jettypod work merge [current-chore-id]
|
|
824
830
|
```
|
|
825
831
|
|
|
826
832
|
```bash
|
|
@@ -1036,16 +1042,6 @@ jettypod work create --from=/tmp/jettypod-create.json
|
|
|
1036
1042
|
|
|
1037
1043
|
Repeat for each confirmed chore. **Do NOT add a `mode` field** - chores inherit mode from their parent feature.
|
|
1038
1044
|
|
|
1039
|
-
**3. Release merge lock (CRITICAL: separate Bash calls):**
|
|
1040
|
-
|
|
1041
|
-
```bash
|
|
1042
|
-
cd <main-repo> # Bash call 1
|
|
1043
|
-
```
|
|
1044
|
-
|
|
1045
|
-
```bash
|
|
1046
|
-
jettypod work merge <last-chore-id> --release-lock # Bash call 2
|
|
1047
|
-
```
|
|
1048
|
-
|
|
1049
1045
|
**WORKFLOW COMPLETE: Speed mode finished**
|
|
1050
1046
|
|
|
1051
1047
|
Mark speed mode as complete (this passes the `speed_mode_complete` gate, enabling stable-mode):
|
|
@@ -1156,8 +1152,7 @@ cd <main-repo>
|
|
|
1156
1152
|
```bash
|
|
1157
1153
|
# Bash call 2: Merge (ALWAYS include chore ID)
|
|
1158
1154
|
jettypod work merge <chore-id> # Merge chore by ID
|
|
1159
|
-
jettypod work merge
|
|
1160
|
-
jettypod work merge <chore-id> --release-lock # Release held lock
|
|
1155
|
+
jettypod work merge --release-lock # Force-release stuck lock
|
|
1161
1156
|
```
|
|
1162
1157
|
|
|
1163
1158
|
**Start chores:**
|
|
@@ -687,6 +687,8 @@ git add . && git commit -m "feat: [brief description of error handling added]"
|
|
|
687
687
|
jettypod work merge [current-chore-id]
|
|
688
688
|
```
|
|
689
689
|
|
|
690
|
+
**If merge fails with `Uncommitted changes detected`:** `git stash` from main repo CWD → create a work item for the stashed changes → `jettypod work start <id>` → `git stash pop` in that worktree → commit → merge → cleanup → then retry your original merge.
|
|
691
|
+
|
|
690
692
|
```bash
|
|
691
693
|
# Step 2: cd to main repo
|
|
692
694
|
cd /path/to/main/repo
|
|
@@ -741,6 +743,31 @@ pwd && ls .jettypod # verify
|
|
|
741
743
|
jettypod work cleanup [current-chore-id]
|
|
742
744
|
```
|
|
743
745
|
|
|
746
|
+
**Then generate QA checklist for the parent feature:**
|
|
747
|
+
|
|
748
|
+
Read the BDD scenario file for the parent feature. Based on the scenarios and your knowledge of what was implemented, generate specific, human-actionable QA checklist steps. Each step should be something a QA tester can verify manually in the running app.
|
|
749
|
+
|
|
750
|
+
Write a JSON array to `/tmp/qa-steps.json`:
|
|
751
|
+
```json
|
|
752
|
+
[
|
|
753
|
+
{"section": "Section Name", "text": "Action to perform and expected result", "detail": "Additional context if needed"},
|
|
754
|
+
...
|
|
755
|
+
]
|
|
756
|
+
```
|
|
757
|
+
|
|
758
|
+
Guidelines for good QA steps:
|
|
759
|
+
- Be specific: "Open Settings, click Claude Code section" not "Navigate to the feature"
|
|
760
|
+
- Include expected outcomes: "dropdown shows Haiku as selected" not "model is selected"
|
|
761
|
+
- One verifiable action per step
|
|
762
|
+
- Group into sections (e.g., "Model Selection", "Persistence", "Error Handling")
|
|
763
|
+
- Cover happy paths AND edge cases from the BDD scenarios
|
|
764
|
+
- 5-15 steps total (not too few to be useless, not too many to be tedious)
|
|
765
|
+
|
|
766
|
+
Then store them:
|
|
767
|
+
```bash
|
|
768
|
+
jettypod work set-qa-steps [parent-feature-id] --from=/tmp/qa-steps.json
|
|
769
|
+
```
|
|
770
|
+
|
|
744
771
|
**Then check project state:**
|
|
745
772
|
|
|
746
773
|
```bash
|
|
@@ -753,6 +780,26 @@ sqlite3 .jettypod/work.db "SELECT project_state FROM project_config WHERE id = 1
|
|
|
753
780
|
|
|
754
781
|
**If project_state = 'internal':**
|
|
755
782
|
|
|
783
|
+
**Prove It Works (REQUIRED):**
|
|
784
|
+
|
|
785
|
+
Before marking the feature complete, demonstrate it works in practice — not just that tests pass.
|
|
786
|
+
|
|
787
|
+
1. **Run or build the actual code** — compile, start the server, execute the command, or trigger the relevant workflow
|
|
788
|
+
2. **Show real output** — display console output, build result, or observable behavior
|
|
789
|
+
3. **Confirm it matches expectations** — verify the output is what was requested
|
|
790
|
+
|
|
791
|
+
**Display:**
|
|
792
|
+
|
|
793
|
+
```
|
|
794
|
+
Verifying in practice...
|
|
795
|
+
|
|
796
|
+
[Actual output from running/building the code]
|
|
797
|
+
|
|
798
|
+
Verified: [what was confirmed]
|
|
799
|
+
```
|
|
800
|
+
|
|
801
|
+
**If the change cannot be run directly** (requires hardware, external service, or manual UI interaction), state what the user should verify manually and why you can't verify it yourself.
|
|
802
|
+
|
|
756
803
|
**The merge command automatically sets the feature as ready for review.**
|
|
757
804
|
It will appear with accept/reject buttons on the kanban board. Do NOT call `jettypod work status <feature-id> done` — that bypasses the review gate.
|
|
758
805
|
|