jettypod 4.4.116 → 4.4.120

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 (162) hide show
  1. package/.env +7 -0
  2. package/apps/dashboard/app/api/claude/[workItemId]/message/route.ts +124 -48
  3. package/apps/dashboard/app/api/claude/[workItemId]/route.ts +171 -58
  4. package/apps/dashboard/app/api/claude/sessions/[sessionId]/message/route.ts +161 -10
  5. package/apps/dashboard/app/api/tests/run/stream/route.ts +13 -1
  6. package/apps/dashboard/app/api/usage/route.ts +17 -0
  7. package/apps/dashboard/app/api/work/[id]/route.ts +35 -0
  8. package/apps/dashboard/app/api/work/[id]/status/route.ts +43 -1
  9. package/apps/dashboard/app/connect-claude/page.tsx +24 -0
  10. package/apps/dashboard/app/decision/[id]/page.tsx +14 -14
  11. package/apps/dashboard/app/demo/gates/page.tsx +42 -42
  12. package/apps/dashboard/app/design-system/page.tsx +868 -0
  13. package/apps/dashboard/app/globals.css +6 -2
  14. package/apps/dashboard/app/install-claude/page.tsx +9 -7
  15. package/apps/dashboard/app/layout.tsx +17 -5
  16. package/apps/dashboard/app/login/page.tsx +250 -0
  17. package/apps/dashboard/app/page.tsx +11 -9
  18. package/apps/dashboard/app/settings/page.tsx +4 -2
  19. package/apps/dashboard/app/signup/page.tsx +245 -0
  20. package/apps/dashboard/app/subscribe/page.tsx +11 -0
  21. package/apps/dashboard/app/welcome/page.tsx +24 -1
  22. package/apps/dashboard/app/work/[id]/page.tsx +34 -50
  23. package/apps/dashboard/components/AppShell.tsx +95 -55
  24. package/apps/dashboard/components/CardMenu.tsx +56 -13
  25. package/apps/dashboard/components/ClaudePanel.tsx +301 -582
  26. package/apps/dashboard/components/ClaudePanelInput.tsx +23 -14
  27. package/apps/dashboard/components/ConnectClaudeScreen.tsx +210 -0
  28. package/apps/dashboard/components/CopyableId.tsx +3 -3
  29. package/apps/dashboard/components/DetailReviewActions.tsx +109 -0
  30. package/apps/dashboard/components/DragContext.tsx +75 -65
  31. package/apps/dashboard/components/DraggableCard.tsx +6 -46
  32. package/apps/dashboard/components/DropZone.tsx +2 -2
  33. package/apps/dashboard/components/EditableDetailDescription.tsx +1 -1
  34. package/apps/dashboard/components/EditableTitle.tsx +26 -6
  35. package/apps/dashboard/components/ElapsedTimer.tsx +54 -0
  36. package/apps/dashboard/components/EpicGroup.tsx +329 -0
  37. package/apps/dashboard/components/GateCard.tsx +100 -16
  38. package/apps/dashboard/components/GateChoiceCard.tsx +15 -17
  39. package/apps/dashboard/components/InstallClaudeScreen.tsx +140 -51
  40. package/apps/dashboard/components/JettyLoader.tsx +38 -0
  41. package/apps/dashboard/components/KanbanBoard.tsx +147 -766
  42. package/apps/dashboard/components/KanbanCard.tsx +506 -0
  43. package/apps/dashboard/components/LazyMarkdown.tsx +12 -0
  44. package/apps/dashboard/components/MainNav.tsx +20 -54
  45. package/apps/dashboard/components/MessageBlock.tsx +391 -0
  46. package/apps/dashboard/components/ModeStartCard.tsx +15 -15
  47. package/apps/dashboard/components/OnboardingWelcome.tsx +214 -0
  48. package/apps/dashboard/components/PlaceholderCard.tsx +11 -21
  49. package/apps/dashboard/components/ProjectSwitcher.tsx +36 -8
  50. package/apps/dashboard/components/PrototypeTimeline.tsx +25 -25
  51. package/apps/dashboard/components/RealTimeKanbanWrapper.tsx +265 -301
  52. package/apps/dashboard/components/RealTimeTestsWrapper.tsx +97 -74
  53. package/apps/dashboard/components/ReviewFooter.tsx +141 -0
  54. package/apps/dashboard/components/SessionList.tsx +19 -18
  55. package/apps/dashboard/components/SubscribeContent.tsx +206 -0
  56. package/apps/dashboard/components/TestTree.tsx +15 -14
  57. package/apps/dashboard/components/TipCard.tsx +177 -0
  58. package/apps/dashboard/components/Toast.tsx +5 -5
  59. package/apps/dashboard/components/TypeIcon.tsx +56 -0
  60. package/apps/dashboard/components/UpgradeBanner.tsx +30 -0
  61. package/apps/dashboard/components/WaveCompletionAnimation.tsx +61 -62
  62. package/apps/dashboard/components/WelcomeScreen.tsx +25 -27
  63. package/apps/dashboard/components/WorkItemHeader.tsx +4 -4
  64. package/apps/dashboard/components/WorkItemTree.tsx +9 -28
  65. package/apps/dashboard/components/settings/AccountSection.tsx +169 -0
  66. package/apps/dashboard/components/settings/EnvVarsSection.tsx +54 -79
  67. package/apps/dashboard/components/settings/GeneralSection.tsx +26 -31
  68. package/apps/dashboard/components/settings/SettingsLayout.tsx +4 -4
  69. package/apps/dashboard/components/ui/Button.tsx +104 -0
  70. package/apps/dashboard/components/ui/Input.tsx +78 -0
  71. package/apps/dashboard/contexts/ClaudeSessionContext.tsx +408 -105
  72. package/apps/dashboard/contexts/ConnectionStatusContext.tsx +25 -4
  73. package/apps/dashboard/contexts/UsageContext.tsx +155 -0
  74. package/apps/dashboard/contexts/usageHelpers.js +9 -0
  75. package/apps/dashboard/electron/ipc-handlers.js +281 -88
  76. package/apps/dashboard/electron/main.js +691 -131
  77. package/apps/dashboard/electron/preload.js +25 -4
  78. package/apps/dashboard/electron/session-manager.js +163 -0
  79. package/apps/dashboard/electron-builder.config.js +3 -5
  80. package/apps/dashboard/hooks/useKanbanAnimation.ts +29 -0
  81. package/apps/dashboard/hooks/useKanbanUndo.ts +83 -0
  82. package/apps/dashboard/lib/backlog-parser.ts +50 -0
  83. package/apps/dashboard/lib/claude-process-manager.ts +50 -11
  84. package/apps/dashboard/lib/constants.ts +43 -0
  85. package/apps/dashboard/lib/db-bridge.ts +33 -0
  86. package/apps/dashboard/lib/db.ts +136 -20
  87. package/apps/dashboard/lib/kanban-utils.ts +70 -0
  88. package/apps/dashboard/lib/run-migrations.js +27 -2
  89. package/apps/dashboard/lib/session-state-machine.ts +3 -0
  90. package/apps/dashboard/lib/session-stream-manager.ts +144 -38
  91. package/apps/dashboard/lib/shadows.ts +7 -0
  92. package/apps/dashboard/lib/tests.ts +3 -1
  93. package/apps/dashboard/lib/utils.ts +6 -0
  94. package/apps/dashboard/next.config.js +35 -14
  95. package/apps/dashboard/package.json +6 -3
  96. package/apps/dashboard/public/bug-icon.svg +9 -0
  97. package/apps/dashboard/public/buoy-icon.svg +9 -0
  98. package/apps/dashboard/public/fonts/Satoshi-Variable.woff2 +0 -0
  99. package/apps/dashboard/public/fonts/Satoshi-VariableItalic.woff2 +0 -0
  100. package/apps/dashboard/public/in-flight-seagull.svg +9 -0
  101. package/apps/dashboard/public/jetty-icon-loading-alt.svg +11 -0
  102. package/apps/dashboard/public/jetty-icon-loading.svg +11 -0
  103. package/apps/dashboard/public/jettypod_logo.png +0 -0
  104. package/apps/dashboard/public/pier-icon.svg +14 -0
  105. package/apps/dashboard/public/star-icon.svg +9 -0
  106. package/apps/dashboard/public/wrench-icon.svg +9 -0
  107. package/apps/dashboard/scripts/upload-to-r2.js +89 -0
  108. package/apps/dashboard/scripts/ws-server.js +191 -0
  109. package/apps/dashboard/tsconfig.tsbuildinfo +1 -0
  110. package/apps/update-server/package.json +16 -0
  111. package/apps/update-server/schema.sql +31 -0
  112. package/apps/update-server/src/index.ts +1085 -0
  113. package/apps/update-server/tsconfig.json +16 -0
  114. package/apps/update-server/wrangler.toml +35 -0
  115. package/cucumber.js +9 -3
  116. package/docs/COMMAND_REFERENCE.md +34 -0
  117. package/hooks/post-checkout +32 -75
  118. package/hooks/post-merge +111 -10
  119. package/jest.setup.js +1 -0
  120. package/jettypod.js +54 -116
  121. package/lib/chore-taxonomy.js +33 -10
  122. package/lib/database.js +36 -16
  123. package/lib/db-watcher.js +1 -1
  124. package/lib/git-hooks/pre-commit +1 -1
  125. package/lib/jettypod-backup.js +27 -4
  126. package/lib/migrations/027-plan-at-creation-column.js +33 -0
  127. package/lib/migrations/028-ready-for-review-column.js +27 -0
  128. package/lib/migrations/029-remove-autoincrement.js +307 -0
  129. package/lib/migrations/029-rename-corrupted-to-cleaned.js +149 -0
  130. package/lib/migrations/index.js +47 -4
  131. package/lib/schema.js +13 -6
  132. package/lib/seed-onboarding.js +101 -69
  133. package/lib/update-command/index.js +9 -175
  134. package/lib/work-commands/index.js +129 -16
  135. package/lib/work-tracking/index.js +86 -46
  136. package/lib/worktree-diagnostics.js +16 -16
  137. package/lib/worktree-facade.js +1 -1
  138. package/lib/worktree-manager.js +8 -8
  139. package/lib/worktree-reconciler.js +5 -5
  140. package/package.json +9 -2
  141. package/scripts/ndjson-to-cucumber-json.js +152 -0
  142. package/scripts/postinstall.js +25 -0
  143. package/skills-templates/bug-mode/SKILL.md +39 -28
  144. package/skills-templates/bug-planning/SKILL.md +25 -29
  145. package/skills-templates/chore-mode/SKILL.md +131 -68
  146. package/skills-templates/chore-mode/verification.js +51 -10
  147. package/skills-templates/chore-planning/SKILL.md +47 -18
  148. package/skills-templates/epic-planning/SKILL.md +68 -48
  149. package/skills-templates/external-transition/SKILL.md +47 -47
  150. package/skills-templates/feature-planning/SKILL.md +83 -73
  151. package/skills-templates/production-mode/SKILL.md +49 -49
  152. package/skills-templates/request-routing/SKILL.md +27 -14
  153. package/skills-templates/simple-improvement/SKILL.md +68 -44
  154. package/skills-templates/speed-mode/SKILL.md +209 -128
  155. package/skills-templates/stable-mode/SKILL.md +105 -94
  156. package/templates/bdd-guidance.md +139 -0
  157. package/templates/bdd-scaffolding/wait.js +18 -0
  158. package/templates/bdd-scaffolding/world.js +19 -0
  159. package/.jettypod-backup/work.db +0 -0
  160. package/apps/dashboard/app/access-code/page.tsx +0 -110
  161. package/lib/discovery-checkpoint.js +0 -123
  162. package/skills-templates/project-discovery/SKILL.md +0 -372
