@bendyline/docblocks-cli 2.3.3 → 2.4.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.
package/README.md CHANGED
@@ -54,6 +54,9 @@ docblocks convert report.docx --formats md,pdf,pptx --output-dir ./exports
54
54
  # Render MP4 with explicit media controls
55
55
  docblocks video story.md --quality high --orientation portrait
56
56
 
57
+ # Render the Dashboard rendition to a square image with accent cards
58
+ docblocks convert report.md --formats png --image-resolution square --image-style accent
59
+
57
60
  # Discover authoring vocabulary from linked Squisq
58
61
  docblocks themes
59
62
  docblocks transforms
@@ -93,9 +96,10 @@ The package root is a side-effect-free programmatic API for `runBuild`, `runConv
93
96
  the separate `docblocks` bin entry.
94
97
 
95
98
  The live linked registry currently covers Markdown, DOCX, PDF, PPTX, XLSX, CSV,
96
- HTML, HTML ZIP, EPUB, DBK, MP4, and GIF. Direction varies by format, so use the
97
- CLI reference or MCP `list_formats` rather than assuming every format imports.
99
+ HTML, HTML ZIP, EPUB, DBK, MP4, GIF, and PNG. Direction varies by format, so use
100
+ the CLI reference or MCP `list_formats` rather than assuming every format imports.
98
101
 
99
102
  MP4/GIF rendering requires Chromium and FFmpeg. Install Chromium with
100
103
  `npx playwright install chromium`; Squisq resolves FFmpeg from `SQUISQ_FFMPEG`,
101
- `PATH`, or `ffmpeg-static`, in that order.
104
+ `PATH`, or `ffmpeg-static`, in that order. PNG renders the document's Dashboard
105
+ rendition to a single image and needs Chromium only.
@@ -15,11 +15,11 @@ This notice is included in the published npm tarball. Transitive packages instal
15
15
  | Package | Version | License | Source |
16
16
  | --- | --- | --- | --- |
17
17
  | @antfu/install-pkg | 1.1.0 | MIT | https://github.com/antfu/install-pkg |
18
- | @bendyline/squisq | 2.7.0 | MIT | https://github.com/bendyline/squisq |
19
- | @bendyline/squisq-cli | 2.5.2 | MIT | https://github.com/bendyline/squisq |
20
- | @bendyline/squisq-formats | 2.4.1 | MIT | https://github.com/bendyline/squisq |
21
- | @bendyline/squisq-react | 2.7.0 | MIT | https://github.com/bendyline/squisq |
22
- | @bendyline/squisq-video | 2.2.11 | MIT | https://github.com/bendyline/squisq |
18
+ | @bendyline/squisq | 2.8.0 | MIT | https://github.com/bendyline/squisq |
19
+ | @bendyline/squisq-cli | 2.6.0 | MIT | https://github.com/bendyline/squisq |
20
+ | @bendyline/squisq-formats | 2.4.5 | MIT | https://github.com/bendyline/squisq |
21
+ | @bendyline/squisq-react | 2.8.0 | MIT | https://github.com/bendyline/squisq |
22
+ | @bendyline/squisq-video | 2.3.0 | MIT | https://github.com/bendyline/squisq |
23
23
  | @braintree/sanitize-url | 7.1.2 | MIT | https://github.com/braintree/sanitize-url |
24
24
  | @chevrotain/types | 11.1.2 | Apache-2.0 | https://github.com/Chevrotain/chevrotain |
25
25
  | @ffmpeg/ffmpeg | 0.12.15 | MIT | https://github.com/ffmpegwasm/ffmpeg.wasm |
@@ -61,7 +61,7 @@ This notice is included in the published npm tarball. Transitive packages instal
61
61
  | @types/d3-fetch | 3.0.7 | MIT | https://github.com/DefinitelyTyped/DefinitelyTyped |
62
62
  | @types/d3-force | 3.0.10 | MIT | https://github.com/DefinitelyTyped/DefinitelyTyped |
63
63
  | @types/d3-format | 3.0.4 | MIT | https://github.com/DefinitelyTyped/DefinitelyTyped |
64
- | @types/d3-geo | 3.1.0 | MIT | https://github.com/DefinitelyTyped/DefinitelyTyped |
64
+ | @types/d3-geo | 3.1.1 | MIT | https://github.com/DefinitelyTyped/DefinitelyTyped |
65
65
  | @types/d3-hierarchy | 3.1.7 | MIT | https://github.com/DefinitelyTyped/DefinitelyTyped |
66
66
  | @types/d3-interpolate | 3.0.4 | MIT | https://github.com/DefinitelyTyped/DefinitelyTyped |
67
67
  | @types/d3-path | 3.1.1 | MIT | https://github.com/DefinitelyTyped/DefinitelyTyped |
@@ -87,7 +87,7 @@ This notice is included in the published npm tarball. Transitive packages instal
87
87
  | @types/unist | 2.0.11 | MIT | https://github.com/DefinitelyTyped/DefinitelyTyped |
88
88
  | @types/unist | 3.0.3 | MIT | https://github.com/DefinitelyTyped/DefinitelyTyped |
89
89
  | @upsetjs/venn.js | 2.0.0 | MIT | https://github.com/upsetjs/venn.js |
90
- | @xmldom/xmldom | 0.9.10 | MIT | https://github.com/xmldom/xmldom |
90
+ | @xmldom/xmldom | 0.9.11 | MIT | https://github.com/xmldom/xmldom |
91
91
  | accepts | 2.0.0 | MIT | https://github.com/jshttp/accepts |
92
92
  | ajv | 8.20.0 | MIT | https://github.com/ajv-validator/ajv |
93
93
  | ajv-formats | 3.0.1 | MIT | https://github.com/ajv-validator/ajv-formats |
@@ -115,7 +115,7 @@ This notice is included in the published npm tarball. Transitive packages instal
115
115
  | cose-base | 1.0.3 | MIT | https://github.com/iVis-at-Bilkent/cose-base |
116
116
  | cose-base | 2.2.0 | MIT | https://github.com/iVis-at-Bilkent/cose-base |
117
117
  | cross-spawn | 7.0.6 | MIT | git@github.com:moxystudio/node-cross-spawn |
118
- | cytoscape | 3.34.0 | MIT | https://github.com/cytoscape/cytoscape.js |
118
+ | cytoscape | 3.34.1 | MIT | https://github.com/cytoscape/cytoscape.js |
119
119
  | cytoscape-cose-bilkent | 4.1.0 | MIT | https://github.com/cytoscape/cytoscape.js-cose-bilkent |
120
120
  | cytoscape-fcose | 2.2.0 | MIT | https://github.com/iVis-at-Bilkent/cytoscape.js-fcose |
121
121
  | d3 | 7.9.0 | ISC | https://github.com/d3/d3 |
@@ -161,7 +161,7 @@ This notice is included in the published npm tarball. Transitive packages instal
161
161
  | depd | 2.0.0 | MIT | https://github.com/dougwilson/nodejs-depd |
162
162
  | dequal | 2.0.3 | MIT | https://github.com/lukeed/dequal |
163
163
  | devlop | 1.1.0 | MIT | https://github.com/wooorm/devlop |
164
- | dompurify | 3.4.12 | (MPL-2.0 OR Apache-2.0) | https://github.com/cure53/DOMPurify |
164
+ | dompurify | 3.4.13 | (MPL-2.0 OR Apache-2.0) | https://github.com/cure53/DOMPurify |
165
165
  | dunder-proto | 1.0.1 | MIT | https://github.com/es-shims/dunder-proto |
166
166
  | ee-first | 1.1.1 | MIT | https://github.com/jonathanong/ee-first |
167
167
  | encodeurl | 2.0.0 | MIT | https://github.com/pillarjs/encodeurl |
@@ -169,7 +169,7 @@ This notice is included in the published npm tarball. Transitive packages instal
169
169
  | es-define-property | 1.0.1 | MIT | https://github.com/ljharb/es-define-property |
170
170
  | es-errors | 1.3.0 | MIT | https://github.com/ljharb/es-errors |
171
171
  | es-object-atoms | 1.1.2 | MIT | https://github.com/ljharb/es-object-atoms |
172
- | es-toolkit | 1.49.0 | MIT | https://github.com/toss/es-toolkit |
172
+ | es-toolkit | 1.50.0 | MIT | https://github.com/toss/es-toolkit |
173
173
  | escape-html | 1.0.3 | MIT | https://github.com/component/escape-html |
174
174
  | escape-string-regexp | 5.0.0 | MIT | https://github.com/sindresorhus/escape-string-regexp |
175
175
  | etag | 1.8.1 | MIT | https://github.com/jshttp/etag |
@@ -248,7 +248,7 @@ This notice is included in the published npm tarball. Transitive packages instal
248
248
  | mdast-util-to-string | 4.0.0 | MIT | https://github.com/syntax-tree/mdast-util-to-string |
249
249
  | media-typer | 1.1.0 | MIT | https://github.com/jshttp/media-typer |
250
250
  | merge-descriptors | 2.0.0 | MIT | https://github.com/sindresorhus/merge-descriptors |
251
- | mermaid | 11.16.0 | MIT | https://github.com/mermaid-js/mermaid |
251
+ | mermaid | 11.16.1 | MIT | https://github.com/mermaid-js/mermaid |
252
252
  | micromark | 4.0.2 | MIT | https://github.com/micromark/micromark/tree/main/packages/micromark |
253
253
  | micromark-core-commonmark | 2.0.3 | MIT | https://github.com/micromark/micromark/tree/main/packages/micromark-core-commonmark |
254
254
  | micromark-extension-directive | 3.0.2 | MIT | https://github.com/micromark/micromark-extension-directive |
@@ -289,7 +289,7 @@ This notice is included in the published npm tarball. Transitive packages instal
289
289
  | object-inspect | 1.13.4 | MIT | https://github.com/inspect-js/object-inspect |
290
290
  | on-finished | 2.4.1 | MIT | https://github.com/jshttp/on-finished |
291
291
  | once | 1.4.0 | ISC | https://github.com/isaacs/once |
292
- | package-manager-detector | 1.7.0 | MIT | https://github.com/antfu-collective/package-manager-detector |
292
+ | package-manager-detector | 1.8.0 | MIT | https://github.com/antfu-collective/package-manager-detector |
293
293
  | pako | 1.0.11 | (MIT AND Zlib) | https://github.com/nodeca/pako |
294
294
  | parse-entities | 4.0.2 | MIT | https://github.com/wooorm/parse-entities |
295
295
  | parse5 | 7.3.0 | MIT | https://github.com/inikulin/parse5 |
@@ -403,7 +403,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
403
403
  SOFTWARE.
404
404
 
405
405
  ==============================================================================
406
- Components: @bendyline/squisq-cli@2.5.2, @bendyline/squisq-formats@2.4.1, @bendyline/squisq-react@2.7.0, @bendyline/squisq-video@2.2.11, @bendyline/squisq@2.7.0
406
+ Components: @bendyline/squisq-cli@2.6.0, @bendyline/squisq-formats@2.4.5, @bendyline/squisq-react@2.8.0, @bendyline/squisq-video@2.3.0, @bendyline/squisq@2.8.0
407
407
  Source files: node_modules/@bendyline/squisq-cli/LICENSE, node_modules/@bendyline/squisq-formats/LICENSE, node_modules/@bendyline/squisq-react/LICENSE, node_modules/@bendyline/squisq-video/LICENSE, node_modules/@bendyline/squisq/LICENSE
408
408
  ==============================================================================
409
409
  MIT License
@@ -673,7 +673,7 @@ This software contains code derived from the Puppeteer project (https://github.c
673
673
  available under the Apache 2.0 license (https://github.com/puppeteer/puppeteer/blob/master/LICENSE).
674
674
 
675
675
  ==============================================================================
676
- Components: @bendyline/squisq-cli@2.5.2
676
+ Components: @bendyline/squisq-cli@2.6.0
677
677
  Source files: node_modules/@bendyline/squisq-cli/NOTICE.md
678
678
  ==============================================================================
679
679
  # Third-Party Notices for @bendyline/squisq-cli
@@ -693,7 +693,7 @@ Copyright and complete license texts for these dependencies are included in
693
693
  their respective npm distributions and source repositories.
694
694
 
695
695
  ==============================================================================
696
- Components: @bendyline/squisq-cli@2.5.2
696
+ Components: @bendyline/squisq-cli@2.6.0
697
697
  Source files: node_modules/@bendyline/squisq-cli/THIRD_PARTY_LICENSES.txt
698
698
  ==============================================================================
699
699
  THIRD-PARTY LICENSES FOR @bendyline/squisq-cli
@@ -800,7 +800,7 @@ COMPONENTS
800
800
  - mdast-util-phrasing@4.1.0 (MIT); files: license
801
801
  - mdast-util-to-markdown@2.1.2 (MIT); files: license
802
802
  - mdast-util-to-string@4.0.0 (MIT); files: license
803
- - mermaid@11.16.0 (MIT); files: LICENSE
803
+ - mermaid@11.16.1 (MIT); files: LICENSE
804
804
  - micromark-core-commonmark@2.0.3 (MIT); files: license
805
805
  - micromark-extension-directive@3.0.2 (MIT); files: license
806
806
  - micromark-extension-frontmatter@2.0.0 (MIT); files: license
@@ -3685,7 +3685,7 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
3685
3685
  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
3686
3686
 
3687
3687
  ==============================================================================
3688
- mermaid@11.16.0 - LICENSE
3688
+ mermaid@11.16.1 - LICENSE
3689
3689
  ==============================================================================
3690
3690
  The MIT License (MIT)
3691
3691
 
@@ -5168,7 +5168,7 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
5168
5168
  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
5169
5169
 
5170
5170
  ==============================================================================
5171
- Components: @xmldom/xmldom@0.9.10
5171
+ Components: @xmldom/xmldom@0.9.11
5172
5172
  Source files: node_modules/@bendyline/squisq-formats/node_modules/@xmldom/xmldom/LICENSE
5173
5173
  ==============================================================================
5174
5174
  Copyright 2019 - present Christopher J. Brody and other contributors, as listed in: https://github.com/xmldom/xmldom/graphs/contributors
@@ -5181,7 +5181,7 @@ The above copyright notice and this permission notice shall be included in all c
5181
5181
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
5182
5182
 
5183
5183
  ==============================================================================
5184
- Components: @bendyline/squisq-formats@2.4.1
5184
+ Components: @bendyline/squisq-formats@2.4.5
5185
5185
  Source files: node_modules/@bendyline/squisq-formats/NOTICE.md
5186
5186
  ==============================================================================
5187
5187
  # Third-Party Notices for @bendyline/squisq-formats
@@ -5196,7 +5196,7 @@ Third-party components remain under their respective license terms.
5196
5196
  | ---------------- | ------- | ----------------------- | ---------------------------------- |
5197
5197
  | @pdf-lib/fontkit | 1.1.1 | MIT | https://github.com/Hopding/fontkit |
5198
5198
  | @pdf-lib/upng | 1.0.1 | MIT | https://github.com/Hopding/upng |
5199
- | @xmldom/xmldom | 0.9.10 | MIT | https://github.com/xmldom/xmldom |
5199
+ | @xmldom/xmldom | 0.9.11 | MIT | https://github.com/xmldom/xmldom |
5200
5200
  | jszip | 3.10.1 | MIT OR GPL-3.0-or-later | https://github.com/Stuk/jszip |
5201
5201
  | pdf-lib | 1.17.1 | MIT | https://pdf-lib.js.org |
5202
5202
  | pdfjs-dist | 4.10.38 | Apache-2.0 | https://mozilla.github.io/pdf.js |
@@ -5206,7 +5206,7 @@ texts for these dependencies are included in their respective npm
5206
5206
  distributions and source repositories.
5207
5207
 
5208
5208
  ==============================================================================
5209
- Components: @bendyline/squisq-formats@2.4.1
5209
+ Components: @bendyline/squisq-formats@2.4.5
5210
5210
  Source files: node_modules/@bendyline/squisq-formats/THIRD_PARTY_LICENSES.txt
5211
5211
  ==============================================================================
5212
5212
  THIRD-PARTY LICENSES FOR @bendyline/squisq-formats
@@ -5388,7 +5388,7 @@ Awesome, nor vice versa. **Please do not use brand logos for any purpose except
5388
5388
  to represent the company, product, or service to which they refer.**
5389
5389
 
5390
5390
  ==============================================================================
5391
- Components: @bendyline/squisq-react@2.7.0
5391
+ Components: @bendyline/squisq-react@2.8.0
5392
5392
  Source files: node_modules/@bendyline/squisq-react/NOTICE.md
5393
5393
  ==============================================================================
5394
5394
  # Third-Party Notices for @bendyline/squisq-react
@@ -5402,7 +5402,7 @@ Third-party components remain under their respective license terms.
5402
5402
  | Package | Version | License | Repository |
5403
5403
  | ----------------------------- | -------------------- | ----------------------------- | ------------------------------------------- |
5404
5404
  | @fortawesome/fontawesome-free | 7.2.0 | CC-BY-4.0 AND OFL-1.1 AND MIT | https://github.com/FortAwesome/Font-Awesome |
5405
- | mermaid | 11.16.0 | MIT | https://github.com/mermaid-js/mermaid |
5405
+ | mermaid | 11.16.1 | MIT | https://github.com/mermaid-js/mermaid |
5406
5406
  | preact _(bundled)_ | 10.29.0 | MIT | https://github.com/preactjs/preact |
5407
5407
  | react _(peer)_ | ^18.0.0 \|\| ^19.0.0 | MIT | https://github.com/facebook/react |
5408
5408
  | react-dom _(peer)_ | ^18.0.0 \|\| ^19.0.0 | MIT | https://github.com/facebook/react |
@@ -5413,7 +5413,7 @@ third-party license texts for the complete standalone bundle graph are shipped
5413
5413
  in THIRD_PARTY_LICENSES.txt.
5414
5414
 
5415
5415
  ==============================================================================
5416
- Components: @bendyline/squisq-react@2.7.0
5416
+ Components: @bendyline/squisq-react@2.8.0
5417
5417
  Source files: node_modules/@bendyline/squisq-react/THIRD_PARTY_LICENSES.txt
5418
5418
  ==============================================================================
5419
5419
  THIRD-PARTY LICENSES FOR @bendyline/squisq-react
@@ -5518,7 +5518,7 @@ COMPONENTS
5518
5518
  - mdast-util-phrasing@4.1.0 (MIT); files: license
5519
5519
  - mdast-util-to-markdown@2.1.2 (MIT); files: license
5520
5520
  - mdast-util-to-string@4.0.0 (MIT); files: license
5521
- - mermaid@11.16.0 (MIT); files: LICENSE
5521
+ - mermaid@11.16.1 (MIT); files: LICENSE
5522
5522
  - micromark-core-commonmark@2.0.3 (MIT); files: license
5523
5523
  - micromark-extension-directive@3.0.2 (MIT); files: license
5524
5524
  - micromark-extension-frontmatter@2.0.0 (MIT); files: license
@@ -8403,7 +8403,7 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
8403
8403
  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
8404
8404
 
8405
8405
  ==============================================================================
8406
- mermaid@11.16.0 - LICENSE
8406
+ mermaid@11.16.1 - LICENSE
8407
8407
  ==============================================================================
8408
8408
  The MIT License (MIT)
8409
8409
 
@@ -9950,7 +9950,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
9950
9950
  SOFTWARE.
9951
9951
 
9952
9952
  ==============================================================================
9953
- Components: @bendyline/squisq-video@2.2.11
9953
+ Components: @bendyline/squisq-video@2.3.0
9954
9954
  Source files: node_modules/@bendyline/squisq-video/NOTICE.md
9955
9955
  ==============================================================================
9956
9956
  # Third-Party Notices for @bendyline/squisq-video
@@ -9975,7 +9975,7 @@ Copyright and complete license texts for the listed dependencies are included
9975
9975
  in their respective npm distributions and source repositories.
9976
9976
 
9977
9977
  ==============================================================================
9978
- Components: @bendyline/squisq-video@2.2.11
9978
+ Components: @bendyline/squisq-video@2.3.0
9979
9979
  Source files: node_modules/@bendyline/squisq-video/THIRD_PARTY_LICENSES.txt
9980
9980
  ==============================================================================
9981
9981
  THIRD-PARTY LICENSES FOR @bendyline/squisq-video
@@ -9987,7 +9987,7 @@ repository license, the pinned upstream copy is vendored and identified below.
9987
9987
  COMPONENTS
9988
9988
 
9989
9989
  ==============================================================================
9990
- Components: @bendyline/squisq@2.7.0
9990
+ Components: @bendyline/squisq@2.8.0
9991
9991
  Source files: node_modules/@bendyline/squisq/NOTICE.md
9992
9992
  ==============================================================================
9993
9993
  # Third-Party Notices for @bendyline/squisq
@@ -10018,7 +10018,7 @@ third-party license texts for bundled code and data are shipped in
10018
10018
  THIRD_PARTY_LICENSES.txt.
10019
10019
 
10020
10020
  ==============================================================================
10021
- Components: @bendyline/squisq@2.7.0
10021
+ Components: @bendyline/squisq@2.8.0
10022
10022
  Source files: node_modules/@bendyline/squisq/THIRD_PARTY_LICENSES.txt
10023
10023
  ==============================================================================
10024
10024
  THIRD-PARTY LICENSES FOR @bendyline/squisq
@@ -10226,7 +10226,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
10226
10226
  SOFTWARE.
10227
10227
 
10228
10228
  ==============================================================================
10229
- Components: @chevrotain/types@11.1.2, dompurify@3.4.12
10229
+ Components: @chevrotain/types@11.1.2, dompurify@3.4.13
10230
10230
  Source files: node_modules/@chevrotain/types/LICENSE.txt, node_modules/dompurify/LICENSE
10231
10231
  ==============================================================================
10232
10232
 
@@ -10811,8 +10811,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
10811
10811
  SOFTWARE.
10812
10812
 
10813
10813
  ==============================================================================
10814
- Components: @types/d3-array@3.2.2, @types/d3-axis@3.0.6, @types/d3-brush@3.0.6, @types/d3-chord@3.0.6, @types/d3-color@3.1.3, @types/d3-contour@3.0.6, @types/d3-delaunay@6.0.4, @types/d3-dispatch@3.0.7, @types/d3-drag@3.0.7, @types/d3-dsv@3.0.7, @types/d3-ease@3.0.2, @types/d3-fetch@3.0.7, @types/d3-force@3.0.10, @types/d3-format@3.0.4, @types/d3-geo@3.1.0, @types/d3-hierarchy@3.1.7, @types/d3-interpolate@3.0.4, @types/d3-path@3.1.1, @types/d3-polygon@3.0.2, @types/d3-quadtree@3.0.6, @types/d3-random@3.0.4, @types/d3-scale-chromatic@3.1.0, @types/d3-scale@4.0.9, @types/d3-selection@3.0.11, @types/d3-shape@3.1.8, @types/d3-time-format@4.0.3, @types/d3-time@3.0.4, @types/d3-timer@3.0.2, @types/d3-transition@3.0.9, @types/d3-zoom@3.0.8, @types/d3@7.4.3, @types/debug@4.1.12, @types/geojson@7946.0.16, @types/hast@3.0.4, @types/katex@0.16.8, @types/mdast@4.0.4, @types/ms@2.1.0, @types/trusted-types@2.0.7, @types/unist@2.0.11, @types/unist@3.0.3
10815
- Source files: node_modules/@types/d3-array/LICENSE, node_modules/@types/d3-axis/LICENSE, node_modules/@types/d3-brush/LICENSE, node_modules/@types/d3-chord/LICENSE, node_modules/@types/d3-color/LICENSE, node_modules/@types/d3-contour/LICENSE, node_modules/@types/d3-delaunay/LICENSE, node_modules/@types/d3-dispatch/LICENSE, node_modules/@types/d3-drag/LICENSE, node_modules/@types/d3-dsv/LICENSE, node_modules/@types/d3-ease/LICENSE, node_modules/@types/d3-fetch/LICENSE, node_modules/@types/d3-force/LICENSE, node_modules/@types/d3-format/LICENSE, node_modules/@types/d3-geo/LICENSE, node_modules/@types/d3-hierarchy/LICENSE, node_modules/@types/d3-interpolate/LICENSE, node_modules/@types/d3-path/LICENSE, node_modules/@types/d3-polygon/LICENSE, node_modules/@types/d3-quadtree/LICENSE, node_modules/@types/d3-random/LICENSE, node_modules/@types/d3-scale-chromatic/LICENSE, node_modules/@types/d3-scale/LICENSE, node_modules/@types/d3-selection/LICENSE, node_modules/@types/d3-shape/LICENSE, node_modules/@types/d3-time-format/LICENSE, node_modules/@types/d3-time/LICENSE, node_modules/@types/d3-timer/LICENSE, node_modules/@types/d3-transition/LICENSE, node_modules/@types/d3-zoom/LICENSE, node_modules/@types/d3/LICENSE, node_modules/@types/debug/LICENSE, node_modules/@types/geojson/LICENSE, node_modules/@types/hast/LICENSE, node_modules/@types/katex/LICENSE, node_modules/@types/mdast/LICENSE, node_modules/@types/ms/LICENSE, node_modules/@types/unist/LICENSE, node_modules/dompurify/node_modules/@types/trusted-types/LICENSE, node_modules/parse-entities/node_modules/@types/unist/LICENSE
10814
+ Components: @types/d3-array@3.2.2, @types/d3-axis@3.0.6, @types/d3-brush@3.0.6, @types/d3-chord@3.0.6, @types/d3-color@3.1.3, @types/d3-contour@3.0.6, @types/d3-delaunay@6.0.4, @types/d3-dispatch@3.0.7, @types/d3-drag@3.0.7, @types/d3-dsv@3.0.7, @types/d3-ease@3.0.2, @types/d3-fetch@3.0.7, @types/d3-force@3.0.10, @types/d3-format@3.0.4, @types/d3-geo@3.1.1, @types/d3-hierarchy@3.1.7, @types/d3-interpolate@3.0.4, @types/d3-path@3.1.1, @types/d3-polygon@3.0.2, @types/d3-quadtree@3.0.6, @types/d3-random@3.0.4, @types/d3-scale-chromatic@3.1.0, @types/d3-scale@4.0.9, @types/d3-selection@3.0.11, @types/d3-shape@3.1.8, @types/d3-time-format@4.0.3, @types/d3-time@3.0.4, @types/d3-timer@3.0.2, @types/d3-transition@3.0.9, @types/d3-zoom@3.0.8, @types/d3@7.4.3, @types/debug@4.1.12, @types/geojson@7946.0.16, @types/hast@3.0.4, @types/katex@0.16.8, @types/mdast@4.0.4, @types/ms@2.1.0, @types/trusted-types@2.0.7, @types/unist@2.0.11, @types/unist@3.0.3
10815
+ Source files: node_modules/@types/d3-array/LICENSE, node_modules/@types/d3-axis/LICENSE, node_modules/@types/d3-brush/LICENSE, node_modules/@types/d3-chord/LICENSE, node_modules/@types/d3-color/LICENSE, node_modules/@types/d3-contour/LICENSE, node_modules/@types/d3-delaunay/LICENSE, node_modules/@types/d3-dispatch/LICENSE, node_modules/@types/d3-drag/LICENSE, node_modules/@types/d3-dsv/LICENSE, node_modules/@types/d3-ease/LICENSE, node_modules/@types/d3-fetch/LICENSE, node_modules/@types/d3-force/LICENSE, node_modules/@types/d3-format/LICENSE, node_modules/@types/d3-geo/LICENSE, node_modules/@types/d3-hierarchy/LICENSE, node_modules/@types/d3-interpolate/LICENSE, node_modules/@types/d3-path/LICENSE, node_modules/@types/d3-polygon/LICENSE, node_modules/@types/d3-quadtree/LICENSE, node_modules/@types/d3-random/LICENSE, node_modules/@types/d3-scale-chromatic/LICENSE, node_modules/@types/d3-scale/LICENSE, node_modules/@types/d3-selection/LICENSE, node_modules/@types/d3-shape/LICENSE, node_modules/@types/d3-time-format/LICENSE, node_modules/@types/d3-time/LICENSE, node_modules/@types/d3-timer/LICENSE, node_modules/@types/d3-transition/LICENSE, node_modules/@types/d3-zoom/LICENSE, node_modules/@types/d3/LICENSE, node_modules/@types/debug/LICENSE, node_modules/@types/geojson/LICENSE, node_modules/@types/hast/LICENSE, node_modules/@types/katex/LICENSE, node_modules/@types/mdast/LICENSE, node_modules/@types/ms/LICENSE, node_modules/@types/trusted-types/LICENSE, node_modules/@types/unist/LICENSE, node_modules/parse-entities/node_modules/@types/unist/LICENSE
10816
10816
  ==============================================================================
10817
10817
  MIT License
10818
10818
 
@@ -11368,7 +11368,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
11368
11368
  SOFTWARE.
11369
11369
 
11370
11370
  ==============================================================================
11371
- Components: cytoscape@3.34.0
11371
+ Components: cytoscape@3.34.1
11372
11372
  Source files: node_modules/cytoscape/LICENSE
11373
11373
  ==============================================================================
11374
11374
  Copyright (c) 2016-2026, The Cytoscape Consortium.
@@ -11392,7 +11392,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
11392
11392
  SOFTWARE.
11393
11393
 
11394
11394
  ==============================================================================
11395
- Components: cytoscape@3.34.0
11395
+ Components: cytoscape@3.34.1
11396
11396
  Source files: node_modules/cytoscape/license-update.mjs
11397
11397
  ==============================================================================
11398
11398
  import fs from 'fs';
@@ -12073,7 +12073,7 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
12073
12073
  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
12074
12074
 
12075
12075
  ==============================================================================
12076
- Components: dompurify@3.4.12
12076
+ Components: dompurify@3.4.13
12077
12077
  Source files: node_modules/dompurify/LICENSE-MPL
12078
12078
  ==============================================================================
12079
12079
  Mozilla Public License Version 2.0
@@ -12547,7 +12547,7 @@ THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRE
12547
12547
  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
12548
12548
 
12549
12549
  ==============================================================================
12550
- Components: es-toolkit@1.49.0
12550
+ Components: es-toolkit@1.50.0
12551
12551
  Source files: node_modules/es-toolkit/LICENSE
12552
12552
  ==============================================================================
12553
12553
  MIT License
@@ -14867,7 +14867,7 @@ The above copyright notice and this permission notice shall be included in all c
14867
14867
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
14868
14868
 
14869
14869
  ==============================================================================
14870
- Components: mermaid@11.16.0
14870
+ Components: mermaid@11.16.1
14871
14871
  Source files: node_modules/mermaid/LICENSE
14872
14872
  ==============================================================================
14873
14873
  The MIT License (MIT)
@@ -15156,7 +15156,7 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
15156
15156
  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
15157
15157
 
15158
15158
  ==============================================================================
15159
- Components: package-manager-detector@1.7.0
15159
+ Components: package-manager-detector@1.8.0
15160
15160
  Source files: node_modules/package-manager-detector/LICENSE
15161
15161
  ==============================================================================
15162
15162
  MIT License
package/dist/bin.js CHANGED
@@ -3224,7 +3224,16 @@ Placeholder`).join("\n\n");
3224
3224
  const converted = await convert(
3225
3225
  { kind: "markdown", markdown: scaffold, baseName: "rendered" },
3226
3226
  "pptx",
3227
- { ...title === void 0 ? {} : { title }, signal }
3227
+ {
3228
+ ...title === void 0 ? {} : { title },
3229
+ signal,
3230
+ // The scaffold is a throwaway 1:1 frame->slide vehicle whose slides are
3231
+ // all overwritten below with captured images. Squisq's cover slide is on
3232
+ // by default; here it would prepend a slide built from the placeholder
3233
+ // text, shifting every frame by one and leaving the last scaffold slide
3234
+ // un-overwritten as a visible "Rendered slide N / Placeholder" page.
3235
+ formatOptions: { pptx: { includeCoverSlide: false } }
3236
+ }
3228
3237
  );
