@ginkoai/cli 2.1.0 → 2.1.1

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.
Files changed (84) hide show
  1. package/dist/commands/graph/api-client.d.ts +12 -1
  2. package/dist/commands/graph/api-client.d.ts.map +1 -1
  3. package/dist/commands/graph/api-client.js +16 -2
  4. package/dist/commands/graph/api-client.js.map +1 -1
  5. package/dist/commands/handoff.d.ts +3 -3
  6. package/dist/commands/handoff.d.ts.map +1 -1
  7. package/dist/commands/handoff.js +32 -3
  8. package/dist/commands/handoff.js.map +1 -1
  9. package/dist/commands/nudging/index.d.ts +24 -0
  10. package/dist/commands/nudging/index.d.ts.map +1 -0
  11. package/dist/commands/nudging/index.js +175 -0
  12. package/dist/commands/nudging/index.js.map +1 -0
  13. package/dist/commands/sprint/create.d.ts +26 -0
  14. package/dist/commands/sprint/create.d.ts.map +1 -0
  15. package/dist/commands/sprint/create.js +269 -0
  16. package/dist/commands/sprint/create.js.map +1 -0
  17. package/dist/commands/sprint/index.d.ts.map +1 -1
  18. package/dist/commands/sprint/index.js +24 -0
  19. package/dist/commands/sprint/index.js.map +1 -1
  20. package/dist/commands/sprint/quick-fix.d.ts +25 -0
  21. package/dist/commands/sprint/quick-fix.d.ts.map +1 -0
  22. package/dist/commands/sprint/quick-fix.js +151 -0
  23. package/dist/commands/sprint/quick-fix.js.map +1 -0
  24. package/dist/commands/sprint/sprint-pipeline-enhanced.d.ts.map +1 -1
  25. package/dist/commands/sprint/sprint-pipeline-enhanced.js +37 -0
  26. package/dist/commands/sprint/sprint-pipeline-enhanced.js.map +1 -1
  27. package/dist/commands/sprint/status.d.ts.map +1 -1
  28. package/dist/commands/sprint/status.js +21 -1
  29. package/dist/commands/sprint/status.js.map +1 -1
  30. package/dist/commands/start/start-reflection.d.ts +14 -0
  31. package/dist/commands/start/start-reflection.d.ts.map +1 -1
  32. package/dist/commands/start/start-reflection.js +180 -9
  33. package/dist/commands/start/start-reflection.js.map +1 -1
  34. package/dist/commands/task/status.d.ts +3 -0
  35. package/dist/commands/task/status.d.ts.map +1 -1
  36. package/dist/commands/task/status.js +48 -1
  37. package/dist/commands/task/status.js.map +1 -1
  38. package/dist/commands/team/index.d.ts +5 -0
  39. package/dist/commands/team/index.d.ts.map +1 -1
  40. package/dist/commands/team/index.js +28 -0
  41. package/dist/commands/team/index.js.map +1 -1
  42. package/dist/commands/team/status.d.ts +16 -0
  43. package/dist/commands/team/status.d.ts.map +1 -0
  44. package/dist/commands/team/status.js +180 -0
  45. package/dist/commands/team/status.js.map +1 -0
  46. package/dist/index.js +10 -3
  47. package/dist/index.js.map +1 -1
  48. package/dist/lib/adoption-score.d.ts +69 -0
  49. package/dist/lib/adoption-score.d.ts.map +1 -0
  50. package/dist/lib/adoption-score.js +206 -0
  51. package/dist/lib/adoption-score.js.map +1 -0
  52. package/dist/lib/coaching-level.d.ts +127 -0
  53. package/dist/lib/coaching-level.d.ts.map +1 -0
  54. package/dist/lib/coaching-level.js +406 -0
  55. package/dist/lib/coaching-level.js.map +1 -0
  56. package/dist/lib/event-logger.d.ts +42 -0
  57. package/dist/lib/event-logger.d.ts.map +1 -1
  58. package/dist/lib/event-logger.js +77 -0
  59. package/dist/lib/event-logger.js.map +1 -1
  60. package/dist/lib/planning-menu.d.ts +69 -0
  61. package/dist/lib/planning-menu.d.ts.map +1 -0
  62. package/dist/lib/planning-menu.js +342 -0
  63. package/dist/lib/planning-menu.js.map +1 -0
  64. package/dist/lib/targeted-coaching.d.ts +71 -0
  65. package/dist/lib/targeted-coaching.d.ts.map +1 -0
  66. package/dist/lib/targeted-coaching.js +318 -0
  67. package/dist/lib/targeted-coaching.js.map +1 -0
  68. package/dist/lib/task-parser.d.ts +2 -0
  69. package/dist/lib/task-parser.d.ts.map +1 -1
  70. package/dist/lib/task-parser.js +23 -0
  71. package/dist/lib/task-parser.js.map +1 -1
  72. package/dist/lib/user-sprint.d.ts +53 -0
  73. package/dist/lib/user-sprint.d.ts.map +1 -1
  74. package/dist/lib/user-sprint.js +137 -2
  75. package/dist/lib/user-sprint.js.map +1 -1
  76. package/dist/lib/work-reconciliation.d.ts +59 -0
  77. package/dist/lib/work-reconciliation.d.ts.map +1 -0
  78. package/dist/lib/work-reconciliation.js +267 -0
  79. package/dist/lib/work-reconciliation.js.map +1 -0
  80. package/dist/utils/version-check.d.ts +26 -0
  81. package/dist/utils/version-check.d.ts.map +1 -0
  82. package/dist/utils/version-check.js +186 -0
  83. package/dist/utils/version-check.js.map +1 -0
  84. package/package.json +2 -2
