@bendyline/docblocks-cli 1.1.2 → 2.0.0

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 (110) hide show
  1. package/README.md +60 -88
  2. package/dist/commands/convert.d.ts +12 -2
  3. package/dist/commands/convert.d.ts.map +1 -1
  4. package/dist/commands/convert.js +272 -101
  5. package/dist/commands/convert.js.map +1 -1
  6. package/dist/commands/mcp.d.ts +1 -1
  7. package/dist/commands/mcp.d.ts.map +1 -1
  8. package/dist/commands/mcp.js +90 -4
  9. package/dist/commands/mcp.js.map +1 -1
  10. package/dist/commands/parse.js +1 -1
  11. package/dist/commands/parse.js.map +1 -1
  12. package/dist/commands/serve.d.ts +9 -1
  13. package/dist/commands/serve.d.ts.map +1 -1
  14. package/dist/commands/serve.js +209 -44
  15. package/dist/commands/serve.js.map +1 -1
  16. package/dist/commands/themes.js +1 -1
  17. package/dist/commands/themes.js.map +1 -1
  18. package/dist/commands/transforms.js +1 -1
  19. package/dist/commands/transforms.js.map +1 -1
  20. package/dist/commands/video.d.ts +8 -1
  21. package/dist/commands/video.d.ts.map +1 -1
  22. package/dist/commands/video.js +50 -30
  23. package/dist/commands/video.js.map +1 -1
  24. package/dist/contained-file.d.ts +8 -0
  25. package/dist/contained-file.d.ts.map +1 -0
  26. package/dist/contained-file.js +77 -0
  27. package/dist/contained-file.js.map +1 -0
  28. package/dist/index.js +1 -1
  29. package/dist/index.js.map +1 -1
  30. package/dist/mcp/agentic-tools.d.ts +16 -0
  31. package/dist/mcp/agentic-tools.d.ts.map +1 -0
  32. package/dist/mcp/agentic-tools.js +967 -0
  33. package/dist/mcp/agentic-tools.js.map +1 -0
  34. package/dist/mcp/artifact-store.d.ts +98 -0
  35. package/dist/mcp/artifact-store.d.ts.map +1 -0
  36. package/dist/mcp/artifact-store.js +542 -0
  37. package/dist/mcp/artifact-store.js.map +1 -0
  38. package/dist/mcp/authority.d.ts +53 -0
  39. package/dist/mcp/authority.d.ts.map +1 -0
  40. package/dist/mcp/authority.js +433 -0
  41. package/dist/mcp/authority.js.map +1 -0
  42. package/dist/mcp/conversion-service.d.ts +111 -0
  43. package/dist/mcp/conversion-service.d.ts.map +1 -0
  44. package/dist/mcp/conversion-service.js +512 -0
  45. package/dist/mcp/conversion-service.js.map +1 -0
  46. package/dist/mcp/discovery-tools.d.ts +4 -0
  47. package/dist/mcp/discovery-tools.d.ts.map +1 -0
  48. package/dist/mcp/discovery-tools.js +114 -0
  49. package/dist/mcp/discovery-tools.js.map +1 -0
  50. package/dist/mcp/document-service.d.ts +47 -0
  51. package/dist/mcp/document-service.d.ts.map +1 -0
  52. package/dist/mcp/document-service.js +424 -0
  53. package/dist/mcp/document-service.js.map +1 -0
  54. package/dist/mcp/error-result.d.ts +17 -0
  55. package/dist/mcp/error-result.d.ts.map +1 -0
  56. package/dist/mcp/error-result.js +82 -0
  57. package/dist/mcp/error-result.js.map +1 -0
  58. package/dist/mcp/intelligence.d.ts +15 -0
  59. package/dist/mcp/intelligence.d.ts.map +1 -0
  60. package/dist/mcp/intelligence.js +855 -0
  61. package/dist/mcp/intelligence.js.map +1 -0
  62. package/dist/mcp/output-bounds.d.ts +13 -0
  63. package/dist/mcp/output-bounds.d.ts.map +1 -0
  64. package/dist/mcp/output-bounds.js +61 -0
  65. package/dist/mcp/output-bounds.js.map +1 -0
  66. package/dist/mcp/preview-service.d.ts +54 -0
  67. package/dist/mcp/preview-service.d.ts.map +1 -0
  68. package/dist/mcp/preview-service.js +454 -0
  69. package/dist/mcp/preview-service.js.map +1 -0
  70. package/dist/mcp/progress.d.ts +18 -0
  71. package/dist/mcp/progress.d.ts.map +1 -0
  72. package/dist/mcp/progress.js +28 -0
  73. package/dist/mcp/progress.js.map +1 -0
  74. package/dist/mcp/prompts.d.ts +4 -0
  75. package/dist/mcp/prompts.d.ts.map +1 -0
  76. package/dist/mcp/prompts.js +124 -0
  77. package/dist/mcp/prompts.js.map +1 -0
  78. package/dist/mcp/rendered-conversion.d.ts +34 -0
  79. package/dist/mcp/rendered-conversion.d.ts.map +1 -0
  80. package/dist/mcp/rendered-conversion.js +364 -0
  81. package/dist/mcp/rendered-conversion.js.map +1 -0
  82. package/dist/mcp/server.d.ts +67 -10
  83. package/dist/mcp/server.d.ts.map +1 -1
  84. package/dist/mcp/server.js +227 -496
  85. package/dist/mcp/server.js.map +1 -1
  86. package/dist/preview-policy.d.ts +8 -0
  87. package/dist/preview-policy.d.ts.map +1 -0
  88. package/dist/preview-policy.js +85 -0
  89. package/dist/preview-policy.js.map +1 -0
  90. package/dist/render-html.d.ts +8 -0
  91. package/dist/render-html.d.ts.map +1 -1
  92. package/dist/render-html.js +32 -7
  93. package/dist/render-html.js.map +1 -1
  94. package/dist/version.d.ts +4 -0
  95. package/dist/version.d.ts.map +1 -1
  96. package/dist/version.js +95 -6
  97. package/dist/version.js.map +1 -1
  98. package/package.json +11 -11
  99. package/dist/converters/docx-to-md.d.ts +0 -10
  100. package/dist/converters/docx-to-md.d.ts.map +0 -1
  101. package/dist/converters/docx-to-md.js +0 -17
  102. package/dist/converters/docx-to-md.js.map +0 -1
  103. package/dist/converters/pdf-to-md.d.ts +0 -14
  104. package/dist/converters/pdf-to-md.d.ts.map +0 -1
  105. package/dist/converters/pdf-to-md.js +0 -51
  106. package/dist/converters/pdf-to-md.js.map +0 -1
  107. package/dist/converters/pptx-to-md.d.ts +0 -13
  108. package/dist/converters/pptx-to-md.d.ts.map +0 -1
  109. package/dist/converters/pptx-to-md.js +0 -67
  110. package/dist/converters/pptx-to-md.js.map +0 -1
