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
@@ -18,7 +18,7 @@ description: Guide implementation of stable mode chores with comprehensive testi
18
18
  └─────────────────────────────────────────────────────────────────────┘
19
19
  ```
20
20
 
21
- ## 🛑 CRITICAL HANDOFF REQUIREMENT
21
+ ## CRITICAL HANDOFF REQUIREMENT
22
22
 
23
23
  **After completing ALL stable mode chores:**
24
24
 
@@ -30,7 +30,7 @@ description: Guide implementation of stable mode chores with comprehensive testi
30
30
  1. Set feature mode to production
31
31
  2. **IMMEDIATELY invoke production-mode using the Skill tool**
32
32
 
33
- **🛑 STOP GATE:** For external projects, DO NOT end this skill without invoking production-mode. Stable mode makes it robust - production mode makes it ready for real users at scale.
33
+ **STOP GATE:** For external projects, DO NOT end this skill without invoking production-mode. Stable mode makes it robust - production mode makes it ready for real users at scale.
34
34
 
35
35
  ---
36
36
 
@@ -40,7 +40,7 @@ Guides Claude Code through stable mode implementation with comprehensive testing
40
40
 
41
41
  When this skill is activated, you are helping implement a stable mode chore to add comprehensive testing and error handling. Follow this structured approach:
42
42
 
43
- ## 🔑 Critical Context
43
+ ## Critical Context
44
44
 
45
45
  **You are working in an isolated git worktree:**
46
46
  - `work start [chore-id]` created a dedicated worktree for this chore
@@ -52,7 +52,7 @@ When this skill is activated, you are helping implement a stable mode chore to a
52
52
 
53
53
  ---
54
54
 
55
- ## 🚨 SHELL CWD RECOVERY
55
+ ## SHELL CWD RECOVERY
56
56
 
57
57
  **If ALL bash commands start failing with "Error: Exit code 1" and no output:**
58
58
 
@@ -68,7 +68,7 @@ Your shell's working directory was likely inside a worktree that was deleted. Th
68
68
 
69
69
  ---
70
70
 
71
- ## 🛑 PRE-FLIGHT VALIDATION (REQUIRED)
71
+ ## PRE-FLIGHT VALIDATION (REQUIRED)
72
72
 
73
73
  **Before proceeding with ANY implementation, you MUST validate the worktree exists.**
74
74
 
@@ -82,17 +82,17 @@ sqlite3 .jettypod/work.db "SELECT wi.id, wi.title, wi.status, wt.worktree_path,
82
82
 
83
83
  | worktree_path | What it means | Action |
84
84
  |---------------|---------------|--------|
85
- | **Has a path** (e.g., `/path/to/.jettypod-work/...`) | Worktree exists, ready to proceed | Continue to Step 0 |
86
- | **NULL or empty** | `work start` was not called | **STOP - run `jettypod work start [chore-id]` first** |
87
- | **No rows returned** | No chore is in progress | **STOP - verify the chore exists and run `work start`** |
85
+ | **Has a path** (e.g., `/path/to/.jettypod-work/...`) | Worktree exists, ready to proceed | Continue to Step 0 |
86
+ | **NULL or empty** | `work start` was not called | **STOP - run `jettypod work start [chore-id]` first** |
87
+ | **No rows returned** | No chore is in progress | **STOP - verify the chore exists and run `work start`** |
88
88
 
89
- **🛑 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.
89
+ **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.
90
90
 
91
- **🚫 FORBIDDEN: Manual Git Worktree Commands**
91
+ **FORBIDDEN: Manual Git Worktree Commands**
92
92
  ```
93
- git worktree add ...
94
- git checkout -b feature/...
95
- git branch feature/...
93
+ git worktree add ...
94
+ git checkout -b feature/...
95
+ git branch feature/...
96
96
  ```
97
97
  **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.
98
98
 
@@ -109,7 +109,7 @@ sqlite3 .jettypod/work.db "SELECT wi.id, wi.title, wi.status, wt.worktree_path,
109
109
 
110
110
  ---
111
111
 
112
- ## 🔒 WORKTREE PATH LOCK
112
+ ## WORKTREE PATH LOCK
113
113
 
114
114
  **After pre-flight validation passes, capture and lock the worktree path:**
115
115
 
@@ -119,7 +119,7 @@ From the pre-flight query output, extract and store:
119
119
  **Display:**
120
120
 
121
121
  ```
