jettypod 4.4.10 → 4.4.11

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 (32) hide show
  1. package/apps/dashboard/README.md +36 -0
  2. package/apps/dashboard/app/favicon.ico +0 -0
  3. package/apps/dashboard/app/globals.css +122 -0
  4. package/apps/dashboard/app/layout.tsx +34 -0
  5. package/apps/dashboard/app/page.tsx +25 -0
  6. package/apps/dashboard/app/work/[id]/page.tsx +193 -0
  7. package/apps/dashboard/components/KanbanBoard.tsx +201 -0
  8. package/apps/dashboard/components/WorkItemTree.tsx +116 -0
  9. package/apps/dashboard/components.json +22 -0
  10. package/apps/dashboard/eslint.config.mjs +18 -0
  11. package/apps/dashboard/lib/db.ts +270 -0
  12. package/apps/dashboard/lib/utils.ts +6 -0
  13. package/apps/dashboard/next.config.ts +7 -0
  14. package/apps/dashboard/package.json +33 -0
  15. package/apps/dashboard/postcss.config.mjs +7 -0
  16. package/apps/dashboard/public/file.svg +1 -0
  17. package/apps/dashboard/public/globe.svg +1 -0
  18. package/apps/dashboard/public/next.svg +1 -0
  19. package/apps/dashboard/public/vercel.svg +1 -0
  20. package/apps/dashboard/public/window.svg +1 -0
  21. package/apps/dashboard/tsconfig.json +34 -0
  22. package/jettypod.js +41 -0
  23. package/lib/current-work.js +10 -18
  24. package/lib/migrations/016-workflow-checkpoints-table.js +70 -0
  25. package/lib/migrations/017-backfill-epic-id.js +54 -0
  26. package/lib/workflow-checkpoint.js +204 -0
  27. package/package.json +7 -2
  28. package/skills-templates/chore-mode/SKILL.md +3 -0
  29. package/skills-templates/epic-planning/SKILL.md +225 -154
  30. package/skills-templates/feature-planning/SKILL.md +172 -87
  31. package/skills-templates/speed-mode/SKILL.md +161 -338
  32. package/skills-templates/stable-mode/SKILL.md +8 -2
@@ -22,37 +22,50 @@ When this skill is activated, you are helping discover the best approach for a f
22
22
 
23
23
  **CRITICAL:** Both commands are run by **Claude**, not the user. The distinction is:
24
24
  - `work implement` = Ends feature planning, creates chores
25
- - `work start` = Begins implementing a chore (triggers speed-mode skill)
25
+ - `work start` = Creates worktree/branch for chore (does NOT auto-invoke speed-mode)
26
+
27
+ **🛑 STOP GATE:** DO NOT run `work start` until Step 8D. If you're in Steps 1-8C, use `work implement` only.
28
+
29
+ **🛑 HANDOFF REQUIREMENT:** After `work start`, you MUST invoke speed-mode using the Skill tool. See Step 8D.
26
30
 
27
31
  ---
28
32
 
29
- ### Step 1: Understand the Feature Context
33
+ ### Step 1: Get Feature Context
30
34
 
31
- You'll receive context about:
32
- - Feature title and description
33
- - Parent epic (if any)
34
- - Project context
35
+ **Extract the feature ID from:**
36
+ - Previous message from epic-planning (e.g., "I'll start planning Feature #42")
37
+ - User's request (e.g., "plan feature 42", "help me with feature #42")
35
38
 
36
- ### Step 2: Check Epic Architectural Decisions
39
+ **Then run:**
40
+ ```bash
41
+ jettypod work show ${FEATURE_ID}
42
+ ```
37
43
 
38
- **CRITICAL:** If this feature belongs to an epic, check for existing architectural decisions.
44
+ This returns: title, description, parent epic (if any), mode, phase, and any existing discovery decisions.
39
45
 
