emdash-emit 0.1.17 → 0.1.25

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 (216) hide show
  1. package/CHANGELOG.md +152 -0
  2. package/README.md +22 -11
  3. package/dist/cli/commands/new.d.ts.map +1 -1
  4. package/dist/cli/commands/new.js +30 -0
  5. package/dist/cli/commands/new.js.map +1 -1
  6. package/dist/cli/commands/pull.d.ts +2 -10
  7. package/dist/cli/commands/pull.d.ts.map +1 -1
  8. package/dist/cli/commands/pull.js +12 -30
  9. package/dist/cli/commands/pull.js.map +1 -1
  10. package/dist/cli/commands/status.d.ts.map +1 -1
  11. package/dist/cli/commands/status.js +7 -2
  12. package/dist/cli/commands/status.js.map +1 -1
  13. package/dist/client/api.d.ts +20 -0
  14. package/dist/client/api.d.ts.map +1 -1
  15. package/dist/client/api.js +89 -0
  16. package/dist/client/api.js.map +1 -1
  17. package/dist/client/auth.d.ts.map +1 -1
  18. package/dist/client/auth.js +2 -1
  19. package/dist/client/auth.js.map +1 -1
  20. package/dist/client/endpoints.d.ts +19 -0
  21. package/dist/client/endpoints.d.ts.map +1 -0
  22. package/dist/client/endpoints.js +69 -0
  23. package/dist/client/endpoints.js.map +1 -0
  24. package/dist/client/http.d.ts +4 -2
  25. package/dist/client/http.d.ts.map +1 -1
  26. package/dist/client/http.js.map +1 -1
  27. package/dist/client/lock.d.ts.map +1 -1
  28. package/dist/client/lock.js +4 -3
  29. package/dist/client/lock.js.map +1 -1
  30. package/dist/client/mapper.d.ts.map +1 -1
  31. package/dist/client/mapper.js +5 -3
  32. package/dist/client/mapper.js.map +1 -1
  33. package/dist/client/media-id.d.ts +2 -0
  34. package/dist/client/media-id.d.ts.map +1 -0
  35. package/dist/client/media-id.js +23 -0
  36. package/dist/client/media-id.js.map +1 -0
  37. package/dist/client/media.d.ts +8 -7
  38. package/dist/client/media.d.ts.map +1 -1
  39. package/dist/client/media.js +58 -17
  40. package/dist/client/media.js.map +1 -1
  41. package/dist/db/baseline.d.ts +38 -0
  42. package/dist/db/baseline.d.ts.map +1 -0
  43. package/dist/db/baseline.js +74 -0
  44. package/dist/db/baseline.js.map +1 -0
  45. package/dist/db/cache.d.ts +8 -2
  46. package/dist/db/cache.d.ts.map +1 -1
  47. package/dist/db/cache.js +24 -2
  48. package/dist/db/cache.js.map +1 -1
  49. package/dist/index.d.ts +4 -0
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +4 -0
  52. package/dist/index.js.map +1 -1
  53. package/dist/mcp/tools/sync-new.d.ts.map +1 -1
  54. package/dist/mcp/tools/sync-new.js +42 -1
  55. package/dist/mcp/tools/sync-new.js.map +1 -1
  56. package/dist/mcp/tools/sync-pull.d.ts.map +1 -1
  57. package/dist/mcp/tools/sync-pull.js +15 -2
  58. package/dist/mcp/tools/sync-pull.js.map +1 -1
  59. package/dist/mcp/tools/sync-status.d.ts.map +1 -1
  60. package/dist/mcp/tools/sync-status.js +1 -0
  61. package/dist/mcp/tools/sync-status.js.map +1 -1
  62. package/dist/presentation/article_report.d.ts +40 -0
  63. package/dist/presentation/article_report.d.ts.map +1 -0
  64. package/dist/presentation/article_report.js +80 -0
  65. package/dist/presentation/article_report.js.map +1 -0
  66. package/dist/sync/bylines.d.ts.map +1 -1
  67. package/dist/sync/bylines.js +2 -1
  68. package/dist/sync/bylines.js.map +1 -1
  69. package/dist/sync/conflicts.js +1 -1
  70. package/dist/sync/conflicts.js.map +1 -1
  71. package/dist/sync/delete.d.ts +0 -5
  72. package/dist/sync/delete.d.ts.map +1 -1
  73. package/dist/sync/delete.js +5 -11
  74. package/dist/sync/delete.js.map +1 -1
  75. package/dist/sync/diff.d.ts.map +1 -1
  76. package/dist/sync/diff.js +13 -9
  77. package/dist/sync/diff.js.map +1 -1
  78. package/dist/sync/doctor.d.ts.map +1 -1
  79. package/dist/sync/doctor.js +11 -14
  80. package/dist/sync/doctor.js.map +1 -1
  81. package/dist/sync/guards.d.ts +5 -0
  82. package/dist/sync/guards.d.ts.map +1 -1
  83. package/dist/sync/guards.js +62 -1
  84. package/dist/sync/guards.js.map +1 -1
  85. package/dist/sync/media/body_scan.d.ts.map +1 -1
  86. package/dist/sync/media/body_scan.js +9 -3
  87. package/dist/sync/media/body_scan.js.map +1 -1
  88. package/dist/sync/media/companions.d.ts +2 -9
  89. package/dist/sync/media/companions.d.ts.map +1 -1
  90. package/dist/sync/media/companions.js +5 -23
  91. package/dist/sync/media/companions.js.map +1 -1
  92. package/dist/sync/media/mirror_item.d.ts.map +1 -1
  93. package/dist/sync/media/mirror_item.js +33 -21
  94. package/dist/sync/media/mirror_item.js.map +1 -1
  95. package/dist/sync/media/pull_article.d.ts.map +1 -1
  96. package/dist/sync/media/pull_article.js +3 -2
  97. package/dist/sync/media/pull_article.js.map +1 -1
  98. package/dist/sync/media/pull_library.d.ts.map +1 -1
  99. package/dist/sync/media/pull_library.js +16 -11
  100. package/dist/sync/media/pull_library.js.map +1 -1
  101. package/dist/sync/media/remote_index.d.ts.map +1 -1
  102. package/dist/sync/media/remote_index.js +2 -1
  103. package/dist/sync/media/remote_index.js.map +1 -1
  104. package/dist/sync/media/types.d.ts +4 -3
  105. package/dist/sync/media/types.d.ts.map +1 -1
  106. package/dist/sync/media/types.js.map +1 -1
  107. package/dist/sync/merge.d.ts +1 -1
  108. package/dist/sync/merge.d.ts.map +1 -1
  109. package/dist/sync/merge.js +50 -17
  110. package/dist/sync/merge.js.map +1 -1
  111. package/dist/sync/new.d.ts +11 -0
  112. package/dist/sync/new.d.ts.map +1 -1
  113. package/dist/sync/new.js +81 -4
  114. package/dist/sync/new.js.map +1 -1
  115. package/dist/sync/preflight.d.ts +10 -2
  116. package/dist/sync/preflight.d.ts.map +1 -1
  117. package/dist/sync/preflight.js +119 -17
  118. package/dist/sync/preflight.js.map +1 -1
  119. package/dist/sync/pull.d.ts +6 -44
  120. package/dist/sync/pull.d.ts.map +1 -1
  121. package/dist/sync/pull.js +154 -207
  122. package/dist/sync/pull.js.map +1 -1
  123. package/dist/sync/push/commit.d.ts +61 -0
  124. package/dist/sync/push/commit.d.ts.map +1 -0
  125. package/dist/sync/push/commit.js +258 -0
  126. package/dist/sync/push/commit.js.map +1 -0
  127. package/dist/sync/push/guards.d.ts +33 -0
  128. package/dist/sync/push/guards.d.ts.map +1 -0
  129. package/dist/sync/push/guards.js +110 -0
  130. package/dist/sync/push/guards.js.map +1 -0
  131. package/dist/sync/push/index.d.ts +9 -0
  132. package/dist/sync/push/index.d.ts.map +1 -0
  133. package/dist/sync/push/index.js +372 -0
  134. package/dist/sync/push/index.js.map +1 -0
  135. package/dist/sync/push/media_stage.d.ts +56 -0
  136. package/dist/sync/push/media_stage.d.ts.map +1 -0
  137. package/dist/sync/push/media_stage.js +338 -0
  138. package/dist/sync/push/media_stage.js.map +1 -0
  139. package/dist/sync/push/merge_stage.d.ts +37 -0
  140. package/dist/sync/push/merge_stage.d.ts.map +1 -0
  141. package/dist/sync/push/merge_stage.js +257 -0
  142. package/dist/sync/push/merge_stage.js.map +1 -0
  143. package/dist/sync/push/preflight_stage.d.ts +6 -0
  144. package/dist/sync/push/preflight_stage.d.ts.map +1 -0
  145. package/dist/sync/push/preflight_stage.js +40 -0
  146. package/dist/sync/push/preflight_stage.js.map +1 -0
  147. package/dist/sync/push/tax_audit.d.ts +24 -0
  148. package/dist/sync/push/tax_audit.d.ts.map +1 -0
  149. package/dist/sync/push/tax_audit.js +70 -0
  150. package/dist/sync/push/tax_audit.js.map +1 -0
  151. package/dist/sync/push/taxonomy_plan.d.ts +36 -0
  152. package/dist/sync/push/taxonomy_plan.d.ts.map +1 -0
  153. package/dist/sync/push/taxonomy_plan.js +136 -0
  154. package/dist/sync/push/taxonomy_plan.js.map +1 -0
  155. package/dist/sync/push/transport.d.ts +14 -0
  156. package/dist/sync/push/transport.d.ts.map +1 -0
  157. package/dist/sync/push/transport.js +74 -0
  158. package/dist/sync/push/transport.js.map +1 -0
  159. package/dist/sync/push/types.d.ts +62 -0
  160. package/dist/sync/push/types.d.ts.map +1 -0
  161. package/dist/sync/push/types.js +23 -0
  162. package/dist/sync/push/types.js.map +1 -0
  163. package/dist/sync/push.d.ts +2 -57
  164. package/dist/sync/push.d.ts.map +1 -1
  165. package/dist/sync/push.js +2 -1184
  166. package/dist/sync/push.js.map +1 -1
  167. package/dist/sync/status.d.ts +3 -0
  168. package/dist/sync/status.d.ts.map +1 -1
  169. package/dist/sync/status.js +18 -8
  170. package/dist/sync/status.js.map +1 -1
  171. package/dist/sync/taxonomies.d.ts.map +1 -1
  172. package/dist/sync/taxonomies.js +21 -9
  173. package/dist/sync/taxonomies.js.map +1 -1
  174. package/dist/sync/terms.d.ts.map +1 -1
  175. package/dist/sync/terms.js +2 -1
  176. package/dist/sync/terms.js.map +1 -1
  177. package/dist/sync/workspace/commit.d.ts +46 -0
  178. package/dist/sync/workspace/commit.d.ts.map +1 -0
  179. package/dist/sync/workspace/commit.js +85 -0
  180. package/dist/sync/workspace/commit.js.map +1 -0
  181. package/dist/sync/workspace/index.d.ts +42 -0
  182. package/dist/sync/workspace/index.d.ts.map +1 -0
  183. package/dist/sync/workspace/index.js +125 -0
  184. package/dist/sync/workspace/index.js.map +1 -0
  185. package/dist/utils/disk-spelling.d.ts +26 -0
  186. package/dist/utils/disk-spelling.d.ts.map +1 -0
  187. package/dist/utils/disk-spelling.js +51 -0
  188. package/dist/utils/disk-spelling.js.map +1 -0
  189. package/dist/utils/draft-revision.d.ts +15 -0
  190. package/dist/utils/draft-revision.d.ts.map +1 -0
  191. package/dist/utils/draft-revision.js +36 -0
  192. package/dist/utils/draft-revision.js.map +1 -0
  193. package/dist/utils/frontmatter.d.ts +21 -2
  194. package/dist/utils/frontmatter.d.ts.map +1 -1
  195. package/dist/utils/frontmatter.js +71 -10
  196. package/dist/utils/frontmatter.js.map +1 -1
  197. package/dist/utils/media-body-refs.d.ts +24 -0
  198. package/dist/utils/media-body-refs.d.ts.map +1 -1
  199. package/dist/utils/media-body-refs.js +51 -0
  200. package/dist/utils/media-body-refs.js.map +1 -1
  201. package/dist/utils/media-companion.d.ts +13 -0
  202. package/dist/utils/media-companion.d.ts.map +1 -0
  203. package/dist/utils/media-companion.js +42 -0
  204. package/dist/utils/media-companion.js.map +1 -0
  205. package/dist/utils/media-id.d.ts +46 -0
  206. package/dist/utils/media-id.d.ts.map +1 -0
  207. package/dist/utils/media-id.js +84 -0
  208. package/dist/utils/media-id.js.map +1 -0
  209. package/dist/utils/naming.d.ts.map +1 -1
  210. package/dist/utils/naming.js +3 -2
  211. package/dist/utils/naming.js.map +1 -1
  212. package/dist/utils/ulid.d.ts +31 -0
  213. package/dist/utils/ulid.d.ts.map +1 -0
  214. package/dist/utils/ulid.js +65 -0
  215. package/dist/utils/ulid.js.map +1 -0
  216. package/package.json +1 -1
