@ginkoai/cli 2.0.0-beta.3 → 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,110 @@
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
+ * Change details for a single node type
13
+ */
14
+ export interface TypeChange {
15
+ type: string;
16
+ action: string;
17
+ count: number;
18
+ titles: string[];
19
+ }
20
+ /**
21
+ * Summary of changes for a single team member
22
+ */
23
+ export interface MemberChangeSummary {
24
+ email: string;
25
+ displayName: string | null;
26
+ changes: TypeChange[];
27
+ totalChanges: number;
28
+ }
29
+ /**
30
+ * Summary of all team changes since last sync
31
+ */
32
+ export interface TeamChangeSummary {
33
+ byMember: Map<string, MemberChangeSummary>;
34
+ totalChanges: number;
35
+ sinceSyncAt: string | null;
36
+ period: string;
37
+ }
38
+ /**
39
+ * Raw change record from API
40
+ */
41
+ interface RawChangeRecord {
42
+ id: string;
43
+ type: string;
44
+ title: string;
45
+ action: 'created' | 'updated' | 'deleted';
46
+ editedBy: string;
47
+ editedByName?: string | null;
48
+ editedAt: string;
49
+ }
50
+ /**
51
+ * Fetch team changes since last sync
52
+ *
53
+ * @param graphId - The graph ID to query
54
+ * @param token - Bearer token for authentication
55
+ * @param lastSyncAt - ISO timestamp of last sync (null if never synced)
56
+ * @returns TeamChangeSummary with changes grouped by member
57
+ *
58
+ * @example
59
+ * ```typescript
60
+ * const summary = await getTeamChangesSinceLast(graphId, token, '2026-01-01T00:00:00Z');
61
+ * if (summary.totalChanges > 0) {
62
+ * displayTeamChangeReport(summary);
63
+ * }
64
+ * ```
65
+ */
66
+ export declare function getTeamChangesSinceLast(graphId: string, token: string, lastSyncAt: string | null): Promise<TeamChangeSummary>;
67
+ /**
68
+ * Aggregate raw changes into team summary
69
+ */
70
+ declare function aggregateChanges(changes: RawChangeRecord[], lastSyncAt: string | null): TeamChangeSummary;
71
+ /**
72
+ * Create empty summary (used for error cases)
73
+ */
74
+ declare function createEmptySummary(lastSyncAt: string | null): TeamChangeSummary;
75
+ /**
76
+ * Calculate human-readable period string
77
+ */
78
+ declare function calculatePeriod(lastSyncAt: string | null): string;
79
+ /**
80
+ * Format team change report as string (for logging or testing)
81
+ *
82
+ * @param summary - The team change summary to format
83
+ * @returns Formatted string with colors stripped for logging
84
+ */
85
+ export declare function formatTeamChangeReport(summary: TeamChangeSummary): string;
86
+ /**
87
+ * Display team change report to console with chalk colors
88
+ *
89
+ * @param summary - The team change summary to display
90
+ */
91
+ export declare function displayTeamChangeReport(summary: TeamChangeSummary): void;
92
+ /**
93
+ * Display compact change summary (single line)
94
+ *
95
+ * @param summary - The team change summary
96
+ * @returns Single line summary string
97
+ */
98
+ export declare function formatCompactSummary(summary: TeamChangeSummary): string;
99
+ /**
100
+ * Format email for display (truncate domain)
101
+ */
102
+ declare function formatEmail(email: string): string;
103
+ export declare const _internal: {
104
+ aggregateChanges: typeof aggregateChanges;
105
+ calculatePeriod: typeof calculatePeriod;
106
+ formatEmail: typeof formatEmail;
107
+ createEmptySummary: typeof createEmptySummary;
108
+ };
109
+ export {};
110
+ //# sourceMappingURL=team-sync-reporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-sync-reporter.d.ts","sourceRoot":"","sources":["../../src/lib/team-sync-reporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAqBH;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC3C,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,UAAU,eAAe;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAYD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,GAAG,IAAI,GACxB,OAAO,CAAC,iBAAiB,CAAC,CAqC5B;AAiDD;;GAEG;AACH,iBAAS,gBAAgB,CACvB,OAAO,EAAE,eAAe,EAAE,EAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,GACxB,iBAAiB,CAgDnB;AAED;;GAEG;AACH,iBAAS,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,iBAAiB,CAOxE;AAED;;GAEG;AACH,iBAAS,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAiB1D;AAMD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAuCzE;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAgDxE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAOvE;AAMD;;GAEG;AACH,iBAAS,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAa1C;AAMD,eAAO,MAAM,SAAS;;;;;CAKrB,CAAC"}
@@ -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.3",
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": {