3229
3238
  throwIfAborted5(signal);
3230
3239
  const archive = await JSZip.loadAsync(converted.bytes);
@@ -3451,6 +3460,7 @@ import {
3451
3460
  createCliRegistry,
3452
3461
  prepareConversion as prepareLinkedConversion
3453
3462
  } from "@bendyline/squisq-cli/api";
3463
+ import { DASHBOARD_STYLE_IDS } from "@bendyline/squisq/doc";
3454
3464
  import { getDocPlaybackDuration } from "@bendyline/squisq/schemas";
3455
3465
  async function convertPreparedDocument(artifacts, prepared, request, signal, progress, dependencies = DEFAULT_CONVERSION_SERVICE_DEPENDENCIES) {
3456
3466
  if (request.targets.length < 1 || request.targets.length > 12) {
@@ -3713,13 +3723,17 @@ function canonicalJson(value) {
3713
3723
  return `{${entries.map(([key, entry]) => `${JSON.stringify(key)}:${canonicalJson(entry)}`).join(",")}}`;
3714
3724
  }
3715
3725
  function defaultFidelity(format) {
3716
- if (format === "mp4" || format === "gif") return "rendered-fidelity";
3726
+ if (format === "mp4" || format === "gif" || format === "png") return "rendered-fidelity";
3717
3727
  return format === "docx" || format === "pptx" ? "editable-native" : "semantic";
3718
3728
  }
3719
3729
  function usesDocumentRasterizer(format, fidelity) {
3720
3730
  return (format === "pdf" || format === "pptx") && (fidelity === "rendered-fidelity" || fidelity === "hybrid");
3721
3731
  }
3722
3732
  function assertMediaRenderBudget(prepared, target) {
3733
+ if (target.format === "png") {
3734
+ assertDashboardImageBudget(target);
3735
+ return;
3736
+ }
3723
3737
  if (target.format !== "mp4" && target.format !== "gif") return;
3724
3738
  const format = target.format;
3725
3739
  const limits = MCP_MEDIA_RENDER_LIMITS[format];
@@ -3754,6 +3768,35 @@ function assertMediaRenderBudget(prepared, target) {
3754
3768
  }
3755
3769
  if (violations.length > 0) throw new MediaRenderBudgetError(format, violations, limits);
3756
3770
  }
3771
+ function assertDashboardImageBudget(target) {
3772
+ const options = target.options ?? {};
3773
+ const hasCustom = options.width !== void 0 || options.height !== void 0;
3774
+ if (!hasCustom) return;
3775
+ if (options.resolution !== void 0) {
3776
+ throw new DashboardImageBudgetError(
3777
+ "Pass either a resolution preset or custom width and height, not both."
3778
+ );
3779
+ }
3780
+ if (options.width === void 0 || options.height === void 0) {
3781
+ throw new DashboardImageBudgetError("Custom dimensions require both width and height.");
3782
+ }
3783
+ const width = numericOption2(options.width, 0);
3784
+ const height = numericOption2(options.height, 0);
3785
+ const limits = MCP_DASHBOARD_IMAGE_LIMITS;
3786
+ if (!Number.isSafeInteger(width) || !Number.isSafeInteger(height)) {
3787
+ throw new DashboardImageBudgetError("Width and height must be whole pixel counts.");
3788
+ }
3789
+ if (width < limits.minimumDimension || height < limits.minimumDimension || width > limits.maximumDimension || height > limits.maximumDimension) {
3790
+ throw new DashboardImageBudgetError(
3791
+ `Each dimension must be between ${limits.minimumDimension} and ${limits.maximumDimension} pixels; received ${width}x${height}.`
3792
+ );
3793
+ }
3794
+ if (width * height > limits.maximumPixels) {
3795
+ throw new DashboardImageBudgetError(
3796
+ `The image may not exceed ${limits.maximumPixels} total pixels; ${width}x${height} is ${width * height}.`
3797
+ );
3798
+ }
3799
+ }
3757
3800
  function numericOption2(value, fallback) {
3758
3801
  return typeof value === "number" && Number.isFinite(value) ? value : fallback;
3759
3802
  }
@@ -3820,7 +3863,7 @@ function firstDuplicate2(values) {
3820
3863
  }
3821
3864
  return void 0;
3822
3865
  }
3823
- var MCP_FORMAT_FIDELITIES, MCP_MEDIA_RENDER_LIMITS, COMPLETED_CONVERSION_CACHE_LIMIT, completedConversionCaches, linkedRegistry, DEFAULT_CONVERSION_SERVICE_DEPENDENCIES, MCP_FORMAT_CAPABILITIES, CompletedConversionCache, MediaRenderBudgetError, UnsupportedFidelityError, UnknownTransformError, UnknownThemeError;
3866
+ var MCP_FORMAT_FIDELITIES, MCP_DASHBOARD_IMAGE_LIMITS, MCP_DASHBOARD_STYLE_IDS, MCP_DASHBOARD_RESOLUTION_IDS, MCP_MEDIA_RENDER_LIMITS, COMPLETED_CONVERSION_CACHE_LIMIT, completedConversionCaches, linkedRegistry, DEFAULT_CONVERSION_SERVICE_DEPENDENCIES, MCP_FORMAT_CAPABILITIES, CompletedConversionCache, MediaRenderBudgetError, DashboardImageBudgetError, UnsupportedFidelityError, UnknownTransformError, UnknownThemeError;
3824
3867
  var init_conversion_service = __esm({
3825
3868
  "src/mcp/conversion-service.ts"() {
3826
3869
  "use strict";
@@ -3840,8 +3883,25 @@ var init_conversion_service = __esm({
3840
3883
  epub: ["semantic"],
3841
3884
  dbk: ["semantic", "editable-native"],
3842
3885
  mp4: ["rendered-fidelity"],
3843
- gif: ["rendered-fidelity"]
3886
+ gif: ["rendered-fidelity"],
3887
+ png: ["rendered-fidelity"]
3844
3888
  };
3889
+ MCP_DASHBOARD_IMAGE_LIMITS = Object.freeze({
3890
+ minimumDimension: 64,
3891
+ maximumDimension: 7680,
3892
+ maximumPixels: 33177600
3893
+ });
3894
+ MCP_DASHBOARD_STYLE_IDS = DASHBOARD_STYLE_IDS;
3895
+ MCP_DASHBOARD_RESOLUTION_IDS = [
3896
+ "hd",
3897
+ "fhd",
3898
+ "4k",
3899
+ "square",
3900
+ "square-2k",
3901
+ "portrait",
3902
+ "portrait-4k",
3903
+ "standard"
3904
+ ];
3845
3905
  MCP_MEDIA_RENDER_LIMITS = Object.freeze({
3846
3906
  mp4: Object.freeze({
3847
3907
  maximumFps: 60,
@@ -3924,6 +3984,16 @@ var init_conversion_service = __esm({
3924
3984
  this.hint = `Reduce duration, FPS, or dimensions. ${format.toUpperCase()} permits at most ${limits.maximumDurationSeconds}s, ${limits.maximumFps} fps, ${limits.maximumPixelsPerFrame} pixels/frame, ${limits.maximumPixelFrames} frame-pixels, and ${limits.maximumCapturedFrameBytes} retained captured-PNG bytes.`;
3925
3985
  }
3926
3986
  };
3987
+ DashboardImageBudgetError = class extends Error {
3988
+ constructor(message) {
3989
+ super(`The Dashboard image render exceeds MCP raster budgets: ${message}`);
3990
+ this.code = "media-budget-exceeded";
3991
+ this.retryable = false;
3992
+ this.format = "png";
3993
+ this.name = "DashboardImageBudgetError";
3994
+ this.hint = `Use a named resolution preset, or custom dimensions between ${MCP_DASHBOARD_IMAGE_LIMITS.minimumDimension} and ${MCP_DASHBOARD_IMAGE_LIMITS.maximumDimension} pixels per edge totaling at most ${MCP_DASHBOARD_IMAGE_LIMITS.maximumPixels} pixels.`;
3995
+ }
3996
+ };
3927
3997
  UnsupportedFidelityError = class extends Error {
3928
3998
  constructor(format, fidelity, supported) {
3929
3999
  const choices = supported.length > 0 ? supported.join(", ") : "none";
@@ -5341,6 +5411,22 @@ var init_agentic_tools = __esm({
5341
5411
  maxColors: z.number().int().min(2).max(256).optional(),
5342
5412
  dither: z.enum(["none", "bayer", "heckbert", "floyd_steinberg", "sierra2", "sierra2_4a"]).optional(),
5343
5413
  bayerScale: z.number().int().min(0).max(5).optional()
5414
+ }).strict(),
5415
+ z.object({
5416
+ format: z.literal("png"),
5417
+ fidelity: z.enum(MCP_FORMAT_FIDELITIES.png).optional(),
5418
+ resolution: z.enum(MCP_DASHBOARD_RESOLUTION_IDS).optional().describe(
5419
+ "Named output size for the Dashboard image. Mutually exclusive with width/height."
5420
+ ),
5421
+ width: z.number().int().min(64).max(7680).optional().describe("Custom pixel width. Requires height and excludes resolution."),
5422
+ height: z.number().int().min(64).max(7680).optional().describe("Custom pixel height. Requires width and excludes resolution."),
5423
+ layout: z.string().max(64).optional().describe(
5424
+ `Dashboard layout id, or "auto" to pick by block count. Omit to honor the document's own squisq-dashboard-layout frontmatter.`
5425
+ ),
5426
+ style: z.enum(MCP_DASHBOARD_STYLE_IDS).optional().describe(
5427
+ "Cell dressing around each block. Omit to honor the document's own squisq-dashboard-style frontmatter."
5428
+ ),
5429
+ title: z.boolean().optional().describe("Render the document-title band. Omit to honor the document\u2019s own setting.")
5344
5430
  }).strict()
5345
5431
  ]);
5346
5432
  MCP_CONVERSION_TARGET_FORMATS = Object.freeze(
@@ -5558,6 +5644,38 @@ function registerAuthoringPrompts(server) {
5558
5644
  })
5559
5645
  );
5560
5646
  video.argsSchema = videoArgs;
5647
+ const dashboardArgs = z3.object({
5648
+ topic: z3.string().max(MAX_TOPIC_CHARACTERS).describe("Dashboard topic or subject."),
5649
+ resolution: z3.enum(MCP_DASHBOARD_RESOLUTION_IDS).optional().describe("Named output size for the image."),
5650
+ style: z3.enum(MCP_DASHBOARD_STYLE_IDS).optional().describe("Cell dressing around each block."),
5651
+ theme,
5652
+ template
5653
+ }).strict();
5654
+ const dashboard = server.registerPrompt(
5655
+ "create-dashboard",
5656
+ {
5657
+ description: "Convert model-authored Markdown into an artifact-first dashboard image.",
5658
+ argsSchema: dashboardArgs.shape
5659
+ },
5660
+ async (args) => ({
5661
+ messages: [
5662
+ {
5663
+ role: "user",
5664
+ content: {
5665
+ type: "text",
5666
+ text: dashboardPrompt(
5667
+ args.topic,
5668
+ args.resolution,
5669
+ args.style,
5670
+ args.theme,
5671
+ args.template
5672
+ )
5673
+ }
5674
+ }
5675
+ ]
5676
+ })
5677
+ );
5678
+ dashboard.argsSchema = dashboardArgs;
5561
5679
  const documentArgs = z3.object({
5562
5680
  topic: z3.string().max(MAX_TOPIC_CHARACTERS).describe("Document topic or subject."),
5563
5681
  format: z3.enum(["docx", "pdf"]).optional(),
@@ -5609,6 +5727,19 @@ function videoPrompt(topic, orientation, theme, template) {
5609
5727
  4. Use preview_document only when the user explicitly asks for visual evidence.
5610
5728
  5. Call save_artifact only when a durable file is required.`;
5611
5729
  }
5730
+ function dashboardPrompt(topic, resolution, style, theme, template) {
5731
+ const templateHint = template ? ` Use the requested \`${template}\` annotation where appropriate.` : "";
5732
+ const themeHint = theme ? ` and themeId \`${theme}\`` : "";
5733
+ const sizeHint = resolution ? `, resolution "${resolution}"` : "";
5734
+ const styleHint = style ? `, style "${style}"` : "";
5735
+ return `Create a dashboard image about: ${topic}
5736
+
5737
+ 1. For durable output, call list_roots before drafting and stop if no root is write-enabled; do not use a shell or CLI converter.
5738
+ 2. A dashboard renders the WHOLE document onto one canvas, one block per cell, so write for a single screen. Aim for four to eight short, self-contained blocks \u2014 a lead statement, a table or metric, a short list, a closing note. Long prose does not fit a cell and will be clipped.${templateHint} Call get_authoring_context only when exact annotation examples or theme details would help.
5739
+ 3. Pass the Markdown directly to convert_document with a png target${sizeHint}${styleHint}${themeHint}. Omit layout to let the block count pick one. Use a bundle source only when assets must travel with the document. No validation, inspection, or preview is required.
5740
+ 4. Use preview_document only when the user explicitly asks for visual evidence.
5741
+ 5. Call save_artifact only when a durable file is required.`;
5742
+ }
5612
5743
  function documentPrompt(topic, format, theme, template) {
5613
5744
  const target = format ?? "pdf";
5614
5745
  const templateHint = template ? ` Use the requested \`${template}\` annotation where appropriate.` : "";
@@ -5629,6 +5760,7 @@ var MAX_ID_CHARACTERS, MAX_TOPIC_CHARACTERS;
5629
5760
  var init_prompts = __esm({
5630
5761
  "src/mcp/prompts.ts"() {
5631
5762
  "use strict";
5763
+ init_conversion_service();
5632
5764
  init_style_guidance();
5633
5765
  MAX_ID_CHARACTERS = 256;
5634
5766
  MAX_TOPIC_CHARACTERS = 1e4;
@@ -6732,7 +6864,70 @@ import { Command as Command3 } from "commander";
6732
6864
  init_link_support();
6733
6865
  init_node_error();
6734
6866
  init_cancellation();
6867
+
6868
+ // src/internal/dashboard-image.ts
6869
+ function hasDashboardImageInput(input) {
6870
+ return input.resolution !== void 0 || input.width !== void 0 || input.height !== void 0 || input.layout !== void 0 || input.style !== void 0 || input.title !== void 0;
6871
+ }
6872
+ function pixelCount(value, flag) {
6873
+ if (value === void 0) return void 0;
6874
+ const parsed = typeof value === "number" ? value : Number(value.trim());
6875
+ if (!Number.isFinite(parsed)) {
6876
+ throw new Error(`The ${flag} must be a whole number of pixels.`);
6877
+ }
6878
+ return parsed;
6879
+ }
6880
+ async function resolveDashboardImageOptions(input) {
6881
+ const [{ resolveDashboardStyleId, DASHBOARD_STYLE_IDS: DASHBOARD_STYLE_IDS2 }, video] = await Promise.all([
6882
+ import("@bendyline/squisq/doc"),
6883
+ import("@bendyline/squisq-video")
6884
+ ]);
6885
+ const width = pixelCount(input.width, "--image-width");
6886
+ const height = pixelCount(input.height, "--image-height");
6887
+ const dimensions = video.resolveDashboardDimensions({
6888
+ resolution: input.resolution,
6889
+ width,
6890
+ height
6891
+ });
6892
+ const options = {};
6893
+ if (input.resolution !== void 0) {
6894
+ options.resolution = input.resolution;
6895
+ } else if (width !== void 0 && height !== void 0) {
6896
+ options.width = dimensions.width;
6897
+ options.height = dimensions.height;
6898
+ }
6899
+ if (input.layout !== void 0) {
6900
+ const layout = input.layout.trim().toLowerCase();
6901
+ if (!layout) throw new Error("The --image-layout id must be a non-empty string.");
6902
+ options.layout = layout;
6903
+ }
6904
+ if (input.style !== void 0) {
6905
+ const style = resolveDashboardStyleId(input.style);
6906
+ if (!style) {
6907
+ throw new Error(
6908
+ `Unknown dashboard style "${input.style}". Valid: ${DASHBOARD_STYLE_IDS2.join(", ")}`
6909
+ );
6910
+ }
6911
+ options.style = style;
6912
+ }
6913
+ if (input.title !== void 0) options.title = input.title;
6914
+ return options;
6915
+ }
6916
+ async function assertKnownDashboardLayout(layout, doc) {
6917
+ if (!layout) return;
6918
+ const { DASHBOARD_AUTO_LAYOUT_ID, listDashboardLayouts } = await import("@bendyline/squisq/doc");
6919
+ if (layout === DASHBOARD_AUTO_LAYOUT_ID) return;
6920
+ const available = listDashboardLayouts(doc);
6921
+ if (available.some((entry) => entry.id === layout)) return;
6922
+ const known = available.map((entry) => entry.id).join(", ");
6923
+ throw new Error(
6924
+ `Unknown dashboard layout "${layout}". Valid: ${DASHBOARD_AUTO_LAYOUT_ID}, ${known}`
6925
+ );
6926
+ }
6927
+
6928
+ // src/commands/convert.ts
6735
6929
  var DEFAULT_FORMATS = ["docx", "pptx", "pdf", "html", "dbk"];
6930
+ var DASHBOARD_IMAGE_FORMAT = "png";
6736
6931
  var DEFAULT_MAX_CONVERT_INPUT_BYTES = 1024 * 1024 * 1024;
6737
6932
  var DEFAULT_MAX_CONVERT_INPUT_ENTRIES = 2e4;
6738
6933
  var DEFAULT_MAX_CONVERT_OUTPUT_BYTES = 512 * 1024 * 1024;
@@ -6805,6 +7000,24 @@ async function runConvert(inputPath, opts) {
6805
7000
  { format: requested[0], hint: registryHint }
6806
7001
  );
6807
7002
  }
7003
+ const dashboardImageInput = {
7004
+ resolution: opts.imageResolution,
7005
+ width: opts.imageWidth,
7006
+ height: opts.imageHeight,
7007
+ layout: opts.imageLayout,
7008
+ style: opts.imageStyle,
7009
+ title: opts.imageTitle
7010
+ };
7011
+ const wantsDashboardImage = formats.includes(DASHBOARD_IMAGE_FORMAT);
7012
+ if (hasDashboardImageInput(dashboardImageInput) && !wantsDashboardImage) {
7013
+ throw new squisq.ConversionError(
7014
+ "unknown-format",
7015
+ `The --image-* options only apply to the "${DASHBOARD_IMAGE_FORMAT}" target. Add it to --formats.`,
7016
+ { format: DASHBOARD_IMAGE_FORMAT, hint: registryHint }
7017
+ );
7018
+ }
7019
+ const dashboardImageOptions = wantsDashboardImage ? await resolveDashboardImageOptions(dashboardImageInput) : void 0;
7020
+ throwIfAborted2(opts.signal);
6808
7021
  if (opts.transform) {
6809
7022
  const { getTransformStyleIds } = await import("@bendyline/squisq/transform");
6810
7023
  throwIfAborted2(opts.signal);
@@ -6830,6 +7043,7 @@ async function runConvert(inputPath, opts) {
6830
7043
  opts.theme,
6831
7044
  result.doc.customThemes?.map((theme) => theme.id)
6832
7045
  );
7046
+ await assertKnownDashboardLayout(dashboardImageOptions?.layout, result.doc);
6833
7047
  throwIfAborted2(opts.signal);
6834
7048
  let exportMarkdownDoc = result.markdownDoc;
6835
7049
  if (opts.transform && exportMarkdownDoc) {
@@ -6853,7 +7067,8 @@ async function runConvert(inputPath, opts) {
6853
7067
  registry,
6854
7068
  title: baseName,
6855
7069
  themeId: opts.theme,
6856
- ...!exportMarkdownDoc && opts.transform ? { transformStyle: opts.transform } : {}
7070
+ ...!exportMarkdownDoc && opts.transform ? { transformStyle: opts.transform } : {},
7071
+ ...format === DASHBOARD_IMAGE_FORMAT && dashboardImageOptions ? { formatOptions: { [DASHBOARD_IMAGE_FORMAT]: dashboardImageOptions } } : {}
6857
7072
  });
6858
7073
  throwIfAborted2(opts.signal);
6859
7074
  if (conversion.bytes.byteLength > maxOutputBytes) {
@@ -7278,7 +7493,16 @@ var convertCommand = new Command3("convert").description("Convert a document thr
7278
7493
  ).option("-t, --theme <id>", "Squisq theme ID to apply (e.g., documentary, cinematic, bold)").option(
7279
7494
  "--transform <style>",
7280
7495
  "Transform style to apply before export (e.g., documentary, magazine, minimal)"
7281
- ).option("--allow-overwrite", "replace existing output files instead of refusing the run").action(async (inputPath, opts) => {
7496
+ ).option(
7497
+ "--image-resolution <preset>",
7498
+ "Dashboard image size preset for the png target (hd, fhd, 4k, square, square-2k, portrait, portrait-4k, standard)"
7499
+ ).option("--image-width <pixels>", "Custom dashboard image width (requires --image-height)").option("--image-height <pixels>", "Custom dashboard image height (requires --image-width)").option(
7500
+ "--image-layout <id>",
7501
+ `Dashboard layout id, or "auto" to pick by block count (default: the document's own setting)`
7502
+ ).option(
7503
+ "--image-style <variant>",
7504
+ "Dashboard cell style: basic, card, panel, accent (default: the document's own setting)"
7505
+ ).option("--image-title", "Include the dashboard document-title band").option("--no-image-title", "Hide the dashboard document-title band").option("--allow-overwrite", "replace existing output files instead of refusing the run").action(async (inputPath, opts) => {
7282
7506
  try {
7283
7507
  await runConvert(inputPath, opts);
7284
7508
  } catch (err) {
package/dist/index.d.ts CHANGED
@@ -52,6 +52,18 @@ interface ConvertOptions {
52
52
  * before any conversion work when a destination already exists.
53
53
  */
54
54
  allowOverwrite?: boolean;
55
+ /** Named dashboard-image resolution preset for the `png` target. */
56
+ imageResolution?: string;
57
+ /** Custom dashboard-image width; requires `imageHeight`. */
58
+ imageWidth?: string | number;
59
+ /** Custom dashboard-image height; requires `imageWidth`. */
60
+ imageHeight?: string | number;
61
+ /** Dashboard layout id, or `auto` to pick by block count. */
62
+ imageLayout?: string;
63
+ /** Dashboard cell style variant (`basic`, `card`, `panel`, `accent`). */
64
+ imageStyle?: string;
65
+ /** Render the dashboard's document-title band. */
66
+ imageTitle?: boolean;
55
67
  /** Cancel reading, transformation, conversion, or publication at a bounded boundary. */
56
68
  signal?: AbortSignal;
57
69
  /** Programmatic registry override; the CLI defaults to the linked Squisq registry. */
package/dist/index.js CHANGED
@@ -465,8 +465,69 @@ function throwIfAborted(signal, message) {
465
465
  throw signal.reason ?? cancellationError(message);
466
466
  }
467
467
 
468
+ // src/internal/dashboard-image.ts
469
+ function hasDashboardImageInput(input) {
470
+ return input.resolution !== void 0 || input.width !== void 0 || input.height !== void 0 || input.layout !== void 0 || input.style !== void 0 || input.title !== void 0;
471
+ }
472
+ function pixelCount(value, flag) {
473
+ if (value === void 0) return void 0;
474
+ const parsed = typeof value === "number" ? value : Number(value.trim());
475
+ if (!Number.isFinite(parsed)) {
476
+ throw new Error(`The ${flag} must be a whole number of pixels.`);
477
+ }
478
+ return parsed;
479
+ }
480
+ async function resolveDashboardImageOptions(input) {
481
+ const [{ resolveDashboardStyleId, DASHBOARD_STYLE_IDS }, video] = await Promise.all([
482
+ import("@bendyline/squisq/doc"),
483
+ import("@bendyline/squisq-video")
484
+ ]);
485
+ const width = pixelCount(input.width, "--image-width");
486
+ const height = pixelCount(input.height, "--image-height");
487
+ const dimensions = video.resolveDashboardDimensions({
488
+ resolution: input.resolution,
489
+ width,
490
+ height
491
+ });
492
+ const options = {};
493
+ if (input.resolution !== void 0) {
494
+ options.resolution = input.resolution;
495
+ } else if (width !== void 0 && height !== void 0) {
496
+ options.width = dimensions.width;
497
+ options.height = dimensions.height;
498
+ }
499
+ if (input.layout !== void 0) {
500
+ const layout = input.layout.trim().toLowerCase();
501
+ if (!layout) throw new Error("The --image-layout id must be a non-empty string.");
502
+ options.layout = layout;
503
+ }
504
+ if (input.style !== void 0) {
505
+ const style = resolveDashboardStyleId(input.style);
506
+ if (!style) {
507
+ throw new Error(
508
+ `Unknown dashboard style "${input.style}". Valid: ${DASHBOARD_STYLE_IDS.join(", ")}`
509
+ );
510
+ }
511
+ options.style = style;
512
+ }
513
+ if (input.title !== void 0) options.title = input.title;
514
+ return options;
515
+ }
516
+ async function assertKnownDashboardLayout(layout, doc) {
517
+ if (!layout) return;
518
+ const { DASHBOARD_AUTO_LAYOUT_ID, listDashboardLayouts } = await import("@bendyline/squisq/doc");
519
+ if (layout === DASHBOARD_AUTO_LAYOUT_ID) return;
520
+ const available = listDashboardLayouts(doc);
521
+ if (available.some((entry) => entry.id === layout)) return;
522
+ const known = available.map((entry) => entry.id).join(", ");
523
+ throw new Error(
524
+ `Unknown dashboard layout "${layout}". Valid: ${DASHBOARD_AUTO_LAYOUT_ID}, ${known}`
525
+ );
526
+ }
527
+
468
528
  // src/commands/convert.ts
469
529
  var DEFAULT_FORMATS = ["docx", "pptx", "pdf", "html", "dbk"];
530
+ var DASHBOARD_IMAGE_FORMAT = "png";
470
531
  var DEFAULT_MAX_CONVERT_INPUT_BYTES = 1024 * 1024 * 1024;
471
532
  var DEFAULT_MAX_CONVERT_INPUT_ENTRIES = 2e4;
472
533
  var DEFAULT_MAX_CONVERT_OUTPUT_BYTES = 512 * 1024 * 1024;
@@ -539,6 +600,24 @@ async function runConvert(inputPath, opts) {
539
600
  { format: requested[0], hint: registryHint }
540
601
  );
541
602
  }
603
+ const dashboardImageInput = {
604
+ resolution: opts.imageResolution,
605
+ width: opts.imageWidth,
606
+ height: opts.imageHeight,
607
+ layout: opts.imageLayout,
608
+ style: opts.imageStyle,
609
+ title: opts.imageTitle
610
+ };
611
+ const wantsDashboardImage = formats.includes(DASHBOARD_IMAGE_FORMAT);
612
+ if (hasDashboardImageInput(dashboardImageInput) && !wantsDashboardImage) {
613
+ throw new squisq.ConversionError(
614
+ "unknown-format",
615
+ `The --image-* options only apply to the "${DASHBOARD_IMAGE_FORMAT}" target. Add it to --formats.`,
616
+ { format: DASHBOARD_IMAGE_FORMAT, hint: registryHint }
617
+ );
618
+ }
619
+ const dashboardImageOptions = wantsDashboardImage ? await resolveDashboardImageOptions(dashboardImageInput) : void 0;
620
+ throwIfAborted2(opts.signal);
542
621
  if (opts.transform) {
543
622
  const { getTransformStyleIds } = await import("@bendyline/squisq/transform");
544
623
  throwIfAborted2(opts.signal);
@@ -564,6 +643,7 @@ async function runConvert(inputPath, opts) {
564
643
  opts.theme,
565
644
  result.doc.customThemes?.map((theme) => theme.id)
566
645
  );
646
+ await assertKnownDashboardLayout(dashboardImageOptions?.layout, result.doc);
567
647
  throwIfAborted2(opts.signal);
568
648
  let exportMarkdownDoc = result.markdownDoc;
569
649
  if (opts.transform && exportMarkdownDoc) {
@@ -587,7 +667,8 @@ async function runConvert(inputPath, opts) {
587
667
  registry,
588
668
  title: baseName,
589
669
  themeId: opts.theme,
590
- ...!exportMarkdownDoc && opts.transform ? { transformStyle: opts.transform } : {}
670
+ ...!exportMarkdownDoc && opts.transform ? { transformStyle: opts.transform } : {},
671
+ ...format === DASHBOARD_IMAGE_FORMAT && dashboardImageOptions ? { formatOptions: { [DASHBOARD_IMAGE_FORMAT]: dashboardImageOptions } } : {}
591
672
  });
592
673
  throwIfAborted2(opts.signal);
593
674
  if (conversion.bytes.byteLength > maxOutputBytes) {
@@ -1012,7 +1093,16 @@ var convertCommand = new Command2("convert").description("Convert a document thr
1012
1093
  ).option("-t, --theme <id>", "Squisq theme ID to apply (e.g., documentary, cinematic, bold)").option(
1013
1094
  "--transform <style>",
1014
1095
  "Transform style to apply before export (e.g., documentary, magazine, minimal)"
1015
- ).option("--allow-overwrite", "replace existing output files instead of refusing the run").action(async (inputPath, opts) => {
1096
+ ).option(
1097
+ "--image-resolution <preset>",
1098
+ "Dashboard image size preset for the png target (hd, fhd, 4k, square, square-2k, portrait, portrait-4k, standard)"
1099
+ ).option("--image-width <pixels>", "Custom dashboard image width (requires --image-height)").option("--image-height <pixels>", "Custom dashboard image height (requires --image-width)").option(
1100
+ "--image-layout <id>",
1101
+ `Dashboard layout id, or "auto" to pick by block count (default: the document's own setting)`
1102
+ ).option(
1103
+ "--image-style <variant>",
1104
+ "Dashboard cell style: basic, card, panel, accent (default: the document's own setting)"
1105
+ ).option("--image-title", "Include the dashboard document-title band").option("--no-image-title", "Hide the dashboard document-title band").option("--allow-overwrite", "replace existing output files instead of refusing the run").action(async (inputPath, opts) => {
1016
1106
  try {
1017
1107
  await runConvert(inputPath, opts);
1018
1108
  } catch (err) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bendyline/docblocks-cli",
3
- "version": "2.3.3",
3
+ "version": "2.4.0",
4
4
  "description": "Build, preview, convert, render, inspect, and automate documents",
5
5
  "license": "MIT",
6
6
  "author": "Bendyline",
@@ -47,12 +47,12 @@
47
47
  "typecheck": "tsc --noEmit"
48
48
  },
49
49
  "dependencies": {
50
- "@bendyline/docblocks": "2.3.3",
51
- "@bendyline/squisq": "2.7.0",
52
- "@bendyline/squisq-cli": "2.5.2",
53
- "@bendyline/squisq-formats": "2.4.1",
54
- "@bendyline/squisq-react": "2.7.0",
55
- "@bendyline/squisq-video": "2.2.11",
50
+ "@bendyline/docblocks": "2.4.0",
51
+ "@bendyline/squisq": "2.8.0",
52
+ "@bendyline/squisq-cli": "2.6.0",
53
+ "@bendyline/squisq-formats": "2.4.5",
54
+ "@bendyline/squisq-react": "2.8.0",
55
+ "@bendyline/squisq-video": "2.3.0",
56
56
  "@modelcontextprotocol/sdk": "1.29.0",
57
57
  "commander": "13.1.0",
58
58
  "jszip": "3.10.1",