jettypod 4.4.118 → 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 (240) hide show
  1. package/.env +4 -3
  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 +63 -58
  8. package/apps/dashboard/app/demo/gates/page.tsx +43 -45
  9. package/apps/dashboard/app/design-system/page.tsx +868 -0
  10. package/apps/dashboard/app/globals.css +80 -4
  11. package/apps/dashboard/app/install-claude/page.tsx +4 -6
  12. package/apps/dashboard/app/login/page.tsx +72 -54
  13. package/apps/dashboard/app/page.tsx +101 -48
  14. package/apps/dashboard/app/settings/page.tsx +61 -13
  15. package/apps/dashboard/app/signup/page.tsx +242 -0
  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 +13 -16
  19. package/apps/dashboard/app/work/[id]/page.tsx +117 -118
  20. package/apps/dashboard/app/work/[id]/proof/page.tsx +1489 -0
  21. package/apps/dashboard/components/AppShell.tsx +92 -85
  22. package/apps/dashboard/components/CardMenu.tsx +45 -12
  23. package/apps/dashboard/components/ClaudePanel.tsx +771 -850
  24. package/apps/dashboard/components/ClaudePanelInput.tsx +43 -15
  25. package/apps/dashboard/components/ConnectClaudeScreen.tsx +17 -34
  26. package/apps/dashboard/components/CopyableId.tsx +3 -4
  27. package/apps/dashboard/components/DetailReviewActions.tsx +100 -0
  28. package/apps/dashboard/components/DragContext.tsx +134 -63
  29. package/apps/dashboard/components/DraggableCard.tsx +3 -5
  30. package/apps/dashboard/components/DropZone.tsx +6 -7
  31. package/apps/dashboard/components/EditableDetailDescription.tsx +7 -13
  32. package/apps/dashboard/components/EditableDetailTitle.tsx +6 -13
  33. package/apps/dashboard/components/EditableTitle.tsx +26 -7
  34. package/apps/dashboard/components/ElapsedTimer.tsx +66 -0
  35. package/apps/dashboard/components/EpicGroup.tsx +359 -0
  36. package/apps/dashboard/components/GateCard.tsx +79 -17
  37. package/apps/dashboard/components/GateChoiceCard.tsx +15 -18
  38. package/apps/dashboard/components/InstallClaudeScreen.tsx +15 -32
  39. package/apps/dashboard/components/JettyLoader.tsx +37 -0
  40. package/apps/dashboard/components/KanbanBoard.tsx +368 -958
  41. package/apps/dashboard/components/KanbanCard.tsx +740 -0
  42. package/apps/dashboard/components/LazyCard.tsx +62 -0
  43. package/apps/dashboard/components/LazyMarkdown.tsx +11 -0
  44. package/apps/dashboard/components/MainNav.tsx +38 -73
  45. package/apps/dashboard/components/MessageBlock.tsx +468 -0
  46. package/apps/dashboard/components/ModeStartCard.tsx +15 -16
  47. package/apps/dashboard/components/OnboardingWelcome.tsx +213 -0
  48. package/apps/dashboard/components/PlaceholderCard.tsx +3 -4
  49. package/apps/dashboard/components/ProjectSwitcher.tsx +30 -30
  50. package/apps/dashboard/components/PrototypeTimeline.tsx +72 -51
  51. package/apps/dashboard/components/RealTimeKanbanWrapper.tsx +406 -388
  52. package/apps/dashboard/components/RealTimeTestsWrapper.tsx +373 -235
  53. package/apps/dashboard/components/ReviewFooter.tsx +139 -0
  54. package/apps/dashboard/components/SessionList.tsx +19 -19
  55. package/apps/dashboard/components/SubscribeContent.tsx +91 -47
  56. package/apps/dashboard/components/TestTree.tsx +16 -16
  57. package/apps/dashboard/components/TipCard.tsx +16 -17
  58. package/apps/dashboard/components/Toast.tsx +5 -6
  59. package/apps/dashboard/components/TypeIcon.tsx +55 -0
  60. package/apps/dashboard/components/ViewModeToolbar.tsx +104 -0
  61. package/apps/dashboard/components/WaveCompletionAnimation.tsx +52 -65
  62. package/apps/dashboard/components/WelcomeScreen.tsx +19 -35
  63. package/apps/dashboard/components/WorkItemHeader.tsx +4 -5
  64. package/apps/dashboard/components/WorkItemTree.tsx +11 -32
  65. package/apps/dashboard/components/settings/AccountSection.tsx +55 -35
  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 +74 -152
  69. package/apps/dashboard/components/settings/GeneralSection.tsx +162 -56
  70. package/apps/dashboard/components/settings/ProjectStackSection.tsx +948 -0
  71. package/apps/dashboard/components/settings/SettingsLayout.tsx +4 -5
  72. package/apps/dashboard/components/ui/Button.tsx +104 -0
  73. package/apps/dashboard/components/ui/Input.tsx +78 -0
  74. package/apps/dashboard/components.json +1 -1
  75. package/apps/dashboard/contexts/ClaudeSessionContext.tsx +711 -418
  76. package/apps/dashboard/contexts/ConnectionStatusContext.tsx +25 -5
  77. package/apps/dashboard/contexts/UsageContext.tsx +87 -32
  78. package/apps/dashboard/dev.sh +35 -0
  79. package/apps/dashboard/eslint.config.mjs +9 -9
  80. package/apps/dashboard/hooks/useKanbanAnimation.ts +29 -0
  81. package/apps/dashboard/hooks/useKanbanUndo.ts +83 -0
  82. package/apps/dashboard/hooks/useWebSocket.ts +138 -83
  83. package/apps/dashboard/index.html +73 -0
  84. package/apps/dashboard/lib/constants.ts +43 -0
  85. package/apps/dashboard/lib/data-bridge.ts +722 -0
  86. package/apps/dashboard/lib/db.ts +69 -1265
  87. package/apps/dashboard/lib/environment-config.ts +173 -0
  88. package/apps/dashboard/lib/environment-verification.ts +119 -0
  89. package/apps/dashboard/lib/kanban-utils.ts +270 -0
  90. package/apps/dashboard/lib/proof-run.ts +495 -0
  91. package/apps/dashboard/lib/proof-scenario-runner.ts +346 -0
  92. package/apps/dashboard/lib/run-migrations.js +27 -2
  93. package/apps/dashboard/lib/service-recovery.ts +326 -0
  94. package/apps/dashboard/lib/session-state-machine.ts +1 -0
  95. package/apps/dashboard/lib/session-state-utils.ts +0 -164
  96. package/apps/dashboard/lib/session-stream-manager.ts +308 -134
  97. package/apps/dashboard/lib/shadows.ts +7 -0
  98. package/apps/dashboard/lib/stream-manager-registry.ts +46 -6
  99. package/apps/dashboard/lib/tauri-bridge.ts +102 -0
  100. package/apps/dashboard/lib/tauri.ts +106 -0
  101. package/apps/dashboard/lib/utils.ts +6 -0
  102. package/apps/dashboard/next-env.d.ts +1 -1
  103. package/apps/dashboard/package.json +21 -32
  104. package/apps/dashboard/public/bug-icon.png +0 -0
  105. package/apps/dashboard/public/buoy-icon.png +0 -0
  106. package/apps/dashboard/public/fonts/Satoshi-Variable.woff2 +0 -0
  107. package/apps/dashboard/public/fonts/Satoshi-VariableItalic.woff2 +0 -0
  108. package/apps/dashboard/public/in-flight-seagull.png +0 -0
  109. package/apps/dashboard/public/jetty-icon-loading-alt.svg +11 -0
  110. package/apps/dashboard/public/jetty-icon-loading.svg +11 -0
  111. package/apps/dashboard/public/jettypod_logo.png +0 -0
  112. package/apps/dashboard/public/pier-icon.png +0 -0
  113. package/apps/dashboard/public/star-icon.png +0 -0
  114. package/apps/dashboard/public/wrench-icon.png +0 -0
  115. package/apps/dashboard/scripts/tauri-build.js +228 -0
  116. package/apps/dashboard/scripts/upload-tauri-to-r2.js +125 -0
  117. package/apps/dashboard/scripts/ws-server.js +191 -0
  118. package/apps/dashboard/src/main.tsx +12 -0
  119. package/apps/dashboard/src/router.tsx +107 -0
  120. package/apps/dashboard/src/vite-env.d.ts +1 -0
  121. package/apps/dashboard/tsconfig.json +7 -12
  122. package/apps/dashboard/tsconfig.tsbuildinfo +1 -1
  123. package/apps/dashboard/vite.config.ts +33 -0
  124. package/apps/update-server/src/index.ts +228 -80
  125. package/claude-hooks/global-guardrails.js +14 -13
  126. package/crates/jettypod-cli/Cargo.toml +19 -0
  127. package/crates/jettypod-cli/src/commands.rs +1249 -0
  128. package/crates/jettypod-cli/src/main.rs +595 -0
  129. package/crates/jettypod-core/Cargo.toml +26 -0
  130. package/crates/jettypod-core/build.rs +98 -0
  131. package/crates/jettypod-core/migrations/V1__baseline.sql +197 -0
  132. package/crates/jettypod-core/migrations/V2__work_items_indexes.sql +6 -0
  133. package/crates/jettypod-core/migrations/V3__qa_steps.sql +2 -0
  134. package/crates/jettypod-core/src/auth.rs +294 -0
  135. package/crates/jettypod-core/src/config.rs +397 -0
  136. package/crates/jettypod-core/src/db/mod.rs +507 -0
  137. package/crates/jettypod-core/src/db/recovery.rs +114 -0
  138. package/crates/jettypod-core/src/db/startup.rs +101 -0
  139. package/crates/jettypod-core/src/db/validate.rs +149 -0
  140. package/crates/jettypod-core/src/error.rs +76 -0
  141. package/crates/jettypod-core/src/git.rs +458 -0
  142. package/crates/jettypod-core/src/lib.rs +20 -0
  143. package/crates/jettypod-core/src/sessions.rs +625 -0
  144. package/crates/jettypod-core/src/skills.rs +556 -0
  145. package/crates/jettypod-core/src/work.rs +1086 -0
  146. package/crates/jettypod-core/src/worktree.rs +628 -0
  147. package/crates/jettypod-core/src/ws.rs +767 -0
  148. package/cucumber-test.cjs +6 -0
  149. package/cucumber.js +9 -3
  150. package/docs/COMMAND_REFERENCE.md +34 -0
  151. package/hooks/post-checkout +32 -75
  152. package/hooks/post-merge +111 -10
  153. package/jest.setup.js +1 -0
  154. package/jettypod.js +145 -116
  155. package/lib/bdd-preflight.js +96 -0
  156. package/lib/chore-taxonomy.js +33 -10
  157. package/lib/database.js +36 -16
  158. package/lib/db-watcher.js +1 -1
  159. package/lib/git-hooks/pre-commit +1 -1
  160. package/lib/jettypod-backup.js +27 -4
  161. package/lib/merge-lock.js +111 -253
  162. package/lib/migrations/027-plan-at-creation-column.js +3 -1
  163. package/lib/migrations/029-remove-autoincrement.js +307 -0
  164. package/lib/migrations/029-rename-corrupted-to-cleaned.js +149 -0
  165. package/lib/migrations/030-rejection-round-columns.js +54 -0
  166. package/lib/migrations/031-session-isolation-index.js +17 -0
  167. package/lib/migrations/index.js +47 -4
  168. package/lib/schema.js +10 -5
  169. package/lib/seed-onboarding.js +1 -1
  170. package/lib/update-command/index.js +9 -175
  171. package/lib/work-commands/index.js +144 -19
  172. package/lib/work-tracking/index.js +148 -27
  173. package/lib/worktree-diagnostics.js +16 -16
  174. package/lib/worktree-facade.js +1 -1
  175. package/lib/worktree-manager.js +8 -8
  176. package/lib/worktree-reconciler.js +5 -5
  177. package/package.json +9 -2
  178. package/scripts/ndjson-to-cucumber-json.js +152 -0
  179. package/scripts/postinstall.js +25 -0
  180. package/skills-templates/bug-mode/SKILL.md +79 -20
  181. package/skills-templates/bug-planning/SKILL.md +25 -29
  182. package/skills-templates/chore-mode/SKILL.md +171 -69
  183. package/skills-templates/chore-mode/verification.js +51 -10
  184. package/skills-templates/chore-planning/SKILL.md +47 -18
  185. package/skills-templates/design-system-selection/SKILL.md +273 -0
  186. package/skills-templates/epic-planning/SKILL.md +82 -48
  187. package/skills-templates/external-transition/SKILL.md +47 -47
  188. package/skills-templates/feature-planning/SKILL.md +173 -74
  189. package/skills-templates/production-mode/SKILL.md +69 -49
  190. package/skills-templates/request-routing/SKILL.md +4 -4
  191. package/skills-templates/simple-improvement/SKILL.md +74 -29
  192. package/skills-templates/speed-mode/SKILL.md +217 -141
  193. package/skills-templates/stable-mode/SKILL.md +148 -89
  194. package/apps/dashboard/README.md +0 -36
  195. package/apps/dashboard/app/api/claude/[workItemId]/message/route.ts +0 -386
  196. package/apps/dashboard/app/api/claude/[workItemId]/pin/route.ts +0 -24
  197. package/apps/dashboard/app/api/claude/[workItemId]/route.ts +0 -167
  198. package/apps/dashboard/app/api/claude/sessions/[sessionId]/content/route.ts +0 -52
  199. package/apps/dashboard/app/api/claude/sessions/[sessionId]/message/route.ts +0 -378
  200. package/apps/dashboard/app/api/claude/sessions/[sessionId]/pin/route.ts +0 -24
  201. package/apps/dashboard/app/api/claude/sessions/cleanup/route.ts +0 -34
  202. package/apps/dashboard/app/api/claude/sessions/route.ts +0 -184
  203. package/apps/dashboard/app/api/decisions/[id]/route.ts +0 -25
  204. package/apps/dashboard/app/api/internal/set-project/route.ts +0 -17
  205. package/apps/dashboard/app/api/kanban/route.ts +0 -15
  206. package/apps/dashboard/app/api/settings/env-vars/route.ts +0 -125
  207. package/apps/dashboard/app/api/settings/general/route.ts +0 -21
  208. package/apps/dashboard/app/api/tests/route.ts +0 -9
  209. package/apps/dashboard/app/api/tests/run/route.ts +0 -82
  210. package/apps/dashboard/app/api/tests/run/stream/route.ts +0 -71
  211. package/apps/dashboard/app/api/tests/undefined/route.ts +0 -9
  212. package/apps/dashboard/app/api/usage/route.ts +0 -17
  213. package/apps/dashboard/app/api/work/[id]/description/route.ts +0 -21
  214. package/apps/dashboard/app/api/work/[id]/epic/route.ts +0 -21
  215. package/apps/dashboard/app/api/work/[id]/order/route.ts +0 -21
  216. package/apps/dashboard/app/api/work/[id]/status/route.ts +0 -21
  217. package/apps/dashboard/app/api/work/[id]/title/route.ts +0 -21
  218. package/apps/dashboard/app/layout.tsx +0 -43
  219. package/apps/dashboard/components/UpgradeBanner.tsx +0 -29
  220. package/apps/dashboard/electron/ipc-handlers.js +0 -1028
  221. package/apps/dashboard/electron/main.js +0 -2124
  222. package/apps/dashboard/electron/preload.js +0 -123
  223. package/apps/dashboard/electron/session-manager.js +0 -141
  224. package/apps/dashboard/electron-builder.config.js +0 -357
  225. package/apps/dashboard/hooks/useClaudeSessions.ts +0 -299
  226. package/apps/dashboard/lib/claude-process-manager.ts +0 -492
  227. package/apps/dashboard/lib/db-bridge.ts +0 -282
  228. package/apps/dashboard/lib/prototypes.ts +0 -202
  229. package/apps/dashboard/lib/test-results-db.ts +0 -307
  230. package/apps/dashboard/lib/tests.ts +0 -282
  231. package/apps/dashboard/next.config.js +0 -50
  232. package/apps/dashboard/postcss.config.mjs +0 -7
  233. package/apps/dashboard/public/file.svg +0 -1
  234. package/apps/dashboard/public/globe.svg +0 -1
  235. package/apps/dashboard/public/next.svg +0 -1
  236. package/apps/dashboard/public/vercel.svg +0 -1
  237. package/apps/dashboard/public/window.svg +0 -1
  238. package/apps/dashboard/scripts/download-node.js +0 -104
  239. package/apps/dashboard/scripts/upload-to-r2.js +0 -89
  240. package/docs/bdd-guidance.md +0 -390
