emdash-emit 0.1.10 → 0.1.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/CHANGELOG.md +135 -0
  2. package/README.md +24 -4
  3. package/dist/cli/commands/conflicts.d.ts.map +1 -1
  4. package/dist/cli/commands/conflicts.js +45 -1
  5. package/dist/cli/commands/conflicts.js.map +1 -1
  6. package/dist/cli/commands/pull.d.ts.map +1 -1
  7. package/dist/cli/commands/pull.js +5 -4
  8. package/dist/cli/commands/pull.js.map +1 -1
  9. package/dist/cli/commands/push.d.ts.map +1 -1
  10. package/dist/cli/commands/push.js +46 -3
  11. package/dist/cli/commands/push.js.map +1 -1
  12. package/dist/cli/commands/status.d.ts.map +1 -1
  13. package/dist/cli/commands/status.js +18 -4
  14. package/dist/cli/commands/status.js.map +1 -1
  15. package/dist/client/api.d.ts +6 -0
  16. package/dist/client/api.d.ts.map +1 -1
  17. package/dist/client/api.js +36 -0
  18. package/dist/client/api.js.map +1 -1
  19. package/dist/db/cache.d.ts +11 -0
  20. package/dist/db/cache.d.ts.map +1 -1
  21. package/dist/db/cache.js +136 -7
  22. package/dist/db/cache.js.map +1 -1
  23. package/dist/mcp/heartbeat.d.ts +29 -0
  24. package/dist/mcp/heartbeat.d.ts.map +1 -0
  25. package/dist/mcp/heartbeat.js +132 -0
  26. package/dist/mcp/heartbeat.js.map +1 -0
  27. package/dist/mcp/server.d.ts.map +1 -1
  28. package/dist/mcp/server.js +2 -0
  29. package/dist/mcp/server.js.map +1 -1
  30. package/dist/mcp/tools/sync-push.d.ts.map +1 -1
  31. package/dist/mcp/tools/sync-push.js +38 -5
  32. package/dist/mcp/tools/sync-push.js.map +1 -1
  33. package/dist/sync/conflicts.d.ts +24 -0
  34. package/dist/sync/conflicts.d.ts.map +1 -1
  35. package/dist/sync/conflicts.js +111 -0
  36. package/dist/sync/conflicts.js.map +1 -1
  37. package/dist/sync/delete.d.ts.map +1 -1
  38. package/dist/sync/delete.js +66 -3
  39. package/dist/sync/delete.js.map +1 -1
  40. package/dist/sync/doctor.d.ts +10 -0
  41. package/dist/sync/doctor.d.ts.map +1 -1
  42. package/dist/sync/doctor.js +197 -6
  43. package/dist/sync/doctor.js.map +1 -1
  44. package/dist/sync/merge.d.ts +59 -3
  45. package/dist/sync/merge.d.ts.map +1 -1
  46. package/dist/sync/merge.js +177 -5
  47. package/dist/sync/merge.js.map +1 -1
  48. package/dist/sync/orchestrator.d.ts +6 -1
  49. package/dist/sync/orchestrator.d.ts.map +1 -1
  50. package/dist/sync/orchestrator.js +15 -2
  51. package/dist/sync/orchestrator.js.map +1 -1
  52. package/dist/sync/pull.d.ts +5 -1
  53. package/dist/sync/pull.d.ts.map +1 -1
  54. package/dist/sync/pull.js +174 -148
  55. package/dist/sync/pull.js.map +1 -1
  56. package/dist/sync/push.d.ts +6 -0
  57. package/dist/sync/push.d.ts.map +1 -1
  58. package/dist/sync/push.js +155 -5
  59. package/dist/sync/push.js.map +1 -1
  60. package/dist/sync/status.d.ts +9 -0
  61. package/dist/sync/status.d.ts.map +1 -1
  62. package/dist/sync/status.js +10 -1
  63. package/dist/sync/status.js.map +1 -1
  64. package/dist/sync/terms.d.ts +32 -0
  65. package/dist/sync/terms.d.ts.map +1 -0
  66. package/dist/sync/terms.js +62 -0
  67. package/dist/sync/terms.js.map +1 -0
  68. package/package.json +2 -1
@@ -21,11 +21,78 @@
21
21
  */
22
22
  import fs from 'node:fs';
23
23
  import path from 'node:path';
24
+ import yaml from 'js-yaml';
24
25
  import { getPackageVersion } from '../utils/version.js';
25
26
  import { parseMarkdown, lenientRepairMarkdownFrontmatter } from '../utils/frontmatter.js';
26
27
  import { listConflicts } from './conflicts.js';
27
28
  import { getWorkspaceStatus } from './status.js';
