@ginkoai/cli 1.7.2 → 1.8.0

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 (50) hide show
  1. package/dist/commands/insights/index.d.ts +12 -0
  2. package/dist/commands/insights/index.d.ts.map +1 -0
  3. package/dist/commands/insights/index.js +12 -0
  4. package/dist/commands/insights/index.js.map +1 -0
  5. package/dist/commands/insights/insights-command.d.ts +20 -0
  6. package/dist/commands/insights/insights-command.d.ts.map +1 -0
  7. package/dist/commands/insights/insights-command.js +331 -0
  8. package/dist/commands/insights/insights-command.js.map +1 -0
  9. package/dist/commands/start/start-reflection.d.ts.map +1 -1
  10. package/dist/commands/start/start-reflection.js +50 -13
  11. package/dist/commands/start/start-reflection.js.map +1 -1
  12. package/dist/index.js +30 -0
  13. package/dist/index.js.map +1 -1
  14. package/dist/lib/insights/analyzers/anti-patterns.d.ts +32 -0
  15. package/dist/lib/insights/analyzers/anti-patterns.d.ts.map +1 -0
  16. package/dist/lib/insights/analyzers/anti-patterns.js +302 -0
  17. package/dist/lib/insights/analyzers/anti-patterns.js.map +1 -0
  18. package/dist/lib/insights/analyzers/efficiency.d.ts +22 -0
  19. package/dist/lib/insights/analyzers/efficiency.d.ts.map +1 -0
  20. package/dist/lib/insights/analyzers/efficiency.js +311 -0
  21. package/dist/lib/insights/analyzers/efficiency.js.map +1 -0
  22. package/dist/lib/insights/analyzers/index.d.ts +24 -0
  23. package/dist/lib/insights/analyzers/index.d.ts.map +1 -0
  24. package/dist/lib/insights/analyzers/index.js +37 -0
  25. package/dist/lib/insights/analyzers/index.js.map +1 -0
  26. package/dist/lib/insights/analyzers/patterns.d.ts +21 -0
  27. package/dist/lib/insights/analyzers/patterns.d.ts.map +1 -0
  28. package/dist/lib/insights/analyzers/patterns.js +327 -0
  29. package/dist/lib/insights/analyzers/patterns.js.map +1 -0
  30. package/dist/lib/insights/analyzers/quality.d.ts +29 -0
  31. package/dist/lib/insights/analyzers/quality.d.ts.map +1 -0
  32. package/dist/lib/insights/analyzers/quality.js +366 -0
  33. package/dist/lib/insights/analyzers/quality.js.map +1 -0
  34. package/dist/lib/insights/data-collector.d.ts +68 -0
  35. package/dist/lib/insights/data-collector.d.ts.map +1 -0
  36. package/dist/lib/insights/data-collector.js +467 -0
  37. package/dist/lib/insights/data-collector.js.map +1 -0
  38. package/dist/lib/insights/index.d.ts +14 -0
  39. package/dist/lib/insights/index.d.ts.map +1 -0
  40. package/dist/lib/insights/index.js +17 -0
  41. package/dist/lib/insights/index.js.map +1 -0
  42. package/dist/lib/insights/types.d.ts +216 -0
  43. package/dist/lib/insights/types.d.ts.map +1 -0
  44. package/dist/lib/insights/types.js +12 -0
  45. package/dist/lib/insights/types.js.map +1 -0
  46. package/dist/templates/ai-instructions-template.d.ts +1 -0
  47. package/dist/templates/ai-instructions-template.d.ts.map +1 -1
  48. package/dist/templates/ai-instructions-template.js +51 -0
  49. package/dist/templates/ai-instructions-template.js.map +1 -1
  50. package/package.json +1 -1
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @fileType: command-index
3
+ * @status: current
4
+ * @updated: 2025-12-15
5
+ * @tags: [cli, insights, coaching, command]
6
+ * @related: [insights-command.ts, ../../lib/insights/]
7
+ * @priority: high
8
+ * @complexity: low
9
+ * @dependencies: []
10
+ */
11
+ export { insightsCommand } from './insights-command.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/insights/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @fileType: command-index
3
+ * @status: current
4
+ * @updated: 2025-12-15
5
+ * @tags: [cli, insights, coaching, command]
6
+ * @related: [insights-command.ts, ../../lib/insights/]
7
+ * @priority: high
8
+ * @complexity: low
9
+ * @dependencies: []
10
+ */
11
+ export { insightsCommand } from './insights-command.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/insights/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * @fileType: command
3
+ * @status: current
4
+ * @updated: 2025-12-15
5
+ * @tags: [cli, insights, coaching, analysis]
6
+ * @related: [../../lib/insights/, ../status.ts]
7
+ * @priority: high
8
+ * @complexity: medium
9
+ * @dependencies: [chalk, commander]
10
+ */
11
+ export interface InsightsOptions {
12
+ detailed?: boolean;
13
+ category?: string;
14
+ json?: boolean;
15
+ sync?: boolean;
16
+ days?: number;
17
+ }
18
+ export declare function insightsCommand(options?: InsightsOptions): Promise<void>;
19
+ export default insightsCommand;
20
+ //# sourceMappingURL=insights-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insights-command.d.ts","sourceRoot":"","sources":["../../../src/commands/insights/insights-command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAmBH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAgCD,wBAAsB,eAAe,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BlF;AAuTD,eAAe,eAAe,CAAC"}
@@ -0,0 +1,331 @@
1
+ /**
2
+ * @fileType: command
3
+ * @status: current
4
+ * @updated: 2025-12-15
5
+ * @tags: [cli, insights, coaching, analysis]
6
+ * @related: [../../lib/insights/, ../status.ts]
7
+ * @priority: high
8
+ * @complexity: medium
9
+ * @dependencies: [chalk, commander]
10
+ */
11
+ import chalk from 'chalk';
12
+ import { collectInsightData, getAllAnalyzers, getAnalyzer, } from '../../lib/insights/index.js';
13
+ // ============================================================================
14
+ // Constants
15
+ // ============================================================================
16
+ const SEVERITY_ICONS = {
17
+ info: '○',
18
+ suggestion: '◐',
19
+ warning: '⚠️',
20
+ critical: '🚨',
21
+ };
22
+ const CATEGORY_DISPLAY_NAMES = {
23
+ efficiency: 'Session Efficiency',
24
+ patterns: 'Pattern Adoption',
25
+ quality: 'Collaboration Quality',
26
+ 'anti-patterns': 'Anti-Patterns',
27
+ };
28
+ const SCORE_RATINGS = [
29
+ { min: 90, label: 'Excellent', color: chalk.green },
30
+ { min: 75, label: 'Good', color: chalk.cyan },
31
+ { min: 60, label: 'Fair', color: chalk.yellow },
32
+ { min: 40, label: 'Needs Improvement', color: chalk.hex('#FFA500') },
33
+ { min: 0, label: 'Critical', color: chalk.red },
34
+ ];
35
+ // ============================================================================
36
+ // Main Command
37
+ // ============================================================================
38
+ export async function insightsCommand(options = {}) {
39
+ try {
40
+ const days = options.days ?? 30;
41
+ // Collect data
42
+ console.log(chalk.dim(`Analyzing ${days} days of activity...`));
43
+ const data = await collectInsightData({ days });
44
+ // Run analysis
45
+ const report = await generateReport(data, options.category);
46
+ // Output based on format
47
+ if (options.json) {
48
+ outputJson(report);
49
+ }
50
+ else if (options.detailed) {
51
+ outputDetailed(report);
52
+ }
53
+ else {
54
+ outputSummary(report);
55
+ }
56
+ // Sync to Supabase if requested
57
+ if (options.sync) {
58
+ await syncToSupabase(report);
59
+ }
60
+ }
61
+ catch (error) {
62
+ console.error(chalk.red('Error running insights analysis:'), error instanceof Error ? error.message : String(error));
63
+ process.exit(1);
64
+ }
65
+ }
66
+ // ============================================================================
67
+ // Report Generation
68
+ // ============================================================================
69
+ async function generateReport(data, categoryFilter) {
70
+ const analyzers = categoryFilter
71
+ ? [getAnalyzer(categoryFilter)].filter(Boolean)
72
+ : getAllAnalyzers();
73
+ if (analyzers.length === 0) {
74
+ throw new Error(`Unknown category: ${categoryFilter}. Valid categories: efficiency, patterns, quality, anti-patterns`);
75
+ }
76
+ // Run all analyzers
77
+ const allInsights = [];
78
+ for (const analyzer of analyzers) {
79
+ if (analyzer) {
80
+ const insights = await analyzer.analyze(data);
81
+ allInsights.push(...insights);
82
+ }
83
+ }
84
+ // Calculate category scores
85
+ const categoryScores = calculateCategoryScores(allInsights);
86
+ // Calculate overall score
87
+ const overallScore = calculateOverallScore(categoryScores);
88
+ // Generate summary
89
+ const summary = generateSummary(allInsights, overallScore);
90
+ return {
91
+ userId: data.userId,
92
+ projectId: data.projectId,
93
+ runAt: new Date(),
94
+ period: data.period,
95
+ overallScore,
96
+ categoryScores,
97
+ insights: allInsights,
98
+ summary,
99
+ };
100
+ }
101
+ function calculateCategoryScores(insights) {
102
+ const categories = ['efficiency', 'patterns', 'quality', 'anti-patterns'];
103
+ const scores = [];
104
+ for (const category of categories) {
105
+ const categoryInsights = insights.filter(i => i.category === category);
106
+ const baseScore = 75; // Start with a base score
107
+ // Calculate adjustments from insights
108
+ const adjustments = categoryInsights.reduce((sum, insight) => sum + insight.scoreImpact, 0);
109
+ // Clamp score between 0 and 100
110
+ const score = Math.max(0, Math.min(100, baseScore + adjustments));
111
+ scores.push({
112
+ category,
113
+ score: Math.round(score),
114
+ baseScore,
115
+ adjustments,
116
+ insightCount: categoryInsights.length,
117
+ criticalCount: categoryInsights.filter(i => i.severity === 'critical').length,
118
+ warningCount: categoryInsights.filter(i => i.severity === 'warning').length,
119
+ });
120
+ }
121
+ return scores;
122
+ }
123
+ function calculateOverallScore(categoryScores) {
124
+ if (categoryScores.length === 0)
125
+ return 75;
126
+ // Weight categories (efficiency and quality slightly higher)
127
+ const weights = {
128
+ efficiency: 0.3,
129
+ patterns: 0.2,
130
+ quality: 0.3,
131
+ 'anti-patterns': 0.2,
132
+ };
133
+ let weightedSum = 0;
134
+ let totalWeight = 0;
135
+ for (const cs of categoryScores) {
136
+ const weight = weights[cs.category] || 0.25;
137
+ weightedSum += cs.score * weight;
138
+ totalWeight += weight;
139
+ }
140
+ return Math.round(weightedSum / totalWeight);
141
+ }
142
+ function generateSummary(insights, score) {
143
+ const criticalCount = insights.filter(i => i.severity === 'critical').length;
144
+ const warningCount = insights.filter(i => i.severity === 'warning').length;
145
+ const positiveCount = insights.filter(i => i.scoreImpact > 0).length;
146
+ if (criticalCount > 0) {
147
+ return `${criticalCount} critical issues require immediate attention.`;
148
+ }
149
+ else if (warningCount > 0) {
150
+ return `${warningCount} areas could be improved. ${positiveCount} metrics are performing well.`;
151
+ }
152
+ else if (score >= 90) {
153
+ return `Excellent performance across all metrics. Keep up the great work!`;
154
+ }
155
+ else if (score >= 75) {
156
+ return `Good overall performance with ${positiveCount} strong areas.`;
157
+ }
158
+ else {
159
+ return `Several areas need attention to improve your development workflow.`;
160
+ }
161
+ }
162
+ // ============================================================================
163
+ // Output Formatters
164
+ // ============================================================================
165
+ function outputSummary(report) {
166
+ // Header
167
+ console.log('');
168
+ console.log(chalk.bold(`Coaching Insights`) + chalk.dim(` | ${report.userId} | ${report.projectId}`));
169
+ console.log(chalk.dim(`Analysis period: ${report.period.days} days`));
170
+ console.log('');
171
+ // Category summaries
172
+ for (const categoryScore of report.categoryScores) {
173
+ const displayName = CATEGORY_DISPLAY_NAMES[categoryScore.category];
174
+ const categoryInsights = report.insights.filter(i => i.category === categoryScore.category);
175
+ // Skip empty categories
176
+ if (categoryInsights.length === 0)
177
+ continue;
178
+ console.log(chalk.cyan.bold(displayName));
179
+ // Show top 2 insights per category
180
+ const topInsights = categoryInsights.slice(0, 2);
181
+ for (const insight of topInsights) {
182
+ const icon = SEVERITY_ICONS[insight.severity];
183
+ const titleColor = insight.scoreImpact > 0 ? chalk.green : insight.severity === 'warning' ? chalk.yellow : chalk.white;
184
+ console.log(` ${icon} ${titleColor(insight.title)}`);
185
+ if (insight.description && insight.description.length < 80) {
186
+ console.log(chalk.dim(` ${insight.description}`));
187
+ }
188
+ }
189
+ if (categoryInsights.length > 2) {
190
+ console.log(chalk.dim(` +${categoryInsights.length - 2} more insights`));
191
+ }
192
+ console.log('');
193
+ }
194
+ // Overall score
195
+ const rating = getScoreRating(report.overallScore);
196
+ console.log(chalk.bold('Overall Score: ') + rating.color(`${report.overallScore}/100 (${rating.label})`));
197
+ console.log(chalk.dim(report.summary));
198
+ console.log('');
199
+ console.log(chalk.dim(`Run ${chalk.cyan('ginko insights --detailed')} for full analysis`));
200
+ }
201
+ function outputDetailed(report) {
202
+ // Header
203
+ console.log('');
204
+ console.log(chalk.bold.green('Coaching Insights Report'));
205
+ console.log(chalk.dim('═'.repeat(60)));
206
+ console.log(`User: ${report.userId}`);
207
+ console.log(`Project: ${report.projectId}`);
208
+ console.log(`Period: ${report.period.start.toLocaleDateString()} - ${report.period.end.toLocaleDateString()} (${report.period.days} days)`);
209
+ console.log(`Generated: ${report.runAt.toLocaleString()}`);
210
+ console.log(chalk.dim('═'.repeat(60)));
211
+ console.log('');
212
+ // Category details
213
+ for (const categoryScore of report.categoryScores) {
214
+ const displayName = CATEGORY_DISPLAY_NAMES[categoryScore.category];
215
+ const categoryInsights = report.insights.filter(i => i.category === categoryScore.category);
216
+ if (categoryInsights.length === 0)
217
+ continue;
218
+ const scoreRating = getScoreRating(categoryScore.score);
219
+ console.log(chalk.cyan.bold(`${displayName}`) + chalk.dim(` | Score: `) + scoreRating.color(`${categoryScore.score}/100`));
220
+ console.log(chalk.dim('─'.repeat(50)));
221
+ for (const insight of categoryInsights) {
222
+ const icon = SEVERITY_ICONS[insight.severity];
223
+ const severityColor = getSeverityColor(insight.severity);
224
+ console.log(` ${icon} ${severityColor.bold(insight.title)}`);
225
+ console.log(` ${insight.description}`);
226
+ // Show metric if available
227
+ if (insight.metricValue !== undefined) {
228
+ const metricStr = `${insight.metricName}: ${insight.metricValue}${insight.metricUnit || ''}`;
229
+ const targetStr = insight.metricTarget !== undefined ? ` (target: ${insight.metricTarget}${insight.metricUnit || ''})` : '';
230
+ console.log(chalk.dim(` Metric: ${metricStr}${targetStr}`));
231
+ }
232
+ // Show evidence
233
+ if (insight.evidence.length > 0) {
234
+ console.log(chalk.dim(` Evidence:`));
235
+ for (const ev of insight.evidence.slice(0, 3)) {
236
+ console.log(chalk.dim(` - ${ev.description}`));
237
+ }
238
+ if (insight.evidence.length > 3) {
239
+ console.log(chalk.dim(` ... and ${insight.evidence.length - 3} more`));
240
+ }
241
+ }
242
+ // Show recommendations
243
+ if (insight.recommendations.length > 0) {
244
+ console.log(chalk.yellow.dim(` Recommendations:`));
245
+ for (const rec of insight.recommendations) {
246
+ console.log(chalk.yellow.dim(` - ${rec}`));
247
+ }
248
+ }
249
+ console.log('');
250
+ }
251
+ console.log('');
252
+ }
253
+ // Overall summary
254
+ console.log(chalk.dim('═'.repeat(60)));
255
+ const rating = getScoreRating(report.overallScore);
256
+ console.log(chalk.bold('Overall Score: ') + rating.color(`${report.overallScore}/100 (${rating.label})`));
257
+ console.log('');
258
+ console.log(chalk.bold('Summary: ') + report.summary);
259
+ console.log('');
260
+ // Score breakdown
261
+ console.log(chalk.bold('Category Breakdown:'));
262
+ for (const cs of report.categoryScores) {
263
+ const displayName = CATEGORY_DISPLAY_NAMES[cs.category];
264
+ const rating = getScoreRating(cs.score);
265
+ const bar = generateScoreBar(cs.score);
266
+ console.log(` ${displayName.padEnd(22)} ${bar} ${rating.color(String(cs.score).padStart(3))}`);
267
+ }
268
+ console.log('');
269
+ }
270
+ function outputJson(report) {
271
+ const output = {
272
+ ...report,
273
+ runAt: report.runAt.toISOString(),
274
+ period: {
275
+ ...report.period,
276
+ start: report.period.start.toISOString(),
277
+ end: report.period.end.toISOString(),
278
+ },
279
+ };
280
+ console.log(JSON.stringify(output, null, 2));
281
+ }
282
+ // ============================================================================
283
+ // Supabase Sync
284
+ // ============================================================================
285
+ async function syncToSupabase(report) {
286
+ console.log(chalk.dim('\nSyncing to Supabase...'));
287
+ // TODO: Implement Supabase sync when API is ready
288
+ // This would POST to the dashboard API endpoint:
289
+ // POST /api/v1/insights/sync
290
+ // {
291
+ // userId: report.userId,
292
+ // projectId: report.projectId,
293
+ // overallScore: report.overallScore,
294
+ // categoryScores: report.categoryScores,
295
+ // insights: report.insights,
296
+ // }
297
+ console.log(chalk.yellow('Supabase sync not yet implemented (requires API endpoint)'));
298
+ console.log(chalk.dim('Results saved locally only'));
299
+ }
300
+ // ============================================================================
301
+ // Helper Functions
302
+ // ============================================================================
303
+ function getScoreRating(score) {
304
+ for (const rating of SCORE_RATINGS) {
305
+ if (score >= rating.min) {
306
+ return rating;
307
+ }
308
+ }
309
+ return SCORE_RATINGS[SCORE_RATINGS.length - 1];
310
+ }
311
+ function getSeverityColor(severity) {
312
+ switch (severity) {
313
+ case 'critical':
314
+ return chalk.red;
315
+ case 'warning':
316
+ return chalk.yellow;
317
+ case 'suggestion':
318
+ return chalk.cyan;
319
+ case 'info':
320
+ default:
321
+ return chalk.white;
322
+ }
323
+ }
324
+ function generateScoreBar(score, width = 20) {
325
+ const filled = Math.round((score / 100) * width);
326
+ const empty = width - filled;
327
+ const rating = getScoreRating(score);
328
+ return rating.color('█'.repeat(filled)) + chalk.dim('░'.repeat(empty));
329
+ }
330
+ export default insightsCommand;
331
+ //# sourceMappingURL=insights-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insights-command.js","sourceRoot":"","sources":["../../../src/commands/insights/insights-command.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"start-reflection.d.ts","sourceRoot":"","sources":["../../../src/commands/start/start-reflection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AA8BrE;;;GAGG;AACH,qBAAa,sBAAuB,SAAQ,iBAAiB;IAC3D,OAAO,CAAC,cAAc,CAAuB;;IAQ7C;;OAEG;IACH,OAAO,CAAC,WAAW;IAQnB;;;;OAIG;IACH,OAAO,CAAC,6BAA6B;IA8ErC;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,GAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAyO/D;;;;;OAKG;YACW,kBAAkB;IA6VhC;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC;IA+BlC;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IAsDlF;;OAEG;YACW,WAAW;IAuBzB;;OAEG;YACW,0BAA0B;IA2DxC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqB1B;;OAEG;YACW,aAAa;IAM3B;;OAEG;YACW,iBAAiB;IAU/B;;OAEG;YACW,WAAW;IAKzB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAW5B;;OAEG;IACH,OAAO,CAAC,4BAA4B;IA6BpC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA4CzB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA2B9B;;OAEG;IACG,aAAa,CAAC,YAAY,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAmCpD;;OAEG;IACH,OAAO,CAAC,mBAAmB,CAAC,CAI1B;IAEF;;;;;OAKG;YACW,iBAAiB;IAwI/B;;;;;OAKG;YACW,cAAc;IAuI5B;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;IAM5B;;;;OAIG;YACW,cAAc;IAa5B;;OAEG;YACW,oBAAoB;CAqBnC;AAGD,eAAe,sBAAsB,CAAC"}
1
+ {"version":3,"file":"start-reflection.d.ts","sourceRoot":"","sources":["../../../src/commands/start/start-reflection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AA8BrE;;;GAGG;AACH,qBAAa,sBAAuB,SAAQ,iBAAiB;IAC3D,OAAO,CAAC,cAAc,CAAuB;;IAQ7C;;OAEG;IACH,OAAO,CAAC,WAAW;IAQnB;;;;OAIG;IACH,OAAO,CAAC,6BAA6B;IA8ErC;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,GAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA4Q/D;;;;;OAKG;YACW,kBAAkB;IA6VhC;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC;IA+BlC;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IAsDlF;;OAEG;YACW,WAAW;IAuBzB;;OAEG;YACW,0BAA0B;IA2DxC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqB1B;;OAEG;YACW,aAAa;IAM3B;;OAEG;YACW,iBAAiB;IAU/B;;OAEG;YACW,WAAW;IAKzB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAW5B;;OAEG;IACH,OAAO,CAAC,4BAA4B;IA6BpC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA4CzB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA2B9B;;OAEG;IACG,aAAa,CAAC,YAAY,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAmCpD;;OAEG;IACH,OAAO,CAAC,mBAAmB,CAAC,CAI1B;IAEF;;;;;OAKG;YACW,iBAAiB;IAwI/B;;;;;OAKG;YACW,cAAc;IAuI5B;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;IAM5B;;;;OAIG;YACW,cAAc;IAa5B;;OAEG;YACW,oBAAoB;CAqBnC;AAGD,eAAe,sBAAsB,CAAC"}
@@ -155,33 +155,70 @@ export class StartReflectionCommand extends ReflectionCommand {
155
155
  const sessionDir = path.join(ginkoDir, 'sessions', userSlug);
156
156
  const projectRoot = await getProjectRoot();
157
157
  // Load sprint checklist for session context
158
- // EPIC-005: Graph is primary source of truth for collaborative environments
159
- // Falls back to local files when offline or unauthenticated
158
+ // Strategy: Load both local and graph, use the more complete/current one
159
+ // Local file is authoritative for solo work; graph is authoritative for team collaboration
160
160
  let sprintChecklist = null;
161
161
  let sprintSource = 'local';
162
+ // Always load local sprint first (fast, authoritative for file-based workflows)
163
+ const localSprint = await loadSprintChecklist(projectRoot);
164
+ // Try to load from graph if authenticated
165
+ let graphSprint = null;
162
166
  if (await isAuthenticated() && await isGraphInitialized()) {
163
167
  try {
164
- spinner.text = 'Loading sprint from graph (source of truth)...';
168
+ spinner.text = 'Checking graph for sprint updates...';
165
169
  const graphId = await getGraphId();
166
170
  if (graphId) {
167
171
  const client = new GraphApiClient();
168
- const graphSprint = await client.getActiveSprint(graphId);
169
- // Convert graph response to sprintChecklist format
170
- sprintChecklist = this.convertGraphSprintToChecklist(graphSprint);
171
- sprintSource = 'graph';
172
- spinner.text = `Sprint loaded from graph (${graphSprint.meta?.executionTime || 0}ms)`;
172
+ const graphResponse = await client.getActiveSprint(graphId);
173
+ graphSprint = this.convertGraphSprintToChecklist(graphResponse);
173
174
  }
174
175
  }
175
176
  catch (error) {
176
- // Graph unavailable - fall back to local files
177
- spinner.text = 'Graph unavailable, loading sprint from local files...';
177
+ // Graph unavailable - use local only
178
+ spinner.text = 'Graph unavailable, using local sprint file';
178
179
  }
179
180
  }
180
- // Fallback to local files if graph didn't provide sprint data
181
- if (!sprintChecklist) {
182
- sprintChecklist = await loadSprintChecklist(projectRoot);
181
+ // Compare and choose the more complete/current sprint
182
+ // Priority: Local file is source of truth - it represents what the user is actively working on
183
+ // Graph data may be stale (e.g., still showing Sprint 1 when user moved to Sprint 2)
184
+ if (localSprint && graphSprint) {
185
+ // If the sprints are different (different names), always use local
186
+ // This handles the case where graph hasn't been synced with new sprint
187
+ const localName = localSprint.name?.toLowerCase() || '';
188
+ const graphName = graphSprint.name?.toLowerCase() || '';
189
+ const sprintsAreDifferent = localName !== graphName &&
190
+ !localName.includes(graphName) &&
191
+ !graphName.includes(localName);
192
+ if (sprintsAreDifferent) {
193
+ // Local file is the source of truth for which sprint we're on
194
+ sprintChecklist = localSprint;
195
+ sprintSource = 'local';
196
+ }
197
+ else {
198
+ // Same sprint - prefer local if it has more tasks OR higher completion count
199
+ // This handles case where graph has stale/test data
200
+ const localTotal = localSprint.progress?.total || 0;
201
+ const graphTotal = graphSprint.progress?.total || 0;
202
+ const localProgress = localSprint.progress?.complete || 0;
203
+ const graphProgress = graphSprint.progress?.complete || 0;
204
+ if (localTotal > graphTotal || localProgress > graphProgress) {
205
+ sprintChecklist = localSprint;
206
+ sprintSource = 'local';
207
+ }
208
+ else {
209
+ sprintChecklist = graphSprint;
210
+ sprintSource = 'graph';
211
+ }
212
+ }
213
+ }
214
+ else if (localSprint) {
215
+ sprintChecklist = localSprint;
183
216
  sprintSource = 'local';
184
217
  }
218
+ else if (graphSprint) {
219
+ sprintChecklist = graphSprint;
220
+ sprintSource = 'graph';
221
+ }
185
222
  // Load session log content before archiving
186
223
  const previousSessionLog = await SessionLogManager.loadSessionLog(sessionDir);
187
224
  const hasLog = previousSessionLog.length > 100; // Non-empty log