@ginkoai/cli 1.8.0 → 2.0.0-beta.3

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 (89) hide show
  1. package/dist/commands/assign.d.ts +19 -0
  2. package/dist/commands/assign.d.ts.map +1 -0
  3. package/dist/commands/assign.js +200 -0
  4. package/dist/commands/assign.js.map +1 -0
  5. package/dist/commands/epic.d.ts.map +1 -1
  6. package/dist/commands/epic.js +48 -23
  7. package/dist/commands/epic.js.map +1 -1
  8. package/dist/commands/graph/api-client.d.ts +1 -0
  9. package/dist/commands/graph/api-client.d.ts.map +1 -1
  10. package/dist/commands/graph/api-client.js.map +1 -1
  11. package/dist/commands/insights/insights-command.d.ts.map +1 -1
  12. package/dist/commands/insights/insights-command.js +51 -13
  13. package/dist/commands/insights/insights-command.js.map +1 -1
  14. package/dist/commands/invite/index.d.ts +22 -0
  15. package/dist/commands/invite/index.d.ts.map +1 -0
  16. package/dist/commands/invite/index.js +192 -0
  17. package/dist/commands/invite/index.js.map +1 -0
  18. package/dist/commands/join/index.d.ts +22 -0
  19. package/dist/commands/join/index.d.ts.map +1 -0
  20. package/dist/commands/join/index.js +177 -0
  21. package/dist/commands/join/index.js.map +1 -0
  22. package/dist/commands/principles/seed.d.ts +26 -0
  23. package/dist/commands/principles/seed.d.ts.map +1 -0
  24. package/dist/commands/principles/seed.js +150 -0
  25. package/dist/commands/principles/seed.js.map +1 -0
  26. package/dist/commands/start/start-reflection.d.ts +11 -0
  27. package/dist/commands/start/start-reflection.d.ts.map +1 -1
  28. package/dist/commands/start/start-reflection.js +99 -3
  29. package/dist/commands/start/start-reflection.js.map +1 -1
  30. package/dist/commands/sync/index.d.ts +22 -0
  31. package/dist/commands/sync/index.d.ts.map +1 -0
  32. package/dist/commands/sync/index.js +43 -0
  33. package/dist/commands/sync/index.js.map +1 -0
  34. package/dist/commands/sync/node-syncer.d.ts +58 -0
  35. package/dist/commands/sync/node-syncer.d.ts.map +1 -0
  36. package/dist/commands/sync/node-syncer.js +192 -0
  37. package/dist/commands/sync/node-syncer.js.map +1 -0
  38. package/dist/commands/sync/sprint-syncer.d.ts +42 -0
  39. package/dist/commands/sync/sprint-syncer.d.ts.map +1 -0
  40. package/dist/commands/sync/sprint-syncer.js +274 -0
  41. package/dist/commands/sync/sprint-syncer.js.map +1 -0
  42. package/dist/commands/sync/sync-command.d.ts +16 -0
  43. package/dist/commands/sync/sync-command.d.ts.map +1 -0
  44. package/dist/commands/sync/sync-command.js +458 -0
  45. package/dist/commands/sync/sync-command.js.map +1 -0
  46. package/dist/commands/sync/team-sync.d.ts +32 -0
  47. package/dist/commands/sync/team-sync.d.ts.map +1 -0
  48. package/dist/commands/sync/team-sync.js +194 -0
  49. package/dist/commands/sync/team-sync.js.map +1 -0
  50. package/dist/commands/sync/types.d.ts +120 -0
  51. package/dist/commands/sync/types.d.ts.map +1 -0
  52. package/dist/commands/sync/types.js +12 -0
  53. package/dist/commands/sync/types.js.map +1 -0
  54. package/dist/core/session-log-manager.d.ts +3 -1
  55. package/dist/core/session-log-manager.d.ts.map +1 -1
  56. package/dist/core/session-log-manager.js +5 -3
  57. package/dist/core/session-log-manager.js.map +1 -1
  58. package/dist/data/standard-principles.d.ts +43 -0
  59. package/dist/data/standard-principles.d.ts.map +1 -0
  60. package/dist/data/standard-principles.js +323 -0
  61. package/dist/data/standard-principles.js.map +1 -0
  62. package/dist/index.js +29 -1
  63. package/dist/index.js.map +1 -1
  64. package/dist/lib/insights/analyzers/anti-patterns.js +2 -2
  65. package/dist/lib/insights/analyzers/anti-patterns.js.map +1 -1
  66. package/dist/lib/insights/analyzers/efficiency.js +2 -2
  67. package/dist/lib/insights/analyzers/efficiency.js.map +1 -1
  68. package/dist/lib/insights/analyzers/patterns.d.ts.map +1 -1
  69. package/dist/lib/insights/analyzers/patterns.js +16 -6
  70. package/dist/lib/insights/analyzers/patterns.js.map +1 -1
  71. package/dist/lib/insights/analyzers/quality.d.ts.map +1 -1
  72. package/dist/lib/insights/analyzers/quality.js +14 -9
  73. package/dist/lib/insights/analyzers/quality.js.map +1 -1
  74. package/dist/lib/insights/data-collector.d.ts.map +1 -1
  75. package/dist/lib/insights/data-collector.js +60 -13
  76. package/dist/lib/insights/data-collector.js.map +1 -1
  77. package/dist/lib/insights/scheduler.d.ts +71 -0
  78. package/dist/lib/insights/scheduler.d.ts.map +1 -0
  79. package/dist/lib/insights/scheduler.js +126 -0
  80. package/dist/lib/insights/scheduler.js.map +1 -0
  81. package/dist/utils/api-client.d.ts +1 -1
  82. package/dist/utils/api-client.d.ts.map +1 -1
  83. package/dist/utils/api-client.js +2 -2
  84. package/dist/utils/api-client.js.map +1 -1
  85. package/package.json +1 -1
  86. package/dist/lib/__tests__/task-timeout.test.d.ts +0 -12
  87. package/dist/lib/__tests__/task-timeout.test.d.ts.map +0 -1
  88. package/dist/lib/__tests__/task-timeout.test.js +0 -278
  89. package/dist/lib/__tests__/task-timeout.test.js.map +0 -1