122
- 🔒 WORKTREE LOCK ACTIVE
122
+ WORKTREE LOCK ACTIVE
123
123
  Path: ${WORKTREE_PATH}
124
124
 
125
125
  All file writes will use this path.
@@ -154,7 +154,7 @@ jettypod ui gate worktree-started --data='{"path":"${WORKTREE_PATH}"}'
154
154
  **User Profile:** May not know how to code - Claude Code does the implementation autonomously.
155
155
 
156
156
  <details>
157
- <summary><strong>📋 What Stable Mode Includes (click to expand)</strong></summary>
157
+ <summary><strong>What Stable Mode Includes (click to expand)</strong></summary>
158
158
 
159
159
  **Stable Mode is NOT just error handling. It includes:**
160
160
 
@@ -194,7 +194,7 @@ jettypod ui gate worktree-started --data='{"path":"${WORKTREE_PATH}"}'
194
194
 
195
195
  ---
196
196
 
197
- ## 🧪 Unit Testing in Stable Mode - True TDD
197
+ ## Unit Testing in Stable Mode - True TDD
198
198
 
199
199
  **Unit tests are written DURING implementation, not after.**
200
200
 
@@ -214,10 +214,10 @@ jettypod ui gate worktree-started --data='{"path":"${WORKTREE_PATH}"}'
214
214
  - State consistency (transaction rollback, cleanup on failure)
215
215
 
216
216
  <details>
217
- <summary><strong>📋 Unit Test Examples (click to expand)</strong></summary>
217
+ <summary><strong>Unit Test Examples (click to expand)</strong></summary>
218
218
 
219
219
  ```javascript
220
- // Stable mode unit tests (error paths and edge cases)
220
+ // Stable mode unit tests (error paths and edge cases)
221
221
  test('createUser throws ValidationError for null email', () => {
222
222
  expect(() => createUser('John', null)).toThrow(ValidationError);
223
223
  expect(() => createUser('John', null)).toThrow('Email is required');
@@ -266,7 +266,7 @@ test('getUserById returns null for non-existent user', () => {
266
266
  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'"
267
267
  ```
268
268
 
269
- **🔄 WORKFLOW INTEGRATION: Start workflow tracking**
269
+ **WORKFLOW INTEGRATION: Start workflow tracking**
270
270
 
271
271
  After getting the work context, register this skill execution:
272
272
 
@@ -280,7 +280,7 @@ This validates that `speed_mode_complete` gate is passed and creates an executio
280
280
 
281
281
  ```
282
282
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
283
- 🛡️ STABLE MODE: Implementing Chore #[id]
283
+ STABLE MODE: Implementing Chore #[id]
284
284
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
285
285
 
286
286
  Chore: [title]
@@ -299,11 +299,11 @@ Analyzing stable mode BDD scenarios to determine what error handling and validat
299
299
 
300
300
  **CRITICAL:** Claude Code executes this autonomously - no user permission needed.
301
301
 
302
- **🚫 FORBIDDEN: Writing Files at This Step**
302
+ **FORBIDDEN: Writing Files at This Step**
303
303
  ```
304
- Write tool to any path
305
- Edit tool to any path
306
- Any file creation or modification
304
+ Write tool to any path
305
+ Edit tool to any path
306
+ Any file creation or modification
307
307
  ```
308
308
  **This is an ANALYSIS step.** File writes happen in Step 5.
309
309
 
@@ -331,15 +331,15 @@ sqlite3 .jettypod/work.db "SELECT wi.id, wi.title, wi.description, wi.parent_id,
331
331
  4. If no match found, list available scenarios and ask which one to implement
332
332
 
333
333
  **Handle errors gracefully:**
334
- - If no current work: "No current work found. Run: jettypod work start <chore-id>"
335
- - If no parent feature: "Current work has no parent feature."
336
- - If no scenario_file: "Feature has no scenario_file."
334
+ - If no current work: "No current work found. Run: jettypod work start <chore-id>"
335
+ - If no parent feature: "Current work has no parent feature."
336
+ - If no scenario_file: "Feature has no scenario_file."
337
337
  - If can't match chore to scenario: List available scenarios and ask user
338
338
 
339
339
  **Display to user:**
340
340
 
341
341
  ```