28
- import { scanArticleMediaReferences } from './delete.js';
29
+ import { calculateHash } from './pull.js';
30
+ import { checkMcpProcess } from '../mcp/heartbeat.js';
31
+ /**
32
+ * Scans article markdown to separate standard body image references from
33
+ * informational references (code blocks, inline code, HTML comments, or placeholder URLs).
34
+ */
35
+ export function scanArticleMediaDetailed(bodyMarkdown) {
36
+ const normalRefs = new Set();
37
+ const informationalRefs = new Set();
38
+ const lines = bodyMarkdown.split('\n');
39
+ let inFence = false;
40
+ let fenceDelimiter = '';
41
+ for (const line of lines) {
42
+ const trimmed = line.trim();
43
+ // Note: Doctor treats both backticks and tildes (~~~) as fences for diagnostic
44
+ // reporting to avoid false warnings on code examples, whereas push guards (G5/G11)
45
+ // strictly exempt only backtick fences per AGENTS.md.
46
+ if (trimmed.startsWith('```') || trimmed.startsWith('~~~')) {
47
+ if (!inFence) {
48
+ inFence = true;
49
+ fenceDelimiter = trimmed.slice(0, 3);
50
+ continue;
51
+ }
52
+ else if (trimmed.startsWith(fenceDelimiter)) {
53
+ inFence = false;
54
+ continue;
55
+ }
56
+ }
57
+ // Markdown image syntax: ![alt](url)
58
+ const mdRegex = /!\[.*?\]\(([^)\s]+)(?:\s+["'].*?["'])?\)/g;
59
+ let match;
60
+ while ((match = mdRegex.exec(line)) !== null) {
61
+ const url = match[1].trim();
62
+ if (!url.startsWith('http://') && !url.startsWith('https://') && !url.startsWith('data:')) {
63
+ const isPlaceholder = url.includes('<') && url.includes('>');
64
+ const isInlineCode = line.includes('`' + match[0]) ||
65
+ (line.indexOf('`') !== -1 &&
66
+ line.indexOf('`') < match.index &&
67
+ match.index < line.lastIndexOf('`'));
68
+ if (inFence || isInlineCode || isPlaceholder) {
69
+ informationalRefs.add(url);
70
+ }
71
+ else {
72
+ normalRefs.add(url);
73
+ }
74
+ }
75
+ }
76
+ // HTML img tags: <img src="...">
77
+ const htmlRegex = /<img[^>]+src=["']([^"']+)["']/gi;
78
+ while ((match = htmlRegex.exec(line)) !== null) {
79
+ const url = match[1].trim();
80
+ if (!url.startsWith('http://') && !url.startsWith('https://') && !url.startsWith('data:')) {
81
+ const isPlaceholder = url.includes('<') && url.includes('>');
82
+ if (inFence || isPlaceholder || line.includes('<!--')) {
83
+ informationalRefs.add(url);
84
+ }
85
+ else {
86
+ normalRefs.add(url);
87
+ }
88
+ }
89
+ }
90
+ }
91
+ return {
92
+ normalRefs: Array.from(normalRefs).sort(),
93
+ informationalRefs: Array.from(informationalRefs).sort(),
94
+ };
95
+ }
29
96
  /**
30
97
  * Runs a comprehensive health diagnostic across the workspace.
31
98
  */
@@ -143,6 +210,46 @@ export async function runWorkspaceDoctor(options) {
143
210
  message: `No unresolved conflicts or rescue backups in ${collection}/conflicts/.`,
144
211
  });
145
212
  }
213
+ // 4b. Taxonomy Conflict Pending Alignment
214
+ const allStates = options.cache.getAllSyncStates();
215
+ const pendingStates = allStates.filter((s) => s.conflictPending === 1);
216
+ const autoClearedSlugs = [];
217
+ const manualResolutionRequired = [];
218
+ for (const state of pendingStates) {
219
+ const hasConflictCopy = conflictItems.some((c) => c.id === state.id || c.slug === state.slug);
220
+ const fullPath = path.join(options.workspaceRoot, state.localFilePath);
221
+ let hasDivergence = true;
222
+ if (fs.existsSync(fullPath)) {
223
+ const diskHash = calculateHash(fs.readFileSync(fullPath, 'utf8'));
224
+ hasDivergence = diskHash !== state.localHash;
225
+ }
226
+ if (!hasConflictCopy && !hasDivergence) {
227
+ // Auto-clear: no conflict copy and no divergence
228
+ options.cache.setConflictPending(state.id, false);
229
+ autoClearedSlugs.push(state.slug);
230
+ }
231
+ else {
232
+ manualResolutionRequired.push(state.slug);
233
+ }
234
+ }
235
+ if (autoClearedSlugs.length > 0) {
236
+ checks.push({
237
+ id: 'conflict_pending_autoclear',
238
+ name: 'Conflict Pending Auto-Clear',
239
+ status: 'ok',
240
+ message: `Automatically cleared stale conflict_pending flag for ${autoClearedSlugs.length} article(s) (no conflict copies and no divergence).`,
241
+ details: autoClearedSlugs,
242
+ });
243
+ }
244
+ if (manualResolutionRequired.length > 0) {
245
+ checks.push({
246
+ id: 'conflict_pending_manual',
247
+ name: 'Taxonomy Conflict Pending',
248
+ status: 'warning',
249
+ message: `${manualResolutionRequired.length} article(s) have pending taxonomy conflicts with existing rescue copies or unpushed edits. Run "emit push <file> --resolve-taxonomy=union|local|remote" to resolve.`,
250
+ details: manualResolutionRequired,
251
+ });
252
+ }
146
253
  // 5. Sync Status & Pending Modifications Check
147
254
  const wsStatus = getWorkspaceStatus(options.workspaceRoot, options.cache, collection);
148
255
  if (wsStatus.summary.modified > 0 || wsStatus.summary.untracked > 0) {
@@ -169,7 +276,43 @@ export async function runWorkspaceDoctor(options) {
169
276
  });
170
277
  }
171
278
  // 6. Media References Integrity Check
