@applica-software-guru/sdd-core 1.5.1 → 1.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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,CAmJ3F;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);
@@ -211,7 +235,7 @@ async function pullFromRemote(root, timeout) {
211
235
  const absPath = (0, node_path_1.resolve)(root, localPath);
212
236
  const tracked = state.documents[localPath];
213
237
  if (!(0, node_fs_1.existsSync)(absPath)) {
214
- // New file — create locally, preserving remote status
238
+ // Brand-new file — create locally
215
239
  const dir = (0, node_path_1.dirname)(absPath);
216
240
  if (!(0, node_fs_1.existsSync)(dir)) {
217
241
  await (0, promises_1.mkdir)(dir, { recursive: true });
@@ -222,12 +246,20 @@ async function pullFromRemote(root, timeout) {
222
246
  created.push(localPath);
223
247
  updateDocState(state, doc, localPath, markdown);
224
248
  }
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);
249
+ else {
250
+ // File exists locallycompare body content, not version numbers
251
+ const localRaw = await (0, promises_1.readFile)(absPath, 'utf-8');
252
+ const localBody = extractBody(localRaw);
253
+ const remoteBody = doc.content.trim();
254
+ if (localBody === remoteBody) {
255
+ // Body identical — don't touch the file, just update tracking state
256
+ updateDocState(state, doc, localPath, localRaw);
257
+ continue;
258
+ }
259
+ // Body differs — check for conflict
260
+ const localHash = sha256(localRaw);
229
261
  if (tracked && localHash !== tracked.localHash) {
230
- // Local file changed since last sync AND remote changed → conflict
262
+ // Both local and remote changed → conflict
231
263
  conflicts.push({
232
264
  path: localPath,
233
265
  localVersion: tracked.remoteVersion.toString(),
@@ -236,15 +268,15 @@ async function pullFromRemote(root, timeout) {
236
268
  });
237
269
  }
238
270
  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');
271
+ // Only remote body changed surgically replace body, preserve frontmatter
272
+ const newStatus = doc.status === 'draft' ? 'draft' : 'synced';
273
+ let updatedContent = replaceBody(localRaw, doc.content);
274
+ updatedContent = updatedContent.replace(/^status:\s*.+/m, `status: ${newStatus}`);
275
+ await (0, promises_1.writeFile)(absPath, updatedContent, 'utf-8');
243
276
  updated.push(localPath);
244
- updateDocState(state, doc, localPath, markdown);
277
+ updateDocState(state, doc, localPath, updatedContent);
245
278
  }
246
279
  }
247
- // If versions match, skip
248
280
  }
249
281
  state.lastPull = new Date().toISOString();
250
282
  await (0, state_js_1.writeRemoteState)(root, state);
@@ -271,35 +303,53 @@ async function pullCRsFromRemote(root, timeout) {
271
303
  for (const [localPath, entry] of Object.entries(state.changeRequests)) {
272
304
  idToPath.set(entry.remoteId, localPath);
273
305
  }
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
306
  let created = 0;
279
307
  let updated = 0;
280
308
  for (const cr of remoteCRs) {
281
- // Use the original local path if we pushed this CR before, otherwise generate a fallback
282
309
  const localPath = idToPath.get(cr.id) ?? `change-requests/CR-${cr.id.substring(0, 8)}.md`;
283
310
  const absPath = (0, node_path_1.resolve)(root, localPath);
284
311
  const dir = (0, node_path_1.dirname)(absPath);
285
312
  if (!(0, node_fs_1.existsSync)(dir)) {
286
313
  await (0, promises_1.mkdir)(dir, { recursive: true });
287
314
  }
288
- const crStatus = cr.status === 'draft' ? 'draft' : 'pending';
289
- const markdown = buildCRMarkdown(cr.title, cr.body, cr.created_at, crStatus);
290
315
  if ((0, node_fs_1.existsSync)(absPath)) {
316
+ // File exists — compare body, only update if changed
317
+ const localRaw = await (0, promises_1.readFile)(absPath, 'utf-8');
318
+ const localBody = extractBody(localRaw);
319
+ const remoteBody = cr.body.trim();
320
+ if (localBody === remoteBody) {
321
+ // Identical — don't touch the file
322
+ state.changeRequests[normalizePath(localPath)] = {
323
+ remoteId: cr.id,
324
+ localHash: sha256(localRaw),
325
+ lastSynced: new Date().toISOString(),
326
+ };
327
+ continue;
328
+ }
329
+ // Body changed — update body, preserve frontmatter
330
+ const newStatus = cr.status === 'draft' ? 'draft' : 'pending';
331
+ let updatedContent = replaceBody(localRaw, cr.body);
332
+ updatedContent = updatedContent.replace(/^status:\s*.+/m, `status: ${newStatus}`);
333
+ await (0, promises_1.writeFile)(absPath, updatedContent, 'utf-8');
291
334
  updated++;
335
+ state.changeRequests[normalizePath(localPath)] = {
336
+ remoteId: cr.id,
337
+ localHash: sha256(updatedContent),
338
+ lastSynced: new Date().toISOString(),
339
+ };
292
340
  }
293
341
  else {
342
+ // Brand-new CR — create file
343
+ const crStatus = cr.status === 'draft' ? 'draft' : 'pending';
344
+ const markdown = buildCRMarkdown(cr.title, cr.body, cr.created_at, crStatus);
345
+ await (0, promises_1.writeFile)(absPath, markdown, 'utf-8');
294
346
  created++;
347
+ state.changeRequests[normalizePath(localPath)] = {
348
+ remoteId: cr.id,
349
+ localHash: sha256(markdown),
350
+ lastSynced: new Date().toISOString(),
351
+ };
295
352
  }
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
353
  }
304
354
  await (0, state_js_1.writeRemoteState)(root, state);
305
355
  return { created, updated };
@@ -317,35 +367,53 @@ async function pullBugsFromRemote(root, timeout) {
317
367
  for (const [localPath, entry] of Object.entries(state.bugs)) {
318
368
  idToPath.set(entry.remoteId, localPath);
319
369
  }
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
370
  let created = 0;
325
371
  let updated = 0;
326
372
  for (const bug of remoteBugs) {
327
- // Use the original local path if we pushed this bug before, otherwise generate a fallback
328
373
  const localPath = idToPath.get(bug.id) ?? `bugs/BUG-${bug.id.substring(0, 8)}.md`;
329
374
  const absPath = (0, node_path_1.resolve)(root, localPath);
330
375
  const dir = (0, node_path_1.dirname)(absPath);
331
376
  if (!(0, node_fs_1.existsSync)(dir)) {
332
377
  await (0, promises_1.mkdir)(dir, { recursive: true });
333
378
  }
334
- const bugStatus = bug.status === 'draft' ? 'draft' : 'open';
335
- const markdown = buildBugMarkdown(bug.title, bug.body, bug.created_at, bugStatus);
336
379
  if ((0, node_fs_1.existsSync)(absPath)) {
380
+ // File exists — compare body, only update if changed
381
+ const localRaw = await (0, promises_1.readFile)(absPath, 'utf-8');
382
+ const localBody = extractBody(localRaw);
383
+ const remoteBody = bug.body.trim();
384
+ if (localBody === remoteBody) {
385
+ // Identical — don't touch the file
386
+ state.bugs[normalizePath(localPath)] = {
387
+ remoteId: bug.id,
388
+ localHash: sha256(localRaw),
389
+ lastSynced: new Date().toISOString(),
390
+ };
391
+ continue;
392
+ }
393
+ // Body changed — update body, preserve frontmatter
394
+ const newStatus = bug.status === 'draft' ? 'draft' : 'open';
395
+ let updatedContent = replaceBody(localRaw, bug.body);
396
+ updatedContent = updatedContent.replace(/^status:\s*.+/m, `status: ${newStatus}`);
397
+ await (0, promises_1.writeFile)(absPath, updatedContent, 'utf-8');
337
398
  updated++;
399
+ state.bugs[normalizePath(localPath)] = {
400
+ remoteId: bug.id,
401
+ localHash: sha256(updatedContent),
402
+ lastSynced: new Date().toISOString(),
403
+ };
338
404
  }
339
405
  else {
406
+ // Brand-new bug — create file
407
+ const bugStatus = bug.status === 'draft' ? 'draft' : 'open';
408
+ const markdown = buildBugMarkdown(bug.title, bug.body, bug.created_at, bugStatus);
409
+ await (0, promises_1.writeFile)(absPath, markdown, 'utf-8');
340
410
  created++;
411
+ state.bugs[normalizePath(localPath)] = {
412
+ remoteId: bug.id,
413
+ localHash: sha256(markdown),
414
+ lastSynced: new Date().toISOString(),
415
+ };
341
416
  }
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
417
  }
350
418
  await (0, state_js_1.writeRemoteState)(root, state);
351
419
  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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"}
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.5.2",
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 {
@@ -244,7 +267,7 @@ export async function pullFromRemote(root: string, timeout?: number): Promise<Pu
244
267
  const tracked = state.documents[localPath];
245
268
 
246
269
  if (!existsSync(absPath)) {
247
- // New file — create locally, preserving remote status
270
+ // Brand-new file — create locally
248
271
  const dir = dirname(absPath);
249
272
  if (!existsSync(dir)) {
250
273
  await mkdir(dir, { recursive: true });
@@ -254,13 +277,22 @@ export async function pullFromRemote(root: string, timeout?: number): Promise<Pu
254
277
  await writeFile(absPath, markdown, 'utf-8');
255
278
  created.push(localPath);
256
279
  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);
280
+ } else {
281
+ // File exists locallycompare body content, not version numbers
282
+ const localRaw = await readFile(absPath, 'utf-8');
283
+ const localBody = extractBody(localRaw);
284
+ const remoteBody = doc.content.trim();
285
+
286
+ if (localBody === remoteBody) {
287
+ // Body identical — don't touch the file, just update tracking state
288
+ updateDocState(state, doc, localPath, localRaw);
289
+ continue;
290
+ }
261
291
 
292
+ // Body differs — check for conflict
293
+ const localHash = sha256(localRaw);
262
294
  if (tracked && localHash !== tracked.localHash) {
263
- // Local file changed since last sync AND remote changed → conflict
295
+ // Both local and remote changed → conflict
264
296
  conflicts.push({
265
297
  path: localPath,
266
298
  localVersion: tracked.remoteVersion.toString(),
@@ -268,15 +300,15 @@ export async function pullFromRemote(root: string, timeout?: number): Promise<Pu
268
300
  reason: 'Both local and remote have changes since last sync',
269
301
  });
270
302
  } 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');
303
+ // Only remote body changed surgically replace body, preserve frontmatter
304
+ const newStatus = doc.status === 'draft' ? 'draft' : 'synced';
305
+ let updatedContent = replaceBody(localRaw, doc.content);
306
+ updatedContent = updatedContent.replace(/^status:\s*.+/m, `status: ${newStatus}`);
307
+ await writeFile(absPath, updatedContent, 'utf-8');
275
308
  updated.push(localPath);
276
- updateDocState(state, doc, localPath, markdown);
309
+ updateDocState(state, doc, localPath, updatedContent);
277
310
  }
278
311
  }
279
- // If versions match, skip
280
312
  }
281
313
 
282
314
  state.lastPull = new Date().toISOString();
@@ -315,16 +347,10 @@ export async function pullCRsFromRemote(root: string, timeout?: number): Promise
315
347
  idToPath.set(entry.remoteId, localPath);
316
348
  }
317
349
 
318
- const crDir = resolve(root, 'change-requests');
319
- if (!existsSync(crDir)) {
320
- await mkdir(crDir, { recursive: true });
321
- }
322
-
323
350
  let created = 0;
324
351
  let updated = 0;
325
352
 
326
353
  for (const cr of remoteCRs) {
327
- // Use the original local path if we pushed this CR before, otherwise generate a fallback
328
354
  const localPath = idToPath.get(cr.id) ?? `change-requests/CR-${cr.id.substring(0, 8)}.md`;
329
355
  const absPath = resolve(root, localPath);
330
356
  const dir = dirname(absPath);
@@ -332,22 +358,47 @@ export async function pullCRsFromRemote(root: string, timeout?: number): Promise
332
358
  await mkdir(dir, { recursive: true });
333
359
  }
334
360
 
335
- const crStatus = cr.status === 'draft' ? 'draft' : 'pending';
336
- const markdown = buildCRMarkdown(cr.title, cr.body, cr.created_at, crStatus);
337
-
338
361
  if (existsSync(absPath)) {
362
+ // File exists — compare body, only update if changed
363
+ const localRaw = await readFile(absPath, 'utf-8');
364
+ const localBody = extractBody(localRaw);
365
+ const remoteBody = cr.body.trim();
366
+
367
+ if (localBody === remoteBody) {
368
+ // Identical — don't touch the file
369
+ state.changeRequests![normalizePath(localPath)] = {
370
+ remoteId: cr.id,
371
+ localHash: sha256(localRaw),
372
+ lastSynced: new Date().toISOString(),
373
+ };
374
+ continue;
375
+ }
376
+
377
+ // Body changed — update body, preserve frontmatter
378
+ const newStatus = cr.status === 'draft' ? 'draft' : 'pending';
379
+ let updatedContent = replaceBody(localRaw, cr.body);
380
+ updatedContent = updatedContent.replace(/^status:\s*.+/m, `status: ${newStatus}`);
381
+ await writeFile(absPath, updatedContent, 'utf-8');
339
382
  updated++;
383
+
384
+ state.changeRequests![normalizePath(localPath)] = {
385
+ remoteId: cr.id,
386
+ localHash: sha256(updatedContent),
387
+ lastSynced: new Date().toISOString(),
388
+ };
340
389
  } else {
390
+ // Brand-new CR — create file
391
+ const crStatus = cr.status === 'draft' ? 'draft' : 'pending';
392
+ const markdown = buildCRMarkdown(cr.title, cr.body, cr.created_at, crStatus);
393
+ await writeFile(absPath, markdown, 'utf-8');
341
394
  created++;
342
- }
343
- await writeFile(absPath, markdown, 'utf-8');
344
395
 
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
- };
396
+ state.changeRequests![normalizePath(localPath)] = {
397
+ remoteId: cr.id,
398
+ localHash: sha256(markdown),
399
+ lastSynced: new Date().toISOString(),
400
+ };
401
+ }
351
402
  }
