jettypod 4.4.10 → 4.4.12
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.
- package/apps/dashboard/README.md +36 -0
- package/apps/dashboard/app/favicon.ico +0 -0
- package/apps/dashboard/app/globals.css +122 -0
- package/apps/dashboard/app/layout.tsx +34 -0
- package/apps/dashboard/app/page.tsx +25 -0
- package/apps/dashboard/app/work/[id]/page.tsx +193 -0
- package/apps/dashboard/components/KanbanBoard.tsx +201 -0
- package/apps/dashboard/components/WorkItemTree.tsx +116 -0
- package/apps/dashboard/components.json +22 -0
- package/apps/dashboard/eslint.config.mjs +18 -0
- package/apps/dashboard/lib/db.ts +270 -0
- package/apps/dashboard/lib/utils.ts +6 -0
- package/apps/dashboard/next.config.ts +7 -0
- package/apps/dashboard/package.json +33 -0
- package/apps/dashboard/postcss.config.mjs +7 -0
- package/apps/dashboard/public/file.svg +1 -0
- package/apps/dashboard/public/globe.svg +1 -0
- package/apps/dashboard/public/next.svg +1 -0
- package/apps/dashboard/public/vercel.svg +1 -0
- package/apps/dashboard/public/window.svg +1 -0
- package/apps/dashboard/tsconfig.json +34 -0
- package/jettypod.js +41 -0
- package/lib/current-work.js +10 -18
- package/lib/migrations/016-workflow-checkpoints-table.js +70 -0
- package/lib/migrations/017-backfill-epic-id.js +54 -0
- package/lib/workflow-checkpoint.js +204 -0
- package/package.json +7 -2
- package/skills-templates/chore-mode/SKILL.md +3 -0
- package/skills-templates/epic-planning/SKILL.md +225 -154
- package/skills-templates/feature-planning/SKILL.md +172 -87
- package/skills-templates/speed-mode/SKILL.md +161 -338
- package/skills-templates/stable-mode/SKILL.md +150 -176
|
@@ -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` =
|
|
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:
|
|
33
|
+
### Step 1: Get Feature Context
|
|
30
34
|
|
|
31
|
-
|
|
32
|
-
-
|
|
33
|
-
-
|
|
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
|
-
|
|
39
|
+
**Then run:**
|
|
40
|
+
```bash
|
|
41
|
+
jettypod work show ${FEATURE_ID}
|
|
42
|
+
```
|
|
37
43
|
|
|
38
|
-
|
|
44
|
+
This returns: title, description, parent epic (if any), mode, phase, and any existing discovery decisions.
|
|
39
45
|
|
|
40
|
-
|
|
41
|
-
-
|
|
42
|
-
-
|
|
43
|
-
-
|
|
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
|
-
**
|
|
57
|
+
**Skip this step and proceed to Step 3 if `PARENT_EPIC_ID` from Step 1 is null (standalone feature).**
|
|
46
58
|
|
|
47
|
-
|
|
48
|
-
const { getDecisionsForEpic } = require('./lib/decisions-helpers');
|
|
59
|
+
If this feature belongs to an epic, check for existing architectural decisions.
|
|
49
60
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
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,
|
|
335
|
+
**CRITICAL:** After creating both scenario and step definition files, validate them with cucumber dry-run to catch errors immediately.
|
|
297
336
|
|
|
298
|
-
**
|
|
337
|
+
**Run this command** (replace `${FEATURE_SLUG}` with actual slug):
|
|
299
338
|
|
|
300
|
-
```
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
const path = require('path');
|
|
339
|
+
```bash
|
|
340
|
+
npx cucumber-js --dry-run features/${FEATURE_SLUG}.feature
|
|
341
|
+
```
|
|
304
342
|
|
|
305
|
-
|
|
343
|
+
Example:
|
|
344
|
+
```bash
|
|
345
|
+
npx cucumber-js --dry-run features/email-password-login.feature
|
|
346
|
+
```
|
|
306
347
|
|
|
307
|
-
|
|
308
|
-
const result = await validateBddInfrastructure(featurePath);
|
|
348
|
+
**What the output means:**
|
|
309
349
|
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
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
|
-
|
|
315
|
-
|
|
316
|
-
|
|
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
|
-
|
|
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
|
-
**
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
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.
|
|
332
|
-
2.
|
|
333
|
-
3.
|
|
334
|
-
4.
|
|
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
|
-
|
|
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
|
-
**
|
|
387
|
+
**Proceed to Step 7.**
|
|
343
388
|
|
|
344
|
-
|
|
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
|
-
**
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
• [
|
|
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
|
-
|
|
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
|
-
|
|
550
|
+
The completion message above already includes your recommendation. Now:
|
|
488
551
|
|
|
489
|
-
|
|
490
|
-
|
|
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
|
-
**
|
|
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
|
-
**
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
3
|
|
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
|
-
**
|
|
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)
|