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
|
@@ -30,7 +30,7 @@ When this skill is activated, you are helping implement a production mode chore
|
|
|
30
30
|
|
|
31
31
|
---
|
|
32
32
|
|
|
33
|
-
##
|
|
33
|
+
## PRE-FLIGHT VALIDATION (REQUIRED)
|
|
34
34
|
|
|
35
35
|
**Before proceeding with ANY implementation, you MUST validate the worktree exists.**
|
|
36
36
|
|
|
@@ -44,23 +44,23 @@ sqlite3 .jettypod/work.db "SELECT wi.id, wi.title, wi.status, wt.worktree_path,
|
|
|
44
44
|
|
|
45
45
|
| worktree_path | What it means | Action |
|
|
46
46
|
|---------------|---------------|--------|
|
|
47
|
-
| **Has a path** (e.g., `/path/to/.jettypod-work/...`) |
|
|
48
|
-
| **NULL or empty** |
|
|
49
|
-
| **No rows returned** |
|
|
47
|
+
| **Has a path** (e.g., `/path/to/.jettypod-work/...`) | Worktree exists, ready to proceed | Continue to Step 0 |
|
|
48
|
+
| **NULL or empty** | `work start` was not called | **STOP - run `jettypod work start [chore-id]` first** |
|
|
49
|
+
| **No rows returned** | No chore is in progress | **STOP - verify the chore exists and run `work start`** |
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
**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.
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
**FORBIDDEN: Manual Git Worktree Commands**
|
|
54
54
|
```
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
55
|
+
git worktree add ...
|
|
56
|
+
git checkout -b feature/...
|
|
57
|
+
git branch feature/...
|
|
58
58
|
```
|
|
59
59
|
**ALWAYS use `jettypod work start`** - it handles branch naming, path conventions, database tracking, and cleanup. Manual git commands will create orphaned worktrees that break the merge workflow.
|
|
60
60
|
|
|
61
61
|
---
|
|
62
62
|
|
|
63
|
-
##
|
|
63
|
+
## WORKTREE PATH LOCK
|
|
64
64
|
|
|
65
65
|
**After pre-flight validation passes, capture and lock the worktree path:**
|
|
66
66
|
|
|
@@ -70,7 +70,7 @@ From the pre-flight query output, extract and store:
|
|
|
70
70
|
**Display:**
|
|
71
71
|
|
|
72
72
|
```
|
|
73
|
-
|
|
73
|
+
WORKTREE LOCK ACTIVE
|
|
74
74
|
Path: ${WORKTREE_PATH}
|
|
75
75
|
|
|
76
76
|
All file writes will use this path.
|
|
@@ -94,11 +94,11 @@ jettypod ui gate worktree-started --data='{"path":"${WORKTREE_PATH}"}'
|
|
|
94
94
|
|
|
95
95
|
**MUST RUN FIRST:** Detect which scenario applies to this feature.
|
|
96
96
|
|
|
97
|
-
|
|
97
|
+
**FORBIDDEN: Writing Files at This Step**
|
|
98
98
|
```
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
99
|
+
Write tool to any path
|
|
100
|
+
Edit tool to any path
|
|
101
|
+
Any file creation or modification
|
|
102
102
|
```
|
|
103
103
|
**This is a DETECTION step.** File writes happen in Step 3.
|
|
104
104
|
|
|
@@ -120,7 +120,7 @@ sqlite3 .jettypod/work.db "SELECT completed_at FROM work_items WHERE parent_id =
|
|
|
120
120
|
|
|
121
121
|
Based on these checks, determine which scenario applies.
|
|
122
122
|
|
|
123
|
-
|
|
123
|
+
**WORKFLOW INTEGRATION: Start workflow tracking**
|
|
124
124
|
|
|
125
125
|
After detecting context, register this skill execution:
|
|
126
126
|
|
|
@@ -155,11 +155,11 @@ This validates that `stable_mode_complete` gate is passed and creates an executi
|
|
|
155
155
|
|
|
156
156
|
**For all scenarios:** Read production standards file.
|
|
157
157
|
|
|
158
|
-
|
|
158
|
+
**FORBIDDEN: Writing Files at This Step**
|
|
159
159
|
```
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
160
|
+
Write tool to any path
|
|
161
|
+
Edit tool to any path
|
|
162
|
+
Any file creation or modification
|
|
163
163
|
```
|
|
164
164
|
**This is a READ step.** File writes happen in Step 3.
|
|
165
165
|
|
|
@@ -173,7 +173,7 @@ cat .jettypod/production-standards.json
|
|
|
173
173
|
|
|
174
174
|
If the file doesn't exist, run external-transition first to generate production standards.
|
|
175
175
|
|
|
176
|
-
|
|
176
|
+
**WORKFLOW CHECKPOINT: Standards read**
|
|
177
177
|
|
|
178
178
|
```bash
|
|
179
179
|
jettypod workflow checkpoint <feature-id> --step=1
|
|
@@ -185,11 +185,11 @@ jettypod workflow checkpoint <feature-id> --step=1
|
|
|
185
185
|
|
|
186
186
|
**For Scenario A only:** Quick validation of existing scenarios.
|
|
187
187
|
|
|
188
|
-
|
|
188
|
+
**FORBIDDEN: Writing Files at This Step**
|
|
189
189
|
```
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
190
|
+
Write tool to any path
|
|
191
|
+
Edit tool to any path
|
|
192
|
+
Any file creation or modification
|
|
193
193
|
```
|
|
194
194
|
**This is a VALIDATION step.** File writes happen in Step 3.
|
|
195
195
|
|
|
@@ -208,19 +208,19 @@ try {
|
|
|
208
208
|
});
|
|
209
209
|
|
|
210
210
|
if (!feature.scenario_file) {
|
|
211
|
-
console.error('
|
|
211
|
+
console.error('Feature has no scenario file.');
|
|
212
212
|
return;
|
|
213
213
|
}
|
|
214
214
|
|
|
215
215
|
// Validate scenarios against standards
|
|
216
216
|
const validation = await validateScenarios(feature.scenario_file, standards);
|
|
217
217
|
|
|
218
|
-
console.log(
|
|
218
|
+
console.log(`Validation complete:`);
|
|
219
219
|
console.log(` - Covered: ${validation.covered}/${validation.total} standards`);
|
|
220
220
|
console.log(` - Gaps: ${validation.gaps.length}`);
|
|
221
221
|
|
|
222
222
|
if (validation.hasGaps) {
|
|
223
|
-
console.log('\n
|
|
223
|
+
console.log('\n Missing scenarios for:');
|
|
224
224
|
validation.gaps.forEach(gap => {
|
|
225
225
|
console.log(` - ${gap.domain}: ${gap.standardId}`);
|
|
226
226
|
console.log(` ${gap.reasoning}`);
|
|
@@ -234,12 +234,12 @@ try {
|
|
|
234
234
|
const newScenarios = await generateScenariosFromStandards(missingStandards);
|
|
235
235
|
|
|
236
236
|
await appendScenarios(feature.scenario_file, newScenarios);
|
|
237
|
-
console.log(
|
|
237
|
+
console.log(`Added ${newScenarios.length} missing scenarios`);
|
|
238
238
|
} else {
|
|
239
|
-
console.log('
|
|
239
|
+
console.log('All standards are covered by existing scenarios');
|
|
240
240
|
}
|
|
241
241
|
} catch (err) {
|
|
242
|
-
console.error('
|
|
242
|
+
console.error('Validation failed:', err.message);
|
|
243
243
|
return;
|
|
244
244
|
}
|
|
245
245
|
```
|
|
@@ -250,11 +250,11 @@ try {
|
|
|
250
250
|
|
|
251
251
|
**For Scenario B only:** Re-validate with current standards.
|
|
252
252
|
|
|
253
|
-
|
|
253
|
+
**FORBIDDEN: Writing Files at This Step**
|
|
254
254
|
```
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
255
|
+
Write tool to any path
|
|
256
|
+
Edit tool to any path
|
|
257
|
+
Any file creation or modification
|
|
258
258
|
```
|
|
259
259
|
**This is a VALIDATION step.** File writes happen in Step 3.
|
|
260
260
|
|
|
@@ -263,7 +263,7 @@ const { validateScenarios } = require('../../lib/production-scenario-validator')
|
|
|
263
263
|
const config = require('../../lib/config');
|
|
264
264
|
|
|
265
265
|
try {
|
|
266
|
-
console.log('
|
|
266
|
+
console.log('Re-validating scenarios against current standards...');
|
|
267
267
|
|
|
268
268
|
// Check if project state changed
|
|
269
269
|
const projectConfig = config.read();
|
|
@@ -281,12 +281,12 @@ try {
|
|
|
281
281
|
// Validate scenarios
|
|
282
282
|
const validation = await validateScenarios(feature.scenario_file, standards);
|
|
283
283
|
|
|
284
|
-
console.log(
|
|
284
|
+
console.log(`Re-validation complete:`);
|
|
285
285
|
console.log(` - Covered: ${validation.covered}/${validation.total} standards`);
|
|
286
286
|
console.log(` - New gaps: ${validation.gaps.length}`);
|
|
287
287
|
|
|
288
288
|
if (validation.hasGaps) {
|
|
289
|
-
console.log('\n
|
|
289
|
+
console.log('\n Standards added/changed since last run:');
|
|
290
290
|
validation.gaps.forEach(gap => {
|
|
291
291
|
console.log(` - ${gap.domain}: ${gap.standardId}`);
|
|
292
292
|
});
|
|
@@ -299,10 +299,10 @@ try {
|
|
|
299
299
|
const newScenarios = await generateScenariosFromStandards(missingStandards);
|
|
300
300
|
|
|
301
301
|
await appendScenarios(feature.scenario_file, newScenarios);
|
|
302
|
-
console.log(
|
|
302
|
+
console.log(`Updated with ${newScenarios.length} new scenarios`);
|
|
303
303
|
}
|
|
304
304
|
} catch (err) {
|
|
305
|
-
console.error('
|
|
305
|
+
console.error('Re-validation failed:', err.message);
|
|
306
306
|
return;
|
|
307
307
|
}
|
|
308
308
|
```
|
|
@@ -313,11 +313,11 @@ try {
|
|
|
313
313
|
|
|
314
314
|
**For Scenario C only:** Generate production scenarios from standards.
|
|
315
315
|
|
|
316
|
-
|
|
316
|
+
**FORBIDDEN: Writing Files at This Step**
|
|
317
317
|
```
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
318
|
+
Write tool to any path
|
|
319
|
+
Edit tool to any path
|
|
320
|
+
Any file creation or modification
|
|
321
321
|
```
|
|
322
322
|
**This is a GENERATION step (via jettypod commands, not direct file writes).** File writes happen in Step 3.
|
|
323
323
|
|
|
@@ -335,7 +335,7 @@ This will:
|
|
|
335
335
|
3. Append scenarios to the feature file
|
|
336
336
|
4. Create production chores
|
|
337
337
|
|
|
338
|
-
|
|
338
|
+
**WORKFLOW CHECKPOINT: Scenarios validated/generated** (after any Step 2 variant)
|
|
339
339
|
|
|
340
340
|
```bash
|
|
341
341
|
jettypod workflow checkpoint <feature-id> --step=2
|
|
@@ -345,9 +345,9 @@ jettypod workflow checkpoint <feature-id> --step=2
|
|
|
345
345
|
|
|
346
346
|
### Step 3: Implement Production Chore
|
|
347
347
|
|
|
348
|
-
|
|
348
|
+
**WORKTREE PATH REQUIRED:** All file writes MUST use the `WORKTREE_PATH` captured after pre-flight validation.
|
|
349
349
|
|
|
350
|
-
|
|
350
|
+
**NOW you may write files** - worktree is locked, context is detected.
|
|
351
351
|
|
|
352
352
|
**Emit gate signal:**
|
|
353
353
|
|
|
@@ -373,7 +373,7 @@ Parse the chore description to find which scenario it addresses (look for "Scena
|
|
|
373
373
|
npx cucumber-js <scenario-file> --name "<scenario-name>"
|
|
374
374
|
```
|
|
375
375
|
|
|
376
|
-
|
|
376
|
+
**WORKFLOW CHECKPOINT: RED baseline established**
|
|
377
377
|
|
|
378
378
|
```bash
|
|
379
379
|
jettypod workflow checkpoint <feature-id> --step=3
|
|
@@ -444,7 +444,27 @@ Once all production chores complete:
|
|
|
444
444
|
2. Can be deployed to external environment
|
|
445
445
|
3. Meets all standards for scale, security, compliance
|
|
446
446
|
|
|
447
|
-
|
|
447
|
+
**Prove It Works (REQUIRED):**
|
|
448
|
+
|
|
449
|
+
Before completing the feature, demonstrate it works in practice — not just that tests pass.
|
|
450
|
+
|
|
451
|
+
1. **Run or build the actual code** — compile, start the server, execute the command, or trigger the relevant workflow
|
|
452
|
+
2. **Show real output** — display console output, build result, or observable behavior
|
|
453
|
+
3. **Confirm it matches expectations** — verify the output is what was requested
|
|
454
|
+
|
|
455
|
+
**Display:**
|
|
456
|
+
|
|
457
|
+
```
|
|
458
|
+
Verifying in practice...
|
|
459
|
+
|
|
460
|
+
[Actual output from running/building the code]
|
|
461
|
+
|
|
462
|
+
Verified: [what was confirmed]
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
**If the change cannot be run directly** (requires hardware, external service, or manual UI interaction), state what the user should verify manually and why you can't verify it yourself.
|
|
466
|
+
|
|
467
|
+
**WORKFLOW INTEGRATION: Complete workflow**
|
|
448
468
|
|
|
449
469
|
When all production chores are complete:
|
|
450
470
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: request-routing
|
|
3
|
-
description: "
|
|
3
|
+
description: "ENTRY POINT FOR ALL WORK REQUESTS. Invoke this skill FIRST when user describes ANY work - 'build X', 'fix Y', 'add Z', 'create feature', 'implement'. Do NOT create work items or invoke other planning skills directly. This skill analyzes intent and routes to the correct workflow. (project)"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Request Routing Skill
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
**UNIVERSAL ENTRY POINT** - This skill MUST be invoked FIRST when a user describes work they want done.
|
|
9
9
|
|
|
10
10
|
**DO NOT:**
|
|
11
11
|
- Create work items (`jettypod work create`) before invoking this skill
|
|
@@ -121,7 +121,7 @@ Default → chore-planning
|
|
|
121
121
|
| **epic-planning (technical)** | Large technical initiative (refactor, migration, infrastructure) with no user-facing features | Break down → chores directly (no features, no modes) |
|
|
122
122
|
| **epic-planning** | Large initiative spanning multiple features | Break down → plan features |
|
|
123
123
|
| **feature-planning** | New behavior needing UX exploration OR has edge cases worth sequencing | UX exploration → BDD → speed → stable → production |
|
|
124
|
-
| **chore-planning** | Substantial technical work
|
|
124
|
+
| **chore-planning** | Substantial technical work OR behavior-adding without edge cases | Type-specific verification → done (enhancement type uses TDD) |
|
|
125
125
|
| **simple-improvement** | PURELY COSMETIC: text, copy, color, spacing changes only. No behavior change. | Direct implementation |
|
|
126
126
|
|
|
127
127
|
## Routing Examples
|
|
@@ -178,7 +178,7 @@ Default → chore-planning
|
|
|
178
178
|
|
|
179
179
|
*(PURELY COSMETIC: only text, copy, color, spacing, or static visual changes. Zero behavior change.)*
|
|
180
180
|
|
|
181
|
-
|
|
181
|
+
**NOT simple-improvement (common mistakes):**
|
|
182
182
|
- "Add a loading spinner to the save button" → **chore-planning** (adds behavior: state tracking, show/hide logic)
|
|
183
183
|
- "Add a tooltip to the settings icon" → **chore-planning** (adds behavior: hover state, positioning)
|
|
184
184
|
- "Track work item counts" → **feature-planning** (adds behavior: counting, state, display logic)
|
|
@@ -73,7 +73,7 @@ Use the description from the user's initial request (passed through request-rout
|
|
|
73
73
|
I need more details. What specifically needs to change?
|
|
74
74
|
```
|
|
75
75
|
|
|
76
|
-
|
|
76
|
+
**WAIT for user to clarify, then proceed.**
|
|
77
77
|
|
|
78
78
|
**Otherwise, proceed directly with the clear description you already have.**
|
|
79
79
|
|
|
@@ -94,7 +94,7 @@ Scan the user's description for these patterns:
|
|
|
94
94
|
| Multiple components | mentions 3+ different files/areas, "also need to" |
|
|
95
95
|
| Architectural changes | "refactor", "restructure", "new system" |
|
|
96
96
|
|
|
97
|
-
|
|
97
|
+
**Route back to request-routing if ANY complexity signal detected:**
|
|
98
98
|
- Any new behavior (even "small" behavior like a spinner or tooltip)
|
|
99
99
|
- Any state management (loading, toggle, hover, selection)
|
|
100
100
|
- New database tables/columns needed
|
|
@@ -103,7 +103,7 @@ Scan the user's description for these patterns:
|
|
|
103
103
|
- Multiple interconnected changes
|
|
104
104
|
- Need for error handling design
|
|
105
105
|
|
|
106
|
-
|
|
106
|
+
**Continue ONLY if the change is:**
|
|
107
107
|
- Purely cosmetic (text, color, spacing, static visual appearance)
|
|
108
108
|
- Single file or 2-3 related files
|
|
109
109
|
- Modifying existing static values (not adding logic)
|
|
@@ -113,7 +113,7 @@ Scan the user's description for these patterns:
|
|
|
113
113
|
**If too complex:**
|
|
114
114
|
|
|
115
115
|
```
|
|
116
|
-
|
|
116
|
+
This change appears to require new data models or architectural changes. This is more than a simple improvement.
|
|
117
117
|
|
|
118
118
|
I'm routing you back to request-routing for proper planning.
|
|
119
119
|
```
|
|
@@ -125,7 +125,7 @@ I'm routing you back to request-routing for proper planning.
|
|
|
125
125
|
**If confirmed simple:**
|
|
126
126
|
|
|
127
127
|
```
|
|
128
|
-
|
|
128
|
+
Confirmed: This is a simple improvement.
|
|
129
129
|
|
|
130
130
|
Change: [summarize the specific change]
|
|
131
131
|
Scope: [list files likely affected]
|
|
@@ -147,14 +147,22 @@ jettypod ui gate route-decided --data='{"route":"simple-improvement","title":"[b
|
|
|
147
147
|
|
|
148
148
|
**Create a single chore with NO mode assigned.**
|
|
149
149
|
|
|
150
|
+
Use the **Write** tool to create `/tmp/jettypod-create.json`:
|
|
151
|
+
```json
|
|
152
|
+
{
|
|
153
|
+
"type": "chore",
|
|
154
|
+
"title": "[Brief description of the change]",
|
|
155
|
+
"description": "[Detailed description including:\n- What to change\n- Where to change it\n- Expected outcome]",
|
|
156
|
+
"parent": <feature-id>
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Then run via **Bash**:
|
|
150
161
|
```bash
|
|
151
|
-
jettypod work create
|
|
152
|
-
- What to change
|
|
153
|
-
- Where to change it
|
|
154
|
-
- Expected outcome]" --parent=<feature-id>
|
|
162
|
+
jettypod work create --from=/tmp/jettypod-create.json
|
|
155
163
|
```
|
|
156
164
|
|
|
157
|
-
**IMPORTANT:** Do NOT
|
|
165
|
+
**IMPORTANT:** Do NOT add a `mode` field. Simple improvements don't use speed/stable modes.
|
|
158
166
|
|
|
159
167
|
**Emit gate signal:**
|
|
160
168
|
|
|
@@ -165,7 +173,7 @@ jettypod ui gate work-created --data='{"id":[chore-id],"title":"[title]"}'
|
|
|
165
173
|
**Display to user:**
|
|
166
174
|
|
|
167
175
|
```
|
|
168
|
-
|
|
176
|
+
Created Chore #[id]: [title]
|
|
169
177
|
|
|
170
178
|
Ready to implement. Starting chore...
|
|
171
179
|
```
|
|
@@ -175,7 +183,7 @@ Ready to implement. Starting chore...
|
|
|
175
183
|
When the `jettypod work create` command fails, display error details and suggest recovery:
|
|
176
184
|
|
|
177
185
|
```
|
|
178
|
-
|
|
186
|
+
Failed to create chore: [error message] ([error code if available])
|
|
179
187
|
|
|
180
188
|
This could be caused by:
|
|
181
189
|
• Database is locked by another process
|
|
@@ -189,7 +197,7 @@ Suggested actions:
|
|
|
189
197
|
4. If persistent, try: jettypod work cleanup --all
|
|
190
198
|
```
|
|
191
199
|
|
|
192
|
-
|
|
200
|
+
**WAIT for user to acknowledge before retrying or investigating further.**
|
|
193
201
|
|
|
194
202
|
Do NOT proceed to Step 3 until chore is successfully created.
|
|
195
203
|
|
|
@@ -205,7 +213,7 @@ Do NOT proceed to Step 3 until chore is successfully created.
|
|
|
205
213
|
jettypod work start <chore-id>
|
|
206
214
|
```
|
|
207
215
|
|
|
208
|
-
|
|
216
|
+
**STOP AND CHECK:** Verify worktree was created successfully before proceeding.
|
|
209
217
|
|
|
210
218
|
```bash
|
|
211
219
|
sqlite3 .jettypod/work.db "SELECT worktree_path FROM worktrees WHERE work_item_id = <chore-id> AND status = 'active'"
|
|
@@ -225,13 +233,13 @@ jettypod ui gate worktree-started --data='{"path":"${WORKTREE_PATH}"}'
|
|
|
225
233
|
**Display confirmation:**
|
|
226
234
|
|
|
227
235
|
```
|
|
228
|
-
|
|
236
|
+
Worktree created: ${WORKTREE_PATH}
|
|
229
237
|
|
|
230
238
|
From this point forward, ALL file operations MUST use paths starting with:
|
|
231
239
|
${WORKTREE_PATH}/
|
|
232
240
|
```
|
|
233
241
|
|
|
234
|
-
|
|
242
|
+
**WORKTREE PATH LOCK:** Store `WORKTREE_PATH` - all file operations in this skill MUST use this path prefix.
|
|
235
243
|
|
|
236
244
|
---
|
|
237
245
|
|
|
@@ -250,7 +258,7 @@ jettypod ui gate implementing --data='{"description":"[what is being changed]","
|
|
|
250
258
|
**Display progress:**
|
|
251
259
|
|
|
252
260
|
```
|
|
253
|
-
|
|
261
|
+
Implementing change...
|
|
254
262
|
|
|
255
263
|
Modified: ${WORKTREE_PATH}/[relative path]
|
|
256
264
|
Change: [what was changed]
|
|
@@ -273,7 +281,27 @@ Verifying...
|
|
|
273
281
|
|
|
274
282
|
**If verification passes:**
|
|
275
283
|
|
|
276
|
-
|
|
284
|
+
**Prove It Works (REQUIRED):**
|
|
285
|
+
|
|
286
|
+
Before committing, demonstrate the change works in practice.
|
|
287
|
+
|
|
288
|
+
1. **Run or build the actual code** — compile, start the server, execute the command, or trigger the relevant workflow
|
|
289
|
+
2. **Show real output** — display console output, build result, or observable behavior
|
|
290
|
+
3. **Confirm it matches expectations** — verify the output is what was requested
|
|
291
|
+
|
|
292
|
+
**Display:**
|
|
293
|
+
|
|
294
|
+
```
|
|
295
|
+
Verifying in practice...
|
|
296
|
+
|
|
297
|
+
[Actual output from running/building the code]
|
|
298
|
+
|
|
299
|
+
Verified: [what was confirmed]
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
**If the change cannot be run directly** (requires hardware, external service, or manual UI interaction), state what the user should verify manually and why you can't verify it yourself.
|
|
303
|
+
|
|
304
|
+
**WORKTREE PATH REQUIRED:** Use the `WORKTREE_PATH` captured in Step 3.
|
|
277
305
|
|
|
278
306
|
```bash
|
|
279
307
|
# Commit the change
|
|
@@ -281,14 +309,14 @@ cd ${WORKTREE_PATH}
|
|
|
281
309
|
git add .
|
|
282
310
|
git commit -m "fix: [brief description]
|
|
283
311
|
|
|
284
|
-
|
|
312
|
+
Generated with [Claude Code](https://claude.com/claude-code)
|
|
285
313
|
|
|
286
314
|
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>"
|
|
287
315
|
```
|
|
288
316
|
|
|
289
317
|
**Then merge (CRITICAL: run as separate Bash calls):**
|
|
290
318
|
|
|
291
|
-
|
|
319
|
+
Shell CWD persists. You MUST run `cd` as a SEPARATE Bash tool call before merge.
|
|
292
320
|
|
|
293
321
|
```bash
|
|
294
322
|
# Bash call 1: Change to main repo
|
|
@@ -301,17 +329,19 @@ jettypod work merge <chore-id>
|
|
|
301
329
|
jettypod work cleanup <chore-id>
|
|
302
330
|
```
|
|
303
331
|
|
|
304
|
-
**If merge fails
|
|
332
|
+
**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.
|
|
333
|
+
|
|
334
|
+
**If merge fails with merge conflicts:**
|
|
305
335
|
|
|
306
|
-
When `jettypod work merge` encounters
|
|
336
|
+
When `jettypod work merge` encounters a merge conflict, the worktree is preserved for debugging.
|
|
307
337
|
|
|
308
338
|
```
|
|
309
|
-
|
|
339
|
+
Merge failed: [error message from git]
|
|
310
340
|
|
|
311
341
|
Conflicting files:
|
|
312
342
|
• [list conflicting files if available]
|
|
313
343
|
|
|
314
|
-
|
|
344
|
+
IMPORTANT: The worktree has been PRESERVED for debugging at:
|
|
315
345
|
[worktree-path]
|
|
316
346
|
|
|
317
347
|
Resolution steps:
|
|
@@ -325,13 +355,28 @@ Resolution steps:
|
|
|
325
355
|
Need help? Run: git status (in worktree) to see conflict status
|
|
326
356
|
```
|
|
327
357
|
|
|
328
|
-
|
|
358
|
+
**WAIT for user to resolve conflicts before retrying.**
|
|
329
359
|
|
|
330
360
|
Do NOT attempt to auto-resolve conflicts - let the user handle them manually.
|
|
331
361
|
|
|
332
362
|
**The merge command automatically sets the feature as ready for review.**
|
|
333
363
|
It will appear with accept/reject buttons on the kanban board. Do NOT call `jettypod work status <feature-id> done` — that bypasses the review gate.
|
|
334
364
|
|
|
365
|
+
**Generate QA checklist:**
|
|
366
|
+
|
|
367
|
+
Based on the change you just made, generate specific QA steps a tester can verify manually. Write a JSON array to `/tmp/qa-steps.json`:
|
|
368
|
+
```json
|
|
369
|
+
[
|
|
370
|
+
{"section": "Section Name", "text": "Action to perform and expected result", "detail": "Additional context"},
|
|
371
|
+
...
|
|
372
|
+
]
|
|
373
|
+
```
|
|
374
|
+
Be specific (e.g., "Click the Save button — confirmation toast appears") not generic. 3-8 steps for simple improvements.
|
|
375
|
+
|
|
376
|
+
```bash
|
|
377
|
+
jettypod work set-qa-steps <chore-id> --from=/tmp/qa-steps.json
|
|
378
|
+
```
|
|
379
|
+
|
|
335
380
|
**Emit gate signal:**
|
|
336
381
|
|
|
337
382
|
```bash
|
|
@@ -342,7 +387,7 @@ jettypod ui gate complete --data='{"summary":"[what was changed]","files":["[fil
|
|
|
342
387
|
|
|
343
388
|
```
|
|
344
389
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
345
|
-
|
|
390
|
+
Simple Improvement Complete!
|
|
346
391
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
347
392
|
|
|
348
393
|
Change: [what was changed]
|
|
@@ -371,8 +416,8 @@ No further action needed.
|
|
|
371
416
|
## Command Reference
|
|
372
417
|
|
|
373
418
|
```bash
|
|
374
|
-
# Create chore (no mode)
|
|
375
|
-
jettypod work create
|
|
419
|
+
# Create chore (no mode) - use Write tool for JSON, then:
|
|
420
|
+
jettypod work create --from=/tmp/jettypod-create.json
|
|
376
421
|
|
|
377
422
|
# Start chore
|
|
378
423
|
jettypod work start <chore-id>
|
|
@@ -384,5 +429,5 @@ jettypod work merge <chore-id> # Bash call 2
|
|
|
384
429
|
# Cleanup
|
|
385
430
|
jettypod work cleanup <chore-id>
|
|
386
431
|
|
|
387
|
-
#
|
|
432
|
+
# Do NOT mark feature done manually — merge sets the review gate automatically
|
|
388
433
|
```
|