emdash-emit 0.1.18 → 0.1.30

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 (237) hide show
  1. package/CHANGELOG.md +249 -1
  2. package/README.md +22 -11
  3. package/dist/cli/commands/conflicts.d.ts.map +1 -1
  4. package/dist/cli/commands/conflicts.js +2 -22
  5. package/dist/cli/commands/conflicts.js.map +1 -1
  6. package/dist/cli/commands/delete.d.ts.map +1 -1
  7. package/dist/cli/commands/delete.js +1 -13
  8. package/dist/cli/commands/delete.js.map +1 -1
  9. package/dist/cli/commands/doctor.d.ts.map +1 -1
  10. package/dist/cli/commands/doctor.js +1 -13
  11. package/dist/cli/commands/doctor.js.map +1 -1
  12. package/dist/cli/commands/media.d.ts.map +1 -1
  13. package/dist/cli/commands/media.js +1 -13
  14. package/dist/cli/commands/media.js.map +1 -1
  15. package/dist/cli/commands/new.d.ts.map +1 -1
  16. package/dist/cli/commands/new.js +31 -13
  17. package/dist/cli/commands/new.js.map +1 -1
  18. package/dist/cli/commands/pull.d.ts +1 -1
  19. package/dist/cli/commands/pull.d.ts.map +1 -1
  20. package/dist/cli/commands/pull.js +110 -79
  21. package/dist/cli/commands/pull.js.map +1 -1
  22. package/dist/cli/commands/push.d.ts +1 -1
  23. package/dist/cli/commands/push.d.ts.map +1 -1
  24. package/dist/cli/commands/push.js +32 -90
  25. package/dist/cli/commands/push.js.map +1 -1
  26. package/dist/cli/commands/status.d.ts.map +1 -1
  27. package/dist/cli/commands/status.js +7 -2
  28. package/dist/cli/commands/status.js.map +1 -1
  29. package/dist/cli/context.d.ts +12 -0
  30. package/dist/cli/context.d.ts.map +1 -1
  31. package/dist/cli/context.js +27 -1
  32. package/dist/cli/context.js.map +1 -1
  33. package/dist/cli/report-failure.d.ts +6 -0
  34. package/dist/cli/report-failure.d.ts.map +1 -0
  35. package/dist/cli/report-failure.js +71 -0
  36. package/dist/cli/report-failure.js.map +1 -0
  37. package/dist/client/api.d.ts +20 -0
  38. package/dist/client/api.d.ts.map +1 -1
  39. package/dist/client/api.js +90 -1
  40. package/dist/client/api.js.map +1 -1
  41. package/dist/client/lock.js.map +1 -1
  42. package/dist/client/mapper.js.map +1 -1
  43. package/dist/client/media.d.ts.map +1 -1
  44. package/dist/client/media.js.map +1 -1
  45. package/dist/db/baseline.d.ts +19 -3
  46. package/dist/db/baseline.d.ts.map +1 -1
  47. package/dist/db/baseline.js +27 -2
  48. package/dist/db/baseline.js.map +1 -1
  49. package/dist/db/cache.d.ts +7 -3
  50. package/dist/db/cache.d.ts.map +1 -1
  51. package/dist/db/cache.js +24 -295
  52. package/dist/db/cache.js.map +1 -1
  53. package/dist/db/migrations.d.ts +7 -0
  54. package/dist/db/migrations.d.ts.map +1 -0
  55. package/dist/db/migrations.js +320 -0
  56. package/dist/db/migrations.js.map +1 -0
  57. package/dist/mcp/heartbeat.d.ts +1 -34
  58. package/dist/mcp/heartbeat.d.ts.map +1 -1
  59. package/dist/mcp/heartbeat.js +1 -113
  60. package/dist/mcp/heartbeat.js.map +1 -1
  61. package/dist/mcp/tool-errors.d.ts +12 -1
  62. package/dist/mcp/tool-errors.d.ts.map +1 -1
  63. package/dist/mcp/tool-errors.js +29 -0
  64. package/dist/mcp/tool-errors.js.map +1 -1
  65. package/dist/mcp/tools/sync-conflicts.d.ts.map +1 -1
  66. package/dist/mcp/tools/sync-conflicts.js +46 -58
  67. package/dist/mcp/tools/sync-conflicts.js.map +1 -1
  68. package/dist/mcp/tools/sync-delete.d.ts.map +1 -1
  69. package/dist/mcp/tools/sync-delete.js +18 -30
  70. package/dist/mcp/tools/sync-delete.js.map +1 -1
  71. package/dist/mcp/tools/sync-diff.d.ts.map +1 -1
  72. package/dist/mcp/tools/sync-diff.js +10 -31
  73. package/dist/mcp/tools/sync-diff.js.map +1 -1
  74. package/dist/mcp/tools/sync-doctor.d.ts.map +1 -1
  75. package/dist/mcp/tools/sync-doctor.js +18 -30
  76. package/dist/mcp/tools/sync-doctor.js.map +1 -1
  77. package/dist/mcp/tools/sync-media-search.d.ts.map +1 -1
  78. package/dist/mcp/tools/sync-media-search.js +40 -52
  79. package/dist/mcp/tools/sync-media-search.js.map +1 -1
  80. package/dist/mcp/tools/sync-new.d.ts.map +1 -1
  81. package/dist/mcp/tools/sync-new.js +54 -34
  82. package/dist/mcp/tools/sync-new.js.map +1 -1
  83. package/dist/mcp/tools/sync-pull.d.ts.map +1 -1
  84. package/dist/mcp/tools/sync-pull.js +194 -220
  85. package/dist/mcp/tools/sync-pull.js.map +1 -1
  86. package/dist/mcp/tools/sync-push.d.ts.map +1 -1
  87. package/dist/mcp/tools/sync-push.js +64 -84
  88. package/dist/mcp/tools/sync-push.js.map +1 -1
  89. package/dist/mcp/tools/sync-status.d.ts.map +1 -1
  90. package/dist/mcp/tools/sync-status.js +4 -13
  91. package/dist/mcp/tools/sync-status.js.map +1 -1
  92. package/dist/sync/baseline-reconstruction.d.ts +43 -0
  93. package/dist/sync/baseline-reconstruction.d.ts.map +1 -0
  94. package/dist/sync/baseline-reconstruction.js +103 -0
  95. package/dist/sync/baseline-reconstruction.js.map +1 -0
  96. package/dist/sync/bylines.d.ts +5 -0
  97. package/dist/sync/bylines.d.ts.map +1 -1
  98. package/dist/sync/bylines.js +29 -0
  99. package/dist/sync/bylines.js.map +1 -1
  100. package/dist/sync/conflicts.d.ts.map +1 -1
  101. package/dist/sync/conflicts.js +21 -4
  102. package/dist/sync/conflicts.js.map +1 -1
  103. package/dist/sync/delete.d.ts.map +1 -1
  104. package/dist/sync/delete.js +12 -1
  105. package/dist/sync/delete.js.map +1 -1
  106. package/dist/sync/diff.d.ts.map +1 -1
  107. package/dist/sync/diff.js +62 -26
  108. package/dist/sync/diff.js.map +1 -1
  109. package/dist/sync/doctor.d.ts.map +1 -1
  110. package/dist/sync/doctor.js +13 -3
  111. package/dist/sync/doctor.js.map +1 -1
  112. package/dist/sync/guards.d.ts +1 -1
  113. package/dist/sync/guards.d.ts.map +1 -1
  114. package/dist/sync/guards.js +3 -2
  115. package/dist/sync/guards.js.map +1 -1
  116. package/dist/sync/media/companions.d.ts.map +1 -1
  117. package/dist/sync/media/companions.js.map +1 -1
  118. package/dist/sync/media/naming_mirror.d.ts.map +1 -1
  119. package/dist/sync/media/naming_mirror.js +11 -2
  120. package/dist/sync/media/naming_mirror.js.map +1 -1
  121. package/dist/sync/media/pull_article.d.ts +2 -0
  122. package/dist/sync/media/pull_article.d.ts.map +1 -1
  123. package/dist/sync/media/pull_article.js +74 -25
  124. package/dist/sync/media/pull_article.js.map +1 -1
  125. package/dist/sync/media/pull_library.d.ts.map +1 -1
  126. package/dist/sync/media/pull_library.js +34 -61
  127. package/dist/sync/media/pull_library.js.map +1 -1
  128. package/dist/sync/media/remote_index.d.ts +16 -1
  129. package/dist/sync/media/remote_index.d.ts.map +1 -1
  130. package/dist/sync/media/remote_index.js +2 -2
  131. package/dist/sync/media/remote_index.js.map +1 -1
  132. package/dist/sync/merge.d.ts +1 -1
  133. package/dist/sync/merge.d.ts.map +1 -1
  134. package/dist/sync/merge.js +50 -17
  135. package/dist/sync/merge.js.map +1 -1
  136. package/dist/sync/new.d.ts +11 -0
  137. package/dist/sync/new.d.ts.map +1 -1
  138. package/dist/sync/new.js +81 -3
  139. package/dist/sync/new.js.map +1 -1
  140. package/dist/sync/orchestrator.d.ts +34 -0
  141. package/dist/sync/orchestrator.d.ts.map +1 -1
  142. package/dist/sync/orchestrator.js +89 -80
  143. package/dist/sync/orchestrator.js.map +1 -1
  144. package/dist/sync/preflight/image_probe.d.ts +28 -0
  145. package/dist/sync/preflight/image_probe.d.ts.map +1 -0
  146. package/dist/sync/preflight/image_probe.js +70 -0
  147. package/dist/sync/preflight/image_probe.js.map +1 -0
  148. package/dist/sync/preflight.d.ts +7 -0
  149. package/dist/sync/preflight.d.ts.map +1 -1
  150. package/dist/sync/preflight.js +127 -31
  151. package/dist/sync/preflight.js.map +1 -1
  152. package/dist/sync/pull/fast_path.d.ts +9 -0
  153. package/dist/sync/pull/fast_path.d.ts.map +1 -0
  154. package/dist/sync/pull/fast_path.js +341 -0
  155. package/dist/sync/pull/fast_path.js.map +1 -0
  156. package/dist/sync/pull/index.d.ts +15 -0
  157. package/dist/sync/pull/index.d.ts.map +1 -0
  158. package/dist/sync/pull/index.js +363 -0
  159. package/dist/sync/pull/index.js.map +1 -0
  160. package/dist/sync/pull/list.d.ts +22 -0
  161. package/dist/sync/pull/list.d.ts.map +1 -0
  162. package/dist/sync/pull/list.js +175 -0
  163. package/dist/sync/pull/list.js.map +1 -0
  164. package/dist/sync/pull/media_stage.d.ts +67 -0
  165. package/dist/sync/pull/media_stage.d.ts.map +1 -0
  166. package/dist/sync/pull/media_stage.js +599 -0
  167. package/dist/sync/pull/media_stage.js.map +1 -0
  168. package/dist/sync/pull/quarantine.d.ts +22 -0
  169. package/dist/sync/pull/quarantine.d.ts.map +1 -0
  170. package/dist/sync/pull/quarantine.js +174 -0
  171. package/dist/sync/pull/quarantine.js.map +1 -0
  172. package/dist/sync/pull/types.d.ts +125 -0
  173. package/dist/sync/pull/types.d.ts.map +1 -0
  174. package/dist/sync/pull/types.js +23 -0
  175. package/dist/sync/pull/types.js.map +1 -0
  176. package/dist/sync/pull.d.ts +1 -114
  177. package/dist/sync/pull.d.ts.map +1 -1
  178. package/dist/sync/pull.js +1 -806
  179. package/dist/sync/pull.js.map +1 -1
  180. package/dist/sync/push/commit.d.ts +1 -0
  181. package/dist/sync/push/commit.d.ts.map +1 -1
  182. package/dist/sync/push/commit.js +58 -31
  183. package/dist/sync/push/commit.js.map +1 -1
  184. package/dist/sync/push/index.d.ts.map +1 -1
  185. package/dist/sync/push/index.js +30 -8
  186. package/dist/sync/push/index.js.map +1 -1
  187. package/dist/sync/push/media_stage.d.ts +17 -2
  188. package/dist/sync/push/media_stage.d.ts.map +1 -1
  189. package/dist/sync/push/media_stage.js +31 -2
  190. package/dist/sync/push/media_stage.js.map +1 -1
  191. package/dist/sync/push/merge_stage.d.ts.map +1 -1
  192. package/dist/sync/push/merge_stage.js +36 -22
  193. package/dist/sync/push/merge_stage.js.map +1 -1
  194. package/dist/sync/push/transport.d.ts +6 -2
  195. package/dist/sync/push/transport.d.ts.map +1 -1
  196. package/dist/sync/push/transport.js +5 -5
  197. package/dist/sync/push/transport.js.map +1 -1
  198. package/dist/sync/status.d.ts +3 -0
  199. package/dist/sync/status.d.ts.map +1 -1
  200. package/dist/sync/status.js +18 -55
  201. package/dist/sync/status.js.map +1 -1
  202. package/dist/sync/taxonomies.d.ts +25 -0
  203. package/dist/sync/taxonomies.d.ts.map +1 -1
  204. package/dist/sync/taxonomies.js +180 -127
  205. package/dist/sync/taxonomies.js.map +1 -1
  206. package/dist/sync/workspace/commit.d.ts +46 -0
  207. package/dist/sync/workspace/commit.d.ts.map +1 -0
  208. package/dist/sync/workspace/commit.js +85 -0
  209. package/dist/sync/workspace/commit.js.map +1 -0
  210. package/dist/sync/workspace/index.d.ts +1 -0
  211. package/dist/sync/workspace/index.d.ts.map +1 -1
  212. package/dist/sync/workspace/index.js +1 -0
  213. package/dist/sync/workspace/index.js.map +1 -1
  214. package/dist/utils/disk-spelling.d.ts +26 -0
  215. package/dist/utils/disk-spelling.d.ts.map +1 -0
  216. package/dist/utils/disk-spelling.js +51 -0
  217. package/dist/utils/disk-spelling.js.map +1 -0
  218. package/dist/utils/draft-revision.d.ts +15 -0
  219. package/dist/utils/draft-revision.d.ts.map +1 -0
  220. package/dist/utils/draft-revision.js +36 -0
  221. package/dist/utils/draft-revision.js.map +1 -0
  222. package/dist/utils/frontmatter.d.ts +21 -2
  223. package/dist/utils/frontmatter.d.ts.map +1 -1
  224. package/dist/utils/frontmatter.js +70 -7
  225. package/dist/utils/frontmatter.js.map +1 -1
  226. package/dist/utils/mcp-heartbeat.d.ts +36 -0
  227. package/dist/utils/mcp-heartbeat.d.ts.map +1 -0
  228. package/dist/utils/mcp-heartbeat.js +126 -0
  229. package/dist/utils/mcp-heartbeat.js.map +1 -0
  230. package/dist/utils/media-body-refs.d.ts.map +1 -1
  231. package/dist/utils/media-body-refs.js +2 -2
  232. package/dist/utils/media-body-refs.js.map +1 -1
  233. package/dist/utils/taxonomy-key.d.ts +25 -0
  234. package/dist/utils/taxonomy-key.d.ts.map +1 -0
  235. package/dist/utils/taxonomy-key.js +51 -0
  236. package/dist/utils/taxonomy-key.js.map +1 -0
  237. package/package.json +1 -1