40
- **⚠️ IMPORTANT - USE EXACT CODE BELOW:**
41
- - Import from `./lib/decisions-helpers` (NOT `./features/decisions/index.js`)
42
- - The function name is `getDecisionsForEpic` (matches the import)
43
- - Use `await` because it returns a Promise
46
+ **Capture from the output:**
47
+ - `FEATURE_ID` - the feature's ID (shown as `#XX` in output)
48
+ - `FEATURE_TITLE` - the feature's title
49
+ - `PARENT_EPIC_ID` - the parent epic ID from "Parent:" line (may be null for standalone features)
50
+
51
+ **If the feature is not found**, ask the user to verify the ID or run `jettypod backlog` to find it.
52
+
53
+ **Proceed to Step 2** (or Step 3 if this is a standalone feature with no parent epic).
54
+
55
+ ### Step 2: Check Epic Architectural Decisions
44
56
 
45
- **Execute this EXACT code (copy/paste as-is):**
57
+ **Skip this step and proceed to Step 3 if `PARENT_EPIC_ID` from Step 1 is null (standalone feature).**
46
58
 
47
- ```javascript
48
- const { getDecisionsForEpic } = require('./lib/decisions-helpers');
59
+ If this feature belongs to an epic, check for existing architectural decisions.
49
60
 
50
- if (parentEpicId) {
51
- const epicDecisions = await getDecisionsForEpic(parentEpicId);
52
- console.log('Epic decisions:', JSON.stringify(epicDecisions, null, 2));
53
- }
61
+ **Run this command** (replace `${PARENT_EPIC_ID}` with actual ID):
62
+
63
+ ```bash
64
+ jettypod decisions --epic=${PARENT_EPIC_ID}
54
65
  ```
55
66
 
67
+ This outputs any architectural decisions recorded for the parent epic. If no decisions exist, it will say so.
68
+
56
69
  Display the context with decisions:
57
70
 
58
71
  ```
@@ -73,6 +86,8 @@ Let's explore different approaches for this feature [that align with these decis
73
86
 
74
87
  **IMPORTANT:** When suggesting UX approaches in the next step, ensure they respect/align with the epic's architectural decisions.
75
88
 
89
+ **Proceed to Step 3.**
90
+
76
91
  ### Step 3: Suggest 3 UX Approaches
77
92
 
78
93
  Propose exactly 3 approaches with varying complexity/trade-offs:
@@ -104,6 +119,11 @@ Here are 3 different approaches for [feature name]:
104
119
  Would you like me to create working prototypes of these approaches?
105
120
  ```
106
121
 
122
+ **WAIT for user response.**
123
+
124
+ - If user wants prototypes → Continue to Step 4
125
+ - If user declines prototypes → Skip to Step 5
126
+
107
127
  ### Step 4: Optional Prototyping
108
128
 
109
129
  If user wants prototypes:
@@ -125,6 +145,8 @@ If user wants prototypes:
125
145
  For CLI/terminal prototypes, add similar info as first output.
126
146
  5. **Offer to open them**: "Want me to open these in your browser?"
127
147
 
148
+ **WAIT for user to test prototypes.**
149
+
128
150
  <details>
129
151
  <summary><strong>📋 Prototyping Guidelines (click to expand)</strong></summary>
130
152
 
@@ -155,12 +177,22 @@ After user tests (or skips prototyping):
155
177
  Which approach works best?
156
178
  ```
157
179
 
180
+ **WAIT for user response.**
181
+
158
182
  User picks winner. Note their choice - you'll record it formally in Step 8 when transitioning to implementation.
159
183
 
184
+ **Proceed to Step 6.**
185
+
160
186
  ### Step 6: Generate BDD Scenarios AND Step Definitions
161
187
 
162
188
  **CRITICAL:** BDD scenarios and step definitions must ALWAYS be created together. Never create scenarios without step definitions.
163
189
 
190
+ **Feature slug:** Derive `FEATURE_SLUG` from the feature title:
191
+ - Lowercase
192
+ - Replace spaces with hyphens
193
+ - Remove special characters
194
+ - Examples: "Email Password Login" → "email-password-login", "User's Profile (v2)" → "users-profile-v2"
195
+
164
196
  Based on chosen approach, generate:
165
197
 
166
198
  **A. Scenario file** at `features/[feature-slug].feature` using Write tool:
@@ -185,11 +217,18 @@ Based on chosen approach, generate:
185
217
  - All When steps (execute actions)
186
218
  - All Then steps (verify outcomes)
187
219
 