@@ -18,7 +18,7 @@ description: Guide implementation of speed mode chores with autonomous code anal
18
18
  └─────────────────────────────────────────────────────────────────────┘
19
19
  ```
20
20
 
21
- ## 🛑 CRITICAL HANDOFF REQUIREMENT
21
+ ## CRITICAL HANDOFF REQUIREMENT
22
22
 
23
23
  **After completing ALL speed mode chores, you MUST:**
24
24
  1. Generate stable mode BDD scenarios and step definitions
@@ -26,18 +26,18 @@ description: Guide implementation of speed mode chores with autonomous code anal
26
26
  3. Set feature mode to stable
27
27
  4. **IMMEDIATELY invoke stable-mode using the Skill tool**
28
28
 
29
- **🛑 STOP GATE:** DO NOT end this skill without invoking stable-mode. Speed mode is ONLY a checkpoint - features are INCOMPLETE without stable mode.
29
+ **STOP GATE:** DO NOT end this skill without invoking stable-mode. Speed mode is ONLY a checkpoint - features are INCOMPLETE without stable mode.
30
30
 
31
31
  ---
32
32
 
33
- ## 🚫 FORBIDDEN: Skipping Stable Mode
33
+ ## FORBIDDEN: Skipping Stable Mode
34
34
 
35
35
  ```
