@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.
- package/dist/commands/insights/index.d.ts +12 -0
- package/dist/commands/insights/index.d.ts.map +1 -0
- package/dist/commands/insights/index.js +12 -0
- package/dist/commands/insights/index.js.map +1 -0
- package/dist/commands/insights/insights-command.d.ts +20 -0
- package/dist/commands/insights/insights-command.d.ts.map +1 -0
- package/dist/commands/insights/insights-command.js +331 -0
- package/dist/commands/insights/insights-command.js.map +1 -0
- package/dist/commands/start/start-reflection.d.ts.map +1 -1
- package/dist/commands/start/start-reflection.js +50 -13
- package/dist/commands/start/start-reflection.js.map +1 -1
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/insights/analyzers/anti-patterns.d.ts +32 -0
- package/dist/lib/insights/analyzers/anti-patterns.d.ts.map +1 -0
- package/dist/lib/insights/analyzers/anti-patterns.js +302 -0
- package/dist/lib/insights/analyzers/anti-patterns.js.map +1 -0
- package/dist/lib/insights/analyzers/efficiency.d.ts +22 -0
- package/dist/lib/insights/analyzers/efficiency.d.ts.map +1 -0
- package/dist/lib/insights/analyzers/efficiency.js +311 -0
- package/dist/lib/insights/analyzers/efficiency.js.map +1 -0
- package/dist/lib/insights/analyzers/index.d.ts +24 -0
- package/dist/lib/insights/analyzers/index.d.ts.map +1 -0
- package/dist/lib/insights/analyzers/index.js +37 -0
- package/dist/lib/insights/analyzers/index.js.map +1 -0
- package/dist/lib/insights/analyzers/patterns.d.ts +21 -0
- package/dist/lib/insights/analyzers/patterns.d.ts.map +1 -0
- package/dist/lib/insights/analyzers/patterns.js +327 -0
- package/dist/lib/insights/analyzers/patterns.js.map +1 -0
- package/dist/lib/insights/analyzers/quality.d.ts +29 -0
- package/dist/lib/insights/analyzers/quality.d.ts.map +1 -0
- package/dist/lib/insights/analyzers/quality.js +366 -0
- package/dist/lib/insights/analyzers/quality.js.map +1 -0
- package/dist/lib/insights/data-collector.d.ts +68 -0
- package/dist/lib/insights/data-collector.d.ts.map +1 -0
- package/dist/lib/insights/data-collector.js +467 -0
- package/dist/lib/insights/data-collector.js.map +1 -0
- package/dist/lib/insights/index.d.ts +14 -0
- package/dist/lib/insights/index.d.ts.map +1 -0
- package/dist/lib/insights/index.js +17 -0
- package/dist/lib/insights/index.js.map +1 -0
- package/dist/lib/insights/types.d.ts +216 -0
- package/dist/lib/insights/types.d.ts.map +1 -0
- package/dist/lib/insights/types.js +12 -0
- package/dist/lib/insights/types.js.map +1 -0
- package/dist/templates/ai-instructions-template.d.ts +1 -0
- package/dist/templates/ai-instructions-template.d.ts.map +1 -1
- package/dist/templates/ai-instructions-template.js +51 -0
- package/dist/templates/ai-instructions-template.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: analyzer
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2025-12-15
|
|
5
|
+
* @tags: [insights, analyzer, quality, tasks, commits]
|
|
6
|
+
* @related: [../types.ts, ../data-collector.ts]
|
|
7
|
+
* @priority: high
|
|
8
|
+
* @complexity: medium
|
|
9
|
+
* @dependencies: []
|
|
10
|
+
*/
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// Configuration
|
|
13
|
+
// ============================================================================
|
|
14
|
+
const THRESHOLDS = {
|
|
15
|
+
// Task completion rate (percentage)
|
|
16
|
+
taskCompletion: {
|
|
17
|
+
excellent: 90, // > 90% is excellent
|
|
18
|
+
good: 70, // > 70% is good
|
|
19
|
+
warning: 50, // < 50% is warning
|
|
20
|
+
},
|
|
21
|
+
// Commits per session
|
|
22
|
+
commitsPerSession: {
|
|
23
|
+
excellent: 5, // > 5 is excellent
|
|
24
|
+
good: 2, // > 2 is good
|
|
25
|
+
warning: 0, // 0 is warning
|
|
26
|
+
},
|
|
27
|
+
// Average commit size (lines changed)
|
|
28
|
+
commitSize: {
|
|
29
|
+
optimal: { min: 20, max: 150 }, // 20-150 lines is optimal
|
|
30
|
+
warning: { max: 500 }, // > 500 lines is warning
|
|
31
|
+
},
|
|
32
|
+
// Event logging rate (events per session)
|
|
33
|
+
// Replaces handoff metric per PATTERN-001: Ephemeral Sessions
|
|
34
|
+
// Context is preserved via defensive logging, not handoffs
|
|
35
|
+
eventLoggingRate: {
|
|
36
|
+
excellent: 5, // > 5 events per session is excellent
|
|
37
|
+
good: 2, // > 2 is good
|
|
38
|
+
warning: 1, // < 1 is warning (silent sessions)
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
// ============================================================================
|
|
42
|
+
// Collaboration Quality Analyzer
|
|
43
|
+
// ============================================================================
|
|
44
|
+
export class QualityAnalyzer {
|
|
45
|
+
category = 'quality';
|
|
46
|
+
async analyze(data) {
|
|
47
|
+
const insights = [];
|
|
48
|
+
// Analyze each metric
|
|
49
|
+
insights.push(...this.analyzeTaskCompletion(data));
|
|
50
|
+
insights.push(...this.analyzeCommitFrequency(data));
|
|
51
|
+
insights.push(...this.analyzeCommitSize(data));
|
|
52
|
+
insights.push(...this.analyzeHandoffQuality(data));
|
|
53
|
+
insights.push(...this.analyzeSprintVelocity(data));
|
|
54
|
+
return insights;
|
|
55
|
+
}
|
|
56
|
+
// ===========================================================================
|
|
57
|
+
// Task Completion Analysis
|
|
58
|
+
// ===========================================================================
|
|
59
|
+
analyzeTaskCompletion(data) {
|
|
60
|
+
const insights = [];
|
|
61
|
+
if (data.tasks.total === 0) {
|
|
62
|
+
insights.push({
|
|
63
|
+
category: this.category,
|
|
64
|
+
severity: 'info',
|
|
65
|
+
title: 'No tasks tracked',
|
|
66
|
+
description: 'Use sprint files to track task progress and get completion insights.',
|
|
67
|
+
scoreImpact: 0,
|
|
68
|
+
evidence: [],
|
|
69
|
+
recommendations: ['Create docs/sprints/CURRENT-SPRINT.md with tasks'],
|
|
70
|
+
});
|
|
71
|
+
return insights;
|
|
72
|
+
}
|
|
73
|
+
const completionRate = data.tasks.completionRate;
|
|
74
|
+
const evidence = data.tasks.completed.slice(0, 3).map(t => ({
|
|
75
|
+
type: 'task',
|
|
76
|
+
id: t.id,
|
|
77
|
+
description: `Completed: ${t.title}`,
|
|
78
|
+
}));
|
|
79
|
+
if (completionRate >= THRESHOLDS.taskCompletion.excellent) {
|
|
80
|
+
insights.push({
|
|
81
|
+
category: this.category,
|
|
82
|
+
severity: 'info',
|
|
83
|
+
title: 'Excellent task completion',
|
|
84
|
+
description: `${Math.round(completionRate)}% task completion rate. You're executing consistently.`,
|
|
85
|
+
metricName: 'task_completion_rate',
|
|
86
|
+
metricValue: completionRate,
|
|
87
|
+
metricTarget: THRESHOLDS.taskCompletion.excellent,
|
|
88
|
+
metricUnit: '%',
|
|
89
|
+
scoreImpact: 15,
|
|
90
|
+
evidence,
|
|
91
|
+
recommendations: [],
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
else if (completionRate >= THRESHOLDS.taskCompletion.good) {
|
|
95
|
+
insights.push({
|
|
96
|
+
category: this.category,
|
|
97
|
+
severity: 'info',
|
|
98
|
+
title: 'Good task completion',
|
|
99
|
+
description: `${Math.round(completionRate)}% task completion rate. Room for improvement.`,
|
|
100
|
+
metricName: 'task_completion_rate',
|
|
101
|
+
metricValue: completionRate,
|
|
102
|
+
metricTarget: THRESHOLDS.taskCompletion.good,
|
|
103
|
+
metricUnit: '%',
|
|
104
|
+
scoreImpact: 5,
|
|
105
|
+
evidence,
|
|
106
|
+
recommendations: ['Break large tasks into smaller, completable chunks'],
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
else if (completionRate < THRESHOLDS.taskCompletion.warning) {
|
|
110
|
+
const inProgressCount = data.tasks.inProgress.length + data.tasks.abandoned.length;
|
|
111
|
+
insights.push({
|
|
112
|
+
category: this.category,
|
|
113
|
+
severity: 'warning',
|
|
114
|
+
title: 'Low task completion',
|
|
115
|
+
description: `Only ${Math.round(completionRate)}% completion with ${inProgressCount} tasks stuck in progress.`,
|
|
116
|
+
metricName: 'task_completion_rate',
|
|
117
|
+
metricValue: completionRate,
|
|
118
|
+
metricTarget: THRESHOLDS.taskCompletion.good,
|
|
119
|
+
metricUnit: '%',
|
|
120
|
+
scoreImpact: -20,
|
|
121
|
+
evidence: data.tasks.inProgress.slice(0, 3).map(t => ({
|
|
122
|
+
type: 'task',
|
|
123
|
+
id: t.id,
|
|
124
|
+
description: `In progress ${t.daysInProgress} days: ${t.title}`,
|
|
125
|
+
})),
|
|
126
|
+
recommendations: [
|
|
127
|
+
'Review in-progress tasks and identify blockers',
|
|
128
|
+
'Break large tasks into smaller deliverables',
|
|
129
|
+
'Consider pausing or descoping stuck tasks',
|
|
130
|
+
],
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
return insights;
|
|
134
|
+
}
|
|
135
|
+
// ===========================================================================
|
|
136
|
+
// Commit Frequency Analysis
|
|
137
|
+
// ===========================================================================
|
|
138
|
+
analyzeCommitFrequency(data) {
|
|
139
|
+
const insights = [];
|
|
140
|
+
if (data.sessions.length === 0)
|
|
141
|
+
return insights;
|
|
142
|
+
const commitsPerSession = data.commits.length / data.sessions.length;
|
|
143
|
+
const evidence = data.commits.slice(0, 3).map(c => ({
|
|
144
|
+
type: 'commit',
|
|
145
|
+
id: c.hash,
|
|
146
|
+
description: c.message.substring(0, 60),
|
|
147
|
+
timestamp: c.timestamp,
|
|
148
|
+
}));
|
|
149
|
+
if (commitsPerSession >= THRESHOLDS.commitsPerSession.excellent) {
|
|
150
|
+
insights.push({
|
|
151
|
+
category: this.category,
|
|
152
|
+
severity: 'info',
|
|
153
|
+
title: 'Strong commit frequency',
|
|
154
|
+
description: `${commitsPerSession.toFixed(1)} commits per session. Frequent commits improve traceability.`,
|
|
155
|
+
metricName: 'commits_per_session',
|
|
156
|
+
metricValue: commitsPerSession,
|
|
157
|
+
metricTarget: THRESHOLDS.commitsPerSession.excellent,
|
|
158
|
+
scoreImpact: 10,
|
|
159
|
+
evidence,
|
|
160
|
+
recommendations: [],
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
else if (commitsPerSession >= THRESHOLDS.commitsPerSession.good) {
|
|
164
|
+
insights.push({
|
|
165
|
+
category: this.category,
|
|
166
|
+
severity: 'info',
|
|
167
|
+
title: 'Good commit frequency',
|
|
168
|
+
description: `${commitsPerSession.toFixed(1)} commits per session.`,
|
|
169
|
+
metricName: 'commits_per_session',
|
|
170
|
+
metricValue: commitsPerSession,
|
|
171
|
+
scoreImpact: 5,
|
|
172
|
+
evidence,
|
|
173
|
+
recommendations: ['Consider committing more frequently'],
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
else if (commitsPerSession <= THRESHOLDS.commitsPerSession.warning) {
|
|
177
|
+
insights.push({
|
|
178
|
+
category: this.category,
|
|
179
|
+
severity: 'suggestion',
|
|
180
|
+
title: 'Low commit frequency',
|
|
181
|
+
description: `${commitsPerSession.toFixed(1)} commits per session. More frequent commits improve recovery and review.`,
|
|
182
|
+
metricName: 'commits_per_session',
|
|
183
|
+
metricValue: commitsPerSession,
|
|
184
|
+
metricTarget: THRESHOLDS.commitsPerSession.good,
|
|
185
|
+
scoreImpact: -10,
|
|
186
|
+
evidence: [],
|
|
187
|
+
recommendations: [
|
|
188
|
+
'Commit after completing each logical change',
|
|
189
|
+
'Use atomic commits for better git history',
|
|
190
|
+
'Commit before major refactors or experiments',
|
|
191
|
+
],
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
return insights;
|
|
195
|
+
}
|
|
196
|
+
// ===========================================================================
|
|
197
|
+
// Commit Size Analysis
|
|
198
|
+
// ===========================================================================
|
|
199
|
+
analyzeCommitSize(data) {
|
|
200
|
+
const insights = [];
|
|
201
|
+
if (data.commits.length === 0)
|
|
202
|
+
return insights;
|
|
203
|
+
const avgSize = Math.round(data.commits.reduce((sum, c) => sum + c.linesAdded + c.linesRemoved, 0) /
|
|
204
|
+
data.commits.length);
|
|
205
|
+
const largeCommits = data.commits.filter(c => c.linesAdded + c.linesRemoved > THRESHOLDS.commitSize.warning.max);
|
|
206
|
+
const evidence = largeCommits.slice(0, 3).map(c => ({
|
|
207
|
+
type: 'commit',
|
|
208
|
+
id: c.hash,
|
|
209
|
+
description: `${c.linesAdded + c.linesRemoved} lines: ${c.message.substring(0, 40)}`,
|
|
210
|
+
timestamp: c.timestamp,
|
|
211
|
+
}));
|
|
212
|
+
if (avgSize >= THRESHOLDS.commitSize.optimal.min &&
|
|
213
|
+
avgSize <= THRESHOLDS.commitSize.optimal.max) {
|
|
214
|
+
insights.push({
|
|
215
|
+
category: this.category,
|
|
216
|
+
severity: 'info',
|
|
217
|
+
title: 'Optimal commit size',
|
|
218
|
+
description: `Average ${avgSize} lines per commit. This size is easy to review and revert.`,
|
|
219
|
+
metricName: 'avg_commit_size',
|
|
220
|
+
metricValue: avgSize,
|
|
221
|
+
metricUnit: 'lines',
|
|
222
|
+
scoreImpact: 10,
|
|
223
|
+
evidence: [],
|
|
224
|
+
recommendations: [],
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
else if (largeCommits.length > 0) {
|
|
228
|
+
insights.push({
|
|
229
|
+
category: this.category,
|
|
230
|
+
severity: 'suggestion',
|
|
231
|
+
title: 'Large commits detected',
|
|
232
|
+
description: `${largeCommits.length} commits exceed 500 lines. Smaller commits are easier to review.`,
|
|
233
|
+
metricName: 'large_commit_count',
|
|
234
|
+
metricValue: largeCommits.length,
|
|
235
|
+
scoreImpact: -5,
|
|
236
|
+
evidence,
|
|
237
|
+
recommendations: [
|
|
238
|
+
'Break large changes into logical commits',
|
|
239
|
+
'Commit refactors separately from features',
|
|
240
|
+
'Use git add -p for partial staging',
|
|
241
|
+
],
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
return insights;
|
|
245
|
+
}
|
|
246
|
+
// ===========================================================================
|
|
247
|
+
// Event Logging Quality Analysis (PATTERN-001: Ephemeral Sessions)
|
|
248
|
+
// ===========================================================================
|
|
249
|
+
/**
|
|
250
|
+
* Analyzes event logging rate instead of handoff rate.
|
|
251
|
+
*
|
|
252
|
+
* Per PATTERN-001: Sessions are ephemeral with 2-3 day validity.
|
|
253
|
+
* Context is preserved via defensive logging (events), not handoffs.
|
|
254
|
+
* Handoffs are optional - what matters is continuous event capture.
|
|
255
|
+
*/
|
|
256
|
+
analyzeHandoffQuality(data) {
|
|
257
|
+
const insights = [];
|
|
258
|
+
if (data.sessions.length === 0)
|
|
259
|
+
return insights;
|
|
260
|
+
// Calculate events per session (defensive logging metric)
|
|
261
|
+
const eventsPerSession = data.events.length / data.sessions.length;
|
|
262
|
+
// Find sessions with good logging
|
|
263
|
+
const wellLoggedSessions = data.sessions.filter(s => s.eventCount >= 2);
|
|
264
|
+
const loggingRate = Math.round((wellLoggedSessions.length / data.sessions.length) * 100);
|
|
265
|
+
const evidence = wellLoggedSessions.slice(0, 3).map(s => ({
|
|
266
|
+
type: 'session',
|
|
267
|
+
id: s.id,
|
|
268
|
+
description: `${s.eventCount} events logged`,
|
|
269
|
+
timestamp: s.startedAt,
|
|
270
|
+
}));
|
|
271
|
+
if (eventsPerSession >= THRESHOLDS.eventLoggingRate.excellent) {
|
|
272
|
+
insights.push({
|
|
273
|
+
category: this.category,
|
|
274
|
+
severity: 'info',
|
|
275
|
+
title: 'Strong defensive logging',
|
|
276
|
+
description: `${eventsPerSession.toFixed(1)} events per session. Context is well-captured.`,
|
|
277
|
+
metricName: 'events_per_session',
|
|
278
|
+
metricValue: eventsPerSession,
|
|
279
|
+
metricTarget: THRESHOLDS.eventLoggingRate.excellent,
|
|
280
|
+
scoreImpact: 10,
|
|
281
|
+
evidence,
|
|
282
|
+
recommendations: [],
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
else if (eventsPerSession >= THRESHOLDS.eventLoggingRate.good) {
|
|
286
|
+
insights.push({
|
|
287
|
+
category: this.category,
|
|
288
|
+
severity: 'info',
|
|
289
|
+
title: 'Good event logging',
|
|
290
|
+
description: `${eventsPerSession.toFixed(1)} events per session. Consider logging more insights.`,
|
|
291
|
+
metricName: 'events_per_session',
|
|
292
|
+
metricValue: eventsPerSession,
|
|
293
|
+
metricTarget: THRESHOLDS.eventLoggingRate.good,
|
|
294
|
+
scoreImpact: 5,
|
|
295
|
+
evidence,
|
|
296
|
+
recommendations: ['Log decisions and gotchas, not just completions'],
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
else if (eventsPerSession < THRESHOLDS.eventLoggingRate.warning) {
|
|
300
|
+
const silentSessions = data.sessions.filter(s => s.eventCount === 0);
|
|
301
|
+
insights.push({
|
|
302
|
+
category: this.category,
|
|
303
|
+
severity: 'suggestion',
|
|
304
|
+
title: 'Low event logging',
|
|
305
|
+
description: `${eventsPerSession.toFixed(1)} events per session. Context may be lost between sessions.`,
|
|
306
|
+
metricName: 'events_per_session',
|
|
307
|
+
metricValue: eventsPerSession,
|
|
308
|
+
metricTarget: THRESHOLDS.eventLoggingRate.good,
|
|
309
|
+
scoreImpact: -10,
|
|
310
|
+
evidence: silentSessions.slice(0, 3).map(s => ({
|
|
311
|
+
type: 'session',
|
|
312
|
+
id: s.id,
|
|
313
|
+
description: 'Silent session (no events)',
|
|
314
|
+
timestamp: s.startedAt,
|
|
315
|
+
})),
|
|
316
|
+
recommendations: [
|
|
317
|
+
'Use `ginko log` after fixes, features, and decisions',
|
|
318
|
+
'Log insights while context is fresh (low pressure)',
|
|
319
|
+
'Aim for 3-5 events per session for good continuity',
|
|
320
|
+
],
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
return insights;
|
|
324
|
+
}
|
|
325
|
+
// ===========================================================================
|
|
326
|
+
// Sprint Velocity Analysis
|
|
327
|
+
// ===========================================================================
|
|
328
|
+
analyzeSprintVelocity(data) {
|
|
329
|
+
const insights = [];
|
|
330
|
+
// Calculate events per day as a velocity proxy
|
|
331
|
+
const eventsPerDay = data.events.length / data.period.days;
|
|
332
|
+
if (eventsPerDay >= 5) {
|
|
333
|
+
insights.push({
|
|
334
|
+
category: this.category,
|
|
335
|
+
severity: 'info',
|
|
336
|
+
title: 'High activity level',
|
|
337
|
+
description: `${eventsPerDay.toFixed(1)} logged events per day. Strong engagement with the project.`,
|
|
338
|
+
metricName: 'events_per_day',
|
|
339
|
+
metricValue: eventsPerDay,
|
|
340
|
+
scoreImpact: 5,
|
|
341
|
+
evidence: [],
|
|
342
|
+
recommendations: [],
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
else if (eventsPerDay < 1) {
|
|
346
|
+
insights.push({
|
|
347
|
+
category: this.category,
|
|
348
|
+
severity: 'suggestion',
|
|
349
|
+
title: 'Low activity logged',
|
|
350
|
+
description: `${eventsPerDay.toFixed(1)} events per day. Consider logging more insights.`,
|
|
351
|
+
metricName: 'events_per_day',
|
|
352
|
+
metricValue: eventsPerDay,
|
|
353
|
+
scoreImpact: -5,
|
|
354
|
+
evidence: [],
|
|
355
|
+
recommendations: [
|
|
356
|
+
'Use `ginko log` after completing features or fixes',
|
|
357
|
+
'Log decisions and insights, not just code changes',
|
|
358
|
+
'Capture gotchas and patterns as you discover them',
|
|
359
|
+
],
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
return insights;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
export default QualityAnalyzer;
|
|
366
|
+
//# sourceMappingURL=quality.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality.js","sourceRoot":"","sources":["../../../../src/lib/insights/analyzers/quality.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: utility
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2025-12-15
|
|
5
|
+
* @tags: [insights, data-collection, events, tasks, commits]
|
|
6
|
+
* @related: [types.ts, ../event-logger.ts, ../sprint-parser.ts]
|
|
7
|
+
* @priority: high
|
|
8
|
+
* @complexity: high
|
|
9
|
+
* @dependencies: [fs, path, child_process]
|
|
10
|
+
*/
|
|
11
|
+
import { InsightData, EventData, TaskData, CommitData, SessionData, PatternData, GotchaData } from './types.js';
|
|
12
|
+
export interface CollectorOptions {
|
|
13
|
+
days?: number;
|
|
14
|
+
projectRoot?: string;
|
|
15
|
+
userId?: string;
|
|
16
|
+
graphId?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Collects and aggregates data from all sources for insight analysis.
|
|
20
|
+
* Uses findGinkoRoot to locate .ginko at monorepo root (like git finds .git).
|
|
21
|
+
*/
|
|
22
|
+
export declare function collectInsightData(options?: CollectorOptions): Promise<InsightData>;
|
|
23
|
+
/**
|
|
24
|
+
* Collect events from local JSONL files.
|
|
25
|
+
*/
|
|
26
|
+
declare function collectEvents(projectRoot: string, userId: string, start: Date, end: Date): Promise<EventData[]>;
|
|
27
|
+
/**
|
|
28
|
+
* Collect task data from sprint files.
|
|
29
|
+
*/
|
|
30
|
+
declare function collectTasks(projectRoot: string, start: Date, end: Date): Promise<TaskData>;
|
|
31
|
+
/**
|
|
32
|
+
* Collect commit data from git log.
|
|
33
|
+
*/
|
|
34
|
+
declare function collectCommits(projectRoot: string, start: Date, end: Date): Promise<CommitData[]>;
|
|
35
|
+
/**
|
|
36
|
+
* Collect session data from archive files.
|
|
37
|
+
*/
|
|
38
|
+
declare function collectSessions(projectRoot: string, userId: string, start: Date, end: Date): Promise<SessionData[]>;
|
|
39
|
+
/**
|
|
40
|
+
* Collect pattern data from local docs.
|
|
41
|
+
*/
|
|
42
|
+
declare function collectPatterns(projectRoot: string): Promise<PatternData[]>;
|
|
43
|
+
/**
|
|
44
|
+
* Collect gotcha data from local docs.
|
|
45
|
+
*/
|
|
46
|
+
declare function collectGotchas(projectRoot: string): Promise<GotchaData[]>;
|
|
47
|
+
/**
|
|
48
|
+
* Detect user ID from git config or session files.
|
|
49
|
+
*/
|
|
50
|
+
declare function detectUserId(projectRoot: string): string;
|
|
51
|
+
/**
|
|
52
|
+
* Detect project ID from directory name or package.json.
|
|
53
|
+
*/
|
|
54
|
+
declare function detectProjectId(projectRoot: string): string;
|
|
55
|
+
/**
|
|
56
|
+
* Extract ADR references from text.
|
|
57
|
+
*/
|
|
58
|
+
declare function extractADRRefs(text: string): string[];
|
|
59
|
+
/**
|
|
60
|
+
* Extract TASK references from text.
|
|
61
|
+
*/
|
|
62
|
+
declare function extractTaskRefs(text: string): string[];
|
|
63
|
+
/**
|
|
64
|
+
* Extract pattern references from text.
|
|
65
|
+
*/
|
|
66
|
+
declare function extractPatternRefs(text: string): string[];
|
|
67
|
+
export { collectEvents, collectTasks, collectCommits, collectSessions, collectPatterns, collectGotchas, detectUserId, detectProjectId, extractADRRefs, extractTaskRefs, extractPatternRefs, };
|
|
68
|
+
//# sourceMappingURL=data-collector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-collector.d.ts","sourceRoot":"","sources":["../../../src/lib/insights/data-collector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,EACL,WAAW,EACX,SAAS,EACT,QAAQ,EAER,UAAU,EACV,WAAW,EACX,WAAW,EACX,UAAU,EACX,MAAM,YAAY,CAAC;AAgBpB,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,WAAW,CAAC,CAoCtB;AAMD;;GAEG;AACH,iBAAe,aAAa,CAC1B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,IAAI,EACX,GAAG,EAAE,IAAI,GACR,OAAO,CAAC,SAAS,EAAE,CAAC,CAkDtB;AAMD;;GAEG;AACH,iBAAe,YAAY,CACzB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,IAAI,EACX,GAAG,EAAE,IAAI,GACR,OAAO,CAAC,QAAQ,CAAC,CAwDnB;AAuDD;;GAEG;AACH,iBAAe,cAAc,CAC3B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,IAAI,EACX,GAAG,EAAE,IAAI,GACR,OAAO,CAAC,UAAU,EAAE,CAAC,CAwDvB;AAMD;;GAEG;AACH,iBAAe,eAAe,CAC5B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,IAAI,EACX,GAAG,EAAE,IAAI,GACR,OAAO,CAAC,WAAW,EAAE,CAAC,CA2DxB;AAuCD;;GAEG;AACH,iBAAe,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAkC1E;AAMD;;GAEG;AACH,iBAAe,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAmCxE;AAMD;;GAEG;AACH,iBAAS,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAUjD;AAED;;GAEG;AACH,iBAAS,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAWpD;AAED;;GAEG;AACH,iBAAS,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAG9C;AAED;;GAEG;AACH,iBAAS,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAG/C;AAED;;GAEG;AACH,iBAAS,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAGlD;AAMD,OAAO,EACL,aAAa,EACb,YAAY,EACZ,cAAc,EACd,eAAe,EACf,eAAe,EACf,cAAc,EACd,YAAY,EACZ,eAAe,EACf,cAAc,EACd,eAAe,EACf,kBAAkB,GACnB,CAAC"}
|