jettypod 4.4.51 → 4.4.52

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.
@@ -17,6 +17,15 @@ const modeLabels: Record<string, { label: string; color: string }> = {
17
17
  production: { label: 'prod', color: 'bg-purple-100 text-purple-800 dark:bg-purple-900/50 dark:text-purple-300' },
18
18
  };
19
19
 
20
+ function getModeLabel(item: WorkItem): string {
21
+ if (!item.mode) return '';
22
+ const base = modeLabels[item.mode]?.label || item.mode;
23
+ if (item.current_step && item.total_steps) {
24
+ return `${base} ${item.current_step}/${item.total_steps}`;
25
+ }
26
+ return base;
27
+ }
28
+
20
29
  interface KanbanCardProps {
21
30
  item: WorkItem;
22
31
  epicTitle?: string | null;
@@ -40,7 +49,7 @@ function KanbanCard({ item, epicTitle, showEpic = false }: KanbanCardProps) {
40
49
  <span className="text-xs text-zinc-400 font-mono">#{item.id}</span>
41
50
  {item.mode && modeLabels[item.mode] && (
42
51
  <span className={`text-xs px-1.5 py-0.5 rounded ${modeLabels[item.mode].color}`}>
43
- {modeLabels[item.mode].label}
52
+ {getModeLabel(item)}
44
53
  </span>
45
54
  )}
46
55
  </div>
@@ -78,7 +87,7 @@ function KanbanCard({ item, epicTitle, showEpic = false }: KanbanCardProps) {
78
87
  <span className="text-zinc-400 font-mono">#{chore.id}</span>
79
88
  {chore.mode && modeLabels[chore.mode] && (
80
89
  <span className={`px-1 py-0.5 rounded text-[10px] ${modeLabels[chore.mode].color}`}>
81
- {modeLabels[chore.mode].label}
90
+ {getModeLabel(chore)}
82
91
  </span>
83
92
  )}
84
93
  <span className="text-zinc-700 dark:text-zinc-300 truncate">
@@ -21,6 +21,8 @@ export interface WorkItem {
21
21
  created_at: string;
22
22
  children?: WorkItem[];
23
23
  chores?: WorkItem[];
24
+ current_step?: number | null;
25
+ total_steps?: number | null;
24
26
  }
25
27
 
26
28
  export interface Decision {
@@ -207,9 +209,11 @@ export function getKanbanData(doneLimit: number = 50): KanbanData {
207
209
  // Get all chores that belong to features (for chore expansion)
208
210
  const featureChores = db.prepare(`
209
211
  SELECT c.id, c.type, c.title, c.description, c.status, c.parent_id, c.epic_id,
210
- c.branch_name, c.mode, c.phase, c.completed_at, c.created_at
212
+ c.branch_name, c.mode, c.phase, c.completed_at, c.created_at,
213
+ wc.current_step, wc.total_steps
211
214
  FROM work_items c
212
215
  INNER JOIN work_items f ON c.parent_id = f.id
216
+ LEFT JOIN workflow_checkpoints wc ON wc.work_item_id = c.id
213
217
  WHERE c.type = 'chore' AND f.type = 'feature'
214
218
  ORDER BY c.id
215
219
  `).all() as WorkItem[];
@@ -231,9 +235,11 @@ export function getKanbanData(doneLimit: number = 50): KanbanData {
231
235
  const allItems = db.prepare(`
232
236
  SELECT w.id, w.type, w.title, w.description, w.status, w.parent_id, w.epic_id,
233
237
  w.branch_name, w.mode, w.phase, w.completed_at, w.created_at,
234
- p.type as parent_type
238
+ p.type as parent_type,
239
+ wc.current_step, wc.total_steps
235
240
  FROM work_items w
236
241
  LEFT JOIN work_items p ON w.parent_id = p.id
242
+ LEFT JOIN workflow_checkpoints wc ON wc.work_item_id = w.id
237
243
  WHERE w.type IN ('feature', 'chore', 'bug')
238
244
  AND (w.parent_id IS NULL OR p.type = 'epic')
239
245
  ORDER BY w.id
package/jettypod.js CHANGED
@@ -257,11 +257,6 @@ Skills auto-activate and MUST complete their full workflow:
257
257
  ❌ DO NOT manually create chores when a skill should generate them
258
258
  ✅ ALWAYS let skills complete autonomously before taking manual actions
259
259
 
260
- ## 🔄 Session Start: Check for Interrupted Workflows
261
- On session start, run: \`jettypod workflow resume\`
262
- If an interrupted workflow is found, ASK the user if they want to resume it.
263
- Do not assume - the user may want to start fresh or work on something else.
264
-
265
260
  ## Basic Commands (for non-workflow operations)
266
261
  jettypod work create epic "<title>"
267
262
  jettypod work create feature "<title>" --parent=<id>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jettypod",
3
- "version": "4.4.51",
3
+ "version": "4.4.52",
4
4
  "description": "AI-powered development workflow manager with TDD, BDD, and automatic test generation",
5
5
  "main": "jettypod.js",
6
6
  "bin": {
@@ -72,6 +72,16 @@ Implementation Plan:
72
72
  • Affected tests: [list from context]
73
73
  ```
74
74
 
75
+ **🔄 WORKFLOW INTEGRATION: Start workflow tracking**
76
+
77
+ After receiving context, register this skill execution:
78
+
79
+ ```bash
80
+ jettypod workflow start chore-mode <chore-id>
81
+ ```
82
+
83
+ This validates that `chore_planning_complete` gate is passed (if applicable) and creates an execution record for session resume.
84
+
75
85
  **Move to Step 2 automatically.**
76
86
 
77
87
  ### Step 2: Create Worktree
@@ -167,6 +177,12 @@ Baseline Result:
167
177
 
168
178
  **CRITICAL:** If baseline tests fail, STOP. Fix existing failures before proceeding with chore work.
169
179
 
180
+ **🔄 WORKFLOW CHECKPOINT: Test baseline established**
181
+
182
+ ```bash
183
+ jettypod workflow checkpoint <chore-id> --step=3
184
+ ```
185
+
170
186
  **Move to Step 4 automatically.**
171
187
 
172
188
  ### Step 4: Display Type-Specific Guidance
@@ -260,6 +276,12 @@ const guidance = getGuidance('[chore-type]');
260
276
  - ✅ All tests pass → Move to Step 6
261
277
  - ❌ Max iterations reached → Display failure, ask user for guidance
262
278
 
279
+ **🔄 WORKFLOW CHECKPOINT: Execution complete** (when all tests pass)
280
+
281
+ ```bash
282
+ jettypod workflow checkpoint <chore-id> --step=5
283
+ ```
284
+
263
285
  **On max iterations:**
264
286
 
265
287
  ```
@@ -361,6 +383,14 @@ Verification:
361
383
  Merged to main. Chore #[id] marked done.
362
384
  ```
363
385
 
386
+ **🔄 WORKFLOW INTEGRATION: Complete workflow**
387
+
388
+ ```bash
389
+ jettypod workflow complete chore-mode <chore-id>
390
+ ```
391
+
392
+ This marks the `chore_mode_complete` gate as passed. The standalone chore is now complete.
393
+
364
394
  **End skill.**
365
395
 
366
396
  ---
@@ -31,6 +31,16 @@ Display:
31
31
  Analyzing chore type...
32
32
  ```
33
33
 
34
+ **🔄 WORKFLOW INTEGRATION: Start workflow tracking**
35
+
36
+ After understanding the chore context, register this skill execution:
37
+
38
+ ```bash
39
+ jettypod workflow start chore-planning <chore-id>
40
+ ```
41
+
42
+ This creates an execution record for session resume.
43
+
34
44
  ### Step 2: Classify Chore Type
35
45
 
36
46
  Classify the chore by matching keywords in the title and description against these patterns:
@@ -267,6 +277,16 @@ The chore-mode skill will:
267
277
  3. Run verification steps
268
278
  4. Merge when complete
269
279
 
280
+ **🔄 WORKFLOW INTEGRATION: Complete workflow**
281
+
282
+ Before invoking chore-mode:
283
+
284
+ ```bash
285
+ jettypod workflow complete chore-planning <chore-id>
286
+ ```
287
+
288
+ This marks the `chore_planning_complete` gate as passed, enabling chore-mode to start.
289
+
270
290
  **End chore-planning skill after invoking chore-mode.**
271
291
 
272
292
  ## Key Principles
@@ -24,7 +24,19 @@ Run this command to get epic context:
24
24
  jettypod work status ${EPIC_ID}
25
25
  ```
26
26
 
27
- Capture the title, description, and any existing context. Proceed to Step 2.
27
+ Capture the title, description, and any existing context.
28
+
29
+ **🔄 WORKFLOW INTEGRATION: Start workflow tracking**
30
+
31
+ After getting the epic context, register this skill execution:
32
+
33
+ ```bash
34
+ jettypod workflow start epic-planning <epic-id>
35
+ ```
36
+
37
+ This creates an execution record for session resume.
38
+
39
+ Proceed to Step 2.
28
40
 
29
41
  ---
30
42
 
@@ -57,7 +69,19 @@ Then synthesize into an epic title + description and create:
57
69
  jettypod work create epic "${EPIC_TITLE}" "${EPIC_DESCRIPTION}"
58
70
  ```
59
71
 
60
- Capture the new epic ID from output. Proceed to Step 3 (skip Step 2 since nothing exists yet).
72
+ Capture the new epic ID from output.
73
+
74
+ **🔄 WORKFLOW INTEGRATION: Start workflow tracking**
75
+
76
+ After creating the epic, register this skill execution:
77
+
78
+ ```bash
79
+ jettypod workflow start epic-planning <epic-id>
80
+ ```
81
+
82
+ This creates an execution record for session resume.
83
+
84
+ Proceed to Step 3 (skip Step 2 since nothing exists yet).
61
85
 
62
86
  ### Step 2: Check Existing State
63
87
 
@@ -388,6 +412,14 @@ Chores:
388
412
  Or run: jettypod backlog to see all items.
389
413
  ```
390
414
 
415
+ **🔄 WORKFLOW INTEGRATION: Complete workflow**
416
+
417
+ ```bash
418
+ jettypod workflow complete epic-planning <epic-id>
419
+ ```
420
+
421
+ This marks the `epic_planning_complete` gate as passed. Features created under this epic can now begin their own planning.
422
+
391
423
  **Do NOT invoke any skill. End epic-planning skill.**
392
424
 
393
425
  ## Key Principles
@@ -83,6 +83,16 @@ Ready to proceed? (yes/no)
83
83
 
84
84
  Wait for the user to respond with "yes" or similar affirmative response.
85
85
 
86
+ **🔄 WORKFLOW INTEGRATION: Start workflow tracking**
87
+
88
+ After receiving initial confirmation, register this skill execution:
89
+
90
+ ```bash
91
+ jettypod workflow start external-transition
92
+ ```
93
+
94
+ This creates an execution record for session resume (note: external-transition is project-level, not tied to a specific work item).
95
+
86
96
  If they say "no" or express hesitation, ask what concerns they have or what they need to clarify.
87
97
 
88
98
  ### Step 3: Production Standards Selection
@@ -320,6 +330,12 @@ Then confirm to user:
320
330
  These standards will guide all production mode work going forward.
321
331
  ```
322
332
 
333
+ **🔄 WORKFLOW CHECKPOINT: Standards saved**
334
+
335
+ ```bash
336
+ jettypod workflow checkpoint --step=7
337
+ ```
338
+
323
339
  ### Step 8: Final Confirmation for Transition
324
340
 
325
341
  Now confirm the actual state transition:
@@ -362,6 +378,14 @@ Your project is now in external state.
362
378
  **Want to start on infrastructure work now?**
363
379
  ```
364
380
 
381
+ **🔄 WORKFLOW INTEGRATION: Complete workflow**
382
+
383
+ ```bash
384
+ jettypod workflow complete external-transition
385
+ ```
386
+
387
+ This marks the `external_transition_complete` gate as passed. The project is now in external state with production standards configured.
388
+
365
389
  ### Step 11: Guide Next Actions
366
390
 
367
391
  If the user wants to start infrastructure work:
@@ -53,6 +53,16 @@ This returns: title, description, parent epic (if any), mode, phase, and any exi
53
53
 
54
54
  **If the feature is not found**, ask the user to verify the ID or run `jettypod backlog` to find it.
55
55
 
56
+ **🔄 WORKFLOW INTEGRATION: Start workflow tracking**
57
+
58
+ After getting the feature context, register this skill execution:
59
+
60
+ ```bash
61
+ jettypod workflow start feature-planning <feature-id>
62
+ ```
63
+
64
+ This creates an execution record for session resume.
65
+
56
66
  **Proceed to Step 2** (or Step 3 if this is a standalone feature with no parent epic).
57
67
 
58
68
  ### Step 2: Check Epic Architectural Decisions
@@ -184,6 +194,12 @@ Which approach works best?
184
194
 
185
195
  User picks winner. Note their choice - you'll record it formally in Step 8 when transitioning to implementation.
186
196
 
197
+ **🔄 WORKFLOW CHECKPOINT: Winner chosen**
198
+
199
+ ```bash
200
+ jettypod workflow checkpoint <feature-id> --step=5
201
+ ```
202
+
187
203
  **Proceed to Step 6.**
188
204
 
189
205
  ### Step 6: Define Integration Contract AND Generate BDD Scenarios
@@ -317,6 +333,12 @@ Does this capture the feature correctly? Any scenarios to add/change?
317
333
  - If user requests changes → Revise scenarios and display again
318
334
  - **Store the confirmed scenarios in memory** - you'll write them in Step 8D
319
335
 
336
+ **🔄 WORKFLOW CHECKPOINT: BDD scenarios confirmed**
337
+
338
+ ```bash
339
+ jettypod workflow checkpoint <feature-id> --step=6
340
+ ```
341
+
320
342
  **Proceed to Step 7.**
321
343
 
322
344
  **Template for speed mode (make it work):**
@@ -590,6 +612,12 @@ After successful transition, display:
590
612
  Now I'll write the BDD tests in an isolated worktree...
591
613
  ```
592
614
 
615
+ **🔄 WORKFLOW CHECKPOINT: Implementation transition complete**
616
+
617
+ ```bash
618
+ jettypod workflow checkpoint <feature-id> --step=8
619
+ ```
620
+
593
621
  **Proceed to Step 8D.**
594
622
 
595
623
  #### Step 8D: Write Tests in Isolated Worktree
@@ -743,6 +771,14 @@ This will:
743
771
  Start this one? [yes / pick different / done for now]
744
772
  ```
745
773
 
774
+ **🔄 WORKFLOW INTEGRATION: Complete workflow**
775
+
776
+ ```bash
777
+ jettypod workflow complete feature-planning <feature-id>
778
+ ```
779
+
780
+ This marks the `feature_planning_complete` gate as passed, enabling speed-mode to start.
781
+
746
782
  **Proceed to Step 8E.**
747
783
 
748
784
  #### Step 8E: Start First Chore
@@ -54,6 +54,16 @@ sqlite3 .jettypod/work.db "SELECT completed_at FROM work_items WHERE parent_id =
54
54
 
55
55
  Based on these checks, determine which scenario applies.
56
56
 
57
+ **🔄 WORKFLOW INTEGRATION: Start workflow tracking**
58
+
59
+ After detecting context, register this skill execution:
60
+
61
+ ```bash
62
+ jettypod workflow start production-mode <feature-id>
63
+ ```
64
+
65
+ This validates that `stable_mode_complete` gate is passed and creates an execution record for session resume.
66
+
57
67
  **Three Scenarios:**
58
68
 
59
69
  **Scenario A: Fresh from Stable (Hot Context)**
@@ -89,6 +99,12 @@ cat .jettypod/production-standards.json
89
99
 
90
100
  If the file doesn't exist, run external-transition first to generate production standards.
91
101
 
102
+ **🔄 WORKFLOW CHECKPOINT: Standards read**
103
+
104
+ ```bash
105
+ jettypod workflow checkpoint <feature-id> --step=1
106
+ ```
107
+
92
108
  ---
93
109
 
94
110
  ### Step 2A: Validate Scenarios (Scenario A - Hot Context)
@@ -221,6 +237,12 @@ This will:
221
237
  3. Append scenarios to the feature file
222
238
  4. Create production chores
223
239
 
240
+ **🔄 WORKFLOW CHECKPOINT: Scenarios validated/generated** (after any Step 2 variant)
241
+
242
+ ```bash
243
+ jettypod workflow checkpoint <feature-id> --step=2
244
+ ```
245
+
224
246
  ---
225
247
 
226
248
  ### Step 3: Implement Production Chore
@@ -243,6 +265,12 @@ Parse the chore description to find which scenario it addresses (look for "Scena
243
265
  npx cucumber-js <scenario-file> --name "<scenario-name>" --format progress
244
266
  ```
245
267
 
268
+ **🔄 WORKFLOW CHECKPOINT: RED baseline established**
269
+
270
+ ```bash
271
+ jettypod workflow checkpoint <feature-id> --step=3
272
+ ```
273
+
246
274
  2. **Iterate until scenario passes (max 10 iterations):**
247
275
  - Implement production hardening using Edit/Write tools
248
276
  - Run the target scenario to check progress
@@ -307,3 +335,13 @@ Once all production chores complete:
307
335
  1. Feature is production-ready
308
336
  2. Can be deployed to external environment
309
337
  3. Meets all standards for scale, security, compliance
338
+
339
+ **🔄 WORKFLOW INTEGRATION: Complete workflow**
340
+
341
+ When all production chores are complete:
342
+
343
+ ```bash
344
+ jettypod workflow complete production-mode <feature-id>
345
+ ```
346
+
347
+ This marks the `production_mode_complete` gate as passed. The feature is now production-ready.
@@ -217,6 +217,16 @@ test('createUser throws error for invalid email', () => {
217
217
  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'"
218
218
  ```
219
219
 
220
+ **🔄 WORKFLOW INTEGRATION: Start workflow tracking**
221
+
222
+ After getting the work context, register this skill execution:
223
+
224
+ ```bash
225
+ jettypod workflow start speed-mode <feature-id>
226
+ ```
227
+
228
+ This validates that `feature_planning_complete` gate is passed and creates an execution record for session resume.
229
+
220
230
  **Display to user:**
221
231
 
222
232
  ```
@@ -377,6 +387,12 @@ Integration Points:
377
387
  Now proposing implementation approach...
378
388
  ```
379
389
 
390
+ **🔄 WORKFLOW CHECKPOINT: Codebase analysis complete**
391
+
392
+ ```bash
393
+ jettypod workflow checkpoint <feature-id> --step=2
394
+ ```
395
+
380
396
  ### Step 3: Decide if Confirmation Needed
381
397
 
382
398
  **Evaluate if you need user confirmation before implementing:**
@@ -467,6 +483,12 @@ First error:
467
483
  Now implementing...
468
484
  ```
469
485
 
486
+ **🔄 WORKFLOW CHECKPOINT: RED baseline established**
487
+
488
+ ```bash
489
+ jettypod workflow checkpoint <feature-id> --step=4
490
+ ```
491
+
470
492
  ---
471
493
 
472
494
  ### Step 5: RED→GREEN→REFACTOR Loop
@@ -502,6 +524,12 @@ Now implementing...
502
524
  🎉 GREEN: All success scenarios passing!
503
525
  ```
504
526
 
527
+ **🔄 WORKFLOW CHECKPOINT: GREEN achieved**
528
+
529
+ ```bash
530
+ jettypod workflow checkpoint <feature-id> --step=5
531
+ ```
532
+
505
533
  **Then REFACTOR (quick pass, 5 min max):**
506
534
  - Extract duplicated code
507
535
  - Rename unclear variables
@@ -745,6 +773,14 @@ Repeat for each confirmed chore. **Do NOT use `--mode` flag** - chores inherit m
745
773
  jettypod work merge --release-lock
746
774
  ```
747
775
 
776
+ **🔄 WORKFLOW COMPLETE: Speed mode finished**
777
+
778
+ Mark speed mode as complete (this passes the `speed_mode_complete` gate, enabling stable-mode):
779
+
780
+ ```bash
781
+ jettypod workflow complete speed-mode <feature-id>
782
+ ```
783
+
748
784
  #### Step 7E: Start First Stable Chore and Invoke Stable Mode Skill
749
785
 
750
786
  **🛑 CRITICAL HANDOFF - You MUST start the first chore BEFORE invoking stable-mode.**
@@ -222,6 +222,16 @@ test('getUserById returns null for non-existent user', () => {
222
222
  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'"
223
223
  ```
224
224
 
225
+ **🔄 WORKFLOW INTEGRATION: Start workflow tracking**
226
+
227
+ After getting the work context, register this skill execution:
228
+
229
+ ```bash
230
+ jettypod workflow start stable-mode <feature-id>
231
+ ```
232
+
233
+ This validates that `speed_mode_complete` gate is passed and creates an execution record for session resume.
234
+
225
235
  **Display to user:**
226
236
 
227
237
  ```
@@ -346,6 +356,12 @@ To pass the target scenario, I need to:
346
356
  Now proposing comprehensive implementation...
347
357
  ```
348
358
 
359
+ **🔄 WORKFLOW CHECKPOINT: Code analysis complete**
360
+
361
+ ```bash
362
+ jettypod workflow checkpoint <feature-id> --step=2
363
+ ```
364
+
349
365
  ### Step 3: Decide if Confirmation Needed
350
366
 
351
367
  **Evaluate if you need user confirmation before implementing:**
@@ -431,6 +447,12 @@ First error:
431
447
  Now implementing...
432
448
  ```
433
449
 
450
+ **🔄 WORKFLOW CHECKPOINT: RED baseline established**
451
+
452
+ ```bash
453
+ jettypod workflow checkpoint <feature-id> --step=4
454
+ ```
455
+
434
456
  ---
435
457
 
436
458
  ### Step 5: RED→GREEN→REFACTOR Loop
@@ -466,6 +488,12 @@ Now implementing...
466
488
  🎉 GREEN: All stable mode scenarios passing!
467
489
  ```
468
490
 
491
+ **🔄 WORKFLOW CHECKPOINT: GREEN achieved**
492
+
493
+ ```bash
494
+ jettypod workflow checkpoint <feature-id> --step=5
495
+ ```
496
+
469
497
  **Then REFACTOR (quick pass, 5 min max):**
470
498
  - Extract duplicated validation logic
471
499
  - Rename unclear error variables
@@ -603,6 +631,14 @@ Note: If you later transition to external (accepting real users),
603
631
  run the external-transition skill to generate production chores.
604
632
  ```
605
633
 
634
+ **🔄 WORKFLOW INTEGRATION: Complete workflow (internal project)**
635
+
636
+ ```bash
637
+ jettypod workflow complete stable-mode <feature-id>
638
+ ```
639
+
640
+ This marks the `stable_mode_complete` gate as passed. For internal projects, this is the final workflow step.
641
+
606
642
  **End skill.** Feature is DONE.
607
643
 
608
644
  ---
@@ -637,6 +673,14 @@ What we accomplished:
637
673
  🚀 Now invoking production-mode skill...
638
674
  ```
639
675
 
676
+ **🔄 WORKFLOW INTEGRATION: Complete workflow (external project)**
677
+
678
+ ```bash
679
+ jettypod workflow complete stable-mode <feature-id>
680
+ ```
681
+
682
+ This marks the `stable_mode_complete` gate as passed, enabling production-mode to start.
683
+
640
684
  **Invoke production-mode:**
641
685
 
642
686
  ```