@@ -11,7 +11,7 @@ Guides Claude through feature planning including UX approach exploration, option
11
11
 
12
12
  When this skill is activated, you are helping discover the best approach for a feature. Follow this structured approach:
13
13
 
14
- ## 🔑 Critical Command Distinction
14
+ ## Critical Command Distinction
15
15
 
16
16
  **Six commands in workflow order:**
17
17
 
@@ -32,9 +32,9 @@ When this skill is activated, you are helping discover the best approach for a f
32
32
  - `work tests merge` = Land BDD tests on main
33
33
  - `work start` = Creates worktree/branch for chore implementation
34
34
 
35
- **🛑 STOP GATE:** DO NOT run `work start` until Step 13. Tests must be merged to main first.
35
+ **STOP GATE:** DO NOT run `work start` until Step 13. Tests must be merged to main first.
36
36
 
37
- **🛑 HANDOFF REQUIREMENT:** After `work start`, you MUST invoke speed-mode using the Skill tool. See Step 13.
37
+ **HANDOFF REQUIREMENT:** After `work start`, you MUST invoke speed-mode using the Skill tool. See Step 13.
38
38
 
39
39
  ---
40
40
 
@@ -58,7 +58,7 @@ This returns: title, description, parent epic (if any), mode, phase, and any exi
58
58
 
