jettypod 3.0.2 → 4.0.0
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/.claude/PROTECT_SKILLS.md +2 -2
- package/.claude/skills/{epic-discover → epic-planning}/SKILL.md +57 -22
- package/.claude/skills/{feature-discover → feature-planning}/SKILL.md +38 -22
- package/.claude/skills/speed-mode/SKILL.md +79 -8
- package/.claude/skills/stable-mode/SKILL.md +83 -1
- package/SYSTEM-BEHAVIOR.md +172 -21
- package/docs/COMMAND_REFERENCE.md +26 -26
- package/docs/gap-analysis-current-vs-comprehensive-methodology.md +3 -3
- package/features/auto-generate-production-chores.feature +62 -11
- package/features/backlog-command.feature +26 -0
- package/features/claude-md-protection/steps.js +6 -4
- package/features/decisions/index.js +10 -10
- package/features/git-hooks/simple-steps.js +4 -4
- package/features/git-hooks/steps.js +7 -7
- package/features/mode-prompts/simple-steps.js +3 -3
- package/features/step_definitions/auto-generate-production-chores.steps.js +542 -114
- package/features/step_definitions/backlog-command.steps.js +37 -0
- package/features/work-commands/index.js +192 -8
- package/features/work-commands/simple-steps.js +5 -5
- package/features/work-commands/steps.js +2 -2
- package/features/work-tracking/index.js +220 -38
- package/features/work-tracking/mode-required.feature +1 -1
- package/jettypod.js +15 -8
- package/lib/migrations/009-discovery-rationale-field.js +24 -0
- package/lib/production-chore-generator.js +198 -0
- package/package.json +1 -1
package/SYSTEM-BEHAVIOR.md
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
# JettyPod System Behaviors
|
|
2
2
|
|
|
3
|
-
*Auto-generated from test scenarios on 2025-11-
|
|
3
|
+
*Auto-generated from test scenarios on 2025-11-10*
|
|
4
4
|
|
|
5
5
|
## Summary
|
|
6
6
|
|
|
7
|
-
- **
|
|
8
|
-
- **
|
|
9
|
-
- **
|
|
7
|
+
- **14** features
|
|
8
|
+
- **73** test scenarios
|
|
9
|
+
- **360** test steps
|
|
10
10
|
|
|
11
11
|
## Table of Contents
|
|
12
12
|
|
|
13
|
-
- [Auto-
|
|
13
|
+
- [Auto-Generate Production Chores at End of Stable Mode](#auto-generate-production-chores-at-end-of-stable-mode) (6 scenarios)
|
|
14
|
+
- [Backlog Command](#backlog-command) (3 scenarios)
|
|
14
15
|
- [Git Hook Integration](#git-hook-integration) (4 scenarios)
|
|
15
16
|
- [Git Hooks Integration](#git-hooks-integration) (1 scenarios)
|
|
16
17
|
- [JettyPod update command](#jettypod-update-command) (5 scenarios)
|
|
@@ -30,14 +31,46 @@
|
|
|
30
31
|
|
|
31
32
|
This documentation is derived from actual passing tests. It describes the verified behaviors of the system.
|
|
32
33
|
|
|
33
|
-
### Auto-
|
|
34
|
+
### Auto-Generate Production Chores at End of Stable Mode
|
|
34
35
|
|
|
35
|
-
*Related features: Auto-
|
|
36
|
+
*Related features: Auto-Generate Production Chores at End of Stable Mode*
|
|
36
37
|
|
|
37
38
|
**Verified behaviors:**
|
|
38
39
|
|
|
39
|
-
- **
|
|
40
|
-
When I have a
|
|
40
|
+
- **Generate production chores after stable mode completes (external project)**
|
|
41
|
+
When I have a feature with all stable mode scenarios passing, the project state is "external", the stable mode skill has hot context from implementation, the stable mode skill completes and I confirm the production chores → it analyzes the implementation files for production gaps and it proposes specific production chores with file references and it shows a preview of the production chores and it asks for confirmation and it creates the production chores in production mode and the chores are visible in the backlog and the feature transitions to production mode and I see "✅ Created N production chores. Feature elevated to production mode."
|
|
42
|
+
|
|
43
|
+
- **User declines production chore creation**
|
|
44
|
+
When I have a feature with all stable mode scenarios passing, the project state is "external", the stable mode skill has hot context from implementation, the stable mode skill completes and it proposes production chores and I decline the production chores → no production chores are created and the feature remains in stable mode and I see "⏭️ Skipped production chore creation"
|
|
45
|
+
|
|
46
|
+
- **No implementation files found in git history**
|
|
47
|
+
When I have a feature with all stable mode scenarios passing, the feature has no git commits, the stable mode skill completes → it warns "No git commits found for this feature" and it creates generic production chores and the feature transitions to production mode
|
|
48
|
+
|
|
49
|
+
- **Internal project state (feature elevated to production mode)**
|
|
50
|
+
When I have a feature with all stable mode scenarios passing, the project state is "internal", the stable mode skill completes → it creates production chores and the feature transitions to production mode and I see "Created 3 production chores. Feature elevated to production mode."
|
|
51
|
+
|
|
52
|
+
- **No production gaps found**
|
|
53
|
+
When I have a feature with all stable mode scenarios passing, the implementation has no security, scale, or compliance gaps, the stable mode skill completes → it creates generic production chores as placeholders and the feature transitions to production mode
|
|
54
|
+
|
|
55
|
+
- **Feature already in production mode**
|
|
56
|
+
When I have a feature already in production mode, I try to complete a stable mode chore → the system does not trigger production chore generation and I see a warning "Feature is already in production mode"
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
### Backlog Command
|
|
61
|
+
|
|
62
|
+
*Related features: Backlog Command*
|
|
63
|
+
|
|
64
|
+
**Verified behaviors:**
|
|
65
|
+
|
|
66
|
+
- **User views active backlog items**
|
|
67
|
+
When I have work items in various statuses, I run "jettypod backlog" → I see only active work items (backlog, todo, in_progress) and I see the items in a tree hierarchy and completed items are hidden
|
|
68
|
+
|
|
69
|
+
- **User views all work items including completed**
|
|
70
|
+
When I have work items in various statuses, I run "jettypod backlog all" → I see all work items regardless of status and I see the items in a tree hierarchy
|
|
71
|
+
|
|
72
|
+
- **User views only completed items**
|
|
73
|
+
When I have work items in various statuses, I run "jettypod backlog completed" → I see only completed work items (done, cancelled) and I see the items in a tree hierarchy
|
|
41
74
|
|
|
42
75
|
---
|
|
43
76
|
|
|
@@ -246,7 +279,7 @@ This documentation is derived from actual passing tests. It describes the verifi
|
|
|
246
279
|
When jettypod is initialized, jettypod is initialized, I create a chore "Test Chore" without mode and I create a feature "Test Feature" with mode "<mode>" → the work item is created successfully and the work item has NULL mode and the work item is created successfully and the work item has mode "<mode>"
|
|
247
280
|
|
|
248
281
|
- **Epic with children in different modes**
|
|
249
|
-
When jettypod is initialized, I create an epic "Test Epic" without mode, I create a feature "Speed Feature" with mode "speed" and parent epic, I create a bug "Stable Bug" with mode "stable" and parent epic, I create a chore "Test Chore" without mode and parent epic, I view the
|
|
282
|
+
When jettypod is initialized, I create an epic "Test Epic" without mode, I create a feature "Speed Feature" with mode "speed" and parent epic, I create a bug "Stable Bug" with mode "stable" and parent epic, I create a chore "Test Chore" without mode and parent epic, I view the backlog → I see the epic without mode indicator and I see the feature with mode "speed" and I see the bug with mode "stable" and I see the chore without mode indicator
|
|
250
283
|
|
|
251
284
|
- **Create multiple items with same title but different modes**
|
|
252
285
|
When jettypod is initialized, I create a feature "Duplicate" with mode "speed" and I create a feature "Duplicate" with mode "stable" → both work items are created successfully and they have different modes
|
|
@@ -331,25 +364,143 @@ This documentation is derived from actual passing tests. It describes the verifi
|
|
|
331
364
|
|
|
332
365
|
## Detailed Feature Specifications
|
|
333
366
|
|
|
334
|
-
### Auto-
|
|
367
|
+
### Auto-Generate Production Chores at End of Stable Mode
|
|
335
368
|
|
|
336
|
-
When
|
|
369
|
+
When stable mode completes all scenarios for a feature, the skill analyzes the implementation with hot context and generates specific, actionable production chores. Chore visibility depends on project state (external vs internal). Epic: Production Mode Approach: Preview-and-Confirm (Transparent)
|
|
337
370
|
|
|
338
|
-
####
|
|
371
|
+
#### Generate production chores after stable mode completes (external project)
|
|
339
372
|
|
|
340
373
|
**Context:**
|
|
341
|
-
- I have a
|
|
374
|
+
- I have a feature with all stable mode scenarios passing
|
|
375
|
+
- the project state is "external"
|
|
376
|
+
- the stable mode skill has hot context from implementation
|
|
377
|
+
|
|
378
|
+
**Action:**
|
|
379
|
+
- the stable mode skill completes
|
|
380
|
+
- I confirm the production chores
|
|
381
|
+
|
|
382
|
+
**Expected outcome:**
|
|
383
|
+
- it analyzes the implementation files for production gaps
|
|
384
|
+
- it proposes specific production chores with file references
|
|
385
|
+
- it shows a preview of the production chores
|
|
386
|
+
- it asks for confirmation
|
|
387
|
+
- it creates the production chores in production mode
|
|
388
|
+
- the chores are visible in the backlog
|
|
389
|
+
- the feature transitions to production mode
|
|
390
|
+
- I see "✅ Created N production chores. Feature elevated to production mode."
|
|
391
|
+
|
|
392
|
+
#### User declines production chore creation
|
|
393
|
+
|
|
394
|
+
**Context:**
|
|
395
|
+
- I have a feature with all stable mode scenarios passing
|
|
396
|
+
- the project state is "external"
|
|
397
|
+
- the stable mode skill has hot context from implementation
|
|
398
|
+
|
|
399
|
+
**Action:**
|
|
400
|
+
- the stable mode skill completes
|
|
401
|
+
- it proposes production chores
|
|
402
|
+
- I decline the production chores
|
|
403
|
+
|
|
404
|
+
**Expected outcome:**
|
|
405
|
+
- no production chores are created
|
|
406
|
+
- the feature remains in stable mode
|
|
407
|
+
- I see "⏭️ Skipped production chore creation"
|
|
408
|
+
|
|
409
|
+
#### No implementation files found in git history
|
|
410
|
+
|
|
411
|
+
**Context:**
|
|
412
|
+
- I have a feature with all stable mode scenarios passing
|
|
413
|
+
- the feature has no git commits
|
|
414
|
+
|
|
415
|
+
**Action:**
|
|
416
|
+
- the stable mode skill completes
|
|
417
|
+
|
|
418
|
+
**Expected outcome:**
|
|
419
|
+
- it warns "No git commits found for this feature"
|
|
420
|
+
- it creates generic production chores
|
|
421
|
+
- the feature transitions to production mode
|
|
422
|
+
|
|
423
|
+
#### Internal project state (feature elevated to production mode)
|
|
424
|
+
|
|
425
|
+
**Context:**
|
|
426
|
+
- I have a feature with all stable mode scenarios passing
|
|
342
427
|
- the project state is "internal"
|
|
343
428
|
|
|
344
429
|
**Action:**
|
|
345
|
-
-
|
|
430
|
+
- the stable mode skill completes
|
|
431
|
+
|
|
432
|
+
**Expected outcome:**
|
|
433
|
+
- it creates production chores
|
|
434
|
+
- the feature transitions to production mode
|
|
435
|
+
- I see "Created 3 production chores. Feature elevated to production mode."
|
|
436
|
+
|
|
437
|
+
#### No production gaps found
|
|
438
|
+
|
|
439
|
+
**Context:**
|
|
440
|
+
- I have a feature with all stable mode scenarios passing
|
|
441
|
+
- the implementation has no security, scale, or compliance gaps
|
|
442
|
+
|
|
443
|
+
**Action:**
|
|
444
|
+
- the stable mode skill completes
|
|
445
|
+
|
|
446
|
+
**Expected outcome:**
|
|
447
|
+
- it creates generic production chores as placeholders
|
|
448
|
+
- the feature transitions to production mode
|
|
449
|
+
|
|
450
|
+
#### Feature already in production mode
|
|
451
|
+
|
|
452
|
+
**Context:**
|
|
453
|
+
- I have a feature already in production mode
|
|
454
|
+
|
|
455
|
+
**Action:**
|
|
456
|
+
- I try to complete a stable mode chore
|
|
457
|
+
|
|
458
|
+
**Expected outcome:**
|
|
459
|
+
- the system does not trigger production chore generation
|
|
460
|
+
- I see a warning "Feature is already in production mode"
|
|
461
|
+
|
|
462
|
+
---
|
|
463
|
+
|
|
464
|
+
### Backlog Command
|
|
465
|
+
|
|
466
|
+
Enhanced command to view work items with built-in filters Approach: Enhanced backlog with filters (backlog, backlog all, backlog completed)
|
|
467
|
+
|
|
468
|
+
#### User views active backlog items
|
|
469
|
+
|
|
470
|
+
**Context:**
|
|
471
|
+
- I have work items in various statuses
|
|
472
|
+
|
|
473
|
+
**Action:**
|
|
474
|
+
- I run "jettypod backlog"
|
|
475
|
+
|
|
476
|
+
**Expected outcome:**
|
|
477
|
+
- I see only active work items (backlog, todo, in_progress)
|
|
478
|
+
- I see the items in a tree hierarchy
|
|
479
|
+
- completed items are hidden
|
|
480
|
+
|
|
481
|
+
#### User views all work items including completed
|
|
482
|
+
|
|
483
|
+
**Context:**
|
|
484
|
+
- I have work items in various statuses
|
|
485
|
+
|
|
486
|
+
**Action:**
|
|
487
|
+
- I run "jettypod backlog all"
|
|
488
|
+
|
|
489
|
+
**Expected outcome:**
|
|
490
|
+
- I see all work items regardless of status
|
|
491
|
+
- I see the items in a tree hierarchy
|
|
492
|
+
|
|
493
|
+
#### User views only completed items
|
|
494
|
+
|
|
495
|
+
**Context:**
|
|
496
|
+
- I have work items in various statuses
|
|
497
|
+
|
|
498
|
+
**Action:**
|
|
499
|
+
- I run "jettypod backlog completed"
|
|
346
500
|
|
|
347
501
|
**Expected outcome:**
|
|
348
|
-
-
|
|
349
|
-
-
|
|
350
|
-
- 3 production chores are created for each stable feature
|
|
351
|
-
- the chores are grouped under the epic
|
|
352
|
-
- I see a summary of created chores
|
|
502
|
+
- I see only completed work items (done, cancelled)
|
|
503
|
+
- I see the items in a tree hierarchy
|
|
353
504
|
|
|
354
505
|
---
|
|
355
506
|
|
|
@@ -947,7 +1098,7 @@ As a developer I want new work items to default to discovery mode So I can start
|
|
|
947
1098
|
- I create a chore "Test Chore" without mode and parent epic
|
|
948
1099
|
|
|
949
1100
|
**Action:**
|
|
950
|
-
- I view the
|
|
1101
|
+
- I view the backlog
|
|
951
1102
|
|
|
952
1103
|
**Expected outcome:**
|
|
953
1104
|
- I see the epic without mode indicator
|
|
@@ -9,8 +9,8 @@ Complete reference for all JettyPod commands as of 2025-10-31.
|
|
|
9
9
|
1. [Initialization & Setup](#initialization--setup)
|
|
10
10
|
2. [Project Discovery](#project-discovery)
|
|
11
11
|
3. [Work Item Management](#work-item-management)
|
|
12
|
-
4. [Epic
|
|
13
|
-
5. [Feature
|
|
12
|
+
4. [Epic Planning](#epic-planning)
|
|
13
|
+
5. [Feature Planning](#feature-planning)
|
|
14
14
|
6. [Work Status & Navigation](#work-status--navigation)
|
|
15
15
|
7. [Mode Management](#mode-management)
|
|
16
16
|
8. [Decisions](#decisions)
|
|
@@ -119,7 +119,7 @@ jettypod work create epic "Real-time Updates" "Live data sync" --needs-discovery
|
|
|
119
119
|
|
|
120
120
|
**What it creates:**
|
|
121
121
|
- Epic work item in database
|
|
122
|
-
- Entry in
|
|
122
|
+
- Entry in backlog
|
|
123
123
|
- Triggers epic discovery prompt if `--needs-discovery` flag set
|
|
124
124
|
|
|
125
125
|
---
|
|
@@ -183,14 +183,14 @@ jettypod work create bug "Memory leak in dashboard" --parent=10
|
|
|
183
183
|
|
|
184
184
|
---
|
|
185
185
|
|
|
186
|
-
## Epic
|
|
186
|
+
## Epic Planning
|
|
187
187
|
|
|
188
|
-
### `jettypod work epic-
|
|
188
|
+
### `jettypod work epic-planning <epic-id>`
|
|
189
189
|
|
|
190
|
-
Start architectural
|
|
190
|
+
Start architectural planning for an epic.
|
|
191
191
|
|
|
192
192
|
```bash
|
|
193
|
-
jettypod work epic-
|
|
193
|
+
jettypod work epic-planning 5
|
|
194
194
|
```
|
|
195
195
|
|
|
196
196
|
**Prerequisites:**
|
|
@@ -198,7 +198,7 @@ jettypod work epic-discover 5
|
|
|
198
198
|
- Epic must be in backlog/todo status
|
|
199
199
|
|
|
200
200
|
**What it does:**
|
|
201
|
-
- Activates epic-
|
|
201
|
+
- Activates epic-planning skill in Claude Code
|
|
202
202
|
- Guides through architectural decision process
|
|
203
203
|
- Helps identify key technical decisions needed
|
|
204
204
|
|
|
@@ -253,11 +253,11 @@ jettypod work epic-implement 5 \
|
|
|
253
253
|
|
|
254
254
|
---
|
|
255
255
|
|
|
256
|
-
## Feature
|
|
256
|
+
## Feature Planning
|
|
257
257
|
|
|
258
258
|
### `jettypod work discover <feature-id>`
|
|
259
259
|
|
|
260
|
-
Start UX
|
|
260
|
+
Start UX planning for a feature.
|
|
261
261
|
|
|
262
262
|
```bash
|
|
263
263
|
jettypod work discover 12
|
|
@@ -268,7 +268,7 @@ jettypod work discover 12
|
|
|
268
268
|
- Feature must be in "discovery" phase
|
|
269
269
|
|
|
270
270
|
**What it does:**
|
|
271
|
-
- Activates feature-
|
|
271
|
+
- Activates feature-planning skill
|
|
272
272
|
- Guides through UX approach exploration
|
|
273
273
|
- Generates BDD scenarios
|
|
274
274
|
- Helps create discovery checkpoints
|
|
@@ -326,20 +326,20 @@ Focus: Happy path only, single file when possible
|
|
|
326
326
|
|
|
327
327
|
## Work Status & Navigation
|
|
328
328
|
|
|
329
|
-
### `jettypod
|
|
329
|
+
### `jettypod backlog [flags]`
|
|
330
330
|
|
|
331
331
|
Display hierarchical tree of all work items.
|
|
332
332
|
|
|
333
333
|
```bash
|
|
334
334
|
# Collapsed view (default)
|
|
335
|
-
jettypod
|
|
335
|
+
jettypod backlog
|
|
336
336
|
|
|
337
337
|
# Expand specific items
|
|
338
|
-
jettypod
|
|
339
|
-
jettypod
|
|
338
|
+
jettypod backlog --expand=1
|
|
339
|
+
jettypod backlog --expand=1,5,10
|
|
340
340
|
|
|
341
341
|
# Expand all items
|
|
342
|
-
jettypod
|
|
342
|
+
jettypod backlog --expand-all
|
|
343
343
|
```
|
|
344
344
|
|
|
345
345
|
**Flags:**
|
|
@@ -773,9 +773,9 @@ JettyPod uses SQLite with the following main tables:
|
|
|
773
773
|
├── work.db # SQLite database
|
|
774
774
|
├── current-work.json # Active work item
|
|
775
775
|
├── config.json # Project configuration
|
|
776
|
-
└── skills/ #
|
|
777
|
-
├── epic-
|
|
778
|
-
└── feature-
|
|
776
|
+
└── skills/ # Planning skills for Claude Code
|
|
777
|
+
├── epic-planning/
|
|
778
|
+
└── feature-planning/
|
|
779
779
|
|
|
780
780
|
docs/
|
|
781
781
|
└── DECISIONS.md # Auto-generated decision log
|
|
@@ -826,13 +826,13 @@ JettyPod is designed to work seamlessly with Claude Code:
|
|
|
826
826
|
- Includes mode-specific guidance
|
|
827
827
|
- Shows project state and decisions
|
|
828
828
|
|
|
829
|
-
###
|
|
830
|
-
- `epic-
|
|
831
|
-
- `feature-
|
|
829
|
+
### Planning Skills
|
|
830
|
+
- `epic-planning` - Guides architectural decisions
|
|
831
|
+
- `feature-planning` - Guides UX exploration
|
|
832
832
|
|
|
833
833
|
### Automatic Triggers
|
|
834
|
-
- Creating epic with `--needs-discovery` → prompts epic-
|
|
835
|
-
- Creating feature → prompts feature-
|
|
834
|
+
- Creating epic with `--needs-discovery` → prompts epic-planning
|
|
835
|
+
- Creating feature → prompts feature-planning
|
|
836
836
|
- Starting work → updates Claude context
|
|
837
837
|
|
|
838
838
|
---
|
|
@@ -864,8 +864,8 @@ JettyPod is designed to work seamlessly with Claude Code:
|
|
|
864
864
|
- Mark winners with `--winner`
|
|
865
865
|
- Reference in future decisions
|
|
866
866
|
|
|
867
|
-
6. **Use
|
|
868
|
-
- `jettypod
|
|
867
|
+
6. **Use Backlog**
|
|
868
|
+
- `jettypod backlog` for overview
|
|
869
869
|
- `--expand` to see details
|
|
870
870
|
- Track progress visually
|
|
871
871
|
|
|
@@ -551,7 +551,7 @@ CREATE TABLE project_config (
|
|
|
551
551
|
| `jettypod work create feature` | Create with any mode | Default to 'discovery' phase | 🟡 **HIGH** |
|
|
552
552
|
| `jettypod work start <id>` | Set current + branch | Validate mode progression | 🟡 **HIGH** |
|
|
553
553
|
| `jettypod init` | Initialize discovery mode | Initialize Internal project | 🟡 **HIGH** |
|
|
554
|
-
| `jettypod
|
|
554
|
+
| `jettypod backlog` | Show work items | Show phase + mode | 🟢 **MEDIUM** |
|
|
555
555
|
|
|
556
556
|
### Commands to DEPRECATE
|
|
557
557
|
|
|
@@ -691,7 +691,7 @@ To reconcile current implementation with comprehensive methodology, execute thes
|
|
|
691
691
|
- Chore: Default to 'implementation' for backwards compatibility
|
|
692
692
|
- Chore: Create `jettypod work discover <id>` command (features only)
|
|
693
693
|
- Chore: Create `jettypod work implement <id>` command (features only)
|
|
694
|
-
- Chore: Update `
|
|
694
|
+
- Chore: Update `backlog` to show phase
|
|
695
695
|
|
|
696
696
|
4. Feature: Multi-level prototype tracking
|
|
697
697
|
- Chore: Add `prototype_files` JSON field to work_items
|
|
@@ -771,7 +771,7 @@ To reconcile current implementation with comprehensive methodology, execute thes
|
|
|
771
771
|
2. Feature: Mode inheritance enforcement
|
|
772
772
|
- Chore: Prevent direct mode assignment to chores
|
|
773
773
|
- Chore: Inherit mode from parent feature
|
|
774
|
-
- Chore: Update `
|
|
774
|
+
- Chore: Update `backlog` to show inherited modes
|
|
775
775
|
- Chore: Migrate existing chore modes
|
|
776
776
|
|
|
777
777
|
3. Feature: Bug workflow definition
|
|
@@ -1,14 +1,65 @@
|
|
|
1
|
-
Feature: Auto-
|
|
2
|
-
When
|
|
1
|
+
Feature: Auto-Generate Production Chores at End of Stable Mode
|
|
2
|
+
When stable mode completes all scenarios for a feature, the skill analyzes the
|
|
3
|
+
implementation with hot context and generates specific, actionable production chores.
|
|
4
|
+
Chore visibility depends on project state (external vs internal).
|
|
3
5
|
|
|
4
|
-
|
|
6
|
+
Epic: Production Mode
|
|
7
|
+
Approach: Preview-and-Confirm (Transparent)
|
|
5
8
|
|
|
6
|
-
Scenario:
|
|
7
|
-
Given I have a
|
|
9
|
+
Scenario: Generate production chores after stable mode completes (external project)
|
|
10
|
+
Given I have a feature with all stable mode scenarios passing
|
|
11
|
+
And the project state is "external"
|
|
12
|
+
And the stable mode skill has hot context from implementation
|
|
13
|
+
When the stable mode skill completes
|
|
14
|
+
Then it analyzes the implementation files for production gaps
|
|
15
|
+
And it proposes specific production chores with file references
|
|
16
|
+
And it shows a preview of the production chores
|
|
17
|
+
And it asks for confirmation
|
|
18
|
+
When I confirm the production chores
|
|
19
|
+
Then it creates the production chores in production mode
|
|
20
|
+
And the chores are visible in the backlog
|
|
21
|
+
And the feature transitions to production mode
|
|
22
|
+
And I see "✅ Created N production chores. Feature elevated to production mode."
|
|
23
|
+
|
|
24
|
+
# SPEED MODE: Only happy path above
|
|
25
|
+
# STABLE MODE: Add error handling, edge cases, validation scenarios below
|
|
26
|
+
|
|
27
|
+
Scenario: User declines production chore creation
|
|
28
|
+
Given I have a feature with all stable mode scenarios passing
|
|
29
|
+
And the project state is "external"
|
|
30
|
+
And the stable mode skill has hot context from implementation
|
|
31
|
+
When the stable mode skill completes
|
|
32
|
+
And it proposes production chores
|
|
33
|
+
And I decline the production chores
|
|
34
|
+
Then no production chores are created
|
|
35
|
+
And the feature remains in stable mode
|
|
36
|
+
And I see "⏭️ Skipped production chore creation"
|
|
37
|
+
|
|
38
|
+
Scenario: No implementation files found in git history
|
|
39
|
+
Given I have a feature with all stable mode scenarios passing
|
|
40
|
+
And the feature has no git commits
|
|
41
|
+
When the stable mode skill completes
|
|
42
|
+
Then it warns "No git commits found for this feature"
|
|
43
|
+
And it creates generic production chores
|
|
44
|
+
And the feature transitions to production mode
|
|
45
|
+
|
|
46
|
+
Scenario: Internal project state (feature elevated to production mode)
|
|
47
|
+
Given I have a feature with all stable mode scenarios passing
|
|
8
48
|
And the project state is "internal"
|
|
9
|
-
When
|
|
10
|
-
Then
|
|
11
|
-
And
|
|
12
|
-
And 3 production chores
|
|
13
|
-
|
|
14
|
-
|
|
49
|
+
When the stable mode skill completes
|
|
50
|
+
Then it creates production chores
|
|
51
|
+
And the feature transitions to production mode
|
|
52
|
+
And I see "Created 3 production chores. Feature elevated to production mode."
|
|
53
|
+
|
|
54
|
+
Scenario: No production gaps found
|
|
55
|
+
Given I have a feature with all stable mode scenarios passing
|
|
56
|
+
And the implementation has no security, scale, or compliance gaps
|
|
57
|
+
When the stable mode skill completes
|
|
58
|
+
Then it creates generic production chores as placeholders
|
|
59
|
+
And the feature transitions to production mode
|
|
60
|
+
|
|
61
|
+
Scenario: Feature already in production mode
|
|
62
|
+
Given I have a feature already in production mode
|
|
63
|
+
When I try to complete a stable mode chore
|
|
64
|
+
Then the system does not trigger production chore generation
|
|
65
|
+
And I see a warning "Feature is already in production mode"
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
Feature: Backlog Command
|
|
2
|
+
Enhanced command to view work items with built-in filters
|
|
3
|
+
|
|
4
|
+
Approach: Enhanced backlog with filters (backlog, backlog all, backlog completed)
|
|
5
|
+
|
|
6
|
+
Scenario: User views active backlog items
|
|
7
|
+
Given I have work items in various statuses
|
|
8
|
+
When I run "jettypod backlog"
|
|
9
|
+
Then I see only active work items (backlog, todo, in_progress)
|
|
10
|
+
And I see the items in a tree hierarchy
|
|
11
|
+
And completed items are hidden
|
|
12
|
+
|
|
13
|
+
Scenario: User views all work items including completed
|
|
14
|
+
Given I have work items in various statuses
|
|
15
|
+
When I run "jettypod backlog all"
|
|
16
|
+
Then I see all work items regardless of status
|
|
17
|
+
And I see the items in a tree hierarchy
|
|
18
|
+
|
|
19
|
+
Scenario: User views only completed items
|
|
20
|
+
Given I have work items in various statuses
|
|
21
|
+
When I run "jettypod backlog completed"
|
|
22
|
+
Then I see only completed work items (done, cancelled)
|
|
23
|
+
And I see the items in a tree hierarchy
|
|
24
|
+
|
|
25
|
+
# SPEED MODE: Only happy path scenarios above
|
|
26
|
+
# STABLE MODE: Will add error handling, edge cases, validation scenarios
|
|
@@ -35,7 +35,7 @@ Given('a JettyPod project with hook installed', function () {
|
|
|
35
35
|
execSync('git init', { stdio: 'pipe' });
|
|
36
36
|
execSync('git config user.email "test@test.com"', { stdio: 'pipe' });
|
|
37
37
|
execSync('git config user.name "Test"', { stdio: 'pipe' });
|
|
38
|
-
execSync(`node ${path.join(originalDir, 'jettypod.js')} init`, { stdio: 'pipe' });
|
|
38
|
+
execSync(`node ${path.join(originalDir, 'jettypod.js')} init`, { stdio: 'pipe', env: { ...process.env, NODE_ENV: 'test' } });
|
|
39
39
|
|
|
40
40
|
// Verify hook was installed
|
|
41
41
|
const hookPath = path.join(testDir, '.jettypod', 'hooks', 'protect-claude-md.js');
|
|
@@ -113,7 +113,7 @@ Given('a JettyPod project in discovery mode', function () {
|
|
|
113
113
|
execSync('git init', { stdio: 'pipe' });
|
|
114
114
|
execSync('git config user.email "test@test.com"', { stdio: 'pipe' });
|
|
115
115
|
execSync('git config user.name "Test"', { stdio: 'pipe' });
|
|
116
|
-
execSync(`node ${path.join(originalDir, 'jettypod.js')} init`, { stdio: 'pipe' });
|
|
116
|
+
execSync(`node ${path.join(originalDir, 'jettypod.js')} init`, { stdio: 'pipe', env: { ...process.env, NODE_ENV: 'test' } });
|
|
117
117
|
|
|
118
118
|
// Mode is now managed by work items, not project-level config
|
|
119
119
|
const config = JSON.parse(fs.readFileSync('.jettypod/config.json', 'utf-8'));
|
|
@@ -349,7 +349,8 @@ When('Claude Code attempts to Write a new CLAUDE.md file', function () {
|
|
|
349
349
|
When('I run jettypod command {string}', function (command) {
|
|
350
350
|
const result = execSync(`node ${path.join(originalDir, 'jettypod.js')} ${command.replace('jettypod ', '')}`, {
|
|
351
351
|
stdio: 'pipe',
|
|
352
|
-
encoding: 'utf-8'
|
|
352
|
+
encoding: 'utf-8',
|
|
353
|
+
env: { ...process.env, NODE_ENV: 'test' }
|
|
353
354
|
});
|
|
354
355
|
this.commandOutput = result;
|
|
355
356
|
});
|
|
@@ -395,7 +396,8 @@ When('Claude Code tries to change mode to speed by editing CLAUDE.md', function
|
|
|
395
396
|
|
|
396
397
|
When('I run jettypod command {string} instead', function (command) {
|
|
397
398
|
execSync(`node ${path.join(originalDir, 'jettypod.js')} ${command.replace('jettypod ', '')}`, {
|
|
398
|
-
stdio: 'pipe'
|
|
399
|
+
stdio: 'pipe',
|
|
400
|
+
env: { ...process.env, NODE_ENV: 'test' }
|
|
399
401
|
});
|
|
400
402
|
});
|
|
401
403
|
|
|
@@ -186,8 +186,8 @@ async function showAllDecisions() {
|
|
|
186
186
|
} else {
|
|
187
187
|
console.log('No epic decisions yet.');
|
|
188
188
|
console.log('');
|
|
189
|
-
console.log('💡 Tip: Make architectural decisions during epic
|
|
190
|
-
console.log(' jettypod work epic-
|
|
189
|
+
console.log('💡 Tip: Make architectural decisions during epic planning:');
|
|
190
|
+
console.log(' jettypod work epic-planning <epic-id>');
|
|
191
191
|
console.log('');
|
|
192
192
|
}
|
|
193
193
|
|
|
@@ -288,8 +288,8 @@ async function showEpicDecisions() {
|
|
|
288
288
|
} else {
|
|
289
289
|
console.log('No epic decisions yet.');
|
|
290
290
|
console.log('');
|
|
291
|
-
console.log('💡 Tip: Make architectural decisions during epic
|
|
292
|
-
console.log(' jettypod work epic-
|
|
291
|
+
console.log('💡 Tip: Make architectural decisions during epic planning:');
|
|
292
|
+
console.log(' jettypod work epic-planning <epic-id>');
|
|
293
293
|
console.log('');
|
|
294
294
|
}
|
|
295
295
|
|
|
@@ -319,7 +319,7 @@ async function promptForEpicId() {
|
|
|
319
319
|
console.log('❌ No epic ID entered');
|
|
320
320
|
console.log('Please run the command again and enter an epic ID');
|
|
321
321
|
console.log('');
|
|
322
|
-
console.log('💡 Tip: See your epics with: jettypod
|
|
322
|
+
console.log('💡 Tip: See your epics with: jettypod backlog');
|
|
323
323
|
console.log('');
|
|
324
324
|
process.exit(1);
|
|
325
325
|
}
|
|
@@ -332,7 +332,7 @@ async function promptForEpicId() {
|
|
|
332
332
|
console.log(`❌ Invalid epic ID: "${trimmed}"`);
|
|
333
333
|
console.log('Please enter a numeric epic ID');
|
|
334
334
|
console.log('');
|
|
335
|
-
console.log('💡 Tip: See your epics with: jettypod
|
|
335
|
+
console.log('💡 Tip: See your epics with: jettypod backlog');
|
|
336
336
|
console.log('');
|
|
337
337
|
process.exit(1);
|
|
338
338
|
}
|
|
@@ -386,7 +386,7 @@ async function showDecisionsForEpic(epicId) {
|
|
|
386
386
|
console.log(` - Epic #${epicId} does not exist`);
|
|
387
387
|
console.log(` - Work item #${epicId} is not an epic`);
|
|
388
388
|
console.log('');
|
|
389
|
-
console.log('💡 Tip: See your epics with: jettypod
|
|
389
|
+
console.log('💡 Tip: See your epics with: jettypod backlog');
|
|
390
390
|
console.log('');
|
|
391
391
|
return resolve();
|
|
392
392
|
}
|
|
@@ -425,8 +425,8 @@ async function showDecisionsForEpic(epicId) {
|
|
|
425
425
|
} else {
|
|
426
426
|
console.log('No decisions for this epic yet.');
|
|
427
427
|
console.log('');
|
|
428
|
-
console.log('💡 Tip: Make architectural decisions during epic
|
|
429
|
-
console.log(` jettypod work epic-
|
|
428
|
+
console.log('💡 Tip: Make architectural decisions during epic planning:');
|
|
429
|
+
console.log(` jettypod work epic-planning ${epicId}`);
|
|
430
430
|
console.log('');
|
|
431
431
|
}
|
|
432
432
|
|
|
@@ -470,7 +470,7 @@ function viewDecisionsFile() {
|
|
|
470
470
|
console.log(' - You make epic architectural decisions');
|
|
471
471
|
console.log('');
|
|
472
472
|
console.log('To make decisions:');
|
|
473
|
-
console.log(' jettypod work epic-
|
|
473
|
+
console.log(' jettypod work epic-planning <epic-id>');
|
|
474
474
|
console.log('');
|
|
475
475
|
}
|
|
476
476
|
} catch (err) {
|
|
@@ -22,13 +22,13 @@ Given('I initialize a git repo with devpod', function () {
|
|
|
22
22
|
execSync('git init', { stdio: 'pipe' });
|
|
23
23
|
execSync('git config user.email "test@test.com"', { stdio: 'pipe' });
|
|
24
24
|
execSync('git config user.name "Test"', { stdio: 'pipe' });
|
|
25
|
-
execSync(`node ${path.join(originalDir, 'jettypod.js')} init`, { stdio: 'pipe' });
|
|
25
|
+
execSync(`node ${path.join(originalDir, 'jettypod.js')} init`, { stdio: 'pipe', env: { ...process.env, NODE_ENV: 'test' } });
|
|
26
26
|
});
|
|
27
27
|
|
|
28
28
|
Given('I create and start work on a todo item', function () {
|
|
29
|
-
execSync(`node ${path.join(originalDir, 'jettypod.js')} work create feature "Test"`, { stdio: 'pipe' });
|
|
30
|
-
execSync(`node ${path.join(originalDir, 'jettypod.js')} work status 1 todo`, { stdio: 'pipe' });
|
|
31
|
-
execSync(`node ${path.join(originalDir, 'jettypod.js')} work start 1`, { stdio: 'pipe' });
|
|
29
|
+
execSync(`node ${path.join(originalDir, 'jettypod.js')} work create feature "Test"`, { stdio: 'pipe', env: { ...process.env, NODE_ENV: 'test' } });
|
|
30
|
+
execSync(`node ${path.join(originalDir, 'jettypod.js')} work status 1 todo`, { stdio: 'pipe', env: { ...process.env, NODE_ENV: 'test' } });
|
|
31
|
+
execSync(`node ${path.join(originalDir, 'jettypod.js')} work start 1`, { stdio: 'pipe', env: { ...process.env, NODE_ENV: 'test' } });
|
|
32
32
|
workItemId = 1;
|
|
33
33
|
});
|
|
34
34
|
|