36
- Ending speed-mode skill without invoking stable-mode skill
37
- Using `jettypod work status <feature-id> done` to mark feature complete
38
- Telling user "feature is complete" after speed mode
39
- Skipping Step 7 (Transition to Stable Mode)
40
- Any action that bypasses the speed→stable progression
36
+ Ending speed-mode skill without invoking stable-mode skill
37
+ Using `jettypod work status <feature-id> done` to mark feature complete
38
+ Telling user "feature is complete" after speed mode
39
+ Skipping Step 7 (Transition to Stable Mode)
40
+ Any action that bypasses the speed→stable progression
41
41
  ```
42
42
 
43
43
  **What "Feature Complete" Actually Means:**
@@ -60,7 +60,7 @@ Guides Claude Code through speed mode implementation with autonomous analysis an
60
60
 
61
61
  When this skill is activated, you are helping implement a speed mode chore to make all success scenarios pass. Follow this structured approach:
62
62
 
63
- ## 🔑 Critical Context
63
+ ## Critical Context
64
64
 
65
65
  **You are working in an isolated git worktree:**
66
66
  - `work start [chore-id]` created a dedicated worktree for this chore
@@ -72,7 +72,7 @@ When this skill is activated, you are helping implement a speed mode chore to ma
72
72
 
73
73
  ---
74
74
 
75
- ## 🚨 SHELL CWD RECOVERY
75
+ ## SHELL CWD RECOVERY
76
76
 
77
77
  **If ALL bash commands start failing with "Error: Exit code 1" and no output:**
78
78
 
@@ -93,7 +93,7 @@ cd /Users/erikspangenberg/personal-assistant && pwd
93
93
 
94
94
  ---
95
95
 
96
- ## 🛑 PRE-FLIGHT VALIDATION (REQUIRED)
96
+ ## PRE-FLIGHT VALIDATION (REQUIRED)
97
97
 
98
98
  **Before proceeding with ANY implementation, you MUST validate the worktree exists.**
99
99
 
@@ -107,11 +107,11 @@ sqlite3 .jettypod/work.db "SELECT wi.id, wi.title, wi.status, wt.worktree_path,
107
107
 
108
108
  | worktree_path | What it means | Action |
109
109
  |---------------|---------------|--------|
110
- | **Has a path** (e.g., `/path/to/.jettypod-work/...`) | Worktree exists, ready to proceed | Continue to Step 0 |
111
- | **NULL or empty** | `work start` was not called | **STOP - run `jettypod work start [chore-id]` first** |
112
- | **No rows returned** | No chore is in progress | **STOP - verify the chore exists and run `work start`** |
110
+ | **Has a path** (e.g., `/path/to/.jettypod-work/...`) | Worktree exists, ready to proceed | Continue to Step 0 |
111
+ | **NULL or empty** | `work start` was not called | **STOP - run `jettypod work start [chore-id]` first** |
112
+ | **No rows returned** | No chore is in progress | **STOP - verify the chore exists and run `work start`** |
113
113
 
114
- **🛑 STOP GATE:** If `worktree_path` is NULL or no rows returned, you MUST run `jettypod work start [chore-id]` before continuing. DO NOT proceed without a valid worktree.
114
+ **STOP GATE:** If `worktree_path` is NULL or no rows returned, you MUST run `jettypod work start [chore-id]` before continuing. DO NOT proceed without a valid worktree.
115
115
 
116
116
  **Example of valid output:**
117
117
  ```
@@ -126,7 +126,7 @@ sqlite3 .jettypod/work.db "SELECT wi.id, wi.title, wi.status, wt.worktree_path,
126
126
 
127
127
  ---
128
128
 
129
- ## 🔒 WORKTREE PATH LOCK
129
+ ## WORKTREE PATH LOCK
130
130
 
131
131
  **After pre-flight validation passes, capture and lock the worktree path:**
132
132
 
@@ -135,7 +135,7 @@ From the pre-flight query output, extract and store:
135
135
 
136
136
  **Display:**