59
59
  **If the feature is not found**, ask the user to verify the ID or run `jettypod backlog` to find it.
60
60
 
61
- **🔄 WORKFLOW INTEGRATION: Start workflow tracking**
61
+ **WORKFLOW INTEGRATION: Start workflow tracking**
62
62
 
63
63
  After getting the feature context, register this skill execution:
64
64
 
@@ -87,10 +87,10 @@ This outputs any architectural decisions recorded for the parent epic. If no dec
87
87
  Display the context with decisions:
88
88
 
89
89
  ```
90
- Planning Feature: [Feature Name]
90
+ Planning Feature: [Feature Name]
91
91
  Epic: [Epic Name]
92
92
 
93
- 🎯 **Epic Architectural Decisions:**
93
+ **Epic Architectural Decisions:**
94
94
  [If decisions exist:]
95
95
  - **[Aspect]:** [Decision]
96
96
  *Rationale:* [Why this was chosen]
@@ -114,25 +114,25 @@ Propose exactly 3 approaches with varying complexity/trade-offs:
114
114
  Here are 3 different approaches for [feature name]:
115
115
 
116
116
  **Option 1: [Simple/Minimal approach name]**
117
- - **Pros**: [2-3 advantages]
118
- - **Cons**: [2-3 trade-offs]
117
+ - **Pros**: [2-3 advantages]
118
+ - **Cons**: [2-3 trade-offs]
119
119
  - **Experience**: [What it feels like to use]
120
120
 
121
121
  **Option 2: [Balanced approach name]**
122
- - **Pros**: [2-3 advantages]
123
- - **Cons**: [2-3 trade-offs]
122
+ - **Pros**: [2-3 advantages]
123
+ - **Cons**: [2-3 trade-offs]
124
124
  - **Experience**: [What it feels like to use]
125
125
 
126
126
  **Option 3: [Advanced/Comprehensive approach name]**
127
- - **Pros**: [2-3 advantages]
128
- - **Cons**: [2-3 trade-offs]
127
+ - **Pros**: [2-3 advantages]
128
+ - **Cons**: [2-3 trade-offs]
129
129
  - **Experience**: [What it feels like to use]
130
130
 
131
131
  **Additional approaches considered but not recommended:**
132
132
  - *[Alternative 1]*: [Brief] - Not selected because [reason]
133
133
  - *[Alternative 2]*: [Brief] - Not selected because [reason]
134
134
 
135
- **💡 Recommendation:** [State which option you recommend and why - 2-3 sentences explaining the reasoning]
135
+ **Recommendation:** [State which option you recommend and why - 2-3 sentences explaining the reasoning]
136
136
 
137
137
  Would you like me to create working prototypes of these approaches?
138
138
  ```