279
+ // Index all local media companion YAMLs and files to resolve both local paths and storageKey URLs (D1)
280
+ const mediaDir = path.join(options.workspaceRoot, 'media');
281
+ const knownStorageKeys = new Set();
282
+ const knownMediaIds = new Set();
283
+ const knownLocalFiles = new Set();
284
+ if (fs.existsSync(mediaDir)) {
285
+ const mediaFiles = fs.readdirSync(mediaDir);
286
+ for (const f of mediaFiles) {
287
+ knownLocalFiles.add(f);
288
+ knownLocalFiles.add(path.posix.join('media', f));
289
+ if (f.endsWith('.yaml')) {
290
+ try {
291
+ const doc = yaml.load(fs.readFileSync(path.join(mediaDir, f), 'utf8'));
292
+ if (doc) {
293
+ if (typeof doc.storageKey === 'string' && doc.storageKey) {
294
+ knownStorageKeys.add(doc.storageKey);
295
+ }
296
+ if (typeof doc.id === 'string' && doc.id) {
297
+ knownMediaIds.add(doc.id);
298
+ }
299
+ }
300
+ }
301
+ catch {
302
+ // ignore corrupted individual yaml
303
+ }
304
+ }
305
+ }
306
+ const draftsDir = path.join(mediaDir, 'drafts');
307
+ if (fs.existsSync(draftsDir)) {
308
+ for (const df of fs.readdirSync(draftsDir)) {
309
+ knownLocalFiles.add(path.posix.join('media', 'drafts', df));
310
+ knownLocalFiles.add(path.posix.join('../../media', 'drafts', df));
311
+ }
312
+ }
313
+ }
172
314
  const missingMedia = [];