137
137
  ```
138
- 🔒 WORKTREE LOCK ACTIVE
138
+ WORKTREE LOCK ACTIVE
139
139
  Path: ${WORKTREE_PATH}
140
140
 
141
141
  All file writes will use this path.
@@ -171,7 +171,7 @@ jettypod ui gate worktree-started --data='{"path":"${WORKTREE_PATH}"}'
171
171
  **User Profile:** May not know how to code - Claude Code does the implementation autonomously.
172
172
 
173
173
  <details>
174
- <summary><strong>📋 Speed Mode Constraints (click to expand)</strong></summary>
174
+ <summary><strong>Speed Mode Constraints (click to expand)</strong></summary>
175
175
 
176
176
  **What to implement:**
177
177
  - **Integration** - wire feature into the app so it's reachable (Integration Scenario)
@@ -180,10 +180,10 @@ jettypod ui gate worktree-started --data='{"path":"${WORKTREE_PATH}"}'
180
180
  - Success variations (different outcomes that are all correct)
181
181
 
182
182
  **What NOT to implement:**
183
- - Error handling (try/catch, validation, edge cases)
184
- - Input validation (null checks, type checks, range validation)
185
- - Error messages for failures
186
- - Edge case handling (empty arrays, boundary values, race conditions)
183
+ - Error handling (try/catch, validation, edge cases)
184
+ - Input validation (null checks, type checks, range validation)
185
+ - Error messages for failures
186
+ - Edge case handling (empty arrays, boundary values, race conditions)
187
187
 
188
188
  **Code organization:**
189
189
  - Single file when possible - keep it simple
@@ -195,7 +195,7 @@ jettypod ui gate worktree-started --data='{"path":"${WORKTREE_PATH}"}'
195
195
 
196
196
  ---
197
197
 
198
- ## 🧪 Unit Testing in Speed Mode - True TDD
198
+ ## Unit Testing in Speed Mode - True TDD
199
199
 
200
200
  **Unit tests are written DURING the RED→GREEN loop, not after.**
201
201
 
@@ -218,7 +218,7 @@ jettypod ui gate worktree-started --data='{"path":"${WORKTREE_PATH}"}'
218
218
  - Check existing test files for patterns
219
219
 
220
220
  <details>
221
- <summary><strong>📋 TDD Example (click to expand)</strong></summary>
221
+ <summary><strong>TDD Example (click to expand)</strong></summary>
222
222
 
223
223
  ```javascript
224
224
  // Iteration 1: BDD step "Given a user exists" is failing
