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
package/CHANGELOG.md CHANGED
@@ -9,6 +9,254 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
9
9
 
10
10
  ## [Unreleased]
11
11
 
12
+ ## [0.1.30] - 2026-11-15
13
+
14
+ ### Added
15
+
16
+ - **Single-Article Pull Orchestration Facade (`src/sync/orchestrator.ts`)**:
17
+ - Added `pullSingleArticle`, `PullSingleArticleOptions`, and `PullSingleArticleResult` to `src/sync/orchestrator.ts` as the Layer 2 designated coordinator counterpart to `pullBatch`.
18
+ - Consolidates the single-article pipeline (optional taxonomy synchronization, article pull with on-demand media mirroring, and optional full media library sync) into a single reusable entry point shared by CLI (`src/cli/commands/pull.ts`) and MCP (`src/mcp/tools/sync-pull.ts`).
19
+ - Enforces clean architectural layering: returns structured flags (`categoriesFailed`, `tagsFailed`, `error`) without UI strings, leaving presentation formatting to Layer 3. Registered in `ALLOWED_LAYER_2_SYMBOLS['orchestrator']` in `tests/layering.test.ts` with zero intra-layer sibling coupling exceptions.
20
+ - **Deterministic Taxonomy Term Deduplication (`src/sync/taxonomies.ts`)**:
21
+ - Extracted and exported `dedupeTermsBySlug` supporting `'slug-grouped'` (categories) and `'frequency'` (tags) modes. Replaced local closure in `getLocalTaxonomiesSummary` and enabled direct unit testing of winner selection and tie-breaking invariants.
22
+ - **Robust CLI Explicit Boolean Option Resolution (`src/cli/context.ts`)**:
23
+ - Introduced `resolveExplicitBooleanOption` in `src/cli/context.ts` using Commander's `getOptionValueSource('media') === 'cli'` paired with `getOptionValue('media')`.
24
+ - Accurately differentiates `--media` (`true`), `--no-media` (`false`), and unprovided (`undefined`) without raw `process.argv` scanning, while safely handling Commander's `--no-*` source attribution behavior and argument ordering.
25
+
26
+ ### Changed
27
+
28
+ - **Media Library Walk Pagination Unification (`src/sync/media/`)**:
29
+ - Exported `fetchMediaListPage` from `src/sync/media/remote_index.ts` and replaced the inline HTTP pagination walk in `src/sync/media/pull_library.ts:pullMedia()`, unifying media list endpoint queries, `MEDIA_LIST_FAILED` error wrapping, and cursor progression across `collectRemoteStorageKeys`, `searchRemoteMedia`, and `pullMedia`.
30
+ - Removed unused imports (`unwrapEnvelope`, `ApiError`, `mediaListEndpoint`) in `src/sync/media/pull_library.ts`, ensuring strict compliance with `noUnusedLocals: true`.
31
+
32
+
33
+ ### Added
34
+
35
+ - **Single-Article On-Demand Media Mirroring (`src/sync/pull/media_stage.ts`, `src/sync/pull/index.ts`)**:
36
+ - Automatically discovers and mirrors article-referenced media assets (Markdown body images and frontmatter `featuredImage`) into `media/` during single-article pulls (`emit pull <id>`, `sync_pull`).
37
+ - Immediately resolves **Markdown body image references** to local relative paths (`../../media/<storageKey>.<ext>`) in 1 step without requiring manual `emit pull-media --article <id>` or a subsequent `--force` pull. Scope limit: the disk rewriting applies only to body `![...](/_emdash/api/media/file/<storageKey>)` references. A frontmatter `featuredImage` is mirrored into `media/` as a companion-backed asset, but its frontmatter value always stays the canonical 26-character D1 record ULID — Emit never rewrites it to a local path (see `docs/media-id-spaces.md`).
38
+ - Implements `MediaMirrorSession` with 0-HTTP short-circuit when all referenced assets exist locally (verifying file size and upserting `localContentHash` via `computeFileSha256` and `mediaRecordIdForStem` without guessing stem prefixes).
39
+ - Unifies `featuredImage` resolution: uses D1 `MediaRecordId` single-GET lookup via `/api/media/{id}` in single-article pull **only when the article carries no body images** (Case B — one body image is enough to route the article through the shared library walk, Case A), and the shared `recordsById` map from `RemoteStorageKeyIndex` in batch pull or articles with body images (0 extra GETs). When the walk already completed (`complete === true`) and the id is absent from it, the redundant individual GET is skipped instead of paying for a request that must 404.
40
+ - In-flight deduplication across parallel article pulls prevents duplicate downloads and accurately aggregates session counts. Batch media statistics are session-wide: `downloaded`/`skipped` count each shared storageKey once, not once per referencing article.
41
+ - **CLI `emit pull [target]` Target Resolution & Symmetry (`src/cli/commands/pull.ts`, `src/sync/diff.ts`)**:
42
+ - Allows `emit pull [target]` where `target` can be an article ULID or a workspace relative/absolute file path (e.g. `emit pull posts/draft/20261115_<ulid>-title.md`).
43
+ - Added frontmatter `id` disk fallback to `resolveArticleTarget` in `src/sync/diff.ts`.
44
+ - Added clean error reporting for invalid/unresolvable target paths (`ARTICLE_TARGET_UNRESOLVED`) registered in `OPERATIONAL_ERROR_CODES`.
45
+ - Added single-article media sync summary, orphan image warnings, and taxonomy sync warnings.
46
+ - Supported `--media` on single-article pull to trigger library pull, and explicit `--no-media` to skip media mirroring.
47
+ - **MCP `sync_pull` Target Symmetry & `noMedia` Support (`src/mcp/tools/sync-pull.ts`)**:
48
+ - Added `noMedia: true` option to `sync_pull` schema to mirror CLI `--no-media`.
49
+ - Added single-article media sync summary reporting and taxonomy failure notes.
50
+ - **Fast-Path Relative Media Reference Self-Healing (`src/sync/pull/fast_path.ts`)**:
51
+ - Extended `tryFastPathOrHeal` to detect and heal unmirrored referenced assets even when the article revision is unchanged.
52
+ - Guaranteed `updateConfigSyncedVersion` execution on all fast-path exits.
53
+ - **On-Demand Byline Catalog Refresh on Unknown Author ID (`src/sync/pull/index.ts`, `src/sync/bylines.ts`)**:
54
+ - Single-article pull inspects `rawItem` for unknown byline IDs not yet recorded in SQLite cache. If detected, triggers `syncRemoteBylines` to refresh local authors before generating frontmatter.
55
+
56
+ ### Changed
57
+
58
+ - **1-Pass Batch Media Processing (`src/sync/orchestrator.ts`)**:
59
+ - Replaced the 2-pass disk rewrite loop in `pullBatch` with shared `MediaMirrorSession`, eliminating redundant file reads/writes and saving media state directly during the primary article pull.
60
+ - Injected `loadLocalTaxonomyCandidates` once at batch start, avoiding redundant filesystem traversals across parallel article pulls.
61
+ - **Unified `pullArticleMedia` / `pullMedia` on `mirrorReferencedAssetsFromIndex` (`src/sync/media/`)**:
62
+ - Replaced bespoke loops in `pull_article.ts` and `pull_library.ts` with shared `mirrorReferencedAssetsFromIndex`.
63
+ - **Safe `filename` Fallbacks (`src/sync/media/naming_mirror.ts`)**:
64
+ - Added safe fallback to `item.storageKey` or `image.jpg` when remote `item.filename` is missing or undefined. The mirror extension now comes from `filename` first and falls back to the storageKey's own extension, so a filename-less record never derives an extension from an inner `.ulid` segment of a multi-ULID key.
65
+
66
+ ### Fixed
67
+
68
+ - **Byline Staleness Check Accepted Slugs As Well As Ids (`src/sync/pull/index.ts`)**:
69
+ - `getBylineIdToSlug()` fed the byline references found in `rawItem` into `cachedMaps.idToSlug` only. Because a remote item can carry a byline **slug** (or both), a slug always missed the id-keyed map and every pull re-ran `syncRemoteBylines` even when the author was already cached. The check now treats a reference as known when it appears in either `idToSlug` or `slugToId`, so a cached workspace performs zero byline requests per article. Regression test: `tests/sync.test.ts` ("does not trigger on-demand bylines sync when rawItem contains already-cached byline slug or ID").
70
+ - **Bounded Library Walks For Referenced-Media Resolution (`src/sync/pull/media_stage.ts`, `src/sync/media/pull_article.ts`, `src/sync/media/pull_library.ts`)**:
71
+ - The shared `MediaMirrorSession` walk, the article-targeted media pull, and the targeted `--storage-key` pull each walked the **entire** remote media library. On a fleet-scale instance that made one article's pull pay for thousands of list requests. All three are now bounded by `mediaSyncLimit` (default 300; unlimited only for an explicit full-library pass), matching how `emit pull-media --all` and `--check-media-library` already behave. A key outside the window is reported as unresolved, never asserted absent, and `complete === false` keeps per-record lookups available.
72
+ - **Targeted `pull-media --storage-key` Never Reports Silence As Success (`src/cli/commands/pull.ts`, `src/mcp/tools/sync-pull.ts`)**:
73
+ - When nothing was downloaded but the key was confirmed by local mirror metadata, the command printed a success line for a pull that mirrored nothing (or exited silently). It now reports `ℹ️ Targeted storageKey(s) not downloaded` naming the reason — "confirmed by local mirror metadata already in media/" versus "not found within the bounded library walk" — and keeps the existing exit-1 path only for genuine orphans. MCP mirrors the same wording instead of claiming `✅ Successfully pulled`.
74
+
75
+ ## [0.1.28] - 2026-11-15
76
+
77
+ ### Fixed
78
+
79
+ - **Order-Independent Unmodified Detection Across All Layer 2 Paths (`src/sync/orchestrator.ts`, `src/sync/conflicts.ts`, `src/sync/pull/{quarantine,fast_path}.ts`)**:
80
+ - Replaced all 5 remaining raw `calculateHash(content) !== syncState.localHash` comparisons in Layer 2 with `isLocalFileUnmodified()` so articles whose disk bytes differ from `sync_state.local_hash` only by media reference spelling (`../../media/<storageKey>` vs `/_emdash/api/media/file/<storageKey>`) or taxonomy comment decoration are never misclassified as having unpushed local edits:
81
+ 1. `pullBatch` prune guard (`src/sync/orchestrator.ts`) — prevents false `SyncPruneConflictError` on window-out articles.
82
+ 2. `resolveConflict(..., 'accept-local')` & `pruneConflicts` (`src/sync/conflicts.ts`) — prevents false `CanonicalHasUnpushedEditsError`.
83
+ 3. `quarantineDivergentLocalCopies` (`src/sync/pull/quarantine.ts`) — prevents false quarantine of unmodified duplicate ULID files.
84
+ 4. `handleRemoteDeletedArticle` (`src/sync/pull/quarantine.ts`) — prevents false `deletePending: true` on 404/410 remote deletion.
85
+ 5. `tryFastPathOrHeal` (`src/sync/pull/fast_path.ts`) — prevents false `localEditsPreserved: true` when remote revision advances and heals `sync_state.local_hash` once via `retrackLocalHashOnly` on skip, while preserving the raw hash check at the `carriesDepthFreeMediaRef` legacy self-heal branch (`AGENTS.md` §7).
86
+ - **`computeContextDiff` `contextLines` Support (`src/sync/diff.ts`)**:
87
+ - Wired `options?.contextLines` (defaulting to `0` to preserve zero-context token efficiency and existing diff output) into `computeContextDiff()`, emitting surrounding context lines (` ${line}`) and adjusted hunk headers (`@@ -start1,len1 +start2,len2 @@`) when `contextLines > 0` is explicitly requested.
88
+
89
+ ### Changed
90
+
91
+ - **Complete 4-Tier Layering Gate & `mcp-heartbeat` Relocation (`src/utils/mcp-heartbeat.ts`, `tests/layering.test.ts`)**:
92
+ - Moved MCP heartbeat process inspection (`checkMcpProcess`, `touchMcpHeartbeat`, `removeMcpHeartbeat`) to Layer 0 (`src/utils/mcp-heartbeat.ts`, reusing `getPackageVersion` from `src/utils/version.ts`), keeping `src/mcp/heartbeat.ts` as a backward-compatible barrel re-export and eliminating the Layer 2 → Layer 3 import in `src/sync/doctor.ts`.
93
+ - Normalized `src/sync/orchestrator.ts` and 14 test files to import `calculateHash` / workspace contracts from `src/sync/workspace/index.ts`, and `src/sync/doctor.ts` to import `storageKeyFromMediaMeta` from `src/utils/media-companion.ts`.
94
+ - Extended `tests/layering.test.ts` with **Axis 0** (Layer 0 never imports Layer 1/2/3) and **Axis 4** (Layers 0/1/2 never import Layer 3 `cli/`, `mcp/`, `presentation/`).
95
+ - **Modular Pull Architecture & Cache Migration Separation (`src/sync/pull/`, `src/db/migrations.ts`)**:
96
+ - Split `src/sync/pull.ts` (1,163 lines) into 5 focused modules under `src/sync/pull/` (`types.ts`, `list.ts`, `quarantine.ts`, `fast_path.ts`, `index.ts`) using `FastPathContext` to eliminate closure capture, while keeping `src/sync/pull.ts` as a barrel re-export.
97
+ - Extracted SQLite schema initialization and versioned migrations (`runCacheMigrations`, `CURRENT_CACHE_SCHEMA_VERSION`) from `src/db/cache.ts` into `src/db/migrations.ts`.
98
+ - **CLI `pull` / `push` Failure Presentation & Deduplication (`src/cli/report-failure.ts`, `src/cli/context.ts`, `src/cli/commands/{pull,push}.ts`)**:
99
+ - Extended `reportActionFailure` to format `PushValidationError`, `SyncPruneConflictError`, and `FrontmatterParseError`, and unified all catch blocks in `pull.ts` and `push.ts`.
100
+ - Extracted `resolveAndPersistLocalMediaRefs()` in `src/cli/context.ts`, `printTaxonomySyncSummary()` in `src/cli/commands/pull.ts`, and `printPushArticleDetails()` in `src/cli/commands/push.ts`.
101
+ - **Zero Unused Locals Gate (`tsconfig.json`)**:
102
+ - Removed all unused imports, variables, and internal function parameters across `src/` and `tests/`, and enabled `"noUnusedLocals": true` in `tsconfig.json`.
103
+
104
+ ## [0.1.27] - 2026-11-15
105
+
106
+ ### Fixed
107
+
108
+ - **Order-Independent Baseline Reconstruction & Diagnostic Alignment (`src/sync/baseline-reconstruction.ts`, `src/sync/diff.ts`, `src/sync/doctor.ts`, `src/sync/delete.ts`)**:
109
+ - Fixed a self-contradiction bug in `inspectArticleDiff` (`src/sync/diff.ts`) where calling `emit diff` / `sync_diff` _before_ `emit status` on an untouched article with localized media references returned `status: 'modified'` (`Status: 🟡 Modified`) despite `diff.hasChanges === false` (`No changes detected.`).
110
+ - Unified `isLocalFileUnmodified()` across `status.ts`, `diff.ts`, `doctor.ts`, and `delete.ts` so spelling-only differences between `sync_state.local_hash` and disk bytes are recognized and healed regardless of which command runs first.
111
+ - **Unified CLI Failure Presentation Without Double Prefixing (`src/cli/report-failure.ts`)**:
112
+ - Consolidated 5 duplicate `reportActionFailure` implementations (`delete`, `new`, `conflicts`, `doctor`, `media`) into `src/cli/report-failure.ts`.
113
+ - Fixed missing `❌ Error:` prefix on generic errors in `emit delete` and `emit new` while preventing double `❌ Error: ❌ ...` prefixes on pre-formatted errors (`DuplicateSlugError`, `UnpushedModificationsError`, `PublishedArticleDeletionForbiddenError`).
114
+
115
+ ### Changed
116
+
117
+ - **Sync-State-Only Hash Retracking (`retrackLocalHashOnly` in `src/db/baseline.ts`)**:
118
+ - Centralized hash-only re-tracking (updating `sync_state.local_hash` when disk spelling changes without touching `base_snapshots`) into Layer 0 (`src/db/baseline.ts`), replacing 3 independent `saveSyncState` call sites in `status.ts`, `orchestrator.ts`, and `pull.ts`.
119
+ - **Taxonomy Consolidation (`src/sync/taxonomies.ts`, `src/utils/taxonomy-key.ts`)**:
120
+ - Consolidated category and tag save/prune loops in `pullTaxonomies()` into `writeAndPruneTaxonomyDir()`.
121
+ - Unified deterministic collision winner ordering (`count desc → ULID desc`) into `compareTaxonomyTermDeterministically()`, guaranteeing 100% winner parity between Layer A (`loadLocalTaxonomyMaps`) and Layer B (`getLocalTaxonomiesSummary`).
122
+ - Extracted taxonomy key normalization helpers (`normalizeTaxonomyKey`, `isPercentEncodedTerm`, `canonicalSlugOf`, `aliasesOf`) into Layer 0 (`src/utils/taxonomy-key.ts`).
123
+ - **MCP Tool Context & Preflight Local Image Probe (`src/mcp/tool-errors.ts`, `src/sync/preflight/image_probe.ts`)**:
124
+ - Added `withResolvedContext()` and `formatToolTextWithMeta()` in `src/mcp/tool-errors.ts` to standardize context error handling and `_meta` suffix formatting across MCP tools.
125
+ - Extracted local draft image probing (`probeLocalImageFile`) into `src/sync/preflight/image_probe.ts` while preserving guard-specific remediation messages for G5, G10, and G11.
126
+
127
+ ## [0.1.26] - 2026-11-15
128
+
129
+ ### Added
130
+
131
+ - **Two-Layer Representation for Taxonomy YAML Definitions (`src/sync/taxonomies.ts`)**:
132
+ - Extended Two-Layer Representation from article frontmatter (`taxonomies:`) to category and tag YAML definition files (`categories/*.yaml`, `tags/*.yaml`).
133
+ - Disk format (Layer B) presents human-readable decoded slugs (`slug: ローカルガイド`) while preserving the raw server slug in `canonicalSlug: "%e3%83%ad..."` (omitted for standard ASCII terms where `canonicalSlug === slug`).
134
+ - Added safe YAML scalar serialization (`serializeTaxonomyYaml`) using `formatYamlScalar`:
135
+ - Guarantees single-line output, completely eliminating multi-line folded blocks (`slug: >-`) previously triggered by long percent-encoded strings in js-yaml.
136
+ - Reliably quotes YAML reserved words (`on`, `true`), numeric strings (`2026-review`), and symbols (`買い物(レビュー)`), preventing unintended type coercion during round-trip parsing.
137
+ - Added backward-compatible loading in `readTaxonomyDir()`: seamlessly loads legacy v0.1.25 files (`slug: '%e3...'` without `canonicalSlug`) and transparently decodes them in memory until refreshed on next pull.
138
+ - Implemented 2-Phase Collision Resolution in `loadLocalTaxonomyMaps()`:
139
+ - **Phase 1 (Canonical Registration)**: Registers all canonical slugs first (`idToSlug[item.id]` strictly returns canonical slug for Layer A transport, baseline snapshots, and hash calculations; ties broken deterministically by count desc, then ULID desc).
140
+ - **Phase 2 (Alias Registration)**: Registers decoded slugs and display names only when they do not collide with any canonical slug and uniquely map to a single term ID. Preserves loser terms' unique name aliases while avoiding alias poisoning.
141
+ - Dropped collision losers from Layer B presentations (`getLocalTaxonomiesSummary()`, `formatTaxonomiesHint()`) via `dedupeBySlug`, presenting clean winner candidates in AI prompts and CLI outputs.
142
+
143
+ ## [0.1.25] - 2026-11-14
144
+
145
+ ### Added
146
+
147
+ - **Frontmatter Draft Revision Visualization (`status: published # draft revision`)**:
148
+ - Implemented explicit, human-readable draft revision annotation on the `status:` frontmatter line when a published article tracks an uncommitted remote draft revision.
149
+ - File inspectors, text editors (VS Code, Obsidian, Cursor), and AI agents can immediately recognize that the file reflects an uncommitted draft revision without needing to query CLI `emit status`.
150
+ - Maintained 100% YAML 1.1/1.2 parser transparency: inline comments are ignored by `gray-matter` and `FrontmatterSchema` (Zod), preserving `status: 'published'` without altering AST or schema contracts.
151
+ - Automatically maintained across lifecycles: added on pull when `draftRevisionId` is present, maintained when staging drafts via push, and automatically removed when published live (when the remote publish response reports no remaining draft revision) or discarded.
152
+ - **Single Source of Truth Helper (`src/utils/draft-revision.ts`)**:
153
+ - Centralized `hasUncommittedDraftRevision(syncState)` in Layer 0. All disk representation, baseline reconstruction, diagnostics, and warnings derive strictly from `sync_state.remote_rev.includes('@draft:')` when status is published, eliminating guesswork from CLI arguments or partial local state.
154
+ - **Unified 3-Axis Disk Spelling Engine (`src/utils/disk-spelling.ts`)**:
155
+ - Centralized `resolveDiskSpelling()` and `renderForDisk()` in Layer 0, unifying all 3 disk representation dimensions (taxonomy percent-encoding, article-relative media references, and draft revision annotation) into a single resolver shared by pull, commit, diff, and status.
156
+
157
+ ### Changed
158
+
159
+ - **Phase 0 Refactoring: Centralized Article Snapshot Commit (`src/sync/workspace/commit.ts`)**:
160
+ - Eliminated dangerous code duplication across 6 distinct snapshot and disk writing locations (`pull.ts` fast-path heals ×3, full pull, `push/commit.ts`, and `push/merge_stage.ts`).
161
+ - Centralized all snapshot writes into `commitArticleSnapshot()`, structurally guaranteeing the 4 synchronization invariants:
162
+ 1. `localHash === calculateHash(diskContent)` (strict disk byte tracking)
163
+ 2. `baseline.hash === calculateHash(canonicalContent)` (canonical baseline tracking)
164
+ 3. `frontmatter` in base snapshots stores remote-derived Layer A values only (no synthetic noise)
165
+ 4. `revForTransport` (Track 1) and `revForComparison` (Track 2) remain strictly separated.
166
+ - Eliminated phantom diffs and baseline desynchronization across all standard pull, heal, and status inspection paths.
167
+
168
+ ---
169
+
170
+ ## [0.1.24] - 2026-11-14
171
+
172
+ ### Added
173
+
174
+ - **Draft Revision Synchronization for Published Articles (`src/sync/pull.ts`)**:
175
+ - Supported EmDash's architecture where published articles (`status: 'published'`) can hold uncommitted/staged draft revisions (`draftRevisionId`).
176
+ - Generalized single GET fallthrough condition from `itemStatus !== 'published'` to `needsFullDraftFetch = isDraft || hasDraftRevision`:
177
+ - **Published articles with draft revisions (`draftRevisionId` present)**: Discards the stale list `rawItem` (which only contains published `liveData`) and executes a single GET (`GET /posts/{id}`) to fetch the full 10-block draft body into `posts/published/<file>.md`.
178
+ - **Clean published articles (`draftRevisionId === null`)**: Completely maintains the zero-overhead fast-path with **zero extra HTTP requests (0-GET)**.
179
+ - **Unpublished Draft Status Visualization (`src/sync/status.ts`, `src/cli/commands/status.ts`, MCP `sync_status`)**:
180
+ - Added `hasUnpublishedDraft?: boolean` to `ArticleStatusItem`.
181
+ - Automatically flags published articles whose remote revision tracks an uncommitted draft (`@draft:` in `sync_state.remote_rev`).
182
+ - CLI `emit status` clearly highlights them with a purple icon and badge: `🟣 [synced ] published* posts/published/... [has unpublished draft]`.
183
+ - MCP `sync_status` transparently exposes `hasUnpublishedDraft: true` in JSON payloads.
184
+ - **Push Semantics Documentation & Safety Rails for Published Drafts**:
185
+ - Documented push semantics: EmDash stages PUT updates as drafts when `status` is omitted (Emit's default). To publish changes live to web, `--allow-publish` must be explicitly passed.
186
+ - Added contextual safety warnings during push (`src/sync/push/commit.ts`): when pushing published articles that carry remote draft revisions (`hadRemoteDraft`), Emit warns if changes were staged as drafts (without `--allow-publish`) or published live to web (with `--allow-publish`). Clean published articles remain warning-free.
187
+ - Verified and tested that unpushed local edits during draft advancement are safely preserved in `posts/conflicts/*.conflict.md` with `body_conflict_pending = 1` and Guard G12 rescue copy protection.
188
+
189
+ ## [0.1.23] - 2026-11-14
190
+
191
+ ### Added
192
+
193
+ - **Selective Single-Article GET Fallthrough for Updated Drafts (`src/sync/pull.ts`)**:
194
+ - Resolved architectural discrepancy where EmDash's list API (`GET /posts?status=draft`) returns stale creation-time `posts.data` while the latest content resides in the `revisions` table, which previously caused `emit pull` to overwrite local draft files with outdated content and mark them up-to-date.
195
+ - Implemented selective fallthrough in `pullArticle`:
196
+ - **Draft articles with advanced remote revisions**: Automatically discards the incomplete list `rawItem` and fetches the full canonical article via single GET (`articleContentEndpoint`), accurately reflecting added blocks, images, and edits.
197
+ - **Published articles**: Fully preserves the zero-overhead fast-path—uses the list `rawItem` directly without extra single GET requests, maintaining byte-identical consistency and zero additional network calls.
198
+ - **Fail-safe fallback**: Any article with missing or undefined status defaults safely to `'draft'`, ensuring single GET retrieval rather than writing incomplete content.
199
+ - Hardened unpushed edit protection: Divergent local copies continue to be safely quarantined under `posts/conflicts/*.conflict.md` with `body_conflict_pending = 1` and Guard G12 push protection across both draft and published states.
200
+
201
+ ## [0.1.22] - 2026-11-14
202
+
203
+ ### Added
204
+
205
+ - **Two-Track Revision Architecture & Draft Revision Advancement Detection**:
206
+ - Solved EmDash server architecture nuance where draft saves update `draftRevisionId` (ULID) while keeping `posts.version` and `posts.updatedAt` unchanged, which previously caused `emit pull` fast-path to falsely report `already up-to-date`.
207
+ - Implemented **Two-Track Revision Invariant**:
208
+ - **Track 1 (`revForTransport`)**: Preserves verbatim server revision tokens (Base64 string like `3:2026-11-14T...`) in `base_snapshots.rev` and `entries.rev`. Prioritized in `push/index.ts:136` for REST PUT `{ _rev }` requests, strictly preventing synthetic key contamination and HTTP 409 conflict loops.
209
+ - **Track 2 (`revForComparison`)**: Stores composite revision identifiers (`${version}@draft:${draftRevisionId}` or `${version}@live:${liveRevisionId}`) in `sync_state.remote_rev` across all 4 save paths (`pull.ts` full pull, `pull.ts` fast-path heal branches, `push/commit.ts`, and `push/merge_stage.ts`).
210
+ - Added `extractComparisonRev` (`src/client/api.ts`): Field-first composite key generator prioritizing explicit revision ULIDs (`draftRevisionId` -> `liveRevisionId`) with clean version fallback.
211
+ - Added `isSameRev` (`src/client/api.ts`): Strict multi-stage revision comparator supporting exact matches, composite key comparisons, legacy-to-composite cache migration, and Base64 round-trip verification.
212
+ - Added `formatRevForDisplay` (`src/client/api.ts`): Clean presentation formatter for CLI/MCP outputs, displaying only the clean version number (e.g. `rev: 3`) while hiding internal `@draft:...` tracking details in `status.ts` and `diff.ts`.
213
+ - Added `CacheDatabase.runTransaction<T>` (`src/db/cache.ts`): Safe transaction helper wrapping `BEGIN IMMEDIATE` / `COMMIT` / `ROLLBACK` for multi-step SQLite operations.
214
+ - Added Unicode NFC normalization to `tryDecodeTaxonomyTerm` (`src/utils/frontmatter.ts`), guaranteeing consistent string comparisons regardless of OS file system encoding (NFD vs NFC).
215
+ - Extended `transitionContentStatus` (`src/sync/push/transport.ts`) to return `StatusTransitionResult { rev, rawJson }`, ensuring post-publish/unpublish commit updates Track 2 with remote status and revision ULIDs accurately.
216
+ - Full production workspace verification: achieved 100% idempotency (`0 updated, 60 skipped/up-to-date`) on successive `pull` runs and verified clean create, update, and delete push lifecycles.
217
+
218
+ ## [0.1.21] - 2026-11-14
219
+
220
+ ### Added
221
+
222
+ - **Frontmatter Taxonomy Japanese Decoded Display & Two-Layer Representation**:
223
+ - Implemented human-readable Japanese decoded display (` - 未分類`, ` - カメラ`) in Markdown frontmatter `taxonomies:` by default instead of percent-encoded slugs (` - "%e6%9c%aa%e5%88%86%e9%a1%9e"`).
224
+ - Established strict Two-Layer Representation Invariant:
225
+ - **Layer A (Internal Data Layer)**: Remote API payloads, `computeTaxonomyHash`, and SQLite baseline snapshots (`base_snapshots.frontmatter_yaml`) strictly preserve canonical percent-encoded slugs, preventing hash divergence, 409 conflicts, and Guard G16 triggers.
226
+ - **Layer B (Presentation & Serialization Layer)**: Disk Markdown files (`serializeMarkdown`, `formatFrontmatterYaml`) and hint formatters (`formatTaxonomiesHint`) render decoded terms using safe unquoted CJK scalars or auto-quoted YAML strings via `formatYamlScalar`.
227
+ - Added Phantom Diff Prevention: `isBaselineSpellingMatch` (`src/sync/status.ts`) and `inspectArticleDiff` (`src/sync/diff.ts`) detect percent-encoded disk content via `carriesPercentEncodedTaxonomy` and selectively serialize baseline markdown with matching encoding (`preferEncodedTaxonomy`), ensuring untouched files never report spurious `modified` status.
228
+ - Implemented Self-Healing on Pull (`src/sync/pull.ts`):
229
+ - **Branch 1 (Valid frontmatter)**: Upgrades percent-encoded taxonomy terms to decoded format in-place on disk and bumps baseline snapshot hash atomically without remote refetching.
230
+ - **Branch 2 (Broken/unquoted legacy syntax)**: Leniently repairs invalid frontmatter via `lenientRepairMarkdownFrontmatter` -> `parseMarkdown` -> `serializeMarkdown` to clean decoded YAML and synchronizes baseline snapshot atomically.
231
+ - **Branch 3 (Unpushed local modifications)**: Preserves local edits intact without touching disk.
232
+ - Achieves complete idempotency: subsequent pull runs are zero-overhead no-ops (`0 updated, N skipped/up-to-date`).
233
+ - Added NFC Unicode normalization for taxonomy alias resolution in `loadLocalTaxonomyMaps` and `createArticleScaffold`, accepting raw Japanese terms (`-C 未分類 -T カメラレビュー`) seamlessly without spurious warnings.
234
+ - Dual-indexed candidates in `loadLocalTaxonomyCandidates` and refined human-readable name comments in frontmatter YAML (`# 日本語名`), automatically omitting redundant comments when term equals display name.
235
+
236
+ ## [0.1.20] - 2026-11-14
237
+
238
+ ### Added
239
+
240
+ - **One-shot Article Scaffolding via Extended Arguments (`sync_new` & `emit new`)**:
241
+ - Extended `createArticleScaffold` (`src/sync/new.ts`), CLI `emit new` (`src/cli/commands/new.ts`), and MCP `sync_new` (`src/mcp/tools/sync-new.ts`) with `-C, --categories`, `-T, --tags`, `-d, --description`, and `-f, --featured-image` arguments.
242
+ - Implemented centralized input normalization (`normalizeStringList`) supporting both array and comma-separated string inputs with whitespace trimming across MCP and CLI layers.
243
+ - Added uppercase Crockford Base32 normalization for 26-character ULID `featuredImage` values prior to disk write, keeping disk frontmatter immediately canonical.
244
+ - Added epistemic validation for taxonomy arguments: checks local `categories/` and `tags/` definitions when present and surfaces non-blocking warnings via `CreateArticleResult.warnings` without halting draft scaffolding.
245
+ - Enhanced CLI and MCP outputs with structured `Assigned: ...` confirmation line, separating assigned values, taxonomy warnings, and available hint summaries.
246
+ - Eliminates the error-prone post-creation Frontmatter manual editing step for AI agents and human authors.
247
+
248
+ ## [0.1.19] - 2026-11-14
249
+
250
+ ### Added
251
+
252
+ - **Local-First Featured Image Auto-Upload & ID Resolution (Guard G10 Extension)**:
253
+ - Allowed direct local image paths (`../../media/drafts/<filename>` or already-promoted `../../media/<filename>`) in frontmatter `featuredImage`.
254
+ - During `emit push` / `sync_push`, local draft featured images are automatically uploaded via EmDash Media API (`upload-url` → `PUT` → `confirm`) and resolved to their canonical 26-character D1 `mediaId` (ULID) in the remote push payload.
255
+ - On push completion, frontmatter `featuredImage` on disk and in baseline snapshots is committed as the canonical media record ULID, maintaining byte-identical baseline synchronization.
256
+ - Implemented shared upload pool deduplication: referencing the identical image in both article body and `featuredImage` executes binary upload and file promotion exactly once without duplicating remote assets or triggering filesystem collisions.
257
+ - Added two-stage lookup for already-promoted mirrors (supporting both stem-based and direct `storageKey` filename references) and suppressed spurious companion verification warnings for newly uploaded assets.
258
+ - Guarded against 409 conflict: 3-way merge strictly honors scalar conflict rules (Remote takes precedence with warning log), keeping baseline snapshots and disk state fully aligned (note: auto-uploaded draft images remain promoted in local media mirror and tracked in `media_state` for future doctor/media cleanups).
259
+
12
260
  ## [0.1.18] - 2026-11-13
13
261
 
14
262
  ### Added
@@ -46,7 +294,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
46
294
  ### Fixed
47
295
 
48
296
  - **Draft image localization on push (`localMediaRefs: true`)**:
49
- - A draft image auto-uploaded from `media/drafts/` during `emit push` / `sync_push` now lands on disk as an article-relative mirror reference (`../../media/<storageKey>`) instead of a canonical remote URL. Promotion of the uploaded file into `media/` (P6) was running *after* the body localization pass, and `localizeArticleMediaRefs` only rewrites a reference whose storageKey already has a real mirror under `media/`, so a freshly uploaded image stayed spelled as `/_emdash/api/media/file/<storageKey>` on disk until the next pull.
297
+ - A draft image auto-uploaded from `media/drafts/` during `emit push` / `sync_push` now lands on disk as an article-relative mirror reference (`../../media/<storageKey>`) instead of a canonical remote URL. Promotion of the uploaded file into `media/` (P6) was running _after_ the body localization pass, and `localizeArticleMediaRefs` only rewrites a reference whose storageKey already has a real mirror under `media/`, so a freshly uploaded image stayed spelled as `/_emdash/api/media/file/<storageKey>` on disk until the next pull.
50
298
  - The fix relocates promotion to just after the remote POST/PUT (and its conflict handling) and before localization, on both the create and update paths. Promotion still never runs when the remote article write fails or a 3-way merge aborts the push, so the compensation window stays intact: the draft image remains staged under `media/drafts/`, the article file keeps its original draft-path reference, and `media_state` keeps `status: 'uploaded'` for the next run.
51
299
 
52
300
  ### Removed
package/README.md CHANGED
@@ -455,11 +455,11 @@ Markdown body begins here...
455
455
  - Emit automatically updates the remote state and moves the file from `posts/draft/` to `posts/published/`.
456
456
  - **Never move or rename files manually using `mv`**.
457
457
  4. **Featured Image References**:
458
- - `featuredImage` must be a 26-character canonical media **record** ULID (e.g. `01M67P0MBMJQQXH2K95HHCYRYB`) or `null` — never a `storageKey`, which is a different ULID for the same asset ([Two Media ID Spaces](#two-media-id-spaces-id-vs-storagekey)). Emit normalizes the value to uppercase, so lowercase input is accepted and canonicalized on pull, merge, and push.
458
+ - `featuredImage` accepts a 26-character canonical media **record** ULID (e.g. `01M67P0MBMJQQXH2K95HHCYRYB`), a local draft image path (`../../media/drafts/eyecatch.jpg` or an already-promoted mirror under `media/`), or `null` — never a bare `storageKey` ([Two Media ID Spaces](#two-media-id-spaces-id-vs-storagekey)). When a local draft image is specified, Emit automatically uploads it and resolves its D1 `mediaId` during push, committing the canonical ULID on disk. Emit normalizes ULIDs to uppercase on pull, merge, and push.
459
459
  - To remove the hero image, set `featuredImage: null`. Omitting the field leaves the remote value untouched.
460
460
  - When the referenced ULID matches the cached remote entry, Emit resends the original remote `featured_image` object verbatim (provider, `src`, `meta.storageKey`, dimensions, MIME type) so nothing is lost. When it does not match, Emit sends the bare `{ id: <ULID> }` and lets EmDash resolve the media record. **This contract is confirmed against a live EmDash instance:** `featured_image: { "id": "<ULID>" }` is accepted (HTTP 200) and the server stores the id and normalizes `"provider": "local"` itself.
461
461
  - Emit never fabricates media metadata from local `media/*.yaml` files: companion files are used only to cross-check a reference. In a workspace that mirrors media (`media/` exists and is non-empty), a missing or mismatched companion file is reported as a push warning — it means Emit could not confirm the media ID exists, not that the payload is invalid. Workspaces that do not mirror media produce no such warning.
462
- - Preflight Guard **G10** rejects local file paths and malformed values before pushing.
462
+ - Preflight Guard **G10** rejects invalid file paths outside `media/` and malformed values before pushing.
463
463
 
464
464
  ### EmDash Custom Block Preservation
465
465
 
@@ -562,7 +562,7 @@ To ensure autonomous AI agents and automated scripts cannot corrupt workspace st
562
562
  | **G7** | `TITLE_DUPLICATION_AUTOTRIM` | Detects redundant `# Title` headings at the top of the body and automatically trims them safely | Warning |
563
563
  | **G8** | `UNSUPPORTED_SYNTAX_WARNING` | Warns if unsupported block HTML, tables, or tilde code fences are detected in Markdown (`detectUnsupportedMarkdownSyntax`) | Warning |
564
564
  | **G9** | `MODIFIED_OPAQUE_BLOCK` | Verifies that `<!--ec:block ... -->` opaque fences have not been tampered with or corrupted | Error |
565
- | **G10** | `INVALID_FEATURED_IMAGE` | Verifies that `featuredImage` is a 26-character canonical media ULID (normalized to uppercase) or `null`. A remote media URL that contains a ULID is resolved with a warning; local file paths and malformed values are rejected | Error |
565
+ | **G10** | `INVALID_FEATURED_IMAGE` | Verifies that `featuredImage` is a 26-character canonical media ULID (normalized to uppercase), a local draft image path inside `media/drafts/`, or `null`. A remote media URL that contains a ULID is resolved with a warning; paths outside `media/` and malformed values are rejected | Error |
566
566
  | **G11** | `LOCAL_IMAGE_AUTO_UPLOAD` (`MISSING_LOCAL_IMAGE_FILE` / `INVALID_LOCAL_IMAGE_TYPE` / `LOCAL_IMAGE_SIZE_EXCEEDED` / `PROMOTED_MEDIA_NOT_FOUND_REMOTE` / `[MEDIA_EXISTENCE_UNVERIFIED]`) | Detects standalone `media/drafts/<file>` image lines (or reuses an already-promoted `media/` asset across articles), validates file existence, extension, and size (≤ 50 MiB), queues them for automatic upload, URL rewrite, and `media/` promotion during `push`, and verifies every reused asset against `GET /_emdash/api/media/{id}` before its URL is baked into the body | Info / Warning / Error |
567
567
  | **G12** | `QUARANTINED_COPY_NOT_PUSHABLE` | Refuses to push a rescue copy under `posts/conflicts/` (written by a pull that found divergent local content) before any network request, because it would overwrite the canonical article of the same ULID with stale content and recreate duplicate local files | Error |
568
568
  | **G13** | `CANONICAL_HAS_UNPUSHED_EDITS` | Protects canonical articles from being silently overwritten during conflict resolution (`accept-local`) when unpushed local modifications exist; requires explicit `--force` (`force: true`) | Error |
@@ -624,25 +624,32 @@ emit profile use <name>
624
624
 
625
625
  ### `emit new`
626
626
 
627
- Scaffolds a new draft article with a canonical 26-character ULID timestamp.
627
+ Scaffolds a new draft article with a canonical 26-character ULID timestamp. Supports one-shot frontmatter initialization via optional metadata arguments.
628
628
 
629
629
  ```bash
630
- emit new <slug> [-t, --title <title>] [-c, --collection <collection>] [-l, --locale <locale>] [-b, --byline <slug>] [-p, --profile <name>]
631
-
630
+ emit new <slug> [options]
632
631
  ```
633
632
 
634
633
  - `<slug>`: URL slug for the article (e.g., `modern-web-architecture`).
635
- - `-t, --title <title>`: Human-readable article title.
634
+ - `-t, --title <title>`: Human-readable article title (defaults to slug).
636
635
  - `-c, --collection <name>`: Collection name (defaults to `posts`).
637
636
  - `-l, --locale <locale>`: Locale code (defaults to `ja` or config).
638
- - `-b, --byline <slug>`: Author byline slug (defaults to the first cached non-guest author ordered by `slug ASC`).
637
+ - `-b, --byline <slug>`: Author byline slug (defaults to first cached non-guest author ordered by `slug ASC`).
638
+ - `-C, --categories <categories...>`: Category slugs (comma-separated or space-separated multiple).
639
+ - `-T, --tags <tags...>`: Tag slugs (comma-separated or space-separated multiple).
640
+ - `-d, --description <desc>`: Article excerpt or SEO description (saved to `seo.description`).
641
+ - `-f, --featured-image <pathOrId>`: Featured image (local draft path like `../../media/drafts/cover.jpg` or 26-char media ULID).
639
642
  - `-p, --profile <name>`: Explicitly target a specific connection profile.
640
643
 
641
644
  **Example:**
642
645
 
643
646
  ```bash
644
- emit new ai-workflow-guide --title "AI Workflow Guide"
645
-
647
+ emit new ai-workflow-guide \
648
+ --title "AI Workflow Guide" \
649
+ --categories tech,guide \
650
+ --tags typescript,ai \
651
+ --featured-image "../../media/drafts/cover.jpg" \
652
+ --description "A complete guide to AI-driven workflows"
646
653
  ```
647
654
 
648
655
  **Output:**
@@ -860,15 +867,19 @@ emit status [-c, --collection <collection>] [-p, --profile <name>]
860
867
  --- Workspace Status (posts | origin: https://your-blog.example.com) ---
861
868
  🟡 [modified] draft posts/draft/20261104_01M6BBB...-AI-Workflow-Guide.md (AI Workflow Guide)
862
869
  ⚪ [untracked] draft posts/draft/20261104_01M6AAA...-Draft-Notes.md (Draft Notes)
870
+ 🟣 [synced ] published* posts/published/20261020_01M5YYY...-Review-Notes.md (Review Notes) [has unpublished draft]
863
871
  🟢 [synced ] published posts/published/20261015_01M5ZZZ...-Getting-Started.md (Getting Started)
864
872
  🔴 [invalid ] published posts/published/20190405_01M6CCC...-Broken-Post.md (Broken-Post) [uncached] — bad indentation of a mapping entry at line 5
865
873
 
866
- Summary: 4 total (1 synced, 1 modified, 1 untracked, 1 invalid)
874
+ Summary: 5 total (2 synced, 1 modified, 1 untracked, 1 invalid)
867
875
  ```
868
876
 
869
877
  > [!NOTE]
870
878
  > Articles are sorted newest-first by date prefix and ULID. The date prefix reflects the article's publication or creation date, not the last-modified time. To locate currently active edits, look for files marked `[modified]`.
871
879
 
880
+ > [!NOTE]
881
+ > `published* [has unpublished draft]` (🟣) indicates a published article that has uncommitted/staged draft revisions on EmDash. The status icon prioritizes local sync state (e.g. 🟡 `[modified]` if edited locally), while the `published*` label and `[has unpublished draft]` badge clearly highlight pending remote draft content. Inside the file, the frontmatter explicitly states `status: published # draft revision` so authors and AI agents know the file contains unpublished draft revisions even when inspecting the file directly.
882
+
872
883
  > [!NOTE]
873
884
  > `[invalid]` marks a file whose YAML frontmatter could not be parsed (usually an older serializer wrote unquoted percent-encoded taxonomy slugs). Batch `emit pull` self-heals cached invalid files; files outside the sliding window are marked `[uncached]` and are repaired with `emit pull <ULID>` (MCP: `sync_pull` with `id: "<ULID>"`). When `<collection>/conflicts/` holds rescue copies, the count is reported separately (`conflicts`) and never counted as an article.
874
885
 
@@ -1 +1 @@
1
- {"version":3,"file":"conflicts.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/conflicts.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,kBAAkB,GACjC,IAAI,CA4MN"}
1
+ {"version":3,"file":"conflicts.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/conflicts.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGxD,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,kBAAkB,GACjC,IAAI,CA2LN"}
@@ -19,29 +19,9 @@
19
19
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20
20
  * SOFTWARE.
21
21
  */
22
- import { ApiError } from '../../client/error.js';
23
- import { listConflicts, diffConflict, resolveConflict, pruneConflicts, CanonicalHasUnpushedEditsError, QuarantinedPathRequiredError, } from '../../sync/conflicts.js';
22
+ import { listConflicts, diffConflict, resolveConflict, pruneConflicts, } from '../../sync/conflicts.js';
23
+ import { reportActionFailure } from '../report-failure.js';
24
24
  export function registerConflictsCommand(program, resolveContext) {
25
- const reportActionFailure = (error) => {
26
- if (error instanceof CanonicalHasUnpushedEditsError) {
27
- console.error(`❌ ${error.message}`);
28
- console.error(`💡 Suggestion: ${error.suggestion}`);
29
- }
30
- else if (error instanceof QuarantinedPathRequiredError) {
31
- console.error(`❌ Error: [QUARANTINED_PATH_REQUIRED] ${error.message}`);
32
- console.error(`💡 Suggestion: ${error.suggestion}`);
33
- }
34
- else if (error instanceof ApiError) {
35
- console.error(error.toActionableString());
36
- }
37
- else if (error instanceof Error) {
38
- console.error(`❌ Error: ${error.message}`);
39
- }
40
- else {
41
- console.error(`❌ Error: ${String(error)}`);
42
- }
43
- process.exit(1);
44
- };
45
25
  const conflicts = program
46
26
  .command('conflicts')
47
27
  .description('Manage quarantined sync conflict copies and deletion rescue backups in posts/conflicts/');
@@ -1 +1 @@
1
- {"version":3,"file":"conflicts.js","sourceRoot":"","sources":["../../../src/cli/commands/conflicts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"conflicts.js","sourceRoot":"","sources":["../../../src/cli/commands/conflicts.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/delete.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,kBAAkB,GAAG,IAAI,CAuEhG"}
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/delete.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGxD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,kBAAkB,GAAG,IAAI,CA4DhG"}
@@ -20,20 +20,8 @@
20
20
  * SOFTWARE.
21
21
  */
22
22
  import { deleteArticle } from '../../sync/delete.js';
23
- import { ApiError } from '../../client/error.js';
23
+ import { reportActionFailure } from '../report-failure.js';
24
24
  export function registerDeleteCommand(program, resolveContext) {
25
- const reportActionFailure = (error) => {
26
- if (error instanceof ApiError) {
27
- console.error(error.toActionableString());
28
- }
29
- else if (error instanceof Error) {
30
- console.error(error.message);
31
- }
32
- else {
33
- console.error(String(error));
34
- }
35
- process.exit(1);
36
- };
37
25
  program
38
26
  .command('delete <target>')
39
27
  .description('Safely delete an article from both local workspace and remote EmDash server')
@@ -1 +1 @@
1
- {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/cli/commands/delete.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/cli/commands/delete.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,kBAAkB,GAAG,IAAI,CAoFhG"}
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGxD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,kBAAkB,GAAG,IAAI,CAyEhG"}
@@ -19,21 +19,9 @@
19
19
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20
20
  * SOFTWARE.
21
21
  */
22
- import { ApiError } from '../../client/error.js';
23
22
  import { runWorkspaceDoctor } from '../../sync/doctor.js';
23
+ import { reportActionFailure } from '../report-failure.js';
24
24
  export function registerDoctorCommand(program, resolveContext) {
25
- const reportActionFailure = (error) => {
26
- if (error instanceof ApiError) {
27
- console.error(error.toActionableString());
28
- }
29
- else if (error instanceof Error) {
30
- console.error(`❌ Error: ${error.message}`);
31
- }
32
- else {
33
- console.error(`❌ Error: ${String(error)}`);
34
- }
35
- process.exit(1);
36
- };
37
25
  program
38
26
  .command('doctor')
39
27
  .description('Run comprehensive diagnostics on workspace configuration, cache, and content integrity')
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,MAAM,UAAU,qBAAqB,CAAC,OAAgB,EAAE,cAAkC;IACxF,MAAM,mBAAmB,GAAG,CAAC,KAAc,EAAS,EAAE;QACpD,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;YAC9B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC,CAAC;QAC5C,CAAC;aAAM,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAClC,OAAO,CAAC,KAAK,CAAC,YAAY,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,YAAY,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CACV,wFAAwF,CACzF;SACA,MAAM,CAAC,+BAA+B,EAAE,yCAAyC,CAAC;SAClF,MAAM,CAAC,sBAAsB,EAAE,8CAA8C,CAAC;SAC9E,MAAM,CACL,gBAAgB,EAChB,iFAAiF,CAClF;SACA,MAAM,CACL,oBAAoB,EACpB,wJAAwJ,CACzJ;SACA,MAAM,CACL,uBAAuB,EACvB,4IAA4I,CAC7I;SACA,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;YACpE,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,GAAG,CAAC,MAAM,CAAC,iBAAiB,IAAI,OAAO,CAAC;YAEjF,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC;gBACtC,aAAa,EAAE,GAAG,CAAC,IAAI;gBACvB,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,WAAW,EAAE,GAAG,CAAC,IAAI,EAAE,WAAW;gBAClC,aAAa,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM;gBAC/B,UAAU;gBACV,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;gBACzC,cAAc,EAAE,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC;gBAC/C,iBAAiB,EAAE,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC;gBACrD,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK;gBACtB,YAAY,EAAE,GAAG,CAAC,IAAI,EAAE,YAAY;aACrC,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,CACT,kBAAkB,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,mBAAmB,MAAM,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAC5H,CAAC;YAEF,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClC,MAAM,KAAK,GACT,KAAK,CAAC,MAAM,KAAK,IAAI;oBACnB,CAAC,CAAC,UAAU;oBACZ,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS;wBAC1B,CAAC,CAAC,YAAY;wBACd,CAAC,CAAC,UAAU,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC1D,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;oBACrB,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;gBAC3D,CAAC;YACH,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;gBACvC,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;YAC9E,CAAC;iBAAM,IAAI,MAAM,CAAC,aAAa,KAAK,UAAU,EAAE,CAAC;gBAC/C,OAAO,CAAC,GAAG,CACT,iFAAiF,CAClF,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;gBAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/media.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAUxD,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,kBAAkB,GACjC,IAAI,CAgHN"}
1
+ {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/media.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAWxD,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,kBAAkB,GACjC,IAAI,CAqGN"}
@@ -19,9 +19,9 @@
19
19
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20
20
  * SOFTWARE.
21
21
  */
22
- import { ApiError } from '../../client/error.js';
23
22
  import { collectLocalMirrorIndex, searchRemoteMedia } from '../../sync/media.js';
24
23
  import { getLocalTaxonomiesSummary } from '../../sync/taxonomies.js';
24
+ import { reportActionFailure } from '../report-failure.js';
25
25
  function formatSize(bytes) {
26
26
  if (bytes === null || bytes === undefined)
27
27
  return '';
@@ -31,18 +31,6 @@ function formatSize(bytes) {
31
31
  return `${Math.max(1, Math.round(bytes / 1024))} KB`;
32
32
  }
33
33
  export function registerMediaSearchCommand(program, resolveContext) {
34
- const reportActionFailure = (error) => {
35
- if (error instanceof ApiError) {
36
- console.error(error.toActionableString());
37
- }
38
- else if (error instanceof Error) {
39
- console.error(`❌ Error: ${error.message}`);
40
- }
41
- else {
42
- console.error(`❌ Error: ${String(error)}`);
43
- }
44
- process.exit(1);
45
- };
46
34
  program
47
35
  .command('media-search <query>')
48
36
  .description('Search the remote EmDash media library by keyword (filename, alt, caption, storageKey)')
@@ -1 +1 @@
1
- {"version":3,"file":"media.js","sourceRoot":"","sources":["../../../src/cli/commands/media.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"media.js","sourceRoot":"","sources":["../../../src/cli/commands/media.ts"],"names":[],"mappings":"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"}