@@ -140,7 +140,7 @@ Would you like me to create working prototypes of these approaches?
140
140
  **After presenting approaches, emit a question gate so the narrated UI can render an interactive choice card:**
141
141
 
142
142
  ```bash
143
- jettypod ui gate question --data='{"question":"Which approach should we take for [feature name]?","options":[{"id":"option-1","emoji":"🎯","label":"[Simple approach name]","description":"[1-line summary of what it does]"},{"id":"option-2","emoji":"⚖️","label":"[Balanced approach name]","description":"[1-line summary of what it does]"},{"id":"option-3","emoji":"🛡️","label":"[Advanced approach name]","description":"[1-line summary of what it does]"}]}'
143
+ jettypod ui gate question --data='{"question":"Which approach should we take for [feature name]?","options":[{"id":"option-1","emoji":"","label":"[Simple approach name]","description":"[1-line summary of what it does]"},{"id":"option-2","emoji":"","label":"[Balanced approach name]","description":"[1-line summary of what it does]"},{"id":"option-3","emoji":"","label":"[Advanced approach name]","description":"[1-line summary of what it does]"}]}'
144
144
  ```
145
145
 
146
146
  **WAIT for user response.**
@@ -165,10 +165,16 @@ jettypod work prototype start 42 simple-form
165
165
 
