@applica-software-guru/sdd-core 1.5.1 → 1.6.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/remote/sync-engine.d.ts.map +1 -1
- package/dist/remote/sync-engine.js +115 -45
- package/dist/remote/sync-engine.js.map +1 -1
- package/dist/remote/types.d.ts +2 -0
- package/dist/remote/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/remote/sync-engine.ts +123 -51
- package/src/remote/types.ts +2 -0
- package/tests/sync-engine.test.ts +249 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-engine.d.ts","sourceRoot":"","sources":["../../src/remote/sync-engine.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EAEV,kBAAkB,EAClB,kBAAkB,EAEnB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"sync-engine.d.ts","sourceRoot":"","sources":["../../src/remote/sync-engine.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EAEV,kBAAkB,EAClB,kBAAkB,EAEnB,MAAM,YAAY,CAAC;AA4EpB,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAqJ3F;AAID,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAiExF;AAkBD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAsEnG;AAID,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAsEpG;AAID,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA6BjG"}
|
|
@@ -27,7 +27,8 @@ function normalizePath(p) {
|
|
|
27
27
|
return p.split('\\').join('/');
|
|
28
28
|
}
|
|
29
29
|
/**
|
|
30
|
-
* Build a markdown file with frontmatter for
|
|
30
|
+
* Build a new markdown file with frontmatter — used ONLY for brand-new files
|
|
31
|
+
* that don't exist locally yet.
|
|
31
32
|
*/
|
|
32
33
|
function buildStoryMarkdown(title, body, version, status = 'synced') {
|
|
33
34
|
const fm = {
|
|
@@ -40,7 +41,7 @@ function buildStoryMarkdown(title, body, version, status = 'synced') {
|
|
|
40
41
|
return gray_matter_1.default.stringify(body, fm);
|
|
41
42
|
}
|
|
42
43
|
/**
|
|
43
|
-
* Build a markdown
|
|
44
|
+
* Build a new CR markdown — used ONLY for brand-new CRs that don't exist locally.
|
|
44
45
|
*/
|
|
45
46
|
function buildCRMarkdown(title, body, createdAt, status = 'draft') {
|
|
46
47
|
const fm = {
|
|
@@ -52,7 +53,7 @@ function buildCRMarkdown(title, body, createdAt, status = 'draft') {
|
|
|
52
53
|
return gray_matter_1.default.stringify(body, fm);
|
|
53
54
|
}
|
|
54
55
|
/**
|
|
55
|
-
* Build a markdown
|
|
56
|
+
* Build a new bug markdown — used ONLY for brand-new bugs that don't exist locally.
|
|
56
57
|
*/
|
|
57
58
|
function buildBugMarkdown(title, body, createdAt, status = 'open') {
|
|
58
59
|
const fm = {
|
|
@@ -63,6 +64,29 @@ function buildBugMarkdown(title, body, createdAt, status = 'open') {
|
|
|
63
64
|
};
|
|
64
65
|
return gray_matter_1.default.stringify(body, fm);
|
|
65
66
|
}
|
|
67
|
+
/**
|
|
68
|
+
* Replace only the body (after frontmatter) in a raw markdown string,
|
|
69
|
+
* preserving the exact original frontmatter formatting (quotes, order, etc.).
|
|
70
|
+
*/
|
|
71
|
+
function replaceBody(rawMarkdown, newBody) {
|
|
72
|
+
const firstFence = rawMarkdown.indexOf('---');
|
|
73
|
+
if (firstFence === -1)
|
|
74
|
+
return rawMarkdown;
|
|
75
|
+
const secondFence = rawMarkdown.indexOf('---', firstFence + 3);
|
|
76
|
+
if (secondFence === -1)
|
|
77
|
+
return rawMarkdown;
|
|
78
|
+
const endOfFrontmatter = rawMarkdown.indexOf('\n', secondFence);
|
|
79
|
+
if (endOfFrontmatter === -1)
|
|
80
|
+
return rawMarkdown;
|
|
81
|
+
return rawMarkdown.substring(0, endOfFrontmatter + 1) + '\n' + newBody + '\n';
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Extract the body content from a raw markdown string (after frontmatter).
|
|
85
|
+
*/
|
|
86
|
+
function extractBody(rawMarkdown) {
|
|
87
|
+
const parsed = (0, gray_matter_1.default)(rawMarkdown);
|
|
88
|
+
return parsed.content.trim();
|
|
89
|
+
}
|
|
66
90
|
async function pushToRemote(root, options) {
|
|
67
91
|
const config = await (0, config_manager_js_1.readConfig)(root);
|
|
68
92
|
const api = (0, api_client_js_1.buildApiConfig)(config, options?.timeout);
|
|
@@ -132,6 +156,7 @@ async function pushToRemote(root, options) {
|
|
|
132
156
|
path: normalizePath(cr.relativePath),
|
|
133
157
|
title: cr.frontmatter.title,
|
|
134
158
|
body: cr.body,
|
|
159
|
+
status: cr.frontmatter.status,
|
|
135
160
|
...(tracked ? { id: tracked.remoteId } : {}),
|
|
136
161
|
};
|
|
137
162
|
});
|
|
@@ -168,6 +193,7 @@ async function pushToRemote(root, options) {
|
|
|
168
193
|
path: normalizePath(bug.relativePath),
|
|
169
194
|
title: bug.frontmatter.title,
|
|
170
195
|
body: bug.body,
|
|
196
|
+
status: bug.frontmatter.status,
|
|
171
197
|
...(tracked ? { id: tracked.remoteId } : {}),
|
|
172
198
|
};
|
|
173
199
|
});
|
|
@@ -211,7 +237,7 @@ async function pullFromRemote(root, timeout) {
|
|
|
211
237
|
const absPath = (0, node_path_1.resolve)(root, localPath);
|
|
212
238
|
const tracked = state.documents[localPath];
|
|
213
239
|
if (!(0, node_fs_1.existsSync)(absPath)) {
|
|
214
|
-
//
|
|
240
|
+
// Brand-new file — create locally
|
|
215
241
|
const dir = (0, node_path_1.dirname)(absPath);
|
|
216
242
|
if (!(0, node_fs_1.existsSync)(dir)) {
|
|
217
243
|
await (0, promises_1.mkdir)(dir, { recursive: true });
|
|
@@ -222,12 +248,20 @@ async function pullFromRemote(root, timeout) {
|
|
|
222
248
|
created.push(localPath);
|
|
223
249
|
updateDocState(state, doc, localPath, markdown);
|
|
224
250
|
}
|
|
225
|
-
else
|
|
226
|
-
//
|
|
227
|
-
const
|
|
228
|
-
const
|
|
251
|
+
else {
|
|
252
|
+
// File exists locally — compare body content, not version numbers
|
|
253
|
+
const localRaw = await (0, promises_1.readFile)(absPath, 'utf-8');
|
|
254
|
+
const localBody = extractBody(localRaw);
|
|
255
|
+
const remoteBody = doc.content.trim();
|
|
256
|
+
if (localBody === remoteBody) {
|
|
257
|
+
// Body identical — don't touch the file, just update tracking state
|
|
258
|
+
updateDocState(state, doc, localPath, localRaw);
|
|
259
|
+
continue;
|
|
260
|
+
}
|
|
261
|
+
// Body differs — check for conflict
|
|
262
|
+
const localHash = sha256(localRaw);
|
|
229
263
|
if (tracked && localHash !== tracked.localHash) {
|
|
230
|
-
//
|
|
264
|
+
// Both local and remote changed → conflict
|
|
231
265
|
conflicts.push({
|
|
232
266
|
path: localPath,
|
|
233
267
|
localVersion: tracked.remoteVersion.toString(),
|
|
@@ -236,15 +270,15 @@ async function pullFromRemote(root, timeout) {
|
|
|
236
270
|
});
|
|
237
271
|
}
|
|
238
272
|
else {
|
|
239
|
-
//
|
|
240
|
-
const
|
|
241
|
-
|
|
242
|
-
|
|
273
|
+
// Only remote body changed — surgically replace body, preserve frontmatter
|
|
274
|
+
const newStatus = doc.status === 'draft' ? 'draft' : 'synced';
|
|
275
|
+
let updatedContent = replaceBody(localRaw, doc.content);
|
|
276
|
+
updatedContent = updatedContent.replace(/^status:\s*.+/m, `status: ${newStatus}`);
|
|
277
|
+
await (0, promises_1.writeFile)(absPath, updatedContent, 'utf-8');
|
|
243
278
|
updated.push(localPath);
|
|
244
|
-
updateDocState(state, doc, localPath,
|
|
279
|
+
updateDocState(state, doc, localPath, updatedContent);
|
|
245
280
|
}
|
|
246
281
|
}
|
|
247
|
-
// If versions match, skip
|
|
248
282
|
}
|
|
249
283
|
state.lastPull = new Date().toISOString();
|
|
250
284
|
await (0, state_js_1.writeRemoteState)(root, state);
|
|
@@ -271,35 +305,53 @@ async function pullCRsFromRemote(root, timeout) {
|
|
|
271
305
|
for (const [localPath, entry] of Object.entries(state.changeRequests)) {
|
|
272
306
|
idToPath.set(entry.remoteId, localPath);
|
|
273
307
|
}
|
|
274
|
-
const crDir = (0, node_path_1.resolve)(root, 'change-requests');
|
|
275
|
-
if (!(0, node_fs_1.existsSync)(crDir)) {
|
|
276
|
-
await (0, promises_1.mkdir)(crDir, { recursive: true });
|
|
277
|
-
}
|
|
278
308
|
let created = 0;
|
|
279
309
|
let updated = 0;
|
|
280
310
|
for (const cr of remoteCRs) {
|
|
281
|
-
|
|
282
|
-
const localPath = idToPath.get(cr.id) ?? `change-requests/CR-${cr.id.substring(0, 8)}.md`;
|
|
311
|
+
const localPath = cr.path ?? idToPath.get(cr.id) ?? `change-requests/CR-${cr.id.substring(0, 8)}.md`;
|
|
283
312
|
const absPath = (0, node_path_1.resolve)(root, localPath);
|
|
284
313
|
const dir = (0, node_path_1.dirname)(absPath);
|
|
285
314
|
if (!(0, node_fs_1.existsSync)(dir)) {
|
|
286
315
|
await (0, promises_1.mkdir)(dir, { recursive: true });
|
|
287
316
|
}
|
|
288
|
-
const crStatus = cr.status === 'draft' ? 'draft' : 'pending';
|
|
289
|
-
const markdown = buildCRMarkdown(cr.title, cr.body, cr.created_at, crStatus);
|
|
290
317
|
if ((0, node_fs_1.existsSync)(absPath)) {
|
|
318
|
+
// File exists — compare body, only update if changed
|
|
319
|
+
const localRaw = await (0, promises_1.readFile)(absPath, 'utf-8');
|
|
320
|
+
const localBody = extractBody(localRaw);
|
|
321
|
+
const remoteBody = cr.body.trim();
|
|
322
|
+
if (localBody === remoteBody) {
|
|
323
|
+
// Identical — don't touch the file
|
|
324
|
+
state.changeRequests[normalizePath(localPath)] = {
|
|
325
|
+
remoteId: cr.id,
|
|
326
|
+
localHash: sha256(localRaw),
|
|
327
|
+
lastSynced: new Date().toISOString(),
|
|
328
|
+
};
|
|
329
|
+
continue;
|
|
330
|
+
}
|
|
331
|
+
// Body changed — update body, preserve frontmatter
|
|
332
|
+
const newStatus = cr.status === 'draft' ? 'draft' : 'pending';
|
|
333
|
+
let updatedContent = replaceBody(localRaw, cr.body);
|
|
334
|
+
updatedContent = updatedContent.replace(/^status:\s*.+/m, `status: ${newStatus}`);
|
|
335
|
+
await (0, promises_1.writeFile)(absPath, updatedContent, 'utf-8');
|
|
291
336
|
updated++;
|
|
337
|
+
state.changeRequests[normalizePath(localPath)] = {
|
|
338
|
+
remoteId: cr.id,
|
|
339
|
+
localHash: sha256(updatedContent),
|
|
340
|
+
lastSynced: new Date().toISOString(),
|
|
341
|
+
};
|
|
292
342
|
}
|
|
293
343
|
else {
|
|
344
|
+
// Brand-new CR — create file
|
|
345
|
+
const crStatus = cr.status === 'draft' ? 'draft' : 'pending';
|
|
346
|
+
const markdown = buildCRMarkdown(cr.title, cr.body, cr.created_at, crStatus);
|
|
347
|
+
await (0, promises_1.writeFile)(absPath, markdown, 'utf-8');
|
|
294
348
|
created++;
|
|
349
|
+
state.changeRequests[normalizePath(localPath)] = {
|
|
350
|
+
remoteId: cr.id,
|
|
351
|
+
localHash: sha256(markdown),
|
|
352
|
+
lastSynced: new Date().toISOString(),
|
|
353
|
+
};
|
|
295
354
|
}
|
|
296
|
-
await (0, promises_1.writeFile)(absPath, markdown, 'utf-8');
|
|
297
|
-
// Update state so future pulls keep using the same path
|
|
298
|
-
state.changeRequests[normalizePath(localPath)] = {
|
|
299
|
-
remoteId: cr.id,
|
|
300
|
-
localHash: sha256(markdown),
|
|
301
|
-
lastSynced: new Date().toISOString(),
|
|
302
|
-
};
|
|
303
355
|
}
|
|
304
356
|
await (0, state_js_1.writeRemoteState)(root, state);
|
|
305
357
|
return { created, updated };
|
|
@@ -317,35 +369,53 @@ async function pullBugsFromRemote(root, timeout) {
|
|
|
317
369
|
for (const [localPath, entry] of Object.entries(state.bugs)) {
|
|
318
370
|
idToPath.set(entry.remoteId, localPath);
|
|
319
371
|
}
|
|
320
|
-
const bugsDir = (0, node_path_1.resolve)(root, 'bugs');
|
|
321
|
-
if (!(0, node_fs_1.existsSync)(bugsDir)) {
|
|
322
|
-
await (0, promises_1.mkdir)(bugsDir, { recursive: true });
|
|
323
|
-
}
|
|
324
372
|
let created = 0;
|
|
325
373
|
let updated = 0;
|
|
326
374
|
for (const bug of remoteBugs) {
|
|
327
|
-
|
|
328
|
-
const localPath = idToPath.get(bug.id) ?? `bugs/BUG-${bug.id.substring(0, 8)}.md`;
|
|
375
|
+
const localPath = bug.path ?? idToPath.get(bug.id) ?? `bugs/BUG-${bug.id.substring(0, 8)}.md`;
|
|
329
376
|
const absPath = (0, node_path_1.resolve)(root, localPath);
|
|
330
377
|
const dir = (0, node_path_1.dirname)(absPath);
|
|
331
378
|
if (!(0, node_fs_1.existsSync)(dir)) {
|
|
332
379
|
await (0, promises_1.mkdir)(dir, { recursive: true });
|
|
333
380
|
}
|
|
334
|
-
const bugStatus = bug.status === 'draft' ? 'draft' : 'open';
|
|
335
|
-
const markdown = buildBugMarkdown(bug.title, bug.body, bug.created_at, bugStatus);
|
|
336
381
|
if ((0, node_fs_1.existsSync)(absPath)) {
|
|
382
|
+
// File exists — compare body, only update if changed
|
|
383
|
+
const localRaw = await (0, promises_1.readFile)(absPath, 'utf-8');
|
|
384
|
+
const localBody = extractBody(localRaw);
|
|
385
|
+
const remoteBody = bug.body.trim();
|
|
386
|
+
if (localBody === remoteBody) {
|
|
387
|
+
// Identical — don't touch the file
|
|
388
|
+
state.bugs[normalizePath(localPath)] = {
|
|
389
|
+
remoteId: bug.id,
|
|
390
|
+
localHash: sha256(localRaw),
|
|
391
|
+
lastSynced: new Date().toISOString(),
|
|
392
|
+
};
|
|
393
|
+
continue;
|
|
394
|
+
}
|
|
395
|
+
// Body changed — update body, preserve frontmatter
|
|
396
|
+
const newStatus = bug.status === 'draft' ? 'draft' : 'open';
|
|
397
|
+
let updatedContent = replaceBody(localRaw, bug.body);
|
|
398
|
+
updatedContent = updatedContent.replace(/^status:\s*.+/m, `status: ${newStatus}`);
|
|
399
|
+
await (0, promises_1.writeFile)(absPath, updatedContent, 'utf-8');
|
|
337
400
|
updated++;
|
|
401
|
+
state.bugs[normalizePath(localPath)] = {
|
|
402
|
+
remoteId: bug.id,
|
|
403
|
+
localHash: sha256(updatedContent),
|
|
404
|
+
lastSynced: new Date().toISOString(),
|
|
405
|
+
};
|
|
338
406
|
}
|
|
339
407
|
else {
|
|
408
|
+
// Brand-new bug — create file
|
|
409
|
+
const bugStatus = bug.status === 'draft' ? 'draft' : 'open';
|
|
410
|
+
const markdown = buildBugMarkdown(bug.title, bug.body, bug.created_at, bugStatus);
|
|
411
|
+
await (0, promises_1.writeFile)(absPath, markdown, 'utf-8');
|
|
340
412
|
created++;
|
|
413
|
+
state.bugs[normalizePath(localPath)] = {
|
|
414
|
+
remoteId: bug.id,
|
|
415
|
+
localHash: sha256(markdown),
|
|
416
|
+
lastSynced: new Date().toISOString(),
|
|
417
|
+
};
|
|
341
418
|
}
|
|
342
|
-
await (0, promises_1.writeFile)(absPath, markdown, 'utf-8');
|
|
343
|
-
// Update state so future pulls keep using the same path
|
|
344
|
-
state.bugs[normalizePath(localPath)] = {
|
|
345
|
-
remoteId: bug.id,
|
|
346
|
-
localHash: sha256(markdown),
|
|
347
|
-
lastSynced: new Date().toISOString(),
|
|
348
|
-
};
|
|
349
419
|
}
|
|
350
420
|
await (0, state_js_1.writeRemoteState)(root, state);
|
|
351
421
|
return { created, updated };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-engine.js","sourceRoot":"","sources":["../../src/remote/sync-engine.ts"],"names":[],"mappings":";;;;;AA8EA,oCAmJC;AAID,wCAwDC;AAkBD,8CAmDC;AAID,gDAmDC;AAID,0CA6BC;AA1bD,+CAA8D;AAC9D,qCAAqC;AACrC,yCAAoD;AACpD,6CAAyC;AACzC,8DAAiC;AAEjC,mEAAyD;AACzD,+DAA+D;AAC/D,yDAAyD;AACzD,2DAA2D;AAC3D,mDAAwH;AACxH,yCAA+D;AAU/D,SAAS,MAAM,CAAC,OAAe;IAC7B,OAAO,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACrE,CAAC;AAED,wEAAwE;AACxE,SAAS,aAAa,CAAC,CAAS;IAC9B,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,KAAa,EAAE,IAAY,EAAE,OAAe,EAAE,SAAiB,QAAQ;IACjG,MAAM,EAAE,GAAG;QACT,KAAK;QACL,MAAM;QACN,MAAM,EAAE,QAAQ;QAChB,eAAe,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACzC,OAAO,EAAE,GAAG,OAAO,IAAI;KACxB,CAAC;IACF,OAAO,qBAAM,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,KAAa,EAAE,IAAY,EAAE,SAAiB,EAAE,SAAiB,OAAO;IAC/F,MAAM,EAAE,GAAG;QACT,KAAK;QACL,MAAM;QACN,MAAM,EAAE,QAAQ;QAChB,YAAY,EAAE,SAAS;KACxB,CAAC;IACF,OAAO,qBAAM,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,KAAa,EAAE,IAAY,EAAE,SAAiB,EAAE,SAAiB,MAAM;IAC/F,MAAM,EAAE,GAAG;QACT,KAAK;QACL,MAAM;QACN,MAAM,EAAE,QAAQ;QAChB,YAAY,EAAE,SAAS;KACxB,CAAC;IACF,OAAO,qBAAM,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AACpC,CAAC;AAUM,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,OAAqB;IACpE,MAAM,MAAM,GAAG,MAAM,IAAA,8BAAU,EAAC,IAAI,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,IAAA,8BAAc,EAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,MAAM,IAAA,0BAAe,EAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,KAAK,CAAC,cAAc;QAAE,KAAK,CAAC,cAAc,GAAG,EAAE,CAAC;IACrD,IAAI,CAAC,KAAK,CAAC,IAAI;QAAE,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC;IAEjC,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,0EAA0E;IAC1E,MAAM,KAAK,GAAG,MAAM,IAAA,oCAAkB,EAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QAChC,IAAI,OAAO,EAAE,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QAC9F,IAAI,OAAO,EAAE,GAAG;YAAE,OAAO,IAAI,CAAC;QAC9B,OAAO,CAAC,CAAC,WAAW,CAAC,MAAM,KAAK,QAAQ,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACnC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC;YACnC,KAAK,EAAE,CAAC,CAAC,WAAW,CAAC,KAAK;YAC1B,OAAO,EAAE,CAAC,CAAC,IAAI;SAChB,CAAC,CAAC,CAAC;QAEJ,MAAM,MAAM,GAAG,MAAM,IAAA,wBAAQ,EAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAE9C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACnC,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC;YAC3B,MAAM,OAAO,GAAG,IAAA,mBAAO,EAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACzC,MAAM,UAAU,GAAG,IAAA,oBAAU,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,IAAA,mBAAQ,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/E,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG;gBAC3B,QAAQ,EAAE,GAAG,CAAC,EAAE;gBAChB,aAAa,EAAE,GAAG,CAAC,OAAO;gBAC1B,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC;gBAC7B,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACrC,CAAC;QACJ,CAAC;QAED,mFAAmF;QACnF,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,IAAI,CAAC,CAAC,WAAW,CAAC,MAAM,KAAK,OAAO;gBAAE,SAAS;YAC/C,MAAM,OAAO,GAAG,IAAA,mBAAO,EAAC,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC;YAC9C,MAAM,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACjD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,2BAA2B,EAAE,gBAAgB,CAAC,CAAC;YAC/E,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;gBACxB,MAAM,IAAA,oBAAS,EAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QAED,YAAY,IAAI,MAAM,CAAC,OAAO,CAAC;QAC/B,YAAY,IAAI,MAAM,CAAC,OAAO,CAAC;QAC/B,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,0EAA0E;IAC1E,MAAM,OAAO,GAAG,MAAM,IAAA,8BAAe,EAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE;QACtC,IAAI,OAAO,EAAE,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;QAC/F,IAAI,OAAO,EAAE,GAAG;YAAE,OAAO,IAAI,CAAC;QAC9B,OAAO,EAAE,CAAC,WAAW,CAAC,MAAM,KAAK,SAAS,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;YACrC,MAAM,OAAO,GAAG,KAAK,CAAC,cAAe,CAAC,aAAa,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;YACtE,OAAO;gBACL,IAAI,EAAE,aAAa,CAAC,EAAE,CAAC,YAAY,CAAC;gBACpC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK;gBAC3B,IAAI,EAAE,EAAE,CAAC,IAAI;gBACb,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC7C,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,IAAA,uBAAO,EAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAE/C,KAAK,MAAM,EAAE,IAAI,QAAQ,CAAC,eAAe,EAAE,CAAC;YAC1C,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAC9B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,KAAK,EAAE,CAAC,KAAK,CACxC,EAAE,YAAY,CAAC;YAChB,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,OAAO,GAAG,IAAA,mBAAO,EAAC,IAAI,EAAE,SAAS,CAAC,CAAC;gBACzC,MAAM,UAAU,GAAG,IAAA,oBAAU,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,IAAA,mBAAQ,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/E,KAAK,CAAC,cAAe,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,GAAG;oBAChD,QAAQ,EAAE,EAAE,CAAC,EAAE;oBACf,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC;oBAC7B,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACrC,CAAC;YACJ,CAAC;QACH,CAAC;QAED,YAAY,IAAI,QAAQ,CAAC,OAAO,CAAC;QACjC,YAAY,IAAI,QAAQ,CAAC,OAAO,CAAC;QACjC,SAAS,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,0EAA0E;IAC1E,MAAM,QAAQ,GAAG,MAAM,IAAA,gCAAgB,EAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;QACzC,IAAI,OAAO,EAAE,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAChG,IAAI,OAAO,EAAE,GAAG;YAAE,OAAO,IAAI,CAAC;QAC9B,OAAO,GAAG,CAAC,WAAW,CAAC,MAAM,KAAK,UAAU,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACxC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAK,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;YAC7D,OAAO;gBACL,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC;gBACrC,KAAK,EAAE,GAAG,CAAC,WAAW,CAAC,KAAK;gBAC5B,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC7C,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,MAAM,IAAA,wBAAQ,EAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAElD,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;YACjC,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAC/B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,CACzC,EAAE,YAAY,CAAC;YAChB,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,OAAO,GAAG,IAAA,mBAAO,EAAC,IAAI,EAAE,SAAS,CAAC,CAAC;gBACzC,MAAM,UAAU,GAAG,IAAA,oBAAU,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,IAAA,mBAAQ,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/E,KAAK,CAAC,IAAK,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,GAAG;oBACtC,QAAQ,EAAE,GAAG,CAAC,EAAE;oBAChB,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC;oBAC7B,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACrC,CAAC;YACJ,CAAC;QACH,CAAC;QAED,YAAY,IAAI,SAAS,CAAC,OAAO,CAAC;QAClC,YAAY,IAAI,SAAS,CAAC,OAAO,CAAC;QAClC,SAAS,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,0EAA0E;IAC1E,KAAK,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1C,MAAM,IAAA,2BAAgB,EAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAEpC,OAAO;QACL,OAAO,EAAE,YAAY;QACrB,OAAO,EAAE,YAAY;QACrB,MAAM,EAAE,SAAS;KAClB,CAAC;AACJ,CAAC;AAED,4EAA4E;AAErE,KAAK,UAAU,cAAc,CAAC,IAAY,EAAE,OAAgB;IACjE,MAAM,MAAM,GAAG,MAAM,IAAA,8BAAU,EAAC,IAAI,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,IAAA,8BAAc,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE5C,MAAM,UAAU,GAAG,MAAM,IAAA,wBAAQ,EAAC,GAAG,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,MAAM,IAAA,0BAAe,EAAC,IAAI,CAAC,CAAC;IAE1C,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,SAAS,GAAmB,EAAE,CAAC;IAErC,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC;QAC3B,MAAM,OAAO,GAAG,IAAA,mBAAO,EAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAE3C,IAAI,CAAC,IAAA,oBAAU,EAAC,OAAO,CAAC,EAAE,CAAC;YACzB,sDAAsD;YACtD,MAAM,GAAG,GAAG,IAAA,mBAAO,EAAC,OAAO,CAAC,CAAC;YAC7B,IAAI,CAAC,IAAA,oBAAU,EAAC,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,IAAA,gBAAK,EAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxC,CAAC;YACD,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;YAChE,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YACtF,MAAM,IAAA,oBAAS,EAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxB,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAClD,CAAC;aAAM,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;YAC3D,4CAA4C;YAC5C,MAAM,YAAY,GAAG,MAAM,IAAA,mBAAQ,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACtD,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;YAEvC,IAAI,OAAO,IAAI,SAAS,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC;gBAC/C,mEAAmE;gBACnE,SAAS,CAAC,IAAI,CAAC;oBACb,IAAI,EAAE,SAAS;oBACf,YAAY,EAAE,OAAO,CAAC,aAAa,CAAC,QAAQ,EAAE;oBAC9C,aAAa,EAAE,GAAG,CAAC,OAAO;oBAC1B,MAAM,EAAE,oDAAoD;iBAC7D,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,sCAAsC;gBACtC,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAChE,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;gBACtF,MAAM,IAAA,oBAAS,EAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC5C,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACxB,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QACD,0BAA0B;IAC5B,CAAC;IAED,KAAK,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1C,MAAM,IAAA,2BAAgB,EAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAEpC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AACzC,CAAC;AAED,SAAS,cAAc,CACrB,KAAwH,EACxH,GAAsB,EACtB,SAAiB,EACjB,eAAuB;IAEvB,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG;QAC3B,QAAQ,EAAE,GAAG,CAAC,EAAE;QAChB,aAAa,EAAE,GAAG,CAAC,OAAO;QAC1B,SAAS,EAAE,MAAM,CAAC,eAAe,CAAC;QAClC,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACrC,CAAC;AACJ,CAAC;AAED,4EAA4E;AAErE,KAAK,UAAU,iBAAiB,CAAC,IAAY,EAAE,OAAgB;IACpE,MAAM,MAAM,GAAG,MAAM,IAAA,8BAAU,EAAC,IAAI,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,IAAA,8BAAc,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE5C,MAAM,SAAS,GAAG,MAAM,IAAA,+BAAe,EAAC,GAAG,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,MAAM,IAAA,0BAAe,EAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,KAAK,CAAC,cAAc;QAAE,KAAK,CAAC,cAAc,GAAG,EAAE,CAAC;IAErD,0CAA0C;IAC1C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;QACtE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,KAAK,GAAG,IAAA,mBAAO,EAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;IAC/C,IAAI,CAAC,IAAA,oBAAU,EAAC,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAA,gBAAK,EAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;QAC3B,yFAAyF;QACzF,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,sBAAsB,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC;QAC1F,MAAM,OAAO,GAAG,IAAA,mBAAO,EAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,IAAA,mBAAO,EAAC,OAAO,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAA,oBAAU,EAAC,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,IAAA,gBAAK,EAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,QAAQ,GAAG,EAAE,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7D,MAAM,QAAQ,GAAG,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAE7E,IAAI,IAAA,oBAAU,EAAC,OAAO,CAAC,EAAE,CAAC;YACxB,OAAO,EAAE,CAAC;QACZ,CAAC;aAAM,CAAC;YACN,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,IAAA,oBAAS,EAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAE5C,wDAAwD;QACxD,KAAK,CAAC,cAAe,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,GAAG;YAChD,QAAQ,EAAE,EAAE,CAAC,EAAE;YACf,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC;YAC3B,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACrC,CAAC;IACJ,CAAC;IAED,MAAM,IAAA,2BAAgB,EAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACpC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC9B,CAAC;AAED,4EAA4E;AAErE,KAAK,UAAU,kBAAkB,CAAC,IAAY,EAAE,OAAgB;IACrE,MAAM,MAAM,GAAG,MAAM,IAAA,8BAAU,EAAC,IAAI,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,IAAA,8BAAc,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE5C,MAAM,UAAU,GAAG,MAAM,IAAA,6BAAa,EAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,MAAM,IAAA,0BAAe,EAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,KAAK,CAAC,IAAI;QAAE,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC;IAEjC,0CAA0C;IAC1C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,OAAO,GAAG,IAAA,mBAAO,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC,IAAA,oBAAU,EAAC,OAAO,CAAC,EAAE,CAAC;QACzB,MAAM,IAAA,gBAAK,EAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,0FAA0F;QAC1F,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC;QAClF,MAAM,OAAO,GAAG,IAAA,mBAAO,EAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,IAAA,mBAAO,EAAC,OAAO,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAA,oBAAU,EAAC,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,IAAA,gBAAK,EAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QAC5D,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAElF,IAAI,IAAA,oBAAU,EAAC,OAAO,CAAC,EAAE,CAAC;YACxB,OAAO,EAAE,CAAC;QACZ,CAAC;aAAM,CAAC;YACN,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,IAAA,oBAAS,EAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAE5C,wDAAwD;QACxD,KAAK,CAAC,IAAK,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,GAAG;YACtC,QAAQ,EAAE,GAAG,CAAC,EAAE;YAChB,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC;YAC3B,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACrC,CAAC;IACJ,CAAC;IAED,MAAM,IAAA,2BAAgB,EAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACpC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC9B,CAAC;AAED,4EAA4E;AAErE,KAAK,UAAU,eAAe,CAAC,IAAY,EAAE,OAAgB;IAClE,MAAM,MAAM,GAAG,MAAM,IAAA,8BAAU,EAAC,IAAI,CAAC,CAAC;IAEtC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC;QACxB,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;IAC5F,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,IAAA,oCAAkB,EAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;IAEnF,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAA,8BAAc,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,MAAM,IAAA,wBAAQ,EAAC,GAAG,CAAC,CAAC;QACjC,OAAO;YACL,UAAU,EAAE,IAAI;YAChB,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG;YACtB,SAAS,EAAE,IAAI;YACf,YAAY;YACZ,UAAU,EAAE,IAAI,CAAC,MAAM;SACxB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,UAAU,EAAE,IAAI;YAChB,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG;YACtB,SAAS,EAAE,KAAK;YAChB,YAAY;YACZ,UAAU,EAAE,CAAC;SACd,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"sync-engine.js","sourceRoot":"","sources":["../../src/remote/sync-engine.ts"],"names":[],"mappings":"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"}
|
package/dist/remote/types.d.ts
CHANGED
|
@@ -21,6 +21,7 @@ export interface RemoteDocBulkResponse {
|
|
|
21
21
|
export interface RemoteCRResponse {
|
|
22
22
|
id: string;
|
|
23
23
|
project_id: string;
|
|
24
|
+
path: string | null;
|
|
24
25
|
title: string;
|
|
25
26
|
body: string;
|
|
26
27
|
status: string;
|
|
@@ -35,6 +36,7 @@ export interface RemoteCRResponse {
|
|
|
35
36
|
export interface RemoteBugResponse {
|
|
36
37
|
id: string;
|
|
37
38
|
project_id: string;
|
|
39
|
+
path: string | null;
|
|
38
40
|
title: string;
|
|
39
41
|
body: string;
|
|
40
42
|
status: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/remote/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/remote/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -29,7 +29,8 @@ function normalizePath(p: string): string {
|
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
/**
|
|
32
|
-
* Build a markdown file with frontmatter for
|
|
32
|
+
* Build a new markdown file with frontmatter — used ONLY for brand-new files
|
|
33
|
+
* that don't exist locally yet.
|
|
33
34
|
*/
|
|
34
35
|
function buildStoryMarkdown(title: string, body: string, version: number, status: string = 'synced'): string {
|
|
35
36
|
const fm = {
|
|
@@ -43,7 +44,7 @@ function buildStoryMarkdown(title: string, body: string, version: number, status
|
|
|
43
44
|
}
|
|
44
45
|
|
|
45
46
|
/**
|
|
46
|
-
* Build a markdown
|
|
47
|
+
* Build a new CR markdown — used ONLY for brand-new CRs that don't exist locally.
|
|
47
48
|
*/
|
|
48
49
|
function buildCRMarkdown(title: string, body: string, createdAt: string, status: string = 'draft'): string {
|
|
49
50
|
const fm = {
|
|
@@ -56,7 +57,7 @@ function buildCRMarkdown(title: string, body: string, createdAt: string, status:
|
|
|
56
57
|
}
|
|
57
58
|
|
|
58
59
|
/**
|
|
59
|
-
* Build a markdown
|
|
60
|
+
* Build a new bug markdown — used ONLY for brand-new bugs that don't exist locally.
|
|
60
61
|
*/
|
|
61
62
|
function buildBugMarkdown(title: string, body: string, createdAt: string, status: string = 'open'): string {
|
|
62
63
|
const fm = {
|
|
@@ -68,6 +69,28 @@ function buildBugMarkdown(title: string, body: string, createdAt: string, status
|
|
|
68
69
|
return matter.stringify(body, fm);
|
|
69
70
|
}
|
|
70
71
|
|
|
72
|
+
/**
|
|
73
|
+
* Replace only the body (after frontmatter) in a raw markdown string,
|
|
74
|
+
* preserving the exact original frontmatter formatting (quotes, order, etc.).
|
|
75
|
+
*/
|
|
76
|
+
function replaceBody(rawMarkdown: string, newBody: string): string {
|
|
77
|
+
const firstFence = rawMarkdown.indexOf('---');
|
|
78
|
+
if (firstFence === -1) return rawMarkdown;
|
|
79
|
+
const secondFence = rawMarkdown.indexOf('---', firstFence + 3);
|
|
80
|
+
if (secondFence === -1) return rawMarkdown;
|
|
81
|
+
const endOfFrontmatter = rawMarkdown.indexOf('\n', secondFence);
|
|
82
|
+
if (endOfFrontmatter === -1) return rawMarkdown;
|
|
83
|
+
return rawMarkdown.substring(0, endOfFrontmatter + 1) + '\n' + newBody + '\n';
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Extract the body content from a raw markdown string (after frontmatter).
|
|
88
|
+
*/
|
|
89
|
+
function extractBody(rawMarkdown: string): string {
|
|
90
|
+
const parsed = matter(rawMarkdown);
|
|
91
|
+
return parsed.content.trim();
|
|
92
|
+
}
|
|
93
|
+
|
|
71
94
|
// ─── Push ────────────────────────────────────────────────────────────────
|
|
72
95
|
|
|
73
96
|
export interface PushOptions {
|
|
@@ -147,6 +170,7 @@ export async function pushToRemote(root: string, options?: PushOptions): Promise
|
|
|
147
170
|
path: normalizePath(cr.relativePath),
|
|
148
171
|
title: cr.frontmatter.title,
|
|
149
172
|
body: cr.body,
|
|
173
|
+
status: cr.frontmatter.status,
|
|
150
174
|
...(tracked ? { id: tracked.remoteId } : {}),
|
|
151
175
|
};
|
|
152
176
|
});
|
|
@@ -188,6 +212,7 @@ export async function pushToRemote(root: string, options?: PushOptions): Promise
|
|
|
188
212
|
path: normalizePath(bug.relativePath),
|
|
189
213
|
title: bug.frontmatter.title,
|
|
190
214
|
body: bug.body,
|
|
215
|
+
status: bug.frontmatter.status,
|
|
191
216
|
...(tracked ? { id: tracked.remoteId } : {}),
|
|
192
217
|
};
|
|
193
218
|
});
|
|
@@ -244,7 +269,7 @@ export async function pullFromRemote(root: string, timeout?: number): Promise<Pu
|
|
|
244
269
|
const tracked = state.documents[localPath];
|
|
245
270
|
|
|
246
271
|
if (!existsSync(absPath)) {
|
|
247
|
-
//
|
|
272
|
+
// Brand-new file — create locally
|
|
248
273
|
const dir = dirname(absPath);
|
|
249
274
|
if (!existsSync(dir)) {
|
|
250
275
|
await mkdir(dir, { recursive: true });
|
|
@@ -254,13 +279,22 @@ export async function pullFromRemote(root: string, timeout?: number): Promise<Pu
|
|
|
254
279
|
await writeFile(absPath, markdown, 'utf-8');
|
|
255
280
|
created.push(localPath);
|
|
256
281
|
updateDocState(state, doc, localPath, markdown);
|
|
257
|
-
} else
|
|
258
|
-
//
|
|
259
|
-
const
|
|
260
|
-
const
|
|
282
|
+
} else {
|
|
283
|
+
// File exists locally — compare body content, not version numbers
|
|
284
|
+
const localRaw = await readFile(absPath, 'utf-8');
|
|
285
|
+
const localBody = extractBody(localRaw);
|
|
286
|
+
const remoteBody = doc.content.trim();
|
|
287
|
+
|
|
288
|
+
if (localBody === remoteBody) {
|
|
289
|
+
// Body identical — don't touch the file, just update tracking state
|
|
290
|
+
updateDocState(state, doc, localPath, localRaw);
|
|
291
|
+
continue;
|
|
292
|
+
}
|
|
261
293
|
|
|
294
|
+
// Body differs — check for conflict
|
|
295
|
+
const localHash = sha256(localRaw);
|
|
262
296
|
if (tracked && localHash !== tracked.localHash) {
|
|
263
|
-
//
|
|
297
|
+
// Both local and remote changed → conflict
|
|
264
298
|
conflicts.push({
|
|
265
299
|
path: localPath,
|
|
266
300
|
localVersion: tracked.remoteVersion.toString(),
|
|
@@ -268,15 +302,15 @@ export async function pullFromRemote(root: string, timeout?: number): Promise<Pu
|
|
|
268
302
|
reason: 'Both local and remote have changes since last sync',
|
|
269
303
|
});
|
|
270
304
|
} else {
|
|
271
|
-
//
|
|
272
|
-
const
|
|
273
|
-
|
|
274
|
-
|
|
305
|
+
// Only remote body changed — surgically replace body, preserve frontmatter
|
|
306
|
+
const newStatus = doc.status === 'draft' ? 'draft' : 'synced';
|
|
307
|
+
let updatedContent = replaceBody(localRaw, doc.content);
|
|
308
|
+
updatedContent = updatedContent.replace(/^status:\s*.+/m, `status: ${newStatus}`);
|
|
309
|
+
await writeFile(absPath, updatedContent, 'utf-8');
|
|
275
310
|
updated.push(localPath);
|
|
276
|
-
updateDocState(state, doc, localPath,
|
|
311
|
+
updateDocState(state, doc, localPath, updatedContent);
|
|
277
312
|
}
|
|
278
313
|
}
|
|
279
|
-
// If versions match, skip
|
|
280
314
|
}
|
|
281
315
|
|
|
282
316
|
state.lastPull = new Date().toISOString();
|
|
@@ -315,39 +349,58 @@ export async function pullCRsFromRemote(root: string, timeout?: number): Promise
|
|
|
315
349
|
idToPath.set(entry.remoteId, localPath);
|
|
316
350
|
}
|
|
317
351
|
|
|
318
|
-
const crDir = resolve(root, 'change-requests');
|
|
319
|
-
if (!existsSync(crDir)) {
|
|
320
|
-
await mkdir(crDir, { recursive: true });
|
|
321
|
-
}
|
|
322
|
-
|
|
323
352
|
let created = 0;
|
|
324
353
|
let updated = 0;
|
|
325
354
|
|
|
326
355
|
for (const cr of remoteCRs) {
|
|
327
|
-
|
|
328
|
-
const localPath = idToPath.get(cr.id) ?? `change-requests/CR-${cr.id.substring(0, 8)}.md`;
|
|
356
|
+
const localPath = cr.path ?? idToPath.get(cr.id) ?? `change-requests/CR-${cr.id.substring(0, 8)}.md`;
|
|
329
357
|
const absPath = resolve(root, localPath);
|
|
330
358
|
const dir = dirname(absPath);
|
|
331
359
|
if (!existsSync(dir)) {
|
|
332
360
|
await mkdir(dir, { recursive: true });
|
|
333
361
|
}
|
|
334
362
|
|
|
335
|
-
const crStatus = cr.status === 'draft' ? 'draft' : 'pending';
|
|
336
|
-
const markdown = buildCRMarkdown(cr.title, cr.body, cr.created_at, crStatus);
|
|
337
|
-
|
|
338
363
|
if (existsSync(absPath)) {
|
|
364
|
+
// File exists — compare body, only update if changed
|
|
365
|
+
const localRaw = await readFile(absPath, 'utf-8');
|
|
366
|
+
const localBody = extractBody(localRaw);
|
|
367
|
+
const remoteBody = cr.body.trim();
|
|
368
|
+
|
|
369
|
+
if (localBody === remoteBody) {
|
|
370
|
+
// Identical — don't touch the file
|
|
371
|
+
state.changeRequests![normalizePath(localPath)] = {
|
|
372
|
+
remoteId: cr.id,
|
|
373
|
+
localHash: sha256(localRaw),
|
|
374
|
+
lastSynced: new Date().toISOString(),
|
|
375
|
+
};
|
|
376
|
+
continue;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
// Body changed — update body, preserve frontmatter
|
|
380
|
+
const newStatus = cr.status === 'draft' ? 'draft' : 'pending';
|
|
381
|
+
let updatedContent = replaceBody(localRaw, cr.body);
|
|
382
|
+
updatedContent = updatedContent.replace(/^status:\s*.+/m, `status: ${newStatus}`);
|
|
383
|
+
await writeFile(absPath, updatedContent, 'utf-8');
|
|
339
384
|
updated++;
|
|
385
|
+
|
|
386
|
+
state.changeRequests![normalizePath(localPath)] = {
|
|
387
|
+
remoteId: cr.id,
|
|
388
|
+
localHash: sha256(updatedContent),
|
|
389
|
+
lastSynced: new Date().toISOString(),
|
|
390
|
+
};
|
|
340
391
|
} else {
|
|
392
|
+
// Brand-new CR — create file
|
|
393
|
+
const crStatus = cr.status === 'draft' ? 'draft' : 'pending';
|
|
394
|
+
const markdown = buildCRMarkdown(cr.title, cr.body, cr.created_at, crStatus);
|
|
395
|
+
await writeFile(absPath, markdown, 'utf-8');
|
|
341
396
|
created++;
|
|
342
|
-
}
|
|
343
|
-
await writeFile(absPath, markdown, 'utf-8');
|
|
344
397
|
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
}
|
|
398
|
+
state.changeRequests![normalizePath(localPath)] = {
|
|
399
|
+
remoteId: cr.id,
|
|
400
|
+
localHash: sha256(markdown),
|
|
401
|
+
lastSynced: new Date().toISOString(),
|
|
402
|
+
};
|
|
403
|
+
}
|
|
351
404
|
}
|
|
352
405
|
|
|
353
406
|
await writeRemoteState(root, state);
|
|
@@ -370,39 +423,58 @@ export async function pullBugsFromRemote(root: string, timeout?: number): Promis
|
|
|
370
423
|
idToPath.set(entry.remoteId, localPath);
|
|
371
424
|
}
|
|
372
425
|
|
|
373
|
-
const bugsDir = resolve(root, 'bugs');
|
|
374
|
-
if (!existsSync(bugsDir)) {
|
|
375
|
-
await mkdir(bugsDir, { recursive: true });
|
|
376
|
-
}
|
|
377
|
-
|
|
378
426
|
let created = 0;
|
|
379
427
|
let updated = 0;
|
|
380
428
|
|
|
381
429
|
for (const bug of remoteBugs) {
|
|
382
|
-
|
|
383
|
-
const localPath = idToPath.get(bug.id) ?? `bugs/BUG-${bug.id.substring(0, 8)}.md`;
|
|
430
|
+
const localPath = bug.path ?? idToPath.get(bug.id) ?? `bugs/BUG-${bug.id.substring(0, 8)}.md`;
|
|
384
431
|
const absPath = resolve(root, localPath);
|
|
385
432
|
const dir = dirname(absPath);
|
|
386
433
|
if (!existsSync(dir)) {
|
|
387
434
|
await mkdir(dir, { recursive: true });
|
|
388
435
|
}
|
|
389
436
|
|
|
390
|
-
const bugStatus = bug.status === 'draft' ? 'draft' : 'open';
|
|
391
|
-
const markdown = buildBugMarkdown(bug.title, bug.body, bug.created_at, bugStatus);
|
|
392
|
-
|
|
393
437
|
if (existsSync(absPath)) {
|
|
438
|
+
// File exists — compare body, only update if changed
|
|
439
|
+
const localRaw = await readFile(absPath, 'utf-8');
|
|
440
|
+
const localBody = extractBody(localRaw);
|
|
441
|
+
const remoteBody = bug.body.trim();
|
|
442
|
+
|
|
443
|
+
if (localBody === remoteBody) {
|
|
444
|
+
// Identical — don't touch the file
|
|
445
|
+
state.bugs![normalizePath(localPath)] = {
|
|
446
|
+
remoteId: bug.id,
|
|
447
|
+
localHash: sha256(localRaw),
|
|
448
|
+
lastSynced: new Date().toISOString(),
|
|
449
|
+
};
|
|
450
|
+
continue;
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
// Body changed — update body, preserve frontmatter
|
|
454
|
+
const newStatus = bug.status === 'draft' ? 'draft' : 'open';
|
|
455
|
+
let updatedContent = replaceBody(localRaw, bug.body);
|
|
456
|
+
updatedContent = updatedContent.replace(/^status:\s*.+/m, `status: ${newStatus}`);
|
|
457
|
+
await writeFile(absPath, updatedContent, 'utf-8');
|
|
394
458
|
updated++;
|
|
459
|
+
|
|
460
|
+
state.bugs![normalizePath(localPath)] = {
|
|
461
|
+
remoteId: bug.id,
|
|
462
|
+
localHash: sha256(updatedContent),
|
|
463
|
+
lastSynced: new Date().toISOString(),
|
|
464
|
+
};
|
|
395
465
|
} else {
|
|
466
|
+
// Brand-new bug — create file
|
|
467
|
+
const bugStatus = bug.status === 'draft' ? 'draft' : 'open';
|
|
468
|
+
const markdown = buildBugMarkdown(bug.title, bug.body, bug.created_at, bugStatus);
|
|
469
|
+
await writeFile(absPath, markdown, 'utf-8');
|
|
396
470
|
created++;
|
|
397
|
-
}
|
|
398
|
-
await writeFile(absPath, markdown, 'utf-8');
|
|
399
471
|
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
}
|
|
472
|
+
state.bugs![normalizePath(localPath)] = {
|
|
473
|
+
remoteId: bug.id,
|
|
474
|
+
localHash: sha256(markdown),
|
|
475
|
+
lastSynced: new Date().toISOString(),
|
|
476
|
+
};
|
|
477
|
+
}
|
|
406
478
|
}
|
|
407
479
|
|
|
408
480
|
await writeRemoteState(root, state);
|
package/src/remote/types.ts
CHANGED
|
@@ -23,6 +23,7 @@ export interface RemoteDocBulkResponse {
|
|
|
23
23
|
export interface RemoteCRResponse {
|
|
24
24
|
id: string;
|
|
25
25
|
project_id: string;
|
|
26
|
+
path: string | null;
|
|
26
27
|
title: string;
|
|
27
28
|
body: string;
|
|
28
29
|
status: string;
|
|
@@ -38,6 +39,7 @@ export interface RemoteCRResponse {
|
|
|
38
39
|
export interface RemoteBugResponse {
|
|
39
40
|
id: string;
|
|
40
41
|
project_id: string;
|
|
42
|
+
path: string | null;
|
|
41
43
|
title: string;
|
|
42
44
|
body: string;
|
|
43
45
|
status: string;
|
|
@@ -180,10 +180,11 @@ describe('Sync engine - pull', () => {
|
|
|
180
180
|
},
|
|
181
181
|
});
|
|
182
182
|
|
|
183
|
+
// Remote has DIFFERENT body content to trigger a real conflict
|
|
183
184
|
globalThis.fetch = vi.fn().mockResolvedValue({
|
|
184
185
|
ok: true,
|
|
185
186
|
status: 200,
|
|
186
|
-
json: async () => [makeDocResponse({ version: 2 })],
|
|
187
|
+
json: async () => [makeDocResponse({ version: 2, content: '# Product Vision\n\nUpdated on remote.\n' })],
|
|
187
188
|
});
|
|
188
189
|
|
|
189
190
|
const result = await sdd.pull();
|
|
@@ -251,10 +252,11 @@ describe('Sync engine - pull CRs', () => {
|
|
|
251
252
|
await rm(tempDir, { recursive: true });
|
|
252
253
|
});
|
|
253
254
|
|
|
254
|
-
it('creates local CR files from remote', async () => {
|
|
255
|
+
it('creates local CR files from remote (no path — fallback to ID)', async () => {
|
|
255
256
|
const cr: RemoteCRResponse = {
|
|
256
257
|
id: 'abcdef01-1234-5678-abcd-ef0123456789',
|
|
257
258
|
project_id: 'proj-001',
|
|
259
|
+
path: null,
|
|
258
260
|
title: 'Add auth flow',
|
|
259
261
|
body: '## Description\n\nAdd JWT authentication.',
|
|
260
262
|
status: 'draft',
|
|
@@ -283,6 +285,83 @@ describe('Sync engine - pull CRs', () => {
|
|
|
283
285
|
expect(content).toContain('status: draft');
|
|
284
286
|
expect(content).toContain('JWT authentication');
|
|
285
287
|
});
|
|
288
|
+
|
|
289
|
+
it('uses remote path field to create CR at correct location', async () => {
|
|
290
|
+
const cr: RemoteCRResponse = {
|
|
291
|
+
id: 'abcdef01-1234-5678-abcd-ef0123456789',
|
|
292
|
+
project_id: 'proj-001',
|
|
293
|
+
path: 'change-requests/001-add-auth-flow.md',
|
|
294
|
+
title: 'Add auth flow',
|
|
295
|
+
body: '## Description\n\nAdd JWT authentication.',
|
|
296
|
+
status: 'pending',
|
|
297
|
+
author_id: 'user-1',
|
|
298
|
+
assignee_id: null,
|
|
299
|
+
target_files: null,
|
|
300
|
+
closed_at: null,
|
|
301
|
+
created_at: '2026-01-01T00:00:00.000Z',
|
|
302
|
+
updated_at: '2026-01-01T00:00:00.000Z',
|
|
303
|
+
};
|
|
304
|
+
|
|
305
|
+
globalThis.fetch = vi.fn().mockResolvedValue({
|
|
306
|
+
ok: true,
|
|
307
|
+
status: 200,
|
|
308
|
+
json: async () => [cr],
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
const result = await sdd.pullCRs();
|
|
312
|
+
expect(result.created).toBe(1);
|
|
313
|
+
|
|
314
|
+
// Should use path from remote, NOT CR-abcdef01.md
|
|
315
|
+
const correctPath = join(tempDir, 'change-requests', '001-add-auth-flow.md');
|
|
316
|
+
const wrongPath = join(tempDir, 'change-requests', 'CR-abcdef01.md');
|
|
317
|
+
expect(existsSync(correctPath)).toBe(true);
|
|
318
|
+
expect(existsSync(wrongPath)).toBe(false);
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
it('pull does not overwrite CR when body is identical', async () => {
|
|
322
|
+
// Create a local CR file
|
|
323
|
+
const localCR = `---
|
|
324
|
+
title: "Add auth flow"
|
|
325
|
+
status: pending
|
|
326
|
+
author: "alice"
|
|
327
|
+
created-at: "2026-01-01T00:00:00.000Z"
|
|
328
|
+
---
|
|
329
|
+
|
|
330
|
+
## Description
|
|
331
|
+
|
|
332
|
+
Add JWT authentication.
|
|
333
|
+
`;
|
|
334
|
+
await mkdir(join(tempDir, 'change-requests'), { recursive: true });
|
|
335
|
+
await writeFile(join(tempDir, 'change-requests/001-auth.md'), localCR, 'utf-8');
|
|
336
|
+
|
|
337
|
+
const cr: RemoteCRResponse = {
|
|
338
|
+
id: 'cr-001',
|
|
339
|
+
project_id: 'proj-001',
|
|
340
|
+
path: 'change-requests/001-auth.md',
|
|
341
|
+
title: 'Add auth flow',
|
|
342
|
+
body: '## Description\n\nAdd JWT authentication.',
|
|
343
|
+
status: 'pending',
|
|
344
|
+
author_id: 'user-1',
|
|
345
|
+
assignee_id: null,
|
|
346
|
+
target_files: null,
|
|
347
|
+
closed_at: null,
|
|
348
|
+
created_at: '2026-01-01T00:00:00.000Z',
|
|
349
|
+
updated_at: '2026-01-01T00:00:00.000Z',
|
|
350
|
+
};
|
|
351
|
+
|
|
352
|
+
globalThis.fetch = vi.fn().mockResolvedValue({
|
|
353
|
+
ok: true,
|
|
354
|
+
status: 200,
|
|
355
|
+
json: async () => [cr],
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
await sdd.pullCRs();
|
|
359
|
+
|
|
360
|
+
// File should be UNTOUCHED — same content, original frontmatter preserved
|
|
361
|
+
const content = await readFile(join(tempDir, 'change-requests/001-auth.md'), 'utf-8');
|
|
362
|
+
expect(content).toContain('author: "alice"');
|
|
363
|
+
expect(content).toContain('title: "Add auth flow"');
|
|
364
|
+
});
|
|
286
365
|
});
|
|
287
366
|
|
|
288
367
|
describe('Sync engine - pull bugs', () => {
|
|
@@ -306,10 +385,11 @@ describe('Sync engine - pull bugs', () => {
|
|
|
306
385
|
await rm(tempDir, { recursive: true });
|
|
307
386
|
});
|
|
308
387
|
|
|
309
|
-
it('creates local bug files from remote', async () => {
|
|
388
|
+
it('creates local bug files from remote (no path — fallback to ID)', async () => {
|
|
310
389
|
const bug: RemoteBugResponse = {
|
|
311
390
|
id: '12345678-abcd-ef01-2345-678901234567',
|
|
312
391
|
project_id: 'proj-001',
|
|
392
|
+
path: null,
|
|
313
393
|
title: 'Search returns stale results',
|
|
314
394
|
body: '## Steps\n\n1. Search for a term\n2. Results are outdated',
|
|
315
395
|
status: 'open',
|
|
@@ -338,4 +418,170 @@ describe('Sync engine - pull bugs', () => {
|
|
|
338
418
|
expect(content).toContain('status: open');
|
|
339
419
|
expect(content).toContain('Results are outdated');
|
|
340
420
|
});
|
|
421
|
+
|
|
422
|
+
it('uses remote path field to create bug at correct location', async () => {
|
|
423
|
+
const bug: RemoteBugResponse = {
|
|
424
|
+
id: '12345678-abcd-ef01-2345-678901234567',
|
|
425
|
+
project_id: 'proj-001',
|
|
426
|
+
path: 'bugs/001-stale-search.md',
|
|
427
|
+
title: 'Search returns stale results',
|
|
428
|
+
body: '## Steps\n\n1. Search for a term\n2. Results are outdated',
|
|
429
|
+
status: 'open',
|
|
430
|
+
severity: 'major',
|
|
431
|
+
author_id: 'user-1',
|
|
432
|
+
assignee_id: null,
|
|
433
|
+
closed_at: null,
|
|
434
|
+
created_at: '2026-02-01T00:00:00.000Z',
|
|
435
|
+
updated_at: '2026-02-01T00:00:00.000Z',
|
|
436
|
+
};
|
|
437
|
+
|
|
438
|
+
globalThis.fetch = vi.fn().mockResolvedValue({
|
|
439
|
+
ok: true,
|
|
440
|
+
status: 200,
|
|
441
|
+
json: async () => [bug],
|
|
442
|
+
});
|
|
443
|
+
|
|
444
|
+
const result = await sdd.pullBugs();
|
|
445
|
+
expect(result.created).toBe(1);
|
|
446
|
+
|
|
447
|
+
// Should use path from remote, NOT BUG-12345678.md
|
|
448
|
+
const correctPath = join(tempDir, 'bugs', '001-stale-search.md');
|
|
449
|
+
const wrongPath = join(tempDir, 'bugs', 'BUG-12345678.md');
|
|
450
|
+
expect(existsSync(correctPath)).toBe(true);
|
|
451
|
+
expect(existsSync(wrongPath)).toBe(false);
|
|
452
|
+
});
|
|
453
|
+
});
|
|
454
|
+
|
|
455
|
+
describe('Sync engine - push→pull round-trip', () => {
|
|
456
|
+
let tempDir: string;
|
|
457
|
+
let sdd: SDD;
|
|
458
|
+
let originalFetch: typeof globalThis.fetch;
|
|
459
|
+
|
|
460
|
+
beforeEach(async () => {
|
|
461
|
+
originalFetch = globalThis.fetch;
|
|
462
|
+
tempDir = await mkdtemp(join(tmpdir(), 'sdd-roundtrip-'));
|
|
463
|
+
sdd = new SDD({ root: tempDir });
|
|
464
|
+
await sdd.init({ description: 'test' });
|
|
465
|
+
git('config user.email "test@test.com"', tempDir);
|
|
466
|
+
git('config user.name "Test"', tempDir);
|
|
467
|
+
const { writeConfig, readConfig } = await import('../src/config/config-manager.js');
|
|
468
|
+
const config = await readConfig(tempDir);
|
|
469
|
+
config.remote = { url: 'http://test.local/api/v1', 'api-key': 'test-key' };
|
|
470
|
+
await writeConfig(tempDir, config);
|
|
471
|
+
});
|
|
472
|
+
|
|
473
|
+
afterEach(async () => {
|
|
474
|
+
globalThis.fetch = originalFetch;
|
|
475
|
+
await rm(tempDir, { recursive: true });
|
|
476
|
+
});
|
|
477
|
+
|
|
478
|
+
it('push then pull preserves document file content exactly', async () => {
|
|
479
|
+
const docContent = `---
|
|
480
|
+
title: "Product Vision"
|
|
481
|
+
status: new
|
|
482
|
+
author: "bruno.fortunato@applica.guru"
|
|
483
|
+
last-modified: "2026-03-05T00:00:00.000Z"
|
|
484
|
+
version: "1.0"
|
|
485
|
+
---
|
|
486
|
+
|
|
487
|
+
# Product Vision
|
|
488
|
+
|
|
489
|
+
Easypick is a marketplace for on-demand services.
|
|
490
|
+
`;
|
|
491
|
+
await writeFile(join(tempDir, 'product/vision.md'), docContent, 'utf-8');
|
|
492
|
+
|
|
493
|
+
// Push — mock server response
|
|
494
|
+
globalThis.fetch = vi.fn().mockResolvedValue({
|
|
495
|
+
ok: true,
|
|
496
|
+
status: 200,
|
|
497
|
+
json: async () => ({
|
|
498
|
+
created: 1, updated: 0,
|
|
499
|
+
documents: [makeDocResponse({
|
|
500
|
+
path: 'product/vision.md',
|
|
501
|
+
content: '# Product Vision\n\nEasypick is a marketplace for on-demand services.\n',
|
|
502
|
+
version: 1,
|
|
503
|
+
})],
|
|
504
|
+
}),
|
|
505
|
+
});
|
|
506
|
+
await sdd.push();
|
|
507
|
+
|
|
508
|
+
// Read file after push (status changed to synced)
|
|
509
|
+
const afterPush = await readFile(join(tempDir, 'product/vision.md'), 'utf-8');
|
|
510
|
+
expect(afterPush).toContain('status: synced');
|
|
511
|
+
|
|
512
|
+
// Pull — server returns same content, higher version
|
|
513
|
+
globalThis.fetch = vi.fn().mockResolvedValue({
|
|
514
|
+
ok: true,
|
|
515
|
+
status: 200,
|
|
516
|
+
json: async () => [makeDocResponse({
|
|
517
|
+
path: 'product/vision.md',
|
|
518
|
+
content: '# Product Vision\n\nEasypick is a marketplace for on-demand services.\n',
|
|
519
|
+
version: 5,
|
|
520
|
+
})],
|
|
521
|
+
});
|
|
522
|
+
await sdd.pull();
|
|
523
|
+
|
|
524
|
+
// File should be IDENTICAL to after-push — no frontmatter corruption
|
|
525
|
+
const afterPull = await readFile(join(tempDir, 'product/vision.md'), 'utf-8');
|
|
526
|
+
expect(afterPull).toBe(afterPush);
|
|
527
|
+
// Verify original frontmatter preserved
|
|
528
|
+
expect(afterPull).toContain('author: "bruno.fortunato@applica.guru"');
|
|
529
|
+
expect(afterPull).toContain('last-modified: "2026-03-05T00:00:00.000Z"');
|
|
530
|
+
expect(afterPull).toContain('version: "1.0"');
|
|
531
|
+
});
|
|
532
|
+
|
|
533
|
+
it('push then pull preserves CR file at original path', async () => {
|
|
534
|
+
const crContent = `---
|
|
535
|
+
title: "Area Geografica su Leaflet"
|
|
536
|
+
status: pending
|
|
537
|
+
author: "team"
|
|
538
|
+
created-at: "2026-03-01T00:00:00.000Z"
|
|
539
|
+
---
|
|
540
|
+
|
|
541
|
+
# Area Geografica su Leaflet
|
|
542
|
+
|
|
543
|
+
Implementare la selezione area su mappa.
|
|
544
|
+
`;
|
|
545
|
+
await mkdir(join(tempDir, 'change-requests'), { recursive: true });
|
|
546
|
+
await writeFile(join(tempDir, 'change-requests/001-area-geografica.md'), crContent, 'utf-8');
|
|
547
|
+
|
|
548
|
+
// Push — mock server stores the path
|
|
549
|
+
const crResponse: RemoteCRResponse = {
|
|
550
|
+
id: 'cr-abc123',
|
|
551
|
+
project_id: 'proj-001',
|
|
552
|
+
path: 'change-requests/001-area-geografica.md',
|
|
553
|
+
title: 'Area Geografica su Leaflet',
|
|
554
|
+
body: '# Area Geografica su Leaflet\n\nImplementare la selezione area su mappa.\n',
|
|
555
|
+
status: 'pending',
|
|
556
|
+
author_id: 'user-1',
|
|
557
|
+
assignee_id: null,
|
|
558
|
+
target_files: null,
|
|
559
|
+
closed_at: null,
|
|
560
|
+
created_at: '2026-03-01T00:00:00.000Z',
|
|
561
|
+
updated_at: '2026-03-01T00:00:00.000Z',
|
|
562
|
+
};
|
|
563
|
+
|
|
564
|
+
globalThis.fetch = vi.fn().mockResolvedValue({
|
|
565
|
+
ok: true,
|
|
566
|
+
status: 200,
|
|
567
|
+
json: async () => ({ created: 1, updated: 0, change_requests: [crResponse] }),
|
|
568
|
+
});
|
|
569
|
+
await sdd.push();
|
|
570
|
+
|
|
571
|
+
// Pull — server returns same CR with path
|
|
572
|
+
globalThis.fetch = vi.fn().mockResolvedValue({
|
|
573
|
+
ok: true,
|
|
574
|
+
status: 200,
|
|
575
|
+
json: async () => [crResponse],
|
|
576
|
+
});
|
|
577
|
+
await sdd.pullCRs();
|
|
578
|
+
|
|
579
|
+
// Original file should still exist, untouched
|
|
580
|
+
const afterPull = await readFile(join(tempDir, 'change-requests/001-area-geografica.md'), 'utf-8');
|
|
581
|
+
expect(afterPull).toContain('author: "team"');
|
|
582
|
+
expect(afterPull).toContain('title: "Area Geografica su Leaflet"');
|
|
583
|
+
|
|
584
|
+
// No ID-based duplicate should exist
|
|
585
|
+
expect(existsSync(join(tempDir, 'change-requests/CR-cr-abc12.md'))).toBe(false);
|
|
586
|
+
});
|
|
341
587
|
});
|