jettypod 4.4.118 → 4.4.121
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/.env +4 -3
- package/Cargo.lock +6450 -0
- package/Cargo.toml +35 -0
- package/README.md +5 -1
- package/TAURI-MIGRATION-PLAN.md +840 -0
- package/apps/dashboard/app/connect-claude/page.tsx +5 -6
- package/apps/dashboard/app/decision/[id]/page.tsx +63 -58
- package/apps/dashboard/app/demo/gates/page.tsx +43 -45
- package/apps/dashboard/app/design-system/page.tsx +868 -0
- package/apps/dashboard/app/globals.css +80 -4
- package/apps/dashboard/app/install-claude/page.tsx +4 -6
- package/apps/dashboard/app/login/page.tsx +72 -54
- package/apps/dashboard/app/page.tsx +101 -48
- package/apps/dashboard/app/settings/page.tsx +61 -13
- package/apps/dashboard/app/signup/page.tsx +242 -0
- package/apps/dashboard/app/subscribe/page.tsx +0 -2
- package/apps/dashboard/app/tests/page.tsx +37 -4
- package/apps/dashboard/app/welcome/page.tsx +13 -16
- package/apps/dashboard/app/work/[id]/page.tsx +117 -118
- package/apps/dashboard/app/work/[id]/proof/page.tsx +1489 -0
- package/apps/dashboard/components/AppShell.tsx +92 -85
- package/apps/dashboard/components/CardMenu.tsx +45 -12
- package/apps/dashboard/components/ClaudePanel.tsx +771 -850
- package/apps/dashboard/components/ClaudePanelInput.tsx +43 -15
- package/apps/dashboard/components/ConnectClaudeScreen.tsx +17 -34
- package/apps/dashboard/components/CopyableId.tsx +3 -4
- package/apps/dashboard/components/DetailReviewActions.tsx +100 -0
- package/apps/dashboard/components/DragContext.tsx +134 -63
- package/apps/dashboard/components/DraggableCard.tsx +3 -5
- package/apps/dashboard/components/DropZone.tsx +6 -7
- package/apps/dashboard/components/EditableDetailDescription.tsx +7 -13
- package/apps/dashboard/components/EditableDetailTitle.tsx +6 -13
- package/apps/dashboard/components/EditableTitle.tsx +26 -7
- package/apps/dashboard/components/ElapsedTimer.tsx +66 -0
- package/apps/dashboard/components/EpicGroup.tsx +359 -0
- package/apps/dashboard/components/GateCard.tsx +79 -17
- package/apps/dashboard/components/GateChoiceCard.tsx +15 -18
- package/apps/dashboard/components/InstallClaudeScreen.tsx +15 -32
- package/apps/dashboard/components/JettyLoader.tsx +37 -0
- package/apps/dashboard/components/KanbanBoard.tsx +368 -958
- package/apps/dashboard/components/KanbanCard.tsx +740 -0
- package/apps/dashboard/components/LazyCard.tsx +62 -0
- package/apps/dashboard/components/LazyMarkdown.tsx +11 -0
- package/apps/dashboard/components/MainNav.tsx +38 -73
- package/apps/dashboard/components/MessageBlock.tsx +468 -0
- package/apps/dashboard/components/ModeStartCard.tsx +15 -16
- package/apps/dashboard/components/OnboardingWelcome.tsx +213 -0
- package/apps/dashboard/components/PlaceholderCard.tsx +3 -4
- package/apps/dashboard/components/ProjectSwitcher.tsx +30 -30
- package/apps/dashboard/components/PrototypeTimeline.tsx +72 -51
- package/apps/dashboard/components/RealTimeKanbanWrapper.tsx +406 -388
- package/apps/dashboard/components/RealTimeTestsWrapper.tsx +373 -235
- package/apps/dashboard/components/ReviewFooter.tsx +139 -0
- package/apps/dashboard/components/SessionList.tsx +19 -19
- package/apps/dashboard/components/SubscribeContent.tsx +91 -47
- package/apps/dashboard/components/TestTree.tsx +16 -16
- package/apps/dashboard/components/TipCard.tsx +16 -17
- package/apps/dashboard/components/Toast.tsx +5 -6
- package/apps/dashboard/components/TypeIcon.tsx +55 -0
- package/apps/dashboard/components/ViewModeToolbar.tsx +104 -0
- package/apps/dashboard/components/WaveCompletionAnimation.tsx +52 -65
- package/apps/dashboard/components/WelcomeScreen.tsx +19 -35
- package/apps/dashboard/components/WorkItemHeader.tsx +4 -5
- package/apps/dashboard/components/WorkItemTree.tsx +11 -32
- package/apps/dashboard/components/settings/AccountSection.tsx +55 -35
- package/apps/dashboard/components/settings/AiContextSection.tsx +89 -0
- package/apps/dashboard/components/settings/ContextDocumentsSection.tsx +317 -0
- package/apps/dashboard/components/settings/EnvVarsSection.tsx +74 -152
- package/apps/dashboard/components/settings/GeneralSection.tsx +162 -56
- package/apps/dashboard/components/settings/ProjectStackSection.tsx +948 -0
- package/apps/dashboard/components/settings/SettingsLayout.tsx +4 -5
- package/apps/dashboard/components/ui/Button.tsx +104 -0
- package/apps/dashboard/components/ui/Input.tsx +78 -0
- package/apps/dashboard/components.json +1 -1
- package/apps/dashboard/contexts/ClaudeSessionContext.tsx +711 -418
- package/apps/dashboard/contexts/ConnectionStatusContext.tsx +25 -5
- package/apps/dashboard/contexts/UsageContext.tsx +87 -32
- package/apps/dashboard/dev.sh +35 -0
- package/apps/dashboard/eslint.config.mjs +9 -9
- package/apps/dashboard/hooks/useKanbanAnimation.ts +29 -0
- package/apps/dashboard/hooks/useKanbanUndo.ts +83 -0
- package/apps/dashboard/hooks/useWebSocket.ts +138 -83
- package/apps/dashboard/index.html +73 -0
- package/apps/dashboard/lib/constants.ts +43 -0
- package/apps/dashboard/lib/data-bridge.ts +722 -0
- package/apps/dashboard/lib/db.ts +69 -1265
- package/apps/dashboard/lib/environment-config.ts +173 -0
- package/apps/dashboard/lib/environment-verification.ts +119 -0
- package/apps/dashboard/lib/kanban-utils.ts +270 -0
- package/apps/dashboard/lib/proof-run.ts +495 -0
- package/apps/dashboard/lib/proof-scenario-runner.ts +346 -0
- package/apps/dashboard/lib/run-migrations.js +27 -2
- package/apps/dashboard/lib/service-recovery.ts +326 -0
- package/apps/dashboard/lib/session-state-machine.ts +1 -0
- package/apps/dashboard/lib/session-state-utils.ts +0 -164
- package/apps/dashboard/lib/session-stream-manager.ts +308 -134
- package/apps/dashboard/lib/shadows.ts +7 -0
- package/apps/dashboard/lib/stream-manager-registry.ts +46 -6
- package/apps/dashboard/lib/tauri-bridge.ts +102 -0
- package/apps/dashboard/lib/tauri.ts +106 -0
- package/apps/dashboard/lib/utils.ts +6 -0
- package/apps/dashboard/next-env.d.ts +1 -1
- package/apps/dashboard/package.json +21 -32
- package/apps/dashboard/public/bug-icon.png +0 -0
- package/apps/dashboard/public/buoy-icon.png +0 -0
- package/apps/dashboard/public/fonts/Satoshi-Variable.woff2 +0 -0
- package/apps/dashboard/public/fonts/Satoshi-VariableItalic.woff2 +0 -0
- package/apps/dashboard/public/in-flight-seagull.png +0 -0
- package/apps/dashboard/public/jetty-icon-loading-alt.svg +11 -0
- package/apps/dashboard/public/jetty-icon-loading.svg +11 -0
- package/apps/dashboard/public/jettypod_logo.png +0 -0
- package/apps/dashboard/public/pier-icon.png +0 -0
- package/apps/dashboard/public/star-icon.png +0 -0
- package/apps/dashboard/public/wrench-icon.png +0 -0
- package/apps/dashboard/scripts/tauri-build.js +228 -0
- package/apps/dashboard/scripts/upload-tauri-to-r2.js +125 -0
- package/apps/dashboard/scripts/ws-server.js +191 -0
- package/apps/dashboard/src/main.tsx +12 -0
- package/apps/dashboard/src/router.tsx +107 -0
- package/apps/dashboard/src/vite-env.d.ts +1 -0
- package/apps/dashboard/tsconfig.json +7 -12
- package/apps/dashboard/tsconfig.tsbuildinfo +1 -1
- package/apps/dashboard/vite.config.ts +33 -0
- package/apps/update-server/src/index.ts +228 -80
- package/claude-hooks/global-guardrails.js +14 -13
- package/crates/jettypod-cli/Cargo.toml +19 -0
- package/crates/jettypod-cli/src/commands.rs +1249 -0
- package/crates/jettypod-cli/src/main.rs +595 -0
- package/crates/jettypod-core/Cargo.toml +26 -0
- package/crates/jettypod-core/build.rs +98 -0
- package/crates/jettypod-core/migrations/V1__baseline.sql +197 -0
- package/crates/jettypod-core/migrations/V2__work_items_indexes.sql +6 -0
- package/crates/jettypod-core/migrations/V3__qa_steps.sql +2 -0
- package/crates/jettypod-core/src/auth.rs +294 -0
- package/crates/jettypod-core/src/config.rs +397 -0
- package/crates/jettypod-core/src/db/mod.rs +507 -0
- package/crates/jettypod-core/src/db/recovery.rs +114 -0
- package/crates/jettypod-core/src/db/startup.rs +101 -0
- package/crates/jettypod-core/src/db/validate.rs +149 -0
- package/crates/jettypod-core/src/error.rs +76 -0
- package/crates/jettypod-core/src/git.rs +458 -0
- package/crates/jettypod-core/src/lib.rs +20 -0
- package/crates/jettypod-core/src/sessions.rs +625 -0
- package/crates/jettypod-core/src/skills.rs +556 -0
- package/crates/jettypod-core/src/work.rs +1086 -0
- package/crates/jettypod-core/src/worktree.rs +628 -0
- package/crates/jettypod-core/src/ws.rs +767 -0
- package/cucumber-test.cjs +6 -0
- package/cucumber.js +9 -3
- package/docs/COMMAND_REFERENCE.md +34 -0
- package/hooks/post-checkout +32 -75
- package/hooks/post-merge +111 -10
- package/jest.setup.js +1 -0
- package/jettypod.js +145 -116
- package/lib/bdd-preflight.js +96 -0
- package/lib/chore-taxonomy.js +33 -10
- package/lib/database.js +36 -16
- package/lib/db-watcher.js +1 -1
- package/lib/git-hooks/pre-commit +1 -1
- package/lib/jettypod-backup.js +27 -4
- package/lib/merge-lock.js +111 -253
- package/lib/migrations/027-plan-at-creation-column.js +3 -1
- package/lib/migrations/029-remove-autoincrement.js +307 -0
- package/lib/migrations/029-rename-corrupted-to-cleaned.js +149 -0
- package/lib/migrations/030-rejection-round-columns.js +54 -0
- package/lib/migrations/031-session-isolation-index.js +17 -0
- package/lib/migrations/index.js +47 -4
- package/lib/schema.js +10 -5
- package/lib/seed-onboarding.js +1 -1
- package/lib/update-command/index.js +9 -175
- package/lib/work-commands/index.js +144 -19
- package/lib/work-tracking/index.js +148 -27
- package/lib/worktree-diagnostics.js +16 -16
- package/lib/worktree-facade.js +1 -1
- package/lib/worktree-manager.js +8 -8
- package/lib/worktree-reconciler.js +5 -5
- package/package.json +9 -2
- package/scripts/ndjson-to-cucumber-json.js +152 -0
- package/scripts/postinstall.js +25 -0
- package/skills-templates/bug-mode/SKILL.md +79 -20
- package/skills-templates/bug-planning/SKILL.md +25 -29
- package/skills-templates/chore-mode/SKILL.md +171 -69
- package/skills-templates/chore-mode/verification.js +51 -10
- package/skills-templates/chore-planning/SKILL.md +47 -18
- package/skills-templates/design-system-selection/SKILL.md +273 -0
- package/skills-templates/epic-planning/SKILL.md +82 -48
- package/skills-templates/external-transition/SKILL.md +47 -47
- package/skills-templates/feature-planning/SKILL.md +173 -74
- package/skills-templates/production-mode/SKILL.md +69 -49
- package/skills-templates/request-routing/SKILL.md +4 -4
- package/skills-templates/simple-improvement/SKILL.md +74 -29
- package/skills-templates/speed-mode/SKILL.md +217 -141
- package/skills-templates/stable-mode/SKILL.md +148 -89
- package/apps/dashboard/README.md +0 -36
- package/apps/dashboard/app/api/claude/[workItemId]/message/route.ts +0 -386
- package/apps/dashboard/app/api/claude/[workItemId]/pin/route.ts +0 -24
- package/apps/dashboard/app/api/claude/[workItemId]/route.ts +0 -167
- package/apps/dashboard/app/api/claude/sessions/[sessionId]/content/route.ts +0 -52
- package/apps/dashboard/app/api/claude/sessions/[sessionId]/message/route.ts +0 -378
- package/apps/dashboard/app/api/claude/sessions/[sessionId]/pin/route.ts +0 -24
- package/apps/dashboard/app/api/claude/sessions/cleanup/route.ts +0 -34
- package/apps/dashboard/app/api/claude/sessions/route.ts +0 -184
- package/apps/dashboard/app/api/decisions/[id]/route.ts +0 -25
- package/apps/dashboard/app/api/internal/set-project/route.ts +0 -17
- package/apps/dashboard/app/api/kanban/route.ts +0 -15
- package/apps/dashboard/app/api/settings/env-vars/route.ts +0 -125
- package/apps/dashboard/app/api/settings/general/route.ts +0 -21
- package/apps/dashboard/app/api/tests/route.ts +0 -9
- package/apps/dashboard/app/api/tests/run/route.ts +0 -82
- package/apps/dashboard/app/api/tests/run/stream/route.ts +0 -71
- package/apps/dashboard/app/api/tests/undefined/route.ts +0 -9
- package/apps/dashboard/app/api/usage/route.ts +0 -17
- package/apps/dashboard/app/api/work/[id]/description/route.ts +0 -21
- package/apps/dashboard/app/api/work/[id]/epic/route.ts +0 -21
- package/apps/dashboard/app/api/work/[id]/order/route.ts +0 -21
- package/apps/dashboard/app/api/work/[id]/status/route.ts +0 -21
- package/apps/dashboard/app/api/work/[id]/title/route.ts +0 -21
- package/apps/dashboard/app/layout.tsx +0 -43
- package/apps/dashboard/components/UpgradeBanner.tsx +0 -29
- package/apps/dashboard/electron/ipc-handlers.js +0 -1028
- package/apps/dashboard/electron/main.js +0 -2124
- package/apps/dashboard/electron/preload.js +0 -123
- package/apps/dashboard/electron/session-manager.js +0 -141
- package/apps/dashboard/electron-builder.config.js +0 -357
- package/apps/dashboard/hooks/useClaudeSessions.ts +0 -299
- package/apps/dashboard/lib/claude-process-manager.ts +0 -492
- package/apps/dashboard/lib/db-bridge.ts +0 -282
- package/apps/dashboard/lib/prototypes.ts +0 -202
- package/apps/dashboard/lib/test-results-db.ts +0 -307
- package/apps/dashboard/lib/tests.ts +0 -282
- package/apps/dashboard/next.config.js +0 -50
- package/apps/dashboard/postcss.config.mjs +0 -7
- package/apps/dashboard/public/file.svg +0 -1
- package/apps/dashboard/public/globe.svg +0 -1
- package/apps/dashboard/public/next.svg +0 -1
- package/apps/dashboard/public/vercel.svg +0 -1
- package/apps/dashboard/public/window.svg +0 -1
- package/apps/dashboard/scripts/download-node.js +0 -104
- package/apps/dashboard/scripts/upload-to-r2.js +0 -89
- package/docs/bdd-guidance.md +0 -390
|
@@ -18,7 +18,7 @@ description: Guide implementation of speed mode chores with autonomous code anal
|
|
|
18
18
|
└─────────────────────────────────────────────────────────────────────┘
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
-
##
|
|
21
|
+
## CRITICAL HANDOFF REQUIREMENT
|
|
22
22
|
|
|
23
23
|
**After completing ALL speed mode chores, you MUST:**
|
|
24
24
|
1. Generate stable mode BDD scenarios and step definitions
|
|
@@ -26,18 +26,18 @@ description: Guide implementation of speed mode chores with autonomous code anal
|
|
|
26
26
|
3. Set feature mode to stable
|
|
27
27
|
4. **IMMEDIATELY invoke stable-mode using the Skill tool**
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
**STOP GATE:** DO NOT end this skill without invoking stable-mode. Speed mode is ONLY a checkpoint - features are INCOMPLETE without stable mode.
|
|
30
30
|
|
|
31
31
|
---
|
|
32
32
|
|
|
33
|
-
##
|
|
33
|
+
## FORBIDDEN: Skipping Stable Mode
|
|
34
34
|
|
|
35
35
|
```
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
36
|
+
Ending speed-mode skill without invoking stable-mode skill
|
|
37
|
+
Using `jettypod work status <feature-id> done` to mark feature complete
|
|
38
|
+
Telling user "feature is complete" after speed mode
|
|
39
|
+
Skipping Step 7 (Transition to Stable Mode)
|
|
40
|
+
Any action that bypasses the speed→stable progression
|
|
41
41
|
```
|
|
42
42
|
|
|
43
43
|
**What "Feature Complete" Actually Means:**
|
|
@@ -60,7 +60,7 @@ Guides Claude Code through speed mode implementation with autonomous analysis an
|
|
|
60
60
|
|
|
61
61
|
When this skill is activated, you are helping implement a speed mode chore to make all success scenarios pass. Follow this structured approach:
|
|
62
62
|
|
|
63
|
-
##
|
|
63
|
+
## Critical Context
|
|
64
64
|
|
|
65
65
|
**You are working in an isolated git worktree:**
|
|
66
66
|
- `work start [chore-id]` created a dedicated worktree for this chore
|
|
@@ -72,7 +72,7 @@ When this skill is activated, you are helping implement a speed mode chore to ma
|
|
|
72
72
|
|
|
73
73
|
---
|
|
74
74
|
|
|
75
|
-
##
|
|
75
|
+
## SHELL CWD RECOVERY
|
|
76
76
|
|
|
77
77
|
**If ALL bash commands start failing with "Error: Exit code 1" and no output:**
|
|
78
78
|
|
|
@@ -93,7 +93,7 @@ cd /Users/erikspangenberg/personal-assistant && pwd
|
|
|
93
93
|
|
|
94
94
|
---
|
|
95
95
|
|
|
96
|
-
##
|
|
96
|
+
## PRE-FLIGHT VALIDATION (REQUIRED)
|
|
97
97
|
|
|
98
98
|
**Before proceeding with ANY implementation, you MUST validate the worktree exists.**
|
|
99
99
|
|
|
@@ -107,11 +107,11 @@ sqlite3 .jettypod/work.db "SELECT wi.id, wi.title, wi.status, wt.worktree_path,
|
|
|
107
107
|
|
|
108
108
|
| worktree_path | What it means | Action |
|
|
109
109
|
|---------------|---------------|--------|
|
|
110
|
-
| **Has a path** (e.g., `/path/to/.jettypod-work/...`) |
|
|
111
|
-
| **NULL or empty** |
|
|
112
|
-
| **No rows returned** |
|
|
110
|
+
| **Has a path** (e.g., `/path/to/.jettypod-work/...`) | Worktree exists, ready to proceed | Continue to Step 0 |
|
|
111
|
+
| **NULL or empty** | `work start` was not called | **STOP - run `jettypod work start [chore-id]` first** |
|
|
112
|
+
| **No rows returned** | No chore is in progress | **STOP - verify the chore exists and run `work start`** |
|
|
113
113
|
|
|
114
|
-
|
|
114
|
+
**STOP GATE:** If `worktree_path` is NULL or no rows returned, you MUST run `jettypod work start [chore-id]` before continuing. DO NOT proceed without a valid worktree.
|
|
115
115
|
|
|
116
116
|
**Example of valid output:**
|
|
117
117
|
```
|
|
@@ -126,7 +126,7 @@ sqlite3 .jettypod/work.db "SELECT wi.id, wi.title, wi.status, wt.worktree_path,
|
|
|
126
126
|
|
|
127
127
|
---
|
|
128
128
|
|
|
129
|
-
##
|
|
129
|
+
## WORKTREE PATH LOCK
|
|
130
130
|
|
|
131
131
|
**After pre-flight validation passes, capture and lock the worktree path:**
|
|
132
132
|
|
|
@@ -135,7 +135,7 @@ From the pre-flight query output, extract and store:
|
|
|
135
135
|
|
|
136
136
|
**Display:**
|
|
137
137
|
```
|
|
138
|
-
|
|
138
|
+
WORKTREE LOCK ACTIVE
|
|
139
139
|
Path: ${WORKTREE_PATH}
|
|
140
140
|
|
|
141
141
|
All file writes will use this path.
|
|
@@ -171,7 +171,7 @@ jettypod ui gate worktree-started --data='{"path":"${WORKTREE_PATH}"}'
|
|
|
171
171
|
**User Profile:** May not know how to code - Claude Code does the implementation autonomously.
|
|
172
172
|
|
|
173
173
|
<details>
|
|
174
|
-
<summary><strong
|
|
174
|
+
<summary><strong>Speed Mode Constraints (click to expand)</strong></summary>
|
|
175
175
|
|
|
176
176
|
**What to implement:**
|
|
177
177
|
- **Integration** - wire feature into the app so it's reachable (Integration Scenario)
|
|
@@ -180,10 +180,10 @@ jettypod ui gate worktree-started --data='{"path":"${WORKTREE_PATH}"}'
|
|
|
180
180
|
- Success variations (different outcomes that are all correct)
|
|
181
181
|
|
|
182
182
|
**What NOT to implement:**
|
|
183
|
-
-
|
|
184
|
-
-
|
|
185
|
-
-
|
|
186
|
-
-
|
|
183
|
+
- Error handling (try/catch, validation, edge cases)
|
|
184
|
+
- Input validation (null checks, type checks, range validation)
|
|
185
|
+
- Error messages for failures
|
|
186
|
+
- Edge case handling (empty arrays, boundary values, race conditions)
|
|
187
187
|
|
|
188
188
|
**Code organization:**
|
|
189
189
|
- Single file when possible - keep it simple
|
|
@@ -195,7 +195,7 @@ jettypod ui gate worktree-started --data='{"path":"${WORKTREE_PATH}"}'
|
|
|
195
195
|
|
|
196
196
|
---
|
|
197
197
|
|
|
198
|
-
##
|
|
198
|
+
## Unit Testing in Speed Mode - True TDD
|
|
199
199
|
|
|
200
200
|
**Unit tests are written DURING the RED→GREEN loop, not after.**
|
|
201
201
|
|
|
@@ -218,7 +218,7 @@ jettypod ui gate worktree-started --data='{"path":"${WORKTREE_PATH}"}'
|
|
|
218
218
|
- Check existing test files for patterns
|
|
219
219
|
|
|
220
220
|
<details>
|
|
221
|
-
<summary><strong
|
|
221
|
+
<summary><strong>TDD Example (click to expand)</strong></summary>
|
|
222
222
|
|
|
223
223
|
```javascript
|
|
224
224
|
// Iteration 1: BDD step "Given a user exists" is failing
|
|
@@ -243,14 +243,14 @@ function createUser(name, email) {
|
|
|
243
243
|
|
|
244
244
|
**Unit test scope in speed mode:**
|
|
245
245
|
```javascript
|
|
246
|
-
//
|
|
246
|
+
// Speed mode unit tests (success paths)
|
|
247
247
|
test('createUser creates user with valid data', () => {
|
|
248
248
|
const user = createUser('John', 'john@example.com');
|
|
249
249
|
expect(user.name).toBe('John');
|
|
250
250
|
expect(user.email).toBe('john@example.com');
|
|
251
251
|
});
|
|
252
252
|
|
|
253
|
-
//
|
|
253
|
+
// NOT in speed mode (stable mode adds these)
|
|
254
254
|
test('createUser throws error for invalid email', () => {
|
|
255
255
|
expect(() => createUser('John', 'invalid')).toThrow();
|
|
256
256
|
});
|
|
@@ -267,14 +267,17 @@ test('createUser throws error for invalid email', () => {
|
|
|
267
267
|
| Step | Location | Why |
|
|
268
268
|
|------|----------|-----|
|
|
269
269
|
| Step 3A | Before implementing (conditional) | User confirms implementation approach - only if ambiguous |
|
|
270
|
-
| Step
|
|
270
|
+
| Step 7C | Before writing stable scenarios | User confirms stable mode BDD scenarios - always |
|
|
271
|
+
| Step 7E | Before creating stable chores | User confirms proposed stable mode chores - always |
|
|
271
272
|
|
|
272
273
|
**Where Claude Code executes autonomously:**
|
|
273
274
|
- Steps 0-2: Initialize, analyze scenarios, analyze codebase
|
|
274
275
|
- Step 3: Decision to skip/ask confirmation
|
|
275
276
|
- Steps 4-5: RED baseline, RED→GREEN→REFACTOR loop
|
|
276
277
|
- Step 6: Route to next chore OR transition to Step 7
|
|
277
|
-
- Step
|
|
278
|
+
- Step 7A-7B: Validate BDD, merge final speed chore
|
|
279
|
+
- Step 7D: Write and merge confirmed stable scenarios
|
|
280
|
+
- Step 7F-7G (after chore confirmation): Create chores, set mode, invoke stable-mode
|
|
278
281
|
|
|
279
282
|
---
|
|
280
283
|
|
|
@@ -290,7 +293,7 @@ test('createUser throws error for invalid email', () => {
|
|
|
290
293
|
sqlite3 .jettypod/work.db "SELECT wi.id, wi.title, wi.parent_id, parent.title as parent_title, parent.scenario_file, wt.worktree_path, wt.branch_name FROM work_items wi LEFT JOIN work_items parent ON wi.parent_id = parent.id LEFT JOIN worktrees wt ON wi.id = wt.work_item_id WHERE wi.status = 'in_progress' AND wi.type = 'chore'"
|
|
291
294
|
```
|
|
292
295
|
|
|
293
|
-
|
|
296
|
+
**WORKFLOW INTEGRATION: Start workflow tracking**
|
|
294
297
|
|
|
295
298
|
After getting the work context, register this skill execution:
|
|
296
299
|
|
|
@@ -304,7 +307,7 @@ This validates that `feature_planning_complete` gate is passed and creates an ex
|
|
|
304
307
|
|
|
305
308
|
```
|
|
306
309
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
307
|
-
|
|
310
|
+
SPEED MODE: Implementing Chore #[id]
|
|
308
311
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
309
312
|
|
|
310
313
|
Chore: [title]
|
|
@@ -321,11 +324,11 @@ Analyzing BDD scenarios to determine implementation approach...
|
|
|
321
324
|
|
|
322
325
|
### Step 1: Check for Breadcrumbs and Analyze Scenario
|
|
323
326
|
|
|
324
|
-
|
|
327
|
+
**FORBIDDEN: Writing Files at This Step**
|
|
325
328
|
```
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
+
Write tool to any path
|
|
330
|
+
Edit tool to any path
|
|
331
|
+
Any file creation or modification
|
|
329
332
|
```
|
|
330
333
|
**This is an ANALYSIS step.** File writes happen in Step 5.
|
|
331
334
|
|
|
@@ -347,9 +350,10 @@ sqlite3 .jettypod/work.db "SELECT wi.id, wi.title, wi.description, wi.parent_id,
|
|
|
347
350
|
**Check for breadcrumbs** by examining the chore's description for:
|
|
348
351
|
- "Scenario steps addressed:"
|
|
349
352
|
- "Implementation guidance:"
|
|
353
|
+
- "UX acceptance criteria:" (loading states, success feedback, empty states, micro-interactions)
|
|
350
354
|
- "Verification:"
|
|
351
355
|
|
|
352
|
-
If
|
|
356
|
+
If at least "Scenario steps addressed:", "Implementation guidance:", and "Verification:" exist, use them. "UX acceptance criteria:" is optional but MUST be implemented if present — these define the visual states and micro-interactions the user expects to see during QA.
|
|
353
357
|
|
|
354
358
|
**Then read the scenario file** using the Read tool on the path returned by `scenario_file`.
|
|
355
359
|
|
|
@@ -365,7 +369,7 @@ If all three sections exist, use them. Otherwise, fall back to autonomous analys
|
|
|
365
369
|
**Display to user (with breadcrumbs):**
|
|
366
370
|
|
|
367
371
|
```
|
|
368
|
-
|
|
372
|
+
Speed Mode: [Chore Title]
|
|
369
373
|
|
|
370
374
|
Scenario steps addressed:
|
|
371
375
|
[Steps from breadcrumbs]
|
|
@@ -373,6 +377,9 @@ Scenario steps addressed:
|
|
|
373
377
|
Implementation guidance:
|
|
374
378
|
[Files, patterns, functions from breadcrumbs]
|
|
375
379
|
|
|
380
|
+
UX acceptance criteria:
|
|
381
|
+
[Loading states, success feedback, empty states, micro-interactions from breadcrumbs — if present]
|
|
382
|
+
|
|
376
383
|
Verification:
|
|
377
384
|
[Step definitions from breadcrumbs]
|
|
378
385
|
|
|
@@ -382,7 +389,7 @@ Now analyzing codebase to finalize implementation approach...
|
|
|
382
389
|
**Display to user (without breadcrumbs):**
|
|
383
390
|
|
|
384
391
|
```
|
|
385
|
-
|
|
392
|
+
Speed Mode: [Feature Name]
|
|
386
393
|
|
|
387
394
|
Happy Path Scenario:
|
|
388
395
|
[Scenario title]
|
|
@@ -400,11 +407,11 @@ Now analyzing codebase to propose implementation...
|
|
|
400
407
|
|
|
401
408
|
### Step 2: Autonomous Codebase Analysis
|
|
402
409
|
|
|
403
|
-
|
|
410
|
+
**FORBIDDEN: Writing Files at This Step**
|
|
404
411
|
```
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
412
|
+
Write tool to any path
|
|
413
|
+
Edit tool to any path
|
|
414
|
+
Any file creation or modification
|
|
408
415
|
```
|
|
409
416
|
**This is an ANALYSIS step.** File writes happen in Step 5.
|
|
410
417
|
|
|
@@ -458,7 +465,7 @@ Decisions constrain your implementation approach - use them to guide technology
|
|
|
458
465
|
**Display analysis results:**
|
|
459
466
|
|
|
460
467
|
```
|
|
461
|
-
|
|
468
|
+
Codebase Analysis Complete
|
|
462
469
|
|
|
463
470
|
Architectural Constraints:
|
|
464
471
|
[List any epic decisions that apply]
|
|
@@ -476,7 +483,7 @@ Integration Points:
|
|
|
476
483
|
Now proposing implementation approach...
|
|
477
484
|
```
|
|
478
485
|
|
|
479
|
-
|
|
486
|
+
**WORKFLOW CHECKPOINT: Codebase analysis complete**
|
|
480
487
|
|
|
481
488
|
```bash
|
|
482
489
|
jettypod workflow checkpoint <feature-id> --step=2
|
|
@@ -484,11 +491,11 @@ jettypod workflow checkpoint <feature-id> --step=2
|
|
|
484
491
|
|
|
485
492
|
### Step 3: Decide if Confirmation Needed
|
|
486
493
|
|
|
487
|
-
|
|
494
|
+
**FORBIDDEN: Writing Files at This Step**
|
|
488
495
|
```
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
496
|
+
Write tool to any path
|
|
497
|
+
Edit tool to any path
|
|
498
|
+
Any file creation or modification
|
|
492
499
|
```
|
|
493
500
|
**This is a DECISION step.** File writes happen in Step 5.
|
|
494
501
|
|
|
@@ -508,20 +515,20 @@ jettypod workflow checkpoint <feature-id> --step=2
|
|
|
508
515
|
|
|
509
516
|
### Step 3A: Propose Implementation Approach (Conditional)
|
|
510
517
|
|
|
511
|
-
|
|
518
|
+
**FORBIDDEN: Writing Files at This Step**
|
|
512
519
|
```
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
520
|
+
Write tool to any path
|
|
521
|
+
Edit tool to any path
|
|
522
|
+
Any file creation or modification
|
|
516
523
|
```
|
|
517
524
|
**This is a PROPOSAL step.** File writes happen in Step 5.
|
|
518
525
|
|
|
519
|
-
|
|
526
|
+
**ASYNC BOUNDARY - Only execute this if confirmation needed**
|
|
520
527
|
|
|
521
528
|
**Present your analysis and proposal to the user:**
|
|
522
529
|
|
|
523
530
|
```
|
|
524
|
-
|
|
531
|
+
Implementation Proposal
|
|
525
532
|
|
|
526
533
|
I see multiple ways to approach this. Here's what I'm thinking:
|
|
527
534
|
|
|
@@ -536,7 +543,7 @@ I see multiple ways to approach this. Here's what I'm thinking:
|
|
|
536
543
|
Sound good, or would you prefer a different approach?
|
|
537
544
|
```
|
|
538
545
|
|
|
539
|
-
|
|
546
|
+
**WAIT for user confirmation or adjustments.**
|
|
540
547
|
|
|
541
548
|
If user adjusts: revise proposal and confirm again before proceeding.
|
|
542
549
|
|
|
@@ -544,6 +551,16 @@ If user adjusts: revise proposal and confirm again before proceeding.
|
|
|
544
551
|
|
|
545
552
|
---
|
|
546
553
|
|
|
554
|
+
### BDD Step Definition Constraints (ENFORCED)
|
|
555
|
+
|
|
556
|
+
Before writing any step definitions, read `templates/bdd-guidance.md`. BANNED in step defs: `setTimeout`/`sleep`, module-level `let`/`var`, raw SQL, assertions in Given/When, loops/branching, self-fulfilling mocks (setting state then asserting it). Steps must be 1-5 lines calling one helper via Cucumber World (`this`). Read `features/support/helpers/` and reuse before creating.
|
|
557
|
+
|
|
558
|
+
**Scaffolding:** If `features/support/helpers/` does not exist in the project, scaffold it before writing step definitions. Copy `templates/bdd-scaffolding/wait.js` to `features/support/helpers/wait.js` and `templates/bdd-scaffolding/world.js` to `features/support/world.js`.
|
|
559
|
+
|
|
560
|
+
**Helper Reuse:** Before writing step definitions, glob `features/support/helpers/**/*.js` and read each file. Import and call existing helpers in your steps — never duplicate functionality that already exists.
|
|
561
|
+
|
|
562
|
+
---
|
|
563
|
+
|
|
547
564
|
### Step 4: Establish RED Baseline
|
|
548
565
|
|
|
549
566
|
**CRITICAL:** After user confirms, execute autonomously - no permission needed for code changes.
|
|
@@ -568,27 +585,27 @@ This establishes your RED baseline - all or most steps should be failing initial
|
|
|
568
585
|
|
|
569
586
|
**Display RED baseline:**
|
|
570
587
|
```
|
|
571
|
-
|
|
588
|
+
Establishing RED baseline...
|
|
572
589
|
|
|
573
590
|
RED Baseline: 5 of 8 steps failing
|
|
574
591
|
|
|
575
592
|
Failing steps:
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
593
|
+
Given a user is logged in
|
|
594
|
+
When they click the dashboard button
|
|
595
|
+
Then they should see their dashboard
|
|
596
|
+
And the dashboard should show their username
|
|
597
|
+
And the dashboard should show their recent activity
|
|
581
598
|
|
|
582
599
|
First error:
|
|
583
600
|
Step: Given a user is logged in
|
|
584
601
|
Error: Error: login function is not defined
|
|
585
602
|
|
|
586
|
-
|
|
603
|
+
Goal: Make all steps pass
|
|
587
604
|
|
|
588
605
|
Now implementing...
|
|
589
606
|
```
|
|
590
607
|
|
|
591
|
-
|
|
608
|
+
**WORKFLOW CHECKPOINT: RED baseline established**
|
|
592
609
|
|
|
593
610
|
```bash
|
|
594
611
|
jettypod workflow checkpoint <feature-id> --step=4
|
|
@@ -598,9 +615,9 @@ jettypod workflow checkpoint <feature-id> --step=4
|
|
|
598
615
|
|
|
599
616
|
### Step 5: RED→GREEN→REFACTOR Loop
|
|
600
617
|
|
|
601
|
-
|
|
618
|
+
**WORKTREE PATH REQUIRED:** All file writes MUST use the `WORKTREE_PATH` captured after pre-flight validation.
|
|
602
619
|
|
|
603
|
-
|
|
620
|
+
**NOW you may write files** - worktree is locked, approach is confirmed.
|
|
604
621
|
|
|
605
622
|
**Emit gate signal:**
|
|
606
623
|
|
|
@@ -623,23 +640,23 @@ jettypod ui gate implementing --data='{"description":"[speed mode implementation
|
|
|
623
640
|
**Show progress each iteration:**
|
|
624
641
|
```
|
|
625
642
|
━━━ Iteration 3/10 ━━━
|
|
626
|
-
|
|
643
|
+
Unit test: test/dashboard.test.js - sortActivityByDate()
|
|
627
644
|
RED: Test fails - function doesn't exist yet
|
|
628
|
-
|
|
645
|
+
Implementation: src/dashboard.js - added sortActivityByDate()
|
|
629
646
|
GREEN: Unit test passes
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
647
|
+
Running BDD scenarios...
|
|
648
|
+
Progress: 7/8 BDD steps passing
|
|
649
|
+
Newly passing: And activity should be sorted by date
|
|
650
|
+
Next failure: And activity should be filterable
|
|
634
651
|
BDD step: When I filter by category "work"
|
|
635
652
|
```
|
|
636
653
|
|
|
637
654
|
**When GREEN achieved:**
|
|
638
655
|
```
|
|
639
|
-
|
|
656
|
+
GREEN: All success scenarios passing!
|
|
640
657
|
```
|
|
641
658
|
|
|
642
|
-
|
|
659
|
+
**WORKFLOW CHECKPOINT: GREEN achieved**
|
|
643
660
|
|
|
644
661
|
```bash
|
|
645
662
|
jettypod workflow checkpoint <feature-id> --step=5
|
|
@@ -654,7 +671,7 @@ jettypod workflow checkpoint <feature-id> --step=5
|
|
|
654
671
|
**Re-run tests after refactor** to ensure nothing broke.
|
|
655
672
|
|
|
656
673
|
<details>
|
|
657
|
-
<summary><strong
|
|
674
|
+
<summary><strong>TDD Loop Guidelines (click to expand)</strong></summary>
|
|
658
675
|
|
|
659
676
|
**Iteration strategy:**
|
|
660
677
|
- Start with first failing step
|
|
@@ -674,6 +691,8 @@ jettypod workflow checkpoint <feature-id> --step=5
|
|
|
674
691
|
|
|
675
692
|
</details>
|
|
676
693
|
|
|
694
|
+
**Quality Gate:** Before committing, review every `.steps.js` file you wrote or modified. Check for banlist violations: `setTimeout`/`sleep`, module-level `let`/`var`, raw SQL, assertions in Given/When, self-fulfilling mocks, steps longer than 5 lines. Fix violations before proceeding.
|
|
695
|
+
|
|
677
696
|
---
|
|
678
697
|
|
|
679
698
|
### Step 6: Route After Chore Completion
|
|
@@ -696,10 +715,10 @@ sqlite3 .jettypod/work.db "SELECT id, title FROM work_items WHERE parent_id = <f
|
|
|
696
715
|
|
|
697
716
|
```
|
|
698
717
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
699
|
-
|
|
718
|
+
Speed Mode Chore Complete
|
|
700
719
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
701
720
|
|
|
702
|
-
|
|
721
|
+
Success scenarios pass for this chore
|
|
703
722
|
|
|
704
723
|
More speed mode chores remain. Starting next chore:
|
|
705
724
|
#[next-chore-id]: [next-chore-title]
|
|
@@ -717,6 +736,8 @@ git add . && git commit -m "feat: [brief description of what was implemented]"
|
|
|
717
736
|
jettypod work merge [current-chore-id]
|
|
718
737
|
```
|
|
719
738
|
|
|
739
|
+
**If merge fails with `Uncommitted changes detected`:** `git stash` from main repo CWD → create a work item for the stashed changes → `jettypod work start <id>` → `git stash pop` in that worktree → commit → merge → cleanup → then retry your original merge.
|
|
740
|
+
|
|
720
741
|
```bash
|
|
721
742
|
# Step 2: cd to main repo
|
|
722
743
|
cd /path/to/main/repo
|
|
@@ -741,7 +762,7 @@ If the query returns no remaining chores, proceed to Step 7.
|
|
|
741
762
|
|
|
742
763
|
### Step 7: Transition to Stable Mode
|
|
743
764
|
|
|
744
|
-
|
|
765
|
+
**CRITICAL: This step ONLY runs after ALL speed chores are complete.**
|
|
745
766
|
|
|
746
767
|
This is the transition from speed mode to stable mode. Follow these phases in order.
|
|
747
768
|
|
|
@@ -804,8 +825,8 @@ git add . && git commit -m "feat: [brief description of what was implemented]"
|
|
|
804
825
|
```
|
|
805
826
|
|
|
806
827
|
```bash
|
|
807
|
-
# Step 1: Merge
|
|
808
|
-
jettypod work merge [current-chore-id]
|
|
828
|
+
# Step 1: Merge (works from anywhere — ALWAYS include chore ID)
|
|
829
|
+
jettypod work merge [current-chore-id]
|
|
809
830
|
```
|
|
810
831
|
|
|
811
832
|
```bash
|
|
@@ -821,42 +842,95 @@ jettypod work cleanup [current-chore-id]
|
|
|
821
842
|
|
|
822
843
|
After cleanup, you are on main branch. Ready to generate stable mode scenarios.
|
|
823
844
|
|
|
824
|
-
#### Step 7C:
|
|
845
|
+
#### Step 7C: Present Stable Mode Scenarios for Review
|
|
825
846
|
|
|
826
|
-
|
|
847
|
+
**FORBIDDEN: Writing Files at This Step**
|
|
848
|
+
```
|
|
849
|
+
Write tool to any path
|
|
850
|
+
Edit tool to any path
|
|
851
|
+
Any file creation or modification
|
|
852
|
+
```
|
|
853
|
+
**This is a PROPOSAL step.** File writes happen in Step 7D after user confirmation.
|
|
827
854
|
|
|
828
|
-
**
|
|
855
|
+
**ASYNC BOUNDARY - Must wait for user confirmation**
|
|
856
|
+
|
|
857
|
+
**1. Read the feature's scenario file and analyze for stable mode needs:**
|
|
829
858
|
|
|
830
|
-
|
|
859
|
+
```bash
|
|
860
|
+
sqlite3 .jettypod/work.db "SELECT id, title, scenario_file FROM work_items WHERE id = <feature-id>"
|
|
831
861
|
```
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
862
|
+
|
|
863
|
+
**2. Generate stable mode BDD scenarios** covering:
|
|
864
|
+
- **Error scenarios** - Invalid input, missing params, system errors, permission failures
|
|
865
|
+
- **Edge cases** - Empty inputs, boundary values, special characters
|
|
866
|
+
- **State consistency** - Concurrent ops, partial failures, invalid state transitions
|
|
867
|
+
|
|
868
|
+
**3. Present proposed scenarios to user for review:**
|
|
869
|
+
|
|
835
870
|
```
|
|
836
|
-
|
|
871
|
+
Stable Mode Scenarios
|
|
872
|
+
|
|
873
|
+
I've drafted [N] stable mode scenarios covering error handling and edge cases.
|
|
874
|
+
Please review — these are the contract for what stable mode will implement.
|
|
875
|
+
|
|
876
|
+
**Error Handling:**
|
|
877
|
+
|
|
878
|
+
Scenario: [Error scenario title]
|
|
879
|
+
Given [context]
|
|
880
|
+
When [error condition]
|
|
881
|
+
Then [expected error handling]
|
|
882
|
+
|
|
883
|
+
Scenario: [Error scenario title]
|
|
884
|
+
Given [context]
|
|
885
|
+
When [error condition]
|
|
886
|
+
Then [expected error handling]
|
|
887
|
+
|
|
888
|
+
**Edge Cases:**
|
|
889
|
+
|
|
890
|
+
Scenario: [Edge case title]
|
|
891
|
+
Given [context]
|
|
892
|
+
When [edge case input]
|
|
893
|
+
Then [expected behavior]
|
|
894
|
+
|
|
895
|
+
Does this capture the error handling and edge cases correctly?
|
|
896
|
+
Any scenarios to add, change, or remove?
|
|
897
|
+
```
|
|
898
|
+
|
|
899
|
+
**WAIT for user confirmation or adjustments.**
|
|
900
|
+
|
|
901
|
+
If user requests changes, revise the scenarios and re-present until confirmed.
|
|
902
|
+
|
|
903
|
+
**WORKFLOW CHECKPOINT: Stable mode scenarios confirmed**
|
|
837
904
|
|
|
838
905
|
```bash
|
|
839
|
-
jettypod
|
|
906
|
+
jettypod workflow checkpoint <feature-id> --step=7C
|
|
840
907
|
```
|
|
841
908
|
|
|
842
|
-
|
|
909
|
+
#### Step 7D: Write and Merge Stable Mode Scenarios
|
|
843
910
|
|
|
844
|
-
|
|
845
|
-
- ✅ `/path/to/.jettypod-work/tests-42-login/features/login.feature`
|
|
846
|
-
- ❌ `features/login.feature` (this would write to main repo!)
|
|
911
|
+
**After user confirms scenarios, execute autonomously.**
|
|
847
912
|
|
|
848
|
-
**
|
|
913
|
+
**1. Create a test worktree for writing stable mode scenarios:**
|
|
914
|
+
|
|
915
|
+
**FORBIDDEN: Manual Git Worktree Commands**
|
|
916
|
+
```
|
|
917
|
+
git worktree add ...
|
|
918
|
+
git checkout -b tests/...
|
|
919
|
+
git branch tests/...
|
|
920
|
+
```
|
|
921
|
+
**ALWAYS use jettypod commands** - they handle branch naming, path conventions, database tracking, and cleanup. Manual git commands will create orphaned worktrees that break the merge workflow.
|
|
849
922
|
|
|
850
923
|
```bash
|
|
851
|
-
|
|
924
|
+
jettypod work tests <feature-id>
|
|
852
925
|
```
|
|
853
926
|
|
|
854
|
-
|
|
855
|
-
- **Error scenarios** - Invalid input, missing params, system errors, permission failures
|
|
856
|
-
- **Edge cases** - Empty inputs, boundary values, special characters
|
|
857
|
-
- **State consistency** - Concurrent ops, partial failures, invalid state transitions
|
|
927
|
+
This creates an isolated worktree at `.jettypod-work/tests-<id>-<slug>` with branch `tests/feature-<id>-<slug>`.
|
|
858
928
|
|
|
859
|
-
**
|
|
929
|
+
**CRITICAL:** All BDD file operations MUST use absolute paths in the test worktree:
|
|
930
|
+
- `/path/to/.jettypod-work/tests-42-login/features/login.feature`
|
|
931
|
+
- `features/login.feature` (this would write to main repo!)
|
|
932
|
+
|
|
933
|
+
**2. Append confirmed scenarios to the feature file IN THE TEST WORKTREE:**
|
|
860
934
|
|
|
861
935
|
Use the Edit tool to append to `<worktree-path>/features/<feature-file>`:
|
|
862
936
|
|
|
@@ -874,11 +948,11 @@ Scenario: [Edge case title]
|
|
|
874
948
|
Then [expected behavior]
|
|
875
949
|
```
|
|
876
950
|
|
|
877
|
-
**
|
|
951
|
+
**3. Create step definitions IN THE TEST WORKTREE** at `<worktree-path>/features/step_definitions/<feature-slug>-stable.steps.js`
|
|
878
952
|
|
|
879
|
-
**
|
|
953
|
+
**4. Commit and merge the test worktree:**
|
|
880
954
|
|
|
881
|
-
|
|
955
|
+
**CRITICAL: Shell CWD Corruption Prevention**
|
|
882
956
|
|
|
883
957
|
The merge will delete the test worktree. If your shell is inside that worktree, ALL subsequent commands will fail. You MUST:
|
|
884
958
|
1. Chain the cd and merge in a SINGLE bash command
|
|
@@ -911,14 +985,16 @@ pwd && ls .jettypod # verify
|
|
|
911
985
|
jettypod work cleanup <feature-id>
|
|
912
986
|
```
|
|
913
987
|
|
|
914
|
-
|
|
988
|
+
#### Step 7E: Propose Stable Mode Chores
|
|
915
989
|
|
|
916
|
-
|
|
917
|
-
📋 Stable Mode Transition
|
|
990
|
+
**ASYNC BOUNDARY - Must wait for user confirmation**
|
|
918
991
|
|
|
919
|
-
|
|
992
|
+
**Present chore proposals to user:**
|
|
920
993
|
|
|
921
|
-
|
|
994
|
+
```
|
|
995
|
+
Stable Mode Chores
|
|
996
|
+
|
|
997
|
+
Scenarios are committed. Here are the chores needed to make them pass:
|
|
922
998
|
|
|
923
999
|
**Chore 1: [Title]**
|
|
924
1000
|
- Why: [What gap this fills]
|
|
@@ -933,9 +1009,9 @@ Here are the chores needed to make these scenarios pass:
|
|
|
933
1009
|
Sound good? I'll create these chores once you confirm.
|
|
934
1010
|
```
|
|
935
1011
|
|
|
936
|
-
|
|
1012
|
+
**WAIT for user confirmation or adjustments.**
|
|
937
1013
|
|
|
938
|
-
#### Step
|
|
1014
|
+
#### Step 7F: Create Chores and Complete Transition
|
|
939
1015
|
|
|
940
1016
|
**After user confirms, execute autonomously:**
|
|
941
1017
|
|
|
@@ -945,27 +1021,28 @@ Sound good? I'll create these chores once you confirm.
|
|
|
945
1021
|
jettypod work set-mode <feature-id> stable
|
|
946
1022
|
```
|
|
947
1023
|
|
|
948
|
-
|
|
1024
|
+
**CRITICAL:** You MUST set mode to stable BEFORE creating chores. The system blocks chore creation while feature is in speed mode.
|
|
949
1025
|
|
|
950
1026
|
**2. Create stable mode chores:**
|
|
951
1027
|
|
|
952
|
-
|
|
953
|
-
|
|
1028
|
+
For each confirmed chore, use the **Write** tool to create `/tmp/jettypod-create.json`:
|
|
1029
|
+
```json
|
|
1030
|
+
{
|
|
1031
|
+
"type": "chore",
|
|
1032
|
+
"title": "[Chore title]",
|
|
1033
|
+
"description": "[Description with scenarios addressed]",
|
|
1034
|
+
"parent": <feature-id>
|
|
1035
|
+
}
|
|
954
1036
|
```
|
|
955
1037
|
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
**3. Release merge lock (CRITICAL: separate Bash calls):**
|
|
959
|
-
|
|
1038
|
+
Then run via **Bash**:
|
|
960
1039
|
```bash
|
|
961
|
-
|
|
1040
|
+
jettypod work create --from=/tmp/jettypod-create.json
|
|
962
1041
|
```
|
|
963
1042
|
|
|
964
|
-
|
|
965
|
-
jettypod work merge <last-chore-id> --release-lock # Bash call 2
|
|
966
|
-
```
|
|
1043
|
+
Repeat for each confirmed chore. **Do NOT add a `mode` field** - chores inherit mode from their parent feature.
|
|
967
1044
|
|
|
968
|
-
|
|
1045
|
+
**WORKFLOW COMPLETE: Speed mode finished**
|
|
969
1046
|
|
|
970
1047
|
Mark speed mode as complete (this passes the `speed_mode_complete` gate, enabling stable-mode):
|
|
971
1048
|
|
|
@@ -979,9 +1056,9 @@ jettypod workflow complete speed-mode <feature-id>
|
|
|
979
1056
|
jettypod ui gate complete --data='{"summary":"Speed mode complete - transitioning to stable mode","files":["[files implemented]"]}'
|
|
980
1057
|
```
|
|
981
1058
|
|
|
982
|
-
#### Step
|
|
1059
|
+
#### Step 7G: Start First Stable Chore and Invoke Stable Mode Skill
|
|
983
1060
|
|
|
984
|
-
|
|
1061
|
+
**CRITICAL HANDOFF - You MUST start the first chore BEFORE invoking stable-mode.**
|
|
985
1062
|
|
|
986
1063
|
**1. Get the first stable chore:**
|
|
987
1064
|
|
|
@@ -997,12 +1074,12 @@ Note: Chores don't have a `mode` column - they inherit context from their parent
|
|
|
997
1074
|
jettypod work start <first-stable-chore-id>
|
|
998
1075
|
```
|
|
999
1076
|
|
|
1000
|
-
|
|
1077
|
+
**STOP AND CHECK:** Look at the output. You should see:
|
|
1001
1078
|
```
|
|
1002
|
-
|
|
1079
|
+
Created worktree: /path/to/.jettypod-work/[id]-[title-slug]
|
|
1003
1080
|
```
|
|
1004
1081
|
|
|
1005
|
-
If you see
|
|
1082
|
+
If you see `Working in main repository (worktree creation failed)`, fix the issue before continuing.
|
|
1006
1083
|
|
|
1007
1084
|
**3. Verify worktree exists:**
|
|
1008
1085
|
|
|
@@ -1016,21 +1093,21 @@ If empty, **STOP** - worktree wasn't created properly.
|
|
|
1016
1093
|
|
|
1017
1094
|
```
|
|
1018
1095
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
1019
|
-
|
|
1096
|
+
Speed Mode Complete! Transitioning to Stable Mode
|
|
1020
1097
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
1021
1098
|
|
|
1022
|
-
|
|
1099
|
+
CRITICAL: Speed mode is ONLY a checkpoint.
|
|
1023
1100
|
The feature is INCOMPLETE without stable mode.
|
|
1024
1101
|
|
|
1025
1102
|
What we accomplished:
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1103
|
+
All speed mode chores complete
|
|
1104
|
+
Generated [N] stable mode BDD scenarios
|
|
1105
|
+
Created step definitions for stable scenarios
|
|
1106
|
+
Created [N] stable mode chores
|
|
1107
|
+
Feature mode set to stable
|
|
1108
|
+
Started first stable chore #[id]
|
|
1032
1109
|
|
|
1033
|
-
|
|
1110
|
+
Now invoking stable-mode skill...
|
|
1034
1111
|
```
|
|
1035
1112
|
|
|
1036
1113
|
**5. Invoke stable-mode:**
|
|
@@ -1039,7 +1116,7 @@ What we accomplished:
|
|
|
1039
1116
|
Use the Skill tool with skill: "stable-mode"
|
|
1040
1117
|
```
|
|
1041
1118
|
|
|
1042
|
-
|
|
1119
|
+
**CRITICAL:** You MUST:
|
|
1043
1120
|
1. Run `work start` for the first stable chore
|
|
1044
1121
|
2. Verify the worktree was created
|
|
1045
1122
|
3. THEN invoke stable-mode using the Skill tool
|
|
@@ -1075,8 +1152,7 @@ cd <main-repo>
|
|
|
1075
1152
|
```bash
|
|
1076
1153
|
# Bash call 2: Merge (ALWAYS include chore ID)
|
|
1077
1154
|
jettypod work merge <chore-id> # Merge chore by ID
|
|
1078
|
-
jettypod work merge
|
|
1079
|
-
jettypod work merge <chore-id> --release-lock # Release held lock
|
|
1155
|
+
jettypod work merge --release-lock # Force-release stuck lock
|
|
1080
1156
|
```
|
|
1081
1157
|
|
|
1082
1158
|
**Start chores:**
|
|
@@ -1097,12 +1173,12 @@ jettypod work cleanup <feature-id> # Clean up worktree
|
|
|
1097
1173
|
jettypod work set-mode <feature-id> stable
|
|
1098
1174
|
```
|
|
1099
1175
|
|
|
1100
|
-
**Create chores (AFTER setting mode):**
|
|
1176
|
+
**Create chores (AFTER setting mode) — use Write tool for JSON, then:**
|
|
1101
1177
|
```bash
|
|
1102
|
-
jettypod work create
|
|
1178
|
+
jettypod work create --from=/tmp/jettypod-create.json
|
|
1103
1179
|
```
|
|
1104
|
-
Note: Do NOT
|
|
1180
|
+
Note: Do NOT add `mode` field in JSON - chores inherit mode from parent feature.
|
|
1105
1181
|
|
|
1106
|
-
|
|
1182
|
+
**DO NOT use these to complete chores:**
|
|
1107
1183
|
- `jettypod work status <id> done`
|
|
1108
1184
|
- `jettypod work complete <id>`
|