188
- 3. **Update database** with scenario file path:
189
- ```bash
190
- # After creating scenario file AND step definitions
191
- sqlite3 .jettypod/work.db "UPDATE work_items SET scenario_file = 'features/[feature-slug].feature' WHERE id = <feature-id>"
192
- ```
220
+ **C. Update database** with scenario file path (run from project root):
221
+
222
+ ```bash
223
+ sqlite3 .jettypod/work.db "UPDATE work_items SET scenario_file = 'features/${FEATURE_SLUG}.feature' WHERE id = ${FEATURE_ID}"
224
+ ```
225
+
226
+ Replace `${FEATURE_SLUG}` and `${FEATURE_ID}` with actual values. Example:
227
+ ```bash
228
+ sqlite3 .jettypod/work.db "UPDATE work_items SET scenario_file = 'features/email-password-login.feature' WHERE id = 42"
229
+ ```
230
+
231
+ **Proceed to Step 6.5.**
193
232
 
194
233
  **Template for speed mode (make it work):**
195
234
 
@@ -293,60 +332,61 @@ Scenario: Prevent unauthorized access
293
332
 
294
333
  ### Step 6.5: Validate BDD Infrastructure
295
334
 
296
- **CRITICAL:** After creating both scenario and step definition files, automatically validate them with cucumber dry-run to catch errors immediately.
335
+ **CRITICAL:** After creating both scenario and step definition files, validate them with cucumber dry-run to catch errors immediately.
297
336
 
298
- **Execute validation:**
337
+ **Run this command** (replace `${FEATURE_SLUG}` with actual slug):
299
338
 
300
- ```javascript
301
- const { validateBddInfrastructure } = require('../../lib/skills/feature-planning/dry-run-validator');
302
- const { formatValidationResult } = require('../../lib/skills/feature-planning/validation-formatter');
303
- const path = require('path');
339
+ ```bash
340
+ npx cucumber-js --dry-run features/${FEATURE_SLUG}.feature
341
+ ```
304
342
 
305
- console.log('🧪 Validating BDD infrastructure...\n');
343
+ Example:
344
+ ```bash
345
+ npx cucumber-js --dry-run features/email-password-login.feature
346
+ ```
306
347
 
307
- const featurePath = path.join(process.cwd(), 'features', '[feature-slug].feature');
308
- const result = await validateBddInfrastructure(featurePath);
348
+ **What the output means:**
309
349
 
310
- // Format and display results with colors and guidance
311
- const formattedOutput = formatValidationResult(result, featurePath);
312
- console.log(formattedOutput);
350
+ **Success** - No errors, all steps have definitions:
351
+ ```
352
+ 0 scenarios
353
+ 0 steps
354
+ ```
355
+ (Dry-run doesn't execute, so 0 is correct)
313
356
 
314
- if (!result.success) {
315
- console.log(''); // Extra line before halting
316
- return; // Halt - do not generate chores yet
317
- }
357
+ **Undefined steps** - Missing step definitions:
358
+ ```
359
+ Undefined. Implement with the following snippet:
360
+ Given('I am on the login page', function () {
361
+ ...
362
+ });
363
+ ```
364
+ → Add the missing step definition to your `.steps.js` file
318
365
 
319
- // Continue to Step 7
320
- console.log(''); // Extra line before continuing
366
+ **Syntax error** - Invalid Gherkin:
321
367
  ```
