@ginkoai/cli 2.0.0-beta.4 → 2.0.0-beta.5

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.
@@ -0,0 +1,316 @@
1
+ /**
2
+ * @fileType: utility
3
+ * @status: current
4
+ * @updated: 2026-01-03
5
+ * @tags: [sync, team, reporting, changes, EPIC-008]
6
+ * @related: [../commands/sync/sync-command.ts, ../commands/sync/team-sync.ts, staleness-detector.ts]
7
+ * @priority: high
8
+ * @complexity: medium
9
+ * @dependencies: [chalk]
10
+ */
11
+ /**
12
+ * Team Sync Reporter (EPIC-008 Sprint 2)
13
+ *
14
+ * Provides team-aware change reporting for the sync command.
15
+ * Shows who changed what since last sync with colored output.
16
+ *
17
+ * Key features:
18
+ * - Groups changes by team member
19
+ * - Counts changes by type (ADR, Pattern, Sprint, Gotcha)
20
+ * - Formats output with chalk colors
21
+ * - Supports preview/dry-run mode
22
+ */
23
+ import chalk from 'chalk';
24
+ // =============================================================================
25
+ // Constants
26
+ // =============================================================================
27
+ const API_BASE = process.env.GINKO_API_URL || 'https://app.ginkoai.com';
28
+ // =============================================================================
29
+ // Main API
30
+ // =============================================================================
31
+ /**
32
+ * Fetch team changes since last sync
33
+ *
34
+ * @param graphId - The graph ID to query
35
+ * @param token - Bearer token for authentication
36
+ * @param lastSyncAt - ISO timestamp of last sync (null if never synced)
37
+ * @returns TeamChangeSummary with changes grouped by member
38
+ *
39
+ * @example
40
+ * ```typescript
41
+ * const summary = await getTeamChangesSinceLast(graphId, token, '2026-01-01T00:00:00Z');
42
+ * if (summary.totalChanges > 0) {
43
+ * displayTeamChangeReport(summary);
44
+ * }
45
+ * ```
46
+ */
47
+ export async function getTeamChangesSinceLast(graphId, token, lastSyncAt) {
48
+ try {
49
+ // Build query URL
50
+ const url = new URL(`${API_BASE}/api/v1/team/activity`);
51
+ url.searchParams.set('graphId', graphId);
52
+ if (lastSyncAt) {
53
+ url.searchParams.set('since', lastSyncAt);
54
+ }
55
+ url.searchParams.set('limit', '100');
56
+ const response = await fetch(url.toString(), {
57
+ headers: {
58
+ Authorization: `Bearer ${token}`,
59
+ 'Content-Type': 'application/json',
60
+ },
61
+ });
62
+ // Handle API not available (fallback to unsynced nodes endpoint)
63
+ if (response.status === 404 || response.status === 501) {
64
+ return await getTeamChangesFromUnsyncedNodes(graphId, token, lastSyncAt);
65
+ }
66
+ if (!response.ok) {
67
+ // Return empty summary on error (non-blocking)
68
+ return createEmptySummary(lastSyncAt);
69
+ }
70
+ const data = await response.json();
71
+ return aggregateChanges(data.changes || [], lastSyncAt);
72
+ }
73
+ catch {
74
+ // Network error - return empty summary (non-blocking)
75
+ return createEmptySummary(lastSyncAt);
76
+ }
77
+ }
78
+ /**
79
+ * Fallback: Get changes from unsynced nodes endpoint
80
+ * Used when /api/v1/team/activity is not available
81
+ */
82
+ async function getTeamChangesFromUnsyncedNodes(graphId, token, lastSyncAt) {
83
+ try {
84
+ const url = new URL(`${API_BASE}/api/v1/graph/nodes/unsynced`);
85
+ url.searchParams.set('graphId', graphId);
86
+ const response = await fetch(url.toString(), {
87
+ headers: {
88
+ Authorization: `Bearer ${token}`,
89
+ 'Content-Type': 'application/json',
90
+ },
91
+ });
92
+ if (!response.ok) {
93
+ return createEmptySummary(lastSyncAt);
94
+ }
95
+ const data = await response.json();
96
+ // Transform unsynced nodes to change records
97
+ const changes = (data.nodes || []).map(n => ({
98
+ id: n.node.id || n.node.properties.id || '',
99
+ type: (n.node.label || n.node.properties.type || 'ADR'),
100
+ title: n.node.properties.title || n.node.properties.name || 'Untitled',
101
+ action: 'updated',
102
+ editedBy: n.syncStatus?.editedBy || 'unknown',
103
+ editedAt: n.syncStatus?.editedAt || new Date().toISOString(),
104
+ }));
105
+ return aggregateChanges(changes, lastSyncAt);
106
+ }
107
+ catch {
108
+ return createEmptySummary(lastSyncAt);
109
+ }
110
+ }
111
+ /**
112
+ * Aggregate raw changes into team summary
113
+ */
114
+ function aggregateChanges(changes, lastSyncAt) {
115
+ const byMember = new Map();
116
+ for (const change of changes) {
117
+ const email = change.editedBy;
118
+ // Get or create member summary
119
+ let member = byMember.get(email);
120
+ if (!member) {
121
+ member = {
122
+ email,
123
+ displayName: change.editedByName || null,
124
+ changes: [],
125
+ totalChanges: 0,
126
+ };
127
+ byMember.set(email, member);
128
+ }
129
+ // Find or create type/action bucket
130
+ let typeChange = member.changes.find(c => c.type === change.type && c.action === change.action);
131
+ if (!typeChange) {
132
+ typeChange = {
133
+ type: change.type,
134
+ action: change.action,
135
+ count: 0,
136
+ titles: [],
137
+ };
138
+ member.changes.push(typeChange);
139
+ }
140
+ typeChange.count++;
141
+ if (typeChange.titles.length < 3) {
142
+ typeChange.titles.push(change.title);
143
+ }
144
+ member.totalChanges++;
145
+ }
146
+ // Calculate period string
147
+ const period = calculatePeriod(lastSyncAt);
148
+ return {
149
+ byMember,
150
+ totalChanges: changes.length,
151
+ sinceSyncAt: lastSyncAt,
152
+ period,
153
+ };
154
+ }
155
+ /**
156
+ * Create empty summary (used for error cases)
157
+ */
158
+ function createEmptySummary(lastSyncAt) {
159
+ return {
160
+ byMember: new Map(),
161
+ totalChanges: 0,
162
+ sinceSyncAt: lastSyncAt,
163
+ period: calculatePeriod(lastSyncAt),
164
+ };
165
+ }
166
+ /**
167
+ * Calculate human-readable period string
168
+ */
169
+ function calculatePeriod(lastSyncAt) {
170
+ if (!lastSyncAt) {
171
+ return 'all time';
172
+ }
173
+ const lastSync = new Date(lastSyncAt);
174
+ const now = new Date();
175
+ const diffMs = now.getTime() - lastSync.getTime();
176
+ const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
177
+ if (diffDays === 0)
178
+ return 'today';
179
+ if (diffDays === 1)
180
+ return '1 day';
181
+ if (diffDays < 7)
182
+ return `${diffDays} days`;
183
+ if (diffDays < 14)
184
+ return '1 week';
185
+ if (diffDays < 30)
186
+ return `${Math.floor(diffDays / 7)} weeks`;
187
+ if (diffDays < 60)
188
+ return '1 month';
189
+ return `${Math.floor(diffDays / 30)} months`;
190
+ }
191
+ // =============================================================================
192
+ // Display Functions
193
+ // =============================================================================
194
+ /**
195
+ * Format team change report as string (for logging or testing)
196
+ *
197
+ * @param summary - The team change summary to format
198
+ * @returns Formatted string with colors stripped for logging
199
+ */
200
+ export function formatTeamChangeReport(summary) {
201
+ const lines = [];
202
+ if (summary.totalChanges === 0) {
203
+ lines.push('No changes since last sync.');
204
+ return lines.join('\n');
205
+ }
206
+ lines.push(`Team changes since last sync (${summary.period} ago):`);
207
+ lines.push('');
208
+ // Sort members by total changes (most active first)
209
+ const sortedMembers = Array.from(summary.byMember.values())
210
+ .sort((a, b) => b.totalChanges - a.totalChanges);
211
+ for (const member of sortedMembers) {
212
+ const displayName = member.displayName || formatEmail(member.email);
213
+ lines.push(` ${displayName}:`);
214
+ // Sort changes: created first, then updated, then deleted
215
+ const sortedChanges = member.changes.sort((a, b) => {
216
+ const order = { created: 0, updated: 1, deleted: 2 };
217
+ return (order[a.action] || 1) - (order[b.action] || 1);
218
+ });
219
+ for (const change of sortedChanges) {
220
+ const icon = change.action === 'created' ? '+' : change.action === 'updated' ? '~' : '-';
221
+ const plural = change.count === 1 ? '' : 's';
222
+ lines.push(` ${icon} ${change.count} ${change.type}${plural} ${change.action}`);
223
+ }
224
+ lines.push('');
225
+ }
226
+ // Summary line
227
+ const memberCount = summary.byMember.size;
228
+ lines.push(` Total: ${summary.totalChanges} change${summary.totalChanges === 1 ? '' : 's'} from ${memberCount} team member${memberCount === 1 ? '' : 's'}`);
229
+ return lines.join('\n');
230
+ }
231
+ /**
232
+ * Display team change report to console with chalk colors
233
+ *
234
+ * @param summary - The team change summary to display
235
+ */
236
+ export function displayTeamChangeReport(summary) {
237
+ if (summary.totalChanges === 0) {
238
+ console.log(chalk.dim('No changes since last sync.'));
239
+ return;
240
+ }
241
+ console.log('');
242
+ console.log(chalk.cyan.bold(`Team changes since last sync (${summary.period} ago):`));
243
+ console.log('');
244
+ // Sort members by total changes (most active first)
245
+ const sortedMembers = Array.from(summary.byMember.values())
246
+ .sort((a, b) => b.totalChanges - a.totalChanges);
247
+ for (const member of sortedMembers) {
248
+ const displayName = member.displayName || formatEmail(member.email);
249
+ console.log(chalk.white(` ${displayName}:`));
250
+ // Sort changes: created first, then updated, then deleted
251
+ const sortedChanges = member.changes.sort((a, b) => {
252
+ const order = { created: 0, updated: 1, deleted: 2 };
253
+ return (order[a.action] || 1) - (order[b.action] || 1);
254
+ });
255
+ for (const change of sortedChanges) {
256
+ const plural = change.count === 1 ? '' : 's';
257
+ let line;
258
+ if (change.action === 'created') {
259
+ line = chalk.green(` + ${change.count} ${change.type}${plural} created`);
260
+ }
261
+ else if (change.action === 'updated') {
262
+ line = chalk.yellow(` ~ ${change.count} ${change.type}${plural} updated`);
263
+ }
264
+ else {
265
+ line = chalk.red(` - ${change.count} ${change.type}${plural} deleted`);
266
+ }
267
+ console.log(line);
268
+ }
269
+ console.log('');
270
+ }
271
+ // Summary line
272
+ const memberCount = summary.byMember.size;
273
+ console.log(chalk.dim(` Total: ${summary.totalChanges} change${summary.totalChanges === 1 ? '' : 's'} from ${memberCount} team member${memberCount === 1 ? '' : 's'}`));
274
+ console.log('');
275
+ }
276
+ /**
277
+ * Display compact change summary (single line)
278
+ *
279
+ * @param summary - The team change summary
280
+ * @returns Single line summary string
281
+ */
282
+ export function formatCompactSummary(summary) {
283
+ if (summary.totalChanges === 0) {
284
+ return 'No pending changes';
285
+ }
286
+ const memberCount = summary.byMember.size;
287
+ return `${summary.totalChanges} change${summary.totalChanges === 1 ? '' : 's'} from ${memberCount} member${memberCount === 1 ? '' : 's'} (${summary.period})`;
288
+ }
289
+ // =============================================================================
290
+ // Helper Functions
291
+ // =============================================================================
292
+ /**
293
+ * Format email for display (truncate domain)
294
+ */
295
+ function formatEmail(email) {
296
+ const atIndex = email.indexOf('@');
297
+ if (atIndex === -1)
298
+ return email;
299
+ const local = email.substring(0, atIndex);
300
+ const domain = email.substring(atIndex + 1);
301
+ // Shorten common domains
302
+ if (domain === 'gmail.com' || domain === 'outlook.com' || domain === 'yahoo.com') {
303
+ return `${local}@${domain.split('.')[0]}`;
304
+ }
305
+ return `${local}@`;
306
+ }
307
+ // =============================================================================
308
+ // Exports for Testing
309
+ // =============================================================================
310
+ export const _internal = {
311
+ aggregateChanges,
312
+ calculatePeriod,
313
+ formatEmail,
314
+ createEmptySummary,
315
+ };
316
+ //# sourceMappingURL=team-sync-reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-sync-reporter.js","sourceRoot":"","sources":["../../src/lib/team-sync-reporter.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ginkoai/cli",
3
- "version": "2.0.0-beta.4",
3
+ "version": "2.0.0-beta.5",
4
4
  "description": "Git-native session management and cloud context for AI-mediated development. AI Collaboration for Vibe Tribes.",
5
5
  "main": "dist/index.js",
6
6
  "bin": {