@@ -1,8 +1,10 @@
1
1
  /**
2
2
  * convert command
3
3
  *
4
- * Reads a markdown file, ZIP/DBK container, or folder and exports to
5
- * supported formats: DOCX, PPTX, PDF, HTML, and container ZIP (.dbk).
4
+ * Reads any input supported by the linked Squisq CLI and exports through its
5
+ * canonical format registry. The historical default set remains DOCX, PPTX,
6
+ * PDF, HTML, and DBK; callers may explicitly request any export-capable
7
+ * registry format.
6
8
  *
7
9
  * Wraps the same logic as squisq-cli's convert command, reusing the
8
10
  * underlying squisq libraries directly.
@@ -10,149 +12,302 @@
10
12
  import { writeFile, mkdir, stat } from 'node:fs/promises';
11
13
  import { dirname, basename, extname, join, resolve } from 'node:path';
12
14
  import { Command } from 'commander';
13
- const ALL_FORMATS = ['docx', 'pptx', 'pdf', 'html', 'dbk'];
14
- function parseFormats(value) {
15
- const requested = value.split(',').map((s) => s.trim().toLowerCase());
16
- const valid = [];
17
- for (const r of requested) {
18
- if (ALL_FORMATS.includes(r)) {
19
- valid.push(r);
20
- }
21
- else {
22
- console.warn(`Unknown format "${r}" — skipping. Valid: ${ALL_FORMATS.join(', ')}`);
23
- }
24
- }
25
- if (valid.length === 0) {
26
- throw new Error(`No valid formats specified. Valid: ${ALL_FORMATS.join(', ')}`);
27
- }
28
- return valid;
29
- }
15
+ const DEFAULT_FORMATS = ['docx', 'pptx', 'pdf', 'html', 'dbk'];
30
16
  export async function runConvert(inputPath, opts) {
17
+ throwIfAborted(opts.signal);
31
18
  const resolvedInput = resolve(inputPath);
32
- const formats = opts.formats ? parseFormats(opts.formats) : [...ALL_FORMATS];
33
19
  const outputDir = opts.outputDir ? resolve(opts.outputDir) : dirname(resolvedInput);
34
20
  const inputBasename = basename(resolvedInput);
35
21
  const inputExt = extname(inputBasename);
36
22
  const baseName = inputExt ? inputBasename.slice(0, -inputExt.length) : inputBasename;
37
- await mkdir(outputDir, { recursive: true });
38
- // Validate theme
39
- if (opts.theme) {
40
- const { getAvailableThemes } = await import('@bendyline/squisq/schemas');
41
- const themes = getAvailableThemes();
42
- if (!themes.includes(opts.theme)) {
43
- throw new Error(`Unknown theme "${opts.theme}". Available: ${themes.join(', ')}`);
44
- }
23
+ const squisq = await import('@bendyline/squisq-cli/api');
24
+ throwIfAborted(opts.signal);
25
+ const registry = opts.registry ?? squisq.createCliRegistry();
26
+ const exportableIds = registry
27
+ .list()
28
+ .filter((definition) => definition.exportDoc !== undefined)
29
+ .map((definition) => definition.id);
30
+ const exportable = new Set(exportableIds);
31
+ const requested = opts.formats
32
+ ? opts.formats
33
+ .split(',')
34
+ .map((format) => format.trim().toLowerCase())
35
+ .filter(Boolean)
36
+ : [...DEFAULT_FORMATS];
37
+ const formats = requested.filter((format) => exportable.has(format));
38
+ const unknown = requested.filter((format) => !exportable.has(format));
39
+ if (unknown.length > 0) {
40
+ console.warn(`Unknown or non-exportable format${unknown.length === 1 ? '' : 's'} "${unknown.join(', ')}" — skipping. Valid: ${exportableIds.join(', ')}`);
41
+ }
42
+ if (formats.length === 0) {
43
+ throw new squisq.ConversionError('unknown-format', `No valid formats specified. Valid: ${exportableIds.join(', ')}`, {
44
+ format: requested[0],
45
+ hint: 'Choose a format reported by the linked Squisq CLI registry.',
46
+ });
45
47
  }
48
+ await mkdir(outputDir, { recursive: true });
49
+ throwIfAborted(opts.signal);
46
50
  // Validate transform
47
51
  if (opts.transform) {
48
52
  const { getTransformStyleIds } = await import('@bendyline/squisq/transform');
53
+ throwIfAborted(opts.signal);
49
54
  const styles = getTransformStyleIds();
50
55
  if (!styles.includes(opts.transform)) {
51
56
  throw new Error(`Unknown transform style "${opts.transform}". Available: ${styles.join(', ')}`);
52
57
  }
53
58
  }
54
59
  console.error(`Reading: ${resolvedInput}`);
55
- const { readInput } = await import('@bendyline/squisq-cli/api');
56
- const result = await readInput(resolvedInput);
60
+ const result = await squisq.readInput(resolvedInput, { signal: opts.signal });
61
+ throwIfAborted(opts.signal);
57
62
  const { container } = result;
58
- if (!result.markdownDoc) {
59
- throw new Error('Convert command requires a markdown document. JSON Doc input is not supported for convert use the video command instead.');
60
- }
61
- // Apply transform if requested
63
+ // Keep DocBlocks' source-preserving Markdown transform projection for
64
+ // authored Markdown. JSON Doc inputs have no Markdown source to protect, so
65
+ // they use the registry's native transform path below.
62
66
  let exportMarkdownDoc = result.markdownDoc;
63
- if (opts.transform) {
64
- exportMarkdownDoc = await applyTransformToMarkdown(result.markdownDoc, container, opts.transform, opts.theme);
67
+ if (opts.transform && exportMarkdownDoc) {
68
+ exportMarkdownDoc = await applyTransformToMarkdown(exportMarkdownDoc, container, opts.transform, opts.theme);
69
+ throwIfAborted(opts.signal);
65
70
  console.error(` Applied transform: ${opts.transform}`);
66
71
  }
67
- const themeId = opts.theme;
72
+ const source = exportMarkdownDoc
73
+ ? { kind: 'markdown', markdown: exportMarkdownDoc, container, baseName }
74
+ : { kind: 'doc', doc: result.doc, container, baseName };
68
75
  const outputFiles = [];
69
76
  for (const format of formats) {
70
- const outPath = join(outputDir, `${baseName}.${format}`);
71
- const buf = await exportToFormat(format, exportMarkdownDoc, container, baseName, themeId);
72
- await writeFile(outPath, buf);
77
+ throwIfAborted(opts.signal);
78
+ const conversion = await squisq.convert(source, format, {
79
+ signal: opts.signal,
80
+ registry,
81
+ title: baseName,
82
+ themeId: opts.theme,
83
+ ...(!exportMarkdownDoc && opts.transform ? { transformStyle: opts.transform } : {}),
84
+ });
85
+ throwIfAborted(opts.signal);
86
+ const suggestedFilename = basename(conversion.suggestedFilename);
87
+ const outPath = join(outputDir, suggestedFilename);
88
+ await writeFile(outPath, conversion.bytes);
89
+ throwIfAborted(opts.signal);
73
90
  const info = await stat(outPath);
74
- outputFiles.push({ path: outPath, format, size: info.size });
91
+ throwIfAborted(opts.signal);
92
+ outputFiles.push({
93
+ path: outPath,
94
+ format,
95
+ size: info.size,
96
+ mimeType: conversion.mimeType,
97
+ suggestedFilename: conversion.suggestedFilename,
98
+ warnings: [...conversion.warnings],
99
+ });
100
+ for (const warning of conversion.warnings) {
101
+ console.error(` Warning [${format}]: ${warning}`);
102
+ }
75
103
  console.error(` ✓ ${outPath}`);
76
104
  }
77
105
  console.error('Done.');
78
106
  return { outputFiles };
79
107
  }
80
- async function exportToFormat(format, markdownDoc, container, baseName, themeId) {
81
- switch (format) {
82
- case 'docx': {
83
- const { markdownDocToDocx } = await import('@bendyline/squisq-formats/docx');
84
- const buf = await markdownDocToDocx(markdownDoc, { themeId });
85
- return Buffer.from(buf);
86
- }
87
- case 'pptx': {
88
- const { markdownDocToPptx } = await import('@bendyline/squisq-formats/pptx');
89
- const images = await collectContainerImages(container);
90
- const buf = await markdownDocToPptx(markdownDoc, { themeId, images });
91
- return Buffer.from(buf);
92
- }
93
- case 'pdf': {
94
- const { markdownDocToPdf } = await import('@bendyline/squisq-formats/pdf');
95
- const buf = await markdownDocToPdf(markdownDoc, { themeId });
96
- return Buffer.from(buf);
97
- }
98
- case 'html': {
99
- const { markdownToDoc } = await import('@bendyline/squisq/doc');
100
- const { docToHtml, collectImagePaths } = await import('@bendyline/squisq-formats/html');
101
- const { PLAYER_BUNDLE } = await import('@bendyline/squisq-react/standalone-source');
102
- const doc = markdownToDoc(markdownDoc);
103
- const imagePaths = collectImagePaths(doc);
104
- const images = new Map();
105
- for (const imgPath of imagePaths) {
106
- const data = await container.readFile(imgPath);
107
- if (data) {
108
- images.set(imgPath, data);
109
- }
110
- }
111
- return docToHtml(doc, {
112
- playerScript: PLAYER_BUNDLE,
113
- images,
114
- title: baseName,
115
- mode: 'static',
116
- themeId,
117
- });
118
- }
119
- case 'dbk': {
120
- const { containerToZip } = await import('@bendyline/squisq-formats/container');
121
- const blob = await containerToZip(container);
122
- const buf = await blob.arrayBuffer();
123
- return Buffer.from(buf);
124
- }
125
- }
108
+ function throwIfAborted(signal) {
109
+ if (!signal?.aborted)
110
+ return;
111
+ if (signal.reason !== undefined)
112
+ throw signal.reason;
113
+ const error = new Error('Document conversion was cancelled');
114
+ error.name = 'AbortError';
115
+ throw error;
126
116
  }
127
117
  /**
128
118
  * Apply a transform style to a MarkdownDocument.
129
119
  */