166
166
  This creates a worktree at `.jettypod-work/prototype-<id>-<slug>-<approach>/` where prototypes can be safely built and committed.
167
167
 
168
- **🛑 STOP AND CHECK:** Verify worktree was created successfully before proceeding.
168
+ **STOP AND CHECK:** Verify worktree was created successfully before proceeding.
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`
@@ -176,7 +182,7 @@ This creates a worktree at `.jettypod-work/prototype-<id>-<slug>-<approach>/` wh
176
182
  4. **Add visible banner header at TOP of page** (for HTML/web prototypes):
177
183
  ```html
178
184
  <div style="background: #f0f0f0; border: 2px solid #333; padding: 16px; margin-bottom: 24px; font-family: monospace;">
179
- <strong>🧪 PROTOTYPE</strong><br>
185
+ <strong>PROTOTYPE</strong><br>
180
186
  Feature: [feature name]<br>
181
187
  Option: [option number/name]<br>
182
188
  Created: [YYYY-MM-DD]<br>
@@ -208,7 +214,7 @@ jettypod work cleanup ${FEATURE_ID}
208
214
  This merges prototype files to main (in `/prototypes/` directory) and cleans up the worktree.
209
215
 
210
216
  <details>
211
- <summary><strong>📋 Prototyping Guidelines (click to expand)</strong></summary>
217
+ <summary><strong>Prototyping Guidelines (click to expand)</strong></summary>
212
218
 
213
219
  **Use fastest tech to demonstrate UX:**
214
220
  - Quick HTML+JS for web UX
@@ -241,12 +247,65 @@ Which approach works best?
241
247
 
242
248
  User picks winner. Note their choice - you'll record it formally in Step 11 when transitioning to implementation.
243
249
 
244
- **🔄 WORKFLOW CHECKPOINT: Winner chosen**
250
+ **WORKFLOW CHECKPOINT: Winner chosen**
245
251
 
246
252
  ```bash
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
@@ -274,7 +333,7 @@ jettypod workflow checkpoint <feature-id> --step=5
274
333
  **Display to user:**
275
334
 
276
335
  ```
277
- 📍 Integration Contract
336
+ Integration Contract
278
337
 
279
338
  **Entry Point:** [How users reach this feature]
280
339
  **Caller Code:** [What existing code invokes this]
@@ -297,11 +356,11 @@ Example:
297
356
  2. Claude has `WORKTREE_PATH` before being tempted to write files
298
357
  3. Writing to main is impossible because we're in worktree context
299
358
 
300
- **🚫 FORBIDDEN: Manual Git Worktree Commands**
359
+ **FORBIDDEN: Manual Git Worktree Commands**
301
360
  ```
302
- git worktree add ...
303
- git checkout -b tests/...
304
- git branch tests/...
361
+ git worktree add ...
362
+ git checkout -b tests/...
363
+ git branch tests/...
305
364
  ```
306
365
  **ALWAYS use jettypod commands** - they handle branch naming, path conventions, database tracking, and cleanup. Manual git commands will create orphaned worktrees that break the merge workflow.
307
366
 
@@ -315,14 +374,14 @@ This creates:
315
374
  - Worktree at `.jettypod-work/tests-<id>-<slug>/`
316
375
  - Branch `tests/feature-<id>-<slug>`
317
376
 
318
- **🛑 STOP AND CHECK:** Verify worktree was created successfully. If you see an error, investigate before continuing.
377
+ **STOP AND CHECK:** Verify worktree was created successfully. If you see an error, investigate before continuing.
319
378
 
320
379
  **Capture from output:**
321
380
  - `WORKTREE_PATH` - the absolute path to the worktree (e.g., `/path/to/.jettypod-work/tests-42-email-login`)
322
381
 
323
382
  Example output:
324
383
  ```
325
- Created test worktree: /path/to/.jettypod-work/tests-42-email-login
384
+ Created test worktree: /path/to/.jettypod-work/tests-42-email-login
326
385
  Branch: tests/feature-42-email-login
327
386
 
328
387
  Write your BDD files to:
@@ -333,13 +392,13 @@ Write your BDD files to:
333
392
  **Display:**
334
393
 
335
394
  ```
