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.
Files changed (208) hide show
  1. package/.env +2 -1
  2. package/Cargo.lock +6450 -0
  3. package/Cargo.toml +35 -0
  4. package/README.md +5 -1
  5. package/TAURI-MIGRATION-PLAN.md +840 -0
  6. package/apps/dashboard/app/connect-claude/page.tsx +5 -6
  7. package/apps/dashboard/app/decision/[id]/page.tsx +54 -49
  8. package/apps/dashboard/app/demo/gates/page.tsx +3 -5
  9. package/apps/dashboard/app/design-system/page.tsx +1 -1
  10. package/apps/dashboard/app/globals.css +74 -2
  11. package/apps/dashboard/app/install-claude/page.tsx +3 -5
  12. package/apps/dashboard/app/login/page.tsx +17 -20
  13. package/apps/dashboard/app/page.tsx +101 -48
  14. package/apps/dashboard/app/settings/page.tsx +60 -12
  15. package/apps/dashboard/app/signup/page.tsx +14 -17
  16. package/apps/dashboard/app/subscribe/page.tsx +0 -2
  17. package/apps/dashboard/app/tests/page.tsx +37 -4
  18. package/apps/dashboard/app/welcome/page.tsx +12 -15
  19. package/apps/dashboard/app/work/[id]/page.tsx +90 -75
  20. package/apps/dashboard/app/work/[id]/proof/page.tsx +1489 -0
  21. package/apps/dashboard/components/AppShell.tsx +70 -61
  22. package/apps/dashboard/components/CardMenu.tsx +0 -1
  23. package/apps/dashboard/components/ClaudePanel.tsx +541 -283
  24. package/apps/dashboard/components/ClaudePanelInput.tsx +23 -4
  25. package/apps/dashboard/components/ConnectClaudeScreen.tsx +1 -5
  26. package/apps/dashboard/components/CopyableId.tsx +1 -2
  27. package/apps/dashboard/components/DetailReviewActions.tsx +11 -20
  28. package/apps/dashboard/components/DragContext.tsx +132 -62
  29. package/apps/dashboard/components/DraggableCard.tsx +3 -5
  30. package/apps/dashboard/components/DropZone.tsx +5 -6
  31. package/apps/dashboard/components/EditableDetailDescription.tsx +6 -12
  32. package/apps/dashboard/components/EditableDetailTitle.tsx +6 -13
  33. package/apps/dashboard/components/EditableTitle.tsx +0 -1
  34. package/apps/dashboard/components/ElapsedTimer.tsx +15 -3
  35. package/apps/dashboard/components/EpicGroup.tsx +100 -70
  36. package/apps/dashboard/components/GateCard.tsx +0 -1
  37. package/apps/dashboard/components/GateChoiceCard.tsx +1 -2
  38. package/apps/dashboard/components/InstallClaudeScreen.tsx +1 -5
  39. package/apps/dashboard/components/JettyLoader.tsx +0 -1
  40. package/apps/dashboard/components/KanbanBoard.tsx +319 -173
  41. package/apps/dashboard/components/KanbanCard.tsx +341 -107
  42. package/apps/dashboard/components/LazyCard.tsx +62 -0
  43. package/apps/dashboard/components/LazyMarkdown.tsx +0 -1
  44. package/apps/dashboard/components/MainNav.tsx +24 -25
  45. package/apps/dashboard/components/MessageBlock.tsx +93 -16
  46. package/apps/dashboard/components/ModeStartCard.tsx +0 -1
  47. package/apps/dashboard/components/OnboardingWelcome.tsx +0 -1
  48. package/apps/dashboard/components/PlaceholderCard.tsx +0 -1
  49. package/apps/dashboard/components/ProjectSwitcher.tsx +20 -20
  50. package/apps/dashboard/components/PrototypeTimeline.tsx +47 -26
  51. package/apps/dashboard/components/RealTimeKanbanWrapper.tsx +308 -223
  52. package/apps/dashboard/components/RealTimeTestsWrapper.tsx +303 -160
  53. package/apps/dashboard/components/ReviewFooter.tsx +12 -14
  54. package/apps/dashboard/components/SessionList.tsx +0 -1
  55. package/apps/dashboard/components/SubscribeContent.tsx +40 -11
  56. package/apps/dashboard/components/TestTree.tsx +1 -2
  57. package/apps/dashboard/components/TipCard.tsx +2 -4
  58. package/apps/dashboard/components/Toast.tsx +0 -1
  59. package/apps/dashboard/components/TypeIcon.tsx +7 -8
  60. package/apps/dashboard/components/ViewModeToolbar.tsx +104 -0
  61. package/apps/dashboard/components/WaveCompletionAnimation.tsx +5 -17
  62. package/apps/dashboard/components/WelcomeScreen.tsx +2 -6
  63. package/apps/dashboard/components/WorkItemHeader.tsx +0 -1
  64. package/apps/dashboard/components/WorkItemTree.tsx +2 -4
  65. package/apps/dashboard/components/settings/AccountSection.tsx +27 -13
  66. package/apps/dashboard/components/settings/AiContextSection.tsx +89 -0
  67. package/apps/dashboard/components/settings/ContextDocumentsSection.tsx +317 -0
  68. package/apps/dashboard/components/settings/EnvVarsSection.tsx +20 -73
  69. package/apps/dashboard/components/settings/GeneralSection.tsx +137 -26
  70. package/apps/dashboard/components/settings/ProjectStackSection.tsx +948 -0
  71. package/apps/dashboard/components/settings/SettingsLayout.tsx +0 -1
  72. package/apps/dashboard/components/ui/Button.tsx +1 -1
  73. package/apps/dashboard/components/ui/Input.tsx +1 -1
  74. package/apps/dashboard/components.json +1 -1
  75. package/apps/dashboard/contexts/ClaudeSessionContext.tsx +611 -358
  76. package/apps/dashboard/contexts/ConnectionStatusContext.tsx +0 -1
  77. package/apps/dashboard/contexts/UsageContext.tsx +62 -31
  78. package/apps/dashboard/dev.sh +35 -0
  79. package/apps/dashboard/eslint.config.mjs +9 -9
  80. package/apps/dashboard/hooks/useWebSocket.ts +138 -83
  81. package/apps/dashboard/index.html +73 -0
  82. package/apps/dashboard/lib/data-bridge.ts +722 -0
  83. package/apps/dashboard/lib/db.ts +69 -1302
  84. package/apps/dashboard/lib/environment-config.ts +173 -0
  85. package/apps/dashboard/lib/environment-verification.ts +119 -0
  86. package/apps/dashboard/lib/kanban-utils.ts +226 -26
  87. package/apps/dashboard/lib/proof-run.ts +495 -0
  88. package/apps/dashboard/lib/proof-scenario-runner.ts +346 -0
  89. package/apps/dashboard/lib/service-recovery.ts +326 -0
  90. package/apps/dashboard/lib/session-state-machine.ts +1 -0
  91. package/apps/dashboard/lib/session-state-utils.ts +0 -164
  92. package/apps/dashboard/lib/session-stream-manager.ts +253 -122
  93. package/apps/dashboard/lib/stream-manager-registry.ts +46 -6
  94. package/apps/dashboard/lib/tauri-bridge.ts +102 -0
  95. package/apps/dashboard/lib/tauri.ts +106 -0
  96. package/apps/dashboard/lib/utils.ts +3 -3
  97. package/apps/dashboard/next-env.d.ts +1 -1
  98. package/apps/dashboard/package.json +21 -33
  99. package/apps/dashboard/public/bug-icon.png +0 -0
  100. package/apps/dashboard/public/buoy-icon.png +0 -0
  101. package/apps/dashboard/public/in-flight-seagull.png +0 -0
  102. package/apps/dashboard/public/pier-icon.png +0 -0
  103. package/apps/dashboard/public/star-icon.png +0 -0
  104. package/apps/dashboard/public/wrench-icon.png +0 -0
  105. package/apps/dashboard/scripts/tauri-build.js +228 -0
  106. package/apps/dashboard/scripts/upload-tauri-to-r2.js +125 -0
  107. package/apps/dashboard/src/main.tsx +12 -0
  108. package/apps/dashboard/src/router.tsx +107 -0
  109. package/apps/dashboard/src/vite-env.d.ts +1 -0
  110. package/apps/dashboard/tsconfig.json +7 -12
  111. package/apps/dashboard/tsconfig.tsbuildinfo +1 -1
  112. package/apps/dashboard/vite.config.ts +33 -0
  113. package/apps/update-server/src/index.ts +167 -30
  114. package/claude-hooks/global-guardrails.js +14 -13
  115. package/crates/jettypod-cli/Cargo.toml +19 -0
  116. package/crates/jettypod-cli/src/commands.rs +1249 -0
  117. package/crates/jettypod-cli/src/main.rs +595 -0
  118. package/crates/jettypod-core/Cargo.toml +26 -0
  119. package/crates/jettypod-core/build.rs +98 -0
  120. package/crates/jettypod-core/migrations/V1__baseline.sql +197 -0
  121. package/crates/jettypod-core/migrations/V2__work_items_indexes.sql +6 -0
  122. package/crates/jettypod-core/migrations/V3__qa_steps.sql +2 -0
  123. package/crates/jettypod-core/src/auth.rs +294 -0
  124. package/crates/jettypod-core/src/config.rs +397 -0
  125. package/crates/jettypod-core/src/db/mod.rs +507 -0
  126. package/crates/jettypod-core/src/db/recovery.rs +114 -0
  127. package/crates/jettypod-core/src/db/startup.rs +101 -0
  128. package/crates/jettypod-core/src/db/validate.rs +149 -0
  129. package/crates/jettypod-core/src/error.rs +76 -0
  130. package/crates/jettypod-core/src/git.rs +458 -0
  131. package/crates/jettypod-core/src/lib.rs +20 -0
  132. package/crates/jettypod-core/src/sessions.rs +625 -0
  133. package/crates/jettypod-core/src/skills.rs +556 -0
  134. package/crates/jettypod-core/src/work.rs +1086 -0
  135. package/crates/jettypod-core/src/worktree.rs +628 -0
  136. package/crates/jettypod-core/src/ws.rs +767 -0
  137. package/cucumber-test.cjs +6 -0
  138. package/jettypod.js +96 -4
  139. package/lib/bdd-preflight.js +96 -0
  140. package/lib/merge-lock.js +111 -253
  141. package/lib/migrations/030-rejection-round-columns.js +54 -0
  142. package/lib/migrations/031-session-isolation-index.js +17 -0
  143. package/lib/work-commands/index.js +58 -16
  144. package/lib/work-tracking/index.js +108 -8
  145. package/package.json +1 -1
  146. package/skills-templates/bug-mode/SKILL.md +43 -1
  147. package/skills-templates/chore-mode/SKILL.md +40 -1
  148. package/skills-templates/design-system-selection/SKILL.md +273 -0
  149. package/skills-templates/epic-planning/SKILL.md +14 -0
  150. package/skills-templates/feature-planning/SKILL.md +90 -1
  151. package/skills-templates/production-mode/SKILL.md +20 -0
  152. package/skills-templates/simple-improvement/SKILL.md +39 -2
  153. package/skills-templates/speed-mode/SKILL.md +10 -15
  154. package/skills-templates/stable-mode/SKILL.md +47 -0
  155. package/apps/dashboard/README.md +0 -36
  156. package/apps/dashboard/app/api/claude/[workItemId]/message/route.ts +0 -446
  157. package/apps/dashboard/app/api/claude/[workItemId]/pin/route.ts +0 -24
  158. package/apps/dashboard/app/api/claude/[workItemId]/route.ts +0 -280
  159. package/apps/dashboard/app/api/claude/sessions/[sessionId]/content/route.ts +0 -52
  160. package/apps/dashboard/app/api/claude/sessions/[sessionId]/message/route.ts +0 -525
  161. package/apps/dashboard/app/api/claude/sessions/[sessionId]/pin/route.ts +0 -24
  162. package/apps/dashboard/app/api/claude/sessions/cleanup/route.ts +0 -34
  163. package/apps/dashboard/app/api/claude/sessions/route.ts +0 -184
  164. package/apps/dashboard/app/api/decisions/[id]/route.ts +0 -25
  165. package/apps/dashboard/app/api/internal/set-project/route.ts +0 -17
  166. package/apps/dashboard/app/api/kanban/route.ts +0 -15
  167. package/apps/dashboard/app/api/settings/env-vars/route.ts +0 -125
  168. package/apps/dashboard/app/api/settings/general/route.ts +0 -21
  169. package/apps/dashboard/app/api/tests/route.ts +0 -9
  170. package/apps/dashboard/app/api/tests/run/route.ts +0 -82
  171. package/apps/dashboard/app/api/tests/run/stream/route.ts +0 -71
  172. package/apps/dashboard/app/api/tests/undefined/route.ts +0 -9
  173. package/apps/dashboard/app/api/usage/route.ts +0 -17
  174. package/apps/dashboard/app/api/work/[id]/description/route.ts +0 -21
  175. package/apps/dashboard/app/api/work/[id]/epic/route.ts +0 -21
  176. package/apps/dashboard/app/api/work/[id]/order/route.ts +0 -21
  177. package/apps/dashboard/app/api/work/[id]/route.ts +0 -35
  178. package/apps/dashboard/app/api/work/[id]/status/route.ts +0 -63
  179. package/apps/dashboard/app/api/work/[id]/title/route.ts +0 -21
  180. package/apps/dashboard/app/layout.tsx +0 -55
  181. package/apps/dashboard/components/UpgradeBanner.tsx +0 -30
  182. package/apps/dashboard/electron/ipc-handlers.js +0 -1026
  183. package/apps/dashboard/electron/main.js +0 -2306
  184. package/apps/dashboard/electron/preload.js +0 -125
  185. package/apps/dashboard/electron/session-manager.js +0 -163
  186. package/apps/dashboard/electron-builder.config.js +0 -357
  187. package/apps/dashboard/hooks/useClaudeSessions.ts +0 -299
  188. package/apps/dashboard/lib/backlog-parser.ts +0 -50
  189. package/apps/dashboard/lib/claude-process-manager.ts +0 -529
  190. package/apps/dashboard/lib/db-bridge.ts +0 -283
  191. package/apps/dashboard/lib/prototypes.ts +0 -202
  192. package/apps/dashboard/lib/test-results-db.ts +0 -307
  193. package/apps/dashboard/lib/tests.ts +0 -282
  194. package/apps/dashboard/next.config.js +0 -66
  195. package/apps/dashboard/postcss.config.mjs +0 -7
  196. package/apps/dashboard/public/bug-icon.svg +0 -9
  197. package/apps/dashboard/public/buoy-icon.svg +0 -9
  198. package/apps/dashboard/public/file.svg +0 -1
  199. package/apps/dashboard/public/globe.svg +0 -1
  200. package/apps/dashboard/public/in-flight-seagull.svg +0 -9
  201. package/apps/dashboard/public/next.svg +0 -1
  202. package/apps/dashboard/public/pier-icon.svg +0 -14
  203. package/apps/dashboard/public/star-icon.svg +0 -9
  204. package/apps/dashboard/public/vercel.svg +0 -1
  205. package/apps/dashboard/public/window.svg +0 -1
  206. package/apps/dashboard/public/wrench-icon.svg +0 -9
  207. package/apps/dashboard/scripts/download-node.js +0 -104
  208. 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 an error (e.g., merge conflicts), the worktree is preserved for debugging.
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 all three sections exist, use them. Otherwise, fall back to autonomous analysis.
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 with transition flag (can run from worktree - it won't delete it)
823
- jettypod work merge [current-chore-id] --with-transition
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 <chore-id> --with-transition # Hold lock for transition
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