@@ -21,7 +21,7 @@
21
21
  */
22
22
  import { z } from 'zod';
23
23
  import { pushArticle } from '../../sync/push.js';
24
- import { formatToolError } from '../tool-errors.js';
24
+ import { formatToolTextWithMeta, withResolvedContext } from '../tool-errors.js';
25
25
  export function registerSyncPushTool(server, resolveContext) {
26
26
  server.tool('sync_push', 'Push local Markdown article modifications or new articles to remote EmDash CMS. Automatically uploads standalone draft images in media/drafts/<file>, rewrites body URLs to /_emdash/api/media/file/<storageKey>, and promotes files to media/. Performs 3-way merge to protect remote edits. Requires allowPublish=true when transitioning status from draft to published. If conflict markers are inserted, resolve them locally before re-pushing. Paths under posts/conflicts/ are preserved rescue copies and are refused with QUARANTINED_COPY_NOT_PUSHABLE: merge their content into the canonical article first.', {
27
27
  filePath: z
@@ -60,100 +60,80 @@ export function registerSyncPushTool(server, resolveContext) {
60
60
  .optional()
61
61
  .describe('Keep mirrored body images as article-relative "../../media/<storageKey>" references on disk while pushing the canonical URL. Defaults to the workspace setting in .emit/config.json.'),
62
62
  profile: z.string().optional().describe('Target profile name for multi-site setups'),
63
- }, async (args) => {
64
- let ctx;
65
- try {
66
- ctx = resolveContext(args.profile);
67
- }
68
- catch (err) {
69
- return formatToolError(err);
70
- }
63
+ }, async (args) => withResolvedContext(resolveContext, args, async (ctx) => {
71
64
  const origin = ctx.origin;
72
- try {
73
- const res = await pushArticle(args.filePath, {
74
- workspaceRoot: ctx.root,
75
- cache: ctx.cache,
76
- origin,
77
- token: ctx.auth.token,
78
- refreshToken: ctx.auth.refreshToken,
79
- allowPublish: args.allowPublish,
80
- resolveTaxonomy: args.resolveTaxonomy,
81
- allowWipeTaxonomies: args.allowWipeTaxonomies,
82
- allowUnappliedTaxonomies: args.allowUnappliedTaxonomies,
83
- noTaxonomyAudit: args.noTaxonomyAudit,
84
- revive: args.revive,
85
- force: args.force,
86
- localMediaRefs: args.localMediaRefs === undefined ? ctx.config.localMediaRefs : args.localMediaRefs,
87
- });
88
- if (res.conflict) {
89
- const conflictDetails = res.taxonomyConflict
90
- ? [
91
- '⚠️ Taxonomy conflict detected: local and remote categories/tags diverged.',
92
- 'Article body was cleanly merged without conflict markers.',
93
- 'To resolve, call sync_push again with resolveTaxonomy="union" (recommended), "local", or "remote".',
94
- ]
95
- : [
96
- '⚠️ Conflict detected and could not be resolved automatically.',
97
- `Conflict markers (<<<<<<< LOCAL ... ======= ... >>>>>>> REMOTE) have been inserted into "${res.filePath}".`,
98
- 'Please resolve the conflicting lines in the file and retry sync_push.',
99
- ];
100
- if (res.warnings && res.warnings.length > 0) {
101
- conflictDetails.push('', 'Warnings:');
102
- for (const w of res.warnings) {
103
- conflictDetails.push(`- ${w}`);
104
- }
65
+ const res = await pushArticle(args.filePath, {
66
+ workspaceRoot: ctx.root,
67
+ cache: ctx.cache,
68
+ origin,
69
+ token: ctx.auth.token,
70
+ refreshToken: ctx.auth.refreshToken,
71
+ allowPublish: args.allowPublish,
72
+ resolveTaxonomy: args.resolveTaxonomy,
73
+ allowWipeTaxonomies: args.allowWipeTaxonomies,
74
+ allowUnappliedTaxonomies: args.allowUnappliedTaxonomies,
75
+ noTaxonomyAudit: args.noTaxonomyAudit,
76
+ revive: args.revive,
77
+ force: args.force,
78
+ localMediaRefs: args.localMediaRefs === undefined ? ctx.config.localMediaRefs : args.localMediaRefs,
79
+ });
80
+ if (res.conflict) {
81
+ const conflictDetails = res.taxonomyConflict
82
+ ? [
83
+ '⚠️ Taxonomy conflict detected: local and remote categories/tags diverged.',
84
+ 'Article body was cleanly merged without conflict markers.',
85
+ 'To resolve, call sync_push again with resolveTaxonomy="union" (recommended), "local", or "remote".',
86
+ ]
87
+ : [
88
+ '⚠️ Conflict detected and could not be resolved automatically.',
89
+ `Conflict markers (<<<<<<< LOCAL ... ======= ... >>>>>>> REMOTE) have been inserted into "${res.filePath}".`,
90
+ 'Please resolve the conflicting lines in the file and retry sync_push.',
91
+ ];
92
+ if (res.warnings && res.warnings.length > 0) {
93
+ conflictDetails.push('', 'Warnings:');
94
+ for (const w of res.warnings) {
95
+ conflictDetails.push(`- ${w}`);
105
96
  }
106
- return {
107
- content: [
108
- {
109
- type: 'text',
110
- text: conflictDetails.join('\n'),
111
- },
112
- ],
113
- };
114
- }
115
- const transitionLines = [];
116
- if (res.previousId) {
117
- transitionLines.push(`🆔 Server assigned canonical ULID: '${res.previousId}' -> '${res.id}'.`);
118
97
  }
119
- if (res.previousFilePath) {
120
- transitionLines.push(`📄 Local file renamed: "${res.previousFilePath}" -> "${res.filePath}" (use the new path for subsequent edits/pushes).`);
121
- }
122
- const taxonomyLines = [];
123
- if (res.resolvedTaxonomies) {
124
- for (const [tax, items] of Object.entries(res.resolvedTaxonomies)) {
125
- if (Array.isArray(items)) {
126
- for (const item of items) {
127
- if (item.input !== item.resolved) {
128
- taxonomyLines.push(`🏷️ Canonicalized ${tax}: '${item.input}' -> '${item.resolved}'.`);
129
- }
130
- }
131
- }
132
- }
133
- }
134
- const allWarnings = [
135
- ...(ctx.originWarning ? [ctx.originWarning] : []),
136
- ...(res.warnings || []),
137
- ];
138
- const warningLines = allWarnings.length > 0 ? ['', '⚠️ Warnings:', ...allWarnings.map((w) => ` - ${w}`)] : [];
139
- const metaSuffix = `\n\n_meta: ${JSON.stringify(ctx.meta)}`;
140
98
  return {
141
99
  content: [
142
100
  {
143
101
  type: 'text',
144
- text: [
145
- `✅ Successfully pushed '${res.id}' to remote (${res.filePath}, rev: ${res.rev}).`,
146
- ...transitionLines,
147
- ...taxonomyLines,
148
- ...warningLines,
149
- ].join('\n') + metaSuffix,
102
+ text: conflictDetails.join('\n'),
150
103
  },
151
104
  ],
152
105
  };
153
106
  }
154
- catch (err) {
155
- return formatToolError(err, ctx.meta);
107
+ const transitionLines = [];
108
+ if (res.previousId) {
109
+ transitionLines.push(`🆔 Server assigned canonical ULID: '${res.previousId}' -> '${res.id}'.`);
110
+ }
111
+ if (res.previousFilePath) {
112
+ transitionLines.push(`📄 Local file renamed: "${res.previousFilePath}" -> "${res.filePath}" (use the new path for subsequent edits/pushes).`);
113
+ }
114
+ const taxonomyLines = [];
115
+ if (res.resolvedTaxonomies) {
116
+ for (const [tax, items] of Object.entries(res.resolvedTaxonomies)) {
117
+ if (Array.isArray(items)) {
118
+ for (const item of items) {
119
+ if (item.input !== item.resolved) {
120
+ taxonomyLines.push(`🏷️ Canonicalized ${tax}: '${item.input}' -> '${item.resolved}'.`);
121
+ }
122
+ }
123
+ }
124
+ }
156
125
  }
157
- });
126
+ const allWarnings = [
127
+ ...(ctx.originWarning ? [ctx.originWarning] : []),
128
+ ...(res.warnings || []),
129
+ ];
130
+ const warningLines = allWarnings.length > 0 ? ['', '⚠️ Warnings:', ...allWarnings.map((w) => ` - ${w}`)] : [];
131
+ return formatToolTextWithMeta([
132
+ `✅ Successfully pushed '${res.id}' to remote (${res.filePath}, rev: ${res.rev}).`,
133
+ ...transitionLines,
134
+ ...taxonomyLines,
135
+ ...warningLines,
136
+ ].join('\n'), ctx.meta);
137
+ }));
158
138
  }
159
139
  //# sourceMappingURL=sync-push.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sync-push.js","sourceRoot":"","sources":["../../../src/mcp/tools/sync-push.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync-push.js","sourceRoot":"","sources":["../../../src/mcp/tools/sync-push.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sync-status.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/sync-status.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAiB,MAAM,eAAe,CAAC;AAWpE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,eAAe,GAAG,IAAI,CAuI/F"}
1
+ {"version":3,"file":"sync-status.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/sync-status.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAWrD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,eAAe,GAAG,IAAI,CAkI/F"}
@@ -21,7 +21,7 @@
21
21
  */
22
22
  import { z } from 'zod';
23
23
  import { getWorkspaceStatus, filterStatusItems, } from '../../sync/status.js';
24
- import { formatToolError, formatToolSuccess } from '../tool-errors.js';
24
+ import { formatToolError, formatToolSuccess, withResolvedContext } from '../tool-errors.js';
25
25
  const MAX_ACTION_REQUIRED = 30;
26
26
  const MAX_RECENT_SYNCED = 5;
27
27
  export function registerSyncStatusTool(server, resolveContext) {
@@ -44,17 +44,7 @@ export function registerSyncStatusTool(server, resolveContext) {
44
44
  .optional()
45
45
  .describe('Filter by synchronization state'),
46
46
  profile: z.string().optional().describe('Target profile name for multi-site setups'),
47
- }, async (args) => {
48
- // Resolve context inside the guard too: workspace/profile resolution can throw
49
- // AmbiguousProfileError or "Not inside an Emit workspace", and agents need those
50
- // formatted the same way as every other tool failure.
51
- let ctx;
52
- try {
53
- ctx = resolveContext(args.profile);
54
- }
55
- catch (error) {
56
- return formatToolError(error);
57
- }
47
+ }, async (args) => withResolvedContext(resolveContext, args, (ctx) => {
58
48
  const collection = args.collection || ctx.config.defaultCollection;
59
49
  let status;
60
50
  try {
@@ -103,6 +93,7 @@ export function registerSyncStatusTool(server, resolveContext) {
103
93
  }
104
94
  const responsePayload = {
105
95
  summary: status.summary,
96
+ hasUnpublishedDraftCount: status.summary.flags?.hasUnpublishedDraft || 0,
106
97
  actionRequired,
107
98
  actionRequiredTruncated,
108
99
  recentArticles,
@@ -142,6 +133,6 @@ export function registerSyncStatusTool(server, resolveContext) {
142
133
  : {}),
143
134
  };
144
135
  return formatToolSuccess(responsePayload, ctx.meta);
145
- });
136
+ }));
146
137
  }
147
138
  //# sourceMappingURL=sync-status.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sync-status.js","sourceRoot":"","sources":["../../../src/mcp/tools/sync-status.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync-status.js","sourceRoot":"","sources":["../../../src/mcp/tools/sync-status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import fs from 'node:fs';
2
+ import type { BaseSnapshot, CacheDatabase, SyncState } from '../db/cache.js';
3
+ import type { TaxonomyCandidates } from '../utils/frontmatter.js';
4
+ import { type DiskSpelling } from '../utils/disk-spelling.js';
5
+ export interface ReconstructedBaseline {
6
+ canonicalMarkdown: string;
7
+ diskSpellingMarkdown: string;
8
+ spelling: DiskSpelling;
9
+ matchesDisk: boolean;
10
+ }
11
+ /**
12
+ * Reconstructs the canonical baseline document and its disk-spelling representation
13
+ * (`localMediaRefs`, legacy percent-encoded taxonomy terms, and `# draft revision` comment).
14
+ */
15
+ export declare function reconstructBaseline(params: {
16
+ workspaceRoot: string;
17
+ snapshot: BaseSnapshot;
18
+ localContent: string;
19
+ currentHash?: string;
20
+ syncState?: SyncState | null;
21
+ relPath: string;
22
+ candidates?: TaxonomyCandidates;
23
+ fs?: typeof fs;
24
+ }): ReconstructedBaseline;
25
+ /**
26
+ * Checks whether a tracked file on disk is unmodified against its cached `sync_state` or
27
+ * reconstructed baseline. When raw `localHash` mismatches purely due to reference spelling
28
+ * (and `matchesDisk` is true), automatically re-tracks `sync_state.local_hash` via
29
+ * `retrackLocalHashOnly()` so subsequent status/diff/doctor/delete checks fast-path cleanly.
30
+ */
31
+ export declare function isLocalFileUnmodified(params: {
32
+ workspaceRoot: string;
33
+ cache: CacheDatabase;
34
+ id: string;
35
+ relPath: string;
36
+ localContent: string;
37
+ currentHash?: string;
38
+ syncState?: SyncState | null;
39
+ healOnSpellingMatch?: boolean;
40
+ candidates?: TaxonomyCandidates;
41
+ fs?: typeof fs;
42
+ }): boolean;
43
+ //# sourceMappingURL=baseline-reconstruction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseline-reconstruction.d.ts","sourceRoot":"","sources":["../../src/sync/baseline-reconstruction.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE7E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAsC,KAAK,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAIlG,MAAM,WAAW,qBAAqB;IACpC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,QAAQ,EAAE,YAAY,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE;IAC1C,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,YAAY,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;CAChB,GAAG,qBAAqB,CA6BxB;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE;IAC5C,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,aAAa,CAAC;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC7B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;CAChB,GAAG,OAAO,CAsCV"}
@@ -0,0 +1,103 @@
1
+ /*
2
+ * Copyright (C) 2026 SPORT-SERVICE RS★R
3
+ *
4
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ * of this software and associated documentation files (the "Software"), to deal
6
+ * in the Software without restriction, including without limitation the rights
7
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ * copies of the Software, and to permit persons to whom the Software is
9
+ * furnished to do so, subject to the following conditions:
10
+ *
11
+ * The above copyright notice and this permission notice shall be included in all
12
+ * copies or substantial portions of the Software.
13
+ *
14
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20
+ * SOFTWARE.
21
+ */
22
+ import fs from 'node:fs';
23
+ import { baselineMarkdown, retrackLocalHashOnly } from '../db/baseline.js';
24
+ import { resolveDiskSpelling, renderForDisk } from '../utils/disk-spelling.js';
25
+ import { loadLocalTaxonomyCandidates } from './taxonomies.js';
26
+ import { calculateHash } from './workspace/index.js';
27
+ /**
28
+ * Reconstructs the canonical baseline document and its disk-spelling representation
29
+ * (`localMediaRefs`, legacy percent-encoded taxonomy terms, and `# draft revision` comment).
30
+ */
31
+ export function reconstructBaseline(params) {
32
+ const customFs = params.fs ?? fs;
33
+ const currentHash = params.currentHash ?? calculateHash(params.localContent);
34
+ const candidates = params.candidates ?? loadLocalTaxonomyCandidates(params.workspaceRoot);
35
+ const spelling = resolveDiskSpelling(params.localContent, params.syncState);
36
+ const canonicalMarkdown = baselineMarkdown(params.snapshot, candidates, {
37
+ preferEncodedTaxonomy: spelling.preferEncodedTaxonomy,
38
+ hasDraftRevision: spelling.hasDraftRevision,
39
+ });
40
+ const diskSpellingMarkdown = renderForDisk(canonicalMarkdown, spelling, {
41
+ workspaceRoot: params.workspaceRoot,
42
+ articleRelPath: params.relPath,
43
+ fs: customFs,
44
+ });
45
+ const canonicalHash = calculateHash(canonicalMarkdown);
46
+ const hasSpellingTransform = diskSpellingMarkdown !== canonicalMarkdown || canonicalHash !== params.snapshot.hash;
47
+ const matchesDisk = calculateHash(diskSpellingMarkdown) === currentHash &&
48
+ (!params.syncState ||
49
+ params.syncState.localHash === currentHash ||
50
+ params.syncState.localHash === params.snapshot.hash ||
51
+ hasSpellingTransform);
52
+ return {
53
+ canonicalMarkdown,
54
+ diskSpellingMarkdown,
55
+ spelling,
56
+ matchesDisk,
57
+ };
58
+ }
59
+ /**
60
+ * Checks whether a tracked file on disk is unmodified against its cached `sync_state` or
61
+ * reconstructed baseline. When raw `localHash` mismatches purely due to reference spelling
62
+ * (and `matchesDisk` is true), automatically re-tracks `sync_state.local_hash` via
63
+ * `retrackLocalHashOnly()` so subsequent status/diff/doctor/delete checks fast-path cleanly.
64
+ */
65
+ export function isLocalFileUnmodified(params) {
66
+ const syncState = params.syncState !== undefined ? params.syncState : params.cache.getSyncState(params.id);
67
+ if (!syncState)
68
+ return false;
69
+ const currentHash = params.currentHash ?? calculateHash(params.localContent);
70
+ if (syncState.localHash === currentHash) {
71
+ return true;
72
+ }
73
+ const snapshot = params.cache.getBaseSnapshot(params.id);
74
+ if (!snapshot)
75
+ return false;
76
+ try {
77
+ const reconstructed = reconstructBaseline({
78
+ workspaceRoot: params.workspaceRoot,
79
+ snapshot,
80
+ localContent: params.localContent,
81
+ currentHash,
82
+ syncState,
83
+ relPath: params.relPath,
84
+ candidates: params.candidates,
85
+ fs: params.fs,
86
+ });
87
+ if (reconstructed.matchesDisk) {
88
+ if (params.healOnSpellingMatch !== false) {
89
+ retrackLocalHashOnly(params.cache, {
90
+ id: params.id,
91
+ localHash: currentHash,
92
+ });
93
+ }
94
+ return true;
95
+ }
96
+ return false;
97
+ }
98
+ catch {
99
+ // An unreadable or malformed baseline cannot certify the file as untouched.
100
+ return false;
101
+ }
102
+ }
103
+ //# sourceMappingURL=baseline-reconstruction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseline-reconstruction.js","sourceRoot":"","sources":["../../src/sync/baseline-reconstruction.ts"],"names":[],"mappings":"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"}
@@ -20,4 +20,9 @@ export declare function syncRemoteBylines(options: SyncBylinesOptions): Promise<
20
20
  * Returns cached slugToId and idToSlug maps directly from local DB.
21
21
  */
22
22
  export declare function loadLocalBylineMaps(cache: CacheDatabase): BylineMaps;
23
+ /**
24
+ * Extracts raw byline identifiers (IDs or slugs) referenced by a remote article JSON item.
25
+ * Used to detect unknown byline IDs on single-article pull and trigger on-demand sync.
26
+ */
27
+ export declare function extractRemoteBylineIds(rawItem: Record<string, unknown>): string[];
23
28
  //# sourceMappingURL=bylines.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bylines.d.ts","sourceRoot":"","sources":["../../src/sync/bylines.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,KAAK,aAAa,EAAqB,MAAM,gBAAgB,CAAC;AAIvE,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,aAAa,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB;AA4CD;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,CAsDxF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,GAAG,UAAU,CAEpE"}
1
+ {"version":3,"file":"bylines.d.ts","sourceRoot":"","sources":["../../src/sync/bylines.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,KAAK,aAAa,EAAqB,MAAM,gBAAgB,CAAC;AAIvE,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,aAAa,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB;AA4CD;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,CAsDxF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,GAAG,UAAU,CAEpE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CA0BjF"}
@@ -110,4 +110,33 @@ export async function syncRemoteBylines(options) {
110
110
  export function loadLocalBylineMaps(cache) {
111
111
  return cache.getBylineMaps();
112
112
  }
113
+ /**
114
+ * Extracts raw byline identifiers (IDs or slugs) referenced by a remote article JSON item.
115
+ * Used to detect unknown byline IDs on single-article pull and trigger on-demand sync.
116
+ */
117
+ export function extractRemoteBylineIds(rawItem) {
118
+ const ids = new Set();
119
+ const rawBylines = (rawItem.bylines || []);
120
+ if (Array.isArray(rawBylines)) {
121
+ for (const b of rawBylines) {
122
+ if (b.bylineId)
123
+ ids.add(b.bylineId);
124
+ if (b.byline?.id)
125
+ ids.add(b.byline.id);
126
+ if (b.byline?.slug)
127
+ ids.add(b.byline.slug);
128
+ }
129
+ }
130
+ if (rawItem.byline && typeof rawItem.byline === 'object') {
131
+ const single = rawItem.byline;
132
+ if (single.id)
133
+ ids.add(single.id);
134
+ if (single.slug)
135
+ ids.add(single.slug);
136
+ }
137
+ if (typeof rawItem.primaryBylineId === 'string' && rawItem.primaryBylineId) {
138
+ ids.add(rawItem.primaryBylineId);
139
+ }
140
+ return Array.from(ids);
141
+ }
113
142
  //# sourceMappingURL=bylines.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bylines.js","sourceRoot":"","sources":["../../src/sync/bylines.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bylines.js","sourceRoot":"","sources":["../../src/sync/bylines.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"conflicts.d.ts","sourceRoot":"","sources":["../../src/sync/conflicts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"conflicts.d.ts","sourceRoot":"","sources":["../../src/sync/conflicts.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,7 @@
22
22
  import fs from 'node:fs';
23
23
  import path from 'node:path';
24
24
  import { parseMarkdown, lenientRepairMarkdownFrontmatter } from '../utils/frontmatter.js';
25
+ import { isLocalFileUnmodified } from './baseline-reconstruction.js';
25
26
  import { computeContextDiff } from './diff.js';
26
27
  import { calculateHash } from './workspace/index.js';
27
28
  export class CanonicalHasUnpushedEditsError extends Error {
@@ -357,7 +358,6 @@ export function resolveConflict(options) {
357
358
  // Major 1 Guard: Check if canonical file has unpushed modifications
358
359
  if (!options.force && fs.existsSync(canonicalFull)) {
359
360
  const canonicalContent = fs.readFileSync(canonicalFull, 'utf8');
360
- const canonicalHash = calculateHash(canonicalContent);
361
361
  let canonicalId = id;
362
362
  try {
363
363
  const parsedCan = parseMarkdown(canonicalContent);
@@ -367,7 +367,16 @@ export function resolveConflict(options) {
367
367
  // fallback
368
368
  }
369
369
  const syncState = options.cache.getSyncState(canonicalId);
370
- if (syncState && syncState.localHash !== canonicalHash) {
370
+ if (syncState &&
371
+ !isLocalFileUnmodified({
372
+ workspaceRoot: options.workspaceRoot,
373
+ cache: options.cache,
374
+ id: canonicalId,
375
+ relPath: canonicalRel,
376
+ localContent: canonicalContent,
377
+ syncState,
378
+ healOnSpellingMatch: false,
379
+ })) {
371
380
  throw new CanonicalHasUnpushedEditsError({
372
381
  canonicalFilePath: canonicalRel,
373
382
  conflictFilePath: relPath,
@@ -479,7 +488,6 @@ export function pruneConflicts(options) {
479
488
  const canonicalFull = path.join(options.workspaceRoot, canonicalRel);
480
489
  if (fs.existsSync(canonicalFull)) {
481
490
  const canonicalContent = fs.readFileSync(canonicalFull, 'utf8');
482
- const canonicalHash = calculateHash(canonicalContent);
483
491
  let resolvedId = item.id;
484
492
  if (!resolvedId) {
485
493
  try {
@@ -493,7 +501,16 @@ export function pruneConflicts(options) {
493
501
  const syncState = resolvedId
494
502
  ? options.cache.getSyncState(resolvedId)
495
503
  : options.cache.getSyncStateByPath(canonicalRel);
496
- if (syncState && syncState.localHash !== canonicalHash) {
504
+ if (syncState &&
505
+ !isLocalFileUnmodified({
506
+ workspaceRoot: options.workspaceRoot,
507
+ cache: options.cache,
508
+ id: syncState.id,
509
+ relPath: canonicalRel,
510
+ localContent: canonicalContent,
511
+ syncState,
512
+ healOnSpellingMatch: true,
513
+ })) {
497
514
  skipped.push({
498
515
  filePath: item.filePath,
499
516
  reason: `Canonical article ${canonicalRel} has unpushed modifications; rescue copy preserved`,