@@ -243,14 +243,14 @@ function createUser(name, email) {
243
243
 
244
244
  **Unit test scope in speed mode:**
245
245
  ```javascript
246
- // Speed mode unit tests (success paths)
246
+ // Speed mode unit tests (success paths)
247
247
  test('createUser creates user with valid data', () => {
248
248
  const user = createUser('John', 'john@example.com');
249
249
  expect(user.name).toBe('John');
250
250
  expect(user.email).toBe('john@example.com');
251
251
  });
252
252
 
253
- // NOT in speed mode (stable mode adds these)
253
+ // NOT in speed mode (stable mode adds these)
254
254
  test('createUser throws error for invalid email', () => {
255
255
  expect(() => createUser('John', 'invalid')).toThrow();
256
256
  });
@@ -267,14 +267,17 @@ test('createUser throws error for invalid email', () => {
267
267
  | Step | Location | Why |
268
268
  |------|----------|-----|
269
269
  | Step 3A | Before implementing (conditional) | User confirms implementation approach - only if ambiguous |
270
- | Step 7B | Before creating stable chores | User confirms proposed stable mode chores - always |
270
+ | Step 7C | Before writing stable scenarios | User confirms stable mode BDD scenarios - always |
271
+ | Step 7E | Before creating stable chores | User confirms proposed stable mode chores - always |
271
272
 
272
273
  **Where Claude Code executes autonomously:**
273
274
  - Steps 0-2: Initialize, analyze scenarios, analyze codebase
274
275
  - Step 3: Decision to skip/ask confirmation
275
276
  - Steps 4-5: RED baseline, RED→GREEN→REFACTOR loop
276
277
  - Step 6: Route to next chore OR transition to Step 7
277
- - Step 7 (after confirmation): Create chores, commit, set mode, invoke stable-mode
278
+ - Step 7A-7B: Validate BDD, merge final speed chore
279
+ - Step 7D: Write and merge confirmed stable scenarios
280
+ - Step 7F-7G (after chore confirmation): Create chores, set mode, invoke stable-mode
278
281
 
279
282
  ---
280
283
 
@@ -290,7 +293,7 @@ test('createUser throws error for invalid email', () => {
290
293
  sqlite3 .jettypod/work.db "SELECT wi.id, wi.title, wi.parent_id, parent.title as parent_title, parent.scenario_file, wt.worktree_path, wt.branch_name FROM work_items wi LEFT JOIN work_items parent ON wi.parent_id = parent.id LEFT JOIN worktrees wt ON wi.id = wt.work_item_id WHERE wi.status = 'in_progress' AND wi.type = 'chore'"
291
294
  ```
292
295
 
293
- **🔄 WORKFLOW INTEGRATION: Start workflow tracking**
296
+ **WORKFLOW INTEGRATION: Start workflow tracking**
294
297
 
295
298
  After getting the work context, register this skill execution:
296
299
 
@@ -304,7 +307,7 @@ This validates that `feature_planning_complete` gate is passed and creates an ex
304
307
 
305
308
  ```
306
309
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
307
- 🚀 SPEED MODE: Implementing Chore #[id]
310
+ SPEED MODE: Implementing Chore #[id]
308
311
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
309
312
 
310
313
  Chore: [title]
@@ -321,11 +324,11 @@ Analyzing BDD scenarios to determine implementation approach...
321
324
 
322
325
  ### Step 1: Check for Breadcrumbs and Analyze Scenario
323
326
 
324
- **🚫 FORBIDDEN: Writing Files at This Step**
327
+ **FORBIDDEN: Writing Files at This Step**
325
328
  ```
326
- Write tool to any path
327
- Edit tool to any path
328
- Any file creation or modification
329
+ Write tool to any path
330
+ Edit tool to any path
331
+ Any file creation or modification
329
332
  ```
330
333
  **This is an ANALYSIS step.** File writes happen in Step 5.
331
334
 
@@ -365,7 +368,7 @@ If all three sections exist, use them. Otherwise, fall back to autonomous analys
365
368
  **Display to user (with breadcrumbs):**
366
369
 
367
370
  ```
368
- 🚀 Speed Mode: [Chore Title]
371
+ Speed Mode: [Chore Title]
369
372
 
370
373
  Scenario steps addressed:
371
374
  [Steps from breadcrumbs]
@@ -382,7 +385,7 @@ Now analyzing codebase to finalize implementation approach...
382
385
  **Display to user (without breadcrumbs):**
383
386
 
384
387
  ```
385
- 🚀 Speed Mode: [Feature Name]
388
+ Speed Mode: [Feature Name]
386
389
 
387
390
  Happy Path Scenario:
388
391
  [Scenario title]
@@ -400,11 +403,11 @@ Now analyzing codebase to propose implementation...
400
403
 
401
404
  ### Step 2: Autonomous Codebase Analysis
402
405
 
403
- **🚫 FORBIDDEN: Writing Files at This Step**
406
+ **FORBIDDEN: Writing Files at This Step**
404
407
  ```
405
- Write tool to any path
406
- Edit tool to any path
407
- Any file creation or modification
408
+ Write tool to any path
409
+ Edit tool to any path
410
+ Any file creation or modification
408
411
  ```
409
412
  **This is an ANALYSIS step.** File writes happen in Step 5.
410
413
 
@@ -458,7 +461,7 @@ Decisions constrain your implementation approach - use them to guide technology
458
461
  **Display analysis results:**
459
462
 
460
463
  ```
461
- 📊 Codebase Analysis Complete
464
+ Codebase Analysis Complete
462
465
 
463
466
  Architectural Constraints:
464
467
  [List any epic decisions that apply]
@@ -476,7 +479,7 @@ Integration Points:
476
479
  Now proposing implementation approach...
477
480
  ```
478
481
 
479
- **🔄 WORKFLOW CHECKPOINT: Codebase analysis complete**
482
+ **WORKFLOW CHECKPOINT: Codebase analysis complete**
480
483
 
481
484
  ```bash
482
485
  jettypod workflow checkpoint <feature-id> --step=2
@@ -484,11 +487,11 @@ jettypod workflow checkpoint <feature-id> --step=2
484
487
 
485
488
  ### Step 3: Decide if Confirmation Needed
486
489
 
487
- **🚫 FORBIDDEN: Writing Files at This Step**
490
+ **FORBIDDEN: Writing Files at This Step**
488
491
  ```
489
- Write tool to any path
490
- Edit tool to any path
491
- Any file creation or modification
492
+ Write tool to any path
493
+ Edit tool to any path
494
+ Any file creation or modification
492
495
  ```
493
496
  **This is a DECISION step.** File writes happen in Step 5.
494
497
 
@@ -508,20 +511,20 @@ jettypod workflow checkpoint <feature-id> --step=2
508
511
 
509
512
  ### Step 3A: Propose Implementation Approach (Conditional)
510
513
 
511
- **🚫 FORBIDDEN: Writing Files at This Step**
514
+ **FORBIDDEN: Writing Files at This Step**
512
515
  ```
513
- Write tool to any path
514
- Edit tool to any path
515
- Any file creation or modification
516
+ Write tool to any path
517
+ Edit tool to any path
518
+ Any file creation or modification
516
519
  ```
517
520
  **This is a PROPOSAL step.** File writes happen in Step 5.
518
521
 
519
- **⚡ ASYNC BOUNDARY - Only execute this if confirmation needed**
522
+ **ASYNC BOUNDARY - Only execute this if confirmation needed**
520
523
 
521
524
  **Present your analysis and proposal to the user:**
522
525
 
523
526
  ```
524
- 💡 Implementation Proposal
527
+ Implementation Proposal
525
528
 
526
529
  I see multiple ways to approach this. Here's what I'm thinking:
527
530
 
@@ -536,7 +539,7 @@ I see multiple ways to approach this. Here's what I'm thinking:
536
539
  Sound good, or would you prefer a different approach?
537
540
  ```
538
541
 
539
- **⚡ WAIT for user confirmation or adjustments.**
542
+ **WAIT for user confirmation or adjustments.**
540
543
 
541
544
  If user adjusts: revise proposal and confirm again before proceeding.
542
545
 
@@ -544,6 +547,16 @@ If user adjusts: revise proposal and confirm again before proceeding.
544
547
 
545
548
  ---
546
549
 
550
+ ### BDD Step Definition Constraints (ENFORCED)
551
+
552
+ Before writing any step definitions, read `templates/bdd-guidance.md`. BANNED in step defs: `setTimeout`/`sleep`, module-level `let`/`var`, raw SQL, assertions in Given/When, loops/branching, self-fulfilling mocks (setting state then asserting it). Steps must be 1-5 lines calling one helper via Cucumber World (`this`). Read `features/support/helpers/` and reuse before creating.
553
+
554
+ **Scaffolding:** If `features/support/helpers/` does not exist in the project, scaffold it before writing step definitions. Copy `templates/bdd-scaffolding/wait.js` to `features/support/helpers/wait.js` and `templates/bdd-scaffolding/world.js` to `features/support/world.js`.
555
+
556
+ **Helper Reuse:** Before writing step definitions, glob `features/support/helpers/**/*.js` and read each file. Import and call existing helpers in your steps — never duplicate functionality that already exists.
557
+
558
+ ---
559
+
547
560
  ### Step 4: Establish RED Baseline
548
561
 
549
562
  **CRITICAL:** After user confirms, execute autonomously - no permission needed for code changes.
@@ -568,27 +581,27 @@ This establishes your RED baseline - all or most steps should be failing initial
568
581
 
569
582
  **Display RED baseline:**
570
583
  ```
571
- 🔴 Establishing RED baseline...
584
+ Establishing RED baseline...
572
585
 
573
586
  RED Baseline: 5 of 8 steps failing
574
587
 
575
588
  Failing steps:
576
- Given a user is logged in
577
- When they click the dashboard button
578
- Then they should see their dashboard
579
- And the dashboard should show their username
580
- And the dashboard should show their recent activity
589
+ Given a user is logged in
590
+ When they click the dashboard button
591
+ Then they should see their dashboard
592
+ And the dashboard should show their username
593
+ And the dashboard should show their recent activity
581
594
 
582
595
  First error:
583
596
  Step: Given a user is logged in
584
597
  Error: Error: login function is not defined
585
598
 
586
- 🎯 Goal: Make all steps pass
599
+ Goal: Make all steps pass
587
600
 
588
601
  Now implementing...
589
602
  ```
590
603
 
591
- **🔄 WORKFLOW CHECKPOINT: RED baseline established**
604
+ **WORKFLOW CHECKPOINT: RED baseline established**
592
605
 
593
606
  ```bash
594
607
  jettypod workflow checkpoint <feature-id> --step=4
@@ -598,9 +611,9 @@ jettypod workflow checkpoint <feature-id> --step=4
598
611
 
599
612
  ### Step 5: RED→GREEN→REFACTOR Loop
600
613
 
601
- **🔒 WORKTREE PATH REQUIRED:** All file writes MUST use the `WORKTREE_PATH` captured after pre-flight validation.
614
+ **WORKTREE PATH REQUIRED:** All file writes MUST use the `WORKTREE_PATH` captured after pre-flight validation.
602
615
 
603
- **✅ NOW you may write files** - worktree is locked, approach is confirmed.
616
+ **NOW you may write files** - worktree is locked, approach is confirmed.
604
617
 
605
618
  **Emit gate signal:**
606
619
 
@@ -623,23 +636,23 @@ jettypod ui gate implementing --data='{"description":"[speed mode implementation
623
636
  **Show progress each iteration:**
624
637
  ```
625
638
  ━━━ Iteration 3/10 ━━━
626
- 📝 Unit test: test/dashboard.test.js - sortActivityByDate()
639
+ Unit test: test/dashboard.test.js - sortActivityByDate()
627
640
  RED: Test fails - function doesn't exist yet
628
- ✍️ Implementation: src/dashboard.js - added sortActivityByDate()
641
+ Implementation: src/dashboard.js - added sortActivityByDate()
629
642
  GREEN: Unit test passes
630
- 🧪 Running BDD scenarios...
631
- 📊 Progress: 7/8 BDD steps passing
632
- Newly passing: And activity should be sorted by date
633
- 🔧 Next failure: And activity should be filterable
643
+ Running BDD scenarios...
644
+ Progress: 7/8 BDD steps passing
645
+ Newly passing: And activity should be sorted by date
646
+ Next failure: And activity should be filterable
634
647
  BDD step: When I filter by category "work"
635
648
  ```
636
649
 
637
650
  **When GREEN achieved:**
638
651
  ```
639
- 🎉 GREEN: All success scenarios passing!
652
+ GREEN: All success scenarios passing!
640
653
  ```
641
654
 
642
- **🔄 WORKFLOW CHECKPOINT: GREEN achieved**
655
+ **WORKFLOW CHECKPOINT: GREEN achieved**
643
656
 
644
657
  ```bash
645
658
  jettypod workflow checkpoint <feature-id> --step=5
@@ -654,7 +667,7 @@ jettypod workflow checkpoint <feature-id> --step=5
654
667
  **Re-run tests after refactor** to ensure nothing broke.
655
668
 
656
669
  <details>
657
- <summary><strong>📋 TDD Loop Guidelines (click to expand)</strong></summary>
670
+ <summary><strong>TDD Loop Guidelines (click to expand)</strong></summary>
658
671
 
659
672
  **Iteration strategy:**
660
673
  - Start with first failing step
@@ -674,6 +687,8 @@ jettypod workflow checkpoint <feature-id> --step=5
674
687
 
675
688
  </details>
676
689
 
690
+ **Quality Gate:** Before committing, review every `.steps.js` file you wrote or modified. Check for banlist violations: `setTimeout`/`sleep`, module-level `let`/`var`, raw SQL, assertions in Given/When, self-fulfilling mocks, steps longer than 5 lines. Fix violations before proceeding.
691
+
677
692
  ---
678
693
 
679
694
  ### Step 6: Route After Chore Completion
@@ -696,10 +711,10 @@ sqlite3 .jettypod/work.db "SELECT id, title FROM work_items WHERE parent_id = <f
696
711
 
697
712
  ```
698
713
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
699
- 🎯 Speed Mode Chore Complete
714
+ Speed Mode Chore Complete
700
715
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
701
716
 
702
- Success scenarios pass for this chore
717
+ Success scenarios pass for this chore
703
718
 
704
719
  More speed mode chores remain. Starting next chore:
705
720
  #[next-chore-id]: [next-chore-title]
@@ -741,7 +756,7 @@ If the query returns no remaining chores, proceed to Step 7.
741
756
 
742
757
  ### Step 7: Transition to Stable Mode
743
758
 
744
- **🛑 CRITICAL: This step ONLY runs after ALL speed chores are complete.**
759
+ **CRITICAL: This step ONLY runs after ALL speed chores are complete.**
745
760
 
746
761
  This is the transition from speed mode to stable mode. Follow these phases in order.
747
762
 
@@ -821,42 +836,95 @@ jettypod work cleanup [current-chore-id]
821
836
 
822
837
  After cleanup, you are on main branch. Ready to generate stable mode scenarios.
823
838
 
824
- #### Step 7C: Generate and Propose Stable Mode Chores
839
+ #### Step 7C: Present Stable Mode Scenarios for Review
840
+
841
+ **FORBIDDEN: Writing Files at This Step**
842
+ ```
843
+ Write tool to any path
844
+ Edit tool to any path
845
+ Any file creation or modification
846
+ ```
847
+ **This is a PROPOSAL step.** File writes happen in Step 7D after user confirmation.
825
848
 
826
- **⚡ ASYNC BOUNDARY - Must wait for user confirmation**
849
+ **ASYNC BOUNDARY - Must wait for user confirmation**
827
850
 
828
- **1. Create a test worktree for writing stable mode scenarios:**
851
+ **1. Read the feature's scenario file and analyze for stable mode needs:**
829
852
 
830
- **🚫 FORBIDDEN: Manual Git Worktree Commands**
853
+ ```bash
854
+ sqlite3 .jettypod/work.db "SELECT id, title, scenario_file FROM work_items WHERE id = <feature-id>"
831
855
  ```
832
- ❌ git worktree add ...
833
- git checkout -b tests/...
834
- git branch tests/...
856
+
857
+ **2. Generate stable mode BDD scenarios** covering:
858
+ - **Error scenarios** - Invalid input, missing params, system errors, permission failures
859
+ - **Edge cases** - Empty inputs, boundary values, special characters
860
+ - **State consistency** - Concurrent ops, partial failures, invalid state transitions
861
+
862
+ **3. Present proposed scenarios to user for review:**
863
+
835
864
  ```
836
- **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.
865
+ Stable Mode Scenarios
866
+
867
+ I've drafted [N] stable mode scenarios covering error handling and edge cases.
868
+ Please review — these are the contract for what stable mode will implement.
869
+
870
+ **Error Handling:**
871
+
872
+ Scenario: [Error scenario title]
873
+ Given [context]
874
+ When [error condition]
875
+ Then [expected error handling]
876
+
877
+ Scenario: [Error scenario title]
878
+ Given [context]
879
+ When [error condition]
880
+ Then [expected error handling]
881
+
882
+ **Edge Cases:**
883
+
884
+ Scenario: [Edge case title]
885
+ Given [context]
886
+ When [edge case input]
887
+ Then [expected behavior]
888
+
889
+ Does this capture the error handling and edge cases correctly?
890
+ Any scenarios to add, change, or remove?
891
+ ```
892
+
893
+ **WAIT for user confirmation or adjustments.**
894
+
895
+ If user requests changes, revise the scenarios and re-present until confirmed.
896
+
897
+ **WORKFLOW CHECKPOINT: Stable mode scenarios confirmed**
837
898
 
838
899
  ```bash
839
- jettypod work tests <feature-id>
900
+ jettypod workflow checkpoint <feature-id> --step=7C
840
901
  ```
841
902
 
842
- This creates an isolated worktree at `.jettypod-work/tests-<id>-<slug>` with branch `tests/feature-<id>-<slug>`.
903
+ #### Step 7D: Write and Merge Stable Mode Scenarios
843
904
 
844
- **🛑 CRITICAL:** All BDD file operations MUST use absolute paths in the test worktree:
845
- - ✅ `/path/to/.jettypod-work/tests-42-login/features/login.feature`
846
- - ❌ `features/login.feature` (this would write to main repo!)
905
+ **After user confirms scenarios, execute autonomously.**
847
906
 
848
- **2. Read the feature's scenario file and analyze for stable mode needs:**
907
+ **1. Create a test worktree for writing stable mode scenarios:**
908
+
909
+ **FORBIDDEN: Manual Git Worktree Commands**
910
+ ```
911
+ git worktree add ...
912
+ git checkout -b tests/...
913
+ git branch tests/...
914
+ ```
915
+ **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.
849
916
 
850
917
  ```bash
851
- sqlite3 .jettypod/work.db "SELECT id, title, scenario_file FROM work_items WHERE id = <feature-id>"
918
+ jettypod work tests <feature-id>
852
919
  ```
853
920
 
854
- **3. Generate stable mode BDD scenarios** covering:
855
- - **Error scenarios** - Invalid input, missing params, system errors, permission failures
856
- - **Edge cases** - Empty inputs, boundary values, special characters
857
- - **State consistency** - Concurrent ops, partial failures, invalid state transitions
921
+ This creates an isolated worktree at `.jettypod-work/tests-<id>-<slug>` with branch `tests/feature-<id>-<slug>`.
858
922
 
859
- **4. Append scenarios to the feature file IN THE TEST WORKTREE:**
923
+ **CRITICAL:** All BDD file operations MUST use absolute paths in the test worktree:
924
+ - `/path/to/.jettypod-work/tests-42-login/features/login.feature`
925
+ - `features/login.feature` (this would write to main repo!)
926
+
927
+ **2. Append confirmed scenarios to the feature file IN THE TEST WORKTREE:**
860
928
 
861
929
  Use the Edit tool to append to `<worktree-path>/features/<feature-file>`:
862
930
 
@@ -874,11 +942,11 @@ Scenario: [Edge case title]
874
942
  Then [expected behavior]
875
943
  ```
876
944
 
877
- **5. Create step definitions IN THE TEST WORKTREE** at `<worktree-path>/features/step_definitions/<feature-slug>-stable.steps.js`
945
+ **3. Create step definitions IN THE TEST WORKTREE** at `<worktree-path>/features/step_definitions/<feature-slug>-stable.steps.js`
878
946
 
879
- **6. Commit and merge the test worktree:**
947
+ **4. Commit and merge the test worktree:**
880
948
 
881
- **🚨 CRITICAL: Shell CWD Corruption Prevention**
949
+ **CRITICAL: Shell CWD Corruption Prevention**
882
950
 
883
951
  The merge will delete the test worktree. If your shell is inside that worktree, ALL subsequent commands will fail. You MUST:
884
952
  1. Chain the cd and merge in a SINGLE bash command
@@ -911,14 +979,16 @@ pwd && ls .jettypod # verify
911
979
  jettypod work cleanup <feature-id>
912
980
  ```
913
981
 
914
- **7. Present proposal to user:**
982
+ #### Step 7E: Propose Stable Mode Chores
915
983
 
916
- ```
917
- 📋 Stable Mode Transition
984
+ **ASYNC BOUNDARY - Must wait for user confirmation**
918
985
 
919
- I've generated [N] stable mode scenarios covering error handling and edge cases.
986
+ **Present chore proposals to user:**
987
+
988
+ ```
989
+ Stable Mode Chores
920
990
 
921
- Here are the chores needed to make these scenarios pass:
991
+ Scenarios are committed. Here are the chores needed to make them pass:
922
992
 
923
993
  **Chore 1: [Title]**
924
994
  - Why: [What gap this fills]
@@ -933,9 +1003,9 @@ Here are the chores needed to make these scenarios pass:
933
1003
  Sound good? I'll create these chores once you confirm.
934
1004
  ```
935
1005
 
936
- **⚡ WAIT for user confirmation or adjustments.**
1006
+ **WAIT for user confirmation or adjustments.**
937
1007
 
938
- #### Step 7D: Create Chores and Complete Transition
1008
+ #### Step 7F: Create Chores and Complete Transition
939
1009
 
940
1010
  **After user confirms, execute autonomously:**
941
1011
 
@@ -945,15 +1015,26 @@ Sound good? I'll create these chores once you confirm.
945
1015
  jettypod work set-mode <feature-id> stable
946
1016
  ```
947
1017
 
948
- **🛑 CRITICAL:** You MUST set mode to stable BEFORE creating chores. The system blocks chore creation while feature is in speed mode.
1018
+ **CRITICAL:** You MUST set mode to stable BEFORE creating chores. The system blocks chore creation while feature is in speed mode.
949
1019
 
950
1020
  **2. Create stable mode chores:**
951
1021
 
1022
+ For each confirmed chore, use the **Write** tool to create `/tmp/jettypod-create.json`:
1023
+ ```json
1024
+ {
1025
+ "type": "chore",
1026
+ "title": "[Chore title]",
1027
+ "description": "[Description with scenarios addressed]",
1028
+ "parent": <feature-id>
1029
+ }
1030
+ ```
1031
+
1032
+ Then run via **Bash**:
952
1033
  ```bash
953
- jettypod work create chore "[Chore title]" "[Description with scenarios addressed]" --parent=<feature-id>
1034
+ jettypod work create --from=/tmp/jettypod-create.json
954
1035
  ```
955
1036
 
956
- Repeat for each confirmed chore. **Do NOT use `--mode` flag** - chores inherit mode from their parent feature.
1037
+ Repeat for each confirmed chore. **Do NOT add a `mode` field** - chores inherit mode from their parent feature.
957
1038
 
958
1039
  **3. Release merge lock (CRITICAL: separate Bash calls):**
959
1040
 
@@ -965,7 +1046,7 @@ cd <main-repo> # Bash call 1
965
1046
  jettypod work merge <last-chore-id> --release-lock # Bash call 2
966
1047
  ```
967
1048
 
968
- **🔄 WORKFLOW COMPLETE: Speed mode finished**
1049
+ **WORKFLOW COMPLETE: Speed mode finished**
969
1050
 
970
1051
  Mark speed mode as complete (this passes the `speed_mode_complete` gate, enabling stable-mode):
971
1052
 
@@ -979,9 +1060,9 @@ jettypod workflow complete speed-mode <feature-id>
979
1060
  jettypod ui gate complete --data='{"summary":"Speed mode complete - transitioning to stable mode","files":["[files implemented]"]}'
980
1061
  ```
981
1062
 
982
- #### Step 7E: Start First Stable Chore and Invoke Stable Mode Skill
1063
+ #### Step 7G: Start First Stable Chore and Invoke Stable Mode Skill
983
1064
 
984
- **🛑 CRITICAL HANDOFF - You MUST start the first chore BEFORE invoking stable-mode.**
1065
+ **CRITICAL HANDOFF - You MUST start the first chore BEFORE invoking stable-mode.**
985
1066
 
986
1067
  **1. Get the first stable chore:**
987
1068
 
@@ -997,12 +1078,12 @@ Note: Chores don't have a `mode` column - they inherit context from their parent
997
1078
  jettypod work start <first-stable-chore-id>
998
1079
  ```
999
1080
 
1000
- **🛑 STOP AND CHECK:** Look at the output. You should see:
1081
+ **STOP AND CHECK:** Look at the output. You should see:
1001
1082
  ```
1002
- Created worktree: /path/to/.jettypod-work/[id]-[title-slug]
1083
+ Created worktree: /path/to/.jettypod-work/[id]-[title-slug]
1003
1084
  ```
1004
1085
 
1005
- If you see `⚠️ Working in main repository (worktree creation failed)`, fix the issue before continuing.
1086
+ If you see `Working in main repository (worktree creation failed)`, fix the issue before continuing.
1006
1087
 
1007
1088
  **3. Verify worktree exists:**
1008
1089
 
@@ -1016,21 +1097,21 @@ If empty, **STOP** - worktree wasn't created properly.
1016
1097
 
1017
1098
  ```
1018
1099
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1019
- 🎯 Speed Mode Complete! Transitioning to Stable Mode
1100
+ Speed Mode Complete! Transitioning to Stable Mode
1020
1101
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1021
1102
 
1022
- ⚠️ CRITICAL: Speed mode is ONLY a checkpoint.
1103
+ CRITICAL: Speed mode is ONLY a checkpoint.
1023
1104
  The feature is INCOMPLETE without stable mode.
1024
1105
 
1025
1106
  What we accomplished:
1026
- All speed mode chores complete
1027
- Generated [N] stable mode BDD scenarios
1028
- Created step definitions for stable scenarios
1029
- Created [N] stable mode chores
1030
- Feature mode set to stable
1031
- Started first stable chore #[id]
1107
+ All speed mode chores complete
1108
+ Generated [N] stable mode BDD scenarios
1109
+ Created step definitions for stable scenarios
1110
+ Created [N] stable mode chores
1111
+ Feature mode set to stable
1112
+ Started first stable chore #[id]
1032
1113
 
1033
- 🚀 Now invoking stable-mode skill...
1114
+ Now invoking stable-mode skill...
1034
1115
  ```
1035
1116
 
1036
1117
  **5. Invoke stable-mode:**
@@ -1039,7 +1120,7 @@ What we accomplished:
1039
1120
  Use the Skill tool with skill: "stable-mode"
1040
1121
  ```
1041
1122
 
1042
- **🛑 CRITICAL:** You MUST:
1123
+ **CRITICAL:** You MUST:
1043
1124
  1. Run `work start` for the first stable chore
1044
1125
  2. Verify the worktree was created
1045
1126
  3. THEN invoke stable-mode using the Skill tool
@@ -1097,12 +1178,12 @@ jettypod work cleanup <feature-id> # Clean up worktree
1097
1178
  jettypod work set-mode <feature-id> stable
1098
1179
  ```
1099
1180
 
1100
- **Create chores (AFTER setting mode):**
1181
+ **Create chores (AFTER setting mode) — use Write tool for JSON, then:**
1101
1182
  ```bash
1102
- jettypod work create chore "<title>" "<description>" --parent=<feature-id>
1183
+ jettypod work create --from=/tmp/jettypod-create.json
1103
1184
  ```
1104
- Note: Do NOT use `--mode` flag - chores inherit mode from parent feature.
1185
+ Note: Do NOT add `mode` field in JSON - chores inherit mode from parent feature.
1105
1186
 
1106
- **❌ DO NOT use these to complete chores:**
1187
+ **DO NOT use these to complete chores:**
1107
1188
  - `jettypod work status <id> done`
1108
1189
  - `jettypod work complete <id>`