@@ -0,0 +1,318 @@
1
+ /**
2
+ * @fileType: utility
3
+ * @status: current
4
+ * @updated: 2026-01-26
5
+ * @tags: [coaching, insights, targeted, adaptive, epic-016-s05]
6
+ * @related: [coaching-level.ts, start-reflection.ts, handoff.ts]
7
+ * @priority: medium
8
+ * @complexity: medium
9
+ * @dependencies: [fs-extra, path]
10
+ */
11
+ /**
12
+ * Targeted Coaching Elaborations (EPIC-016 Sprint 5 Task 3)
13
+ *
14
+ * When a specific metric is low, provides focused coaching in that area.
15
+ *
16
+ * Metric-Specific Coaching:
17
+ * | Low Metric | Coaching Focus |
18
+ * |----------------------|---------------------------------------------------------|
19
+ * | Session Efficiency | "Consider using `ginko handoff` to preserve context" |
20
+ * | Pattern Adoption | Extra guidance on Epic→Sprint→Task structure |
21
+ * | Collaboration Quality| Prompts about logging decisions, handoff quality |
22
+ * | Anti-Patterns | Specific warnings about detected anti-patterns |
23
+ *
24
+ * Features:
25
+ * - Track which tips shown to avoid repetition
26
+ * - Inject tips at relevant moments (start, handoff)
27
+ * - No tip spam (shown once per session max)
28
+ */
29
+ import fs from 'fs-extra';
30
+ import path from 'path';
31
+ import chalk from 'chalk';
32
+ import { getUserEmail, getGinkoDir } from '../utils/helpers.js';
33
+ import { isMetricLow } from './coaching-level.js';
34
+ import { logTargetedTipShown } from './event-logger.js';
35
+ // =============================================================================
36
+ // Constants
37
+ // =============================================================================
38
+ const TIPS_RECORD_FILE = 'shown-tips.json';
39
+ const LOW_THRESHOLD = 70;
40
+ /**
41
+ * All available coaching tips organized by metric
42
+ */
43
+ export const COACHING_TIPS = [
44
+ // Session Efficiency Tips
45
+ {
46
+ id: 'efficiency-handoff',
47
+ metric: 'sessionEfficiency',
48
+ context: ['start', 'handoff'],
49
+ message: 'Consider using `ginko handoff` to preserve context between sessions',
50
+ action: 'ginko handoff',
51
+ priority: 10,
52
+ },
53
+ {
54
+ id: 'efficiency-context-loading',
55
+ metric: 'sessionEfficiency',
56
+ context: ['start'],
57
+ message: 'Sessions with good handoffs start 40% faster on average',
58
+ priority: 5,
59
+ },
60
+ {
61
+ id: 'efficiency-log-decisions',
62
+ metric: 'sessionEfficiency',
63
+ context: ['handoff'],
64
+ message: 'Log key decisions with `ginko log` before handoff for better context transfer',
65
+ action: 'ginko log',
66
+ priority: 8,
67
+ },
68
+ // Pattern Adoption Tips
69
+ {
70
+ id: 'patterns-structure',
71
+ metric: 'patternAdoption',
72
+ context: ['start', 'planning'],
73
+ message: 'Try organizing work into Epic→Sprint→Task structure for better tracking',
74
+ priority: 10,
75
+ },
76
+ {
77
+ id: 'patterns-sprint-create',
78
+ metric: 'patternAdoption',
79
+ context: ['planning'],
80
+ message: 'Use `ginko sprint create` to break down work into trackable tasks',
81
+ action: 'ginko sprint create',
82
+ priority: 8,
83
+ },
84
+ {
85
+ id: 'patterns-quick-fix',
86
+ metric: 'patternAdoption',
87
+ context: ['start'],
88
+ message: 'For small fixes, try `ginko sprint qf "description"` for minimal tracking overhead',
89
+ action: 'ginko sprint qf',
90
+ priority: 6,
91
+ },
92
+ // Collaboration Quality Tips
93
+ {
94
+ id: 'quality-log-decisions',
95
+ metric: 'collaborationQuality',
96
+ context: ['start', 'task_complete'],
97
+ message: 'Log important decisions with `ginko log` to help future collaborators',
98
+ action: 'ginko log',
99
+ priority: 10,
100
+ },
101
+ {
102
+ id: 'quality-handoff-content',
103
+ metric: 'collaborationQuality',
104
+ context: ['handoff'],
105
+ message: 'Include what you learned, not just what you did, in handoffs',
106
+ priority: 8,
107
+ },
108
+ {
109
+ id: 'quality-team-sync',
110
+ metric: 'collaborationQuality',
111
+ context: ['start'],
112
+ message: 'Run `ginko sync` periodically to stay aligned with team updates',
113
+ action: 'ginko sync',
114
+ priority: 6,
115
+ },
116
+ // Anti-Patterns Tips
117
+ {
118
+ id: 'antipatterns-review',
119
+ metric: 'antiPatterns',
120
+ context: ['start'],
121
+ message: 'Review recent gotcha warnings - you may be hitting known issues',
122
+ priority: 10,
123
+ },
124
+ {
125
+ id: 'antipatterns-patterns',
126
+ metric: 'antiPatterns',
127
+ context: ['start', 'task_complete'],
128
+ message: 'Check task patterns with `ginko graph explore <task-id>` for guidance',
129
+ action: 'ginko graph explore',
130
+ priority: 8,
131
+ },
132
+ {
133
+ id: 'antipatterns-adr',
134
+ metric: 'antiPatterns',
135
+ context: ['start'],
136
+ message: 'ADR constraints on your current task may help avoid common pitfalls',
137
+ priority: 6,
138
+ },
139
+ ];
140
+ // =============================================================================
141
+ // Shown Tips Tracking
142
+ // =============================================================================
143
+ async function getShownTipsPath() {
144
+ const ginkoDir = await getGinkoDir();
145
+ const userEmail = await getUserEmail();
146
+ const userSlug = userEmail.replace('@', '-at-').replace(/\./g, '-');
147
+ return path.join(ginkoDir, 'sessions', userSlug, TIPS_RECORD_FILE);
148
+ }
149
+ async function loadShownTips() {
150
+ const filePath = await getShownTipsPath();
151
+ try {
152
+ if (await fs.pathExists(filePath)) {
153
+ const data = await fs.readJSON(filePath);
154
+ // Check if this is the same session (within 8 hours)
155
+ const lastUpdated = new Date(data.lastUpdated).getTime();
156
+ const now = Date.now();
157
+ const eightHours = 8 * 60 * 60 * 1000;
158
+ if (now - lastUpdated < eightHours) {
159
+ return data;
160
+ }
161
+ }
162
+ }
163
+ catch {
164
+ // File corrupted or invalid
165
+ }
166
+ // Start fresh session
167
+ return {
168
+ sessionId: generateSessionId(),
169
+ shownTipIds: [],
170
+ lastUpdated: new Date().toISOString(),
171
+ };
172
+ }
173
+ async function saveShownTips(record) {
174
+ const filePath = await getShownTipsPath();
175
+ await fs.ensureDir(path.dirname(filePath));
176
+ record.lastUpdated = new Date().toISOString();
177
+ await fs.writeJSON(filePath, record, { spaces: 2 });
178
+ }
179
+ function generateSessionId() {
180
+ return `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
181
+ }
182
+ async function markTipAsShown(tipId) {
183
+ const record = await loadShownTips();
184
+ if (!record.shownTipIds.includes(tipId)) {
185
+ record.shownTipIds.push(tipId);
186
+ await saveShownTips(record);
187
+ }
188
+ }
189
+ async function isTipShown(tipId) {
190
+ const record = await loadShownTips();
191
+ return record.shownTipIds.includes(tipId);
192
+ }
193
+ // =============================================================================
194
+ // Tip Selection
195
+ // =============================================================================
196
+ /**
197
+ * Get applicable tips for a given context and coaching context
198
+ *
199
+ * @param coachingCtx - Coaching context with metric scores
200
+ * @param context - Current context (start, handoff, etc.)
201
+ * @param limit - Maximum number of tips to return
202
+ * @returns Array of applicable tips, prioritized
203
+ */
204
+ export async function getApplicableTips(coachingCtx, context, limit = 1) {
205
+ // Only show tips in supportive or standard mode
206
+ if (coachingCtx.level === 'minimal') {
207
+ return [];
208
+ }
209
+ const applicableTips = [];
210
+ // Find tips for low metrics
211
+ for (const tip of COACHING_TIPS) {
212
+ // Check if tip applies to this context
213
+ if (!tip.context.includes(context)) {
214
+ continue;
215
+ }
216
+ // Check if the metric is low
217
+ const metricValue = getMetricValue(coachingCtx, tip.metric);
218
+ if (!isMetricLow(metricValue, LOW_THRESHOLD)) {
219
+ continue;
220
+ }
221
+ // Check if already shown this session
222
+ if (await isTipShown(tip.id)) {
223
+ continue;
224
+ }
225
+ applicableTips.push(tip);
226
+ }
227
+ // Sort by priority (highest first) and limit
228
+ return applicableTips
229
+ .sort((a, b) => b.priority - a.priority)
230
+ .slice(0, limit);
231
+ }
232
+ function getMetricValue(ctx, metric) {
233
+ switch (metric) {
234
+ case 'sessionEfficiency':
235
+ return ctx.metrics.sessionEfficiency;
236
+ case 'patternAdoption':
237
+ return ctx.metrics.patternAdoption;
238
+ case 'collaborationQuality':
239
+ return ctx.metrics.collaborationQuality;
240
+ case 'antiPatterns':
241
+ return ctx.metrics.antiPatterns;
242
+ }
243
+ }
244
+ // =============================================================================
245
+ // Display Functions
246
+ // =============================================================================
247
+ /**
248
+ * Display a coaching tip to the console
249
+ */
250
+ export function displayTip(tip) {
251
+ const icon = getTipIcon(tip.metric);
252
+ console.log(chalk.cyan(`${icon} Coaching tip:`));
253
+ console.log(chalk.white(` ${tip.message}`));
254
+ if (tip.action) {
255
+ console.log(chalk.dim(` Try: ${tip.action}`));
256
+ }
257
+ console.log('');
258
+ }
259
+ /**
260
+ * Show targeted coaching tips for the current context
261
+ *
262
+ * @param coachingCtx - Coaching context with metric scores
263
+ * @param context - Current context
264
+ * @returns Number of tips shown
265
+ */
266
+ export async function showTargetedCoaching(coachingCtx, context) {
267
+ const tips = await getApplicableTips(coachingCtx, context);
268
+ for (const tip of tips) {
269
+ displayTip(tip);
270
+ await markTipAsShown(tip.id);
271
+ // EPIC-016 Sprint 5 t05: Log tip shown for feedback loop
272
+ logTargetedTipShown(tip.id, tip.metric, coachingCtx.level).catch(() => {
273
+ // Non-critical - don't fail on logging errors
274
+ });
275
+ }
276
+ return tips.length;
277
+ }
278
+ /**
279
+ * Get coaching tip for a specific metric (for inline use)
280
+ */
281
+ export async function getTipForMetric(coachingCtx, metric, context) {
282
+ const tips = await getApplicableTips(coachingCtx, context);
283
+ const tip = tips.find(t => t.metric === metric);
284
+ return tip ? tip.message : null;
285
+ }
286
+ function getTipIcon(metric) {
287
+ switch (metric) {
288
+ case 'sessionEfficiency':
289
+ return '⚡';
290
+ case 'patternAdoption':
291
+ return '📋';
292
+ case 'collaborationQuality':
293
+ return '🤝';
294
+ case 'antiPatterns':
295
+ return '⚠️';
296
+ }
297
+ }
298
+ // =============================================================================
299
+ // Metric Display Names
300
+ // =============================================================================
301
+ export const METRIC_DISPLAY_NAMES = {
302
+ sessionEfficiency: 'Session Efficiency',
303
+ patternAdoption: 'Pattern Adoption',
304
+ collaborationQuality: 'Collaboration Quality',
305
+ antiPatterns: 'Anti-Patterns',
306
+ };
307
+ // =============================================================================
308
+ // Testing Exports
309
+ // =============================================================================
310
+ export const __testing = {
311
+ LOW_THRESHOLD,
312
+ loadShownTips,
313
+ saveShownTips,
314
+ markTipAsShown,
315
+ isTipShown,
316
+ getMetricValue,
317
+ };
318
+ //# sourceMappingURL=targeted-coaching.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"targeted-coaching.js","sourceRoot":"","sources":["../../src/lib/targeted-coaching.ts"],"names":[],"mappings":"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"}
@@ -34,6 +34,8 @@ export interface ParsedTask {
34
34
  initial_status: TaskStatus;
35
35
  /** Task goal/description */
36
36
  goal: string | null;
37
+ /** Approach/implementation notes (e014_s02_t04) */
38
+ approach: string | null;
37
39
  /** Acceptance criteria list */
38
40
  acceptance_criteria: string[];
39
41
  /** Referenced files */
@@ -1 +1 @@
1
- {"version":3,"file":"task-parser.d.ts","sourceRoot":"","sources":["../../src/lib/task-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAmBH;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,aAAa,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;AAE3F;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,kEAAkE;IAClE,EAAE,EAAE,MAAM,CAAC;IACX,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,qBAAqB;IACrB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,yDAAyD;IACzD,cAAc,EAAE,UAAU,CAAC;IAC3B,4BAA4B;IAC5B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,+BAA+B;IAC/B,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,uBAAuB;IACvB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,6BAA6B;IAC7B,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,mDAAmD;IACnD,EAAE,EAAE,MAAM,CAAC;IACX,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA8BhG;AA4GD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,aAAa,CAAC,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACrD,UAAU,GAAG,IAAI,CAgGnB;AAgFD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,iBAAiB,CAwBrF;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAazF;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAyBtF"}
1
+ {"version":3,"file":"task-parser.d.ts","sourceRoot":"","sources":["../../src/lib/task-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAmBH;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,aAAa,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;AAE3F;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,kEAAkE;IAClE,EAAE,EAAE,MAAM,CAAC;IACX,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,qBAAqB;IACrB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,yDAAyD;IACzD,cAAc,EAAE,UAAU,CAAC;IAC3B,4BAA4B;IAC5B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,mDAAmD;IACnD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,+BAA+B;IAC/B,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,uBAAuB;IACvB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,6BAA6B;IAC7B,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,mDAAmD;IACnD,EAAE,EAAE,MAAM,CAAC;IACX,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA8BhG;AAqID;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,aAAa,CAAC,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACrD,UAAU,GAAG,IAAI,CAoGnB;AAgFD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,iBAAiB,CAwBrF;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAazF;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAyBtF"}
@@ -91,6 +91,26 @@ function normalizePriority(priority) {
91
91
  }
92
92
  return 'MEDIUM';
93
93
  }
94
+ /**
95
+ * Extract approach/implementation notes from task block (e014_s02_t04)
96
+ *
97
+ * Parses the **Approach:** section which contains 2-3 sentences describing
98
+ * how to implement the task.
99
+ */
100
+ function extractApproach(blockText) {
101
+ // Match: **Approach:** followed by text until next section
102
+ const approachMatch = blockText.match(/\*\*Approach:\*\*\s+([\s\S]*?)(?=\n\*\*(?!Approach)|\n###|\n---|\n##|$)/i);
103
+ if (!approachMatch)
104
+ return null;
105
+ // Clean up the approach text - join lines and trim
106
+ const approach = approachMatch[1]
107
+ .split('\n')
108
+ .map(line => line.trim())
109
+ .filter(line => line.length > 0)
110
+ .join(' ')
111
+ .trim();
112
+ return approach.length > 0 ? approach : null;
113
+ }
94
114
  /**
95
115
  * Extract acceptance criteria from task block
96
116
  */
@@ -216,6 +236,8 @@ export function parseTaskBlock(blockText, sprintContext) {
216
236
  // Extract goal
217
237
  const goalMatch = blockText.match(/\*\*Goal:\*\*\s+([^\n]+)/i);
218
238
  const goal = goalMatch ? goalMatch[1].trim() : null;
239
+ // Extract approach (e014_s02_t04)
240
+ const approach = extractApproach(blockText);
219
241
  // Extract acceptance criteria
220
242
  const acceptanceCriteria = extractAcceptanceCriteria(blockText);
221
243
  // Extract files
@@ -232,6 +254,7 @@ export function parseTaskBlock(blockText, sprintContext) {
232
254
  assignee,
233
255
  initial_status: initialStatus,
234
256
  goal,
257
+ approach,
235
258
  acceptance_criteria: acceptanceCriteria,
236
259
  files,
237
260
  related_adrs: relatedADRs,
@@ -1 +1 @@
1
- {"version":3,"file":"task-parser.js","sourceRoot":"","sources":["../../src/lib/task-parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"task-parser.js","sourceRoot":"","sources":["../../src/lib/task-parser.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,21 @@ export interface UserSprintAssignment {
18
18
  sprintName: string;
19
19
  assignedAt: string;
20
20
  assignedBy: 'auto' | 'manual';
21
+ isAdhoc?: boolean;
22
+ consecutiveAdhocSessions?: number;
23
+ lastAdhocSessionAt?: string;
24
+ }
25
+ /**
26
+ * Result of checking user's work structure status (EPIC-016 Sprint 4 t01)
27
+ * Used by start command to determine if planning menu should be shown
28
+ */
29
+ export interface WorkStructureStatus {
30
+ hasStructuredWork: boolean;
31
+ sprintId: string | null;
32
+ incompleteTasks: number;
33
+ consecutiveAdhocSessions: number;
34
+ shouldShowPlanningMenu: boolean;
35
+ reason: 'has_sprint' | 'no_sprint' | 'all_tasks_complete' | 'adhoc_pattern';
21
36
  }
22
37
  /**
23
38
  * Get user's current sprint assignment
@@ -56,4 +71,42 @@ export declare function validateUserSprint(assignment: UserSprintAssignment): Pr
56
71
  * Get sprint file path from user assignment
57
72
  */
58
73
  export declare function getSprintFileFromAssignment(assignment: UserSprintAssignment): Promise<string>;
74
+ /**
75
+ * Check if user has structured work (sprint with incomplete tasks)
76
+ *
77
+ * Decision matrix:
78
+ * | Has Sprint | Has Tasks | Consecutive Adhoc | Result |
79
+ * |------------|-----------|-------------------|--------|
80
+ * | Yes | Yes | Any | Has structured work |
81
+ * | Yes | No (100%) | Any | No structure (complete) |
82
+ * | No | N/A | <= 1 | No structure (new) |
83
+ * | No | N/A | > 1 | No structure (adhoc pattern) |
84
+ *
85
+ * @param userSprint - User's current sprint assignment
86
+ * @param sprintChecklist - Sprint task data from graph/file (with progress info)
87
+ * @returns WorkStructureStatus with decision
88
+ */
89
+ export declare function checkWorkStructure(userSprint: UserSprintAssignment | null, sprintChecklist: {
90
+ progress?: {
91
+ total: number;
92
+ complete: number;
93
+ };
94
+ tasks?: Array<{
95
+ state: string;
96
+ }>;
97
+ } | null): WorkStructureStatus;
98
+ /**
99
+ * Increment ad-hoc session counter
100
+ * Called when user chooses ad-hoc work in planning menu
101
+ */
102
+ export declare function incrementAdhocSessionCount(): Promise<number>;
103
+ /**
104
+ * Reset ad-hoc session counter
105
+ * Called when user starts structured work (creates/selects epic/sprint)
106
+ */
107
+ export declare function resetAdhocSessionCount(): Promise<void>;
108
+ /**
109
+ * Create sprint assignment from sprint ID (for graph-based sprints)
110
+ */
111
+ export declare function createAssignmentFromSprintId(sprintId: string, sprintName: string, assignedBy?: 'auto' | 'manual'): UserSprintAssignment;
59
112
  //# sourceMappingURL=user-sprint.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"user-sprint.d.ts","sourceRoot":"","sources":["../../src/lib/user-sprint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAiBH;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC/B;AAaD;;;GAGG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAoBjF;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,oBAAoB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CAM5D;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA4BzG;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,UAAU,GAAE,MAAM,GAAG,QAAiB,GACrC,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAkBtC;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,oBAAoB,GAC/B,OAAO,CAAC,OAAO,CAAC,CAQlB;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,UAAU,EAAE,oBAAoB,GAC/B,OAAO,CAAC,MAAM,CAAC,CAGjB"}
1
+ {"version":3,"file":"user-sprint.d.ts","sourceRoot":"","sources":["../../src/lib/user-sprint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAiBH;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,QAAQ,CAAC;IAG9B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,wBAAwB,EAAE,MAAM,CAAC;IACjC,sBAAsB,EAAE,OAAO,CAAC;IAChC,MAAM,EAAE,YAAY,GAAG,WAAW,GAAG,oBAAoB,GAAG,eAAe,CAAC;CAC7E;AAaD;;;GAGG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAoBjF;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,oBAAoB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CAM5D;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA4BzG;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,UAAU,GAAE,MAAM,GAAG,QAAiB,GACrC,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAkBtC;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,oBAAoB,GAC/B,OAAO,CAAC,OAAO,CAAC,CAQlB;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,UAAU,EAAE,oBAAoB,GAC/B,OAAO,CAAC,MAAM,CAAC,CAOjB;AAMD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,oBAAoB,GAAG,IAAI,EACvC,eAAe,EAAE;IAAE,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,GAAG,IAAI,GAC3G,mBAAmB,CA2DrB;AAED;;;GAGG;AACH,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,MAAM,CAAC,CAqBlE;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CAa5D;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,UAAU,GAAE,MAAM,GAAG,QAAiB,GACrC,oBAAoB,CAatB"}
@@ -41,8 +41,8 @@ export async function getUserCurrentSprint() {
41
41
  return null;
42
42
  }
43
43
  const data = await fs.readJSON(filePath);
44
- // Validate required fields
45
- if (!data.sprintId || !data.sprintFile) {
44
+ // Validate required fields (sprintFile can be empty for graph-based sprints)
45
+ if (!data.sprintId) {
46
46
  return null;
47
47
  }
48
48
  return data;
@@ -141,7 +141,142 @@ export async function validateUserSprint(assignment) {
141
141
  * Get sprint file path from user assignment
142
142
  */
143
143
  export async function getSprintFileFromAssignment(assignment) {
144
+ // Graph-based sprints have no local file
145
+ if (!assignment.sprintFile) {
146
+ return '';
147
+ }
144
148
  const projectRoot = await requireGinkoRoot();
145
149
  return path.join(projectRoot, assignment.sprintFile);
146
150
  }
151
+ // =============================================================================
152
+ // EPIC-016 Sprint 4: Work Structure Detection (t01)
153
+ // =============================================================================
154
+ /**
155
+ * Check if user has structured work (sprint with incomplete tasks)
156
+ *
157
+ * Decision matrix:
158
+ * | Has Sprint | Has Tasks | Consecutive Adhoc | Result |
159
+ * |------------|-----------|-------------------|--------|
160
+ * | Yes | Yes | Any | Has structured work |
161
+ * | Yes | No (100%) | Any | No structure (complete) |
162
+ * | No | N/A | <= 1 | No structure (new) |
163
+ * | No | N/A | > 1 | No structure (adhoc pattern) |
164
+ *
165
+ * @param userSprint - User's current sprint assignment
166
+ * @param sprintChecklist - Sprint task data from graph/file (with progress info)
167
+ * @returns WorkStructureStatus with decision
168
+ */
169
+ export function checkWorkStructure(userSprint, sprintChecklist) {
170
+ // Case 1: No sprint assignment
171
+ if (!userSprint || !userSprint.sprintId) {
172
+ return {
173
+ hasStructuredWork: false,
174
+ sprintId: null,
175
+ incompleteTasks: 0,
176
+ consecutiveAdhocSessions: userSprint?.consecutiveAdhocSessions || 0,
177
+ shouldShowPlanningMenu: true,
178
+ reason: 'no_sprint'
179
+ };
180
+ }
181
+ // Case 2: Sprint assigned but no checklist data (graph unavailable)
182
+ if (!sprintChecklist) {
183
+ // Trust the sprint assignment, assume structured
184
+ return {
185
+ hasStructuredWork: true,
186
+ sprintId: userSprint.sprintId,
187
+ incompleteTasks: -1, // Unknown
188
+ consecutiveAdhocSessions: 0,
189
+ shouldShowPlanningMenu: false,
190
+ reason: 'has_sprint'
191
+ };
192
+ }
193
+ // Calculate incomplete tasks
194
+ let incompleteTasks;
195
+ if (sprintChecklist.progress) {
196
+ incompleteTasks = sprintChecklist.progress.total - sprintChecklist.progress.complete;
197
+ }
198
+ else if (sprintChecklist.tasks) {
199
+ incompleteTasks = sprintChecklist.tasks.filter(t => t.state === 'todo' || t.state === 'in_progress').length;
200
+ }
201
+ else {
202
+ incompleteTasks = -1; // Unknown
203
+ }
204
+ // Case 3: Sprint with incomplete tasks
205
+ if (incompleteTasks > 0 || incompleteTasks === -1) {
206
+ return {
207
+ hasStructuredWork: true,
208
+ sprintId: userSprint.sprintId,
209
+ incompleteTasks,
210
+ consecutiveAdhocSessions: 0,
211
+ shouldShowPlanningMenu: false,
212
+ reason: 'has_sprint'
213
+ };
214
+ }
215
+ // Case 4: Sprint 100% complete
216
+ return {
217
+ hasStructuredWork: false,
218
+ sprintId: userSprint.sprintId,
219
+ incompleteTasks: 0,
220
+ consecutiveAdhocSessions: userSprint.consecutiveAdhocSessions || 0,
221
+ shouldShowPlanningMenu: true,
222
+ reason: 'all_tasks_complete'
223
+ };
224
+ }
225
+ /**
226
+ * Increment ad-hoc session counter
227
+ * Called when user chooses ad-hoc work in planning menu
228
+ */
229
+ export async function incrementAdhocSessionCount() {
230
+ const filePath = await getUserSprintFilePath();
231
+ let data = {};
232
+ try {
233
+ if (await fs.pathExists(filePath)) {
234
+ data = await fs.readJSON(filePath);
235
+ }
236
+ }
237
+ catch {
238
+ // Start fresh if file is corrupted
239
+ }
240
+ const newCount = (data.consecutiveAdhocSessions || 0) + 1;
241
+ data.isAdhoc = true;
242
+ data.consecutiveAdhocSessions = newCount;
243
+ data.lastAdhocSessionAt = new Date().toISOString();
244
+ await fs.ensureDir(path.dirname(filePath));
245
+ await fs.writeJSON(filePath, data, { spaces: 2 });
246
+ return newCount;
247
+ }
248
+ /**
249
+ * Reset ad-hoc session counter
250
+ * Called when user starts structured work (creates/selects epic/sprint)
251
+ */
252
+ export async function resetAdhocSessionCount() {
253
+ const filePath = await getUserSprintFilePath();
254
+ try {
255
+ if (await fs.pathExists(filePath)) {
256
+ const data = await fs.readJSON(filePath);
257
+ data.isAdhoc = false;
258
+ data.consecutiveAdhocSessions = 0;
259
+ await fs.writeJSON(filePath, data, { spaces: 2 });
260
+ }
261
+ }
262
+ catch {
263
+ // Ignore errors - non-critical
264
+ }
265
+ }
266
+ /**
267
+ * Create sprint assignment from sprint ID (for graph-based sprints)
268
+ */
269
+ export function createAssignmentFromSprintId(sprintId, sprintName, assignedBy = 'auto') {
270
+ // Extract epic ID from sprint ID (e.g., e016_s04 -> e016, adhoc_260126_s01 -> adhoc_260126)
271
+ const parts = sprintId.split('_s');
272
+ const epicId = parts[0] || sprintId;
273
+ return {
274
+ sprintId,
275
+ epicId,
276
+ sprintFile: '', // Graph-based, no local file
277
+ sprintName,
278
+ assignedAt: new Date().toISOString(),
279
+ assignedBy
280
+ };
281
+ }
147
282
  //# sourceMappingURL=user-sprint.js.map