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
@@ -22,7 +22,8 @@
22
22
  import fs from 'node:fs';
23
23
  import path from 'node:path';
24
24
  import yaml from 'js-yaml';
25
- import { formatYamlScalar, sanitizeTitleForFilename, } from '../utils/frontmatter.js';
25
+ import { formatYamlScalar, sanitizeTitleForFilename, tryDecodeTaxonomyTerm, } from '../utils/frontmatter.js';
26
+ import { aliasesOf, canonicalSlugOf } from '../utils/taxonomy-key.js';
26
27
  /**
27
28
  * Recursively flattens hierarchical taxonomy terms (parent terms with nested children)
28
29
  * preserving parentId for each child.
@@ -53,6 +54,64 @@ import { ApiError } from '../client/error.js';
53
54
  import { createAuthedFetch } from '../client/http.js';
54
55
  import { unwrapEnvelope } from '../client/api.js';
55
56
  import { taxonomiesTermsEndpoint } from '../client/endpoints.js';
57
+ /**
58
+ * Serializes a category or tag definition to YAML.
59
+ * Emits decoded slug on disk and keeps raw percent-encoded slug as canonicalSlug when they differ.
60
+ * Uses formatYamlScalar to prevent type coercion of reserved words or numeric strings,
61
+ * and ensures 1-line scalar output to prevent js-yaml folded blocks (> -).
62
+ */
63
+ function serializeTaxonomyYaml(doc) {
64
+ const lines = [
65
+ `id: ${formatYamlScalar(doc.id)}`,
66
+ `name: ${formatYamlScalar(doc.name)}`,
67
+ `slug: ${formatYamlScalar(doc.slug)}`,
68
+ ];
69
+ if (doc.canonicalSlug && doc.canonicalSlug !== doc.slug) {
70
+ lines.push(`canonicalSlug: ${formatYamlScalar(doc.canonicalSlug)}`);
71
+ }
72
+ lines.push(`taxonomy: ${formatYamlScalar(doc.taxonomy)}`);
73
+ lines.push(`parentId: ${doc.parentId ? formatYamlScalar(doc.parentId) : 'null'}`);
74
+ lines.push(`count: ${doc.count}`);
75
+ return lines.join('\n') + '\n';
76
+ }
77
+ function writeAndPruneTaxonomyDir(params) {
78
+ fs.mkdirSync(params.dir, { recursive: true });
79
+ const activeFileNames = new Set();
80
+ for (const item of params.items) {
81
+ const label = item.label || item.slug;
82
+ const sanitized = sanitizeTitleForFilename(label);
83
+ const fileName = `${item.id}-${sanitized}.yaml`;
84
+ activeFileNames.add(fileName);
85
+ const filePath = path.join(params.dir, fileName);
86
+ const rawSlug = item.slug;
87
+ const decodedSlug = tryDecodeTaxonomyTerm(rawSlug);
88
+ const doc = {
89
+ id: item.id,
90
+ name: label,
91
+ slug: decodedSlug,
92
+ ...(decodedSlug !== rawSlug ? { canonicalSlug: rawSlug } : {}),
93
+ taxonomy: params.taxonomy,
94
+ parentId: item.parentId || null,
95
+ count: item.count ?? 0,
96
+ };
97
+ fs.writeFileSync(filePath, serializeTaxonomyYaml(doc), 'utf8');
98
+ }
99
+ let deletedCount = 0;
100
+ if (fs.existsSync(params.dir)) {
101
+ for (const file of fs.readdirSync(params.dir)) {
102
+ if (file.endsWith('.yaml') && !activeFileNames.has(file)) {
103
+ try {
104
+ fs.unlinkSync(path.join(params.dir, file));
105
+ deletedCount++;
106
+ }
107
+ catch {
108
+ // Ignore unlink errors
109
+ }
110
+ }
111
+ }
112
+ }
113
+ return { count: params.items.length, deletedCount };
114
+ }
56
115
  /**
57
116
  * Pulls categories and tags from EmDash API and saves them to local YAML files:
58
117
  * categories/<id>-<sanitizedLabel>.yaml
@@ -95,77 +154,25 @@ export async function pullTaxonomies(options) {
95
154
  let deletedCategoriesCount = 0;
96
155
  // Save categories and prune deleted ones (only if fetch succeeded; preserve on failure)
97
156
  if (categories !== null) {
98
- fs.mkdirSync(categoriesDir, { recursive: true });
99
- categoriesCount = categories.length;
100
- const activeCategoryFileNames = new Set();
101
- for (const cat of categories) {
102
- const label = cat.label || cat.slug;
103
- const sanitized = sanitizeTitleForFilename(label);
104
- const fileName = `${cat.id}-${sanitized}.yaml`;
105
- activeCategoryFileNames.add(fileName);
106
- const filePath = path.join(categoriesDir, fileName);
107
- const doc = {
108
- id: cat.id,
109
- name: label,
110
- slug: cat.slug,
111
- taxonomy: 'category',
112
- parentId: cat.parentId || null,
113
- count: cat.count ?? 0,
114
- };
115
- fs.writeFileSync(filePath, yaml.dump(doc, { indent: 2, quotingType: '"', forceQuotes: false }), 'utf8');
116
- }
117
- // Prune local category YAMLs not present on remote
118
- if (fs.existsSync(categoriesDir)) {
119
- for (const file of fs.readdirSync(categoriesDir)) {
120
- if (file.endsWith('.yaml') && !activeCategoryFileNames.has(file)) {
121
- try {
122
- fs.unlinkSync(path.join(categoriesDir, file));
123
- deletedCategoriesCount++;
124
- }
125
- catch {
126
- // Ignore unlink errors
127
- }
128
- }
129
- }
130
- }
157
+ const res = writeAndPruneTaxonomyDir({
158
+ dir: categoriesDir,
159
+ items: categories,
160
+ taxonomy: 'category',
161
+ });
162
+ categoriesCount = res.count;
163
+ deletedCategoriesCount = res.deletedCount;
131
164
  }
132
165
  let tagsCount = 0;
133
166
  let deletedTagsCount = 0;
134
167
  // Save tags and prune deleted ones (only if fetch succeeded; preserve on failure)
135
168
  if (tags !== null) {
136
- fs.mkdirSync(tagsDir, { recursive: true });
137
- tagsCount = tags.length;
138
- const activeTagFileNames = new Set();
139
- for (const tag of tags) {
140
- const label = tag.label || tag.slug;
141
- const sanitized = sanitizeTitleForFilename(label);
142
- const fileName = `${tag.id}-${sanitized}.yaml`;
143
- activeTagFileNames.add(fileName);
144
- const filePath = path.join(tagsDir, fileName);
145
- const doc = {
146
- id: tag.id,
147
- name: label,
148
- slug: tag.slug,
149
- taxonomy: 'tag',
150
- parentId: tag.parentId || null,
151
- count: tag.count ?? 0,
152
- };
153
- fs.writeFileSync(filePath, yaml.dump(doc, { indent: 2, quotingType: '"', forceQuotes: false }), 'utf8');
154
- }
155
- // Prune local tag YAMLs not present on remote
156
- if (fs.existsSync(tagsDir)) {
157
- for (const file of fs.readdirSync(tagsDir)) {
158
- if (file.endsWith('.yaml') && !activeTagFileNames.has(file)) {
159
- try {
160
- fs.unlinkSync(path.join(tagsDir, file));
161
- deletedTagsCount++;
162
- }
163
- catch {
164
- // Ignore unlink errors
165
- }
166
- }
167
- }
168
- }
169
+ const res = writeAndPruneTaxonomyDir({
170
+ dir: tagsDir,
171
+ items: tags,
172
+ taxonomy: 'tag',
173
+ });
174
+ tagsCount = res.count;
175
+ deletedTagsCount = res.deletedCount;
169
176
  }
170
177
  return {
171
178
  categoriesCount,
@@ -193,10 +200,35 @@ export function readTaxonomyDir(dir) {
193
200
  const content = fs.readFileSync(path.join(dir, file), 'utf8');
194
201
  const data = yaml.load(content);
195
202
  if (data && typeof data.id === 'string' && typeof data.slug === 'string') {
203
+ const rawSlug = String(data.slug).trim();
204
+ if (!rawSlug)
205
+ continue;
206
+ const rawCanonical = typeof data.canonicalSlug === 'string' && data.canonicalSlug.trim()
207
+ ? data.canonicalSlug.trim()
208
+ : undefined;
209
+ let slug;
210
+ let canonicalSlug;
211
+ if (rawCanonical && rawSlug) {
212
+ // New format (v0.1.26): canonicalSlug is explicit
213
+ slug = rawSlug;
214
+ canonicalSlug = rawCanonical;
215
+ }
216
+ else if (rawSlug.includes('%')) {
217
+ // Legacy format (v0.1.25): slug is percent-encoded
218
+ const decoded = tryDecodeTaxonomyTerm(rawSlug);
219
+ slug = decoded;
220
+ canonicalSlug = rawSlug;
221
+ }
222
+ else {
223
+ // Standard ASCII slug
224
+ slug = rawSlug;
225
+ canonicalSlug = rawSlug;
226
+ }
196
227
  items.push({
197
228
  id: data.id,
198
- slug: data.slug,
199
- name: typeof data.name === 'string' ? data.name : data.slug,
229
+ slug,
230
+ canonicalSlug,
231
+ name: typeof data.name === 'string' ? data.name : slug,
200
232
  parentId: typeof data.parentId === 'string' ? data.parentId : null,
201
233
  count: typeof data.count === 'number' ? data.count : undefined,
202
234
  });
@@ -212,55 +244,56 @@ export function readTaxonomyDir(dir) {
212
244
  return [];
213
245
  }
214
246
  }
247
+ /**
248
+ * Deterministic collision winner ordering: highest count first, ties broken by newest ULID (descending).
249
+ * Shared between Layer A (`loadLocalTaxonomyMaps`) and Layer B (`getLocalTaxonomiesSummary`)
250
+ * so duplicate canonical/decoded slugs always resolve to the identical winner term ID.
251
+ */
252
+ export function compareTaxonomyTermDeterministically(a, b) {
253
+ const countDiff = (b.count ?? 0) - (a.count ?? 0);
254
+ if (countDiff !== 0)
255
+ return countDiff;
256
+ return b.id < a.id ? -1 : b.id > a.id ? 1 : 0;
257
+ }
215
258
  /**
216
259
  * Loads local taxonomy mapping between term ULID and slug from categories/ and tags/ directories.
217
260
  */