342
- 🧪 Stable Mode: [Feature Name]
342
+ Stable Mode: [Feature Name]
343
343
 
344
344
  Target Scenario:
345
345
  [Scenario title]
@@ -364,11 +364,11 @@ Now reviewing speed mode implementation...
364
364
 
365
365
  **CRITICAL:** Claude Code executes this autonomously - no user permission needed.
366
366
 
367
- **🚫 FORBIDDEN: Writing Files at This Step**
367
+ **FORBIDDEN: Writing Files at This Step**
368
368
  ```
369
- Write tool to any path
370
- Edit tool to any path
371
- Any file creation or modification
369
+ Write tool to any path
370
+ Edit tool to any path
371
+ Any file creation or modification
372
372
  ```
373
373
  **This is an ANALYSIS step.** File writes happen in Step 5.
374
374
 
@@ -399,14 +399,14 @@ Then use the Read tool to examine the implementation files.
399
399
  **Display analysis:**
400
400
 
401
401
  ```
402
- 📊 Code Analysis Complete
402
+ Code Analysis Complete
403
403
 
404
404
  Current Implementation:
405
405
  • Files: [list]
406
- • Success scenarios: Working (from speed mode)
407
- • Error handling: Missing [specific gaps]
408
- • Validation: Missing [specific gaps]
409
- • Edge cases: Not handled [specific gaps]
406
+ • Success scenarios: Working (from speed mode)
407
+ • Error handling: Missing [specific gaps]
408
+ • Validation: Missing [specific gaps]
409
+ • Edge cases: Not handled [specific gaps]
410
410
 
411
411
  To pass the target scenario, I need to:
412
412
  1. [Specific change]
@@ -416,7 +416,7 @@ To pass the target scenario, I need to:
416
416
  Now proposing comprehensive implementation...
417
417
  ```
418
418
 
419
- **🔄 WORKFLOW CHECKPOINT: Code analysis complete**
419
+ **WORKFLOW CHECKPOINT: Code analysis complete**
420
420
 
421
421
  ```bash
422
422
  jettypod workflow checkpoint <feature-id> --step=2
@@ -424,11 +424,11 @@ jettypod workflow checkpoint <feature-id> --step=2
424
424
 
425
425
  ### Step 3: Decide if Confirmation Needed
426
426
 
427
- **🚫 FORBIDDEN: Writing Files at This Step**
427
+ **FORBIDDEN: Writing Files at This Step**
428
428
  ```
429
- Write tool to any path
430
- Edit tool to any path
431
- Any file creation or modification
429
+ Write tool to any path
430
+ Edit tool to any path
431
+ Any file creation or modification
432
432
  ```
433
433
  **This is a DECISION step.** File writes happen in Step 5.
434
434
 
@@ -448,20 +448,20 @@ jettypod workflow checkpoint <feature-id> --step=2
448
448
 
449
449
  ### Step 3A: Propose Implementation Approach (Conditional)
450
450
 
451
- **⚡ ASYNC BOUNDARY - Only execute this if confirmation needed**
451
+ **ASYNC BOUNDARY - Only execute this if confirmation needed**
452
452
 
453
- **🚫 FORBIDDEN: Writing Files at This Step**
453
+ **FORBIDDEN: Writing Files at This Step**
454
454
  ```
455
- Write tool to any path
456
- Edit tool to any path
457
- Any file creation or modification
455
+ Write tool to any path
456
+ Edit tool to any path
457
+ Any file creation or modification
458
458
  ```
459
459
  **This is a PROPOSAL step.** File writes happen in Step 5.
460
460
 
461
461
  **Present your analysis and proposal to the user:**
462
462
 
463
463
  ```