315
+ const informationalUnresolved = [];
173
316
  for (const status of ['draft', 'published']) {
174
317
  const dir = path.join(options.workspaceRoot, collection, status);
175
318
  if (!fs.existsSync(dir))
@@ -178,13 +321,29 @@ export async function runWorkspaceDoctor(options) {
178
321
  for (const file of files) {
179
322
  try {
180
323
  const content = fs.readFileSync(path.join(dir, file), 'utf8');
181
- const refs = scanArticleMediaReferences(content);
182
- for (const ref of refs) {
183
- const mediaFullPath = path.join(options.workspaceRoot, ref);
184
- if (!fs.existsSync(mediaFullPath)) {
324
+ const detailed = scanArticleMediaDetailed(content);
325
+ const checkRef = (ref) => {
326
+ // Check 1: EmDash public storageKey route: /_emdash/api/media/file/<storageKey>
327
+ const storageKeyMatch = ref.match(/(?:^|\/)media\/file\/([^?#]+)/);
328
+ if (storageKeyMatch) {
329
+ const key = storageKeyMatch[1];
330
+ return knownStorageKeys.has(key);
331
+ }
332
+ // Check 2: Direct relative or local filesystem path
333
+ const cleanRef = ref.replace(/^[./]+/, '');
334
+ const directFull = path.isAbsolute(ref) ? ref : path.join(options.workspaceRoot, ref);
335
+ return (fs.existsSync(directFull) || knownLocalFiles.has(ref) || knownLocalFiles.has(cleanRef));
336
+ };
337
+ for (const ref of detailed.normalRefs) {
338
+ if (!checkRef(ref)) {
185
339
  missingMedia.push(`${ref} (referenced by ${path.join(collection, status, file)})`);
186
340
  }
187
341
  }
342
+ for (const ref of detailed.informationalRefs) {
343
+ if (!checkRef(ref)) {
344
+ informationalUnresolved.push(`${ref} (code-example/placeholder in ${path.join(collection, status, file)})`);
345
+ }
346
+ }
188
347
  }
189
348
  catch {
190
349
  // Skip unreadable files
@@ -200,12 +359,44 @@ export async function runWorkspaceDoctor(options) {
200
359
  details: missingMedia,
201
360
  });
202
361
  }
362
+ else if (options.strictMedia && informationalUnresolved.length > 0) {
363
+ checks.push({
364
+ id: 'media_references',
365
+ name: 'Media References',
366
+ status: 'warning',
367
+ message: `${informationalUnresolved.length} informational media reference(s) missing from disk (--strict-media mode).`,
368
+ details: informationalUnresolved,
369
+ });
370
+ }
203
371
  else {
372
+ const infoNote = informationalUnresolved.length > 0
373
+ ? ` (${informationalUnresolved.length} informational/placeholder reference(s) ignored)`
374
+ : '';
204
375
  checks.push({
205
376
  id: 'media_references',
206
377
  name: 'Media References',
207
378
  status: 'ok',
208
- message: 'All referenced local media files exist on disk.',
379
+ message: `All referenced local media files exist on disk.${infoNote}`,
380
+ ...(informationalUnresolved.length > 0 ? { details: informationalUnresolved } : {}),
381
+ });
382
+ }
383
+ // 7. MCP Process Check
384
+ const mcpCheck = checkMcpProcess();
385
+ if (mcpCheck.isOutdated) {
386
+ checks.push({
387
+ id: 'mcp_process',
388
+ name: 'MCP Server Process',
389
+ status: 'warning',
390
+ message: mcpCheck.message || 'An MCP server process is running with an outdated version.',
391
+ details: mcpCheck.state ? { ...mcpCheck.state } : undefined,
392
+ });
393
+ }
394
+ else if (mcpCheck.status === 'alive') {
395
+ checks.push({
396
+ id: 'mcp_process',
397
+ name: 'MCP Server Process',
398
+ status: 'ok',
399
+ message: `MCP server process is running healthy (PID ${mcpCheck.state?.pid}, v${mcpCheck.state?.version}).`,
209
400
  });
210
401
  }
211
402
  // Determine overall status
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/sync/doctor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/sync/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,SAAS,CAAC;AAG3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,gCAAgC,EAAE,MAAM,yBAAyB,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAoCtD;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,YAAoB;IAC3D,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;IAE5C,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,cAAc,GAAG,EAAE,CAAC;IAExB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,+EAA+E;QAC/E,mFAAmF;QACnF,sDAAsD;QACtD,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3D,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,GAAG,IAAI,CAAC;gBACf,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACrC,SAAS;YACX,CAAC;iBAAM,IAAI,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC9C,OAAO,GAAG,KAAK,CAAC;gBAChB,SAAS;YACX,CAAC;QACH,CAAC;QAED,qCAAqC;QACrC,MAAM,OAAO,GAAG,2CAA2C,CAAC;QAC5D,IAAI,KAA6B,CAAC;QAClC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC7C,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1F,MAAM,aAAa,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAC7D,MAAM,YAAY,GAChB,IAAI,CAAC,QAAQ,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBAC7B,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;wBACvB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK;wBAC/B,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;gBACzC,IAAI,OAAO,IAAI,YAAY,IAAI,aAAa,EAAE,CAAC;oBAC7C,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC7B,CAAC;qBAAM,CAAC;oBACN,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;QACH,CAAC;QAED,iCAAiC;QACjC,MAAM,SAAS,GAAG,iCAAiC,CAAC;QACpD,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC/C,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1F,MAAM,aAAa,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAC7D,IAAI,OAAO,IAAI,aAAa,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBACtD,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC7B,CAAC;qBAAM,CAAC;oBACN,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE;QACzC,iBAAiB,EAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,IAAI,EAAE;KACxD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAkC;IAElC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,iBAAiB,IAAI,OAAO,CAAC;IACrF,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;IAE3C,iCAAiC;IACjC,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC;IACtD,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC;IACpD,MAAM,CAAC,IAAI,CAAC;QACV,EAAE,EAAE,uBAAuB;QAC3B,IAAI,EAAE,uBAAuB;QAC7B,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,WAAW;YAClB,CAAC,CAAC,sBAAsB,cAAc,mBAAmB,WAAW,uBAAuB,UAAU,IAAI,WAAW,GAAG;YACvH,CAAC,CAAC,sBAAsB,cAAc,eAAe;QACvD,OAAO,EAAE;YACP,cAAc;YACd,kBAAkB,EAAE,WAAW;YAC/B,iBAAiB,EAAE,UAAU;SAC9B;KACF,CAAC,CAAC;IAEH,wCAAwC;IACxC,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;IAC3C,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAC5C,IAAI,aAAa,IAAI,YAAY,IAAI,YAAY,KAAK,aAAa,EAAE,CAAC;QACpE,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,oBAAoB;YACxB,IAAI,EAAE,oBAAoB;YAC1B,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,kBAAkB,YAAY,2CAA2C,aAAa,+CAA+C;YAC9I,OAAO,EAAE,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE;SAC3E,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,oBAAoB;YACxB,IAAI,EAAE,oBAAoB;YAC1B,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,2BAA2B,aAAa,IAAI,YAAY,IAAI,SAAS,IAAI;SACnF,CAAC,CAAC;IACL,CAAC;IAED,iDAAiD;IACjD,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,KAAK,MAAM,MAAM,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QACjE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAElC,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QACnE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,aAAa,EAAE,CAAC;YAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACtC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAClD,IAAI,CAAC;oBACH,aAAa,CAAC,OAAO,CAAC,CAAC;gBACzB,CAAC;gBAAC,MAAM,CAAC;oBACP,wBAAwB;oBACxB,MAAM,MAAM,GAAG,gCAAgC,CAAC,OAAO,CAAC,CAAC;oBACzD,IAAI,MAAM,EAAE,CAAC;wBACX,aAAa,CAAC,MAAM,CAAC,CAAC;oBACxB,CAAC;yBAAM,CAAC;wBACN,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;oBAC/C,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,uBAAuB;YAC3B,IAAI,EAAE,uBAAuB;YAC7B,MAAM,EAAE,OAAO;YACf,OAAO,EAAE,GAAG,YAAY,CAAC,MAAM,2DAA2D;YAC1F,OAAO,EAAE,YAAY;SACtB,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,uBAAuB;YAC3B,IAAI,EAAE,uBAAuB;YAC7B,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,OAAO,aAAa,4CAA4C;SAC1E,CAAC,CAAC;IACL,CAAC;IAED,kCAAkC;IAClC,MAAM,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IACvE,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;QAChF,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;QAC9E,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,sBAAsB;YAC1B,IAAI,EAAE,wBAAwB;YAC9B,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,GAAG,aAAa,CAAC,MAAM,iCAAiC,UAAU,gBAAgB,aAAa,oBAAoB,YAAY,iEAAiE;YACzM,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACjC,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,CAAC,CAAC,IAAI;aACb,CAAC,CAAC;SACJ,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,sBAAsB;YAC1B,IAAI,EAAE,wBAAwB;YAC9B,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,gDAAgD,UAAU,cAAc;SAClF,CAAC,CAAC;IACL,CAAC;IAED,0CAA0C;IAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;IACnD,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,KAAK,CAAC,CAAC,CAAC;IACvE,MAAM,gBAAgB,GAAa,EAAE,CAAC;IACtC,MAAM,wBAAwB,GAAa,EAAE,CAAC;IAE9C,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,MAAM,eAAe,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9F,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;QACvE,IAAI,aAAa,GAAG,IAAI,CAAC;QACzB,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,aAAa,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;YAClE,aAAa,GAAG,QAAQ,KAAK,KAAK,CAAC,SAAS,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC,eAAe,IAAI,CAAC,aAAa,EAAE,CAAC;YACvC,iDAAiD;YACjD,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAClD,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,4BAA4B;YAChC,IAAI,EAAE,6BAA6B;YACnC,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,yDAAyD,gBAAgB,CAAC,MAAM,qDAAqD;YAC9I,OAAO,EAAE,gBAAgB;SAC1B,CAAC,CAAC;IACL,CAAC;IACD,IAAI,wBAAwB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,yBAAyB;YAC7B,IAAI,EAAE,2BAA2B;YACjC,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,GAAG,wBAAwB,CAAC,MAAM,qKAAqK;YAChN,OAAO,EAAE,wBAAwB;SAClC,CAAC,CAAC;IACL,CAAC;IAED,+CAA+C;IAC/C,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACtF,IAAI,QAAQ,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;QACpE,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,aAAa;YACjB,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,iBAAiB,QAAQ,CAAC,OAAO,CAAC,SAAS,qCAAqC;YACrH,OAAO,EAAE;gBACP,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK;gBAC7B,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM;gBAC/B,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,QAAQ;gBACnC,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,SAAS;gBACrC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,OAAO;aAClC;SACF,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,aAAa;YACjB,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,OAAO,QAAQ,CAAC,OAAO,CAAC,MAAM,kDAAkD;SAC1F,CAAC,CAAC;IACL,CAAC;IAED,sCAAsC;IACtC,uGAAuG;IACvG,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAC3D,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC3C,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IACxC,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAE1C,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,MAAM,UAAU,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC5C,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACvB,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;YACjD,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxB,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAG7D,CAAC;oBACT,IAAI,GAAG,EAAE,CAAC;wBACR,IAAI,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;4BACzD,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;wBACvC,CAAC;wBACD,IAAI,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;4BACzC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBAC5B,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,mCAAmC;gBACrC,CAAC;YACH,CAAC;QACH,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAChD,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,KAAK,MAAM,EAAE,IAAI,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC3C,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;gBAC5D,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,uBAAuB,GAAa,EAAE,CAAC;IAC7C,KAAK,MAAM,MAAM,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QACjE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAElC,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QACnE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;gBAC9D,MAAM,QAAQ,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;gBAEnD,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAW,EAAE;oBACxC,gFAAgF;oBAChF,MAAM,eAAe,GAAG,GAAG,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;oBACnE,IAAI,eAAe,EAAE,CAAC;wBACpB,MAAM,GAAG,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;wBAC/B,OAAO,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBACnC,CAAC;oBACD,oDAAoD;oBACpD,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;oBAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;oBACtF,OAAO,CACL,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CACvF,CAAC;gBACJ,CAAC,CAAC;gBAEF,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;oBACtC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;wBACnB,YAAY,CAAC,IAAI,CAAC,GAAG,GAAG,mBAAmB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;oBACrF,CAAC;gBACH,CAAC;gBAED,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,iBAAiB,EAAE,CAAC;oBAC7C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;wBACnB,uBAAuB,CAAC,IAAI,CAC1B,GAAG,GAAG,iCAAiC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAC9E,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,kBAAkB;YACtB,IAAI,EAAE,kBAAkB;YACxB,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,GAAG,YAAY,CAAC,MAAM,kDAAkD;YACjF,OAAO,EAAE,YAAY;SACtB,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,OAAO,CAAC,WAAW,IAAI,uBAAuB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrE,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,kBAAkB;YACtB,IAAI,EAAE,kBAAkB;YACxB,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,GAAG,uBAAuB,CAAC,MAAM,4EAA4E;YACtH,OAAO,EAAE,uBAAuB;SACjC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,QAAQ,GACZ,uBAAuB,CAAC,MAAM,GAAG,CAAC;YAChC,CAAC,CAAC,KAAK,uBAAuB,CAAC,MAAM,kDAAkD;YACvF,CAAC,CAAC,EAAE,CAAC;QACT,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,kBAAkB;YACtB,IAAI,EAAE,kBAAkB;YACxB,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,kDAAkD,QAAQ,EAAE;YACrE,GAAG,CAAC,uBAAuB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpF,CAAC,CAAC;IACL,CAAC;IAED,uBAAuB;IACvB,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,aAAa;YACjB,IAAI,EAAE,oBAAoB;YAC1B,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,4DAA4D;YACzF,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS;SAC5D,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,aAAa;YACjB,IAAI,EAAE,oBAAoB;YAC1B,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,8CAA8C,QAAQ,CAAC,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,OAAO,IAAI;SAC5G,CAAC,CAAC;IACL,CAAC;IAED,2BAA2B;IAC3B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IAC/D,MAAM,aAAa,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;IAElF,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,aAAa;QAChC,WAAW,EAAE,cAAc;QAC3B,kBAAkB,EAAE,WAAW;QAC/B,iBAAiB,EAAE,UAAU;QAC7B,aAAa;QACb,MAAM;KACP,CAAC;AACJ,CAAC"}
@@ -4,16 +4,72 @@ export interface MergeResult {
4
4
  frontmatter: Frontmatter;
5
5
  body: string;
6
6
  warnings: string[];
7
+ /**
8
+ * Taxonomy names (e.g. "categories", "tags") where local and remote both changed the
9
+ * assignment differently. Callers must NOT silently resolve these: taxonomy assignments
10
+ * are user intent and dropping either side is data loss.
11
+ */
12
+ taxonomyConflicts: string[];
13
+ autoMergedTaxonomies?: TaxonomyMergeItem[];
14
+ wipeWarnings?: TaxonomyWipeWarning[];
7
15
  }
16
+ export interface TaxonomyMergeItem {
17
+ name: string;
18
+ remoteAdded: string[];
19
+ remoteRemoved: string[];
20
+ }
21
+ export interface TaxonomyWipeWarning {
22
+ name: string;
23
+ remoteTerms: string[];
24
+ remoteAdded: string[];
25
+ }
26
+ export interface TaxonomyMergeResult {
27
+ merged: Record<string, string[]>;
28
+ conflicts: string[];
29
+ autoMergedTaxonomies: TaxonomyMergeItem[];
30
+ wipeWarnings: TaxonomyWipeWarning[];
31
+ }
32
+ export interface TaxonomyMergeOptions {
33
+ strictRenameConflict?: boolean;
34
+ }
35
+ /**
36
+ * 3-way merge for taxonomies frontmatter record (category, tag, etc.).
37
+ *
38
+ * Implements strict set-algebraic 3-way merge:
39
+ * localRemoved := base \ local
40
+ * localAdded := local \ base
41
+ * remoteRemoved := base \ remote
42
+ * remoteAdded := remote \ base
43
+ * localChanged := (local ≠ base)
44
+ * remoteChanged := (remote ≠ base)
45
+ *
46
+ * Evaluation order (strict):
47
+ * 1. localChanged = false -> Keep remote (local did not touch this taxonomy)
48
+ * 2. remoteChanged = false -> Push local (clean single-side edit)
49
+ * 3. Both changed:
50
+ * union := (base \ (localRemoved ∪ remoteRemoved)) ∪ localAdded ∪ remoteAdded
51
+ * 3a. union = local -> Push local (remote changes are subsumed)
52
+ * 3b. local = ∅ & remote ≠ ∅ -> Destructive wipe guard
53
+ * 3c. union ≠ local -> Automatically push union with explicit merge log.
54
+ * Conflicts only if:
55
+ * (i) Server rejects union (400/422)
56
+ * (ii) Remote performed rename/replacement (remoteRemoved ≠ ∅ ∧ remoteAdded ≠ ∅) AND strictRenameConflict=true
57
+ * (iii) Base snapshot is null (cannot compute 3-way)
58
+ */
59
+ export declare function mergeTaxonomies(local: Record<string, string[]> | undefined, base: Record<string, string[]> | undefined | null, remote: Record<string, string[]> | undefined, options?: TaxonomyMergeOptions): TaxonomyMergeResult;
8
60
  /**
9
61
  * Merges frontmatter fields key by key.
10
62
  * Never inserts conflict markers into YAML (always produces valid Frontmatter).
11
63
  * On collision (both local and remote modified the same field differently), remote takes precedence
12
- * and a warning is logged.
64
+ * and a warning is logged. Taxonomies are the exception: they are merged per taxonomy name with set
65
+ * semantics and true conflicts are reported via `taxonomyConflicts` instead of being overwritten.
13
66
  */
14
- export declare function mergeFrontmatter(local: Frontmatter, base: Frontmatter | null, remote: Frontmatter): {
67
+ export declare function mergeFrontmatter(local: Frontmatter, base: Frontmatter | null, remote: Frontmatter, options?: TaxonomyMergeOptions): {
15
68
  merged: Frontmatter;
16
69
  warnings: string[];
70
+ taxonomyConflicts: string[];
71
+ autoMergedTaxonomies?: TaxonomyMergeItem[];
72
+ wipeWarnings?: TaxonomyWipeWarning[];
17
73
  };
18
74
  /**
19
75
  * Merges markdown body line by line using diff3.
@@ -32,5 +88,5 @@ export declare function hybrid3WayMerge(local: ParsedMarkdown, base: {
32
88
  } | null, remote: {
33
89
  frontmatter: Frontmatter;
34
90
  body: string;
35
- }): MergeResult;
91
+ }, options?: TaxonomyMergeOptions): MergeResult;
36
92
  //# sourceMappingURL=merge.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/sync/merge.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE3E,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,WAAW,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,WAAW,GAAG,IAAI,EACxB,MAAM,EAAE,WAAW,GAClB;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAuD7C;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CAgB9C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE;IAAE,WAAW,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,EACvD,MAAM,EAAE;IAAE,WAAW,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjD,WAAW,CAgBb"}
1
+ {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/sync/merge.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE3E,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,WAAW,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB;;;;OAIG;IACH,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,oBAAoB,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC3C,YAAY,CAAC,EAAE,mBAAmB,EAAE,CAAC;CACtC;AAQD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACjC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,oBAAoB,EAAE,iBAAiB,EAAE,CAAC;IAC1C,YAAY,EAAE,mBAAmB,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,oBAAoB;IACnC,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,SAAS,EAC3C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,SAAS,GAAG,IAAI,EACjD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,SAAS,EAC5C,OAAO,CAAC,EAAE,oBAAoB,GAC7B,mBAAmB,CA4IrB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,WAAW,GAAG,IAAI,EACxB,MAAM,EAAE,WAAW,EACnB,OAAO,CAAC,EAAE,oBAAoB,GAC7B;IACD,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,oBAAoB,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC3C,YAAY,CAAC,EAAE,mBAAmB,EAAE,CAAC;CACtC,CA8EA;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CAgB9C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE;IAAE,WAAW,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,EACvD,MAAM,EAAE;IAAE,WAAW,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAClD,OAAO,CAAC,EAAE,oBAAoB,GAC7B,WAAW,CA0Bb"}
@@ -20,14 +20,169 @@
20
20
  * SOFTWARE.
21
21
  */
22
22
  import { merge as diff3Merge } from 'node-diff3';
23
+ /** Order-insensitive normalization for a taxonomy term list (undefined stays undefined). */
24
+ function normalizeTermList(val) {
25
+ if (!Array.isArray(val))
26
+ return undefined;
27
+ return [...new Set(val.map((v) => String(v)))].sort();
28
+ }
29
+ /**
30
+ * 3-way merge for taxonomies frontmatter record (category, tag, etc.).
31
+ *
32
+ * Implements strict set-algebraic 3-way merge:
33
+ * localRemoved := base \ local
34
+ * localAdded := local \ base
35
+ * remoteRemoved := base \ remote
36
+ * remoteAdded := remote \ base
37
+ * localChanged := (local ≠ base)
38
+ * remoteChanged := (remote ≠ base)
39
+ *
40
+ * Evaluation order (strict):
41
+ * 1. localChanged = false -> Keep remote (local did not touch this taxonomy)
42
+ * 2. remoteChanged = false -> Push local (clean single-side edit)
43
+ * 3. Both changed:
44
+ * union := (base \ (localRemoved ∪ remoteRemoved)) ∪ localAdded ∪ remoteAdded
45
+ * 3a. union = local -> Push local (remote changes are subsumed)
46
+ * 3b. local = ∅ & remote ≠ ∅ -> Destructive wipe guard
47
+ * 3c. union ≠ local -> Automatically push union with explicit merge log.
48
+ * Conflicts only if:
49
+ * (i) Server rejects union (400/422)
50
+ * (ii) Remote performed rename/replacement (remoteRemoved ≠ ∅ ∧ remoteAdded ≠ ∅) AND strictRenameConflict=true
51
+ * (iii) Base snapshot is null (cannot compute 3-way)
52
+ */
53
+ export function mergeTaxonomies(local, base, remote, options) {
54
+ const merged = {};
55
+ const conflicts = [];
56
+ const autoMergedTaxonomies = [];
57
+ const wipeWarnings = [];
58
+ const names = new Set([
59
+ ...Object.keys(local || {}),
60
+ ...Object.keys(base || {}),
61
+ ...Object.keys(remote || {}),
62
+ ]);
63
+ const eq = (a, b) => JSON.stringify(a) === JSON.stringify(b);
64
+ for (const name of names) {
65
+ const lDefined = local !== undefined && name in local && local[name] !== undefined;
66
+ const rDefined = remote !== undefined && name in remote && remote[name] !== undefined;
67
+ const bDefined = base !== null && base !== undefined && name in base && base[name] !== undefined;
68
+ // Case 1: Neither side defined this taxonomy
69
+ if (!lDefined && !rDefined) {
70
+ if (bDefined && base[name] !== undefined) {
71
+ merged[name] = base[name];
72
+ }
73
+ continue;
74
+ }
75
+ // Case 2: Only local defined this taxonomy (remote omitted or deleted)
76
+ if (lDefined && !rDefined) {
77
+ if (!bDefined) {
78
+ merged[name] = local[name];
79
+ }
80
+ else {
81
+ const l = normalizeTermList(local[name]);
82
+ const b = normalizeTermList(base[name]);
83
+ if (eq(l, b)) {
84
+ // Local didn't change it, remote deleted it
85
+ }
86
+ else {
87
+ // Local changed it, remote deleted it -> Conflict
88
+ conflicts.push(name);
89
+ merged[name] = local[name];
90
+ }
91
+ }
92
+ continue;
93
+ }
94
+ // Case 3: Only remote defined this taxonomy (local omitted the field)
95
+ if (!lDefined && rDefined) {
96
+ merged[name] = remote[name];
97
+ continue;
98
+ }
99
+ // Case 4: Both local and remote defined this taxonomy
100
+ const lRaw = local[name];
101
+ const rRaw = remote[name];
102
+ const l = normalizeTermList(lRaw) ?? [];
103
+ const r = normalizeTermList(rRaw) ?? [];
104
+ if (eq(l, r)) {
105
+ merged[name] = lRaw;
106
+ continue;
107
+ }
108
+ // (iii) Base is null / missing: cannot compute 3-way -> conservative conflict
109
+ if (!bDefined) {
110
+ conflicts.push(name);
111
+ merged[name] = lRaw;
112
+ continue;
113
+ }
114
+ const b = normalizeTermList(base[name]) ?? [];
115
+ const baseSet = new Set(b);
116
+ const localSet = new Set(l);
117
+ const remoteSet = new Set(r);
118
+ const localAdded = l.filter((x) => !baseSet.has(x));
119
+ const localRemoved = b.filter((x) => !localSet.has(x));
120
+ const remoteAdded = r.filter((x) => !baseSet.has(x));
121
+ const remoteRemoved = b.filter((x) => !remoteSet.has(x));
122
+ const localChanged = localAdded.length > 0 || localRemoved.length > 0;
123
+ const remoteChanged = remoteAdded.length > 0 || remoteRemoved.length > 0;
124
+ // 1. localChanged = false -> Keep remote (local untouched)
125
+ if (!localChanged) {
126
+ merged[name] = rRaw;
127
+ continue;
128
+ }
129
+ // 2. remoteChanged = false -> Push local (clean single-side edit)
130
+ if (!remoteChanged) {
131
+ merged[name] = lRaw;
132
+ continue;
133
+ }
134
+ // 3. Both sides changed:
135
+ // union := (base \ (localRemoved ∪ remoteRemoved)) ∪ localAdded ∪ remoteAdded
136
+ const allRemovals = new Set([...localRemoved, ...remoteRemoved]);
137
+ const union = [
138
+ ...b.filter((x) => !allRemovals.has(x)),
139
+ ...localAdded,
140
+ ...remoteAdded.filter((x) => !localAdded.includes(x)),
141
+ ];
142
+ // 3a. union = local -> clean (remote changes are subsumed)
143
+ const unionSet = new Set(union);
144
+ const isUnionEqualLocal = unionSet.size === localSet.size && [...unionSet].every((x) => localSet.has(x));
145
+ if (isUnionEqualLocal) {
146
+ merged[name] = lRaw;
147
+ continue;
148
+ }
149
+ // 3b. Destructive wipe guard: local = ∅ and remote ≠ ∅
150
+ if (l.length === 0 && r.length > 0) {
151
+ wipeWarnings.push({
152
+ name,
153
+ remoteTerms: r,
154
+ remoteAdded,
155
+ });
156
+ }
157
+ // 3c. union ≠ local: check for remote replacement under strictRenameConflict
158
+ const isRemoteReplacement = remoteRemoved.length > 0 && remoteAdded.length > 0;
159
+ if (isRemoteReplacement && options?.strictRenameConflict) {
160
+ conflicts.push(name);
161
+ merged[name] = lRaw;
162
+ continue;
163
+ }
164
+ // Default: auto-merge union and record change log
165
+ merged[name] = union;
166
+ autoMergedTaxonomies.push({
167
+ name,
168
+ remoteAdded,
169
+ remoteRemoved,
170
+ });
171
+ }
172
+ return { merged, conflicts, autoMergedTaxonomies, wipeWarnings };
173
+ }
23
174
  /**
24
175
  * Merges frontmatter fields key by key.
25
176
  * Never inserts conflict markers into YAML (always produces valid Frontmatter).
26
177
  * On collision (both local and remote modified the same field differently), remote takes precedence
27
- * and a warning is logged.
178
+ * and a warning is logged. Taxonomies are the exception: they are merged per taxonomy name with set
179
+ * semantics and true conflicts are reported via `taxonomyConflicts` instead of being overwritten.
28
180
  */
29
- export function mergeFrontmatter(local, base, remote) {
181
+ export function mergeFrontmatter(local, base, remote, options) {
30
182
  const warnings = [];
183
+ let taxonomyConflicts = [];
184
+ let autoMergedTaxonomies;
185
+ let wipeWarnings;
31
186
  const merged = { ...remote };
32
187
  // Helper to check equality
33
188
  const isEqual = (a, b) => JSON.stringify(a) === JSON.stringify(b);
@@ -43,6 +198,14 @@ export function mergeFrontmatter(local, base, remote) {
43
198
  'bylines',
44
199
  ];
45
200
  for (const key of keys) {
201
+ if (key === 'taxonomies') {
202
+ const tax = mergeTaxonomies(local.taxonomies, base ? base.taxonomies : null, remote.taxonomies, options);
203
+ merged.taxonomies = tax.merged;
204
+ taxonomyConflicts = tax.conflicts;
205
+ autoMergedTaxonomies = tax.autoMergedTaxonomies;
206
+ wipeWarnings = tax.wipeWarnings;
207
+ continue;
208
+ }
46
209
  const localVal = local[key];
47
210
  const remoteVal = remote[key];
48
211
  const baseVal = base ? base[key] : undefined;
@@ -75,7 +238,13 @@ export function mergeFrontmatter(local, base, remote) {
75
238
  // Preserve mandatory immutable fields
76
239
  merged.id = remote.id || local.id;
77
240
  merged.collection = remote.collection || local.collection;
78
- return { merged, warnings };
241
+ return {
242
+ merged,
243
+ warnings,
244
+ taxonomyConflicts,
245
+ autoMergedTaxonomies,
246
+ wipeWarnings,
247
+ };
79
248
  }
80
249
  /**
81
250
  * Merges markdown body line by line using diff3.
@@ -99,8 +268,8 @@ export function mergeBody(localBody, baseBody, remoteBody) {
99
268
  /**
100
269
  * Executes a Hybrid 3-Way Merge separating frontmatter structured merge and markdown text merge.
101
270
  */
102
- export function hybrid3WayMerge(local, base, remote) {
103
- const { merged: frontmatter, warnings } = mergeFrontmatter(local.frontmatter, base ? base.frontmatter : null, remote.frontmatter);
271
+ export function hybrid3WayMerge(local, base, remote, options) {
272
+ const { merged: frontmatter, warnings, taxonomyConflicts, autoMergedTaxonomies, wipeWarnings, } = mergeFrontmatter(local.frontmatter, base ? base.frontmatter : null, remote.frontmatter, options);
104
273
  const baseBody = base ? base.body : '';
105
274
  const { mergedBody: body, hasConflict } = mergeBody(local.body, baseBody, remote.body);
106
275
  return {
@@ -108,6 +277,9 @@ export function hybrid3WayMerge(local, base, remote) {
108
277
  frontmatter,
109
278
  body,
110
279
  warnings,
280
+ taxonomyConflicts,
281
+ autoMergedTaxonomies,
282
+ wipeWarnings,
111
283
  };
112
284
  }
113
285
  //# sourceMappingURL=merge.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/sync/merge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/sync/merge.ts"],"names":[],"mappings":"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"}
@@ -51,10 +51,15 @@ export interface PushAllResult {
51
51
  skipped: number;
52
52
  invalid: number;
53
53
  results: PushResult[];
54
+ skippedItems?: Array<{
55
+ slug: string;
56
+ filePath: string;
57
+ reason: 'conflict_pending' | 'delete_pending';
58
+ }>;
54
59
  }
55
60
  /**
56
61
  * Orchestrates pushing all modified/untracked files in the workspace.
57
- * Excludes synced and invalid (YAML parse error) files so invalid files do not crash batch push.
62
+ * Excludes synced, conflict_pending, delete_pending, and invalid (YAML parse error) files.
58
63
  * Reusable across CLI and MCP servers.
59
64
  */
60
65
  export declare function pushAll(options: PushAllOptions): Promise<PushAllResult>;