218
261
  export function loadLocalTaxonomyMaps(workspaceRoot) {
219
262
  const catItems = readTaxonomyDir(path.join(workspaceRoot, 'categories'));
220
263
  const tagItems = readTaxonomyDir(path.join(workspaceRoot, 'tags'));
221
- // Sort items deterministically: highest count first, ties broken by newest ULID (descending).
222
- // Ensures the chosen mapping for duplicate slugs matches getLocalTaxonomiesSummary.
223
- const sortDeterministically = (items) => [...items].sort((a, b) => {
224
- const countDiff = (b.count ?? 0) - (a.count ?? 0);
225
- if (countDiff !== 0)
226
- return countDiff;
227
- return b.id < a.id ? -1 : b.id > a.id ? 1 : 0;
228
- });
264
+ const sortDeterministically = (items) => [...items].sort(compareTaxonomyTermDeterministically);
229
265
  const toMaps = (items) => {
230
266
  const slugToId = {};
231
267
  const idToSlug = {};
232
268
  const sorted = sortDeterministically(items);
233
- // 1. Register canonical slugs first
269
+ // Phase 1: Register canonical slugs first (Track 1 / Layer A truth)
234
270
  for (const item of sorted) {
235
- idToSlug[item.id] = item.slug;
236
- if (!slugToId[item.slug]) {
237
- slugToId[item.slug] = item.id;
271
+ const canonical = canonicalSlugOf(item);
272
+ idToSlug[item.id] = canonical;
273
+ if (!slugToId[canonical]) {
274
+ slugToId[canonical] = item.id;
238
275
  }
239
276
  }
240
- // 2. Collect candidate aliases (decoded percent-encoded slug and human-readable name)
241
- // Only register an alias if it does not collide with any canonical slug and maps uniquely to 1 term ID.
277
+ // Phase 2: Collect candidate aliases (decoded slug and human-readable name)
278
+ // Only register an alias if it does not collide with ANY canonical slug and maps uniquely to 1 term ID.
242
279
  const aliasToIds = new Map();
243
280
  const recordAliasCandidate = (alias, id) => {
244
281
  if (!alias || !alias.trim())
245
282
  return;
246
- const trimmed = alias.trim();
247
- let set = aliasToIds.get(trimmed);
283
+ const normalized = alias.trim().normalize('NFC');
284
+ let set = aliasToIds.get(normalized);
248
285
  if (!set) {
249
286
  set = new Set();
250
- aliasToIds.set(trimmed, set);
287
+ aliasToIds.set(normalized, set);
251
288
  }
252
289
  set.add(id);
253
290
  };
254
291
  for (const item of sorted) {
255
292
  recordAliasCandidate(item.name, item.id);
256
- if (item.slug.includes('%')) {
257
- try {
258
- const decoded = decodeURIComponent(item.slug);
259
- recordAliasCandidate(decoded, item.id);
260
- }
261
- catch {
262
- // Ignore malformed percent-encoding (URIError)
263
- }
293
+ const canonical = canonicalSlugOf(item);
294
+ const isCanonicalOwner = slugToId[canonical] === item.id;
295
+ if (isCanonicalOwner && item.slug && item.slug !== canonical) {
296
+ recordAliasCandidate(item.slug, item.id);
264
297
  }
265
298
  }
266
299
  for (const [alias, ids] of aliasToIds.entries()) {
@@ -293,17 +326,33 @@ export function loadLocalTaxonomyCandidates(workspaceRoot) {
293
326
  const summary = getLocalTaxonomiesSummary(workspaceRoot);
294
327
  const catMap = {};
295
328
  for (const c of summary.categories) {
296
- if (c.name && c.slug)
329
+ if (c.name && c.slug) {
297
330
  catMap[c.slug] = c.name;
331
+ const decoded = tryDecodeTaxonomyTerm(c.slug);
332
+ if (decoded !== c.slug) {
333
+ catMap[decoded] = c.name;
334
+ }
335
+ if (c.canonicalSlug && c.canonicalSlug !== c.slug) {
336
+ catMap[c.canonicalSlug] = c.name;
337
+ }
338
+ }
298
339
  }
299
340
  const tagMap = {};
300
341
  for (const t of summary.tags) {
301
- if (t.name && t.slug)
342
+ if (t.name && t.slug) {
302
343
  tagMap[t.slug] = t.name;
344
+ const decoded = tryDecodeTaxonomyTerm(t.slug);
345
+ if (decoded !== t.slug) {
346
+ tagMap[decoded] = t.name;
347
+ }
348
+ if (t.canonicalSlug && t.canonicalSlug !== t.slug) {
349
+ tagMap[t.canonicalSlug] = t.name;
350
+ }
351
+ }
303
352
  }
304
353
  return {
305
- categories: Array.from(new Set(summary.categories.map((c) => c.slug))),
306
- tags: Array.from(new Set(summary.tags.map((t) => t.slug))),
354
+ categories: Array.from(new Set(summary.categories.flatMap((c) => aliasesOf(c)))),
355
+ tags: Array.from(new Set(summary.tags.flatMap((t) => aliasesOf(t)))),
307
356
  slugToName: {
308
357
  category: catMap,
309
358
  tag: tagMap,
@@ -318,6 +367,31 @@ export function loadLocalTaxonomyCandidates(workspaceRoot) {
318
367
  };
319
368
  }
320
369
  }
370
+ /**
371
+ * Sorts taxonomy terms deterministically and deduplicates by slug, keeping the winner term.
372
+ * Mode 'slug-grouped' orders by slug ASC first (used for categories display).
373
+ * Mode 'frequency' orders by highest count first, newest ULID break (used for tags display).
374
+ */
375
+ export function dedupeTermsBySlug(items, mode = 'frequency') {
376
+ const sorted = [...items].sort((a, b) => {
377
+ if (mode === 'slug-grouped') {
378
+ if (a.slug < b.slug)
379
+ return -1;
380
+ if (a.slug > b.slug)
381
+ return 1;
382
+ }
383
+ return compareTaxonomyTermDeterministically(a, b);
384
+ });
385
+ const seen = new Set();
386
+ const result = [];
387
+ for (const item of sorted) {
388
+ if (!seen.has(item.slug)) {
389
+ seen.add(item.slug);
390
+ result.push(item);
391
+ }
392
+ }
393
+ return result;
394
+ }
321
395
  /**
322
396
  * Reads local categories/ and tags/ YAML definitions and returns structured summary.
323
397
  * Tags are sorted by count descending (most used first), then by ULID descending (newest first).
@@ -327,34 +401,12 @@ export function loadLocalTaxonomyCandidates(workspaceRoot) {
327
401
  export function getLocalTaxonomiesSummary(workspaceRoot) {
328
402
  const categoriesDir = path.join(workspaceRoot, 'categories');
329
403
  const tagsDir = path.join(workspaceRoot, 'tags');
330
- const dedupeBySlug = (items) => {
331
- const seen = new Set();
332
- const result = [];
333
- for (const item of items) {
334
- if (!seen.has(item.slug)) {
335
- seen.add(item.slug);
336
- result.push(item);
337
- }
338
- }
339
- return result;
340
- };
341
- const categories = dedupeBySlug(readTaxonomyDir(categoriesDir).sort((a, b) => {
342
- if (a.slug < b.slug)
343
- return -1;
344
- if (a.slug > b.slug)
345
- return 1;
346
- const countDiff = (b.count ?? 0) - (a.count ?? 0);
347
- if (countDiff !== 0)
348
- return countDiff;
349
- return b.id < a.id ? -1 : b.id > a.id ? 1 : 0;
350
- }));
404
+ // Primary sort key `slug` asc orders distinct categories for display; within identical `slug` groups
405
+ // (`a.slug === b.slug`), `compareTaxonomyTermDeterministically` decides the winner kept by `dedupeTermsBySlug`,
406
+ // guaranteeing 100% winner parity with `loadLocalTaxonomyMaps`.
407
+ const categories = dedupeTermsBySlug(readTaxonomyDir(categoriesDir), 'slug-grouped');
351
408
  // Sort tags: highest count (usage frequency) first; ties broken by newest ULID (descending)
352
- const tags = dedupeBySlug(readTaxonomyDir(tagsDir).sort((a, b) => {
353
- const countDiff = (b.count ?? 0) - (a.count ?? 0);
354
- if (countDiff !== 0)
355
- return countDiff;
356
- return b.id < a.id ? -1 : b.id > a.id ? 1 : 0;
357
- }));
409
+ const tags = dedupeTermsBySlug(readTaxonomyDir(tagsDir), 'frequency');
358
410
  return { categories, tags };
359
411
  }
360
412
  /**
@@ -365,8 +417,9 @@ export function formatTaxonomiesHint(summary, options) {
365
417
  const maxCategories = options?.maxCategories ?? DEFAULT_MAX_CATEGORIES;
366
418
  const maxTags = options?.maxTags ?? DEFAULT_MAX_TAGS;
367
419
  const formatItem = (item) => {
368
- const formattedSlug = formatYamlScalar(item.slug);
369
- return item.slug.toLowerCase() === item.name.toLowerCase()
420
+ const decodedSlug = tryDecodeTaxonomyTerm(item.slug);
421
+ const formattedSlug = formatYamlScalar(decodedSlug);
422
+ return decodedSlug.trim().toLowerCase() === item.name.trim().toLowerCase()
370
423
  ? formattedSlug
371
424
  : `${formattedSlug} (${item.name})`;
372
425
  };
@@ -1 +1 @@
1
- {"version":3,"file":"taxonomies.js","sourceRoot":"","sources":["../../src/sync/taxonomies.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"taxonomies.js","sourceRoot":"","sources":["../../src/sync/taxonomies.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import fs from 'node:fs';
2
+ import type { CacheDatabase, SyncState } from '../../db/cache.js';
3
+ import type { Frontmatter } from '../../utils/frontmatter.js';
4
+ export interface ArticleCommitInput {
5
+ /** 26-character canonical ULID of the article */
6
+ id: string;
7
+ /** Final canonical relative file path (e.g. 'posts/published/20261113_...md') */
8
+ relPath: string;
9
+ /** Actual string content to write to disk in disk spelling */
10
+ diskContent: string;
11
+ /** Explicit local hash override (e.g. when preserving unpushed local edits) */
12
+ localHash?: string;
13
+ /** Canonical string content used for baseline hash (defaults to diskContent if omitted) */
14
+ canonicalContent?: string;
15
+ /** Frontmatter object for Layer A storage (remote-derived only, no synthetic values) */
16
+ frontmatter: Frontmatter;
17
+ /** Canonical body Markdown for Layer A storage */
18
+ bodyMarkdown: string;
19
+ /** Track 1 raw server revision token for base_snapshots.rev */
20
+ revForTransport: string;
21
+ /** Track 2 composite revision key for sync_state.remote_rev */
22
+ revForComparison: string;
23
+ /** Optional sync state flags (e.g. conflict flags, taxonomy hash) */
24
+ flags?: Partial<SyncState>;
25
+ /** When true, keeps existing frontmatter/body in base_snapshots and only updates baseline hash */
26
+ bumpBaselineHashOnly?: boolean;
27
+ /** Custom timestamp in epoch seconds (defaults to Math.floor(Date.now() / 1000)) */
28
+ savedAt?: number;
29
+ /** Whether to skip writing diskContent to disk (e.g. when already written or conflict quarantine only) */
30
+ skipDiskWrite?: boolean;
31
+ }
32
+ export interface ArticleCommitResult {
33
+ localHash: string;
34
+ baselineHash: string;
35
+ fullPath: string;
36
+ }
37
+ /**
38
+ * Centralized article commit function (Phase 0 Refactoring).
39
+ * Encapsulates the 4 core synchronization invariants:
40
+ * 1. localHash strictly matches SHA-256 of diskContent
41
+ * 2. baselineHash strictly matches SHA-256 of canonicalContent
42
+ * 3. frontmatter in base_snapshots stores remote-derived clean values (Layer A)
43
+ * 4. revForTransport and revForComparison are strictly separated between Track 1 and Track 2
44
+ */
45
+ export declare function commitArticleSnapshot(cache: CacheDatabase, workspaceRoot: string, input: ArticleCommitInput, customFs?: typeof fs): ArticleCommitResult;
46
+ //# sourceMappingURL=commit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit.d.ts","sourceRoot":"","sources":["../../../src/sync/workspace/commit.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAElE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAG9D,MAAM,WAAW,kBAAkB;IACjC,iDAAiD;IACjD,EAAE,EAAE,MAAM,CAAC;IACX,iFAAiF;IACjF,OAAO,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,WAAW,EAAE,MAAM,CAAC;IACpB,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2FAA2F;IAC3F,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,wFAAwF;IACxF,WAAW,EAAE,WAAW,CAAC;IACzB,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,eAAe,EAAE,MAAM,CAAC;IACxB,+DAA+D;IAC/D,gBAAgB,EAAE,MAAM,CAAC;IACzB,qEAAqE;IACrE,KAAK,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAC3B,kGAAkG;IAClG,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,oFAAoF;IACpF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0GAA0G;IAC1G,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,aAAa,EACpB,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,kBAAkB,EACzB,QAAQ,GAAE,OAAO,EAAO,GACvB,mBAAmB,CAwDrB"}
@@ -0,0 +1,85 @@
1
+ /*
2
+ * Copyright (C) 2026 SPORT-SERVICE RS★R
3
+ *
4
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ * of this software and associated documentation files (the "Software"), to deal
6
+ * in the Software without restriction, including without limitation the rights
7
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ * copies of the Software, and to permit persons to whom the Software is
9
+ * furnished to do so, subject to the following conditions:
10
+ *
11
+ * The above copyright notice and this permission notice shall be included in all
12
+ * copies or substantial portions of the Software.
13
+ *
14
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20
+ * SOFTWARE.
21
+ */
22
+ import fs from 'node:fs';
23
+ import path from 'node:path';
24
+ import { createBaseSnapshot } from '../../db/baseline.js';
25
+ import { calculateHash } from './index.js';
26
+ /**
27
+ * Centralized article commit function (Phase 0 Refactoring).
28
+ * Encapsulates the 4 core synchronization invariants:
29
+ * 1. localHash strictly matches SHA-256 of diskContent
30
+ * 2. baselineHash strictly matches SHA-256 of canonicalContent
31
+ * 3. frontmatter in base_snapshots stores remote-derived clean values (Layer A)
32
+ * 4. revForTransport and revForComparison are strictly separated between Track 1 and Track 2
33
+ */
34
+ export function commitArticleSnapshot(cache, workspaceRoot, input, customFs = fs) {
35
+ const fullPath = path.resolve(workspaceRoot, input.relPath);
36
+ const localHash = input.localHash ?? calculateHash(input.diskContent);
37
+ const baselineHash = input.canonicalContent ? calculateHash(input.canonicalContent) : localHash;
38
+ // 1. Disk mutation (unless caller opted out)
39
+ if (!input.skipDiskWrite) {
40
+ customFs.mkdirSync(path.dirname(fullPath), { recursive: true });
41
+ customFs.writeFileSync(fullPath, input.diskContent, 'utf8');
42
+ }
43
+ // 2. Atomic database transaction
44
+ const timestamp = input.savedAt ?? Math.floor(Date.now() / 1000);
45
+ cache.runTransaction(() => {
46
+ // Base snapshot update
47
+ if (input.bumpBaselineHashOnly) {
48
+ const existingBase = cache.getBaseSnapshot(input.id);
49
+ if (existingBase) {
50
+ cache.saveBaseSnapshot({
51
+ ...existingBase,
52
+ hash: baselineHash,
53
+ savedAt: timestamp,
54
+ });
55
+ }
56
+ }
57
+ else {
58
+ cache.saveBaseSnapshot(createBaseSnapshot({
59
+ id: input.id,
60
+ rev: input.revForTransport,
61
+ bodyMarkdown: input.bodyMarkdown,
62
+ frontmatter: input.frontmatter,
63
+ hash: baselineHash,
64
+ savedAt: timestamp,
65
+ }));
66
+ }
67
+ // Sync state update
68
+ cache.saveSyncState({
69
+ id: input.id,
70
+ localFilePath: input.relPath,
71
+ localHash,
72
+ remoteRev: input.revForComparison,
73
+ status: input.frontmatter.status,
74
+ slug: input.frontmatter.slug,
75
+ lastSyncedAt: timestamp,
76
+ ...input.flags,
77
+ });
78
+ });
79
+ return {
80
+ localHash,
81
+ baselineHash,
82
+ fullPath,
83
+ };
84
+ }
85
+ //# sourceMappingURL=commit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit.js","sourceRoot":"","sources":["../../../src/sync/workspace/commit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAqC3C;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACnC,KAAoB,EACpB,aAAqB,EACrB,KAAyB,EACzB,QAAQ,GAAc,EAAE;IAExB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACtE,MAAM,YAAY,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEhG,6CAA6C;IAC7C,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;QACzB,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,QAAQ,CAAC,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC9D,CAAC;IAED,iCAAiC;IACjC,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAEjE,KAAK,CAAC,cAAc,CAAC,GAAG,EAAE;QACxB,uBAAuB;QACvB,IAAI,KAAK,CAAC,oBAAoB,EAAE,CAAC;YAC/B,MAAM,YAAY,GAAG,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACrD,IAAI,YAAY,EAAE,CAAC;gBACjB,KAAK,CAAC,gBAAgB,CAAC;oBACrB,GAAG,YAAY;oBACf,IAAI,EAAE,YAAY;oBAClB,OAAO,EAAE,SAAS;iBACnB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,gBAAgB,CACpB,kBAAkB,CAAC;gBACjB,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,GAAG,EAAE,KAAK,CAAC,eAAe;gBAC1B,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,SAAS;aACnB,CAAC,CACH,CAAC;QACJ,CAAC;QAED,oBAAoB;QACpB,KAAK,CAAC,aAAa,CAAC;YAClB,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,aAAa,EAAE,KAAK,CAAC,OAAO;YAC5B,SAAS;YACT,SAAS,EAAE,KAAK,CAAC,gBAAgB;YACjC,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC,MAAM;YAChC,IAAI,EAAE,KAAK,CAAC,WAAW,CAAC,IAAI;YAC5B,YAAY,EAAE,SAAS;YACvB,GAAG,KAAK,CAAC,KAAK;SACf,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,SAAS;QACT,YAAY;QACZ,QAAQ;KACT,CAAC;AACJ,CAAC"}
@@ -38,4 +38,5 @@ export declare function quarantineLocalCopy(workspaceRoot: string, collection: s
38
38
  isForce?: boolean;
39
39
  existingCopyHash?: string | null;
40
40
  }): string | null;
41
+ export { commitArticleSnapshot, type ArticleCommitInput, type ArticleCommitResult, } from './commit.js';
41
42
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/sync/workspace/index.ts"],"names":[],"mappings":"AA4BA,uFAAuF;AACvF,eAAO,MAAM,gBAAgB,cAAc,CAAC;AAE5C;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAOlE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,GACT,MAAM,EAAE,CAiBV;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,KAAK,EAAE;IACL,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,EACD,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,GAC7B,MAAM,CAIR;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IACR,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC,GACA,MAAM,GAAG,IAAI,CAuCf"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/sync/workspace/index.ts"],"names":[],"mappings":"AA4BA,uFAAuF;AACvF,eAAO,MAAM,gBAAgB,cAAc,CAAC;AAE5C;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAOlE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,GACT,MAAM,EAAE,CAiBV;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,KAAK,EAAE;IACL,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,EACD,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,GAC7B,MAAM,CAIR;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IACR,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC,GACA,MAAM,GAAG,IAAI,CAuCf;AAED,OAAO,EACL,qBAAqB,EACrB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,GACzB,MAAM,aAAa,CAAC"}
@@ -121,4 +121,5 @@ export function quarantineLocalCopy(workspaceRoot, collection, sourceRelPath, co
121
121
  return null;
122
122
  }
123
123
  }
124
+ export { commitArticleSnapshot, } from './commit.js';
124
125
  //# sourceMappingURL=index.js.map