jettypod 4.1.1 → 4.1.3
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/.devpod/current-work.json +10 -0
- package/.devpod/work.db +0 -0
- package/package.json +3 -2
- package/skills-templates/stable-mode/SKILL.md +62 -36
- package/test-tmp/{external-transition-1762982858258 → external-transition-1762983159050}/.claude/skills/stable-mode/SKILL.md +62 -36
- package/test-tmp/external-transition-1762983159304/.claude/settings.json +24 -0
- package/test-tmp/external-transition-1762983159304/.claude/skills/epic-planning/SKILL.md +297 -0
- package/test-tmp/external-transition-1762983159304/.claude/skills/external-transition/SKILL.md +384 -0
- package/test-tmp/external-transition-1762983159304/.claude/skills/feature-planning/SKILL.md +464 -0
- package/test-tmp/external-transition-1762983159304/.claude/skills/production-mode/SKILL.md +369 -0
- package/test-tmp/external-transition-1762983159304/.claude/skills/speed-mode/SKILL.md +481 -0
- package/test-tmp/external-transition-1762983159304/.claude/skills/stable-mode/SKILL.md +713 -0
- package/test-tmp/external-transition-1762983159545/.claude/settings.json +24 -0
- package/test-tmp/external-transition-1762983159545/.claude/skills/epic-planning/SKILL.md +297 -0
- package/test-tmp/external-transition-1762983159545/.claude/skills/external-transition/SKILL.md +384 -0
- package/test-tmp/external-transition-1762983159545/.claude/skills/feature-planning/SKILL.md +464 -0
- package/test-tmp/external-transition-1762983159545/.claude/skills/production-mode/SKILL.md +369 -0
- package/test-tmp/external-transition-1762983159545/.claude/skills/speed-mode/SKILL.md +481 -0
- package/test-tmp/external-transition-1762983159545/.claude/skills/stable-mode/SKILL.md +713 -0
- package/test-tmp/external-transition-1762983159795/.claude/settings.json +24 -0
- package/test-tmp/external-transition-1762983159795/.claude/skills/epic-planning/SKILL.md +297 -0
- package/test-tmp/external-transition-1762983159795/.claude/skills/external-transition/SKILL.md +384 -0
- package/test-tmp/external-transition-1762983159795/.claude/skills/feature-planning/SKILL.md +464 -0
- package/test-tmp/external-transition-1762983159795/.claude/skills/production-mode/SKILL.md +369 -0
- package/test-tmp/external-transition-1762983159795/.claude/skills/speed-mode/SKILL.md +481 -0
- package/test-tmp/external-transition-1762983159795/.claude/skills/stable-mode/SKILL.md +713 -0
- package/test-tmp/external-transition-1762983160031/.claude/settings.json +24 -0
- package/test-tmp/external-transition-1762983160031/.claude/skills/epic-planning/SKILL.md +297 -0
- package/test-tmp/external-transition-1762983160031/.claude/skills/external-transition/SKILL.md +384 -0
- package/test-tmp/external-transition-1762983160031/.claude/skills/feature-planning/SKILL.md +464 -0
- package/test-tmp/external-transition-1762983160031/.claude/skills/production-mode/SKILL.md +369 -0
- package/test-tmp/external-transition-1762983160031/.claude/skills/speed-mode/SKILL.md +481 -0
- package/test-tmp/external-transition-1762983160031/.claude/skills/stable-mode/SKILL.md +713 -0
- package/test-tmp/external-transition-1762983160249/.claude/settings.json +24 -0
- package/test-tmp/external-transition-1762983160249/.claude/skills/epic-planning/SKILL.md +297 -0
- package/test-tmp/external-transition-1762983160249/.claude/skills/external-transition/SKILL.md +384 -0
- package/test-tmp/external-transition-1762983160249/.claude/skills/feature-planning/SKILL.md +464 -0
- package/test-tmp/external-transition-1762983160249/.claude/skills/production-mode/SKILL.md +369 -0
- package/test-tmp/external-transition-1762983160249/.claude/skills/speed-mode/SKILL.md +481 -0
- package/test-tmp/external-transition-1762983160249/.claude/skills/stable-mode/SKILL.md +713 -0
- package/test-tmp/external-transition-1762983160548/.claude/settings.json +24 -0
- package/test-tmp/external-transition-1762983160548/.claude/skills/epic-planning/SKILL.md +297 -0
- package/test-tmp/external-transition-1762983160548/.claude/skills/external-transition/SKILL.md +384 -0
- package/test-tmp/external-transition-1762983160548/.claude/skills/feature-planning/SKILL.md +464 -0
- package/test-tmp/external-transition-1762983160548/.claude/skills/production-mode/SKILL.md +369 -0
- package/test-tmp/external-transition-1762983160548/.claude/skills/speed-mode/SKILL.md +481 -0
- package/test-tmp/external-transition-1762983160548/.claude/skills/stable-mode/SKILL.md +713 -0
- package/test-tmp/external-transition-1762983160653/.claude/settings.json +24 -0
- package/test-tmp/external-transition-1762983160653/.claude/skills/epic-planning/SKILL.md +297 -0
- package/test-tmp/external-transition-1762983160653/.claude/skills/external-transition/SKILL.md +384 -0
- package/test-tmp/external-transition-1762983160653/.claude/skills/feature-planning/SKILL.md +464 -0
- package/test-tmp/external-transition-1762983160653/.claude/skills/production-mode/SKILL.md +369 -0
- package/test-tmp/external-transition-1762983160653/.claude/skills/speed-mode/SKILL.md +481 -0
- package/test-tmp/external-transition-1762983160653/.claude/skills/stable-mode/SKILL.md +713 -0
- package/test-tmp/external-transition-1762983160783/.claude/settings.json +24 -0
- package/test-tmp/external-transition-1762983160783/.claude/skills/epic-planning/SKILL.md +297 -0
- package/test-tmp/external-transition-1762983160783/.claude/skills/external-transition/SKILL.md +384 -0
- package/test-tmp/external-transition-1762983160783/.claude/skills/feature-planning/SKILL.md +464 -0
- package/test-tmp/external-transition-1762983160783/.claude/skills/production-mode/SKILL.md +369 -0
- package/test-tmp/external-transition-1762983160783/.claude/skills/speed-mode/SKILL.md +481 -0
- package/test-tmp/external-transition-1762983160783/.claude/skills/stable-mode/SKILL.md +713 -0
- package/test-tmp/external-transition-1762983160886/.claude/settings.json +24 -0
- package/test-tmp/external-transition-1762983160886/.claude/skills/epic-planning/SKILL.md +297 -0
- package/test-tmp/external-transition-1762983160886/.claude/skills/external-transition/SKILL.md +384 -0
- package/test-tmp/external-transition-1762983160886/.claude/skills/feature-planning/SKILL.md +464 -0
- package/test-tmp/external-transition-1762983160886/.claude/skills/production-mode/SKILL.md +369 -0
- package/test-tmp/external-transition-1762983160886/.claude/skills/speed-mode/SKILL.md +481 -0
- package/test-tmp/external-transition-1762983160886/.claude/skills/stable-mode/SKILL.md +713 -0
- package/test-tmp/external-transition-1762983160988/.claude/settings.json +24 -0
- package/test-tmp/external-transition-1762983160988/.claude/skills/epic-planning/SKILL.md +297 -0
- package/test-tmp/external-transition-1762983160988/.claude/skills/external-transition/SKILL.md +384 -0
- package/test-tmp/external-transition-1762983160988/.claude/skills/feature-planning/SKILL.md +464 -0
- package/test-tmp/external-transition-1762983160988/.claude/skills/production-mode/SKILL.md +369 -0
- package/test-tmp/external-transition-1762983160988/.claude/skills/speed-mode/SKILL.md +481 -0
- package/test-tmp/external-transition-1762983160988/.claude/skills/stable-mode/SKILL.md +713 -0
- package/test-tmp/external-transition-1762983161151/.claude/settings.json +24 -0
- package/test-tmp/external-transition-1762983161151/.claude/skills/epic-planning/SKILL.md +297 -0
- package/test-tmp/external-transition-1762983161151/.claude/skills/external-transition/SKILL.md +384 -0
- package/test-tmp/external-transition-1762983161151/.claude/skills/feature-planning/SKILL.md +464 -0
- package/test-tmp/external-transition-1762983161151/.claude/skills/production-mode/SKILL.md +369 -0
- package/test-tmp/external-transition-1762983161151/.claude/skills/speed-mode/SKILL.md +481 -0
- package/test-tmp/external-transition-1762983161151/.claude/skills/stable-mode/SKILL.md +713 -0
- package/test-tmp/external-transition-1762983161276/.claude/settings.json +24 -0
- package/test-tmp/external-transition-1762983161276/.claude/skills/epic-planning/SKILL.md +297 -0
- package/test-tmp/external-transition-1762983161276/.claude/skills/external-transition/SKILL.md +384 -0
- package/test-tmp/external-transition-1762983161276/.claude/skills/feature-planning/SKILL.md +464 -0
- package/test-tmp/external-transition-1762983161276/.claude/skills/production-mode/SKILL.md +369 -0
- package/test-tmp/external-transition-1762983161276/.claude/skills/speed-mode/SKILL.md +481 -0
- package/test-tmp/external-transition-1762983161276/.claude/skills/stable-mode/SKILL.md +713 -0
- package/test-tmp/external-transition-1762983161477/.claude/settings.json +24 -0
- package/test-tmp/external-transition-1762983161477/.claude/skills/epic-planning/SKILL.md +297 -0
- package/test-tmp/external-transition-1762983161477/.claude/skills/external-transition/SKILL.md +384 -0
- package/test-tmp/external-transition-1762983161477/.claude/skills/feature-planning/SKILL.md +464 -0
- package/test-tmp/external-transition-1762983161477/.claude/skills/production-mode/SKILL.md +369 -0
- package/test-tmp/external-transition-1762983161477/.claude/skills/speed-mode/SKILL.md +481 -0
- package/test-tmp/external-transition-1762983161477/.claude/skills/stable-mode/SKILL.md +713 -0
- package/test-tmp/external-transition-1762983161583/.claude/settings.json +24 -0
- package/test-tmp/external-transition-1762983161583/.claude/skills/epic-planning/SKILL.md +297 -0
- package/test-tmp/external-transition-1762983161583/.claude/skills/external-transition/SKILL.md +384 -0
- package/test-tmp/external-transition-1762983161583/.claude/skills/feature-planning/SKILL.md +464 -0
- package/test-tmp/external-transition-1762983161583/.claude/skills/production-mode/SKILL.md +369 -0
- package/test-tmp/external-transition-1762983161583/.claude/skills/speed-mode/SKILL.md +481 -0
- package/test-tmp/external-transition-1762983161583/.claude/skills/stable-mode/SKILL.md +713 -0
- package/test-tmp/production-mode-1762983158973/features/test-feature.feature +22 -0
- package/test-tmp/production-mode-1762983158988/features/new-feature.feature +17 -0
- package/test-tmp/production-mode-1762983159002/features/test-feature.feature +4 -0
- package/test-tmp/production-mode-1762983159007/features/test-feature.feature +4 -0
- package/test-tmp/production-mode-1762983159013/features/test-feature.feature +4 -0
- package/test-tmp/production-mode-1762983159019/features/test-feature.feature +4 -0
- package/test-tmp/production-mode-1762983159034/features/test-feature.feature +4 -0
- /package/test-tmp/{external-transition-1762982858258 → external-transition-1762983159050}/.claude/settings.json +0 -0
- /package/test-tmp/{external-transition-1762982858258 → external-transition-1762983159050}/.claude/skills/epic-planning/SKILL.md +0 -0
- /package/test-tmp/{external-transition-1762982858258 → external-transition-1762983159050}/.claude/skills/external-transition/SKILL.md +0 -0
- /package/test-tmp/{external-transition-1762982858258 → external-transition-1762983159050}/.claude/skills/feature-planning/SKILL.md +0 -0
- /package/test-tmp/{external-transition-1762982858258 → external-transition-1762983159050}/.claude/skills/production-mode/SKILL.md +0 -0
- /package/test-tmp/{external-transition-1762982858258 → external-transition-1762983159050}/.claude/skills/speed-mode/SKILL.md +0 -0
- /package/test-tmp/{production-mode-1762982854924 → production-mode-1762983158995}/features/test-feature.feature +0 -0
package/.devpod/work.db
ADDED
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jettypod",
|
|
3
|
-
"version": "4.1.
|
|
3
|
+
"version": "4.1.3",
|
|
4
4
|
"description": "Simplified development mode manager",
|
|
5
5
|
"main": "jettypod.js",
|
|
6
6
|
"bin": {
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
"test:bdd": "NODE_ENV=test cucumber-js",
|
|
12
12
|
"test:unit": "NODE_ENV=test jest",
|
|
13
13
|
"test:unit:watch": "NODE_ENV=test jest --watch",
|
|
14
|
-
"test:cleanup": "node -e \"const fs = require('fs'); const path = require('path'); const testDb = path.join(process.cwd(), '.jettypod', 'test-work.db'); if (fs.existsSync(testDb)) { fs.unlinkSync(testDb); console.log('✅ Cleaned up test database'); }\""
|
|
14
|
+
"test:cleanup": "node -e \"const fs = require('fs'); const path = require('path'); const testDb = path.join(process.cwd(), '.jettypod', 'test-work.db'); if (fs.existsSync(testDb)) { fs.unlinkSync(testDb); console.log('✅ Cleaned up test database'); }\"",
|
|
15
|
+
"prepublishOnly": "echo '🔄 Syncing skills to templates...' && cp -r .claude/skills/* skills-templates/ && echo '✅ Skills synced'"
|
|
15
16
|
},
|
|
16
17
|
"devDependencies": {
|
|
17
18
|
"@cucumber/cucumber": "^10.0.1",
|
|
@@ -580,12 +580,12 @@ Implementation complete:
|
|
|
580
580
|
• All scenarios: ✅ Passing
|
|
581
581
|
```
|
|
582
582
|
|
|
583
|
-
### Step 4: Check for
|
|
583
|
+
### Step 4: Check for Production Mode (When All Stable Chores Complete)
|
|
584
584
|
|
|
585
|
-
**CRITICAL:
|
|
585
|
+
**CRITICAL: This step ONLY happens when ALL stable chores for the feature are complete. Otherwise skip to marking chore as done.**
|
|
586
586
|
|
|
587
|
+
**Check completion status and project state:**
|
|
587
588
|
```javascript
|
|
588
|
-
// Check if all stable chores for this feature are done
|
|
589
589
|
const { getDb } = require('../../lib/database');
|
|
590
590
|
const { getCurrentWork } = require('../../lib/current-work');
|
|
591
591
|
|
|
@@ -598,56 +598,82 @@ db.get(`
|
|
|
598
598
|
FROM work_items
|
|
599
599
|
WHERE parent_id = ?
|
|
600
600
|
AND type = 'chore'
|
|
601
|
-
AND
|
|
602
|
-
|
|
603
|
-
`, [featureId], async (err, result) => {
|
|
604
|
-
if (err) {
|
|
605
|
-
console.error('Error checking stable chores:', err.message);
|
|
606
|
-
db.close();
|
|
607
|
-
return;
|
|
608
|
-
}
|
|
609
|
-
|
|
601
|
+
AND status NOT IN ('done', 'cancelled')
|
|
602
|
+
`, [featureId], (err, result) => {
|
|
610
603
|
if (result.incomplete_count === 0) {
|
|
611
|
-
// All stable chores done
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
// 3. Ask for confirmation
|
|
624
|
-
// 4. Create production chores
|
|
625
|
-
// 5. Elevate feature to production mode
|
|
604
|
+
// All stable chores done - check project state
|
|
605
|
+
db.get('SELECT project_state FROM project_config WHERE id = 1', (err, config) => {
|
|
606
|
+
const projectState = config?.project_state || 'internal';
|
|
607
|
+
|
|
608
|
+
if (projectState === 'internal') {
|
|
609
|
+
// Internal project - stable mode is complete
|
|
610
|
+
console.log('Internal project - no production mode needed');
|
|
611
|
+
} else {
|
|
612
|
+
// External project - invoke production-mode skill
|
|
613
|
+
console.log('External project - auto-generating production chores from standards');
|
|
614
|
+
}
|
|
615
|
+
});
|
|
626
616
|
} else {
|
|
617
|
+
// More chores remain - just mark this one done
|
|
627
618
|
console.log(`\n📋 ${result.incomplete_count} stable mode chores remaining`);
|
|
628
619
|
}
|
|
629
|
-
|
|
630
620
|
db.close();
|
|
631
621
|
});
|
|
632
622
|
```
|
|
633
623
|
|
|
634
|
-
**
|
|
624
|
+
**If all stable chores are done AND project is INTERNAL:**
|
|
625
|
+
|
|
626
|
+
```
|
|
627
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
628
|
+
✅ FEATURE COMPLETE!
|
|
629
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
630
|
+
|
|
631
|
+
What we accomplished:
|
|
632
|
+
✅ All BDD scenarios passing (happy path + error handling + edge cases)
|
|
633
|
+
✅ Comprehensive error handling and validation
|
|
634
|
+
✅ Feature stable and ready to use
|
|
635
|
+
|
|
636
|
+
This is an internal project - no production hardening needed.
|
|
637
|
+
|
|
638
|
+
If you later transition to external state, production chores will be
|
|
639
|
+
automatically generated from production standards.
|
|
640
|
+
```
|
|
641
|
+
|
|
642
|
+
**If all stable chores are done AND project is EXTERNAL:**
|
|
643
|
+
|
|
644
|
+
Use the Skill tool to invoke the production-mode skill:
|
|
635
645
|
|
|
636
|
-
|
|
646
|
+
```javascript
|
|
647
|
+
// Use Skill tool to invoke: production-mode
|
|
648
|
+
// The production-mode skill will:
|
|
649
|
+
// 1. Detect feature context (Scenario A/B/C)
|
|
650
|
+
// 2. Generate production scenarios from standards
|
|
651
|
+
// 3. Append scenarios to feature file
|
|
652
|
+
// 4. Create production chores
|
|
653
|
+
```
|
|
654
|
+
|
|
655
|
+
Display to user:
|
|
637
656
|
|
|
638
657
|
```
|
|
639
658
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
640
|
-
|
|
659
|
+
✅ ALL STABLE MODE CHORES COMPLETE!
|
|
641
660
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
642
661
|
|
|
643
662
|
What we accomplished:
|
|
644
663
|
✅ All BDD scenarios passing (happy path + error handling + edge cases)
|
|
645
|
-
✅ Comprehensive error handling
|
|
646
|
-
✅
|
|
647
|
-
|
|
664
|
+
✅ Comprehensive error handling and validation
|
|
665
|
+
✅ Feature stable and ready for production hardening
|
|
666
|
+
|
|
667
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
668
|
+
🚀 AUTO-GENERATING PRODUCTION CHORES
|
|
669
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
670
|
+
|
|
671
|
+
This project is external - invoking production-mode skill to:
|
|
672
|
+
• Detect feature context (authentication/data/general)
|
|
673
|
+
• Generate production scenarios from standards
|
|
674
|
+
• Create production chores with proper scope
|
|
648
675
|
|
|
649
|
-
|
|
650
|
-
This happens automatically via the work tracking system.
|
|
676
|
+
[Invoke production-mode skill - it handles the rest autonomously]
|
|
651
677
|
```
|
|
652
678
|
|
|
653
679
|
**If stable chores remain:**
|
|
@@ -580,12 +580,12 @@ Implementation complete:
|
|
|
580
580
|
• All scenarios: ✅ Passing
|
|
581
581
|
```
|
|
582
582
|
|
|
583
|
-
### Step 4: Check for
|
|
583
|
+
### Step 4: Check for Production Mode (When All Stable Chores Complete)
|
|
584
584
|
|
|
585
|
-
**CRITICAL:
|
|
585
|
+
**CRITICAL: This step ONLY happens when ALL stable chores for the feature are complete. Otherwise skip to marking chore as done.**
|
|
586
586
|
|
|
587
|
+
**Check completion status and project state:**
|
|
587
588
|
```javascript
|
|
588
|
-
// Check if all stable chores for this feature are done
|
|
589
589
|
const { getDb } = require('../../lib/database');
|
|
590
590
|
const { getCurrentWork } = require('../../lib/current-work');
|
|
591
591
|
|
|
@@ -598,56 +598,82 @@ db.get(`
|
|
|
598
598
|
FROM work_items
|
|
599
599
|
WHERE parent_id = ?
|
|
600
600
|
AND type = 'chore'
|
|
601
|
-
AND
|
|
602
|
-
|
|
603
|
-
`, [featureId], async (err, result) => {
|
|
604
|
-
if (err) {
|
|
605
|
-
console.error('Error checking stable chores:', err.message);
|
|
606
|
-
db.close();
|
|
607
|
-
return;
|
|
608
|
-
}
|
|
609
|
-
|
|
601
|
+
AND status NOT IN ('done', 'cancelled')
|
|
602
|
+
`, [featureId], (err, result) => {
|
|
610
603
|
if (result.incomplete_count === 0) {
|
|
611
|
-
// All stable chores done
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
// 3. Ask for confirmation
|
|
624
|
-
// 4. Create production chores
|
|
625
|
-
// 5. Elevate feature to production mode
|
|
604
|
+
// All stable chores done - check project state
|
|
605
|
+
db.get('SELECT project_state FROM project_config WHERE id = 1', (err, config) => {
|
|
606
|
+
const projectState = config?.project_state || 'internal';
|
|
607
|
+
|
|
608
|
+
if (projectState === 'internal') {
|
|
609
|
+
// Internal project - stable mode is complete
|
|
610
|
+
console.log('Internal project - no production mode needed');
|
|
611
|
+
} else {
|
|
612
|
+
// External project - invoke production-mode skill
|
|
613
|
+
console.log('External project - auto-generating production chores from standards');
|
|
614
|
+
}
|
|
615
|
+
});
|
|
626
616
|
} else {
|
|
617
|
+
// More chores remain - just mark this one done
|
|
627
618
|
console.log(`\n📋 ${result.incomplete_count} stable mode chores remaining`);
|
|
628
619
|
}
|
|
629
|
-
|
|
630
620
|
db.close();
|
|
631
621
|
});
|
|
632
622
|
```
|
|
633
623
|
|
|
634
|
-
**
|
|
624
|
+
**If all stable chores are done AND project is INTERNAL:**
|
|
625
|
+
|
|
626
|
+
```
|
|
627
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
628
|
+
✅ FEATURE COMPLETE!
|
|
629
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
630
|
+
|
|
631
|
+
What we accomplished:
|
|
632
|
+
✅ All BDD scenarios passing (happy path + error handling + edge cases)
|
|
633
|
+
✅ Comprehensive error handling and validation
|
|
634
|
+
✅ Feature stable and ready to use
|
|
635
|
+
|
|
636
|
+
This is an internal project - no production hardening needed.
|
|
637
|
+
|
|
638
|
+
If you later transition to external state, production chores will be
|
|
639
|
+
automatically generated from production standards.
|
|
640
|
+
```
|
|
641
|
+
|
|
642
|
+
**If all stable chores are done AND project is EXTERNAL:**
|
|
643
|
+
|
|
644
|
+
Use the Skill tool to invoke the production-mode skill:
|
|
635
645
|
|
|
636
|
-
|
|
646
|
+
```javascript
|
|
647
|
+
// Use Skill tool to invoke: production-mode
|
|
648
|
+
// The production-mode skill will:
|
|
649
|
+
// 1. Detect feature context (Scenario A/B/C)
|
|
650
|
+
// 2. Generate production scenarios from standards
|
|
651
|
+
// 3. Append scenarios to feature file
|
|
652
|
+
// 4. Create production chores
|
|
653
|
+
```
|
|
654
|
+
|
|
655
|
+
Display to user:
|
|
637
656
|
|
|
638
657
|
```
|
|
639
658
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
640
|
-
|
|
659
|
+
✅ ALL STABLE MODE CHORES COMPLETE!
|
|
641
660
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
642
661
|
|
|
643
662
|
What we accomplished:
|
|
644
663
|
✅ All BDD scenarios passing (happy path + error handling + edge cases)
|
|
645
|
-
✅ Comprehensive error handling
|
|
646
|
-
✅
|
|
647
|
-
|
|
664
|
+
✅ Comprehensive error handling and validation
|
|
665
|
+
✅ Feature stable and ready for production hardening
|
|
666
|
+
|
|
667
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
668
|
+
🚀 AUTO-GENERATING PRODUCTION CHORES
|
|
669
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
670
|
+
|
|
671
|
+
This project is external - invoking production-mode skill to:
|
|
672
|
+
• Detect feature context (authentication/data/general)
|
|
673
|
+
• Generate production scenarios from standards
|
|
674
|
+
• Create production chores with proper scope
|
|
648
675
|
|
|
649
|
-
|
|
650
|
-
This happens automatically via the work tracking system.
|
|
676
|
+
[Invoke production-mode skill - it handles the rest autonomously]
|
|
651
677
|
```
|
|
652
678
|
|
|
653
679
|
**If stable chores remain:**
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"hooks": {
|
|
3
|
+
"PreToolUse": [
|
|
4
|
+
{
|
|
5
|
+
"matcher": "Edit",
|
|
6
|
+
"hooks": [
|
|
7
|
+
{
|
|
8
|
+
"type": "command",
|
|
9
|
+
"command": ".jettypod/hooks/protect-claude-md.js"
|
|
10
|
+
}
|
|
11
|
+
]
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"matcher": "Write",
|
|
15
|
+
"hooks": [
|
|
16
|
+
{
|
|
17
|
+
"type": "command",
|
|
18
|
+
"command": ".jettypod/hooks/protect-claude-md.js"
|
|
19
|
+
}
|
|
20
|
+
]
|
|
21
|
+
}
|
|
22
|
+
]
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: epic-planning
|
|
3
|
+
description: Guide epic planning with feature brainstorming and optional architectural decision prototyping. Use when user asks to plan an epic, mentions planning features for an epic, says "help me plan epic", or when they just created an epic and want to break it down into features.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Epic Planning Skill
|
|
7
|
+
|
|
8
|
+
Guides Claude through comprehensive epic planning including feature identification and architectural decisions.
|
|
9
|
+
|
|
10
|
+
## Instructions
|
|
11
|
+
|
|
12
|
+
When this skill is activated, you are helping plan an epic. Follow this structured approach:
|
|
13
|
+
|
|
14
|
+
### Step 1: Understand the Epic
|
|
15
|
+
|
|
16
|
+
You'll receive context about the epic being planned. Review:
|
|
17
|
+
- Epic title and description
|
|
18
|
+
- Project context
|
|
19
|
+
- Any parent context
|
|
20
|
+
|
|
21
|
+
### Step 2: Check Existing Features and Decisions
|
|
22
|
+
|
|
23
|
+
**CRITICAL:** Before suggesting features or approaches, check what already exists:
|
|
24
|
+
|
|
25
|
+
**Check for existing features:**
|
|
26
|
+
```bash
|
|
27
|
+
node jettypod.js backlog | grep -A 20 "Epic Name"
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
If features already exist, acknowledge them and skip to Step 4 (Architectural Decision).
|
|
31
|
+
|
|
32
|
+
**Check for existing decisions:**
|
|
33
|
+
```bash
|
|
34
|
+
node -e "const { showDecisionsForEpic } = require('./features/decisions/index.js'); showDecisionsForEpic(epicId)"
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
If decisions exist, present them to the user:
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
🎯 **Existing Architectural Decisions for This Epic:**
|
|
41
|
+
|
|
42
|
+
[For each decision:]
|
|
43
|
+
- **[Aspect]:** [Decision]
|
|
44
|
+
*Rationale:* [Why this was chosen]
|
|
45
|
+
*Decided:* [Date]
|
|
46
|
+
|
|
47
|
+
These decisions were made previously. Before we continue:
|
|
48
|
+
1. Do these decisions still apply?
|
|
49
|
+
2. Should we revisit any of them?
|
|
50
|
+
3. Are there additional aspects we need to decide?
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Only proceed with suggesting new architectural options if:
|
|
54
|
+
- No decisions exist yet, OR
|
|
55
|
+
- User confirms decisions need to be revisited, OR
|
|
56
|
+
- User identifies new aspects to decide
|
|
57
|
+
|
|
58
|
+
### Step 3: Brainstorm Features (Skip if Features Already Exist)
|
|
59
|
+
|
|
60
|
+
Based on the epic's purpose, suggest features that belong in this epic:
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
I'll help you plan the features for this epic.
|
|
64
|
+
|
|
65
|
+
Based on [epic name], here are the features I recommend:
|
|
66
|
+
|
|
67
|
+
**Feature 1: [Name]** - [Brief description of what users can do]
|
|
68
|
+
**Feature 2: [Name]** - [Brief description]
|
|
69
|
+
**Feature 3: [Name]** - [Brief description]
|
|
70
|
+
...
|
|
71
|
+
|
|
72
|
+
**Questions:**
|
|
73
|
+
- [Any clarifying questions about scope]
|
|
74
|
+
- [Missing features to consider]
|
|
75
|
+
|
|
76
|
+
What features should we include? What am I missing?
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Step 4: Architectural Decision (Optional)
|
|
80
|
+
|
|
81
|
+
After features are defined, ask if this epic needs a shared technical approach:
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
**Architectural question:** Does this epic need a shared technical decision?
|
|
85
|
+
|
|
86
|
+
For example:
|
|
87
|
+
- Which library/framework for this capability?
|
|
88
|
+
- What data structure or protocol?
|
|
89
|
+
- What architectural pattern?
|
|
90
|
+
|
|
91
|
+
Examples where architectural decisions matter:
|
|
92
|
+
- Real-time features: WebSockets vs SSE vs polling?
|
|
93
|
+
- Auth system: Which auth library and token strategy?
|
|
94
|
+
- Data sync: Optimistic vs pessimistic locking?
|
|
95
|
+
|
|
96
|
+
Should we explore different architectural approaches?
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Step 5A: If Architectural Decision Needed
|
|
100
|
+
|
|
101
|
+
If the epic needs architectural decision, suggest exactly 3 approaches:
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
Here are 3 different architectural approaches for [epic name]:
|
|
105
|
+
|
|
106
|
+
**Option 1: [Simple/Conservative approach name]**
|
|
107
|
+
- **Pros**: ✅ [2-3 advantages - proven, reliable, fast to implement]
|
|
108
|
+
- **Cons**: ❌ [2-3 trade-offs - limitations, constraints]
|
|
109
|
+
- **Technical Impact**: [How this affects the features in this epic]
|
|
110
|
+
|
|
111
|
+
**Option 2: [Balanced approach name]**
|
|
112
|
+
- **Pros**: ✅ [2-3 advantages - good balance]
|
|
113
|
+
- **Cons**: ❌ [2-3 trade-offs]
|
|
114
|
+
- **Technical Impact**: [How this affects the features in this epic]
|
|
115
|
+
|
|
116
|
+
**Option 3: [Advanced/Modern approach name]**
|
|
117
|
+
- **Pros**: ✅ [2-3 advantages - powerful, flexible]
|
|
118
|
+
- **Cons**: ❌ [2-3 trade-offs - complexity, learning curve]
|
|
119
|
+
- **Technical Impact**: [How this affects the features in this epic]
|
|
120
|
+
|
|
121
|
+
**Additional approaches considered but not recommended:**
|
|
122
|
+
- *[Alternative 1]*: [Brief] - Not selected because [reason]
|
|
123
|
+
- *[Alternative 2]*: [Brief] - Not selected because [reason]
|
|
124
|
+
|
|
125
|
+
Would you like me to create working prototypes of these architectural approaches?
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Step 5B: If Prototyping Needed
|
|
129
|
+
|
|
130
|
+
If user wants to prototype approaches:
|
|
131
|
+
|
|
132
|
+
1. Build 2-3 prototype approaches in `/prototypes/epic-[id]-[approach-name]/`
|
|
133
|
+
2. Each prototype should demonstrate the architectural difference
|
|
134
|
+
3. **Add prototype header**:
|
|
135
|
+
```
|
|
136
|
+
// Prototype: Epic [epic-id] - [approach name]
|
|
137
|
+
// Created: [date]
|
|
138
|
+
// Purpose: Demonstrate [architectural aspect]
|
|
139
|
+
// Decision: [to be filled after testing]
|
|
140
|
+
```
|
|
141
|
+
4. After user tests, help them choose the winner
|
|
142
|
+
5. Document the decision and rationale
|
|
143
|
+
|
|
144
|
+
### Step 5C: If Approach Already Known
|
|
145
|
+
|
|
146
|
+
If user already knows the approach or skips prototyping:
|
|
147
|
+
|
|
148
|
+
```
|
|
149
|
+
Which architectural approach works best for this epic?
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Then record their decision.
|
|
153
|
+
|
|
154
|
+
### Step 6: Create Features and Complete Discovery
|
|
155
|
+
|
|
156
|
+
Once features are defined and architectural decision is made (if needed):
|
|
157
|
+
|
|
158
|
+
**CRITICAL: You must EXECUTE commands using the Bash tool. Do NOT just display them as text.**
|
|
159
|
+
|
|
160
|
+
#### Step 6A: Create Features
|
|
161
|
+
|
|
162
|
+
Use the Bash tool to create each feature:
|
|
163
|
+
|
|
164
|
+
```javascript
|
|
165
|
+
// For each feature, use Bash tool to execute:
|
|
166
|
+
node jettypod.js work create feature "[Feature 1]" "[Description]" --parent=[epic-id]
|
|
167
|
+
node jettypod.js work create feature "[Feature 2]" "[Description]" --parent=[epic-id]
|
|
168
|
+
// etc.
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Display to user as you create each one:
|
|
172
|
+
```
|
|
173
|
+
Creating features...
|
|
174
|
+
✅ Created Feature #123: [Feature 1]
|
|
175
|
+
✅ Created Feature #456: [Feature 2]
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
#### Step 6B: Record Architectural Decision (if applicable)
|
|
179
|
+
|
|
180
|
+
If an architectural decision was made, propose the rationale to the user:
|
|
181
|
+
|
|
182
|
+
```
|
|
183
|
+
I'm going to record this architectural decision:
|
|
184
|
+
|
|
185
|
+
Aspect: Architecture
|
|
186
|
+
Decision: [architectural approach chosen]
|
|
187
|
+
Rationale: [why this approach was selected]
|
|
188
|
+
|
|
189
|
+
Does this rationale capture why you chose this approach? (You can edit it if needed)
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
**WAIT for user to confirm or provide edited rationale.**
|
|
193
|
+
|
|
194
|
+
**CRITICAL: After user confirms, use Bash tool to EXECUTE the epic-implement command:**
|
|
195
|
+
|
|
196
|
+
```javascript
|
|
197
|
+
// Use Bash tool to execute:
|
|
198
|
+
node jettypod.js work epic-implement [epic-id] \
|
|
199
|
+
--aspect="Architecture" \
|
|
200
|
+
--decision="[architectural approach chosen]" \
|
|
201
|
+
--rationale="[user's confirmed/edited rationale]"
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
**DO NOT display this as example text. EXECUTE IT using the Bash tool.**
|
|
205
|
+
|
|
206
|
+
After execution succeeds, verify the decision was recorded and display:
|
|
207
|
+
|
|
208
|
+
```
|
|
209
|
+
✅ Architectural decision recorded
|
|
210
|
+
|
|
211
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
212
|
+
🎯 Epic Planning Complete!
|
|
213
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
214
|
+
|
|
215
|
+
Features created: [count]
|
|
216
|
+
Architectural decision: Recorded
|
|
217
|
+
|
|
218
|
+
**Next step:** Plan your first feature
|
|
219
|
+
Run: jettypod work discover [feature-id]
|
|
220
|
+
Or talk to Claude Code: "Let's do feature discovery for #[feature-id]"
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
## Key Principles
|
|
224
|
+
|
|
225
|
+
1. **Feature brainstorming is always required** - Don't skip this even if architectural decision is clear
|
|
226
|
+
2. **Architectural decision is optional** - Not all epics need one (e.g., "Q1 Goals" is just grouping)
|
|
227
|
+
3. **Always suggest exactly 3 options** when architectural decision needed - Simple/Conservative, Balanced, Advanced
|
|
228
|
+
4. **Be specific about features** - Each feature should be user-facing capability
|
|
229
|
+
5. **Use the Approach Suggestion template** - Pros, Cons, Technical Impact format
|
|
230
|
+
6. **Suggest next step** - Always end with clear guidance on what to do next
|
|
231
|
+
7. **Use jettypod commands** - Create features using jettypod CLI, record decisions with epic-implement
|
|
232
|
+
|
|
233
|
+
## Example: Epic with Architectural Decision
|
|
234
|
+
|
|
235
|
+
Epic: "Real-time Collaboration"
|
|
236
|
+
|
|
237
|
+
**Features brainstormed:**
|
|
238
|
+
- Live cursor tracking
|
|
239
|
+
- Concurrent editing with conflict resolution
|
|
240
|
+
- Presence indicators
|
|
241
|
+
- Real-time chat
|
|
242
|
+
|
|
243
|
+
**Architectural approaches suggested:**
|
|
244
|
+
|
|
245
|
+
**Option 1: Long Polling (REST)**
|
|
246
|
+
- **Pros**: ✅ Simple, works with all proxies, uses existing HTTP infrastructure
|
|
247
|
+
- **Cons**: ❌ Higher latency (1-2s), more server load, inefficient for high-frequency updates
|
|
248
|
+
- **Technical Impact**: Each feature polls independently, easy to implement per feature
|
|
249
|
+
|
|
250
|
+
**Option 2: Server-Sent Events (SSE)**
|
|
251
|
+
- **Pros**: ✅ Lightweight, auto-reconnection, efficient one-way streaming
|
|
252
|
+
- **Cons**: ❌ One-direction only (server→client), limited browser connections (6 per domain)
|
|
253
|
+
- **Technical Impact**: Good for cursor/presence, requires separate POST for edits
|
|
254
|
+
|
|
255
|
+
**Option 3: WebSockets (Socket.io)**
|
|
256
|
+
- **Pros**: ✅ Bidirectional, low latency (<100ms), perfect for real-time, fallback support
|
|
257
|
+
- **Cons**: ❌ More complex infrastructure, requires sticky sessions, WebSocket proxies needed
|
|
258
|
+
- **Technical Impact**: All features use unified connection, best UX but infrastructure complexity
|
|
259
|
+
|
|
260
|
+
**Additional approaches considered:**
|
|
261
|
+
- *WebRTC Data Channels*: Peer-to-peer, low latency - Not selected due to NAT/firewall traversal complexity
|
|
262
|
+
- *GraphQL Subscriptions*: Good for selective updates - Not selected as overkill for this use case
|
|
263
|
+
|
|
264
|
+
**User choice:** Option 3 (WebSockets with Socket.io)
|
|
265
|
+
|
|
266
|
+
**Rationale confirmation:**
|
|
267
|
+
Claude proposes: "Bidirectional real-time updates needed for collaboration, Socket.io provides fallbacks and auto-reconnection"
|
|
268
|
+
User confirms: "Yes, that's right"
|
|
269
|
+
|
|
270
|
+
**Command run:**
|
|
271
|
+
```bash
|
|
272
|
+
jettypod work epic-implement 5 \
|
|
273
|
+
--aspect="Architecture" \
|
|
274
|
+
--decision="WebSockets with Socket.io" \
|
|
275
|
+
--rationale="Bidirectional real-time updates needed for collaboration, Socket.io provides fallbacks and auto-reconnection"
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
## Example: Epic without Architectural Decision
|
|
279
|
+
|
|
280
|
+
Epic: "User Management"
|
|
281
|
+
|
|
282
|
+
**Features brainstormed:**
|
|
283
|
+
- User registration
|
|
284
|
+
- Profile editing
|
|
285
|
+
- Password reset
|
|
286
|
+
- Account deletion
|
|
287
|
+
|
|
288
|
+
**Architectural decision:** None needed - these are independent features using existing auth system
|
|
289
|
+
|
|
290
|
+
## Validation
|
|
291
|
+
|
|
292
|
+
Before completing epic discovery, ensure:
|
|
293
|
+
- [ ] At least 2-3 features identified
|
|
294
|
+
- [ ] Features are user-facing capabilities (not technical tasks)
|
|
295
|
+
- [ ] Architectural decision documented if needed
|
|
296
|
+
- [ ] Features created in database
|
|
297
|
+
- [ ] User knows next step .jettypod work discover [feature-id])
|