368
+ Parse error in features/foo.feature
369
+ ```
370
+ → Fix the feature file syntax
322
371
 
323
- **Validation checks:**
324
- - ✅ Feature file has valid Gherkin syntax
325
- - ✅ All scenario steps have matching step definitions
326
- - ✅ No duplicate step definitions
327
- - Cucumber can parse the files
328
- - ✅ Validation completes in < 5 seconds
372
+ **Duplicate steps** - Multiple definitions match:
373
+ ```
374
+ Multiple step definitions match
375
+ ```
376
+ Remove or rename one of the duplicate step definitions
329
377
 
330
378
  **If validation fails:**
331
- 1. Show clear error messages with file locations
332
- 2. Provide actionable guidance on how to fix
333
- 3. DO NOT proceed to chore generation
334
- 4. Wait for user to fix issues
379
+ 1. Read the error message carefully
380
+ 2. Fix the step definitions or scenario file
381
+ 3. Re-run the dry-run command
382
+ 4. **Loop until validation passes** - do NOT proceed to Step 7 until green
335
383
 
336
384
  **If validation succeeds:**
337
- 1. Confirm success with checkmarks
338
- 2. Proceed immediately to Step 6.75
339
-
340
- ### Step 6.75: Note About Unit Tests
385
+ Display: "✅ BDD infrastructure validated - all steps have definitions"
341
386
 
342
- **Unit tests will be created during speed mode implementation**, not during feature planning.
387
+ **Proceed to Step 7.**
343
388
 
344
- The speed-mode skill guides Claude to:
345
- 1. Implement the feature code
346
- 2. Create corresponding unit tests for all success scenarios
347
- 3. Ensure tests pass before completing the chore
348
-
349
- This keeps feature planning focused on BDD scenarios (what users experience) while speed mode handles unit tests (implementation details).
389
+ **Note:** Unit tests are created during speed mode implementation, not during feature planning. Feature planning focuses on BDD scenarios (user experience); speed mode handles unit tests (implementation details).
350
390
 
351
391
  ### Step 7: Propose Speed Mode Chores
352
392
 
@@ -398,7 +438,11 @@ These chores will make all success scenarios pass (required + optional features)
398
438
  Sound good? Any adjustments?
399
439
  ```
400
440
 
401
- **Wait for user confirmation/adjustments, then proceed to Step 8.**
441
+ **WAIT for user response.**
442
+
443
+ - If user confirms → Proceed to Step 8
444
+ - If user requests changes → Revise chore proposals, then WAIT again
445
+ - If user adds/removes chores → Update your list accordingly
402
446
 
403
447
  ### Step 8: Transition to Implementation
404
448
 