464
- 💡 Implementation Proposal
464
+ Implementation Proposal
465
465
 
466
466
  I see multiple ways to approach this error handling. Here's what I'm thinking:
467
467
 
@@ -476,7 +476,7 @@ I see multiple ways to approach this error handling. Here's what I'm thinking:
476
476
  Sound good, or would you prefer a different approach?
477
477
  ```
478
478
 
479
- **⚡ WAIT for user confirmation or adjustments.**
479
+ **WAIT for user confirmation or adjustments.**
480
480
 
481
481
  If user adjusts: revise proposal and confirm again before proceeding.
482
482
 
@@ -484,6 +484,16 @@ If user adjusts: revise proposal and confirm again before proceeding.
484
484
 
485
485
  ---
486
486
 
487
+ ### BDD Step Definition Constraints (ENFORCED)
488
+
489
+ 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.
490
+
491
+ **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`.
492
+
493
+ **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.
494
+
495
+ ---
496
+
487
497
  ### Step 4: Establish RED Baseline
488
498
 
489
499
  **CRITICAL:** After user confirms (or skips confirmation), execute autonomously - no permission needed for code changes.
@@ -528,25 +538,25 @@ Parse the output to identify:
528
538
 
529
539
  **Display RED baseline:**
530
540
  ```
531
- 🔴 Establishing RED baseline...
541
+ Establishing RED baseline...
532
542
 
533
543
  RED Baseline: 3 of 11 steps failing (stable mode scenarios)
534
544
 
535
545
  Failing steps:
536
- Then it should throw a validation error
537
- And the error message should be "Email is required"
538
- When I provide an empty string as input
546
+ Then it should throw a validation error
547
+ And the error message should be "Email is required"
548
+ When I provide an empty string as input
539
549
 
540
550
  First error:
541
551
  Step: Then it should throw a validation error
542
552
  Error: Error: Expected function to throw but it didn't
543
553
 
544
- 🎯 Goal: Make all stable mode scenarios pass
554
+ Goal: Make all stable mode scenarios pass
545
555
 
546
556
  Now implementing...
547
557
  ```
548
558
 
549
- **🔄 WORKFLOW CHECKPOINT: RED baseline established**
559
+ **WORKFLOW CHECKPOINT: RED baseline established**
550
560
 
551
561
  ```bash
552
562
  jettypod workflow checkpoint <feature-id> --step=4
@@ -556,9 +566,9 @@ jettypod workflow checkpoint <feature-id> --step=4
556
566
 
557
567
  ### Step 5: RED→GREEN→REFACTOR Loop
558
568
 
559
- **🔒 WORKTREE PATH REQUIRED:** All file writes MUST use the `WORKTREE_PATH` captured after pre-flight validation.
569
+ **WORKTREE PATH REQUIRED:** All file writes MUST use the `WORKTREE_PATH` captured after pre-flight validation.
560
570
 
561
- **✅ NOW you may write files** - worktree is locked, approach is confirmed.
571
+ **NOW you may write files** - worktree is locked, approach is confirmed.
562
572
 
563
573
  **Emit gate signal:**
564
574
 
@@ -581,23 +591,23 @@ jettypod ui gate implementing --data='{"description":"[stable mode error handlin
581
591
  **Show progress each iteration:**
582
592
  ```
583
593
  ━━━ Iteration 3/10 ━━━
584
- 📝 Unit test: test/user.test.js - validates email format
594
+ Unit test: test/user.test.js - validates email format
585
595
  RED: Test fails - no validation exists yet
586
- ✍️ Implementation: src/user.js - added email format validation
596
+ Implementation: src/user.js - added email format validation
587
597
  GREEN: Unit test passes
588
- 🧪 Running BDD scenarios...
589
- 📊 Progress: 9/11 BDD steps passing
590
- Newly passing: Then it should throw a validation error
591
- 🔧 Next failure: And the error message should be user-friendly
598
+ Running BDD scenarios...
599
+ Progress: 9/11 BDD steps passing
600
+ Newly passing: Then it should throw a validation error
601
+ Next failure: And the error message should be user-friendly
592
602
  BDD step: Then the error message should be "Email format is invalid"
