jettypod 4.4.116 → 4.4.120
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 +7 -0
- package/apps/dashboard/app/api/claude/[workItemId]/message/route.ts +124 -48
- package/apps/dashboard/app/api/claude/[workItemId]/route.ts +171 -58
- package/apps/dashboard/app/api/claude/sessions/[sessionId]/message/route.ts +161 -10
- package/apps/dashboard/app/api/tests/run/stream/route.ts +13 -1
- package/apps/dashboard/app/api/usage/route.ts +17 -0
- package/apps/dashboard/app/api/work/[id]/route.ts +35 -0
- package/apps/dashboard/app/api/work/[id]/status/route.ts +43 -1
- package/apps/dashboard/app/connect-claude/page.tsx +24 -0
- package/apps/dashboard/app/decision/[id]/page.tsx +14 -14
- package/apps/dashboard/app/demo/gates/page.tsx +42 -42
- package/apps/dashboard/app/design-system/page.tsx +868 -0
- package/apps/dashboard/app/globals.css +6 -2
- package/apps/dashboard/app/install-claude/page.tsx +9 -7
- package/apps/dashboard/app/layout.tsx +17 -5
- package/apps/dashboard/app/login/page.tsx +250 -0
- package/apps/dashboard/app/page.tsx +11 -9
- package/apps/dashboard/app/settings/page.tsx +4 -2
- package/apps/dashboard/app/signup/page.tsx +245 -0
- package/apps/dashboard/app/subscribe/page.tsx +11 -0
- package/apps/dashboard/app/welcome/page.tsx +24 -1
- package/apps/dashboard/app/work/[id]/page.tsx +34 -50
- package/apps/dashboard/components/AppShell.tsx +95 -55
- package/apps/dashboard/components/CardMenu.tsx +56 -13
- package/apps/dashboard/components/ClaudePanel.tsx +301 -582
- package/apps/dashboard/components/ClaudePanelInput.tsx +23 -14
- package/apps/dashboard/components/ConnectClaudeScreen.tsx +210 -0
- package/apps/dashboard/components/CopyableId.tsx +3 -3
- package/apps/dashboard/components/DetailReviewActions.tsx +109 -0
- package/apps/dashboard/components/DragContext.tsx +75 -65
- package/apps/dashboard/components/DraggableCard.tsx +6 -46
- package/apps/dashboard/components/DropZone.tsx +2 -2
- package/apps/dashboard/components/EditableDetailDescription.tsx +1 -1
- package/apps/dashboard/components/EditableTitle.tsx +26 -6
- package/apps/dashboard/components/ElapsedTimer.tsx +54 -0
- package/apps/dashboard/components/EpicGroup.tsx +329 -0
- package/apps/dashboard/components/GateCard.tsx +100 -16
- package/apps/dashboard/components/GateChoiceCard.tsx +15 -17
- package/apps/dashboard/components/InstallClaudeScreen.tsx +140 -51
- package/apps/dashboard/components/JettyLoader.tsx +38 -0
- package/apps/dashboard/components/KanbanBoard.tsx +147 -766
- package/apps/dashboard/components/KanbanCard.tsx +506 -0
- package/apps/dashboard/components/LazyMarkdown.tsx +12 -0
- package/apps/dashboard/components/MainNav.tsx +20 -54
- package/apps/dashboard/components/MessageBlock.tsx +391 -0
- package/apps/dashboard/components/ModeStartCard.tsx +15 -15
- package/apps/dashboard/components/OnboardingWelcome.tsx +214 -0
- package/apps/dashboard/components/PlaceholderCard.tsx +11 -21
- package/apps/dashboard/components/ProjectSwitcher.tsx +36 -8
- package/apps/dashboard/components/PrototypeTimeline.tsx +25 -25
- package/apps/dashboard/components/RealTimeKanbanWrapper.tsx +265 -301
- package/apps/dashboard/components/RealTimeTestsWrapper.tsx +97 -74
- package/apps/dashboard/components/ReviewFooter.tsx +141 -0
- package/apps/dashboard/components/SessionList.tsx +19 -18
- package/apps/dashboard/components/SubscribeContent.tsx +206 -0
- package/apps/dashboard/components/TestTree.tsx +15 -14
- package/apps/dashboard/components/TipCard.tsx +177 -0
- package/apps/dashboard/components/Toast.tsx +5 -5
- package/apps/dashboard/components/TypeIcon.tsx +56 -0
- package/apps/dashboard/components/UpgradeBanner.tsx +30 -0
- package/apps/dashboard/components/WaveCompletionAnimation.tsx +61 -62
- package/apps/dashboard/components/WelcomeScreen.tsx +25 -27
- package/apps/dashboard/components/WorkItemHeader.tsx +4 -4
- package/apps/dashboard/components/WorkItemTree.tsx +9 -28
- package/apps/dashboard/components/settings/AccountSection.tsx +169 -0
- package/apps/dashboard/components/settings/EnvVarsSection.tsx +54 -79
- package/apps/dashboard/components/settings/GeneralSection.tsx +26 -31
- package/apps/dashboard/components/settings/SettingsLayout.tsx +4 -4
- package/apps/dashboard/components/ui/Button.tsx +104 -0
- package/apps/dashboard/components/ui/Input.tsx +78 -0
- package/apps/dashboard/contexts/ClaudeSessionContext.tsx +408 -105
- package/apps/dashboard/contexts/ConnectionStatusContext.tsx +25 -4
- package/apps/dashboard/contexts/UsageContext.tsx +155 -0
- package/apps/dashboard/contexts/usageHelpers.js +9 -0
- package/apps/dashboard/electron/ipc-handlers.js +281 -88
- package/apps/dashboard/electron/main.js +691 -131
- package/apps/dashboard/electron/preload.js +25 -4
- package/apps/dashboard/electron/session-manager.js +163 -0
- package/apps/dashboard/electron-builder.config.js +3 -5
- package/apps/dashboard/hooks/useKanbanAnimation.ts +29 -0
- package/apps/dashboard/hooks/useKanbanUndo.ts +83 -0
- package/apps/dashboard/lib/backlog-parser.ts +50 -0
- package/apps/dashboard/lib/claude-process-manager.ts +50 -11
- package/apps/dashboard/lib/constants.ts +43 -0
- package/apps/dashboard/lib/db-bridge.ts +33 -0
- package/apps/dashboard/lib/db.ts +136 -20
- package/apps/dashboard/lib/kanban-utils.ts +70 -0
- package/apps/dashboard/lib/run-migrations.js +27 -2
- package/apps/dashboard/lib/session-state-machine.ts +3 -0
- package/apps/dashboard/lib/session-stream-manager.ts +144 -38
- package/apps/dashboard/lib/shadows.ts +7 -0
- package/apps/dashboard/lib/tests.ts +3 -1
- package/apps/dashboard/lib/utils.ts +6 -0
- package/apps/dashboard/next.config.js +35 -14
- package/apps/dashboard/package.json +6 -3
- package/apps/dashboard/public/bug-icon.svg +9 -0
- package/apps/dashboard/public/buoy-icon.svg +9 -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.svg +9 -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.svg +14 -0
- package/apps/dashboard/public/star-icon.svg +9 -0
- package/apps/dashboard/public/wrench-icon.svg +9 -0
- package/apps/dashboard/scripts/upload-to-r2.js +89 -0
- package/apps/dashboard/scripts/ws-server.js +191 -0
- package/apps/dashboard/tsconfig.tsbuildinfo +1 -0
- package/apps/update-server/package.json +16 -0
- package/apps/update-server/schema.sql +31 -0
- package/apps/update-server/src/index.ts +1085 -0
- package/apps/update-server/tsconfig.json +16 -0
- package/apps/update-server/wrangler.toml +35 -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 +54 -116
- 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/migrations/027-plan-at-creation-column.js +33 -0
- package/lib/migrations/028-ready-for-review-column.js +27 -0
- package/lib/migrations/029-remove-autoincrement.js +307 -0
- package/lib/migrations/029-rename-corrupted-to-cleaned.js +149 -0
- package/lib/migrations/index.js +47 -4
- package/lib/schema.js +13 -6
- package/lib/seed-onboarding.js +101 -69
- package/lib/update-command/index.js +9 -175
- package/lib/work-commands/index.js +129 -16
- package/lib/work-tracking/index.js +86 -46
- 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 +39 -28
- package/skills-templates/bug-planning/SKILL.md +25 -29
- package/skills-templates/chore-mode/SKILL.md +131 -68
- package/skills-templates/chore-mode/verification.js +51 -10
- package/skills-templates/chore-planning/SKILL.md +47 -18
- package/skills-templates/epic-planning/SKILL.md +68 -48
- package/skills-templates/external-transition/SKILL.md +47 -47
- package/skills-templates/feature-planning/SKILL.md +83 -73
- package/skills-templates/production-mode/SKILL.md +49 -49
- package/skills-templates/request-routing/SKILL.md +27 -14
- package/skills-templates/simple-improvement/SKILL.md +68 -44
- package/skills-templates/speed-mode/SKILL.md +209 -128
- package/skills-templates/stable-mode/SKILL.md +105 -94
- package/templates/bdd-guidance.md +139 -0
- package/templates/bdd-scaffolding/wait.js +18 -0
- package/templates/bdd-scaffolding/world.js +19 -0
- package/.jettypod-backup/work.db +0 -0
- package/apps/dashboard/app/access-code/page.tsx +0 -110
- package/lib/discovery-checkpoint.js +0 -123
- package/skills-templates/project-discovery/SKILL.md +0 -372
|
@@ -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,7 @@ 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
|
+
**WORKFLOW INTEGRATION: Complete workflow**
|
|
448
448
|
|
|
449
449
|
When all production chores are complete:
|
|
450
450
|
|
|
@@ -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
|
|
@@ -35,7 +35,7 @@ From the user's request, identify work type and complexity signals:
|
|
|
35
35
|
| refactor, rename, move, clean up, upgrade, migrate, infrastructure | chore-planning |
|
|
36
36
|
| add, build, create, implement, new feature, capability, workflow | feature-planning |
|
|
37
37
|
| epic, initiative, project, roadmap, multi-feature | epic-planning |
|
|
38
|
-
| tweak, change, update, adjust +
|
|
38
|
+
| tweak, change, update, adjust + PURELY COSMETIC (text, color, spacing, copy only) | simple-improvement |
|
|
39
39
|
|
|
40
40
|
**Complexity signals:**
|
|
41
41
|
| Signal | Indicates |
|
|
@@ -46,6 +46,8 @@ From the user's request, identify work type and complexity signals:
|
|
|
46
46
|
| Has edge cases to consider (validation, failures, states) | Higher complexity |
|
|
47
47
|
| Could fail in interesting ways | Higher complexity |
|
|
48
48
|
| Needs error handling design | Higher complexity |
|
|
49
|
+
| Adds or changes behavior (tracking, counting, filtering, sorting, state) | Higher complexity — NOT simple-improvement |
|
|
50
|
+
| Creates new capabilities (even small ones) | Higher complexity — NOT simple-improvement |
|
|
49
51
|
|
|
50
52
|
### Step 2: Gather Context (Silent - No Questions)
|
|
51
53
|
|
|
@@ -101,14 +103,14 @@ Are there edge cases to consider?
|
|
|
101
103
|
│ (The speed→stable split helps: make it work, then handle edge cases)
|
|
102
104
|
│
|
|
103
105
|
▼
|
|
104
|
-
Is this
|
|
105
|
-
(
|
|
106
|
-
|
|
106
|
+
Is this PURELY COSMETIC?
|
|
107
|
+
(Only changes text, copy, color, spacing, or static visual appearance?)
|
|
108
|
+
(Does NOT add/change any behavior, logic, tracking, data, or capabilities?)
|
|
109
|
+
├─► Yes → simple-improvement
|
|
107
110
|
│
|
|
108
111
|
▼
|
|
109
|
-
|
|
110
|
-
(
|
|
111
|
-
└─► Yes → simple-improvement
|
|
112
|
+
Default → chore-planning
|
|
113
|
+
(When in doubt, route to chore-planning, NEVER to simple-improvement)
|
|
112
114
|
```
|
|
113
115
|
|
|
114
116
|
## Route Definitions
|
|
@@ -119,8 +121,8 @@ Is this truly atomic?
|
|
|
119
121
|
| **epic-planning (technical)** | Large technical initiative (refactor, migration, infrastructure) with no user-facing features | Break down → chores directly (no features, no modes) |
|
|
120
122
|
| **epic-planning** | Large initiative spanning multiple features | Break down → plan features |
|
|
121
123
|
| **feature-planning** | New behavior needing UX exploration OR has edge cases worth sequencing | UX exploration → BDD → speed → stable → production |
|
|
122
|
-
| **chore-planning** | Substantial technical work
|
|
123
|
-
| **simple-improvement** |
|
|
124
|
+
| **chore-planning** | Substantial technical work OR behavior-adding without edge cases | Type-specific verification → done (enhancement type uses TDD) |
|
|
125
|
+
| **simple-improvement** | PURELY COSMETIC: text, copy, color, spacing changes only. No behavior change. | Direct implementation |
|
|
124
126
|
|
|
125
127
|
## Routing Examples
|
|
126
128
|
|
|
@@ -170,11 +172,22 @@ Is this truly atomic?
|
|
|
170
172
|
**→ simple-improvement**
|
|
171
173
|
- "Change the button text from 'Submit' to 'Save'"
|
|
172
174
|
- "Make the error message more descriptive"
|
|
173
|
-
- "Add a loading spinner to the save button"
|
|
174
175
|
- "Change the header color to blue"
|
|
175
|
-
- "
|
|
176
|
+
- "Update the placeholder text in the search box"
|
|
177
|
+
- "Increase the font size of the title"
|
|
176
178
|
|
|
177
|
-
*(
|
|
179
|
+
*(PURELY COSMETIC: only text, copy, color, spacing, or static visual changes. Zero behavior change.)*
|
|
180
|
+
|
|
181
|
+
**NOT simple-improvement (common mistakes):**
|
|
182
|
+
- "Add a loading spinner to the save button" → **chore-planning** (adds behavior: state tracking, show/hide logic)
|
|
183
|
+
- "Add a tooltip to the settings icon" → **chore-planning** (adds behavior: hover state, positioning)
|
|
184
|
+
- "Track work item counts" → **feature-planning** (adds behavior: counting, state, display logic)
|
|
185
|
+
- "Add sorting to the list" → **feature-planning** (adds behavior: sort logic, state, UI interaction)
|
|
186
|
+
- "Show a count next to the tab" → **chore-planning** (adds behavior: data fetching, count computation)
|
|
187
|
+
- "Add a confirmation dialog" → **feature-planning** (adds behavior: modal state, user interaction, edge cases)
|
|
188
|
+
- "Make the sidebar collapsible" → **feature-planning** (adds behavior: toggle state, animation, persistence)
|
|
189
|
+
|
|
190
|
+
*(If it adds ANY new behavior — even "small" behavior — it is NOT a simple improvement.)*
|
|
178
191
|
|
|
179
192
|
## Stating Your Routing Decision
|
|
180
193
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: simple-improvement
|
|
3
|
-
description: Guide implementation of
|
|
3
|
+
description: Guide implementation of PURELY COSMETIC changes. Invoked by request-routing ONLY for text, copy, color, and spacing changes that add zero new behavior. (project)
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Simple Improvement Skill
|
|
@@ -18,24 +18,39 @@ description: Guide implementation of simple improvements to existing functionali
|
|
|
18
18
|
└─────────────────────────────────────────────────────────────────────┘
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
-
Lightweight workflow for
|
|
21
|
+
Lightweight workflow for PURELY COSMETIC changes. Bypasses the full speed/stable mode progression because these changes have zero behavior impact.
|
|
22
22
|
|
|
23
23
|
## When to Use
|
|
24
24
|
|
|
25
|
-
This skill is invoked by request-routing
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
25
|
+
This skill is invoked by request-routing ONLY for **purely cosmetic changes**:
|
|
26
|
+
- Text/copy changes (button labels, headings, descriptions, placeholder text)
|
|
27
|
+
- Color changes (background, text color, border color)
|
|
28
|
+
- Spacing/sizing changes (padding, margin, font size, width)
|
|
29
|
+
- Static visual appearance (border radius, opacity, font weight)
|
|
30
|
+
|
|
31
|
+
**The litmus test:** Could a non-developer make this change with a find-and-replace in a design tool? If yes, it's simple. If no, it's not.
|
|
30
32
|
|
|
31
33
|
## When NOT to Use
|
|
32
34
|
|
|
33
|
-
Route back to request-routing for:
|
|
34
|
-
|
|
35
|
+
**If it adds or changes ANY behavior, it is NOT a simple improvement.** Route back to request-routing for:
|
|
36
|
+
|
|
37
|
+
- Adding interactive elements (tooltips, spinners, modals, collapsibles)
|
|
38
|
+
- Adding tracking/counting/state (counters, badges, progress indicators)
|
|
39
|
+
- Adding data fetching or computation
|
|
40
|
+
- Adding conditional logic (show/hide, enable/disable)
|
|
41
|
+
- Adding user interactions (hover effects with logic, drag-and-drop, sorting)
|
|
42
|
+
- New functionality of ANY size
|
|
35
43
|
- Changes requiring new data models
|
|
36
44
|
- Complex logic changes
|
|
37
45
|
- Features needing error handling design
|
|
38
46
|
|
|
47
|
+
**Common misroutes — these are NOT simple improvements:**
|
|
48
|
+
- "Add a loading spinner" → has state (loading/not loading), show/hide logic
|
|
49
|
+
- "Show item count" → needs data query, computation, display logic
|
|
50
|
+
- "Add a tooltip" → hover detection, positioning, content logic
|
|
51
|
+
- "Make sidebar collapsible" → toggle state, persistence, animation
|
|
52
|
+
- "Add sorting" → sort logic, state management, UI interaction
|
|
53
|
+
|
|
39
54
|
---
|
|
40
55
|
|
|
41
56
|
## Instructions
|
|
@@ -58,7 +73,7 @@ Use the description from the user's initial request (passed through request-rout
|
|
|
58
73
|
I need more details. What specifically needs to change?
|
|
59
74
|
```
|
|
60
75
|
|
|
61
|
-
|
|
76
|
+
**WAIT for user to clarify, then proceed.**
|
|
62
77
|
|
|
63
78
|
**Otherwise, proceed directly with the clear description you already have.**
|
|
64
79
|
|
|
@@ -71,29 +86,34 @@ Scan the user's description for these patterns:
|
|
|
71
86
|
|
|
72
87
|
| Signal | Keywords/Patterns |
|
|
73
88
|
|--------|-------------------|
|
|
89
|
+
| New behavior | "add", "track", "count", "show", "display", "when", "toggle", "sort", "filter" |
|
|
90
|
+
| State management | "loading", "spinner", "collapse", "expand", "hover", "active", "selected" |
|
|
74
91
|
| New data models | "new table", "add column", "database", "schema" |
|
|
75
92
|
| New API | "new endpoint", "API", "new route" |
|
|
76
93
|
| Complex logic | "if/else", "conditional", "depends on", multiple "and" clauses |
|
|
77
94
|
| Multiple components | mentions 3+ different files/areas, "also need to" |
|
|
78
95
|
| Architectural changes | "refactor", "restructure", "new system" |
|
|
79
96
|
|
|
80
|
-
|
|
97
|
+
**Route back to request-routing if ANY complexity signal detected:**
|
|
98
|
+
- Any new behavior (even "small" behavior like a spinner or tooltip)
|
|
99
|
+
- Any state management (loading, toggle, hover, selection)
|
|
81
100
|
- New database tables/columns needed
|
|
82
101
|
- New API endpoints required
|
|
83
102
|
- Complex conditional logic
|
|
84
103
|
- Multiple interconnected changes
|
|
85
104
|
- Need for error handling design
|
|
86
105
|
|
|
87
|
-
|
|
106
|
+
**Continue ONLY if the change is:**
|
|
107
|
+
- Purely cosmetic (text, color, spacing, static visual appearance)
|
|
88
108
|
- Single file or 2-3 related files
|
|
89
|
-
- Modifying existing
|
|
90
|
-
-
|
|
109
|
+
- Modifying existing static values (not adding logic)
|
|
110
|
+
- Zero new behavior, zero new state
|
|
91
111
|
- No architectural decisions needed
|
|
92
112
|
|
|
93
113
|
**If too complex:**
|
|
94
114
|
|
|
95
115
|
```
|
|
96
|
-
|
|
116
|
+
This change appears to require new data models or architectural changes. This is more than a simple improvement.
|
|
97
117
|
|
|
98
118
|
I'm routing you back to request-routing for proper planning.
|
|
99
119
|
```
|
|
@@ -105,7 +125,7 @@ I'm routing you back to request-routing for proper planning.
|
|
|
105
125
|
**If confirmed simple:**
|
|
106
126
|
|
|
107
127
|
```
|
|
108
|
-
|
|
128
|
+
Confirmed: This is a simple improvement.
|
|
109
129
|
|
|
110
130
|
Change: [summarize the specific change]
|
|
111
131
|
Scope: [list files likely affected]
|
|
@@ -127,14 +147,22 @@ jettypod ui gate route-decided --data='{"route":"simple-improvement","title":"[b
|
|
|
127
147
|
|
|
128
148
|
**Create a single chore with NO mode assigned.**
|
|
129
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**:
|
|
130
161
|
```bash
|
|
131
|
-
jettypod work create
|
|
132
|
-
- What to change
|
|
133
|
-
- Where to change it
|
|
134
|
-
- Expected outcome]" --parent=<feature-id>
|
|
162
|
+
jettypod work create --from=/tmp/jettypod-create.json
|
|
135
163
|
```
|
|
136
164
|
|
|
137
|
-
**IMPORTANT:** Do NOT
|
|
165
|
+
**IMPORTANT:** Do NOT add a `mode` field. Simple improvements don't use speed/stable modes.
|
|
138
166
|
|
|
139
167
|
**Emit gate signal:**
|
|
140
168
|
|
|
@@ -145,7 +173,7 @@ jettypod ui gate work-created --data='{"id":[chore-id],"title":"[title]"}'
|
|
|
145
173
|
**Display to user:**
|
|
146
174
|
|
|
147
175
|
```
|
|
148
|
-
|
|
176
|
+
Created Chore #[id]: [title]
|
|
149
177
|
|
|
150
178
|
Ready to implement. Starting chore...
|
|
151
179
|
```
|
|
@@ -155,7 +183,7 @@ Ready to implement. Starting chore...
|
|
|
155
183
|
When the `jettypod work create` command fails, display error details and suggest recovery:
|
|
156
184
|
|
|
157
185
|
```
|
|
158
|
-
|
|
186
|
+
Failed to create chore: [error message] ([error code if available])
|
|
159
187
|
|
|
160
188
|
This could be caused by:
|
|
161
189
|
• Database is locked by another process
|
|
@@ -169,7 +197,7 @@ Suggested actions:
|
|
|
169
197
|
4. If persistent, try: jettypod work cleanup --all
|
|
170
198
|
```
|
|
171
199
|
|
|
172
|
-
|
|
200
|
+
**WAIT for user to acknowledge before retrying or investigating further.**
|
|
173
201
|
|
|
174
202
|
Do NOT proceed to Step 3 until chore is successfully created.
|
|
175
203
|
|
|
@@ -185,7 +213,7 @@ Do NOT proceed to Step 3 until chore is successfully created.
|
|
|
185
213
|
jettypod work start <chore-id>
|
|
186
214
|
```
|
|
187
215
|
|
|
188
|
-
|
|
216
|
+
**STOP AND CHECK:** Verify worktree was created successfully before proceeding.
|
|
189
217
|
|
|
190
218
|
```bash
|
|
191
219
|
sqlite3 .jettypod/work.db "SELECT worktree_path FROM worktrees WHERE work_item_id = <chore-id> AND status = 'active'"
|
|
@@ -205,13 +233,13 @@ jettypod ui gate worktree-started --data='{"path":"${WORKTREE_PATH}"}'
|
|
|
205
233
|
**Display confirmation:**
|
|
206
234
|
|
|
207
235
|
```
|
|
208
|
-
|
|
236
|
+
Worktree created: ${WORKTREE_PATH}
|
|
209
237
|
|
|
210
238
|
From this point forward, ALL file operations MUST use paths starting with:
|
|
211
239
|
${WORKTREE_PATH}/
|
|
212
240
|
```
|
|
213
241
|
|
|
214
|
-
|
|
242
|
+
**WORKTREE PATH LOCK:** Store `WORKTREE_PATH` - all file operations in this skill MUST use this path prefix.
|
|
215
243
|
|
|
216
244
|
---
|
|
217
245
|
|
|
@@ -230,7 +258,7 @@ jettypod ui gate implementing --data='{"description":"[what is being changed]","
|
|
|
230
258
|
**Display progress:**
|
|
231
259
|
|
|
232
260
|
```
|
|
233
|
-
|
|
261
|
+
Implementing change...
|
|
234
262
|
|
|
235
263
|
Modified: ${WORKTREE_PATH}/[relative path]
|
|
236
264
|
Change: [what was changed]
|
|
@@ -253,7 +281,7 @@ Verifying...
|
|
|
253
281
|
|
|
254
282
|
**If verification passes:**
|
|
255
283
|
|
|
256
|
-
|
|
284
|
+
**WORKTREE PATH REQUIRED:** Use the `WORKTREE_PATH` captured in Step 3.
|
|
257
285
|
|
|
258
286
|
```bash
|
|
259
287
|
# Commit the change
|
|
@@ -261,14 +289,14 @@ cd ${WORKTREE_PATH}
|
|
|
261
289
|
git add .
|
|
262
290
|
git commit -m "fix: [brief description]
|
|
263
291
|
|
|
264
|
-
|
|
292
|
+
Generated with [Claude Code](https://claude.com/claude-code)
|
|
265
293
|
|
|
266
294
|
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>"
|
|
267
295
|
```
|
|
268
296
|
|
|
269
297
|
**Then merge (CRITICAL: run as separate Bash calls):**
|
|
270
298
|
|
|
271
|
-
|
|
299
|
+
Shell CWD persists. You MUST run `cd` as a SEPARATE Bash tool call before merge.
|
|
272
300
|
|
|
273
301
|
```bash
|
|
274
302
|
# Bash call 1: Change to main repo
|
|
@@ -286,12 +314,12 @@ jettypod work cleanup <chore-id>
|
|
|
286
314
|
When `jettypod work merge` encounters an error (e.g., merge conflicts), the worktree is preserved for debugging.
|
|
287
315
|
|
|
288
316
|
```
|
|
289
|
-
|
|
317
|
+
Merge failed: [error message from git]
|
|
290
318
|
|
|
291
319
|
Conflicting files:
|
|
292
320
|
• [list conflicting files if available]
|
|
293
321
|
|
|
294
|
-
|
|
322
|
+
IMPORTANT: The worktree has been PRESERVED for debugging at:
|
|
295
323
|
[worktree-path]
|
|
296
324
|
|
|
297
325
|
Resolution steps:
|
|
@@ -305,15 +333,12 @@ Resolution steps:
|
|
|
305
333
|
Need help? Run: git status (in worktree) to see conflict status
|
|
306
334
|
```
|
|
307
335
|
|
|
308
|
-
|
|
336
|
+
**WAIT for user to resolve conflicts before retrying.**
|
|
309
337
|
|
|
310
338
|
Do NOT attempt to auto-resolve conflicts - let the user handle them manually.
|
|
311
339
|
|
|
312
|
-
**
|
|
313
|
-
|
|
314
|
-
```bash
|
|
315
|
-
jettypod work status <feature-id> done
|
|
316
|
-
```
|
|
340
|
+
**The merge command automatically sets the feature as ready for review.**
|
|
341
|
+
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.
|
|
317
342
|
|
|
318
343
|
**Emit gate signal:**
|
|
319
344
|
|
|
@@ -325,7 +350,7 @@ jettypod ui gate complete --data='{"summary":"[what was changed]","files":["[fil
|
|
|
325
350
|
|
|
326
351
|
```
|
|
327
352
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
328
|
-
|
|
353
|
+
Simple Improvement Complete!
|
|
329
354
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
330
355
|
|
|
331
356
|
Change: [what was changed]
|
|
@@ -354,8 +379,8 @@ No further action needed.
|
|
|
354
379
|
## Command Reference
|
|
355
380
|
|
|
356
381
|
```bash
|
|
357
|
-
# Create chore (no mode)
|
|
358
|
-
jettypod work create
|
|
382
|
+
# Create chore (no mode) - use Write tool for JSON, then:
|
|
383
|
+
jettypod work create --from=/tmp/jettypod-create.json
|
|
359
384
|
|
|
360
385
|
# Start chore
|
|
361
386
|
jettypod work start <chore-id>
|
|
@@ -367,6 +392,5 @@ jettypod work merge <chore-id> # Bash call 2
|
|
|
367
392
|
# Cleanup
|
|
368
393
|
jettypod work cleanup <chore-id>
|
|
369
394
|
|
|
370
|
-
#
|
|
371
|
-
jettypod work status <feature-id> done
|
|
395
|
+
# Do NOT mark feature done manually — merge sets the review gate automatically
|
|
372
396
|
```
|