@@ -426,14 +470,22 @@ Does this rationale capture why you chose this approach? (You can edit it if nee
426
470
  **CRITICAL: After user confirms, use Bash tool to EXECUTE the work implement command:**
427
471
 
428
472
  ```bash
429
- # Use Bash tool to execute:
430
- jettypod work implement [feature-id] \
473
+ jettypod work implement ${FEATURE_ID} \
431
474
  --winner="[approach-name or prototypes/winner-file]" \
432
475
  --rationale="[user's confirmed/edited rationale]"
433
476
  ```
434
477
 
478
+ Replace `${FEATURE_ID}` with actual ID. Example:
479
+ ```bash
480
+ jettypod work implement 42 --winner="Simple inline form" --rationale="Fastest UX, cleanest implementation"
481
+ ```
482
+
435
483
  **DO NOT display this as example text. EXECUTE IT using the Bash tool.**
436
484
 
485
+ **If the command fails**, check the error message:
486
+ - "Feature not found" → Verify the feature ID
487
+ - "Already in implementation" → Feature was already transitioned, proceed to Step 8C
488
+
437
489
  #### Step 8C: Create the Chores
438
490
 
439
491
  **CRITICAL: NOW create the chores.** The feature has transitioned to implementation mode, so chore creation will succeed.
@@ -441,25 +493,33 @@ jettypod work implement [feature-id] \
441
493
  For each chore that the user confirmed in Step 7, use the Bash tool to create it:
442
494
 
443
495
  ```bash
444
- # Use Bash tool to execute for each chore:
445
- jettypod work create chore "[Chore title]" "[Chore description with all the implementation guidance]" --parent=[feature-id]
496
+ jettypod work create chore "[Chore title]" "[Chore description]" --parent=${FEATURE_ID}
446
497
  ```
447
498
 
448
- **Build the description from your Step 7 proposal:**
499
+ Replace `${FEATURE_ID}` with actual ID. Example:
500
+ ```bash
501
+ jettypod work create chore "Set up auth routes" "Create login/logout endpoints..." --parent=42
502
+ ```
503
+
504
+ **If chore creation fails**, check:
505
+ - "Parent not found" → Verify the feature ID
506
+ - "Parent not in implementation phase" → Run Step 8B first
507
+
508
+ **CRITICAL: Copy the EXACT proposal from Step 7 into each chore description.** Do not paraphrase or summarize - the implementation guidance must be preserved verbatim:
509
+
449
510
  ```
450
- [Technical description]
511
+ [Technical description from Step 7]
451
512
 
452
513
  Scenario steps addressed:
453
- • [Step 1]
454
- • [Step 2]
514
+ • [EXACT steps from Step 7]
455
515
 
456
516
  Implementation guidance:
457
- • Files to create/modify: [paths]
458
- • Patterns to follow: [references]
459
- • Key functions/components needed: [list]
517
+ • Files to create/modify: [EXACT paths from Step 7]
518
+ • Patterns to follow: [EXACT references from Step 7]
519
+ • Key functions/components needed: [EXACT list from Step 7]
460
520
 
461
521
  Verification:
462
- • [Which step definitions should pass]
522
+ • [EXACT step definitions from Step 7]
463
523
  ```
464
524
 
465
525
  After creating all chores, display:
@@ -477,31 +537,55 @@ After creating all chores, display:
477
537
  ✅ Feature phase: Implementation
478
538
  🚀 Feature mode: Speed
479
539
 
480
- Ready to start implementation?
540
+ 💡 Recommendation: Start with Chore #[first-chore-id] ([chore-title])
541
+ [Brief reasoning - e.g., "It sets up the foundation the other chores depend on."]
542
+
543
+ Start this one? [yes / pick different / done for now]
481
544
  ```
482
545
 
483
546
  #### Step 8D: Start First Chore
484
547
 
485
548
  **Feature planning is now complete.** The feature has been transitioned to implementation phase and chores are ready.
486
549
 
487
- **Ask user which chore to start with:**
550
+ The completion message above already includes your recommendation. Now:
488
551
 
489
- ```
490
- Ready to start implementation? Which chore should we start with?
491
- ```
552
+ **WAIT for user response.**
553
+
554
+ **If user confirms (says "yes", "let's go", etc.):**
555
+
556
+ 1. Run `jettypod work start [chore-id]` using Bash tool
557
+ 2. **Then IMMEDIATELY invoke speed-mode using the Skill tool** (see below)
558
+
559
+ **If user says "pick different":**
560
+
561
+ 1. List all chores and let them choose
562
+ 2. Run `work start` on their choice
563
+ 3. **Then IMMEDIATELY invoke speed-mode using the Skill tool** (see below)
492
564
 
493
- **After user picks a chore, use Bash tool to run:**
565
+ **If user says "done for now":**
494
566
 
567
+ End feature-planning skill without starting a chore. Do NOT invoke speed-mode.
568
+
569
+ ---
570
+
571
+ **After user picks a chore, execute these steps IN ORDER:**
572
+
573
+ **Step 1: Start the chore (creates worktree and branch):**
495
574
  ```bash
496
575
  jettypod work start [chore-id]
497
576
  ```
498
577
 
499
- **This command will:**
500
- 1. Create a git worktree and branch for the chore
501
- 2. Automatically invoke the speed-mode skill
502
- 3. Begin TDD implementation workflow in the isolated worktree
578
+ **Step 2: State the chore ID clearly in your response:**
579
+ > "I'll start implementing Chore #[id]: [title]"
580
+
581
+ **Step 3: IMMEDIATELY invoke speed-mode using the Skill tool:**
582
+ ```
583
+ Use the Skill tool with skill: "speed-mode"
584
+ ```
585
+
586
+ **🛑 CRITICAL:** You MUST use the Skill tool to invoke speed-mode. The `work start` command only sets up the worktree - it does NOT automatically start the skill. If you skip this step, the user will be left without guidance.
503
587
 
504
- **The speed-mode skill takes over from here and handles the implementation.**
588
+ **Feature-planning skill is now complete.** Speed-mode takes over and handles the implementation.
505
589
 
506
590
  ## Example: Feature Planning Flow
507
591
 
@@ -557,3 +641,4 @@ Before completing feature planning, ensure:
557
641
  - [ ] Feature transitioned to implementation with `work implement`
558
642
  - [ ] Speed mode chores created
559
643
  - [ ] First chore started with `work start [chore-id]` (Step 8D)
644
+ - [ ] **Speed-mode skill invoked using Skill tool** (Step 8D)