593
603
  ```
594
604
 
595
605
  **When GREEN achieved:**
596
606
  ```
597
- 🎉 GREEN: All stable mode scenarios passing!
607
+ GREEN: All stable mode scenarios passing!
598
608
  ```
599
609
 
600
- **🔄 WORKFLOW CHECKPOINT: GREEN achieved**
610
+ **WORKFLOW CHECKPOINT: GREEN achieved**
601
611
 
602
612
  ```bash
603
613
  jettypod workflow checkpoint <feature-id> --step=5
@@ -612,7 +622,7 @@ jettypod workflow checkpoint <feature-id> --step=5
612
622
  **Re-run tests after refactor** to ensure nothing broke.
613
623
 
614
624
  <details>
615
- <summary><strong>📋 TDD Loop Guidelines (click to expand)</strong></summary>
625
+ <summary><strong>TDD Loop Guidelines (click to expand)</strong></summary>
616
626
 
617
627
  **Iteration strategy:**
618
628
  - Start with first failing stable mode step
@@ -632,6 +642,8 @@ jettypod workflow checkpoint <feature-id> --step=5
632
642
 
633
643
  </details>
634
644
 
645
+ **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.
646
+
635
647
  ---
636
648
 
637
649
  ### Step 6: Route After Chore Completion
@@ -654,10 +666,10 @@ sqlite3 .jettypod/work.db "SELECT id, title FROM work_items WHERE parent_id = <f
654
666
 
655
667
  ```
656
668
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
657
- 🎯 Stable Mode Chore Complete
669
+ Stable Mode Chore Complete
658
670
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
659
671
 
660
- Error handling and validation scenarios pass for this chore
672
+ Error handling and validation scenarios pass for this chore
661
673
 
662
674
  More stable mode chores remain. Starting next chore:
663
675
  #[next-chore-id]: [next-chore-title]
@@ -675,6 +687,8 @@ git add . && git commit -m "feat: [brief description of error handling added]"
675
687
  jettypod work merge [current-chore-id]
676
688
  ```
677
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
+
678
692
  ```bash
679
693
  # Step 2: cd to main repo
680
694
  cd /path/to/main/repo
@@ -699,7 +713,7 @@ If the query returns no remaining chores, proceed to Step 7.
699
713
 
700
714
  ### Step 7: Complete Feature or Transition to Production Mode
701
715
 
702
- **🛑 CRITICAL: This step ONLY runs after ALL stable chores are complete.**
716
+ **CRITICAL: This step ONLY runs after ALL stable chores are complete.**
703
717
 
704
718
  **First, merge the final stable chore:**
705
719
 
@@ -729,6 +743,31 @@ pwd && ls .jettypod # verify
729
743
  jettypod work cleanup [current-chore-id]
730
744
  ```
731
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
+
732
771
  **Then check project state:**
733
772
 
734
773
  ```bash
@@ -741,6 +780,26 @@ sqlite3 .jettypod/work.db "SELECT project_state FROM project_config WHERE id = 1
741
780
 
742
781
  **If project_state = 'internal':**
743
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
+
744
803
  **The merge command automatically sets the feature as ready for review.**
745
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.
746
805
 
@@ -748,19 +807,19 @@ It will appear with accept/reject buttons on the kanban board. Do NOT call `jett
748
807
 
749
808
  ```
750
809
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
751
- FEATURE COMPLETE!
810
+ FEATURE COMPLETE!
752
811
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
753
812
 
754
813
  Feature: #[id] [Feature Title]
755
- Status: DONE
814
+ Status: DONE
756
815
 
757
816
  What we accomplished:
758
- All BDD scenarios passing (success + error handling + edge cases)
759
- Comprehensive error handling and validation
760
- Input validation and edge case coverage
761
- State consistency and data integrity
817
+ All BDD scenarios passing (success + error handling + edge cases)
818
+ Comprehensive error handling and validation
819
+ Input validation and edge case coverage
820
+ State consistency and data integrity
762
821
 
763
- 📝 INTERNAL PROJECT - STABLE MODE IS COMPLETE
822
+ INTERNAL PROJECT - STABLE MODE IS COMPLETE
764
823
 
765
824
  This is an internal project - stable mode is the end state.
766
825
  Feature is complete and ready to use!
@@ -769,7 +828,7 @@ Note: If you later transition to external (accepting real users),
769
828
  run the external-transition skill to generate production chores.
770
829
  ```