336
- 📁 Test worktree created: ${WORKTREE_PATH}
395
+ Test worktree created: ${WORKTREE_PATH}
337
396
  Branch: tests/feature-${FEATURE_ID}-${FEATURE_SLUG}
338
397
 
339
- 🔒 WORKTREE LOCK ACTIVE: All BDD file writes will use this path.
398
+ WORKTREE LOCK ACTIVE: All BDD file writes will use this path.
340
399
  ```
341
400
 
342
- **🔒 WORKTREE PATH LOCK**
401
+ **WORKTREE PATH LOCK**
343
402
 
344
403
  From this point forward, ALL file operations for BDD tests MUST use paths starting with:
345
404
  ```
@@ -350,13 +409,17 @@ ${WORKTREE_PATH}/features/
350
409
 
351
410
  **Proceed to Step 8.**
352
411
 
412
+ ### BDD Scenario Formulation Rules (ENFORCED)
413
+
414
+ Before proposing scenarios, read `templates/bdd-guidance.md`. Scenarios MUST be: declarative (describe intent, not UI clicks), one behavior per scenario, deterministic (factory data, not ambient), no implementation leakage ("Given a user with an unpaid invoice" not "Given the database has a row in invoices"). No UI specifics unless the feature IS a UI interaction.
415
+
353
416
  ### Step 8: Propose BDD Scenarios
354
417
 
355
- **🚫 FORBIDDEN: Writing Files at This Step**
418
+ **FORBIDDEN: Writing Files at This Step**
356
419
  ```
357
- Write tool to ${WORKTREE_PATH}/features/*.feature
358
- Write tool to ${WORKTREE_PATH}/features/step_definitions/*.js
359
- Any file creation (even in worktree)
420
+ Write tool to ${WORKTREE_PATH}/features/*.feature
421
+ Write tool to ${WORKTREE_PATH}/features/step_definitions/*.js
422
+ Any file creation (even in worktree)
360
423
  ```
361
424
  **Files are written in Step 9** after user confirms the scenarios. At this step, you are ONLY displaying proposed scenarios to the user for confirmation.
362
425
 
@@ -369,7 +432,7 @@ ${WORKTREE_PATH}/features/
369
432
  Based on chosen approach, **display** the proposed scenarios to the user:
370
433
 
371
434
  ```
372
- 📋 Proposed BDD Scenarios
435
+ Proposed BDD Scenarios
373
436
 
374
437
  **Feature file:** ${WORKTREE_PATH}/features/[feature-slug].feature
375
438
  **Step definitions:** ${WORKTREE_PATH}/features/step_definitions/[feature-slug].steps.js
@@ -431,6 +494,11 @@ Does this capture the feature correctly? Any scenarios to add/change?
431
494
  - NO error handling scenarios (added in stable mode)
432
495
  - NO validation failures (added in stable mode)
433
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]"
434
502
 
435
503
  **WAIT for user confirmation.**
436
504
 
@@ -438,7 +506,7 @@ Does this capture the feature correctly? Any scenarios to add/change?
438
506
  - If user requests changes → Revise scenarios and display again
439
507
  - **Store the confirmed scenarios in memory** - you'll write them in Step 9
440
508
 
441
- **🔄 WORKFLOW CHECKPOINT: BDD scenarios confirmed**
509
+ **WORKFLOW CHECKPOINT: BDD scenarios confirmed**
442
510
 
443
511
  ```bash
444
512
  jettypod workflow checkpoint <feature-id> --step=8
@@ -520,7 +588,7 @@ Scenario: User logs in with "Remember me" option (optional feature)
520
588
  ```
521
589
 
522
590
  <details>
523
- <summary><strong>📋 BDD Scenario Guidelines (click to expand)</strong></summary>
591
+ <summary><strong>BDD Scenario Guidelines (click to expand)</strong></summary>
524
592
 
525
593
  **Scenario naming:**
526
594
  - Use present tense
@@ -573,7 +641,7 @@ Scenario: Prevent unauthorized access
573
641
 
574
642
  **NOW you may write files** - the worktree exists (from Step 7) and scenarios are confirmed (from Step 8).
575
643
 
576
- **🔒 WORKTREE PATH REQUIRED:** All file writes MUST use the `WORKTREE_PATH` captured in Step 7.
644
+ **WORKTREE PATH REQUIRED:** All file writes MUST use the `WORKTREE_PATH` captured in Step 7.
577
645
 
578
646
  Using the scenarios confirmed in Step 8, write the files using **absolute paths to the worktree**:
579
647
 
@@ -605,14 +673,14 @@ cd ${WORKTREE_PATH} && npx cucumber-js --dry-run features/${FEATURE_SLUG}.featur
605
673
 
606
674
  **What the output means:**
607
675
 
608
- **Success** - No errors, all steps have definitions:
676
+ **Success** - No errors, all steps have definitions:
609
677
  ```
610
678
  0 scenarios
611
679
  0 steps
612
680
  ```
613
681
  (Dry-run doesn't execute, so 0 is correct)
614
682
 
615
- **Undefined steps** - Missing step definitions:
683
+ **Undefined steps** - Missing step definitions:
616
684
  ```