@@ -20,11 +20,20 @@
20
20
  * SOFTWARE.
21
21
  */
22
22
  import { merge as diff3Merge } from 'node-diff3';
23
+ import { tryDecodeTaxonomyTerm, } from '../utils/frontmatter.js';
23
24
  /** Order-insensitive normalization for a taxonomy term list (undefined stays undefined). */
24
- function normalizeTermList(val) {
25
+ function normalizeTermList(val, preferredMap) {
25
26
  if (!Array.isArray(val))
26
27
  return undefined;
27
- return [...new Set(val.map((v) => String(v)))].sort();
28
+ return [
29
+ ...new Set(val.map((v) => {
30
+ const s = String(v);
31
+ if (!preferredMap)
32
+ return s;
33
+ const key = tryDecodeTaxonomyTerm(s).normalize('NFC');
34
+ return preferredMap.get(key) || s;
35
+ })),
36
+ ].sort();
28
37
  }
29
38
  /**
30
39
  * 3-way merge for taxonomies frontmatter record (category, tag, etc.).
@@ -73,14 +82,40 @@ export function mergeTaxonomies(local, base, remote, options) {
73
82
  }
74
83
  continue;
75
84
  }
85
+ const lRaw = local?.[name];
86
+ const rRaw = remote?.[name];
87
+ const bRaw = base?.[name];
88
+ // Build preferredTermMap across all candidates: canonical slug (%-encoded) takes precedence
89
+ const preferredTermMap = new Map();
90
+ const allTerms = [
91
+ ...(Array.isArray(bRaw) ? bRaw : []),
92
+ ...(Array.isArray(rRaw) ? rRaw : []),
93
+ ...(Array.isArray(lRaw) ? lRaw : []),
94
+ ];
95
+ for (const t of allTerms) {
96
+ const s = String(t);
97
+ const key = tryDecodeTaxonomyTerm(s).normalize('NFC');
98
+ const isPercentEncoded = tryDecodeTaxonomyTerm(s) !== s;
99
+ const existing = preferredTermMap.get(key);
100
+ if (!existing) {
101
+ preferredTermMap.set(key, s);
102
+ }
103
+ else if (isPercentEncoded && tryDecodeTaxonomyTerm(existing) === existing) {
104
+ // Upgrade to canonical slug if currently mapped to plain/decoded string
105
+ preferredTermMap.set(key, s);
106
+ }
107
+ }
108
+ const lNormalized = normalizeTermList(lRaw, preferredTermMap);
109
+ const rNormalized = normalizeTermList(rRaw, preferredTermMap);
110
+ const bNormalized = normalizeTermList(bRaw, preferredTermMap);
76
111
  // Case 2: Only local defined this taxonomy (remote omitted or deleted)
77
112
  if (lDefined && !rDefined) {
78
113
  if (!bDefined) {
79
114
  merged[name] = local[name];
80
115
  }
81
116
  else {
82
- const l = normalizeTermList(local[name]);
83
- const b = normalizeTermList(base[name]);
117
+ const l = lNormalized;
118
+ const b = bNormalized;
84
119
  if (eq(l, b)) {
85
120
  // Local didn't change it, remote deleted it
86
121
  }
@@ -119,21 +154,19 @@ export function mergeTaxonomies(local, base, remote, options) {
119
154
  continue;
120
155
  }
121
156
  // Case 4: Both local and remote defined this taxonomy
122
- const lRaw = local[name];
123
- const rRaw = remote[name];
124
- const l = normalizeTermList(lRaw) ?? [];
125
- const r = normalizeTermList(rRaw) ?? [];
157
+ const l = lNormalized ?? [];
158
+ const r = rNormalized ?? [];
126
159
  if (eq(l, r)) {
127
- merged[name] = lRaw;
160
+ merged[name] = l;
128
161
  continue;
129
162
  }
130
163
  // (iii) Base is null / missing: cannot compute 3-way -> conservative conflict
131
164
  if (!bDefined) {
132
165
  conflicts.push(name);
133
- merged[name] = lRaw;
166
+ merged[name] = l;
134
167
  continue;
135
168
  }
136
- const b = normalizeTermList(base[name]) ?? [];
169
+ const b = bNormalized ?? [];
137
170
  const baseSet = new Set(b);
138
171
  const localSet = new Set(l);
139
172
  const remoteSet = new Set(r);
@@ -145,17 +178,17 @@ export function mergeTaxonomies(local, base, remote, options) {
145
178
  const remoteChanged = remoteAdded.length > 0 || remoteRemoved.length > 0;
146
179
  // 1. localChanged = false -> Keep remote (local untouched)
147
180
  if (!localChanged) {
148
- merged[name] = rRaw;
181
+ merged[name] = r;
149
182
  continue;
150
183
  }
151
184
  // 2. remoteChanged = false -> Push local (clean single-side edit)
152
185
  if (!remoteChanged) {
153
- merged[name] = lRaw;
186
+ merged[name] = l;
154
187
  continue;
155
188
  }
156
189
  // (a) Explicit strategy takes precedence before union evaluation
157
190
  if (options?.strategy === 'local') {
158
- merged[name] = lRaw;
191
+ merged[name] = l;
159
192
  strategyAdoptions.push({
160
193
  name,
161
194
  side: 'local',
@@ -165,7 +198,7 @@ export function mergeTaxonomies(local, base, remote, options) {
165
198
  continue;
166
199
  }
167
200
  if (options?.strategy === 'remote') {
168
- merged[name] = rRaw;
201
+ merged[name] = r;
169
202
  strategyAdoptions.push({
170
203
  name,
171
204
  side: 'remote',
@@ -186,7 +219,7 @@ export function mergeTaxonomies(local, base, remote, options) {
186
219
  const unionSet = new Set(union);
187
220
  const isUnionEqualLocal = unionSet.size === localSet.size && [...unionSet].every((x) => localSet.has(x));
188
221
  if (isUnionEqualLocal) {
189
- merged[name] = lRaw;
222
+ merged[name] = l;
190
223
  continue;
191
224
  }
192
225
  // 3b. Destructive wipe guard: local = ∅ and remote ≠ ∅
@@ -201,7 +234,7 @@ export function mergeTaxonomies(local, base, remote, options) {
201
234
  const isRemoteReplacement = remoteRemoved.length > 0 && remoteAdded.length > 0;
202
235
  if (isRemoteReplacement && options?.strictRenameConflict) {
203
236
  conflicts.push(name);
204
- merged[name] = lRaw;
237
+ merged[name] = l;
205
238
  continue;
206
239
  }
207
240
  // Default: auto-merge union and record change log
@@ -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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"}
@@ -29,12 +29,23 @@ export interface CreateArticleOptions {
29
29
  byline?: string;
30
30
  cache?: CacheDatabase;
31
31
  candidates?: TaxonomyCandidates;
32
+ categories?: string[] | string;
33
+ tags?: string[] | string;
34
+ description?: string;
35
+ featuredImage?: string;
32
36
  }
33
37
  export interface CreateArticleResult {
34
38
  id: string;
35
39
  slug: string;
36
40
  filePath: string;
37
41
  fullPath: string;
42
+ warnings: string[];
43
+ assigned: {
44
+ categories: string[];
45
+ tags: string[];
46
+ featuredImage?: string;
47
+ description?: string;
48
+ };
38
49
  }
39
50
  /**
40
51
  * Creates a brand-new article scaffold in <collection>/draft/<ulid>-<slug>.md.
@@ -1 +1 @@
1
- {"version":3,"file":"new.d.ts","sourceRoot":"","sources":["../../src/sync/new.ts"],"names":[],"mappings":"AAyBA,OAAO,EAKL,KAAK,kBAAkB,EACxB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC;CAC/B;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,SAAgB,IAAI,6BAA6B;IACjD,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,SAAgB,gBAAgB,EAAE,MAAM,CAAC;IACzC,SAAgB,cAAc,EAAE,MAAM,CAAC;IACvC,SAAgB,UAAU,EAAE,MAAM,CAAC;IAEnC,YAAY,OAAO,EAAE,iBAAiB,EAarC;CACF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,aAAa,GACpB,iBAAiB,GAAG,IAAI,CAwE1B;AAED,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,UAAU,CAAC,EAAE,kBAAkB,CAAC;CACjC;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,oBAAoB,GAAG,mBAAmB,CA4DxF"}
1
+ {"version":3,"file":"new.d.ts","sourceRoot":"","sources":["../../src/sync/new.ts"],"names":[],"mappings":"AAyBA,OAAO,EAML,KAAK,kBAAkB,EACxB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC;CAC/B;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,SAAgB,IAAI,6BAA6B;IACjD,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,SAAgB,gBAAgB,EAAE,MAAM,CAAC;IACzC,SAAgB,cAAc,EAAE,MAAM,CAAC;IACvC,SAAgB,UAAU,EAAE,MAAM,CAAC;IAEnC,YAAY,OAAO,EAAE,iBAAiB,EAarC;CACF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,aAAa,GACpB,iBAAiB,GAAG,IAAI,CAwE1B;AAED,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE;QACR,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAgBD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,oBAAoB,GAAG,mBAAmB,CAsIxF"}
package/dist/sync/new.js CHANGED
@@ -22,8 +22,9 @@
22
22
  import fs from 'node:fs';
23
23
  import path from 'node:path';
24
24
  import { ulid } from 'ulidx';
25
- import { computeArticleRelativePath, parseMarkdown, serializeMarkdown, } from '../utils/frontmatter.js';
25
+ import { computeArticleRelativePath, parseMarkdown, serializeMarkdown, tryDecodeTaxonomyTerm, } from '../utils/frontmatter.js';
26
26
  import { loadLocalTaxonomyCandidates } from './taxonomies.js';
27
+ import { CANONICAL_ULID_REGEX } from '../utils/ulid.js';
27
28
  export class DuplicateSlugError extends Error {
28
29
  code = 'DUPLICATE_SLUG_CONFLICT';
29
30
  slug;
@@ -117,6 +118,20 @@ export function findLocalDuplicateSlug(workspaceRoot, collection, slug, cache) {
117
118
  }
118
119
  return null;
119
120
  }
121
+ function normalizeStringList(input) {
122
+ if (!input)
123
+ return [];
124
+ if (Array.isArray(input)) {
125
+ return input
126
+ .flatMap((item) => item.split(','))
127
+ .map((s) => s.trim())
128
+ .filter(Boolean);
129
+ }
130
+ return input
131
+ .split(',')
132
+ .map((s) => s.trim())
133
+ .filter(Boolean);
134
+ }
120
135
  /**
121
136
  * Creates a brand-new article scaffold in <collection>/draft/<ulid>-<slug>.md.
122
137
  * Assigns a client-side ULID immediately to guarantee ID/filename consistency (G2).
@@ -142,6 +157,60 @@ export function createArticleScaffold(options) {
142
157
  initialBylines = [cached[0].slug];
143
158
  }
144
159
  }
160
+ const normalizedCategories = normalizeStringList(options.categories);
161
+ const normalizedTags = normalizeStringList(options.tags);
162
+ let initialFeaturedImage;
163
+ if (options.featuredImage) {
164
+ const trimmed = options.featuredImage.trim();
165
+ if (trimmed) {
166
+ initialFeaturedImage = CANONICAL_ULID_REGEX.test(trimmed) ? trimmed.toUpperCase() : trimmed;
167
+ }
168
+ }
169
+ let initialSeo;
170
+ if (options.description) {
171
+ const trimmedDesc = options.description.trim();
172
+ if (trimmedDesc) {
173
+ initialSeo = {
174
+ description: trimmedDesc,
175
+ };
176
+ }
177
+ }
178
+ const candidates = options.candidates || loadLocalTaxonomyCandidates(options.workspaceRoot);
179
+ const warnings = [];
180
+ const candidateCategories = candidates.categories ?? [];
181
+ const candidateTags = candidates.tags ?? [];
182
+ const isKnownTerm = (term, canonicalList, slugToNameMap) => {
183
+ if (canonicalList.includes(term))
184
+ return true;
185
+ const tNorm = tryDecodeTaxonomyTerm(term).normalize('NFC').toLowerCase();
186
+ if (canonicalList.some((c) => tryDecodeTaxonomyTerm(c).normalize('NFC').toLowerCase() === tNorm)) {
187
+ return true;
188
+ }
189
+ if (slugToNameMap) {
190
+ for (const [k, v] of Object.entries(slugToNameMap)) {
191
+ if (tryDecodeTaxonomyTerm(k).normalize('NFC').toLowerCase() === tNorm)
192
+ return true;
193
+ if (v && v.normalize('NFC').toLowerCase() === tNorm)
194
+ return true;
195
+ }
196
+ }
197
+ return false;
198
+ };
199
+ // Epistemic check: Only audit terms if local definitions exist
200
+ if (candidateCategories.length > 0) {
201
+ for (const cat of normalizedCategories) {
202
+ if (!isKnownTerm(cat, candidateCategories, candidates.slugToName?.category)) {
203
+ warnings.push(`Unknown category slug '${cat}' (not found in local categories/*.yaml definitions).`);
204
+ }
205
+ }
206
+ }
207
+ if (candidateTags.length > 0) {
208
+ for (const tag of normalizedTags) {
209
+ if (!isKnownTerm(tag, candidateTags, candidates.slugToName?.tag)) {
210
+ warnings.push(`Unknown tag slug '${tag}' (not found in local tags/*.yaml definitions).`);
211
+ }
212
+ }
213
+ }
145
214
  const frontmatter = {
146
215
  id,
147
216
  slug,
@@ -151,13 +220,14 @@ export function createArticleScaffold(options) {
151
220
  publishedAt: null,
152
221
  locale,
153
222
  taxonomies: {
154
- categories: [],
155
- tags: [],
223
+ categories: normalizedCategories,
224
+ tags: normalizedTags,
156
225
  },
157
226
  bylines: initialBylines,
227
+ ...(initialFeaturedImage ? { featuredImage: initialFeaturedImage } : {}),
228
+ ...(initialSeo ? { seo: initialSeo } : {}),
158
229
  };
159
230
  const initialBody = 'Write article body content here...\n';
160
- const candidates = options.candidates || loadLocalTaxonomyCandidates(options.workspaceRoot);
161
231
  const markdownContent = serializeMarkdown(frontmatter, initialBody, candidates);
162
232
  const relPath = computeArticleRelativePath(collection, 'draft', id, title || slug, new Date());
163
233
  const fullPath = path.join(options.workspaceRoot, relPath);
@@ -168,6 +238,13 @@ export function createArticleScaffold(options) {
168
238
  slug,
169
239
  filePath: relPath,
170
240
  fullPath,
241
+ warnings,
242
+ assigned: {
243
+ categories: normalizedCategories,
244
+ tags: normalizedTags,
245
+ ...(initialFeaturedImage ? { featuredImage: initialFeaturedImage } : {}),
246
+ ...(initialSeo?.description ? { description: initialSeo.description } : {}),
247
+ },
171
248
  };
172
249
  }
173
250
  //# sourceMappingURL=new.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"new.js","sourceRoot":"","sources":["../../src/sync/new.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"new.js","sourceRoot":"","sources":["../../src/sync/new.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { type Frontmatter, type ParsedMarkdown } from '../utils/frontmatter.js';
2
+ import type { MediaRecordId, StorageKey } from '../utils/media-id.js';
2
3
  import type { CacheDatabase } from '../db/cache.js';
3
4
  export interface PreflightOptions {
4
5
  allowPublish?: boolean;
@@ -9,8 +10,8 @@ export interface PreflightOptions {
9
10
  cache?: CacheDatabase;
10
11
  }
11
12
  export interface PromotedMediaMatch {
12
- mediaId: string;
13
- storageKey: string;
13
+ mediaId: MediaRecordId;
14
+ storageKey: StorageKey;
14
15
  url: string;
15
16
  promotedRelPath: string;
16
17
  }
@@ -45,6 +46,13 @@ export interface PreflightError {
45
46
  message: string;
46
47
  suggestion?: string;
47
48
  }
49
+ export interface ResolvedDraftPathInfo {
50
+ isInsideDraftsDir: boolean;
51
+ isInsideMediaDir: boolean;
52
+ candidateAbs: string;
53
+ filename: string;
54
+ }
55
+ export declare function resolveDraftImagePath(articleFilePath: string, rawImagePath: string, workspaceRoot?: string): ResolvedDraftPathInfo;
48
56
  /**
49
57
  * Runs Preflight Guards G2 through G11 against the article to prevent AI misbehavior.
50
58
  * (G1 is enforced at the MCP / CLI invocation layer).
@@ -1 +1 @@
1
- {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../src/sync/preflight.ts"],"names":[],"mappings":"AAqCA,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,cAAc,EACpB,MAAM,yBAAyB,CAAC;AAQjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;IACvC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,eAAe,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,eAAe,CAAC,EAAE,kBAAkB,CAAC;CACtC;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,uFAAuF;IACvF,WAAW,EAAE,mBAAmB,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAgQD;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,EACtB,OAAO,CAAC,EAAE,gBAAgB,GACzB,eAAe,CAyUjB"}
1
+ {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../src/sync/preflight.ts"],"names":[],"mappings":"AAqCA,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,cAAc,EACpB,MAAM,yBAAyB,CAAC;AAIjC,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAOtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;IACvC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,EAAE,UAAU,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,eAAe,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,eAAe,CAAC,EAAE,kBAAkB,CAAC;CACtC;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,uFAAuF;IACvF,WAAW,EAAE,mBAAmB,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AASD,MAAM,WAAW,qBAAqB;IACpC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,qBAAqB,CACnC,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,MAAM,EACpB,aAAa,CAAC,EAAE,MAAM,GACrB,qBAAqB,CAuCvB;AA0MD;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,EACtB,OAAO,CAAC,EAAE,gBAAgB,GACzB,eAAe,CAmbjB"}
@@ -28,17 +28,16 @@ import { MAX_MEDIA_UPLOAD_BYTES, resolveImageMimeType, toRootRelativeMediaUrl, }
28
28
  import { stripCodeBlocks, verifyOpaqueBlocksUntampered, detectUnsupportedMarkdownSyntax, } from '../client/portable-text.js';
29
29
  import { sanitizeTitleForFilename, } from '../utils/frontmatter.js';
30
30
  import { MEDIA_FILE_ROUTE_PREFIX, storageKeyFromMirrorRef } from '../utils/media-body-refs.js';
31
- import { storageKeyFromMediaMeta } from './media.js';
31
+ import { storageKeyFromMediaMeta } from '../utils/media-companion.js';
32
+ import { toMediaRecordId, toStorageKey } from '../utils/media-id.js';
33
+ import { CANONICAL_ULID_REGEX, CANONICAL_ULID_EXACT_REGEX } from '../utils/ulid.js';
32
34
  import { findClosestTaxonomySuggestions, getLocalTaxonomiesSummary, } from './taxonomies.js';
33
35
  const CONFLICT_MARKER_REGEX = /^<{7}\s|^={7}$|^>{7}\s/m;
34
36
  const OPAQUE_FENCE_LINE_REGEX = /^<!--ec:block .+ -->$/;
35
37
  const STANDALONE_IMAGE_LINE_REGEX = /^!\[([^\]]*)\]\(([^)]+)\)$/;
36
38
  const REMOTE_OR_DATA_URL_REGEX = /^(?:https?:\/\/|data:|\/_emdash\/api\/media\/file\/)/i;
37
39
  const ANY_LOCAL_IMAGE_REGEX = /!\[([^\]]*)\]\((?!https?:\/\/|data:|\/_emdash\/api\/media\/file\/)([^)]+)\)/g;
38
- // Canonical ULID shape (Crockford base32: 26 chars, excludes I and O). Casing is
39
- // case-insensitive here because parseMarkdown() normalizes local frontmatter to uppercase.
40
- const CANONICAL_ULID_REGEX = /^[0-9A-HJ-NP-Z]{26}$/i;
41
- function resolveDraftImagePath(articleFilePath, rawImagePath, workspaceRoot) {
40
+ export function resolveDraftImagePath(articleFilePath, rawImagePath, workspaceRoot) {
42
41
  const root = workspaceRoot ? path.resolve(workspaceRoot) : '/__emit_virtual_workspace__';
43
42
  const articleAbs = path.isAbsolute(articleFilePath)
44
43
  ? articleFilePath
@@ -159,10 +158,14 @@ function findAlreadyPromotedMedia(filename, workspaceRoot, cache) {
159
158
  : '';
160
159
  if (!canonicalUrl)
161
160
  continue;
161
+ const mediaId = toMediaRecordId(meta.id);
162
+ const targetKey = toStorageKey(storageKey || path.basename(canonicalUrl));
163
+ if (!mediaId || !targetKey)
164
+ continue;
162
165
  const binaryName = `${file.replace(/\.yaml$/, '')}${ext || path.extname(metaFilename) || '.jpg'}`;
163
166
  return {
164
- mediaId: meta.id,
165
- storageKey: storageKey || path.basename(canonicalUrl),
167
+ mediaId,
168
+ storageKey: targetKey,
166
169
  url: canonicalUrl,
167
170
  promotedRelPath: path.posix.join('media', binaryName),
168
171
  };
@@ -221,7 +224,7 @@ function findPromotedMediaByStorageKey(storageKey, options) {
221
224
  if (state && state.mediaId && state.url) {
222
225
  return {
223
226
  mediaId: state.mediaId,
224
- storageKey: state.storageKey || storageKey,
227
+ storageKey: state.storageKey,
225
228
  url: state.url,
226
229
  promotedRelPath: state.markdownRef || state.workspacePath || `media/${storageKey}`,
227
230
  };
@@ -236,10 +239,16 @@ function findPromotedMediaByStorageKey(storageKey, options) {
236
239
  const meta = yaml.load(fs.readFileSync(companionPath, 'utf8'));
237
240
  if (!meta || typeof meta.id !== 'string')
238
241
  return null;
242
+ const mediaId = toMediaRecordId(meta.id);
243
+ if (!mediaId)
244
+ return null;
239
245
  const companionKey = storageKeyFromMediaMeta(meta) || storageKey;
246
+ const validKey = toStorageKey(companionKey);
247
+ if (!validKey)
248
+ return null;
240
249
  return {
241
- mediaId: meta.id.toUpperCase(),
242
- storageKey: companionKey,
250
+ mediaId,
251
+ storageKey: validKey,
243
252
  url: `${MEDIA_FILE_ROUTE_PREFIX}${companionKey}`,
244
253
  promotedRelPath: `media/${stem}`,
245
254
  };
@@ -297,7 +306,7 @@ export function runPreflightChecks(filePath, parsed, options) {
297
306
  if (!allowed.includes(term)) {
298
307
  // Term IDs are canonical 26-char ULIDs: uppercase Crockford base32 (excludes I, L, O, U).
299
308
  // Restricting to that alphabet prevents 26-character slugs from being mislabeled as IDs.
300
- const isTermId = /^[0-9A-HJ-NP-Z]{26}$/.test(term);
309
+ const isTermId = CANONICAL_ULID_EXACT_REGEX.test(term);
301
310
  const staleNote = isTermId
302
311
  ? ' (term ID was not found in local definitions and may be stale or deleted)'
303
312
  : '';
@@ -471,7 +480,7 @@ export function runPreflightChecks(filePath, parsed, options) {
471
480
  }
472
481
  }
473
482
  }
474
- // G10: featuredImage must reference a canonical 26-character media ULID (or null).
483
+ // G10: featuredImage must reference a canonical 26-character media ULID, a local draft image, or null.
475
484
  // A root-relative or absolute media URL that unambiguously contains a media ULID is
476
485
  // accepted with a warning, because Emit resolves it to the canonical ULID on push.
477
486
  if (frontmatter.featuredImage !== undefined && frontmatter.featuredImage !== null) {
@@ -482,11 +491,104 @@ export function runPreflightChecks(filePath, parsed, options) {
482
491
  warnings.push(`featuredImage '${rawFeaturedImage}' was resolved to the canonical media ULID '${resolved}'. Prefer writing the bare 26-character ULID in frontmatter.`);
483
492
  }
484
493
  else {
485
- errors.push({
486
- code: 'INVALID_FEATURED_IMAGE',
487
- message: `Invalid featuredImage in frontmatter: '${frontmatter.featuredImage}'. It must be a valid 26-character Crockford media ULID or null.`,
488
- suggestion: 'Upload the image first using EmDash Admin or MCP "media_upload", then specify the returned 26-character ULID (e.g. 01M67P0MBMJQQXH2K95HHCYRYB). To remove the featured image, set featuredImage: null. Local file paths are never allowed.',
489
- });
494
+ const resolvedPath = resolveDraftImagePath(filePath, rawFeaturedImage, options?.workspaceRoot);
495
+ if (resolvedPath.isInsideDraftsDir || resolvedPath.isInsideMediaDir) {
496
+ if (options?.workspaceRoot) {
497
+ // Check if this image was already scanned from body (R2 dedup)
498
+ const existingDraft = draftImages.find((d) => d.resolvedAbsPath === resolvedPath.candidateAbs);
499
+ if (!existingDraft) {
500
+ if (resolvedPath.isInsideDraftsDir) {
501
+ if (!fs.existsSync(resolvedPath.candidateAbs)) {
502
+ const promotedMatch = findAlreadyPromotedMedia(resolvedPath.filename, options.workspaceRoot, options.cache);
503
+ if (promotedMatch) {
504
+ draftImages.push({
505
+ line: `featuredImage: ${rawFeaturedImage}`,
506
+ alt: 'featured image',
507
+ rawPath: rawFeaturedImage,
508
+ filename: resolvedPath.filename,
509
+ resolvedAbsPath: resolvedPath.candidateAbs,
510
+ alreadyPromoted: promotedMatch,
511
+ });
512
+ }
513
+ else {
514
+ errors.push({
515
+ code: 'MISSING_LOCAL_IMAGE_FILE',
516
+ message: `Draft image file specified in featuredImage not found on disk: '${rawFeaturedImage}' (resolved to '${resolvedPath.candidateAbs}', and no promoted asset matching '${resolvedPath.filename}' was found in media/).`,
517
+ suggestion: `Place "${resolvedPath.filename}" inside "media/drafts/", or if it was already promoted, look for a mirror in "media/".`,
518
+ });
519
+ }
520
+ }
521
+ else {
522
+ const stat = fs.statSync(resolvedPath.candidateAbs);
523
+ if (!stat.isFile()) {
524
+ errors.push({
525
+ code: 'MISSING_LOCAL_IMAGE_FILE',
526
+ message: `Draft image path specified in featuredImage is not a regular file: '${rawFeaturedImage}'.`,
527
+ suggestion: `Ensure "${resolvedPath.filename}" is a valid image file inside "media/drafts/".`,
528
+ });
529
+ }
530
+ else if (!resolveImageMimeType(resolvedPath.filename)) {
531
+ errors.push({
532
+ code: 'INVALID_LOCAL_IMAGE_TYPE',
533
+ message: `Unsupported image file extension for featuredImage: '${resolvedPath.filename}'.`,
534
+ suggestion: 'Use a supported image format (.jpg, .jpeg, .png, .webp, .gif, .avif, .svg).',
535
+ });
536
+ }
537
+ else if (stat.size > MAX_MEDIA_UPLOAD_BYTES) {
538
+ errors.push({
539
+ code: 'LOCAL_IMAGE_SIZE_EXCEEDED',
540
+ message: `Draft image specified in featuredImage exceeds the 50 MiB limit: '${resolvedPath.filename}' (${stat.size} bytes).`,
541
+ suggestion: 'Compress or resize the image before pushing.',
542
+ });
543
+ }
544
+ else {
545
+ draftImages.push({
546
+ line: `featuredImage: ${rawFeaturedImage}`,
547
+ alt: 'featured image',
548
+ rawPath: rawFeaturedImage,
549
+ filename: resolvedPath.filename,
550
+ resolvedAbsPath: resolvedPath.candidateAbs,
551
+ });
552
+ }
553
+ }
554
+ }
555
+ else if (resolvedPath.isInsideMediaDir) {
556
+ // Already-promoted mirror lookup (R3: two-stage lookup)
557
+ let promotedMatch = findAlreadyPromotedMedia(resolvedPath.filename, options.workspaceRoot, options.cache);
558
+ if (!promotedMatch) {
559
+ const directKey = storageKeyFromMirrorRef(rawFeaturedImage, confirmedStorageKeys(options));
560
+ if (directKey) {
561
+ promotedMatch = findPromotedMediaByStorageKey(directKey, options);
562
+ }
563
+ }
564
+ if (promotedMatch) {
565
+ draftImages.push({
566
+ line: `featuredImage: ${rawFeaturedImage}`,
567
+ alt: 'featured image',
568
+ rawPath: rawFeaturedImage,
569
+ filename: resolvedPath.filename,
570
+ resolvedAbsPath: resolvedPath.candidateAbs,
571
+ alreadyPromoted: promotedMatch,
572
+ });
573
+ }
574
+ else {
575
+ errors.push({
576
+ code: 'MISSING_LOCAL_IMAGE_FILE',
577
+ message: `Mirrored media asset specified in featuredImage not found: '${rawFeaturedImage}' (no promoted asset matching '${resolvedPath.filename}' was found in media/ or recorded metadata).`,
578
+ suggestion: 'Ensure the image is mirrored under media/ or run "emit pull-media".',
579
+ });
580
+ }
581
+ }
582
+ }
583
+ }
584
+ }
585
+ else {
586
+ errors.push({
587
+ code: 'INVALID_FEATURED_IMAGE',
588
+ message: `Invalid featuredImage in frontmatter: '${frontmatter.featuredImage}'. It must be a valid 26-character Crockford media ULID, a local draft image path inside "media/drafts/", or null.`,
589
+ suggestion: 'Place the image in "media/drafts/<filename>" (e.g. ../../media/drafts/eyecatch.jpg), or upload first using EmDash Admin or MCP "media_upload" and specify the returned 26-character ULID. To remove the featured image, set featuredImage: null. Local file paths outside "media/" are never allowed.',
590
+ });
591
+ }
490
592
  }
491
593
  }
492
594
  }