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 stable mode chores with comprehensive testi
|
|
|
18
18
|
└─────────────────────────────────────────────────────────────────────┘
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
-
##
|
|
21
|
+
## CRITICAL HANDOFF REQUIREMENT
|
|
22
22
|
|
|
23
23
|
**After completing ALL stable mode chores:**
|
|
24
24
|
|
|
@@ -30,7 +30,7 @@ description: Guide implementation of stable mode chores with comprehensive testi
|
|
|
30
30
|
1. Set feature mode to production
|
|
31
31
|
2. **IMMEDIATELY invoke production-mode using the Skill tool**
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
**STOP GATE:** For external projects, DO NOT end this skill without invoking production-mode. Stable mode makes it robust - production mode makes it ready for real users at scale.
|
|
34
34
|
|
|
35
35
|
---
|
|
36
36
|
|
|
@@ -40,7 +40,7 @@ Guides Claude Code through stable mode implementation with comprehensive testing
|
|
|
40
40
|
|
|
41
41
|
When this skill is activated, you are helping implement a stable mode chore to add comprehensive testing and error handling. Follow this structured approach:
|
|
42
42
|
|
|
43
|
-
##
|
|
43
|
+
## Critical Context
|
|
44
44
|
|
|
45
45
|
**You are working in an isolated git worktree:**
|
|
46
46
|
- `work start [chore-id]` created a dedicated worktree for this chore
|
|
@@ -52,7 +52,7 @@ When this skill is activated, you are helping implement a stable mode chore to a
|
|
|
52
52
|
|
|
53
53
|
---
|
|
54
54
|
|
|
55
|
-
##
|
|
55
|
+
## SHELL CWD RECOVERY
|
|
56
56
|
|
|
57
57
|
**If ALL bash commands start failing with "Error: Exit code 1" and no output:**
|
|
58
58
|
|
|
@@ -68,7 +68,7 @@ Your shell's working directory was likely inside a worktree that was deleted. Th
|
|
|
68
68
|
|
|
69
69
|
---
|
|
70
70
|
|
|
71
|
-
##
|
|
71
|
+
## PRE-FLIGHT VALIDATION (REQUIRED)
|
|
72
72
|
|
|
73
73
|
**Before proceeding with ANY implementation, you MUST validate the worktree exists.**
|
|
74
74
|
|
|
@@ -82,17 +82,17 @@ sqlite3 .jettypod/work.db "SELECT wi.id, wi.title, wi.status, wt.worktree_path,
|
|
|
82
82
|
|
|
83
83
|
| worktree_path | What it means | Action |
|
|
84
84
|
|---------------|---------------|--------|
|
|
85
|
-
| **Has a path** (e.g., `/path/to/.jettypod-work/...`) |
|
|
86
|
-
| **NULL or empty** |
|
|
87
|
-
| **No rows returned** |
|
|
85
|
+
| **Has a path** (e.g., `/path/to/.jettypod-work/...`) | Worktree exists, ready to proceed | Continue to Step 0 |
|
|
86
|
+
| **NULL or empty** | `work start` was not called | **STOP - run `jettypod work start [chore-id]` first** |
|
|
87
|
+
| **No rows returned** | No chore is in progress | **STOP - verify the chore exists and run `work start`** |
|
|
88
88
|
|
|
89
|
-
|
|
89
|
+
**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.
|
|
90
90
|
|
|
91
|
-
|
|
91
|
+
**FORBIDDEN: Manual Git Worktree Commands**
|
|
92
92
|
```
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
93
|
+
git worktree add ...
|
|
94
|
+
git checkout -b feature/...
|
|
95
|
+
git branch feature/...
|
|
96
96
|
```
|
|
97
97
|
**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.
|
|
98
98
|
|
|
@@ -109,7 +109,7 @@ sqlite3 .jettypod/work.db "SELECT wi.id, wi.title, wi.status, wt.worktree_path,
|
|
|
109
109
|
|
|
110
110
|
---
|
|
111
111
|
|
|
112
|
-
##
|
|
112
|
+
## WORKTREE PATH LOCK
|
|
113
113
|
|
|
114
114
|
**After pre-flight validation passes, capture and lock the worktree path:**
|
|
115
115
|
|
|
@@ -119,7 +119,7 @@ From the pre-flight query output, extract and store:
|
|
|
119
119
|
**Display:**
|
|
120
120
|
|
|
121
121
|
```
|
|
122
|
-
|
|
122
|
+
WORKTREE LOCK ACTIVE
|
|
123
123
|
Path: ${WORKTREE_PATH}
|
|
124
124
|
|
|
125
125
|
All file writes will use this path.
|
|
@@ -154,7 +154,7 @@ jettypod ui gate worktree-started --data='{"path":"${WORKTREE_PATH}"}'
|
|
|
154
154
|
**User Profile:** May not know how to code - Claude Code does the implementation autonomously.
|
|
155
155
|
|
|
156
156
|
<details>
|
|
157
|
-
<summary><strong
|
|
157
|
+
<summary><strong>What Stable Mode Includes (click to expand)</strong></summary>
|
|
158
158
|
|
|
159
159
|
**Stable Mode is NOT just error handling. It includes:**
|
|
160
160
|
|
|
@@ -194,7 +194,7 @@ jettypod ui gate worktree-started --data='{"path":"${WORKTREE_PATH}"}'
|
|
|
194
194
|
|
|
195
195
|
---
|
|
196
196
|
|
|
197
|
-
##
|
|
197
|
+
## Unit Testing in Stable Mode - True TDD
|
|
198
198
|
|
|
199
199
|
**Unit tests are written DURING implementation, not after.**
|
|
200
200
|
|
|
@@ -214,10 +214,10 @@ jettypod ui gate worktree-started --data='{"path":"${WORKTREE_PATH}"}'
|
|
|
214
214
|
- State consistency (transaction rollback, cleanup on failure)
|
|
215
215
|
|
|
216
216
|
<details>
|
|
217
|
-
<summary><strong
|
|
217
|
+
<summary><strong>Unit Test Examples (click to expand)</strong></summary>
|
|
218
218
|
|
|
219
219
|
```javascript
|
|
220
|
-
//
|
|
220
|
+
// Stable mode unit tests (error paths and edge cases)
|
|
221
221
|
test('createUser throws ValidationError for null email', () => {
|
|
222
222
|
expect(() => createUser('John', null)).toThrow(ValidationError);
|
|
223
223
|
expect(() => createUser('John', null)).toThrow('Email is required');
|
|
@@ -266,7 +266,7 @@ test('getUserById returns null for non-existent user', () => {
|
|
|
266
266
|
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'"
|
|
267
267
|
```
|
|
268
268
|
|
|
269
|
-
|
|
269
|
+
**WORKFLOW INTEGRATION: Start workflow tracking**
|
|
270
270
|
|
|
271
271
|
After getting the work context, register this skill execution:
|
|
272
272
|
|
|
@@ -280,7 +280,7 @@ This validates that `speed_mode_complete` gate is passed and creates an executio
|
|
|
280
280
|
|
|
281
281
|
```
|
|
282
282
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
283
|
-
|
|
283
|
+
STABLE MODE: Implementing Chore #[id]
|
|
284
284
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
285
285
|
|
|
286
286
|
Chore: [title]
|
|
@@ -299,11 +299,11 @@ Analyzing stable mode BDD scenarios to determine what error handling and validat
|
|
|
299
299
|
|
|
300
300
|
**CRITICAL:** Claude Code executes this autonomously - no user permission needed.
|
|
301
301
|
|
|
302
|
-
|
|
302
|
+
**FORBIDDEN: Writing Files at This Step**
|
|
303
303
|
```
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
304
|
+
Write tool to any path
|
|
305
|
+
Edit tool to any path
|
|
306
|
+
Any file creation or modification
|
|
307
307
|
```
|
|
308
308
|
**This is an ANALYSIS step.** File writes happen in Step 5.
|
|
309
309
|
|
|
@@ -331,15 +331,15 @@ sqlite3 .jettypod/work.db "SELECT wi.id, wi.title, wi.description, wi.parent_id,
|
|
|
331
331
|
4. If no match found, list available scenarios and ask which one to implement
|
|
332
332
|
|
|
333
333
|
**Handle errors gracefully:**
|
|
334
|
-
- If no current work: "
|
|
335
|
-
- If no parent feature: "
|
|
336
|
-
- If no scenario_file: "
|
|
334
|
+
- If no current work: "No current work found. Run: jettypod work start <chore-id>"
|
|
335
|
+
- If no parent feature: "Current work has no parent feature."
|
|
336
|
+
- If no scenario_file: "Feature has no scenario_file."
|
|
337
337
|
- If can't match chore to scenario: List available scenarios and ask user
|
|
338
338
|
|
|
339
339
|
**Display to user:**
|
|
340
340
|
|
|
341
341
|
```
|
|
342
|
-
|
|
342
|
+
Stable Mode: [Feature Name]
|
|
343
343
|
|
|
344
344
|
Target Scenario:
|
|
345
345
|
[Scenario title]
|
|
@@ -364,11 +364,11 @@ Now reviewing speed mode implementation...
|
|
|
364
364
|
|
|
365
365
|
**CRITICAL:** Claude Code executes this autonomously - no user permission needed.
|
|
366
366
|
|
|
367
|
-
|
|
367
|
+
**FORBIDDEN: Writing Files at This Step**
|
|
368
368
|
```
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
369
|
+
Write tool to any path
|
|
370
|
+
Edit tool to any path
|
|
371
|
+
Any file creation or modification
|
|
372
372
|
```
|
|
373
373
|
**This is an ANALYSIS step.** File writes happen in Step 5.
|
|
374
374
|
|
|
@@ -399,14 +399,14 @@ Then use the Read tool to examine the implementation files.
|
|
|
399
399
|
**Display analysis:**
|
|
400
400
|
|
|
401
401
|
```
|
|
402
|
-
|
|
402
|
+
Code Analysis Complete
|
|
403
403
|
|
|
404
404
|
Current Implementation:
|
|
405
405
|
• Files: [list]
|
|
406
|
-
• Success scenarios:
|
|
407
|
-
• Error handling:
|
|
408
|
-
• Validation:
|
|
409
|
-
• Edge cases:
|
|
406
|
+
• Success scenarios: Working (from speed mode)
|
|
407
|
+
• Error handling: Missing [specific gaps]
|
|
408
|
+
• Validation: Missing [specific gaps]
|
|
409
|
+
• Edge cases: Not handled [specific gaps]
|
|
410
410
|
|
|
411
411
|
To pass the target scenario, I need to:
|
|
412
412
|
1. [Specific change]
|
|
@@ -416,7 +416,7 @@ To pass the target scenario, I need to:
|
|
|
416
416
|
Now proposing comprehensive implementation...
|
|
417
417
|
```
|
|
418
418
|
|
|
419
|
-
|
|
419
|
+
**WORKFLOW CHECKPOINT: Code analysis complete**
|
|
420
420
|
|
|
421
421
|
```bash
|
|
422
422
|
jettypod workflow checkpoint <feature-id> --step=2
|
|
@@ -424,11 +424,11 @@ jettypod workflow checkpoint <feature-id> --step=2
|
|
|
424
424
|
|
|
425
425
|
### Step 3: Decide if Confirmation Needed
|
|
426
426
|
|
|
427
|
-
|
|
427
|
+
**FORBIDDEN: Writing Files at This Step**
|
|
428
428
|
```
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
429
|
+
Write tool to any path
|
|
430
|
+
Edit tool to any path
|
|
431
|
+
Any file creation or modification
|
|
432
432
|
```
|
|
433
433
|
**This is a DECISION step.** File writes happen in Step 5.
|
|
434
434
|
|
|
@@ -448,20 +448,20 @@ jettypod workflow checkpoint <feature-id> --step=2
|
|
|
448
448
|
|
|
449
449
|
### Step 3A: Propose Implementation Approach (Conditional)
|
|
450
450
|
|
|
451
|
-
|
|
451
|
+
**ASYNC BOUNDARY - Only execute this if confirmation needed**
|
|
452
452
|
|
|
453
|
-
|
|
453
|
+
**FORBIDDEN: Writing Files at This Step**
|
|
454
454
|
```
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
455
|
+
Write tool to any path
|
|
456
|
+
Edit tool to any path
|
|
457
|
+
Any file creation or modification
|
|
458
458
|
```
|
|
459
459
|
**This is a PROPOSAL step.** File writes happen in Step 5.
|
|
460
460
|
|
|
461
461
|
**Present your analysis and proposal to the user:**
|
|
462
462
|
|
|
463
463
|
```
|
|
464
|
-
|
|
464
|
+
Implementation Proposal
|
|
465
465
|
|
|
466
466
|
I see multiple ways to approach this error handling. Here's what I'm thinking:
|
|
467
467
|
|
|
@@ -476,7 +476,7 @@ I see multiple ways to approach this error handling. Here's what I'm thinking:
|
|
|
476
476
|
Sound good, or would you prefer a different approach?
|
|
477
477
|
```
|
|
478
478
|
|
|
479
|
-
|
|
479
|
+
**WAIT for user confirmation or adjustments.**
|
|
480
480
|
|
|
481
481
|
If user adjusts: revise proposal and confirm again before proceeding.
|
|
482
482
|
|
|
@@ -484,6 +484,16 @@ If user adjusts: revise proposal and confirm again before proceeding.
|
|
|
484
484
|
|
|
485
485
|
---
|
|
486
486
|
|
|
487
|
+
### BDD Step Definition Constraints (ENFORCED)
|
|
488
|
+
|
|
489
|
+
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.
|
|
490
|
+
|
|
491
|
+
**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`.
|
|
492
|
+
|
|
493
|
+
**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.
|
|
494
|
+
|
|
495
|
+
---
|
|
496
|
+
|
|
487
497
|
### Step 4: Establish RED Baseline
|
|
488
498
|
|
|
489
499
|
**CRITICAL:** After user confirms (or skips confirmation), execute autonomously - no permission needed for code changes.
|
|
@@ -528,25 +538,25 @@ Parse the output to identify:
|
|
|
528
538
|
|
|
529
539
|
**Display RED baseline:**
|
|
530
540
|
```
|
|
531
|
-
|
|
541
|
+
Establishing RED baseline...
|
|
532
542
|
|
|
533
543
|
RED Baseline: 3 of 11 steps failing (stable mode scenarios)
|
|
534
544
|
|
|
535
545
|
Failing steps:
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
546
|
+
Then it should throw a validation error
|
|
547
|
+
And the error message should be "Email is required"
|
|
548
|
+
When I provide an empty string as input
|
|
539
549
|
|
|
540
550
|
First error:
|
|
541
551
|
Step: Then it should throw a validation error
|
|
542
552
|
Error: Error: Expected function to throw but it didn't
|
|
543
553
|
|
|
544
|
-
|
|
554
|
+
Goal: Make all stable mode scenarios pass
|
|
545
555
|
|
|
546
556
|
Now implementing...
|
|
547
557
|
```
|
|
548
558
|
|
|
549
|
-
|
|
559
|
+
**WORKFLOW CHECKPOINT: RED baseline established**
|
|
550
560
|
|
|
551
561
|
```bash
|
|
552
562
|
jettypod workflow checkpoint <feature-id> --step=4
|
|
@@ -556,9 +566,9 @@ jettypod workflow checkpoint <feature-id> --step=4
|
|
|
556
566
|
|
|
557
567
|
### Step 5: RED→GREEN→REFACTOR Loop
|
|
558
568
|
|
|
559
|
-
|
|
569
|
+
**WORKTREE PATH REQUIRED:** All file writes MUST use the `WORKTREE_PATH` captured after pre-flight validation.
|
|
560
570
|
|
|
561
|
-
|
|
571
|
+
**NOW you may write files** - worktree is locked, approach is confirmed.
|
|
562
572
|
|
|
563
573
|
**Emit gate signal:**
|
|
564
574
|
|
|
@@ -581,23 +591,23 @@ jettypod ui gate implementing --data='{"description":"[stable mode error handlin
|
|
|
581
591
|
**Show progress each iteration:**
|
|
582
592
|
```
|
|
583
593
|
━━━ Iteration 3/10 ━━━
|
|
584
|
-
|
|
594
|
+
Unit test: test/user.test.js - validates email format
|
|
585
595
|
RED: Test fails - no validation exists yet
|
|
586
|
-
|
|
596
|
+
Implementation: src/user.js - added email format validation
|
|
587
597
|
GREEN: Unit test passes
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
598
|
+
Running BDD scenarios...
|
|
599
|
+
Progress: 9/11 BDD steps passing
|
|
600
|
+
Newly passing: Then it should throw a validation error
|
|
601
|
+
Next failure: And the error message should be user-friendly
|
|
592
602
|
BDD step: Then the error message should be "Email format is invalid"
|
|
593
603
|
```
|
|
594
604
|
|
|
595
605
|
**When GREEN achieved:**
|
|
596
606
|
```
|
|
597
|
-
|
|
607
|
+
GREEN: All stable mode scenarios passing!
|
|
598
608
|
```
|
|
599
609
|
|
|
600
|
-
|
|
610
|
+
**WORKFLOW CHECKPOINT: GREEN achieved**
|
|
601
611
|
|
|
602
612
|
```bash
|
|
603
613
|
jettypod workflow checkpoint <feature-id> --step=5
|
|
@@ -612,7 +622,7 @@ jettypod workflow checkpoint <feature-id> --step=5
|
|
|
612
622
|
**Re-run tests after refactor** to ensure nothing broke.
|
|
613
623
|
|
|
614
624
|
<details>
|
|
615
|
-
<summary><strong
|
|
625
|
+
<summary><strong>TDD Loop Guidelines (click to expand)</strong></summary>
|
|
616
626
|
|
|
617
627
|
**Iteration strategy:**
|
|
618
628
|
- Start with first failing stable mode step
|
|
@@ -632,6 +642,8 @@ jettypod workflow checkpoint <feature-id> --step=5
|
|
|
632
642
|
|
|
633
643
|
</details>
|
|
634
644
|
|
|
645
|
+
**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.
|
|
646
|
+
|
|
635
647
|
---
|
|
636
648
|
|
|
637
649
|
### Step 6: Route After Chore Completion
|
|
@@ -654,10 +666,10 @@ sqlite3 .jettypod/work.db "SELECT id, title FROM work_items WHERE parent_id = <f
|
|
|
654
666
|
|
|
655
667
|
```
|
|
656
668
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
657
|
-
|
|
669
|
+
Stable Mode Chore Complete
|
|
658
670
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
659
671
|
|
|
660
|
-
|
|
672
|
+
Error handling and validation scenarios pass for this chore
|
|
661
673
|
|
|
662
674
|
More stable mode chores remain. Starting next chore:
|
|
663
675
|
#[next-chore-id]: [next-chore-title]
|
|
@@ -675,6 +687,8 @@ git add . && git commit -m "feat: [brief description of error handling added]"
|
|
|
675
687
|
jettypod work merge [current-chore-id]
|
|
676
688
|
```
|
|
677
689
|
|
|
690
|
+
**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.
|
|
691
|
+
|
|
678
692
|
```bash
|
|
679
693
|
# Step 2: cd to main repo
|
|
680
694
|
cd /path/to/main/repo
|
|
@@ -699,7 +713,7 @@ If the query returns no remaining chores, proceed to Step 7.
|
|
|
699
713
|
|
|
700
714
|
### Step 7: Complete Feature or Transition to Production Mode
|
|
701
715
|
|
|
702
|
-
|
|
716
|
+
**CRITICAL: This step ONLY runs after ALL stable chores are complete.**
|
|
703
717
|
|
|
704
718
|
**First, merge the final stable chore:**
|
|
705
719
|
|
|
@@ -729,6 +743,31 @@ pwd && ls .jettypod # verify
|
|
|
729
743
|
jettypod work cleanup [current-chore-id]
|
|
730
744
|
```
|
|
731
745
|
|
|
746
|
+
**Then generate QA checklist for the parent feature:**
|
|
747
|
+
|
|
748
|
+
Read the BDD scenario file for the parent feature. Based on the scenarios and your knowledge of what was implemented, generate specific, human-actionable QA checklist steps. Each step should be something a QA tester can verify manually in the running app.
|
|
749
|
+
|
|
750
|
+
Write a JSON array to `/tmp/qa-steps.json`:
|
|
751
|
+
```json
|
|
752
|
+
[
|
|
753
|
+
{"section": "Section Name", "text": "Action to perform and expected result", "detail": "Additional context if needed"},
|
|
754
|
+
...
|
|
755
|
+
]
|
|
756
|
+
```
|
|
757
|
+
|
|
758
|
+
Guidelines for good QA steps:
|
|
759
|
+
- Be specific: "Open Settings, click Claude Code section" not "Navigate to the feature"
|
|
760
|
+
- Include expected outcomes: "dropdown shows Haiku as selected" not "model is selected"
|
|
761
|
+
- One verifiable action per step
|
|
762
|
+
- Group into sections (e.g., "Model Selection", "Persistence", "Error Handling")
|
|
763
|
+
- Cover happy paths AND edge cases from the BDD scenarios
|
|
764
|
+
- 5-15 steps total (not too few to be useless, not too many to be tedious)
|
|
765
|
+
|
|
766
|
+
Then store them:
|
|
767
|
+
```bash
|
|
768
|
+
jettypod work set-qa-steps [parent-feature-id] --from=/tmp/qa-steps.json
|
|
769
|
+
```
|
|
770
|
+
|
|
732
771
|
**Then check project state:**
|
|
733
772
|
|
|
734
773
|
```bash
|
|
@@ -741,6 +780,26 @@ sqlite3 .jettypod/work.db "SELECT project_state FROM project_config WHERE id = 1
|
|
|
741
780
|
|
|
742
781
|
**If project_state = 'internal':**
|
|
743
782
|
|
|
783
|
+
**Prove It Works (REQUIRED):**
|
|
784
|
+
|
|
785
|
+
Before marking the feature complete, demonstrate it works in practice — not just that tests pass.
|
|
786
|
+
|
|
787
|
+
1. **Run or build the actual code** — compile, start the server, execute the command, or trigger the relevant workflow
|
|
788
|
+
2. **Show real output** — display console output, build result, or observable behavior
|
|
789
|
+
3. **Confirm it matches expectations** — verify the output is what was requested
|
|
790
|
+
|
|
791
|
+
**Display:**
|
|
792
|
+
|
|
793
|
+
```
|
|
794
|
+
Verifying in practice...
|
|
795
|
+
|
|
796
|
+
[Actual output from running/building the code]
|
|
797
|
+
|
|
798
|
+
Verified: [what was confirmed]
|
|
799
|
+
```
|
|
800
|
+
|
|
801
|
+
**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.
|
|
802
|
+
|
|
744
803
|
**The merge command automatically sets the feature as ready for review.**
|
|
745
804
|
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.
|
|
746
805
|
|
|
@@ -748,19 +807,19 @@ It will appear with accept/reject buttons on the kanban board. Do NOT call `jett
|
|
|
748
807
|
|
|
749
808
|
```
|
|
750
809
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
751
|
-
|
|
810
|
+
FEATURE COMPLETE!
|
|
752
811
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
753
812
|
|
|
754
813
|
Feature: #[id] [Feature Title]
|
|
755
|
-
Status:
|
|
814
|
+
Status: DONE
|
|
756
815
|
|
|
757
816
|
What we accomplished:
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
817
|
+
All BDD scenarios passing (success + error handling + edge cases)
|
|
818
|
+
Comprehensive error handling and validation
|
|
819
|
+
Input validation and edge case coverage
|
|
820
|
+
State consistency and data integrity
|
|
762
821
|
|
|
763
|
-
|
|
822
|
+
INTERNAL PROJECT - STABLE MODE IS COMPLETE
|
|
764
823
|
|
|
765
824
|
This is an internal project - stable mode is the end state.
|
|
766
825
|
Feature is complete and ready to use!
|
|
@@ -769,7 +828,7 @@ Note: If you later transition to external (accepting real users),
|
|
|
769
828
|
run the external-transition skill to generate production chores.
|
|
770
829
|
```
|
|
771
830
|
|
|
772
|
-
|
|
831
|
+
**WORKFLOW INTEGRATION: Complete workflow (internal project)**
|
|
773
832
|
|
|
774
833
|
```bash
|
|
775
834
|
jettypod workflow complete stable-mode <feature-id>
|
|
@@ -791,7 +850,7 @@ This marks the `stable_mode_complete` gate as passed. For internal projects, thi
|
|
|
791
850
|
|
|
792
851
|
**If project_state = 'external':**
|
|
793
852
|
|
|
794
|
-
|
|
853
|
+
**CRITICAL HANDOFF - You MUST invoke production-mode using the Skill tool.**
|
|
795
854
|
|
|
796
855
|
**Set feature mode to production:**
|
|
797
856
|
|
|
@@ -803,21 +862,21 @@ jettypod work set-mode <feature-id> production
|
|
|
803
862
|
|
|
804
863
|
```
|
|
805
864
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
806
|
-
|
|
865
|
+
Stable Mode Complete! Transitioning to Production Mode
|
|
807
866
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
808
867
|
|
|
809
|
-
|
|
868
|
+
CRITICAL: This is an EXTERNAL project.
|
|
810
869
|
Stable mode makes it robust - production mode makes it ready for real users.
|
|
811
870
|
|
|
812
871
|
What we accomplished:
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
872
|
+
All BDD scenarios passing (success + error handling + edge cases)
|
|
873
|
+
Comprehensive error handling and validation
|
|
874
|
+
Feature stable and ready for production hardening
|
|
816
875
|
|
|
817
|
-
|
|
876
|
+
Now invoking production-mode skill...
|
|
818
877
|
```
|
|
819
878
|
|
|
820
|
-
|
|
879
|
+
**WORKFLOW INTEGRATION: Complete workflow (external project)**
|
|
821
880
|
|
|
822
881
|
```bash
|
|
823
882
|
jettypod workflow complete stable-mode <feature-id>
|
|
@@ -877,17 +936,17 @@ jettypod work start <chore-id> # Create worktree and start chore
|
|
|
877
936
|
|
|
878
937
|
**Set feature status/mode:**
|
|
879
938
|
```bash
|
|
880
|
-
#
|
|
939
|
+
# Do NOT call `work status done` — merge sets the review gate automatically
|
|
881
940
|
jettypod work set-mode <feature-id> production # Set feature to production mode (external only)
|
|
882
941
|
```
|
|
883
942
|
|
|
884
|
-
|
|
943
|
+
**DO NOT use these to complete chores:**
|
|
885
944
|
- `jettypod work status <chore-id> done`
|
|
886
945
|
- `jettypod work complete <id>`
|
|
887
946
|
|
|
888
947
|
---
|
|
889
948
|
|
|
890
|
-
##
|
|
949
|
+
## Important: Sequential Workflow
|
|
891
950
|
|
|
892
951
|
**Stable mode chores MUST be completed sequentially, not in parallel.**
|
|
893
952
|
|
package/apps/dashboard/README.md
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
|
|
2
|
-
|
|
3
|
-
## Getting Started
|
|
4
|
-
|
|
5
|
-
First, run the development server:
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
npm run dev
|
|
9
|
-
# or
|
|
10
|
-
yarn dev
|
|
11
|
-
# or
|
|
12
|
-
pnpm dev
|
|
13
|
-
# or
|
|
14
|
-
bun dev
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
|
|
18
|
-
|
|
19
|
-
You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
|
|
20
|
-
|
|
21
|
-
This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
|
|
22
|
-
|
|
23
|
-
## Learn More
|
|
24
|
-
|
|
25
|
-
To learn more about Next.js, take a look at the following resources:
|
|
26
|
-
|
|
27
|
-
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
|
|
28
|
-
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
|
|
29
|
-
|
|
30
|
-
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
|
|
31
|
-
|
|
32
|
-
## Deploy on Vercel
|
|
33
|
-
|
|
34
|
-
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
|
|
35
|
-
|
|
36
|
-
Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
|