352
403
 
353
404
  await writeRemoteState(root, state);
@@ -370,16 +421,10 @@ export async function pullBugsFromRemote(root: string, timeout?: number): Promis
370
421
  idToPath.set(entry.remoteId, localPath);
371
422
  }
372
423
 
373
- const bugsDir = resolve(root, 'bugs');
374
- if (!existsSync(bugsDir)) {
375
- await mkdir(bugsDir, { recursive: true });
376
- }
377
-
378
424
  let created = 0;
379
425
  let updated = 0;
380
426
 
381
427
  for (const bug of remoteBugs) {
382
- // Use the original local path if we pushed this bug before, otherwise generate a fallback
383
428
  const localPath = idToPath.get(bug.id) ?? `bugs/BUG-${bug.id.substring(0, 8)}.md`;
384
429
  const absPath = resolve(root, localPath);
385
430
  const dir = dirname(absPath);
@@ -387,22 +432,47 @@ export async function pullBugsFromRemote(root: string, timeout?: number): Promis
387
432
  await mkdir(dir, { recursive: true });
388
433
  }
389
434
 
390
- const bugStatus = bug.status === 'draft' ? 'draft' : 'open';
391
- const markdown = buildBugMarkdown(bug.title, bug.body, bug.created_at, bugStatus);
392
-
393
435
  if (existsSync(absPath)) {
436
+ // File exists — compare body, only update if changed
437
+ const localRaw = await readFile(absPath, 'utf-8');
438
+ const localBody = extractBody(localRaw);
439
+ const remoteBody = bug.body.trim();
440
+
441
+ if (localBody === remoteBody) {
442
+ // Identical — don't touch the file
443
+ state.bugs![normalizePath(localPath)] = {
444
+ remoteId: bug.id,
445
+ localHash: sha256(localRaw),
446
+ lastSynced: new Date().toISOString(),
447
+ };
448
+ continue;
449
+ }
450
+
451
+ // Body changed — update body, preserve frontmatter
452
+ const newStatus = bug.status === 'draft' ? 'draft' : 'open';
453
+ let updatedContent = replaceBody(localRaw, bug.body);
454
+ updatedContent = updatedContent.replace(/^status:\s*.+/m, `status: ${newStatus}`);
455
+ await writeFile(absPath, updatedContent, 'utf-8');
394
456
  updated++;
457
+
458
+ state.bugs![normalizePath(localPath)] = {
459
+ remoteId: bug.id,
460
+ localHash: sha256(updatedContent),
461
+ lastSynced: new Date().toISOString(),
462
+ };
395
463
  } else {
464
+ // Brand-new bug — create file
465
+ const bugStatus = bug.status === 'draft' ? 'draft' : 'open';
466
+ const markdown = buildBugMarkdown(bug.title, bug.body, bug.created_at, bugStatus);
467
+ await writeFile(absPath, markdown, 'utf-8');
396
468
  created++;
397
- }
398
- await writeFile(absPath, markdown, 'utf-8');
399
469
 
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
- };
470
+ state.bugs![normalizePath(localPath)] = {
471
+ remoteId: bug.id,
472
+ localHash: sha256(markdown),
473
+ lastSynced: new Date().toISOString(),
474
+ };
475
+ }
406
476
  }
407
477
 
408
478
  await writeRemoteState(root, state);
@@ -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();