617
685
  Undefined. Implement with the following snippet:
618
686
  Given('I am on the login page', function () {
@@ -621,13 +689,13 @@ Undefined. Implement with the following snippet:
621
689
  ```
622
690
  → Add the missing step definition to your `.steps.js` file
623
691
 
624
- **Syntax error** - Invalid Gherkin:
692
+ **Syntax error** - Invalid Gherkin:
625
693
  ```
626
694
  Parse error in features/foo.feature
627
695
  ```
628
696
  → Fix the feature file syntax
629
697
 
630
- **Duplicate steps** - Multiple definitions match:
698
+ **Duplicate steps** - Multiple definitions match:
631
699
  ```
632
700
  Multiple step definitions match
633
701
  ```
@@ -640,7 +708,7 @@ Multiple step definitions match
640
708
  4. **Loop until validation passes** - do NOT proceed until green
641
709
 
642
710
  **If validation succeeds:**
643
- Display: "BDD infrastructure validated - all steps have definitions"
711
+ Display: "BDD infrastructure validated - all steps have definitions"
644
712
 
645
713
  **Update database with scenario file path:**
646
714
 
@@ -677,7 +745,7 @@ Now let me analyze the codebase and propose implementation chores for speed mode
677
745
 
678
746
  Based on the scenario and my understanding of the codebase, here are the chores I recommend for speed mode:
679
747
 
680
- **Chore 1: [Integration chore - wire feature into app]** INTEGRATION
748
+ **Chore 1: [Integration chore - wire feature into app]** INTEGRATION
681
749
  - Why: Makes the feature reachable from [entry point]
682
750
  - Integration Contract:
683
751
  • Entry point: [from Step 6]
@@ -698,6 +766,11 @@ Based on the scenario and my understanding of the codebase, here are the chores
698
766
  • Files to create/modify: [specific paths]
699
767
  • Patterns to follow: [reference existing similar code]
700
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]
701
774
  - Verification:
702
775
  • [Which step definitions should pass]
703
776
 
@@ -739,18 +812,24 @@ Does this rationale capture why you chose this approach? (You can edit it if nee
739
812
 
740
813
  **CRITICAL: Create chores BEFORE running `work implement`.** The system validates that chores exist before allowing the transition.
741
814
 
742
- For each chore that the user confirmed in Step 10, use the Bash tool to create it:
743
-
744
- ```bash
745
- jettypod work create chore "[Chore title]" "[Chore description]" --parent=${FEATURE_ID}
815
+ For each chore that the user confirmed in Step 10, use the **Write** tool to create `/tmp/jettypod-create.json`:
816
+ ```json
817
+ {
818
+ "type": "chore",
819
+ "title": "[Chore title]",
820
+ "description": "[Chore description]",
821
+ "parent": ${FEATURE_ID}
822
+ }
746
823
  ```
747
824
 
748
- Replace `${FEATURE_ID}` with actual ID. Example:
825
+ Then run via **Bash**:
749
826
  ```bash
750
- jettypod work create chore "Set up auth routes" "Create login/logout endpoints..." --parent=42
827
+ jettypod work create --from=/tmp/jettypod-create.json
751
828
  ```
752
829
 
753
- **CRITICAL: Copy the EXACT proposal from Step 10 into each chore description.** Do not paraphrase or summarize - the implementation guidance must be preserved verbatim:
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`.
831
+
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:
754
833
 
755
834
  ```
756
835
  [Technical description from Step 10]
@@ -763,6 +842,9 @@ Implementation guidance:
763
842
  • Patterns to follow: [EXACT references from Step 10]
764
843
  • Key functions/components needed: [EXACT list from Step 10]
765
844
 
845
+ UX acceptance criteria:
846
+ • [EXACT UX criteria from Step 10 — loading states, success feedback, empty states, micro-interactions]
847
+
766
848
  Verification:
767
849
  • [EXACT step definitions from Step 10]
768
850
  ```
@@ -792,13 +874,13 @@ jettypod work implement 42 --winner="Simple inline form" --rationale="Fastest UX
792
874
  After successful transition, display:
793
875
 
794
876
  ```
795
- Feature transitioned to implementation phase
796
- Created X chores for speed mode
877
+ Feature transitioned to implementation phase
878
+ Created X chores for speed mode
797
879
 
798
880
  Now I'll merge the BDD tests to main...
799
881
  ```
800
882
 
801
- **🔄 WORKFLOW CHECKPOINT: Implementation transition complete**
883
+ **WORKFLOW CHECKPOINT: Implementation transition complete**
802
884
 
803
885
  ```bash
804
886
  jettypod workflow checkpoint <feature-id> --step=11
@@ -817,6 +899,8 @@ The BDD files were written in Step 9. Now merge them to main.
817
899
  jettypod work tests merge ${FEATURE_ID}
818
900
  ```
819
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
+
820
904
  ```bash
821
905
  # Step 2: cd to main repo
822
906
  cd <main-repo-path>
@@ -834,33 +918,33 @@ This will:
834
918
  - Push to remote
835
919
  - Mark worktree as merged (cleanup is separate)
836
920
 
837
- **🛑 STOP AND CHECK:** Verify merge succeeded:
838
- - "Tests merged to main" → Proceed to Step 13
839
- - Error → Investigate, worktree still exists for debugging
921
+ **STOP AND CHECK:** Verify merge succeeded:
922
+ - "Tests merged to main" → Proceed to Step 13
923
+ - Error → Investigate, worktree still exists for debugging
840
924
 
841
925
  **After successful merge, display:**
842
926
 
843
927
  ```
844
- Feature transitioned to implementation phase
845
- Created X chores for speed mode
846
- BDD tests merged to main
928
+ Feature transitioned to implementation phase
929
+ Created X chores for speed mode
930
+ BDD tests merged to main
847
931
 
848
932
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
849
- 🎯 Feature Planning Complete!
933
+ Feature Planning Complete!
850
934
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
851
935
 
852
- 📋 BDD scenarios: features/[feature-slug].feature
853
- 🧪 Step definitions: features/step_definitions/[feature-slug].steps.js
854
- Feature phase: Implementation
855
- 🚀 Feature mode: Speed
936
+ BDD scenarios: features/[feature-slug].feature
937
+ Step definitions: features/step_definitions/[feature-slug].steps.js
938
+ Feature phase: Implementation
939
+ Feature mode: Speed
856
940
 
857
- 💡 Recommendation: Start with Chore #[first-chore-id] ([chore-title])
941
+ Recommendation: Start with Chore #[first-chore-id] ([chore-title])
858
942
  [Brief reasoning - e.g., "It sets up the foundation the other chores depend on."]
859
943
 
860
944
  Start this one? [yes / pick different / done for now]
861
945
  ```
862
946
 
863
- **🔄 WORKFLOW INTEGRATION: Complete workflow**
947
+ **WORKFLOW INTEGRATION: Complete workflow**
864
948
 
865
949
  ```bash
866
950
  jettypod workflow complete feature-planning <feature-id>
@@ -897,11 +981,11 @@ End feature-planning skill without starting a chore. Do NOT invoke speed-mode.
897
981
 
898
982
  **After user picks a chore, execute these steps IN ORDER:**
899
983
 
900
- **🚫 FORBIDDEN: Manual Git Worktree Commands**
984
+ **FORBIDDEN: Manual Git Worktree Commands**
901
985
  ```
902
- git worktree add ...
903
- git checkout -b feature/...
904
- git branch feature/...
986
+ git worktree add ...
987
+ git checkout -b feature/...
988
+ git branch feature/...
905
989
  ```
906
990
  **ALWAYS use `jettypod work start`** - it handles branch naming, path conventions, database tracking, and cleanup. Manual git commands will create orphaned worktrees that break the merge workflow.
907
991
 
@@ -910,17 +994,17 @@ End feature-planning skill without starting a chore. Do NOT invoke speed-mode.
910
994
  jettypod work start [chore-id]
911
995
  ```
912
996
 
913
- **🛑 STOP AND CHECK:** Look at the output of `work start`. You should see:
997
+ **STOP AND CHECK:** Look at the output of `work start`. You should see:
914
998
  ```
915
- Created worktree: /path/to/.jettypod-work/[id]-[title-slug]
999
+ Created worktree: /path/to/.jettypod-work/[id]-[title-slug]
916
1000
  Branch: feature/work-[id]-[title-slug]
917
1001
  ```
918
1002
 
919
- **If you see `⚠️ Working in main repository (worktree creation failed)`:**
1003
+ **If you see `Working in main repository (worktree creation failed)`:**
920
1004
  - **DO NOT proceed to speed-mode**
921
1005
  - Investigate why worktree failed (uncommitted changes? branch conflict?)
922
1006
  - Fix the issue and re-run `work start`
923
- - Only continue after seeing `✅ Created worktree`
1007
+ - Only continue after seeing `Created worktree`
924
1008
 
925
1009
  **Step 2: Verify worktree exists before invoking speed-mode:**
926
1010
  ```bash
@@ -937,7 +1021,7 @@ If this returns empty/no rows, **STOP** - the worktree wasn't created properly.
937
1021
  Use the Skill tool with skill: "speed-mode"
938
1022
  ```
939
1023
 
940
- **🛑 CRITICAL:** You MUST:
1024
+ **CRITICAL:** You MUST:
941
1025
  1. Run `work start` first
942
1026
  2. Verify the worktree was created (not fallback to main)
943
1027
  3. THEN invoke speed-mode using the Skill tool
@@ -958,6 +1042,20 @@ If you skip `work start` or proceed when worktree creation failed, the merge wor
958
1042
 
959
1043
  **User picks:** Option 1 (Simple inline form)
960
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
+
961
1059
  **Scenarios generated (speed mode - all success paths):**
962
1060
  ```gherkin
963
1061
  Feature: Email/Password Login
@@ -992,6 +1090,7 @@ Before completing feature planning, ensure:
992
1090
  - [ ] Epic's architectural decision is shown (if exists)
993
1091
  - [ ] Exactly 3 approaches suggested
994
1092
  - [ ] Winner chosen (with prototypes or without)
1093
+ - [ ] **UX States Inventory completed** (all screens/states/micro-interactions enumerated, confirmed by user)
995
1094
  - [ ] **Integration Contract defined** (entry point, caller code, integration scenario)
996
1095
  - [ ] **Test worktree created** with `work tests start` (Step 7)
997
1096
  - [ ] **Integration Scenario is FIRST scenario** in proposed scenarios