771
830
 
772
- **🔄 WORKFLOW INTEGRATION: Complete workflow (internal project)**
831
+ **WORKFLOW INTEGRATION: Complete workflow (internal project)**
773
832
 
774
833
  ```bash
775
834
  jettypod workflow complete stable-mode <feature-id>
@@ -791,7 +850,7 @@ This marks the `stable_mode_complete` gate as passed. For internal projects, thi
791
850
 
792
851
  **If project_state = 'external':**
793
852
 
794
- **🛑 CRITICAL HANDOFF - You MUST invoke production-mode using the Skill tool.**
853
+ **CRITICAL HANDOFF - You MUST invoke production-mode using the Skill tool.**
795
854
 
796
855
  **Set feature mode to production:**
797
856
 
@@ -803,21 +862,21 @@ jettypod work set-mode <feature-id> production
803
862
 
804
863
  ```
805
864
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
806
- 🎯 Stable Mode Complete! Transitioning to Production Mode
865
+ Stable Mode Complete! Transitioning to Production Mode
807
866
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
808
867
 
809
- ⚠️ CRITICAL: This is an EXTERNAL project.
868
+ CRITICAL: This is an EXTERNAL project.
810
869
  Stable mode makes it robust - production mode makes it ready for real users.
811
870
 
812
871
  What we accomplished:
813
- All BDD scenarios passing (success + error handling + edge cases)
814
- Comprehensive error handling and validation
815
- Feature stable and ready for production hardening
872
+ All BDD scenarios passing (success + error handling + edge cases)
873
+ Comprehensive error handling and validation
874
+ Feature stable and ready for production hardening
816
875
 
817
- 🚀 Now invoking production-mode skill...
876
+ Now invoking production-mode skill...
818
877
  ```
819
878
 
820
- **🔄 WORKFLOW INTEGRATION: Complete workflow (external project)**
879
+ **WORKFLOW INTEGRATION: Complete workflow (external project)**
821
880
 
822
881
  ```bash
823
882
  jettypod workflow complete stable-mode <feature-id>
@@ -877,17 +936,17 @@ jettypod work start <chore-id> # Create worktree and start chore
877
936
 
878
937
  **Set feature status/mode:**
879
938
  ```bash
880
- # ⚠️ Do NOT call `work status done` — merge sets the review gate automatically
939
+ # Do NOT call `work status done` — merge sets the review gate automatically
881
940
  jettypod work set-mode <feature-id> production # Set feature to production mode (external only)
882
941
  ```
883
942
 
884
- **❌ DO NOT use these to complete chores:**
943
+ **DO NOT use these to complete chores:**
885
944
  - `jettypod work status <chore-id> done`
886
945
  - `jettypod work complete <id>`
887
946
 
888
947
  ---
889
948
 
890
- ## ⚠️ Important: Sequential Workflow
949
+ ## Important: Sequential Workflow
891
950
 
892
951
  **Stable mode chores MUST be completed sequentially, not in parallel.**
893
952
 
@@ -1,36 +0,0 @@
1
- This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
2
-
3
- ## Getting Started
4
-
5
- First, run the development server:
6
-
7
- ```bash
8
- npm run dev
9
- # or
10
- yarn dev
11
- # or
12
- pnpm dev
13
- # or
14
- bun dev
15
- ```
16
-
17
- Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
18
-
19
- You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
20
-
21
- This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
22
-
23
- ## Learn More
24
-
25
- To learn more about Next.js, take a look at the following resources:
26
-
27
- - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
28
- - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
29
-
30
- You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
31
-
32
- ## Deploy on Vercel
33
-
34
- The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
35
-
36
- Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.