130
120
  export async function applyTransformToMarkdown(markdownDoc, container, transformStyle, themeId) {
131
121
  const { markdownToDoc, docToMarkdown } = await import('@bendyline/squisq/doc');
122
+ const { readFrontmatterThemeId } = await import('@bendyline/squisq/markdown');
132
123
  const { applyTransform, extractDocImages } = await import('@bendyline/squisq/transform');
133
124
  const doc = markdownToDoc(markdownDoc);
134
125
  const images = extractDocImages(doc.blocks);
135
- const result = applyTransform(doc, transformStyle, { themeId, images });
136
- return docToMarkdown(result.doc);
126
+ const effectiveTheme = themeId ?? readFrontmatterThemeId(markdownDoc.frontmatter);
127
+ const result = applyTransform(doc, transformStyle, { themeId: effectiveTheme, images });
128
+ const projected = projectTransformOntoMarkdownSource(doc, result.doc);
129
+ const transformedMarkdown = docToMarkdown(projected);
130
+ const resolvedTheme = effectiveTheme ?? result.doc.themeId ?? doc.themeId;
131
+ if (!resolvedTheme)
132
+ return transformedMarkdown;
133
+ return {
134
+ ...transformedMarkdown,
135
+ frontmatter: {
136
+ ...(transformedMarkdown.frontmatter ?? {}),
137
+ 'squisq-theme': resolvedTheme,
138
+ },
139
+ };
137
140
  }
