@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.
@@ -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;AAqDpB,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,CAmJ3F;AAID,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAwDxF;AAkBD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAmDnG;AAID,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAmDpG;AAID,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA6BjG"}
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 a pulled document.
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 file for a pulled change request.
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 file for a pulled bug.
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
- // New file — create locally, preserving remote status
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 if (!tracked || doc.version > tracked.remoteVersion) {
226
- // Remote is newercheck for local changes
227
- const localContent = await (0, promises_1.readFile)(absPath, 'utf-8');
228
- const localHash = sha256(localContent);
251
+ else {
252
+ // File exists locallycompare 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
- // Local file changed since last sync AND remote changed → conflict
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
- // Local unchangedsafe to overwrite
240
- const localStatus = doc.status === 'draft' ? 'draft' : 'synced';
241
- const markdown = buildStoryMarkdown(doc.title, doc.content, doc.version, localStatus);
242
- await (0, promises_1.writeFile)(absPath, markdown, 'utf-8');
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, markdown);
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
- // Use the original local path if we pushed this CR before, otherwise generate a fallback
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
- // Use the original local path if we pushed this bug before, otherwise generate a fallback
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":"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"}
1
+ {"version":3,"file":"sync-engine.js","sourceRoot":"","sources":["../../src/remote/sync-engine.ts"],"names":[],"mappings":"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"}
@@ -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":"AAAA,sDAAsD;AACtD,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,kDAAkD;AAClD,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,iBAAiB,EAAE,CAAC;CAChC;AAED,4DAA4D;AAC5D,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,iDAAiD;AACjD,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,iDAAiD;AACjD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,gBAAgB,EAAE,CAAC;CACrC;AAED,kDAAkD;AAClD,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,iBAAiB,EAAE,CAAC;CAC3B;AAED,4CAA4C;AAC5C,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,sDAAsD;AACtD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,0CAA0C;AAC1C,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC1C,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;CAC1C;AAED,iCAAiC;AACjC,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,sCAAsC;AACtC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,iCAAiC;AACjC,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,YAAY,EAAE,CAAC;CAC3B;AAED,0CAA0C;AAC1C,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,oCAAoC;AACpC,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,OAAO,CAAC;IACpB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applica-software-guru/sdd-core",
3
- "version": "1.5.1",
3
+ "version": "1.6.0",
4
4
  "description": "Core library for Story Driven Development",
5
5
  "author": "Bruno Fortunato <bruno.fortunato@applica.guru>",
6
6
  "main": "dist/index.js",
@@ -29,7 +29,8 @@ function normalizePath(p: string): string {
29
29
  }
30
30
 
31
31
  /**
32
- * Build a markdown file with frontmatter for a pulled document.
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 file for a pulled change request.
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 file for a pulled bug.
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
- // New file — create locally, preserving remote status
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 if (!tracked || doc.version > tracked.remoteVersion) {
258
- // Remote is newercheck for local changes
259
- const localContent = await readFile(absPath, 'utf-8');
260
- const localHash = sha256(localContent);
282
+ } else {
283
+ // File exists locallycompare 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
- // Local file changed since last sync AND remote changed → conflict
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
- // Local unchangedsafe to overwrite
272
- const localStatus = doc.status === 'draft' ? 'draft' : 'synced';
273
- const markdown = buildStoryMarkdown(doc.title, doc.content, doc.version, localStatus);
274
- await writeFile(absPath, markdown, 'utf-8');
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, markdown);
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
- // Use the original local path if we pushed this CR before, otherwise generate a fallback
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
- // Update state so future pulls keep using the same path
346
- state.changeRequests![normalizePath(localPath)] = {
347
- remoteId: cr.id,
348
- localHash: sha256(markdown),
349
- lastSynced: new Date().toISOString(),
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
- // Use the original local path if we pushed this bug before, otherwise generate a fallback
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
- // Update state so future pulls keep using the same path
401
- state.bugs![normalizePath(localPath)] = {
402
- remoteId: bug.id,
403
- localHash: sha256(markdown),
404
- lastSynced: new Date().toISOString(),
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);
@@ -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
  });