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