138
- async function collectContainerImages(container) {
139
- const images = new Map();
140
- const files = await container.listFiles();
141
- for (const file of files) {
142
- if (/\.(jpg|jpeg|png|gif|webp|svg|bmp|avif)$/i.test(file.path)) {
143
- const data = await container.readFile(file.path);
144
- if (data) {
145
- images.set(file.path, data);
141
+ /**
142
+ * Squisq transforms produce a presentation Doc whose generated highlight
143
+ * blocks intentionally replace source blocks. Those generated blocks do not
144
+ * carry Markdown authoring nodes, so serializing the transformed Doc directly
145
+ * can drop complete sections. Project each selected visual template back onto
146
+ * its source block instead: the style remains material while the authored
147
+ * headings, body content, media references, and hierarchy stay intact.
148
+ */
149
+ function projectTransformOntoMarkdownSource(source, transformed) {
150
+ const candidatesBySource = new Map();
151
+ const timedSourceBlocks = collectTransformSourceBlocks(source.blocks).sort((left, right) => left.startTime - right.startTime);
152
+ const collectCandidates = (blocks) => {
153
+ for (const block of blocks) {
154
+ const provenance = block;
155
+ const sourceBlockId = provenance.sourceBlockId ??
156
+ findSourceBlockAtTime(timedSourceBlocks, provenance.sourceStartTime)?.id;
157
+ if (sourceBlockId && block.template) {
158
+ const candidates = candidatesBySource.get(sourceBlockId) ?? [];
159
+ candidates.push(block);
160
+ candidatesBySource.set(sourceBlockId, candidates);
146
161
  }
162
+ if (block.children)
163
+ collectCandidates(block.children);
164
+ }
165
+ };
166
+ collectCandidates(transformed.blocks);
167
+ const projectBlock = (block) => {
168
+ const children = block.children?.map(projectBlock);
169
+ const visual = selectVisualCandidate(candidatesBySource.get(block.id));
170
+ if (!visual || !block.sourceHeading) {
171
+ return { ...block, ...(children ? { children } : {}) };
172
+ }
173
+ const { autoTemplate: _autoTemplate, ...sourceBlock } = block;
174
+ void _autoTemplate;
175
+ const templateOverrides = {
176
+ ...visual.overrides,
177
+ ...(block.sourceHeading.templateAnnotation?.params ?? {}),
178
+ ...(block.templateOverrides ?? {}),
179
+ };
180
+ const sourceHeading = {
181
+ ...block.sourceHeading,
182
+ templateAnnotation: {
183
+ ...(block.sourceHeading.templateAnnotation ?? {}),
184
+ template: visual.block.template,
185
+ ...(Object.keys(templateOverrides).length > 0 ? { params: templateOverrides } : {}),
186
+ },
187
+ };
188
+ return {
189
+ ...sourceBlock,
190
+ ...(children ? { children } : {}),
191
+ template: visual.block.template,
192
+ templateOverrides,
193
+ sourceHeading,
194
+ ...(block.transition || visual.block.transition
195
+ ? { transition: block.transition ?? visual.block.transition }
196
+ : {}),
197
+ };
198
+ };
199
+ return {
200
+ ...source,
201
+ blocks: source.blocks.map(projectBlock),
202
+ themeId: transformed.themeId ?? source.themeId,
203
+ };
204
+ }
205
+ function collectTransformSourceBlocks(blocks) {
206
+ const sourceBlocks = [];
207
+ for (const block of blocks) {
208
+ if (block.children && block.children.length > 0) {
209
+ if (!block.contents || block.contents.length === 0)
210
+ sourceBlocks.push(block);
211
+ sourceBlocks.push(...collectTransformSourceBlocks(block.children));
212
+ }
213
+ else {
214
+ sourceBlocks.push(block);
215
+ }
216
+ }
217
+ return sourceBlocks;
218
+ }
219
+ function findSourceBlockAtTime(sourceBlocks, sourceStartTime) {
220
+ if (sourceStartTime === undefined)
221
+ return undefined;
222
+ let match;
223
+ for (const block of sourceBlocks) {
224
+ if (block.startTime > sourceStartTime)
225
+ break;
226
+ match = block;
227
+ }
228
+ return match;
229
+ }
230
+ function selectVisualCandidate(candidates) {
231
+ if (!candidates || candidates.length === 0)
232
+ return undefined;
233
+ for (const candidate of candidates) {
234
+ if (candidate.id.startsWith('transform-header-') ||
235
+ candidate.id.startsWith('transform-img-') ||
236
+ candidate.template === 'sectionHeader') {
237
+ continue;
147
238
  }
239
+ const overrides = serializeVisualInputs(candidate);
240
+ if (overrides)
241
+ return { block: candidate, overrides };
148
242
  }
149
- return images;
243
+ return undefined;
244
+ }
245
+ function serializeVisualInputs(block) {
246
+ const input = block;
247
+ switch (block.template) {
248
+ case 'title':
249
+ return serializeStringInputs(input, ['title'], ['subtitle', 'backgroundColor']);
250
+ case 'statHighlight':
251
+ return serializeStringInputs(input, ['stat', 'description'], ['detail', 'colorScheme']);
252
+ case 'quote':
253
+ return serializeStringInputs(input, ['quote'], ['attribution']);
254
+ case 'fullBleedQuote':
255
+ return serializeStringInputs(input, ['text'], ['colorScheme']);
256
+ case 'factCard':
257
+ return serializeStringInputs(input, ['fact', 'explanation'], ['source']);
258
+ case 'definitionCard':
259
+ return serializeStringInputs(input, ['term', 'definition'], ['origin', 'colorScheme']);
260
+ case 'dateEvent':
261
+ return serializeStringInputs(input, ['date', 'description'], ['footer', 'mood']);
262
+ case 'twoColumn': {
263
+ const left = serializeLabeledPair(input.left);
264
+ const right = serializeLabeledPair(input.right);
265
+ if (!left || !right)
266
+ return undefined;
267
+ return {
268
+ left,
269
+ right,
270
+ ...(serializeStringInputs(input, [], ['header', 'leftColor', 'rightColor']) ?? {}),
271
+ };
272
+ }
273
+ default:
274
+ // Some template inputs (lists, images, tables, and custom templates)
275
+ // are structured and cannot be represented losslessly in one inline
276
+ // annotation. Keep their source Markdown unchanged instead of emitting
277
+ // a visually empty or corrupt template block.
278
+ return undefined;
279
+ }
280
+ }
281
+ function serializeStringInputs(input, required, optional) {
282
+ const serialized = {};
283
+ for (const key of required) {
284
+ const value = input[key];
285
+ if (typeof value !== 'string')
286
+ return undefined;
287
+ serialized[key] = value;
288
+ }
289
+ for (const key of optional) {
290
+ const value = input[key];
291
+ if (typeof value === 'string')
292
+ serialized[key] = value;
293
+ }
294
+ return serialized;
295
+ }
296
+ function serializeLabeledPair(value) {
297
+ if (!value || typeof value !== 'object' || Array.isArray(value))
298
+ return undefined;
299
+ const pair = value;
300
+ if (typeof pair.label !== 'string')
301
+ return undefined;
302
+ return typeof pair.sublabel === 'string' && pair.sublabel
303
+ ? `${pair.label}|${pair.sublabel}`
304
+ : pair.label;
150
305
  }
151
306
  export const convertCommand = new Command('convert')
152
- .description('Convert a markdown document to DOCX, PPTX, PDF, HTML, and DBK container formats')
153
- .argument('<input>', 'Path to .md file, .zip/.dbk container, or folder')
307
+ .description('Convert a document through the linked Squisq format registry')
308
+ .argument('<input>', 'Path to a supported document, .zip/.dbk container, or folder')
154
309
  .option('-o, --output-dir <dir>', 'Output directory (default: same as input)')
155
- .option('-f, --formats <list>', `Comma-separated formats to produce (default: all). Valid: ${ALL_FORMATS.join(', ')}`)
310
+ .option('-f, --formats <list>', `Comma-separated linked Squisq export formats (default: ${DEFAULT_FORMATS.join(', ')})`)
156
311
  .option('-t, --theme <id>', 'Squisq theme ID to apply (e.g., documentary, cinematic, bold)')
157
312
  .option('--transform <style>', 'Transform style to apply before export (e.g., documentary, magazine, minimal)')
158
313
  .action(async (inputPath, opts) => {
@@ -162,7 +317,23 @@ export const convertCommand = new Command('convert')
162
317
  catch (err) {
163
318
  const message = err instanceof Error ? err.message : String(err);
164
319
  console.error(`Error: ${message}`);
320
+ if (isConversionErrorMetadata(err)) {
321
+ console.error(` Code: ${err.code}${err.format ? ` (${err.format})` : ''}`);
322
+ if (err.hint)
323
+ console.error(` Hint: ${err.hint}`);
324
+ }
165
325
  process.exitCode = 1;
166
326
  }
167
327
  });
328
+ function isConversionErrorMetadata(error) {
329
+ if (!(error instanceof Error))
330
+ return false;
331
+ const candidate = error;
332
+ if (typeof candidate.code !== 'string')
333
+ return false;
334
+ if (candidate.format !== undefined && typeof candidate.format !== 'string') {
335
+ return false;
336
+ }
337
+ return candidate.hint === undefined || typeof candidate.hint === 'string';
338
+ }
168
339
  //# sourceMappingURL=convert.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../src/commands/convert.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../src/commands/convert.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@
5
5
  * docblocks mcp
6
6
  *
7
7
  * For Claude Desktop, add to your config:
8
- * { "mcpServers": { "docblocks": { "command": "npx", "args": ["docblocks", "mcp"] } } }
8
+ * { "mcpServers": { "docblocks": { "command": "npx", "args": ["-y", "@bendyline/docblocks-cli", "mcp"] } } }
9
9
  */
10
10
  import { Command } from 'commander';
11
11
  export declare const mcpCommand: Command;
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,eAAO,MAAM,UAAU,SASnB,CAAC"}
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,UAAU,SAwJpB,CAAC"}
@@ -5,16 +5,102 @@
5
5
  * docblocks mcp
6
6
  *
7
7
  * For Claude Desktop, add to your config:
8
- * { "mcpServers": { "docblocks": { "command": "npx", "args": ["docblocks", "mcp"] } } }
8
+ * { "mcpServers": { "docblocks": { "command": "npx", "args": ["-y", "@bendyline/docblocks-cli", "mcp"] } } }
9
9
  */
10
+ import process from 'node:process';
10
11
  import { Command } from 'commander';
12
+ import { MCP_ARTIFACT_STORE_LIMITS } from '../mcp/artifact-store.js';
13
+ import { MCP_FILE_AUTHORITY_LIMITS } from '../mcp/authority.js';
11
14
  export const mcpCommand = new Command('mcp')
12
15
  .description('Start an MCP server over stdio for AI-assisted document operations')
13
- .action(async () => {
16
+ .option('--allow-read <dir...>', 'allow MCP tools to read below these directories')
17
+ .option('--allow-write <dir...>', 'allow MCP tools to write below these directories')
18
+ .option('--max-concurrency <count>', 'maximum simultaneous expensive tools', '2')
19
+ .option('--operation-timeout-ms <milliseconds>', 'runtime budget for one expensive tool', '120000')
20
+ .option('--max-input-bytes <bytes>', 'maximum bytes read from one granted source file', '104857600')
21
+ .option('--max-artifact-bytes <bytes>', 'maximum bytes in one generated artifact', '524288000')
22
+ .option('--max-artifact-total-bytes <bytes>', 'maximum generated artifact bytes per session', '1073741824')
23
+ .option('--max-artifacts <count>', 'maximum generated artifacts per session', '64')
24
+ .option('--artifact-ttl-ms <milliseconds>', 'generated artifact lifetime', '1800000')
25
+ .option('--max-resource-bytes <bytes>', 'maximum artifact bytes returned as an MCP resource', '26214400')
26
+ .option('--max-report-bytes <bytes>', 'maximum stored conversion report bytes', '8388608')
27
+ .option('--max-report-total-bytes <bytes>', 'maximum stored conversion report bytes per session', '67108864')
28
+ .action(async (opts) => {
14
29
  const { createMcpServer } = await import('../mcp/server.js');
15
30
  const { StdioServerTransport } = await import('@modelcontextprotocol/sdk/server/stdio.js');
16
- const server = createMcpServer();
31
+ const maxConcurrentOperations = Number(opts.maxConcurrency);
32
+ if (!Number.isSafeInteger(maxConcurrentOperations) ||
33
+ maxConcurrentOperations < 1 ||
34
+ maxConcurrentOperations > 32) {
35
+ throw new Error('--max-concurrency must be an integer between 1 and 32');
36
+ }
37
+ const operationTimeoutMs = Number(opts.operationTimeoutMs);
38
+ if (!Number.isSafeInteger(operationTimeoutMs) ||
39
+ operationTimeoutMs < 1000 ||
40
+ operationTimeoutMs > 30 * 60 * 1000) {
41
+ throw new Error('--operation-timeout-ms must be between 1000 and 1800000');
42
+ }
43
+ const server = createMcpServer({
44
+ readRoots: opts.allowRead ?? [],
45
+ writeRoots: opts.allowWrite ?? [],
46
+ maxConcurrentOperations,
47
+ operationTimeoutMs,
48
+ maxInputFileBytes: boundedIntegerOption('--max-input-bytes', opts.maxInputBytes, MCP_FILE_AUTHORITY_LIMITS.maxInputFileBytes),
49
+ maxArtifactBytes: boundedIntegerOption('--max-artifact-bytes', opts.maxArtifactBytes, MCP_ARTIFACT_STORE_LIMITS.maxArtifactBytes),
50
+ maxArtifactTotalBytes: boundedIntegerOption('--max-artifact-total-bytes', opts.maxArtifactTotalBytes, MCP_ARTIFACT_STORE_LIMITS.maxArtifactTotalBytes),
51
+ maxArtifactCount: boundedIntegerOption('--max-artifacts', opts.maxArtifacts, MCP_ARTIFACT_STORE_LIMITS.maxArtifactCount),
52
+ artifactTtlMs: boundedIntegerOption('--artifact-ttl-ms', opts.artifactTtlMs, MCP_ARTIFACT_STORE_LIMITS.artifactTtlMs),
53
+ maxArtifactResourceBytes: boundedIntegerOption('--max-resource-bytes', opts.maxResourceBytes, MCP_ARTIFACT_STORE_LIMITS.maxArtifactResourceBytes),
54
+ maxArtifactReportBytes: boundedIntegerOption('--max-report-bytes', opts.maxReportBytes, MCP_ARTIFACT_STORE_LIMITS.maxArtifactReportBytes),
55
+ maxArtifactReportTotalBytes: boundedIntegerOption('--max-report-total-bytes', opts.maxReportTotalBytes, MCP_ARTIFACT_STORE_LIMITS.maxArtifactReportTotalBytes),
56
+ });
17
57
  const transport = new StdioServerTransport();
18
- await server.connect(transport);
58
+ let markDisconnected = () => undefined;
59
+ const disconnected = new Promise((resolve) => {
60
+ markDisconnected = resolve;
61
+ });
62
+ const onInputClosed = () => markDisconnected();
63
+ let exitSignal = null;
64
+ const onSigint = () => {
65
+ exitSignal = 'SIGINT';
66
+ markDisconnected();
67
+ };
68
+ const onSigterm = () => {
69
+ exitSignal = 'SIGTERM';
70
+ markDisconnected();
71
+ };
72
+ const previousTransportClose = transport.onclose;
73
+ transport.onclose = () => {
74
+ previousTransportClose?.();
75
+ markDisconnected();
76
+ };
77
+ process.stdin.once('end', onInputClosed);
78
+ process.stdin.once('close', onInputClosed);
79
+ process.once('SIGINT', onSigint);
80
+ process.once('SIGTERM', onSigterm);
81
+ try {
82
+ await server.connect(transport);
83
+ if (process.stdin.readableEnded || process.stdin.destroyed)
84
+ markDisconnected();
85
+ await disconnected;
86
+ }
87
+ finally {
88
+ process.stdin.off('end', onInputClosed);
89
+ process.stdin.off('close', onInputClosed);
90
+ process.off('SIGINT', onSigint);
91
+ process.off('SIGTERM', onSigterm);
92
+ await server.close();
93
+ if (exitSignal === 'SIGINT')
94
+ process.exitCode = 130;
95
+ if (exitSignal === 'SIGTERM')
96
+ process.exitCode = 143;
97
+ }
19
98
  });
99
+ function boundedIntegerOption(name, value, maximum) {
100
+ const parsed = Number(value);
101
+ if (!Number.isSafeInteger(parsed) || parsed < 1 || parsed > maximum) {
102
+ throw new Error(`${name} must be an integer between 1 and ${maximum}`);
103
+ }
104
+ return parsed;
105
+ }
20
106
  //# sourceMappingURL=mcp.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC;KACzC,WAAW,CAAC,oEAAoE,CAAC;KACjF,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC7D,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,2CAA2C,CAAC,CAAC;IAE3F,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ import { resolve } from 'node:path';
6
6
  import { Command } from 'commander';
7
7
  export const parseCommand = new Command('parse')
8
8
  .description('Parse a markdown file and print its structure as JSON')
9
- .argument('<input>', 'Path to a .md file')
9
+ .argument('<input>', 'Path to UTF-8 Markdown content')
10
10
  .action(async (inputPath) => {
11
11
  try {
12
12
  const resolvedInput = resolve(inputPath);
@@ -1 +1 @@
1
- {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/commands/parse.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,uDAAuD,CAAC;KACpE,QAAQ,CAAC,SAAS,EAAE,oBAAoB,CAAC;KACzC,MAAM,CAAC,KAAK,EAAE,SAAiB,EAAE,EAAE;IAClC,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;QACrE,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QAE3C,wBAAwB;QACxB,MAAM,KAAK,GAAG;YACZ,YAAY,EAAE,CAAC;YACf,cAAc,EAAE,CAAC;YACjB,UAAU,EAAE,WAAW,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC;SAC9C,CAAC;QAEF,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;YACzB,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;gBACxC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;oBAAE,KAAK,CAAC,YAAY,EAAE,CAAC;gBAClD,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;oBAAE,KAAK,CAAC,cAAc,EAAE,CAAC;YACxD,CAAC;QACH,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACzF,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/commands/parse.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,uDAAuD,CAAC;KACpE,QAAQ,CAAC,SAAS,EAAE,gCAAgC,CAAC;KACrD,MAAM,CAAC,KAAK,EAAE,SAAiB,EAAE,EAAE;IAClC,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;QACrE,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QAE3C,wBAAwB;QACxB,MAAM,KAAK,GAAG;YACZ,YAAY,EAAE,CAAC;YACf,cAAc,EAAE,CAAC;YACjB,UAAU,EAAE,WAAW,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC;SAC9C,CAAC;QAEF,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;YACzB,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;gBACxC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;oBAAE,KAAK,CAAC,YAAY,EAAE,CAAC;gBAClD,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;oBAAE,KAAK,CAAC,cAAc,EAAE,CAAC;YACxD,CAAC;QACH,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACzF,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC,CAAC,CAAC"}