jettypod 4.4.1 ā 4.4.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/jettypod.js +89 -0
- package/package.json +1 -1
- package/skills-templates/epic-planning/SKILL.md +105 -11
- package/skills-templates/feature-planning/SKILL.md +158 -113
- package/skills-templates/production-mode/SKILL.md +4 -7
- package/skills-templates/speed-mode/SKILL.md +471 -463
- package/skills-templates/stable-mode/SKILL.md +319 -371
package/jettypod.js
CHANGED
|
@@ -222,6 +222,7 @@ jettypod work create feature "<title>" --parent=<id>
|
|
|
222
222
|
jettypod work start <id>
|
|
223
223
|
jettypod work status <id> cancelled
|
|
224
224
|
jettypod backlog
|
|
225
|
+
jettypod impact <file> # Show tests/features affected by changing a file
|
|
225
226
|
|
|
226
227
|
## Advanced Commands
|
|
227
228
|
For mode management, decisions, project state: docs/COMMAND_REFERENCE.md
|
|
@@ -2062,6 +2063,94 @@ Quick commands:
|
|
|
2062
2063
|
break;
|
|
2063
2064
|
}
|
|
2064
2065
|
|
|
2066
|
+
case 'impact': {
|
|
2067
|
+
// Test impact analysis
|
|
2068
|
+
const targetFile = args[0];
|
|
2069
|
+
|
|
2070
|
+
if (!targetFile) {
|
|
2071
|
+
console.log('Usage: jettypod impact <file-path>');
|
|
2072
|
+
console.log('');
|
|
2073
|
+
console.log('Analyze what tests and features would be affected by changing a file.');
|
|
2074
|
+
console.log('');
|
|
2075
|
+
console.log('Examples:');
|
|
2076
|
+
console.log(' jettypod impact lib/database.js');
|
|
2077
|
+
console.log(' jettypod impact features/work-tracking/index.js');
|
|
2078
|
+
process.exit(1);
|
|
2079
|
+
}
|
|
2080
|
+
|
|
2081
|
+
try {
|
|
2082
|
+
const { DependencyGraph } = require('./lib/test-impact-analyzer');
|
|
2083
|
+
const graph = new DependencyGraph();
|
|
2084
|
+
|
|
2085
|
+
console.log('š Building dependency graph...');
|
|
2086
|
+
await graph.build(process.cwd());
|
|
2087
|
+
|
|
2088
|
+
const impact = graph.getImpact(targetFile);
|
|
2089
|
+
|
|
2090
|
+
if (impact.error) {
|
|
2091
|
+
console.error(`\nā ${impact.error}`);
|
|
2092
|
+
console.log('');
|
|
2093
|
+
console.log('Make sure the file path is relative to the project root.');
|
|
2094
|
+
process.exit(1);
|
|
2095
|
+
}
|
|
2096
|
+
|
|
2097
|
+
// Pretty-print impact analysis
|
|
2098
|
+
const levelColors = {
|
|
2099
|
+
LOW: '\x1b[32m', // green
|
|
2100
|
+
MEDIUM: '\x1b[33m', // yellow
|
|
2101
|
+
HIGH: '\x1b[31m' // red
|
|
2102
|
+
};
|
|
2103
|
+
const reset = '\x1b[0m';
|
|
2104
|
+
const bold = '\x1b[1m';
|
|
2105
|
+
const dim = '\x1b[2m';
|
|
2106
|
+
|
|
2107
|
+
console.log('');
|
|
2108
|
+
console.log('ā'.repeat(60));
|
|
2109
|
+
console.log(`${bold}IMPACT ANALYSIS: ${targetFile}${reset}`);
|
|
2110
|
+
console.log('ā'.repeat(60));
|
|
2111
|
+
console.log('');
|
|
2112
|
+
console.log(`Impact Score: ${bold}${impact.impactScore}/100${reset} ${levelColors[impact.impactLevel]}(${impact.impactLevel})${reset}`);
|
|
2113
|
+
console.log(`Total Affected Files: ${impact.totalAffected}`);
|
|
2114
|
+
|
|
2115
|
+
if (impact.tests.length > 0) {
|
|
2116
|
+
console.log('');
|
|
2117
|
+
console.log(`${bold}AFFECTED TESTS (${impact.tests.length}):${reset}`);
|
|
2118
|
+
for (const t of impact.tests) {
|
|
2119
|
+
console.log(` ${dim}[dist=${t.distance}]${reset} ${t.file}`);
|
|
2120
|
+
}
|
|
2121
|
+
}
|
|
2122
|
+
|
|
2123
|
+
if (impact.features.length > 0) {
|
|
2124
|
+
console.log('');
|
|
2125
|
+
console.log(`${bold}AFFECTED BDD FILES (${impact.features.length}):${reset}`);
|
|
2126
|
+
for (const f of impact.features) {
|
|
2127
|
+
console.log(` ${dim}[dist=${f.distance}]${reset} ${f.file}`);
|
|
2128
|
+
}
|
|
2129
|
+
}
|
|
2130
|
+
|
|
2131
|
+
if (impact.code.length > 0) {
|
|
2132
|
+
console.log('');
|
|
2133
|
+
console.log(`${bold}AFFECTED CODE (${impact.code.length}):${reset}`);
|
|
2134
|
+
const displayCode = impact.code.slice(0, 10);
|
|
2135
|
+
for (const c of displayCode) {
|
|
2136
|
+
console.log(` ${dim}[dist=${c.distance}]${reset} ${c.file}`);
|
|
2137
|
+
}
|
|
2138
|
+
if (impact.code.length > 10) {
|
|
2139
|
+
console.log(` ${dim}... and ${impact.code.length - 10} more${reset}`);
|
|
2140
|
+
}
|
|
2141
|
+
}
|
|
2142
|
+
|
|
2143
|
+
console.log('');
|
|
2144
|
+
console.log('ā'.repeat(60));
|
|
2145
|
+
console.log('');
|
|
2146
|
+
|
|
2147
|
+
} catch (err) {
|
|
2148
|
+
console.error(`ā Error: ${err.message}`);
|
|
2149
|
+
process.exit(1);
|
|
2150
|
+
}
|
|
2151
|
+
break;
|
|
2152
|
+
}
|
|
2153
|
+
|
|
2065
2154
|
default:
|
|
2066
2155
|
// Smart mode: auto-initialize if needed, otherwise show guidance
|
|
2067
2156
|
if (!fs.existsSync('.jettypod')) {
|
package/package.json
CHANGED
|
@@ -211,23 +211,114 @@ node jettypod.js work epic-implement [epic-id] \
|
|
|
211
211
|
|
|
212
212
|
**DO NOT display this as example text. EXECUTE IT using the Bash tool.**
|
|
213
213
|
|
|
214
|
-
After execution succeeds,
|
|
214
|
+
After execution succeeds, display:
|
|
215
215
|
|
|
216
216
|
```
|
|
217
217
|
ā
Architectural decision recorded
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
Then proceed to Step 7.
|
|
221
|
+
|
|
222
|
+
### Step 7: Route to Next Planning Skill
|
|
223
|
+
|
|
224
|
+
After features/chores are created (and architectural decision recorded if applicable), route to the appropriate planning skill.
|
|
225
|
+
|
|
226
|
+
#### Step 7A: Query Created Items
|
|
227
|
+
|
|
228
|
+
Query the database to find what was just created under this epic:
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
sqlite3 .jettypod/work.db "SELECT id, title, type FROM work_items WHERE parent_id = <EPIC_ID> ORDER BY id"
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
#### Step 7B: Display and Recommend
|
|
235
|
+
|
|
236
|
+
Display what was created and recommend which item to plan first:
|
|
218
237
|
|
|
238
|
+
```
|
|
219
239
|
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
220
240
|
šÆ Epic Planning Complete!
|
|
221
241
|
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
222
242
|
|
|
223
|
-
|
|
224
|
-
|
|
243
|
+
Created under this epic:
|
|
244
|
+
⨠Feature #[id]: [title]
|
|
245
|
+
⨠Feature #[id]: [title]
|
|
246
|
+
š§ Chore #[id]: [title] (if any chores were created)
|
|
247
|
+
|
|
248
|
+
š” Recommendation: Start with [Feature/Chore] #[id] ([title])
|
|
249
|
+
[Reason - e.g., "It's foundational - other items may depend on it."]
|
|
250
|
+
|
|
251
|
+
Plan this one now? [yes / pick different / done for now]
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
**Recommendation logic:**
|
|
255
|
+
- If features exist, recommend the first feature (features are typically foundational)
|
|
256
|
+
- If only chores exist, recommend the first chore
|
|
257
|
+
- Provide brief reasoning for the recommendation
|
|
258
|
+
|
|
259
|
+
**WAIT for user response.**
|
|
260
|
+
|
|
261
|
+
#### Step 7C: Route on Confirmation
|
|
262
|
+
|
|
263
|
+
Based on user response:
|
|
264
|
+
|
|
265
|
+
**If user confirms (says "yes", "let's go", "proceed", etc.):**
|
|
266
|
+
|
|
267
|
+
Determine the skill to invoke based on item type:
|
|
268
|
+
- **Feature** ā invoke `feature-planning`
|
|
269
|
+
- **Chore** ā invoke `chore-planning`
|
|
225
270
|
|
|
226
|
-
**
|
|
227
|
-
|
|
228
|
-
|
|
271
|
+
**IMMEDIATELY invoke the appropriate skill using the Skill tool:**
|
|
272
|
+
|
|
273
|
+
```
|
|
274
|
+
Use the Skill tool with skill: "feature-planning"
|
|
275
|
+
```
|
|
276
|
+
or
|
|
277
|
+
```
|
|
278
|
+
Use the Skill tool with skill: "chore-planning"
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
**If user picks different item (says "pick different", "different one", "let me choose", etc.):**
|
|
282
|
+
|
|
283
|
+
Display a numbered list of all created items:
|
|
284
|
+
|
|
285
|
+
```
|
|
286
|
+
Which item would you like to plan?
|
|
287
|
+
|
|
288
|
+
1. ⨠Feature #[id]: [title]
|
|
289
|
+
2. ⨠Feature #[id]: [title]
|
|
290
|
+
3. š§ Chore #[id]: [title]
|
|
291
|
+
|
|
292
|
+
Enter the number of your choice:
|
|
229
293
|
```
|
|
230
294
|
|
|
295
|
+
**WAIT for user to enter a number.**
|
|
296
|
+
|
|
297
|
+
After user selects (e.g., "2" or "number 2"):
|
|
298
|
+
1. Look up the item from the list
|
|
299
|
+
2. Determine the skill based on item type:
|
|
300
|
+
- **Feature** ā invoke `feature-planning`
|
|
301
|
+
- **Chore** ā invoke `chore-planning`
|
|
302
|
+
3. **IMMEDIATELY invoke the appropriate skill using the Skill tool**
|
|
303
|
+
|
|
304
|
+
**If user says "done for now" (or "later", "not now", "skip", "no thanks", etc.):**
|
|
305
|
+
|
|
306
|
+
Display with actual IDs from the created items:
|
|
307
|
+
```
|
|
308
|
+
No problem! When you're ready to continue, you can plan any of these:
|
|
309
|
+
|
|
310
|
+
Features:
|
|
311
|
+
⢠"Let's do feature discovery for #10" (User registration)
|
|
312
|
+
⢠"Let's do feature discovery for #11" (Password reset)
|
|
313
|
+
|
|
314
|
+
Chores:
|
|
315
|
+
⢠"Help me plan chore #12" (Update CI config)
|
|
316
|
+
|
|
317
|
+
Or run: jettypod backlog to see all items.
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
**Do NOT invoke any skill. End epic-planning skill.**
|
|
321
|
+
|
|
231
322
|
## Key Principles
|
|
232
323
|
|
|
233
324
|
1. **Feature brainstorming is always required** - Don't skip this even if architectural decision is clear
|
|
@@ -235,8 +326,9 @@ Or talk to Claude Code: "Let's do feature discovery for #[feature-id]"
|
|
|
235
326
|
3. **Always suggest exactly 3 options** when architectural decision needed - Simple/Conservative, Balanced, Advanced
|
|
236
327
|
4. **Be specific about features** - Each feature should be user-facing capability
|
|
237
328
|
5. **Use the Approach Suggestion template** - Pros, Cons, Technical Impact format
|
|
238
|
-
6. **
|
|
329
|
+
6. **Route to next skill** - After creating items, recommend one and invoke the appropriate planning skill
|
|
239
330
|
7. **Use jettypod commands** - Create features using jettypod CLI, record decisions with epic-implement
|
|
331
|
+
8. **Skill handoff** - Invoke `feature-planning` for features, `chore-planning` for chores
|
|
240
332
|
|
|
241
333
|
## Example: Epic with Architectural Decision
|
|
242
334
|
|
|
@@ -297,9 +389,11 @@ Epic: "User Management"
|
|
|
297
389
|
|
|
298
390
|
## Validation
|
|
299
391
|
|
|
300
|
-
Before completing epic
|
|
301
|
-
- [ ] At least 2-3 features identified
|
|
392
|
+
Before completing epic planning, ensure:
|
|
393
|
+
- [ ] At least 2-3 features/chores identified
|
|
302
394
|
- [ ] Features are user-facing capabilities (not technical tasks)
|
|
395
|
+
- [ ] Chores (if any) are standalone work items for this epic
|
|
303
396
|
- [ ] Architectural decision documented if needed
|
|
304
|
-
- [ ]
|
|
305
|
-
- [ ]
|
|
397
|
+
- [ ] All items created in database with correct parent_id
|
|
398
|
+
- [ ] Recommended next item to plan
|
|
399
|
+
- [ ] Routed to feature-planning or chore-planning (or user declined)
|
|
@@ -11,6 +11,21 @@ Guides Claude through feature planning including UX approach exploration, option
|
|
|
11
11
|
|
|
12
12
|
When this skill is activated, you are helping discover the best approach for a feature. Follow this structured approach:
|
|
13
13
|
|
|
14
|
+
## š Critical Command Distinction
|
|
15
|
+
|
|
16
|
+
**Two different commands, two different purposes:**
|
|
17
|
+
|
|
18
|
+
| Command | Used For | When | Phase |
|
|
19
|
+
|---------|----------|------|-------|
|
|
20
|
+
| `work implement <feature-id>` | Transition feature to implementation phase | During feature planning (Step 8B) | Feature Planning |
|
|
21
|
+
| `work start <chore-id>` | Start implementing a specific chore | After feature planning complete (Step 8D) | Speed Mode |
|
|
22
|
+
|
|
23
|
+
**CRITICAL:** Both commands are run by **Claude**, not the user. The distinction is:
|
|
24
|
+
- `work implement` = Ends feature planning, creates chores
|
|
25
|
+
- `work start` = Begins implementing a chore (triggers speed-mode skill)
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
14
29
|
### Step 1: Understand the Feature Context
|
|
15
30
|
|
|
16
31
|
You'll receive context about:
|
|
@@ -96,15 +111,42 @@ If user wants prototypes:
|
|
|
96
111
|
1. **Build prototypes** in `/prototypes/feature-[id]-[approach-name]/`
|
|
97
112
|
2. **Name format**: `YYYY-MM-DD-[feature-slug]-[option].ext`
|
|
98
113
|
3. **Focus on UX**: Show the feel, not production code
|
|
99
|
-
4. **Add
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
114
|
+
4. **Add visible banner header at TOP of page** (for HTML/web prototypes):
|
|
115
|
+
```html
|
|
116
|
+
<div style="background: #f0f0f0; border: 2px solid #333; padding: 16px; margin-bottom: 24px; font-family: monospace;">
|
|
117
|
+
<strong>š§Ŗ PROTOTYPE</strong><br>
|
|
118
|
+
Feature: [feature name]<br>
|
|
119
|
+
Option: [option number/name]<br>
|
|
120
|
+
Created: [YYYY-MM-DD]<br>
|
|
121
|
+
Purpose: [what this explores]<br>
|
|
122
|
+
Decision: [to be filled after testing]
|
|
123
|
+
</div>
|
|
105
124
|
```
|
|
125
|
+
For CLI/terminal prototypes, add similar info as first output.
|
|
106
126
|
5. **Offer to open them**: "Want me to open these in your browser?"
|
|
107
127
|
|
|
128
|
+
<details>
|
|
129
|
+
<summary><strong>š Prototyping Guidelines (click to expand)</strong></summary>
|
|
130
|
+
|
|
131
|
+
**Use fastest tech to demonstrate UX:**
|
|
132
|
+
- Quick HTML+JS for web UX
|
|
133
|
+
- Simple CLI scripts for command-line UX
|
|
134
|
+
- Minimal frameworks, maximum clarity
|
|
135
|
+
|
|
136
|
+
**What to prototype:**
|
|
137
|
+
- User interaction flow
|
|
138
|
+
- Visual layout (if UI)
|
|
139
|
+
- Command structure (if CLI)
|
|
140
|
+
- API shape (if API)
|
|
141
|
+
|
|
142
|
+
**What NOT to prototype:**
|
|
143
|
+
- Production error handling
|
|
144
|
+
- Database layer
|
|
145
|
+
- Authentication (unless that's the feature)
|
|
146
|
+
- Test coverage
|
|
147
|
+
|
|
148
|
+
</details>
|
|
149
|
+
|
|
108
150
|
### Step 5: Choose Winner
|
|
109
151
|
|
|
110
152
|
After user tests (or skips prototyping):
|
|
@@ -124,10 +166,12 @@ Based on chosen approach, generate:
|
|
|
124
166
|
**A. Scenario file** at `features/[feature-slug].feature` using Write tool:
|
|
125
167
|
|
|
126
168
|
1. **Create file** at `features/[feature-slug].feature` using Write tool
|
|
127
|
-
2. **
|
|
128
|
-
-
|
|
169
|
+
2. **Include all "make it work" scenarios**:
|
|
170
|
+
- All success paths - required functionality AND optional features
|
|
171
|
+
- Multiple valid workflows if the feature supports them
|
|
172
|
+
- Success variations (different outcomes that are all correct)
|
|
129
173
|
- NO error handling scenarios (added in stable mode)
|
|
130
|
-
- NO
|
|
174
|
+
- NO validation failures (added in stable mode)
|
|
131
175
|
- NO security/compliance scenarios (added in production mode)
|
|
132
176
|
|
|
133
177
|
**B. Step definitions file** at `features/step_definitions/[feature-slug].steps.js` using Write tool:
|
|
@@ -147,7 +191,7 @@ Based on chosen approach, generate:
|
|
|
147
191
|
sqlite3 .jettypod/work.db "UPDATE work_items SET scenario_file = 'features/[feature-slug].feature' WHERE id = <feature-id>"
|
|
148
192
|
```
|
|
149
193
|
|
|
150
|
-
**Template for speed mode (
|
|
194
|
+
**Template for speed mode (make it work):**
|
|
151
195
|
|
|
152
196
|
```gherkin
|
|
153
197
|
Feature: [Feature Name]
|
|
@@ -156,15 +200,20 @@ Feature: [Feature Name]
|
|
|
156
200
|
Epic: [Epic name if applicable]
|
|
157
201
|
Approach: [Chosen approach name]
|
|
158
202
|
|
|
159
|
-
Scenario: [
|
|
203
|
+
Scenario: [Core functionality - required workflow]
|
|
160
204
|
Given [initial state]
|
|
161
205
|
When [user takes main action]
|
|
162
206
|
Then [expected successful outcome]
|
|
163
207
|
And [observable UI/system state change]
|
|
164
208
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
209
|
+
Scenario: [Optional feature 1 - if applicable]
|
|
210
|
+
Given [initial state]
|
|
211
|
+
When [user uses optional feature]
|
|
212
|
+
Then [feature works correctly]
|
|
213
|
+
|
|
214
|
+
# SPEED MODE: All success scenarios above (required + optional functionality)
|
|
215
|
+
# STABLE MODE: Will add error handling, validation failures, edge cases
|
|
216
|
+
# These failure scenarios are added by stable-mode skill, NOT during feature discovery
|
|
168
217
|
```
|
|
169
218
|
|
|
170
219
|
**Example for Login feature (speed mode):**
|
|
@@ -182,8 +231,66 @@ Scenario: User successfully logs in with valid credentials
|
|
|
182
231
|
Then I am redirected to the dashboard
|
|
183
232
|
And I see a welcome message with my name
|
|
184
233
|
And I have an active session token
|
|
234
|
+
|
|
235
|
+
Scenario: User logs in with "Remember me" option (optional feature)
|
|
236
|
+
Given I am on the login page
|
|
237
|
+
When I enter valid credentials
|
|
238
|
+
And I check the "Remember me" checkbox
|
|
239
|
+
And I click the login button
|
|
240
|
+
Then I am redirected to the dashboard
|
|
241
|
+
And my session persists for 30 days
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
<details>
|
|
245
|
+
<summary><strong>š BDD Scenario Guidelines (click to expand)</strong></summary>
|
|
246
|
+
|
|
247
|
+
**Scenario naming:**
|
|
248
|
+
- Use present tense
|
|
249
|
+
- Be specific about what's being tested
|
|
250
|
+
- Focus on user behavior
|
|
251
|
+
|
|
252
|
+
**Given/When/Then structure:**
|
|
253
|
+
- **Given**: Set up initial state
|
|
254
|
+
- **When**: User action
|
|
255
|
+
- **Then**: Observable outcome
|
|
256
|
+
|
|
257
|
+
**What feature planning creates:**
|
|
258
|
+
|
|
259
|
+
Feature planning creates speed mode scenarios (make it work - all success paths):
|
|
260
|
+
```gherkin
|
|
261
|
+
Scenario: User successfully [does the required thing]
|
|
262
|
+
Given [setup]
|
|
263
|
+
When [action]
|
|
264
|
+
Then [success]
|
|
265
|
+
|
|
266
|
+
Scenario: User successfully [uses optional feature]
|
|
267
|
+
Given [setup]
|
|
268
|
+
When [uses optional capability]
|
|
269
|
+
Then [feature works correctly]
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
**Additional scenarios are added LATER by stable-mode skill:**
|
|
273
|
+
|
|
274
|
+
Stable mode adds error handling and validation:
|
|
275
|
+
```gherkin
|
|
276
|
+
Scenario: Handle invalid input
|
|
277
|
+
Given [setup]
|
|
278
|
+
When [invalid action]
|
|
279
|
+
Then [appropriate error]
|
|
185
280
|
```
|
|
186
281
|
|
|
282
|
+
Production mode adds security/scale/compliance:
|
|
283
|
+
```gherkin
|
|
284
|
+
Scenario: Prevent unauthorized access
|
|
285
|
+
Given [unauthorized user]
|
|
286
|
+
When [attempts action]
|
|
287
|
+
Then [access denied with proper error]
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
**IMPORTANT:** Feature planning creates all success scenarios (required + optional). Stable/production chores add failure scenarios later.
|
|
291
|
+
|
|
292
|
+
</details>
|
|
293
|
+
|
|
187
294
|
### Step 6.5: Validate BDD Infrastructure
|
|
188
295
|
|
|
189
296
|
**CRITICAL:** After creating both scenario and step definition files, automatically validate them with cucumber dry-run to catch errors immediately.
|
|
@@ -236,7 +343,7 @@ console.log(''); // Extra line before continuing
|
|
|
236
343
|
|
|
237
344
|
The speed-mode skill guides Claude to:
|
|
238
345
|
1. Implement the feature code
|
|
239
|
-
2. Create corresponding unit tests for
|
|
346
|
+
2. Create corresponding unit tests for all success scenarios
|
|
240
347
|
3. Ensure tests pass before completing the chore
|
|
241
348
|
|
|
242
349
|
This keeps feature planning focused on BDD scenarios (what users experience) while speed mode handles unit tests (implementation details).
|
|
@@ -246,7 +353,7 @@ This keeps feature planning focused on BDD scenarios (what users experience) whi
|
|
|
246
353
|
**CRITICAL:** After BDD validation passes, analyze the codebase and propose technical implementation chores. **DO NOT CREATE CHORES YET** - the feature must transition to implementation mode first (Step 8).
|
|
247
354
|
|
|
248
355
|
**Your analysis should consider:**
|
|
249
|
-
- The BDD scenarios (
|
|
356
|
+
- The BDD scenarios (all success paths - required + optional features)
|
|
250
357
|
- Existing codebase structure and patterns
|
|
251
358
|
- Epic's architectural decisions (if any)
|
|
252
359
|
- Tech stack and framework conventions
|
|
@@ -286,7 +393,7 @@ Based on the scenario and my understanding of the codebase, here are the chores
|
|
|
286
393
|
|
|
287
394
|
[etc.]
|
|
288
395
|
|
|
289
|
-
These chores will make
|
|
396
|
+
These chores will make all success scenarios pass (required + optional features).
|
|
290
397
|
|
|
291
398
|
Sound good? Any adjustments?
|
|
292
399
|
```
|
|
@@ -331,16 +438,11 @@ node jettypod.js work implement [feature-id] \
|
|
|
331
438
|
|
|
332
439
|
**CRITICAL: NOW create the chores.** The feature has transitioned to implementation mode, so chore creation will succeed.
|
|
333
440
|
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
For each chore that the user confirmed in Step 7, use the Bash tool to create it. Replace `<FEATURE_ID>` with the actual feature ID number:
|
|
441
|
+
For each chore that the user confirmed in Step 7, use the Bash tool to create it:
|
|
337
442
|
|
|
338
443
|
```bash
|
|
339
|
-
#
|
|
340
|
-
node jettypod.js work create chore "
|
|
341
|
-
|
|
342
|
-
# WRONG - missing parent flag (chore won't be linked to feature):
|
|
343
|
-
node jettypod.js work create chore "Implement cursor position broadcast" "Broadcast cursor positions..."
|
|
444
|
+
# Use Bash tool to execute for each chore:
|
|
445
|
+
node jettypod.js work create chore "[Chore title]" "[Chore description with all the implementation guidance]" --parent=[feature-id]
|
|
344
446
|
```
|
|
345
447
|
|
|
346
448
|
**Build the description from your Step 7 proposal:**
|
|
@@ -367,7 +469,7 @@ After creating all chores, display:
|
|
|
367
469
|
ā
Created X chores for speed mode
|
|
368
470
|
|
|
369
471
|
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
370
|
-
šÆ Feature
|
|
472
|
+
šÆ Feature Planning Complete!
|
|
371
473
|
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
372
474
|
|
|
373
475
|
š BDD scenarios: features/[feature-slug].feature
|
|
@@ -378,97 +480,30 @@ After creating all chores, display:
|
|
|
378
480
|
Ready to start implementation?
|
|
379
481
|
```
|
|
380
482
|
|
|
381
|
-
#### Step 8D:
|
|
483
|
+
#### Step 8D: Start First Chore
|
|
382
484
|
|
|
383
|
-
**
|
|
485
|
+
**Feature planning is now complete.** The feature has been transitioned to implementation phase and chores are ready.
|
|
384
486
|
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
**IMMEDIATELY invoke the speed-mode skill using the Skill tool:**
|
|
487
|
+
**Ask user which chore to start with:**
|
|
388
488
|
|
|
389
489
|
```
|
|
390
|
-
|
|
490
|
+
Ready to start implementation? Which chore should we start with?
|
|
391
491
|
```
|
|
392
492
|
|
|
393
|
-
**
|
|
394
|
-
1. Guide the user to start the first chore with `jettypod work start [chore-id]`
|
|
395
|
-
2. Create a worktree for the chore
|
|
396
|
-
3. Follow TDD workflow to implement the chore
|
|
397
|
-
4. Merge when complete
|
|
398
|
-
|
|
399
|
-
**End feature-planning skill after invoking speed-mode.**
|
|
400
|
-
|
|
401
|
-
## Key Principles
|
|
402
|
-
|
|
403
|
-
1. **Always suggest exactly 3 options** - Simple, Balanced, Advanced
|
|
404
|
-
2. **Show epic's architectural decision** - Feature should align with epic's technical approach
|
|
405
|
-
3. **UX first, tech second** - Focus on what it feels like to use, not implementation details
|
|
406
|
-
4. **Prototypes are optional but valuable** - User can skip if approach is obvious
|
|
407
|
-
5. **BDD scenarios are required** - Discovery isn't complete without scenarios
|
|
408
|
-
6. **Guide to next step** - Always end with clear action
|
|
409
|
-
|
|
410
|
-
## Prototyping Guidelines
|
|
411
|
-
|
|
412
|
-
**Use fastest tech to demonstrate UX:**
|
|
413
|
-
- Quick HTML+JS for web UX
|
|
414
|
-
- Simple CLI scripts for command-line UX
|
|
415
|
-
- Minimal frameworks, maximum clarity
|
|
493
|
+
**After user picks a chore, use Bash tool to run:**
|
|
416
494
|
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
- Visual layout (if UI)
|
|
420
|
-
- Command structure (if CLI)
|
|
421
|
-
- API shape (if API)
|
|
422
|
-
|
|
423
|
-
**What NOT to prototype:**
|
|
424
|
-
- Production error handling
|
|
425
|
-
- Database layer
|
|
426
|
-
- Authentication (unless that's the feature)
|
|
427
|
-
- Test coverage
|
|
428
|
-
|
|
429
|
-
## BDD Scenario Guidelines
|
|
430
|
-
|
|
431
|
-
**Scenario naming:**
|
|
432
|
-
- Use present tense
|
|
433
|
-
- Be specific about what's being tested
|
|
434
|
-
- Focus on user behavior
|
|
435
|
-
|
|
436
|
-
**Given/When/Then structure:**
|
|
437
|
-
- **Given**: Set up initial state
|
|
438
|
-
- **When**: User action
|
|
439
|
-
- **Then**: Observable outcome
|
|
440
|
-
|
|
441
|
-
**What feature-discover creates:**
|
|
442
|
-
|
|
443
|
-
**Feature discovery ONLY creates speed mode scenarios (happy path):**
|
|
444
|
-
```gherkin
|
|
445
|
-
Scenario: User successfully [does the thing]
|
|
446
|
-
Given [setup]
|
|
447
|
-
When [action]
|
|
448
|
-
Then [success]
|
|
449
|
-
```
|
|
450
|
-
|
|
451
|
-
**Additional scenarios are added LATER by stable-mode skill:**
|
|
452
|
-
|
|
453
|
-
Stable mode adds error handling:
|
|
454
|
-
```gherkin
|
|
455
|
-
Scenario: Handle invalid input
|
|
456
|
-
Given [setup]
|
|
457
|
-
When [invalid action]
|
|
458
|
-
Then [appropriate error]
|
|
495
|
+
```bash
|
|
496
|
+
jettypod work start [chore-id]
|
|
459
497
|
```
|
|
460
498
|
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
When [attempts action]
|
|
466
|
-
Then [access denied with proper error]
|
|
467
|
-
```
|
|
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
|
|
468
503
|
|
|
469
|
-
**
|
|
504
|
+
**The speed-mode skill takes over from here and handles the implementation.**
|
|
470
505
|
|
|
471
|
-
## Example: Feature
|
|
506
|
+
## Example: Feature Planning Flow
|
|
472
507
|
|
|
473
508
|
**Feature:** "Email/password login"
|
|
474
509
|
**Epic decision:** "Using Auth.js with JWT tokens"
|
|
@@ -480,17 +515,25 @@ Scenario: Prevent unauthorized access
|
|
|
480
515
|
|
|
481
516
|
**User picks:** Option 1 (Simple inline form)
|
|
482
517
|
|
|
483
|
-
**Scenarios generated (
|
|
518
|
+
**Scenarios generated (speed mode - all success paths):**
|
|
484
519
|
```gherkin
|
|
485
520
|
Feature: Email/Password Login
|
|
486
521
|
|
|
487
|
-
Scenario: Successful login
|
|
522
|
+
Scenario: Successful login with credentials
|
|
488
523
|
Given I am on the login page
|
|
489
524
|
When I enter valid credentials and submit
|
|
490
525
|
Then I am redirected to the dashboard
|
|
491
526
|
And I have an active JWT token
|
|
492
527
|
|
|
493
|
-
|
|
528
|
+
Scenario: Login with "Remember me" option
|
|
529
|
+
Given I am on the login page
|
|
530
|
+
When I enter valid credentials
|
|
531
|
+
And I check "Remember me"
|
|
532
|
+
And I submit
|
|
533
|
+
Then I am redirected to the dashboard
|
|
534
|
+
And my session persists for 30 days
|
|
535
|
+
|
|
536
|
+
# SPEED MODE: All success scenarios above (required + optional features)
|
|
494
537
|
# STABLE MODE: Will add error handling scenarios like "Invalid credentials"
|
|
495
538
|
```
|
|
496
539
|
|
|
@@ -500,15 +543,17 @@ User confirms: "Yes, perfect"
|
|
|
500
543
|
|
|
501
544
|
**Transition:** `jettypod work implement 10 --winner="prototypes/2025-10-30-login-simple.html" --rationale="Simple inline form chosen - fastest for users, cleanest UX"`
|
|
502
545
|
|
|
503
|
-
## Validation
|
|
546
|
+
## Validation Checklist
|
|
504
547
|
|
|
505
|
-
Before completing feature
|
|
548
|
+
Before completing feature planning, ensure:
|
|
506
549
|
- [ ] Epic's architectural decision is shown (if exists)
|
|
507
550
|
- [ ] Exactly 3 approaches suggested
|
|
508
551
|
- [ ] Winner chosen (with prototypes or without)
|
|
509
|
-
- [ ] BDD scenarios written
|
|
552
|
+
- [ ] BDD scenarios written (all success paths)
|
|
510
553
|
- [ ] Step definitions written for ALL scenario steps
|
|
511
554
|
- [ ] Scenarios file exists at `features/[feature-slug].feature`
|
|
512
555
|
- [ ] Step definitions file exists at `features/step_definitions/[feature-slug].steps.js`
|
|
513
556
|
- [ ] BDD infrastructure validated with dry-run (Step 6.5)
|
|
514
|
-
- [ ]
|
|
557
|
+
- [ ] Feature transitioned to implementation with `work implement`
|
|
558
|
+
- [ ] Speed mode chores created
|
|
559
|
+
- [ ] First chore started with `work start [chore-id]` (Step 8D)
|