@@ -0,0 +1,458 @@
1
+ /**
2
+ * @fileType: command
3
+ * @status: current
4
+ * @updated: 2025-12-15
5
+ * @tags: [sync, cloud-to-local, git, ADR-054]
6
+ * @related: [index.ts, node-syncer.ts, types.ts]
7
+ * @priority: critical
8
+ * @complexity: high
9
+ * @dependencies: [chalk, prompts, simple-git]
10
+ */
11
+ /**
12
+ * Sync Command (ADR-054)
13
+ *
14
+ * Pull dashboard edits from cloud graph to local git repository.
15
+ *
16
+ * Usage:
17
+ * ginko sync # Sync all unsynced nodes
18
+ * ginko sync --dry-run # Preview what would be synced
19
+ * ginko sync --force # Overwrite local with graph versions
20
+ * ginko sync --type=ADR # Sync only specific node type
21
+ */
22
+ import chalk from 'chalk';
23
+ import prompts from 'prompts';
24
+ import { getConfig, getApiToken } from '../graph/config.js';
25
+ import { syncNode, getFilePath, computeHash, readFileContent, applyResolution, } from './node-syncer.js';
26
+ import { findSprintFiles, syncSprintFile, updateCurrentSprintFile, } from './sprint-syncer.js';
27
+ import { getTeamSyncStatus, updateLastSyncTimestamp, displayStalenessWarning, displayTeamInfo, } from './team-sync.js';
28
+ const API_BASE = process.env.GINKO_API_URL || 'https://app.ginkoai.com';
29
+ /**
30
+ * Transform raw API node to UnsyncedNode
31
+ */
32
+ function transformApiNode(raw) {
33
+ const props = raw.node.properties || {};
34
+ return {
35
+ id: raw.node.id || props.id || '',
36
+ type: (raw.node.label || props.type || 'ADR'),
37
+ title: props.title || props.name || raw.node.id || 'Untitled',
38
+ content: props.content || props.body || '',
39
+ status: props.status || 'draft',
40
+ tags: Array.isArray(props.tags) ? props.tags : [],
41
+ synced: raw.syncStatus?.synced ?? false,
42
+ syncedAt: raw.syncStatus?.syncedAt || null,
43
+ editedAt: raw.syncStatus?.editedAt || new Date().toISOString(),
44
+ editedBy: raw.syncStatus?.editedBy || 'unknown',
45
+ contentHash: raw.syncStatus?.contentHash || '',
46
+ gitHash: raw.syncStatus?.gitHash || null,
47
+ slug: props.slug || undefined,
48
+ };
49
+ }
50
+ /**
51
+ * Fetch unsynced nodes from API
52
+ */
53
+ async function fetchUnsyncedNodes(graphId, token, type) {
54
+ const url = new URL(`${API_BASE}/api/v1/graph/nodes/unsynced`);
55
+ url.searchParams.set('graphId', graphId);
56
+ if (type) {
57
+ url.searchParams.set('type', type);
58
+ }
59
+ const response = await fetch(url.toString(), {
60
+ headers: {
61
+ Authorization: `Bearer ${token}`,
62
+ 'Content-Type': 'application/json',
63
+ },
64
+ });
65
+ if (!response.ok) {
66
+ const text = await response.text();
67
+ throw new Error(`Failed to fetch unsynced nodes: ${response.status} ${text}`);
68
+ }
69
+ const data = (await response.json());
70
+ // Transform raw API nodes to expected UnsyncedNode format
71
+ return (data.nodes || []).map(transformApiNode);
72
+ }
73
+ /**
74
+ * Mark a node as synced in the API
75
+ */
76
+ async function markNodeSynced(nodeId, gitHash, graphId, token) {
77
+ // graphId must be in query params, not just body
78
+ const url = `${API_BASE}/api/v1/graph/nodes/${encodeURIComponent(nodeId)}/sync?graphId=${encodeURIComponent(graphId)}`;
79
+ const response = await fetch(url, {
80
+ method: 'POST',
81
+ headers: {
82
+ Authorization: `Bearer ${token}`,
83
+ 'Content-Type': 'application/json',
84
+ },
85
+ body: JSON.stringify({
86
+ gitHash,
87
+ syncedAt: new Date().toISOString(),
88
+ }),
89
+ });
90
+ if (!response.ok) {
91
+ const text = await response.text();
92
+ throw new Error(`Failed to mark node synced: ${response.status} ${text}`);
93
+ }
94
+ }
95
+ /**
96
+ * Show conflict resolution dialog
97
+ */
98
+ async function resolveConflict(conflict) {
99
+ console.log(chalk.yellow(`\n⚠️ Conflict detected: ${conflict.node.title}`));
100
+ console.log(chalk.dim(` File: ${conflict.node.type}/${conflict.node.id}`));
101
+ console.log(chalk.dim(` Local hash: ${conflict.localHash.substring(0, 8)}...`));
102
+ console.log(chalk.dim(` Graph hash: ${conflict.node.contentHash.substring(0, 8)}...`));
103
+ const { resolution } = await prompts({
104
+ type: 'select',
105
+ name: 'resolution',
106
+ message: 'How would you like to resolve this conflict?',
107
+ choices: [
108
+ { title: 'Use graph version (overwrite local)', value: 'use-graph' },
109
+ { title: 'Keep local version (update graph)', value: 'use-local' },
110
+ { title: 'Skip this file', value: 'skip' },
111
+ ],
112
+ });
113
+ return resolution || 'skip';
114
+ }
115
+ /**
116
+ * Stage and commit synced files
117
+ */
118
+ async function commitSyncedFiles(files, projectRoot) {
119
+ if (files.length === 0)
120
+ return true;
121
+ try {
122
+ const { simpleGit } = await import('simple-git');
123
+ const git = simpleGit(projectRoot);
124
+ // Stage files
125
+ await git.add(files);
126
+ // Determine if this is sprint sync or knowledge sync
127
+ const isSprintSync = files.some(f => f.includes('sprints/'));
128
+ const syncType = isSprintSync ? 'sprint' : 'knowledge node';
129
+ // Commit
130
+ const message = `sync: Pull ${files.length} ${syncType}(s) from dashboard
131
+
132
+ Synced files:
133
+ ${files.map((f) => `- ${f}`).join('\n')}
134
+
135
+ 🤖 Generated with [Claude Code](https://claude.com/claude-code)
136
+
137
+ Co-Authored-By: Claude <noreply@anthropic.com>
138
+ Co-Authored-By: Chris Norton <chris@watchhill.ai>`;
139
+ await git.commit(message);
140
+ return true;
141
+ }
142
+ catch (error) {
143
+ console.error(chalk.red('Failed to commit:'), error);
144
+ return false;
145
+ }
146
+ }
147
+ /**
148
+ * Sync sprints from graph to local markdown
149
+ */
150
+ async function syncSprints(graphId, token, projectRoot, options) {
151
+ console.log(chalk.dim('📋 Finding sprint files...'));
152
+ const sprintFiles = await findSprintFiles(projectRoot);
153
+ if (sprintFiles.length === 0) {
154
+ console.log(chalk.yellow('No sprint files found in docs/sprints/'));
155
+ return [];
156
+ }
157
+ console.log(chalk.cyan(`Found ${sprintFiles.length} sprint file(s):\n`));
158
+ for (const sf of sprintFiles) {
159
+ console.log(` 📋 ${sf.sprintId}: ${sf.path.split('/').pop()}`);
160
+ }
161
+ console.log('');
162
+ if (options.dryRun) {
163
+ console.log(chalk.yellow('📋 Dry run mode - no changes will be made.\n'));
164
+ return [];
165
+ }
166
+ // Confirm before proceeding
167
+ if (!options.force) {
168
+ const { proceed } = await prompts({
169
+ type: 'confirm',
170
+ name: 'proceed',
171
+ message: `Sync ${sprintFiles.length} sprint(s) from graph?`,
172
+ initial: true,
173
+ });
174
+ if (!proceed) {
175
+ console.log(chalk.dim('Sync cancelled.'));
176
+ return [];
177
+ }
178
+ }
179
+ console.log('');
180
+ const results = [];
181
+ for (const sprintFile of sprintFiles) {
182
+ console.log(chalk.dim(`Syncing: ${sprintFile.sprintId}...`));
183
+ const result = await syncSprintFile(sprintFile, graphId, token, API_BASE);
184
+ results.push(result);
185
+ if (result.error) {
186
+ console.log(chalk.red(` ✗ Error: ${result.error}`));
187
+ }
188
+ else if (result.tasksUpdated > 0) {
189
+ console.log(chalk.green(` ✓ Updated ${result.tasksUpdated} task(s)`));
190
+ for (const change of result.changes) {
191
+ console.log(chalk.dim(` ${change}`));
192
+ }
193
+ }
194
+ else {
195
+ console.log(chalk.dim(` ○ ${result.changes[0] || 'No changes'}`));
196
+ }
197
+ }
198
+ // Update CURRENT-SPRINT.md if we have an active sprint
199
+ const updatedSprints = results.filter(r => r.tasksUpdated > 0);
200
+ if (updatedSprints.length > 0) {
201
+ // Find the most recently updated sprint
202
+ const latestSprint = sprintFiles.find(sf => sf.sprintId === updatedSprints[0].sprintId);
203
+ if (latestSprint) {
204
+ try {
205
+ await updateCurrentSprintFile(projectRoot, latestSprint.path);
206
+ console.log(chalk.dim('\n Updated CURRENT-SPRINT.md'));
207
+ }
208
+ catch {
209
+ // Ignore errors updating CURRENT-SPRINT.md
210
+ }
211
+ }
212
+ }
213
+ return results;
214
+ }
215
+ /**
216
+ * Main sync command implementation
217
+ */
218
+ export async function syncCommand(options) {
219
+ const result = {
220
+ synced: [],
221
+ skipped: [],
222
+ conflicts: [],
223
+ errors: [],
224
+ };
225
+ console.log(chalk.bold.cyan('🔄 Sync: Dashboard → Git\n'));
226
+ // Get config and auth
227
+ const config = await getConfig();
228
+ const graphId = config?.graphId;
229
+ if (!graphId) {
230
+ console.error(chalk.red('❌ No graph ID found.'));
231
+ console.error(chalk.dim(' Run `ginko graph init` first.'));
232
+ return result;
233
+ }
234
+ const token = await getApiToken();
235
+ if (!token) {
236
+ console.error(chalk.red('❌ Not authenticated.'));
237
+ console.error(chalk.dim(' Run `ginko login` to authenticate.'));
238
+ return result;
239
+ }
240
+ // Check team membership and staleness (EPIC-008)
241
+ const stalenessThreshold = options.stalenessThresholdDays ?? 3;
242
+ let teamStatus = null;
243
+ if (!options.skipMembershipCheck) {
244
+ teamStatus = await getTeamSyncStatus(graphId, token, stalenessThreshold);
245
+ // Display team info if member
246
+ if (teamStatus.isMember) {
247
+ displayTeamInfo(teamStatus);
248
+ }
249
+ // Show staleness warning if applicable
250
+ if (teamStatus.isMember && teamStatus.staleness.isStale) {
251
+ displayStalenessWarning(teamStatus);
252
+ }
253
+ }
254
+ // Get git root directory (not cwd, which might be a subdirectory)
255
+ let projectRoot = process.cwd();
256
+ try {
257
+ const { simpleGit } = await import('simple-git');
258
+ const git = simpleGit(process.cwd());
259
+ projectRoot = await git.revparse(['--show-toplevel']);
260
+ projectRoot = projectRoot.trim();
261
+ }
262
+ catch {
263
+ // Fall back to cwd if not in a git repo
264
+ console.warn(chalk.dim('⚠️ Not in a git repository, using current directory.'));
265
+ }
266
+ // Handle Sprint type separately (different sync mechanism)
267
+ if (options.type === 'Sprint') {
268
+ console.log(chalk.bold('📋 Sprint Sync Mode\n'));
269
+ const sprintResults = await syncSprints(graphId, token, projectRoot, options);
270
+ // Commit changes if any sprints were updated
271
+ const updatedSprints = sprintResults.filter(r => r.tasksUpdated > 0);
272
+ if (updatedSprints.length > 0) {
273
+ const files = updatedSprints.map(r => r.filePath);
274
+ // Also include CURRENT-SPRINT.md
275
+ files.push('docs/sprints/CURRENT-SPRINT.md');
276
+ console.log(chalk.dim('\n📝 Committing changes...'));
277
+ const committed = await commitSyncedFiles(files, projectRoot);
278
+ if (committed) {
279
+ console.log(chalk.green(`\n✓ Synced ${updatedSprints.length} sprint(s) and committed to git.`));
280
+ }
281
+ }
282
+ // Update team sync timestamp if we synced anything (EPIC-008)
283
+ const totalUpdated = sprintResults.reduce((sum, r) => sum + r.tasksUpdated, 0);
284
+ if (totalUpdated > 0 && teamStatus?.isMember) {
285
+ const updated = await updateLastSyncTimestamp(graphId, token);
286
+ if (updated) {
287
+ console.log(chalk.dim('✓ Team sync timestamp updated'));
288
+ }
289
+ }
290
+ // Summary
291
+ console.log(chalk.bold('\n📊 Summary:'));
292
+ console.log(` Sprints processed: ${sprintResults.length}`);
293
+ console.log(` Tasks updated: ${totalUpdated}`);
294
+ console.log(` Errors: ${sprintResults.filter(r => r.error).length}`);
295
+ return result;
296
+ }
297
+ // Fetch unsynced nodes (knowledge nodes only)
298
+ console.log(chalk.dim('📡 Fetching unsynced nodes from dashboard...'));
299
+ let nodes;
300
+ try {
301
+ nodes = await fetchUnsyncedNodes(graphId, token, options.type);
302
+ }
303
+ catch (error) {
304
+ console.error(chalk.red('❌ Failed to fetch unsynced nodes:'), error);
305
+ return result;
306
+ }
307
+ if (nodes.length === 0) {
308
+ console.log(chalk.green('✓ All nodes are synced. Nothing to do.'));
309
+ return result;
310
+ }
311
+ console.log(chalk.cyan(`Found ${nodes.length} unsynced node(s):\n`));
312
+ // Show preview
313
+ for (const node of nodes) {
314
+ const icon = getTypeIcon(node.type);
315
+ console.log(` ${icon} ${node.type}: ${node.title}`);
316
+ console.log(chalk.dim(` Edited by ${node.editedBy} at ${node.editedAt}`));
317
+ }
318
+ console.log('');
319
+ // Dry run - just show what would happen
320
+ if (options.dryRun) {
321
+ console.log(chalk.yellow('📋 Dry run mode - no changes will be made.\n'));
322
+ for (const node of nodes) {
323
+ const filePath = getFilePath(projectRoot, node);
324
+ const localContent = await readFileContent(filePath);
325
+ if (!localContent) {
326
+ console.log(chalk.green(` + Would create: ${filePath}`));
327
+ }
328
+ else {
329
+ const localHash = computeHash(localContent);
330
+ if (localHash !== node.gitHash) {
331
+ console.log(chalk.yellow(` ~ Would update (conflict): ${filePath}`));
332
+ }
333
+ else {
334
+ console.log(chalk.blue(` ~ Would update: ${filePath}`));
335
+ }
336
+ }
337
+ }
338
+ return result;
339
+ }
340
+ // Confirm before proceeding
341
+ if (!options.force) {
342
+ const { proceed } = await prompts({
343
+ type: 'confirm',
344
+ name: 'proceed',
345
+ message: `Sync ${nodes.length} node(s) to local git?`,
346
+ initial: true,
347
+ });
348
+ if (!proceed) {
349
+ console.log(chalk.dim('Sync cancelled.'));
350
+ return result;
351
+ }
352
+ }
353
+ console.log('');
354
+ // Process each node
355
+ const syncedFiles = [];
356
+ for (const node of nodes) {
357
+ const filePath = getFilePath(projectRoot, node);
358
+ console.log(chalk.dim(`Processing: ${node.title}...`));
359
+ try {
360
+ const syncResult = await syncNode(node, projectRoot, { force: options.force });
361
+ if (syncResult.conflict) {
362
+ // Handle conflict
363
+ if (options.force) {
364
+ // Force mode: use graph version
365
+ await applyResolution(syncResult.conflict, 'use-graph', projectRoot);
366
+ syncedFiles.push(syncResult.filePath);
367
+ result.synced.push(node.id);
368
+ console.log(chalk.green(` ✓ Force synced: ${filePath}`));
369
+ }
370
+ else {
371
+ // Interactive conflict resolution
372
+ const resolution = await resolveConflict(syncResult.conflict);
373
+ syncResult.conflict.resolution = resolution;
374
+ result.conflicts.push(syncResult.conflict);
375
+ if (resolution !== 'skip') {
376
+ const applied = await applyResolution(syncResult.conflict, resolution, projectRoot);
377
+ if (applied.applied) {
378
+ syncedFiles.push(filePath);
379
+ result.synced.push(node.id);
380
+ console.log(chalk.green(` ✓ Resolved: ${filePath}`));
381
+ }
382
+ }
383
+ else {
384
+ result.skipped.push(node.id);
385
+ console.log(chalk.yellow(` ○ Skipped: ${filePath}`));
386
+ }
387
+ }
388
+ }
389
+ else if (syncResult.success) {
390
+ syncedFiles.push(syncResult.filePath);
391
+ result.synced.push(node.id);
392
+ console.log(chalk.green(` ✓ Synced: ${filePath}`));
393
+ // Mark as synced in API
394
+ try {
395
+ await markNodeSynced(node.id, syncResult.hash, graphId, token);
396
+ }
397
+ catch (error) {
398
+ console.warn(chalk.yellow(` ⚠ Could not mark as synced in API: ${error}`));
399
+ }
400
+ }
401
+ }
402
+ catch (error) {
403
+ result.errors.push({ nodeId: node.id, error: String(error) });
404
+ console.error(chalk.red(` ✗ Failed: ${node.id} - ${error}`));
405
+ }
406
+ }
407
+ console.log('');
408
+ // Commit changes
409
+ if (syncedFiles.length > 0) {
410
+ console.log(chalk.dim('📝 Committing changes...'));
411
+ const committed = await commitSyncedFiles(syncedFiles, projectRoot);
412
+ if (committed) {
413
+ console.log(chalk.green(`\n✓ Synced ${syncedFiles.length} file(s) and committed to git.`));
414
+ }
415
+ else {
416
+ console.log(chalk.yellow(`\n⚠ Synced ${syncedFiles.length} file(s) but commit failed.`));
417
+ console.log(chalk.dim(' You can commit manually with: git add . && git commit'));
418
+ }
419
+ }
420
+ // Update team sync timestamp if we synced anything (EPIC-008)
421
+ if (result.synced.length > 0 && teamStatus?.isMember) {
422
+ const updated = await updateLastSyncTimestamp(graphId, token);
423
+ if (updated) {
424
+ console.log(chalk.dim('✓ Team sync timestamp updated'));
425
+ }
426
+ }
427
+ // Summary
428
+ console.log(chalk.bold('\n📊 Summary:'));
429
+ console.log(` Synced: ${result.synced.length}`);
430
+ console.log(` Skipped: ${result.skipped.length}`);
431
+ console.log(` Conflicts: ${result.conflicts.length}`);
432
+ console.log(` Errors: ${result.errors.length}`);
433
+ return result;
434
+ }
435
+ /**
436
+ * Get icon for node type
437
+ */
438
+ function getTypeIcon(type) {
439
+ switch (type) {
440
+ case 'ADR':
441
+ return '📜';
442
+ case 'PRD':
443
+ return '📋';
444
+ case 'Pattern':
445
+ return '🔷';
446
+ case 'Gotcha':
447
+ return '⚠️';
448
+ case 'Charter':
449
+ return '🎯';
450
+ case 'Sprint':
451
+ return '🏃';
452
+ case 'Task':
453
+ return '✅';
454
+ default:
455
+ return '📄';
456
+ }
457
+ }
458
+ //# sourceMappingURL=sync-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-command.js","sourceRoot":"","sources":["../../../src/commands/sync/sync-command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @fileType: utility
3
+ * @status: current
4
+ * @updated: 2026-01-03
5
+ * @tags: [sync, team, membership, staleness, EPIC-008]
6
+ * @related: [sync-command.ts, types.ts]
7
+ * @priority: high
8
+ * @complexity: medium
9
+ * @dependencies: [chalk]
10
+ */
11
+ import type { TeamSyncStatus } from './types.js';
12
+ /**
13
+ * Check team membership and sync status for current user
14
+ */
15
+ export declare function getTeamSyncStatus(graphId: string, token: string, stalenessThresholdDays?: number): Promise<TeamSyncStatus>;
16
+ /**
17
+ * Update last sync timestamp for current user
18
+ */
19
+ export declare function updateLastSyncTimestamp(graphId: string, token: string): Promise<boolean>;
20
+ /**
21
+ * Display staleness warning if context is stale
22
+ */
23
+ export declare function displayStalenessWarning(status: TeamSyncStatus): void;
24
+ /**
25
+ * Display team membership info
26
+ */
27
+ export declare function displayTeamInfo(status: TeamSyncStatus): void;
28
+ /**
29
+ * Format relative time for display
30
+ */
31
+ export declare function formatRelativeTime(dateStr: string | null): string;
32
+ //# sourceMappingURL=team-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-sync.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/team-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAYH,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,YAAY,CAAC;AAOjE;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,sBAAsB,GAAE,MAAyC,GAChE,OAAO,CAAC,cAAc,CAAC,CAkEzB;AAgCD;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC,CAqBlB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAoBpE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAS5D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAiBjE"}