jettypod 4.4.85 → 4.4.87

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.
@@ -105,6 +105,11 @@ function KanbanCard({ item, epicTitle, showEpic = false, isInFlight = false, onT
105
105
  const hasChores = allChores.length > 0;
106
106
  const hasIncompleteChores = incompleteChores.length > 0;
107
107
 
108
+ // Calculate bugs for expandable section
109
+ const allBugs = item.bugs || [];
110
+ const incompleteBugs = allBugs.filter(b => b.status !== 'done');
111
+ const hasBugs = allBugs.length > 0;
112
+
108
113
  const handleCardClick = () => {
109
114
  router.push(`/work/${item.id}`);
110
115
  };
@@ -186,24 +191,40 @@ function KanbanCard({ item, epicTitle, showEpic = false, isInFlight = false, onT
186
191
  )}
187
192
  </div>
188
193
  </div>
189
- {/* Show expandable chores section for features with chores */}
190
- {hasChores && (
194
+ {/* Show expandable section for features with chores or bugs */}
195
+ {(hasChores || hasBugs) && (
191
196
  <div className={`border-t ${isDone ? 'border-green-200 dark:border-green-800' : 'border-zinc-200 dark:border-zinc-700'}`}>
192
197
  <button
193
198
  onClick={() => setExpanded(!expanded)}
194
- className={`w-full px-3 py-1.5 flex items-center gap-1.5 text-xs transition-colors ${
199
+ className={`w-full px-3 py-1.5 flex items-start gap-1.5 text-xs transition-colors ${
195
200
  isDone
196
201
  ? 'text-green-700 dark:text-green-400 hover:bg-green-100 dark:hover:bg-green-900/30'
197
202
  : 'text-zinc-600 dark:text-zinc-300 hover:bg-zinc-50 dark:hover:bg-zinc-700/50'
198
203
  }`}
199
204
  >
200
- <span>{expanded ? '▼' : '▶'}</span>
201
- <span>🔧</span>
202
- <span>
203
- {isDone
204
- ? `${allChores.length === 0 ? 'no' : allChores.length} chore${allChores.length !== 1 ? 's' : ''}`
205
- : `${incompleteChores.length === 0 ? 'no' : incompleteChores.length}${item.mode ? ` ${item.mode} mode` : ''} chore${incompleteChores.length !== 1 ? 's' : ''} left`}
206
- </span>
205
+ <span className="mt-0.5">{expanded ? '▼' : '▶'}</span>
206
+ <div className="flex flex-col gap-0.5">
207
+ {hasChores && (
208
+ <div className="flex items-center gap-1.5">
209
+ <span>🔧</span>
210
+ <span>
211
+ {isDone
212
+ ? `${allChores.length === 0 ? 'no' : allChores.length} chore${allChores.length !== 1 ? 's' : ''}`
213
+ : `${incompleteChores.length === 0 ? 'no' : incompleteChores.length}${item.mode ? ` ${item.mode} mode` : ''} chore${incompleteChores.length !== 1 ? 's' : ''} left`}
214
+ </span>
215
+ </div>
216
+ )}
217
+ {hasBugs && (
218
+ <div className="flex items-center gap-1.5">
219
+ <span>🐛</span>
220
+ <span>
221
+ {isDone
222
+ ? `${allBugs.length === 0 ? 'no' : allBugs.length} bug${allBugs.length !== 1 ? 's' : ''}`
223
+ : `${incompleteBugs.length === 0 ? 'no' : incompleteBugs.length} bug${incompleteBugs.length !== 1 ? 's' : ''} left`}
224
+ </span>
225
+ </div>
226
+ )}
227
+ </div>
207
228
  </button>
208
229
  {expanded && (
209
230
  <div className="px-3 pb-2 space-y-1">
@@ -237,6 +258,32 @@ function KanbanCard({ item, epicTitle, showEpic = false, isInFlight = false, onT
237
258
  </Link>
238
259
  );
239
260
  })}
261
+ {allBugs.map((bug) => {
262
+ const isComplete = bug.status === 'done';
263
+ return (
264
+ <Link
265
+ key={bug.id}
266
+ href={`/work/${bug.id}`}
267
+ className={`block py-1 px-2 text-xs rounded transition-colors ${
268
+ isComplete
269
+ ? 'bg-green-100 dark:bg-green-900/30 border border-green-200 dark:border-green-800/50'
270
+ : 'hover:bg-zinc-100 dark:hover:bg-zinc-700'
271
+ }`}
272
+ >
273
+ <div className="flex items-center gap-2">
274
+ <span className={`font-mono ${isComplete ? 'text-zinc-500' : 'text-zinc-400'}`}>#{bug.id}</span>
275
+ <span>🐛</span>
276
+ <span className={`truncate ${
277
+ isComplete
278
+ ? 'text-zinc-500'
279
+ : 'text-zinc-700 dark:text-zinc-300'
280
+ }`}>
281
+ {bug.title || <span className="text-zinc-400 italic">(Untitled)</span>}
282
+ </span>
283
+ </div>
284
+ </Link>
285
+ );
286
+ })}
240
287
  </div>
241
288
  )}
242
289
  </div>
@@ -23,6 +23,7 @@ export interface WorkItem {
23
23
  display_order: number | null;
24
24
  children?: WorkItem[];
25
25
  chores?: WorkItem[];
26
+ bugs?: WorkItem[];
26
27
  current_step?: number | null;
27
28
  total_steps?: number | null;
28
29
  }
@@ -279,6 +280,26 @@ export function getKanbanData(doneLimit: number = 50): KanbanData {
279
280
  }
280
281
  }
281
282
 
283
+ // Get all bugs that belong to features (for bug expansion)
284
+ const featureBugs = db.prepare(`
285
+ SELECT b.id, b.type, b.title, b.description, b.status, b.parent_id, b.epic_id,
286
+ b.branch_name, b.mode, b.phase, b.completed_at, b.created_at
287
+ FROM work_items b
288
+ INNER JOIN work_items f ON b.parent_id = f.id
289
+ WHERE b.type = 'bug' AND f.type = 'feature'
290
+ ORDER BY b.id
291
+ `).all() as WorkItem[];
292
+
293
+ // Group bugs by parent feature ID
294
+ const bugsByFeature = new Map<number, WorkItem[]>();
295
+ for (const bug of featureBugs) {
296
+ if (bug.parent_id) {
297
+ const existing = bugsByFeature.get(bug.parent_id) || [];
298
+ existing.push(bug);
299
+ bugsByFeature.set(bug.parent_id, existing);
300
+ }
301
+ }
302
+
282
303
  // Get kanban-eligible items:
283
304
  // - Features (type = 'feature')
284
305
  // - Chores that are NOT children of features (parent is null, or parent is an epic)
@@ -319,9 +340,10 @@ export function getKanbanData(doneLimit: number = 50): KanbanData {
319
340
  // Strip parent_type from the item
320
341
  const { parent_type, ...cleanItem } = item;
321
342
 
322
- // Attach chores to features
343
+ // Attach chores and bugs to features
323
344
  if (cleanItem.type === 'feature') {
324
345
  cleanItem.chores = choresByFeature.get(cleanItem.id) || [];
346
+ cleanItem.bugs = bugsByFeature.get(cleanItem.id) || [];
325
347
  }
326
348
 
327
349
  if (cleanItem.status === 'in_progress') {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jettypod",
3
- "version": "4.4.85",
3
+ "version": "4.4.87",
4
4
  "description": "AI-powered development workflow manager with TDD, BDD, and automatic test generation",
5
5
  "main": "jettypod.js",
6
6
  "bin": {
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: bug-planning
3
- description: Guide structured bug investigation with symptom capture, hypothesis testing, and root cause identification. Invoked by plan-routing when user reports a bug, mentions unexpected behavior, or describes something broken. (project)
3
+ description: Guide structured bug investigation with symptom capture, hypothesis testing, and root cause identification. Invoked by request-routing when user reports a bug, mentions unexpected behavior, or describes something broken. (project)
4
4
  ---
5
5
 
6
6
  # Bug Planning Skill
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: chore-planning
3
- description: Guide standalone chore planning with automatic type classification and routing to chore-mode. Invoked by plan-routing for substantial technical work - refactoring, infrastructure, migrations, or enhancements where the implementation approach is obvious. (project)
3
+ description: Guide standalone chore planning with automatic type classification and routing to chore-mode. Invoked by request-routing for substantial technical work - refactoring, infrastructure, migrations, or enhancements where the implementation approach is obvious. (project)
4
4
  ---
5
5
 
6
6
  # Chore Planning Skill
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: epic-planning
3
- description: Guide epic planning with feature brainstorming and optional architectural decision prototyping. Invoked by plan-routing for large multi-feature initiatives that need to be broken down into features. (project)
3
+ description: Guide epic planning with feature brainstorming and optional architectural decision prototyping. Invoked by request-routing for large multi-feature initiatives that need to be broken down into features. (project)
4
4
  ---
5
5
 
6
6
  # Epic Planning Skill
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: feature-planning
3
- description: Guide feature planning with UX approach exploration and BDD scenario generation. Invoked by plan-routing when implementing NEW user-facing behavior that requires UX decisions (multiple valid approaches to explore). (project)
3
+ description: Guide feature planning with UX approach exploration and BDD scenario generation. Invoked by request-routing when implementing NEW user-facing behavior that requires UX decisions (multiple valid approaches to explore). (project)
4
4
  ---
5
5
 
6
6
  # Feature Planning Skill
@@ -1,9 +1,21 @@
1
1
  ---
2
- name: plan-routing
3
- description: Route work requests to the appropriate planning skill. Use when user describes work they want to do - "build X", "fix Y", "add Z", "plan W". Analyzes intent and complexity to route to bug-planning, chore-planning, feature-planning, epic-planning, or simple-improvement. (project)
2
+ name: request-routing
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
- # Plan Routing Skill
6
+ # Request Routing Skill
7
+
8
+ **⚡ UNIVERSAL ENTRY POINT** - This skill MUST be invoked FIRST when a user describes work they want done.
9
+
10
+ **DO NOT:**
11
+ - Create work items (`jettypod work create`) before invoking this skill
12
+ - Invoke feature-planning, bug-planning, chore-planning, epic-planning, or simple-improvement directly
13
+ - Ask the user what type of work this is
14
+
15
+ **DO:**
16
+ - Invoke this skill immediately when user describes work
17
+ - Let this skill analyze the request and route to the correct workflow
18
+ - The target skill will create work items as needed
7
19
 
8
20
  Routes user work requests to the correct planning workflow with minimal friction.
9
21
 
@@ -185,4 +197,3 @@ After stating your routing decision, immediately invoke the appropriate skill us
185
197
  - `simple-improvement`
186
198
 
187
199
  **This skill ends after invocation.** The target skill takes over.
188
- # Stable mode: Verified ambiguous request handling exists
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: simple-improvement
3
- description: Guide implementation of simple improvements to existing functionality. Invoked by plan-routing for straightforward changes like copy changes, styling tweaks, or minor behavior adjustments where the implementation is obvious. (project)
3
+ description: Guide implementation of simple improvements to existing functionality. Invoked by request-routing for straightforward changes like copy changes, styling tweaks, or minor behavior adjustments where the implementation is obvious. (project)
4
4
  ---
5
5
 
6
6
  # Simple Improvement Skill
@@ -22,7 +22,7 @@ Lightweight workflow for basic enhancements to existing functionality. Bypasses
22
22
 
23
23
  ## When to Use
24
24
 
25
- This skill is invoked by plan-routing when work is identified as a **simple improvement**:
25
+ This skill is invoked by request-routing when work is identified as a **simple improvement**:
26
26
  - Copy/text changes
27
27
  - Styling tweaks
28
28
  - Minor behavior adjustments
@@ -30,7 +30,7 @@ This skill is invoked by plan-routing when work is identified as a **simple impr
30
30
 
31
31
  ## When NOT to Use
32
32
 
33
- Route back to plan-routing for:
33
+ Route back to request-routing for:
34
34
  - New functionality (even if small)
35
35
  - Changes requiring new data models
36
36
  - Complex logic changes
@@ -96,7 +96,7 @@ Scan the user's description for these patterns:
96
96
  | Multiple components | mentions 3+ different files/areas, "also need to" |
97
97
  | Architectural changes | "refactor", "restructure", "new system" |
98
98
 
99
- ❌ **Route back to plan-routing if ANY complexity signal detected:**
99
+ ❌ **Route back to request-routing if ANY complexity signal detected:**
100
100
  - New database tables/columns needed
101
101
  - New API endpoints required
102
102
  - Complex conditional logic
@@ -114,11 +114,11 @@ Scan the user's description for these patterns:
114
114
  ```
115
115
  ⚠️ This change appears to require new data models or architectural changes. This is more than a simple improvement.
116
116
 
117
- I'm routing you back to plan-routing for proper planning.
117
+ I'm routing you back to request-routing for proper planning.
118
118
  ```
119
119
 
120
120
  **Then IMMEDIATELY:**
121
- 1. Invoke plan-routing skill using the Skill tool
121
+ 1. Invoke request-routing skill using the Skill tool
122
122
  2. END this skill (do not continue)
123
123
 
124
124
  **If confirmed simple:**