@imgly/codesign-mcp 0.1.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 (816) hide show
  1. package/LICENSE.md +16 -0
  2. package/README.md +158 -0
  3. package/assets/docs/api/SKILL.md +49 -0
  4. package/assets/docs/api/index.d.ts +10518 -0
  5. package/assets/docs/guide/SKILL.md +142 -0
  6. package/assets/docs/guide/actions.md +1038 -0
  7. package/assets/docs/guide/animation/create/base.md +467 -0
  8. package/assets/docs/guide/animation/create/text.md +453 -0
  9. package/assets/docs/guide/animation/create.md +558 -0
  10. package/assets/docs/guide/animation/edit.md +501 -0
  11. package/assets/docs/guide/animation/overview.md +22 -0
  12. package/assets/docs/guide/animation/types.md +430 -0
  13. package/assets/docs/guide/animation.md +23 -0
  14. package/assets/docs/guide/api/AssetAPI.md +602 -0
  15. package/assets/docs/guide/api/BlockAPI.md +6152 -0
  16. package/assets/docs/guide/api/CreativeEngine.md +180 -0
  17. package/assets/docs/guide/api/EditorAPI.md +1261 -0
  18. package/assets/docs/guide/api/EventAPI.md +25 -0
  19. package/assets/docs/guide/api/SceneAPI.md +729 -0
  20. package/assets/docs/guide/api/VariableAPI.md +59 -0
  21. package/assets/docs/guide/api/types.md +71 -0
  22. package/assets/docs/guide/api-reference/overview.md +20 -0
  23. package/assets/docs/guide/automation/auto-resize.md +412 -0
  24. package/assets/docs/guide/automation/batch-processing.md +474 -0
  25. package/assets/docs/guide/automation/data-merge.md +406 -0
  26. package/assets/docs/guide/automation/design-generation.md +107 -0
  27. package/assets/docs/guide/automation/overview.md +16 -0
  28. package/assets/docs/guide/automation.md +24 -0
  29. package/assets/docs/guide/browser-support.md +38 -0
  30. package/assets/docs/guide/capabilities.md +18 -0
  31. package/assets/docs/guide/colors/adjust.md +551 -0
  32. package/assets/docs/guide/colors/apply.md +349 -0
  33. package/assets/docs/guide/colors/basics.md +440 -0
  34. package/assets/docs/guide/colors/conversion.md +504 -0
  35. package/assets/docs/guide/colors/create-color-palette.md +426 -0
  36. package/assets/docs/guide/colors/for-print/cmyk.md +577 -0
  37. package/assets/docs/guide/colors/for-print/spot.md +751 -0
  38. package/assets/docs/guide/colors/for-print.md +21 -0
  39. package/assets/docs/guide/colors/for-screen/p3.md +60 -0
  40. package/assets/docs/guide/colors/for-screen/srgb.md +463 -0
  41. package/assets/docs/guide/colors/for-screen.md +21 -0
  42. package/assets/docs/guide/colors/overview.md +20 -0
  43. package/assets/docs/guide/colors/replace.md +535 -0
  44. package/assets/docs/guide/colors.md +28 -0
  45. package/assets/docs/guide/compatibility.md +27 -0
  46. package/assets/docs/guide/concepts/architecture.md +99 -0
  47. package/assets/docs/guide/concepts/assets.md +360 -0
  48. package/assets/docs/guide/concepts/blocks.md +750 -0
  49. package/assets/docs/guide/concepts/buffers.md +546 -0
  50. package/assets/docs/guide/concepts/design-units.md +333 -0
  51. package/assets/docs/guide/concepts/edit-modes.md +431 -0
  52. package/assets/docs/guide/concepts/editing-workflow.md +303 -0
  53. package/assets/docs/guide/concepts/events.md +466 -0
  54. package/assets/docs/guide/concepts/headless-mode/browser.md +291 -0
  55. package/assets/docs/guide/concepts/pages.md +396 -0
  56. package/assets/docs/guide/concepts/resources.md +496 -0
  57. package/assets/docs/guide/concepts/scenes.md +443 -0
  58. package/assets/docs/guide/concepts/templating.md +194 -0
  59. package/assets/docs/guide/concepts/terminology.md +296 -0
  60. package/assets/docs/guide/concepts/undo-and-history.md +461 -0
  61. package/assets/docs/guide/concepts.md +38 -0
  62. package/assets/docs/guide/configuration.md +469 -0
  63. package/assets/docs/guide/conversion/overview.md +22 -0
  64. package/assets/docs/guide/conversion/to-base64.md +234 -0
  65. package/assets/docs/guide/conversion/to-pdf.md +616 -0
  66. package/assets/docs/guide/conversion/to-png.md +290 -0
  67. package/assets/docs/guide/conversion.md +23 -0
  68. package/assets/docs/guide/create-audio/audio/add-music.md +430 -0
  69. package/assets/docs/guide/create-audio/audio/add-sound-effects.md +664 -0
  70. package/assets/docs/guide/create-audio/audio/loop.md +370 -0
  71. package/assets/docs/guide/create-audio/audio.md +336 -0
  72. package/assets/docs/guide/create-composition/add-background.md +395 -0
  73. package/assets/docs/guide/create-composition/blend-modes.md +372 -0
  74. package/assets/docs/guide/create-composition/collage.md +432 -0
  75. package/assets/docs/guide/create-composition/group-and-ungroup.md +388 -0
  76. package/assets/docs/guide/create-composition/layer-management.md +503 -0
  77. package/assets/docs/guide/create-composition/layout.md +396 -0
  78. package/assets/docs/guide/create-composition/lock-design.md +362 -0
  79. package/assets/docs/guide/create-composition/multi-page.md +204 -0
  80. package/assets/docs/guide/create-composition/overview.md +18 -0
  81. package/assets/docs/guide/create-composition/programmatic.md +593 -0
  82. package/assets/docs/guide/create-composition.md +30 -0
  83. package/assets/docs/guide/create-templates/add-dynamic-content/placeholders.md +688 -0
  84. package/assets/docs/guide/create-templates/add-dynamic-content/set-editing-constraints.md +600 -0
  85. package/assets/docs/guide/create-templates/add-dynamic-content/text-variables.md +647 -0
  86. package/assets/docs/guide/create-templates/add-dynamic-content.md +307 -0
  87. package/assets/docs/guide/create-templates/add-to-template-library.md +297 -0
  88. package/assets/docs/guide/create-templates/edit-or-remove.md +441 -0
  89. package/assets/docs/guide/create-templates/from-scratch.md +558 -0
  90. package/assets/docs/guide/create-templates/import/from-scene-file.md +440 -0
  91. package/assets/docs/guide/create-templates/import.md +244 -0
  92. package/assets/docs/guide/create-templates/lock.md +325 -0
  93. package/assets/docs/guide/create-templates/overview.md +16 -0
  94. package/assets/docs/guide/create-templates.md +32 -0
  95. package/assets/docs/guide/create-video/audio/adjust-speed.md +302 -0
  96. package/assets/docs/guide/create-video/audio/adjust-volume.md +346 -0
  97. package/assets/docs/guide/create-video/control.md +285 -0
  98. package/assets/docs/guide/create-video/limitations.md +396 -0
  99. package/assets/docs/guide/create-video/overview.md +224 -0
  100. package/assets/docs/guide/create-video/timeline-editor.md +622 -0
  101. package/assets/docs/guide/create-video/update-caption-presets.md +676 -0
  102. package/assets/docs/guide/create-video.md +32 -0
  103. package/assets/docs/guide/edit-image/add-watermark.md +497 -0
  104. package/assets/docs/guide/edit-image/overview.md +22 -0
  105. package/assets/docs/guide/edit-image/remove-bg.md +420 -0
  106. package/assets/docs/guide/edit-image/replace-colors.md +680 -0
  107. package/assets/docs/guide/edit-image/transform/crop.md +523 -0
  108. package/assets/docs/guide/edit-image/transform/move.md +279 -0
  109. package/assets/docs/guide/edit-image/transform/resize.md +301 -0
  110. package/assets/docs/guide/edit-image/transform/rotate.md +408 -0
  111. package/assets/docs/guide/edit-image/transform/scale.md +278 -0
  112. package/assets/docs/guide/edit-image/transform.md +24 -0
  113. package/assets/docs/guide/edit-image/vectorize.md +204 -0
  114. package/assets/docs/guide/edit-image.md +25 -0
  115. package/assets/docs/guide/edit-video/add-captions.md +589 -0
  116. package/assets/docs/guide/edit-video/add-watermark.md +429 -0
  117. package/assets/docs/guide/edit-video/join-and-arrange.md +540 -0
  118. package/assets/docs/guide/edit-video/redaction.md +544 -0
  119. package/assets/docs/guide/edit-video/split.md +634 -0
  120. package/assets/docs/guide/edit-video/transform/crop.md +380 -0
  121. package/assets/docs/guide/edit-video/transform/flip.md +182 -0
  122. package/assets/docs/guide/edit-video/transform/move.md +413 -0
  123. package/assets/docs/guide/edit-video/transform/resize.md +534 -0
  124. package/assets/docs/guide/edit-video/transform/rotate.md +312 -0
  125. package/assets/docs/guide/edit-video/transform/scale.md +603 -0
  126. package/assets/docs/guide/edit-video/transform.md +25 -0
  127. package/assets/docs/guide/edit-video/trim.md +773 -0
  128. package/assets/docs/guide/engine-interface.md +108 -0
  129. package/assets/docs/guide/export-save-publish/create-thumbnail.md +292 -0
  130. package/assets/docs/guide/export-save-publish/export/compress.md +639 -0
  131. package/assets/docs/guide/export-save-publish/export/overview.md +576 -0
  132. package/assets/docs/guide/export-save-publish/export/partial-export.md +694 -0
  133. package/assets/docs/guide/export-save-publish/export/size-limits.md +401 -0
  134. package/assets/docs/guide/export-save-publish/export/to-html5.md +474 -0
  135. package/assets/docs/guide/export-save-publish/export/to-jpeg.md +312 -0
  136. package/assets/docs/guide/export-save-publish/export/to-mp4.md +364 -0
  137. package/assets/docs/guide/export-save-publish/export/to-pdf.md +389 -0
  138. package/assets/docs/guide/export-save-publish/export/to-png.md +255 -0
  139. package/assets/docs/guide/export-save-publish/export/to-raw-data.md +303 -0
  140. package/assets/docs/guide/export-save-publish/export/to-webp.md +261 -0
  141. package/assets/docs/guide/export-save-publish/export/with-color-mask.md +278 -0
  142. package/assets/docs/guide/export-save-publish/export.md +36 -0
  143. package/assets/docs/guide/export-save-publish/for-printing.md +423 -0
  144. package/assets/docs/guide/export-save-publish/for-social-media.md +318 -0
  145. package/assets/docs/guide/export-save-publish/pre-export-validation.md +698 -0
  146. package/assets/docs/guide/export-save-publish/save.md +340 -0
  147. package/assets/docs/guide/export-save-publish/store-custom-metadata.md +367 -0
  148. package/assets/docs/guide/file-format-support.md +34 -0
  149. package/assets/docs/guide/fills/color.md +678 -0
  150. package/assets/docs/guide/fills/image.md +539 -0
  151. package/assets/docs/guide/fills/overview.md +144 -0
  152. package/assets/docs/guide/fills/video.md +641 -0
  153. package/assets/docs/guide/fills.md +24 -0
  154. package/assets/docs/guide/filters-and-effects/apply.md +1019 -0
  155. package/assets/docs/guide/filters-and-effects/blur.md +382 -0
  156. package/assets/docs/guide/filters-and-effects/chroma-key-green-screen.md +445 -0
  157. package/assets/docs/guide/filters-and-effects/create-custom-filters.md +614 -0
  158. package/assets/docs/guide/filters-and-effects/create-custom-lut-filter.md +426 -0
  159. package/assets/docs/guide/filters-and-effects/distortion.md +527 -0
  160. package/assets/docs/guide/filters-and-effects/duotone.md +602 -0
  161. package/assets/docs/guide/filters-and-effects/gradients.md +1311 -0
  162. package/assets/docs/guide/filters-and-effects/overview.md +22 -0
  163. package/assets/docs/guide/filters-and-effects/support.md +623 -0
  164. package/assets/docs/guide/filters-and-effects.md +28 -0
  165. package/assets/docs/guide/get-started/agent-skills.md +119 -0
  166. package/assets/docs/guide/get-started/build-with-ai.md +45 -0
  167. package/assets/docs/guide/get-started/mcp-server.md +119 -0
  168. package/assets/docs/guide/get-started/overview.md +28 -0
  169. package/assets/docs/guide/get-started/vanilla-js/quickstart.md +175 -0
  170. package/assets/docs/guide/grid-and-rulers.md +222 -0
  171. package/assets/docs/guide/guides/export-save-publish/export/audio.md +224 -0
  172. package/assets/docs/guide/guides/text/rendering-internals.md +796 -0
  173. package/assets/docs/guide/guides.md +49 -0
  174. package/assets/docs/guide/import-media/asset-library.md +23 -0
  175. package/assets/docs/guide/import-media/asset-panel/basics.md +324 -0
  176. package/assets/docs/guide/import-media/asset-panel/customize.md +478 -0
  177. package/assets/docs/guide/import-media/asset-panel/refresh-assets.md +415 -0
  178. package/assets/docs/guide/import-media/asset-panel/thumbnails.md +633 -0
  179. package/assets/docs/guide/import-media/capture-from-camera/record-video.md +137 -0
  180. package/assets/docs/guide/import-media/capture-from-camera.md +20 -0
  181. package/assets/docs/guide/import-media/concepts.md +173 -0
  182. package/assets/docs/guide/import-media/content-json-schema.md +615 -0
  183. package/assets/docs/guide/import-media/default-assets.md +381 -0
  184. package/assets/docs/guide/import-media/edit-or-remove-assets.md +489 -0
  185. package/assets/docs/guide/import-media/file-format-support.md +178 -0
  186. package/assets/docs/guide/import-media/from-local-source/user-upload.md +438 -0
  187. package/assets/docs/guide/import-media/from-local-source.md +20 -0
  188. package/assets/docs/guide/import-media/from-remote-source/asset-versioning.md +390 -0
  189. package/assets/docs/guide/import-media/from-remote-source/getty-images.md +627 -0
  190. package/assets/docs/guide/import-media/from-remote-source/imgly-premium-assets.md +625 -0
  191. package/assets/docs/guide/import-media/from-remote-source/pexels.md +692 -0
  192. package/assets/docs/guide/import-media/from-remote-source/remote-asset.md +473 -0
  193. package/assets/docs/guide/import-media/from-remote-source/soundstripe.md +497 -0
  194. package/assets/docs/guide/import-media/from-remote-source/third-party.md +51 -0
  195. package/assets/docs/guide/import-media/from-remote-source/unsplash.md +914 -0
  196. package/assets/docs/guide/import-media/from-remote-source/your-server.md +764 -0
  197. package/assets/docs/guide/import-media/from-remote-source.md +28 -0
  198. package/assets/docs/guide/import-media/overview.md +32 -0
  199. package/assets/docs/guide/import-media/retrieve-mimetype.md +274 -0
  200. package/assets/docs/guide/import-media/size-limits.md +20 -0
  201. package/assets/docs/guide/import-media/source-sets.md +476 -0
  202. package/assets/docs/guide/import-media.md +32 -0
  203. package/assets/docs/guide/insert-media/audio.md +291 -0
  204. package/assets/docs/guide/insert-media/images.md +380 -0
  205. package/assets/docs/guide/insert-media/position-and-align.md +734 -0
  206. package/assets/docs/guide/insert-media/shapes-or-stickers.md +799 -0
  207. package/assets/docs/guide/insert-media/videos.md +308 -0
  208. package/assets/docs/guide/insert-media.md +24 -0
  209. package/assets/docs/guide/key-capabilities.md +24 -0
  210. package/assets/docs/guide/key-concepts.md +83 -0
  211. package/assets/docs/guide/licensing.md +45 -0
  212. package/assets/docs/guide/llms-txt.md +53 -0
  213. package/assets/docs/guide/open-the-editor/blank-canvas.md +124 -0
  214. package/assets/docs/guide/open-the-editor/from-htmlcanvas.md +228 -0
  215. package/assets/docs/guide/open-the-editor/from-image.md +205 -0
  216. package/assets/docs/guide/open-the-editor/from-template.md +189 -0
  217. package/assets/docs/guide/open-the-editor/from-video.md +274 -0
  218. package/assets/docs/guide/open-the-editor/import-design/from-archive.md +504 -0
  219. package/assets/docs/guide/open-the-editor/import-design/from-indesign.md +680 -0
  220. package/assets/docs/guide/open-the-editor/import-design/from-photoshop.md +865 -0
  221. package/assets/docs/guide/open-the-editor/import-design.md +481 -0
  222. package/assets/docs/guide/open-the-editor/load-scene.md +178 -0
  223. package/assets/docs/guide/open-the-editor/overview.md +20 -0
  224. package/assets/docs/guide/open-the-editor/set-zoom-level.md +303 -0
  225. package/assets/docs/guide/open-the-editor/uri-resolver.md +347 -0
  226. package/assets/docs/guide/open-the-editor.md +29 -0
  227. package/assets/docs/guide/outlines/overview.md +14 -0
  228. package/assets/docs/guide/outlines/shadows-and-glows.md +515 -0
  229. package/assets/docs/guide/outlines/strokes.md +292 -0
  230. package/assets/docs/guide/outlines.md +22 -0
  231. package/assets/docs/guide/overview.md +22 -0
  232. package/assets/docs/guide/performance.md +217 -0
  233. package/assets/docs/guide/plugins/asset-sources.md +553 -0
  234. package/assets/docs/guide/plugins/print-ready-pdf.md +549 -0
  235. package/assets/docs/guide/plugins.md +36 -0
  236. package/assets/docs/guide/rules/asset-handling.md +180 -0
  237. package/assets/docs/guide/rules/common-pitfalls.md +272 -0
  238. package/assets/docs/guide/rules/content-fill-mode.md +29 -0
  239. package/assets/docs/guide/rules/enforce-brand-guidelines.md +672 -0
  240. package/assets/docs/guide/rules/lock-content.md +478 -0
  241. package/assets/docs/guide/rules/moderate-content.md +761 -0
  242. package/assets/docs/guide/rules/overview.md +514 -0
  243. package/assets/docs/guide/rules/silent-init-errors.md +137 -0
  244. package/assets/docs/guide/rules/verify-properties-before-use.md +78 -0
  245. package/assets/docs/guide/rules.md +23 -0
  246. package/assets/docs/guide/security.md +199 -0
  247. package/assets/docs/guide/serve-assets.md +332 -0
  248. package/assets/docs/guide/settings.md +199 -0
  249. package/assets/docs/guide/shapes.md +23 -0
  250. package/assets/docs/guide/starterkits/3d-mockup-editor.md +748 -0
  251. package/assets/docs/guide/starterkits/advanced-editor.md +698 -0
  252. package/assets/docs/guide/starterkits/advanced-video-editor.md +696 -0
  253. package/assets/docs/guide/starterkits/ai-editor.md +749 -0
  254. package/assets/docs/guide/starterkits/airtable-image-editor.md +672 -0
  255. package/assets/docs/guide/starterkits/apparel-ui.md +188 -0
  256. package/assets/docs/guide/starterkits/assets.md +27 -0
  257. package/assets/docs/guide/starterkits/auto-resize.md +586 -0
  258. package/assets/docs/guide/starterkits/automated-video-generation.md +692 -0
  259. package/assets/docs/guide/starterkits/background-removal-editor.md +480 -0
  260. package/assets/docs/guide/starterkits/content-moderation.md +863 -0
  261. package/assets/docs/guide/starterkits/creative-automation.md +28 -0
  262. package/assets/docs/guide/starterkits/custom-built-uis.md +26 -0
  263. package/assets/docs/guide/starterkits/customization.md +29 -0
  264. package/assets/docs/guide/starterkits/cutout-lines-editor.md +470 -0
  265. package/assets/docs/guide/starterkits/data-merge.md +850 -0
  266. package/assets/docs/guide/starterkits/design-editor.md +698 -0
  267. package/assets/docs/guide/starterkits/design-generation.md +719 -0
  268. package/assets/docs/guide/starterkits/design-validation.md +808 -0
  269. package/assets/docs/guide/starterkits/editor-ui-configurations.md +14 -0
  270. package/assets/docs/guide/starterkits/export-options.md +724 -0
  271. package/assets/docs/guide/starterkits/export-using-renderer.md +708 -0
  272. package/assets/docs/guide/starterkits/extensibility.md +28 -0
  273. package/assets/docs/guide/starterkits/force-crop-editor.md +675 -0
  274. package/assets/docs/guide/starterkits/form-based-template-adoption.md +522 -0
  275. package/assets/docs/guide/starterkits/getty-images-editor.md +700 -0
  276. package/assets/docs/guide/starterkits/html5-ads-exporter.md +719 -0
  277. package/assets/docs/guide/starterkits/indesign-template-import.md +580 -0
  278. package/assets/docs/guide/starterkits/layouts-editor.md +724 -0
  279. package/assets/docs/guide/starterkits/mobile-ui.md +185 -0
  280. package/assets/docs/guide/starterkits/mockup-editor.md +745 -0
  281. package/assets/docs/guide/starterkits/multi-image-generation.md +542 -0
  282. package/assets/docs/guide/starterkits/page-sizes-editor.md +657 -0
  283. package/assets/docs/guide/starterkits/pexels-image-editor.md +665 -0
  284. package/assets/docs/guide/starterkits/photo-editor.md +755 -0
  285. package/assets/docs/guide/starterkits/photo-ui.md +186 -0
  286. package/assets/docs/guide/starterkits/photobook-ui.md +188 -0
  287. package/assets/docs/guide/starterkits/placeholders.md +678 -0
  288. package/assets/docs/guide/starterkits/player.md +405 -0
  289. package/assets/docs/guide/starterkits/plugins.md +25 -0
  290. package/assets/docs/guide/starterkits/postcard-editor.md +202 -0
  291. package/assets/docs/guide/starterkits/pptx-template-import.md +581 -0
  292. package/assets/docs/guide/starterkits/print-ready-pdf-editor.md +746 -0
  293. package/assets/docs/guide/starterkits/product-editor.md +773 -0
  294. package/assets/docs/guide/starterkits/psd-template-import.md +580 -0
  295. package/assets/docs/guide/starterkits/qr-code-editor.md +470 -0
  296. package/assets/docs/guide/starterkits/single-page-editor.md +661 -0
  297. package/assets/docs/guide/starterkits/start-with-image.md +684 -0
  298. package/assets/docs/guide/starterkits/start-with-video.md +651 -0
  299. package/assets/docs/guide/starterkits/t-shirt-designer.md +742 -0
  300. package/assets/docs/guide/starterkits/templating.md +23 -0
  301. package/assets/docs/guide/starterkits/theming.md +662 -0
  302. package/assets/docs/guide/starterkits/translation-internationalization.md +662 -0
  303. package/assets/docs/guide/starterkits/unsplash-editor.md +839 -0
  304. package/assets/docs/guide/starterkits/vectorizer-editor.md +466 -0
  305. package/assets/docs/guide/starterkits/version-history.md +745 -0
  306. package/assets/docs/guide/starterkits/video-animations.md +853 -0
  307. package/assets/docs/guide/starterkits/video-captions.md +884 -0
  308. package/assets/docs/guide/starterkits/video-editing.md +25 -0
  309. package/assets/docs/guide/starterkits/video-editor.md +696 -0
  310. package/assets/docs/guide/starterkits/video-export-options.md +676 -0
  311. package/assets/docs/guide/starterkits/viewer.md +400 -0
  312. package/assets/docs/guide/starterkits.md +41 -0
  313. package/assets/docs/guide/stickers-and-shapes/combine.md +743 -0
  314. package/assets/docs/guide/stickers-and-shapes/create-cutout.md +425 -0
  315. package/assets/docs/guide/stickers-and-shapes/create-edit/create-shapes.md +794 -0
  316. package/assets/docs/guide/stickers-and-shapes/create-edit/create-stickers.md +290 -0
  317. package/assets/docs/guide/stickers-and-shapes/create-edit/edit-shapes.md +211 -0
  318. package/assets/docs/guide/stickers-and-shapes/create-edit/vector-edit.md +362 -0
  319. package/assets/docs/guide/stickers-and-shapes/insert-qr-code.md +208 -0
  320. package/assets/docs/guide/stickers.md +21 -0
  321. package/assets/docs/guide/text/add.md +641 -0
  322. package/assets/docs/guide/text/adjust-spacing.md +288 -0
  323. package/assets/docs/guide/text/auto-size.md +404 -0
  324. package/assets/docs/guide/text/custom-fonts.md +401 -0
  325. package/assets/docs/guide/text/decorations.md +330 -0
  326. package/assets/docs/guide/text/edit.md +458 -0
  327. package/assets/docs/guide/text/effects.md +244 -0
  328. package/assets/docs/guide/text/emojis.md +310 -0
  329. package/assets/docs/guide/text/enumerations.md +258 -0
  330. package/assets/docs/guide/text/language-support.md +604 -0
  331. package/assets/docs/guide/text/overview.md +14 -0
  332. package/assets/docs/guide/text/styling.md +390 -0
  333. package/assets/docs/guide/text/text-designs.md +834 -0
  334. package/assets/docs/guide/text.md +33 -0
  335. package/assets/docs/guide/to-v1-10.md +131 -0
  336. package/assets/docs/guide/to-v1-13.md +165 -0
  337. package/assets/docs/guide/to-v1-19.md +315 -0
  338. package/assets/docs/guide/to-v1-32.md +110 -0
  339. package/assets/docs/guide/to-v1-69.md +468 -0
  340. package/assets/docs/guide/to-v1-72.md +193 -0
  341. package/assets/docs/guide/upgrade.md +25 -0
  342. package/assets/docs/guide/use-templates/apply-template.md +279 -0
  343. package/assets/docs/guide/use-templates/generate.md +405 -0
  344. package/assets/docs/guide/use-templates/library.md +450 -0
  345. package/assets/docs/guide/use-templates/overview.md +20 -0
  346. package/assets/docs/guide/use-templates/programmatic.md +482 -0
  347. package/assets/docs/guide/use-templates/replace-content.md +399 -0
  348. package/assets/docs/guide/user-interface/ai-integration/audio-generation.md +428 -0
  349. package/assets/docs/guide/user-interface/ai-integration/auto-captions.md +337 -0
  350. package/assets/docs/guide/user-interface/ai-integration/custom-provider.md +853 -0
  351. package/assets/docs/guide/user-interface/ai-integration/gateway-provider.md +1045 -0
  352. package/assets/docs/guide/user-interface/ai-integration/image-generation.md +641 -0
  353. package/assets/docs/guide/user-interface/ai-integration/integrate.md +966 -0
  354. package/assets/docs/guide/user-interface/ai-integration/proxy-server.md +99 -0
  355. package/assets/docs/guide/user-interface/ai-integration/text-generation.md +498 -0
  356. package/assets/docs/guide/user-interface/ai-integration/video-generation.md +493 -0
  357. package/assets/docs/guide/user-interface/ai-integration.md +30 -0
  358. package/assets/docs/guide/user-interface/appearance/change-ui-font.md +316 -0
  359. package/assets/docs/guide/user-interface/appearance/custom-labels.md +509 -0
  360. package/assets/docs/guide/user-interface/appearance/icons.md +373 -0
  361. package/assets/docs/guide/user-interface/appearance/theming.md +665 -0
  362. package/assets/docs/guide/user-interface/appearance.md +23 -0
  363. package/assets/docs/guide/user-interface/build-your-own-ui.md +620 -0
  364. package/assets/docs/guide/user-interface/customization/canvas-menu.md +412 -0
  365. package/assets/docs/guide/user-interface/customization/canvas.md +281 -0
  366. package/assets/docs/guide/user-interface/customization/color-palette.md +413 -0
  367. package/assets/docs/guide/user-interface/customization/crop-presets.md +384 -0
  368. package/assets/docs/guide/user-interface/customization/disable-or-enable.md +676 -0
  369. package/assets/docs/guide/user-interface/customization/dock.md +399 -0
  370. package/assets/docs/guide/user-interface/customization/force-crop.md +289 -0
  371. package/assets/docs/guide/user-interface/customization/inspector-bar.md +371 -0
  372. package/assets/docs/guide/user-interface/customization/navigation-bar.md +516 -0
  373. package/assets/docs/guide/user-interface/customization/page-format.md +436 -0
  374. package/assets/docs/guide/user-interface/customization/panel.md +605 -0
  375. package/assets/docs/guide/user-interface/customization/quick-start/add-action-buttons.md +531 -0
  376. package/assets/docs/guide/user-interface/customization/quick-start/add-dock-buttons.md +358 -0
  377. package/assets/docs/guide/user-interface/customization/quick-start/create-custom-components.md +374 -0
  378. package/assets/docs/guide/user-interface/customization/quick-start/reorder-components.md +323 -0
  379. package/assets/docs/guide/user-interface/customization/quick-start/show-hide-components.md +294 -0
  380. package/assets/docs/guide/user-interface/customization/quick-start.md +12 -0
  381. package/assets/docs/guide/user-interface/customization/reference/component-order-api.md +519 -0
  382. package/assets/docs/guide/user-interface/customization/reference/component-reference.md +333 -0
  383. package/assets/docs/guide/user-interface/customization/reference.md +12 -0
  384. package/assets/docs/guide/user-interface/customization.md +39 -0
  385. package/assets/docs/guide/user-interface/localization.md +633 -0
  386. package/assets/docs/guide/user-interface/overview.md +167 -0
  387. package/assets/docs/guide/user-interface/ui-extensions/add-custom-feature.md +411 -0
  388. package/assets/docs/guide/user-interface/ui-extensions/asset-library.md +721 -0
  389. package/assets/docs/guide/user-interface/ui-extensions/create-custom-panel.md +331 -0
  390. package/assets/docs/guide/user-interface/ui-extensions/customize-behaviour.md +553 -0
  391. package/assets/docs/guide/user-interface/ui-extensions/notifications-and-dialogs.md +672 -0
  392. package/assets/docs/guide/user-interface/ui-extensions/quick-actions.md +415 -0
  393. package/assets/docs/guide/user-interface/ui-extensions/register-new-component.md +521 -0
  394. package/assets/docs/guide/user-interface/ui-extensions.md +26 -0
  395. package/assets/docs/guide/user-interface.md +25 -0
  396. package/assets/docs/guide/what-is-cesdk.md +319 -0
  397. package/assets/docs/handbook/SKILL.md +521 -0
  398. package/assets/prompts/evals-assetGenerate.md +12 -0
  399. package/assets/prompts/evals-brutalistCore.md +34 -0
  400. package/assets/prompts/evals-danskCatalogue.md +31 -0
  401. package/assets/prompts/evals-exportRoundTrip.md +12 -0
  402. package/assets/prompts/evals-inspectPriorCode.md +16 -0
  403. package/assets/prompts/evals-listProjectFiles.md +6 -0
  404. package/assets/prompts/evals-readAndExplainScript.md +6 -0
  405. package/assets/prompts/evals-resumeAcrossRestart.md +15 -0
  406. package/assets/prompts/evals-rewindRecovery.md +10 -0
  407. package/assets/prompts/evals-searchAcrossFiles.md +6 -0
  408. package/assets/prompts/evals-weddingCard.md +20 -0
  409. package/assets/prompts/explain.md +6 -0
  410. package/assets/prompts/review.md +6 -0
  411. package/dist/assets/inline.generated.d.ts +2 -0
  412. package/dist/assets/inline.generated.d.ts.map +1 -0
  413. package/dist/assets/inline.generated.js +413 -0
  414. package/dist/assets/inline.generated.js.map +1 -0
  415. package/dist/assets/load-browser.d.ts +8 -0
  416. package/dist/assets/load-browser.d.ts.map +1 -0
  417. package/dist/assets/load-browser.js +11 -0
  418. package/dist/assets/load-browser.js.map +1 -0
  419. package/dist/assets/load-node.d.ts +8 -0
  420. package/dist/assets/load-node.d.ts.map +1 -0
  421. package/dist/assets/load-node.js +11 -0
  422. package/dist/assets/load-node.js.map +1 -0
  423. package/dist/cli/http.d.ts +2 -0
  424. package/dist/cli/http.d.ts.map +1 -0
  425. package/dist/cli/http.js +231 -0
  426. package/dist/cli/http.js.map +1 -0
  427. package/dist/cli/redirect-console.d.ts +10 -0
  428. package/dist/cli/redirect-console.d.ts.map +1 -0
  429. package/dist/cli/redirect-console.js +18 -0
  430. package/dist/cli/redirect-console.js.map +1 -0
  431. package/dist/cli/resolve-license.d.ts +2 -0
  432. package/dist/cli/resolve-license.d.ts.map +1 -0
  433. package/dist/cli/resolve-license.js +13 -0
  434. package/dist/cli/resolve-license.js.map +1 -0
  435. package/dist/cli/stdio.d.ts +2 -0
  436. package/dist/cli/stdio.d.ts.map +1 -0
  437. package/dist/cli/stdio.js +124 -0
  438. package/dist/cli/stdio.js.map +1 -0
  439. package/dist/cli/trial-license.generated.d.ts +2 -0
  440. package/dist/cli/trial-license.generated.d.ts.map +1 -0
  441. package/dist/cli/trial-license.generated.js +4 -0
  442. package/dist/cli/trial-license.generated.js.map +1 -0
  443. package/dist/cli.d.ts +3 -0
  444. package/dist/cli.d.ts.map +1 -0
  445. package/dist/cli.js +64 -0
  446. package/dist/cli.js.map +1 -0
  447. package/dist/config.d.ts +61 -0
  448. package/dist/config.d.ts.map +1 -0
  449. package/dist/config.js +102 -0
  450. package/dist/config.js.map +1 -0
  451. package/dist/cross-ref.d.ts +2 -0
  452. package/dist/cross-ref.d.ts.map +1 -0
  453. package/dist/cross-ref.js +31 -0
  454. package/dist/cross-ref.js.map +1 -0
  455. package/dist/dashboard/router.d.ts +3 -0
  456. package/dist/dashboard/router.d.ts.map +1 -0
  457. package/dist/dashboard/router.js +19 -0
  458. package/dist/dashboard/router.js.map +1 -0
  459. package/dist/dashboard/spa-assets.generated.d.ts +2 -0
  460. package/dist/dashboard/spa-assets.generated.d.ts.map +1 -0
  461. package/dist/dashboard/spa-assets.generated.js +220 -0
  462. package/dist/dashboard/spa-assets.generated.js.map +1 -0
  463. package/dist/engine/asset-sources.d.ts +17 -0
  464. package/dist/engine/asset-sources.d.ts.map +1 -0
  465. package/dist/engine/asset-sources.js +75 -0
  466. package/dist/engine/asset-sources.js.map +1 -0
  467. package/dist/engine/cesdk-adapter.d.ts +10 -0
  468. package/dist/engine/cesdk-adapter.d.ts.map +1 -0
  469. package/dist/engine/cesdk-adapter.js +19 -0
  470. package/dist/engine/cesdk-adapter.js.map +1 -0
  471. package/dist/engine/index.d.ts +3 -0
  472. package/dist/engine/index.d.ts.map +1 -0
  473. package/dist/engine/index.js +3 -0
  474. package/dist/engine/index.js.map +1 -0
  475. package/dist/engine/mutex.d.ts +5 -0
  476. package/dist/engine/mutex.d.ts.map +1 -0
  477. package/dist/engine/mutex.js +42 -0
  478. package/dist/engine/mutex.js.map +1 -0
  479. package/dist/engine/session.d.ts +50 -0
  480. package/dist/engine/session.d.ts.map +1 -0
  481. package/dist/engine/session.js +95 -0
  482. package/dist/engine/session.js.map +1 -0
  483. package/dist/engine/uri-resolver.d.ts +14 -0
  484. package/dist/engine/uri-resolver.d.ts.map +1 -0
  485. package/dist/engine/uri-resolver.js +12 -0
  486. package/dist/engine/uri-resolver.js.map +1 -0
  487. package/dist/frontmatter.d.ts +15 -0
  488. package/dist/frontmatter.d.ts.map +1 -0
  489. package/dist/frontmatter.js +46 -0
  490. package/dist/frontmatter.js.map +1 -0
  491. package/dist/gateway/hosted-stub.d.ts +6 -0
  492. package/dist/gateway/hosted-stub.d.ts.map +1 -0
  493. package/dist/gateway/hosted-stub.js +11 -0
  494. package/dist/gateway/hosted-stub.js.map +1 -0
  495. package/dist/gateway/index.d.ts +4 -0
  496. package/dist/gateway/index.d.ts.map +1 -0
  497. package/dist/gateway/index.js +4 -0
  498. package/dist/gateway/index.js.map +1 -0
  499. package/dist/gateway/local.d.ts +14 -0
  500. package/dist/gateway/local.d.ts.map +1 -0
  501. package/dist/gateway/local.js +41 -0
  502. package/dist/gateway/local.js.map +1 -0
  503. package/dist/gateway/types.d.ts +24 -0
  504. package/dist/gateway/types.d.ts.map +1 -0
  505. package/dist/gateway/types.js +7 -0
  506. package/dist/gateway/types.js.map +1 -0
  507. package/dist/http/server.d.ts +80 -0
  508. package/dist/http/server.d.ts.map +1 -0
  509. package/dist/http/server.js +183 -0
  510. package/dist/http/server.js.map +1 -0
  511. package/dist/http/session-manager.d.ts +42 -0
  512. package/dist/http/session-manager.d.ts.map +1 -0
  513. package/dist/http/session-manager.js +82 -0
  514. package/dist/http/session-manager.js.map +1 -0
  515. package/dist/http/workspace-auth.d.ts +9 -0
  516. package/dist/http/workspace-auth.d.ts.map +1 -0
  517. package/dist/http/workspace-auth.js +29 -0
  518. package/dist/http/workspace-auth.js.map +1 -0
  519. package/dist/index.d.ts +10 -0
  520. package/dist/index.d.ts.map +1 -0
  521. package/dist/index.js +10 -0
  522. package/dist/index.js.map +1 -0
  523. package/dist/metrics/mount.d.ts +11 -0
  524. package/dist/metrics/mount.d.ts.map +1 -0
  525. package/dist/metrics/mount.js +13 -0
  526. package/dist/metrics/mount.js.map +1 -0
  527. package/dist/metrics/recorder.d.ts +55 -0
  528. package/dist/metrics/recorder.d.ts.map +1 -0
  529. package/dist/metrics/recorder.js +97 -0
  530. package/dist/metrics/recorder.js.map +1 -0
  531. package/dist/revisions/hash.d.ts +7 -0
  532. package/dist/revisions/hash.d.ts.map +1 -0
  533. package/dist/revisions/hash.js +24 -0
  534. package/dist/revisions/hash.js.map +1 -0
  535. package/dist/revisions/index.d.ts +4 -0
  536. package/dist/revisions/index.d.ts.map +1 -0
  537. package/dist/revisions/index.js +4 -0
  538. package/dist/revisions/index.js.map +1 -0
  539. package/dist/revisions/store.d.ts +69 -0
  540. package/dist/revisions/store.d.ts.map +1 -0
  541. package/dist/revisions/store.js +196 -0
  542. package/dist/revisions/store.js.map +1 -0
  543. package/dist/revisions/types.d.ts +39 -0
  544. package/dist/revisions/types.d.ts.map +1 -0
  545. package/dist/revisions/types.js +2 -0
  546. package/dist/revisions/types.js.map +1 -0
  547. package/dist/server.d.ts +51 -0
  548. package/dist/server.d.ts.map +1 -0
  549. package/dist/server.js +175 -0
  550. package/dist/server.js.map +1 -0
  551. package/dist/skill-tools.d.ts +3 -0
  552. package/dist/skill-tools.d.ts.map +1 -0
  553. package/dist/skill-tools.js +105 -0
  554. package/dist/skill-tools.js.map +1 -0
  555. package/dist/test/test/cli/dispatcher.test.d.ts +2 -0
  556. package/dist/test/test/cli/dispatcher.test.d.ts.map +1 -0
  557. package/dist/test/test/cli/dispatcher.test.js +47 -0
  558. package/dist/test/test/cli/dispatcher.test.js.map +1 -0
  559. package/dist/test/test/cross-ref.test.d.ts +2 -0
  560. package/dist/test/test/cross-ref.test.d.ts.map +1 -0
  561. package/dist/test/test/cross-ref.test.js +39 -0
  562. package/dist/test/test/cross-ref.test.js.map +1 -0
  563. package/dist/test/test/engine/session.test.d.ts +2 -0
  564. package/dist/test/test/engine/session.test.d.ts.map +1 -0
  565. package/dist/test/test/engine/session.test.js +144 -0
  566. package/dist/test/test/engine/session.test.js.map +1 -0
  567. package/dist/test/test/engine/uri-resolver.test.d.ts +2 -0
  568. package/dist/test/test/engine/uri-resolver.test.d.ts.map +1 -0
  569. package/dist/test/test/engine/uri-resolver.test.js +38 -0
  570. package/dist/test/test/engine/uri-resolver.test.js.map +1 -0
  571. package/dist/test/test/frontmatter.test.d.ts +2 -0
  572. package/dist/test/test/frontmatter.test.d.ts.map +1 -0
  573. package/dist/test/test/frontmatter.test.js +55 -0
  574. package/dist/test/test/frontmatter.test.js.map +1 -0
  575. package/dist/test/test/gateway/hosted-stub.test.d.ts +2 -0
  576. package/dist/test/test/gateway/hosted-stub.test.d.ts.map +1 -0
  577. package/dist/test/test/gateway/hosted-stub.test.js +11 -0
  578. package/dist/test/test/gateway/hosted-stub.test.js.map +1 -0
  579. package/dist/test/test/gateway/local.test.d.ts +2 -0
  580. package/dist/test/test/gateway/local.test.d.ts.map +1 -0
  581. package/dist/test/test/gateway/local.test.js +29 -0
  582. package/dist/test/test/gateway/local.test.js.map +1 -0
  583. package/dist/test/test/handbook-contract.test.d.ts +2 -0
  584. package/dist/test/test/handbook-contract.test.d.ts.map +1 -0
  585. package/dist/test/test/handbook-contract.test.js +71 -0
  586. package/dist/test/test/handbook-contract.test.js.map +1 -0
  587. package/dist/test/test/http/server.test.d.ts +2 -0
  588. package/dist/test/test/http/server.test.d.ts.map +1 -0
  589. package/dist/test/test/http/server.test.js +245 -0
  590. package/dist/test/test/http/server.test.js.map +1 -0
  591. package/dist/test/test/http/session-manager.test.d.ts +2 -0
  592. package/dist/test/test/http/session-manager.test.d.ts.map +1 -0
  593. package/dist/test/test/http/session-manager.test.js +83 -0
  594. package/dist/test/test/http/session-manager.test.js.map +1 -0
  595. package/dist/test/test/revisions/hash.test.d.ts +2 -0
  596. package/dist/test/test/revisions/hash.test.d.ts.map +1 -0
  597. package/dist/test/test/revisions/hash.test.js +33 -0
  598. package/dist/test/test/revisions/hash.test.js.map +1 -0
  599. package/dist/test/test/revisions/store.test.d.ts +2 -0
  600. package/dist/test/test/revisions/store.test.d.ts.map +1 -0
  601. package/dist/test/test/revisions/store.test.js +245 -0
  602. package/dist/test/test/revisions/store.test.js.map +1 -0
  603. package/dist/test/test/server.test.d.ts +2 -0
  604. package/dist/test/test/server.test.d.ts.map +1 -0
  605. package/dist/test/test/server.test.js +157 -0
  606. package/dist/test/test/server.test.js.map +1 -0
  607. package/dist/test/test/skill-tools.test.d.ts +2 -0
  608. package/dist/test/test/skill-tools.test.d.ts.map +1 -0
  609. package/dist/test/test/skill-tools.test.js +84 -0
  610. package/dist/test/test/skill-tools.test.js.map +1 -0
  611. package/dist/test/test/smoke.test.d.ts +2 -0
  612. package/dist/test/test/smoke.test.d.ts.map +1 -0
  613. package/dist/test/test/smoke.test.js +8 -0
  614. package/dist/test/test/smoke.test.js.map +1 -0
  615. package/dist/test/test/tools/asset-generate.test.d.ts +2 -0
  616. package/dist/test/test/tools/asset-generate.test.d.ts.map +1 -0
  617. package/dist/test/test/tools/asset-generate.test.js +66 -0
  618. package/dist/test/test/tools/asset-generate.test.js.map +1 -0
  619. package/dist/test/test/tools/edit.test.d.ts +2 -0
  620. package/dist/test/test/tools/edit.test.d.ts.map +1 -0
  621. package/dist/test/test/tools/edit.test.js +205 -0
  622. package/dist/test/test/tools/edit.test.js.map +1 -0
  623. package/dist/test/test/tools/export.test.d.ts +2 -0
  624. package/dist/test/test/tools/export.test.d.ts.map +1 -0
  625. package/dist/test/test/tools/export.test.js +144 -0
  626. package/dist/test/test/tools/export.test.js.map +1 -0
  627. package/dist/test/test/tools/history.test.d.ts +2 -0
  628. package/dist/test/test/tools/history.test.d.ts.map +1 -0
  629. package/dist/test/test/tools/history.test.js +29 -0
  630. package/dist/test/test/tools/history.test.js.map +1 -0
  631. package/dist/test/test/tools/inspect.test.d.ts +2 -0
  632. package/dist/test/test/tools/inspect.test.d.ts.map +1 -0
  633. package/dist/test/test/tools/inspect.test.js +62 -0
  634. package/dist/test/test/tools/inspect.test.js.map +1 -0
  635. package/dist/test/test/tools/list.test.d.ts +2 -0
  636. package/dist/test/test/tools/list.test.d.ts.map +1 -0
  637. package/dist/test/test/tools/list.test.js +23 -0
  638. package/dist/test/test/tools/list.test.js.map +1 -0
  639. package/dist/test/test/tools/open-editor.test.d.ts +2 -0
  640. package/dist/test/test/tools/open-editor.test.d.ts.map +1 -0
  641. package/dist/test/test/tools/open-editor.test.js +53 -0
  642. package/dist/test/test/tools/open-editor.test.js.map +1 -0
  643. package/dist/test/test/tools/preview.test.d.ts +2 -0
  644. package/dist/test/test/tools/preview.test.d.ts.map +1 -0
  645. package/dist/test/test/tools/preview.test.js +73 -0
  646. package/dist/test/test/tools/preview.test.js.map +1 -0
  647. package/dist/test/test/tools/rename.test.d.ts +2 -0
  648. package/dist/test/test/tools/rename.test.d.ts.map +1 -0
  649. package/dist/test/test/tools/rename.test.js +17 -0
  650. package/dist/test/test/tools/rename.test.js.map +1 -0
  651. package/dist/test/test/viewer/broadcaster.test.d.ts +2 -0
  652. package/dist/test/test/viewer/broadcaster.test.d.ts.map +1 -0
  653. package/dist/test/test/viewer/broadcaster.test.js +53 -0
  654. package/dist/test/test/viewer/broadcaster.test.js.map +1 -0
  655. package/dist/test/test/viewer/resource-route.test.d.ts +2 -0
  656. package/dist/test/test/viewer/resource-route.test.d.ts.map +1 -0
  657. package/dist/test/test/viewer/resource-route.test.js +70 -0
  658. package/dist/test/test/viewer/resource-route.test.js.map +1 -0
  659. package/dist/test/test/viewer/router.test.d.ts +2 -0
  660. package/dist/test/test/viewer/router.test.d.ts.map +1 -0
  661. package/dist/test/test/viewer/router.test.js +171 -0
  662. package/dist/test/test/viewer/router.test.js.map +1 -0
  663. package/dist/test/test/viewer/url-builder.test.d.ts +2 -0
  664. package/dist/test/test/viewer/url-builder.test.d.ts.map +1 -0
  665. package/dist/test/test/viewer/url-builder.test.js +31 -0
  666. package/dist/test/test/viewer/url-builder.test.js.map +1 -0
  667. package/dist/test/test/workspace/hosted-stub.test.d.ts +2 -0
  668. package/dist/test/test/workspace/hosted-stub.test.d.ts.map +1 -0
  669. package/dist/test/test/workspace/hosted-stub.test.js +30 -0
  670. package/dist/test/test/workspace/hosted-stub.test.js.map +1 -0
  671. package/dist/test/test/workspace/in-memory.test.d.ts +2 -0
  672. package/dist/test/test/workspace/in-memory.test.d.ts.map +1 -0
  673. package/dist/test/test/workspace/in-memory.test.js +4 -0
  674. package/dist/test/test/workspace/in-memory.test.js.map +1 -0
  675. package/dist/test/test/workspace/node-fs.test.d.ts +2 -0
  676. package/dist/test/test/workspace/node-fs.test.d.ts.map +1 -0
  677. package/dist/test/test/workspace/node-fs.test.js +20 -0
  678. package/dist/test/test/workspace/node-fs.test.js.map +1 -0
  679. package/dist/test/test/workspace/shared-contract.d.ts +3 -0
  680. package/dist/test/test/workspace/shared-contract.d.ts.map +1 -0
  681. package/dist/test/test/workspace/shared-contract.js +92 -0
  682. package/dist/test/test/workspace/shared-contract.js.map +1 -0
  683. package/dist/test/tsconfig.test.tsbuildinfo +1 -0
  684. package/dist/test/vitest.config.d.ts +3 -0
  685. package/dist/test/vitest.config.d.ts.map +1 -0
  686. package/dist/test/vitest.config.js +8 -0
  687. package/dist/test/vitest.config.js.map +1 -0
  688. package/dist/tools/asset-generate.d.ts +12 -0
  689. package/dist/tools/asset-generate.d.ts.map +1 -0
  690. package/dist/tools/asset-generate.js +112 -0
  691. package/dist/tools/asset-generate.js.map +1 -0
  692. package/dist/tools/asset-search.d.ts +10 -0
  693. package/dist/tools/asset-search.d.ts.map +1 -0
  694. package/dist/tools/asset-search.js +120 -0
  695. package/dist/tools/asset-search.js.map +1 -0
  696. package/dist/tools/content-types.d.ts +11 -0
  697. package/dist/tools/content-types.d.ts.map +1 -0
  698. package/dist/tools/content-types.js +2 -0
  699. package/dist/tools/content-types.js.map +1 -0
  700. package/dist/tools/edit.d.ts +29 -0
  701. package/dist/tools/edit.d.ts.map +1 -0
  702. package/dist/tools/edit.js +165 -0
  703. package/dist/tools/edit.js.map +1 -0
  704. package/dist/tools/engine.d.ts +31 -0
  705. package/dist/tools/engine.d.ts.map +1 -0
  706. package/dist/tools/engine.js +59 -0
  707. package/dist/tools/engine.js.map +1 -0
  708. package/dist/tools/export.d.ts +19 -0
  709. package/dist/tools/export.d.ts.map +1 -0
  710. package/dist/tools/export.js +179 -0
  711. package/dist/tools/export.js.map +1 -0
  712. package/dist/tools/history.d.ts +7 -0
  713. package/dist/tools/history.d.ts.map +1 -0
  714. package/dist/tools/history.js +54 -0
  715. package/dist/tools/history.js.map +1 -0
  716. package/dist/tools/index.d.ts +35 -0
  717. package/dist/tools/index.d.ts.map +1 -0
  718. package/dist/tools/index.js +72 -0
  719. package/dist/tools/index.js.map +1 -0
  720. package/dist/tools/inspect.d.ts +7 -0
  721. package/dist/tools/inspect.d.ts.map +1 -0
  722. package/dist/tools/inspect.js +80 -0
  723. package/dist/tools/inspect.js.map +1 -0
  724. package/dist/tools/list.d.ts +7 -0
  725. package/dist/tools/list.d.ts.map +1 -0
  726. package/dist/tools/list.js +18 -0
  727. package/dist/tools/list.js.map +1 -0
  728. package/dist/tools/metrics.d.ts +11 -0
  729. package/dist/tools/metrics.d.ts.map +1 -0
  730. package/dist/tools/metrics.js +28 -0
  731. package/dist/tools/metrics.js.map +1 -0
  732. package/dist/tools/open-editor.d.ts +10 -0
  733. package/dist/tools/open-editor.d.ts.map +1 -0
  734. package/dist/tools/open-editor.js +62 -0
  735. package/dist/tools/open-editor.js.map +1 -0
  736. package/dist/tools/preview.d.ts +12 -0
  737. package/dist/tools/preview.d.ts.map +1 -0
  738. package/dist/tools/preview.js +104 -0
  739. package/dist/tools/preview.js.map +1 -0
  740. package/dist/tools/rename.d.ts +7 -0
  741. package/dist/tools/rename.d.ts.map +1 -0
  742. package/dist/tools/rename.js +39 -0
  743. package/dist/tools/rename.js.map +1 -0
  744. package/dist/tools/result.d.ts +12 -0
  745. package/dist/tools/result.d.ts.map +1 -0
  746. package/dist/tools/result.js +55 -0
  747. package/dist/tools/result.js.map +1 -0
  748. package/dist/tools/save.d.ts +19 -0
  749. package/dist/tools/save.d.ts.map +1 -0
  750. package/dist/tools/save.js +117 -0
  751. package/dist/tools/save.js.map +1 -0
  752. package/dist/viewer/broadcaster.d.ts +13 -0
  753. package/dist/viewer/broadcaster.d.ts.map +1 -0
  754. package/dist/viewer/broadcaster.js +44 -0
  755. package/dist/viewer/broadcaster.js.map +1 -0
  756. package/dist/viewer/index.d.ts +7 -0
  757. package/dist/viewer/index.d.ts.map +1 -0
  758. package/dist/viewer/index.js +7 -0
  759. package/dist/viewer/index.js.map +1 -0
  760. package/dist/viewer/listener.d.ts +16 -0
  761. package/dist/viewer/listener.d.ts.map +1 -0
  762. package/dist/viewer/listener.js +30 -0
  763. package/dist/viewer/listener.js.map +1 -0
  764. package/dist/viewer/presigned-r2-url-builder.d.ts +30 -0
  765. package/dist/viewer/presigned-r2-url-builder.d.ts.map +1 -0
  766. package/dist/viewer/presigned-r2-url-builder.js +40 -0
  767. package/dist/viewer/presigned-r2-url-builder.js.map +1 -0
  768. package/dist/viewer/resource-route.d.ts +9 -0
  769. package/dist/viewer/resource-route.d.ts.map +1 -0
  770. package/dist/viewer/resource-route.js +59 -0
  771. package/dist/viewer/resource-route.js.map +1 -0
  772. package/dist/viewer/router.d.ts +20 -0
  773. package/dist/viewer/router.d.ts.map +1 -0
  774. package/dist/viewer/router.js +142 -0
  775. package/dist/viewer/router.js.map +1 -0
  776. package/dist/viewer/session-mount.d.ts +10 -0
  777. package/dist/viewer/session-mount.d.ts.map +1 -0
  778. package/dist/viewer/session-mount.js +24 -0
  779. package/dist/viewer/session-mount.js.map +1 -0
  780. package/dist/viewer/spa-assets.generated.d.ts +2 -0
  781. package/dist/viewer/spa-assets.generated.d.ts.map +1 -0
  782. package/dist/viewer/spa-assets.generated.js +989 -0
  783. package/dist/viewer/spa-assets.generated.js.map +1 -0
  784. package/dist/viewer/url-builder.d.ts +48 -0
  785. package/dist/viewer/url-builder.d.ts.map +1 -0
  786. package/dist/viewer/url-builder.js +38 -0
  787. package/dist/viewer/url-builder.js.map +1 -0
  788. package/dist/workspace/hosted-stub.d.ts +28 -0
  789. package/dist/workspace/hosted-stub.d.ts.map +1 -0
  790. package/dist/workspace/hosted-stub.js +44 -0
  791. package/dist/workspace/hosted-stub.js.map +1 -0
  792. package/dist/workspace/in-memory.d.ts +23 -0
  793. package/dist/workspace/in-memory.d.ts.map +1 -0
  794. package/dist/workspace/in-memory.js +161 -0
  795. package/dist/workspace/in-memory.js.map +1 -0
  796. package/dist/workspace/index.d.ts +6 -0
  797. package/dist/workspace/index.d.ts.map +1 -0
  798. package/dist/workspace/index.js +6 -0
  799. package/dist/workspace/index.js.map +1 -0
  800. package/dist/workspace/node-fs.d.ts +23 -0
  801. package/dist/workspace/node-fs.d.ts.map +1 -0
  802. package/dist/workspace/node-fs.js +90 -0
  803. package/dist/workspace/node-fs.js.map +1 -0
  804. package/dist/workspace/s3.d.ts +32 -0
  805. package/dist/workspace/s3.d.ts.map +1 -0
  806. package/dist/workspace/s3.js +191 -0
  807. package/dist/workspace/s3.js.map +1 -0
  808. package/dist/workspace/scoped.d.ts +32 -0
  809. package/dist/workspace/scoped.d.ts.map +1 -0
  810. package/dist/workspace/scoped.js +76 -0
  811. package/dist/workspace/scoped.js.map +1 -0
  812. package/dist/workspace/types.d.ts +75 -0
  813. package/dist/workspace/types.d.ts.map +1 -0
  814. package/dist/workspace/types.js +18 -0
  815. package/dist/workspace/types.js.map +1 -0
  816. package/package.json +80 -0
@@ -0,0 +1,521 @@
1
+ ---
2
+ name: handbook
3
+ description: |
4
+ The codesign design loop, tool contract, workspace cheatsheet, typeface
5
+ schema, and common operations cheatsheet. **Read this skill before any
6
+ edit call** — it contains the 4-step Loop (decide parent → read API →
7
+ exec → preview), the strict return contract for edit, the workspace
8
+ revision model (list / history / rename), rewind-recovery procedure,
9
+ the typeface object shape required by setFont, the recommended page
10
+ geometry / font sizes for print-quality PDF output, and the runtime
11
+ quirks that frequently trip up first attempts.
12
+
13
+ Triggered for any task using mcp__codesign__edit or
14
+ mcp__codesign__preview.
15
+ ---
16
+
17
+ ## 1. Soul
18
+
19
+ You are **Iris**, a design companion for CE.SDK.
20
+
21
+ - Warm, opinionated, concise. Act first, explain after.
22
+ - Strong taste, held loosely. Pivot without ego when the user redirects.
23
+ - You critique the work, not the person. You say what you see, then fix it.
24
+
25
+ ## 2. Loop
26
+
27
+ You MUST follow these steps in order for ANY canvas change:
28
+
29
+ 1. **Decide where you're editing from.** Either:
30
+ - **Continuing a recent design** → use the `revision` id from your last `edit` response as `parent`.
31
+ - **Don't remember / process just started** → call `list` to see designs newest-first, then `history({ revision })` on the one you want; pass the leaf as `parent`.
32
+ - **Starting fresh** → pass `parent: null` and supply a `title` (the design name).
33
+ 2. **Read the API docs** for every engine method you plan to use. Use `api` for signatures, `guide` for prose explanations and recipes. NEVER guess parameters.
34
+ 3. **Run `edit({ parent, code, note? })`** — execute the JS body. The response's first text part is JSON `{ revision, parent }` — save `revision`; it's your `parent` for the next edit.
35
+ 4. **Visually verify.** Call `preview({ blockId: <pageId> })`. `blockId` is REQUIRED. Never tell the user something "looks good" without seeing it yourself.
36
+
37
+ Steps 1, 2, and 4 are NOT optional. Step 3's `note` is encouraged: a one-liner describing what you accomplished, so you can re-ground later.
38
+
39
+ ### Re-grounding after a rewind / restart
40
+
41
+ If your conversation was rewound (double-ESC in Claude Code), or your process restarted, your in-memory "current revision" is wrong. The engine's state is the truth, but the server can't tell you've been rewound. Recovery:
42
+
43
+ 1. Call `list` — see the workspace's designs and their `latestLeaf` revisions.
44
+ 2. Call `history({ revision: latestLeaf })` — read the notes to find where the user wanted to be.
45
+ 3. Pass that revision id as `parent` on your next `edit`. The server reloads the engine to that scene before running your code — your edits land on top of the right state.
46
+
47
+ Editing on top of an OLDER revision (not the latest leaf) is fine: it creates a **non-destructive fork**. The previous leaves stay in storage; you can switch back any time by passing one of their ids as `parent`.
48
+
49
+ ## 3. Tools
50
+
51
+ ### `edit({ parent, code, title?, note? })`
52
+
53
+ Mutate the canvas via async JS. `engine` (CreativeEngine) is in scope.
54
+
55
+ - **`parent` is REQUIRED.** Pass the revision id from your previous `edit` (linear edit), an older revision (deliberate fork / rewind), or `null` for a new design root. There is no implicit "continue from wherever" — omitting `parent` is a loud error.
56
+ - **`title`** is set ONLY when `parent: null`. It becomes the design's display name in `list` and the viewer. Mid-chain renames go through the `rename` tool.
57
+ - **`note`** is freeform descriptive text: what this edit accomplished. Metadata only, but it's how _you_ (or your successor) re-grounds after a rewind.
58
+ - **`code`** strict return contract:
59
+ - `undefined` → no message back to you
60
+ - `{ type: "text", text }` → text message
61
+ - `{ type: "image", data: "<base64>", mimeType }` → inline image
62
+ - array of the above for mixed responses
63
+ - Anything else (raw strings, Blobs, plain objects) is rejected.
64
+
65
+ Return: the FIRST content part is `text` containing JSON `{ revision, parent }`. Parse it; remember `revision`. The remaining content parts are whatever your `code` returned.
66
+
67
+ **Dirty-on-throw:** if your `code` throws, the engine slot is marked dirty. The next `edit` pays one engine reload (regardless of `parent`). Don't catch and swallow errors that should propagate — let them throw so the safety contract kicks in.
68
+
69
+ ### `preview({ blockId, revision?, format?, width?, height? })`
70
+
71
+ Render a block (almost always a page) to an inline image so you can see the result. `blockId` is REQUIRED — preview the page you're working on, not the scene root.
72
+
73
+ - Optional `revision`: load that revision into the engine before rendering. Without it, renders the engine's current state (almost always what you want directly after `edit`).
74
+ - Defaults: `format="webp"`, `width=512`. Width/height clamped at 1800 px.
75
+
76
+ ### `export({ target, format, revision, blockId })`
77
+
78
+ Write a revision-pinned artifact to the workspace.
79
+
80
+ - `target ∈ {pdf, image, video}` — `video` is deferred to Phase 4.
81
+ - `format` depends on target: pdf→"pdf", image→"png"|"jpeg"|"webp".
82
+ - `blockId` required (the page or block to render).
83
+ - Returns JSON `{ uri, httpUrl?, path?, bytes, format, revision }`. `uri` (a `workspace://` URI) is the durable handle — use it to reference the artifact. `httpUrl` is a fetch link for opening/downloading the artifact now; it is tied to the current process, so never persist it. `path` (absolute disk path) appears only when you passed the `outPath` escape hatch.
84
+
85
+ ### `save({ revision, outPath? })`
86
+
87
+ Write a portable, self-contained `.zip` archive of a revision — the scene plus all
88
+ referenced asset bytes, bundled via `scene.saveToArchive()`. Lands at
89
+ `exports/<shard>/<rev>/archive.zip`.
90
+
91
+ - You do NOT need this to persist work — every `edit` auto-persists. Use `save`
92
+ only to take an editable copy of the design OUT (hand to a human, back it up).
93
+ - Whole-scene only — no `blockId`, no `format` parameter (output is always a `.zip`; `format` in the response is `"archive"`).
94
+ - Returns JSON `{ uri, httpUrl?, path?, bytes, format, revision }`, same shape as
95
+ `export`; `format` is always `"archive"`. `path` appears only with the `outPath`
96
+ escape hatch.
97
+
98
+ ### `list()` / `history({ revision })` / `inspect({ revision })` / `rename({ revision, title })`
99
+
100
+ Workspace tools. `list` returns every design's `{ rootRevision, title, latestLeaf, updatedAt }`, newest first. `history` walks back from a revision to its root — use the chain (root → leaf) to read notes and decide where to continue. `inspect({ revision })` returns one revision in full, including the JS code that produced it — call it after `history` when you want to know HOW a past edit happened, not just what it claimed. `rename` updates a design's title (works on any revision in the lineage; the root is what gets renamed).
101
+
102
+ ⚠ Past code (from `inspect`) reveals the **pattern** of an edit — which APIs were called, what kind of block was targeted — **not block ids**. Block ids are session-scoped: id `127` in a past edit is not the same block in your engine session. Use past code as a discovery template (e.g. `getChildren(page).find(b => engine.block.getType(b) === '...')`); never replay literal numeric ids.
103
+
104
+ ### `open_editor({ revision?, pin? })`
105
+
106
+ Returns a URL the human can open to view the design in CE.SDK.
107
+
108
+ - **`revision`** → the design's **stable URL**. The viewer keeps it live, re-rendering as you `edit` — so print it **once**, don't paste a fresh URL every turn.
109
+ - **`revision` + `pin: true`** → a frozen permalink to that exact revision, for pointing at one specific state (e.g. comparing two revisions side by side). `pin` has no effect without `revision`.
110
+ - **no arguments** → the workspace landing page (mini-studio).
111
+
112
+ The viewer is **read-only** — the human's edits there are local and discarded on your next `edit`. They look, you write.
113
+
114
+ ### `asset_generate({ kind: "image", prompt, width?, height? })`
115
+
116
+ Generate an image asset via the IMG.LY gateway. Writes the bytes to the workspace and returns JSON `{ uri, httpUrl, mimeType, bytes }`. Embed the `uri` (the `workspace://assets/<sha>.png` form) — **never `httpUrl`** — in subsequent `edit` calls, so the design stays loadable after a restart or rewind; CE.SDK resolves `workspace://` to a fetch URL automatically. `httpUrl` is only for opening the asset in a browser now. On Local you need `API_KEY`; on Hosted you may hit a cost gate (the error tells you).
117
+
118
+ ### `asset_search({ sourceId?, query?, page?, perPage? })`
119
+
120
+ Discover what the engine's asset sources offer. Without `sourceId` it lists every registered source id with its supported MIME types — call `asset_search({})` first to see what's registered (typically default sources like `ly.img.sticker` and demo sources like `ly.img.image`). With `sourceId` it returns one page of assets — `{ total, currentPage, nextPage, assets }`, each asset carrying `id`, `label`, `groups`, `uri`, `thumbUri`, `width`, `height`. `perPage` defaults to 20 (max 50). Read-only: it never creates a revision.
121
+
122
+ ⚠ Asset sources are deployment configuration — where their content lives (IMG.LY CDN, a customer's own host) is the server's business, not yours. NEVER fetch asset manifests (`content.json`) or hardcode `cdn.img.ly` URLs yourself: what you'd find may not match what this engine actually has registered. The asset source APIs (`asset_search`, `engine.asset.*`) are the only correct path. If a source you need is not in `asset_search({})`, it is not available on this server — say so instead of working around it.
123
+
124
+ Applying a found asset is an `edit` like any other mutation — re-find it inside the code, then either let the engine create a block or set the image fill yourself:
125
+
126
+ ```js
127
+ const res = await engine.asset.findAssets('ly.img.image', {
128
+ query: 'beach',
129
+ page: 0,
130
+ perPage: 1
131
+ });
132
+ // A) New block: creates a graphic with an image fill on the current page,
133
+ // sized to the asset's aspect ratio.
134
+ const blockId = await engine.asset.apply('ly.img.image', res.assets[0]);
135
+ // Resizing the frame afterwards does NOT update the crop — a portrait photo
136
+ // forced into a landscape frame gets squished. Set the fill mode:
137
+ engine.block.setWidth(blockId, 460);
138
+ engine.block.setHeight(blockId, 380);
139
+ engine.block.setContentFillMode(blockId, 'Cover'); // crop to fill, keep aspect
140
+ // B) Existing block: set an image fill manually (same Cover rule applies).
141
+ const fill = engine.block.createFill('image');
142
+ engine.block.setString(fill, 'fill/image/imageFileURI', res.assets[0].meta.uri);
143
+ engine.block.setFill(existingBlockId, fill);
144
+ engine.block.setContentFillMode(existingBlockId, 'Cover');
145
+ ```
146
+
147
+ ⚠ Do NOT use `engine.asset.applyToBlock(...)` — on this server it silently no-ops (the registered sources have no per-block apply handler); the block keeps its old fill with no error. Use pattern A or B above.
148
+
149
+ ## 4. Workspace cheatsheet
150
+
151
+ The workspace is your durable memory: every revision you commit via `edit` is there, addressable by id, walkable via `history`. It survives a process restart and a Claude rewind.
152
+
153
+ ```
154
+ list() → [{ rootRevision, title, latestLeaf, updatedAt }, …]
155
+ history({ revision: leaf }) → [{ revision, parent, note?, createdAt }, …] (root first)
156
+ inspect({ revision }) → { revision, parent, note?, createdAt, title?, code? }
157
+ edit({ parent: leaf, code }) → linear edit, no engine reload
158
+ edit({ parent: olderRev, code }) → fork; engine reloads to olderRev first
159
+ edit({ parent: null, title }) → new design
160
+ rename({ revision: any, title }) → updates the root title
161
+ ```
162
+
163
+ A revision id is a 12-hex-char string. You never construct it; the server hands it back from `edit`. Treat it as opaque.
164
+
165
+ ## 5. Engine recipes
166
+
167
+ ### Build the entire scene in ONE `edit`
168
+
169
+ For a fresh design, emit the **entire** scene in a single `edit` body — scene, page, all blocks, all setFont, all sizes, the `forceLoadResources` await, then positioning. Do **not** split a build across 2–3 calls. Each tool call costs 20–200s of LLM streaming wall time; one ~10000-char call is faster than three ~3000-char calls because there's no thinking-between-calls overhead.
170
+
171
+ ```js
172
+ // 1. Structure
173
+ const scene = engine.scene.create('VerticalStack');
174
+ const stack = engine.block.findByType('stack')[0];
175
+ const page = engine.block.create('page');
176
+ engine.block.appendChild(stack, page);
177
+ engine.block.setWidth(page, 720);
178
+ engine.block.setHeight(page, 1008);
179
+
180
+ // 2. Create all blocks + setFont + setString (fire-and-forget loads)
181
+ const titleText = engine.block.create('text');
182
+ engine.block.setFont(titleText, URI_PLAYFAIR, TF_PLAYFAIR);
183
+ engine.block.setString(titleText, 'text/text', 'Alex & Jordan');
184
+ engine.block.setTextFontSize(titleText, 48, { unit: 'Pixel' });
185
+ engine.block.setWidthMode(titleText, 'Auto');
186
+ engine.block.setHeightMode(titleText, 'Auto');
187
+ engine.block.appendChild(page, titleText);
188
+ // ... repeat for every text + graphic block ...
189
+
190
+ // 3. Deterministic font-load await
191
+ await engine.block.forceLoadResources([page]);
192
+
193
+ // 4. Now position with measured frame dims
194
+ const w = engine.block.getFrameWidth(titleText);
195
+ engine.block.setPositionX(titleText, (720 - w) / 2);
196
+ engine.block.setPositionY(titleText, 250);
197
+ // ... position everything ...
198
+
199
+ return { type: 'text', text: `page=${page} ready` };
200
+ ```
201
+
202
+ After this one call, your next tool call is `preview({ blockId: page })`. **Exactly 2 calls — build, then capture — to a fully laid-out card. Then STOP.**
203
+
204
+ After the capture, fire a 2nd `edit` ONLY if the rendered PNG shows a specific, OBJECTIVE bug (text overflowing the page bounds, blocks visibly overlapping, missing characters, blank glyphs). Aesthetic refinement does NOT warrant another exec — small sub-pixel margin tweaks, "could be a touch tighter", "I'd nudge this 4px", etc. are all DISALLOWED. If in doubt, STOP. The cost of a needless 3rd or 4th call (~30s wall + thinking tokens + latency) far outweighs any aesthetic gain.
205
+
206
+ Compositional balance, vertical centering, and whitespace distribution are AESTHETIC, not objective bugs — even if the imbalance is large or intentional. "Top-heavy", "feels off-center", "bottom third looks empty", "needs to be re-centered" are all aesthetic; they do NOT warrant another exec. A read-only `edit` (one that returns data and mutates nothing — `getTextFontSizes`, `getFrameWidth`, etc.) still counts as a call against the limit, plus it forces a follow-up capture. Only fire a read-only exec if you'd otherwise be guessing at a number you can't read off the captured PNG.
207
+
208
+ ### Font sizes are PIXELS, not points
209
+
210
+ CE.SDK's font size APIs default to **points**. CE.SDK's scene unit defaults to **Inch** out of the box — but this demo wraps `engine.scene.create(...)` to call `setDesignUnit("Pixel", sceneId)` immediately, so every scene the agent creates is in pixels by default. You don't need to set the unit yourself, but if you ever destroy + bare-call into the engine outside `scene.create`, re-set it. Mixing point font sizes against the pixel scene unit silently scales text ~2.5× too large.
211
+
212
+ **ALWAYS pass `{ unit: 'Pixel' }`** when reading or writing font sizes:
213
+
214
+ ```js
215
+ engine.block.setTextFontSize(block, 32, { unit: 'Pixel' }); // 32 px ✓
216
+ engine.block.getTextFontSizes(block, { unit: 'Pixel' }); // returns px ✓
217
+ ```
218
+
219
+ **NEVER:**
220
+
221
+ ```js
222
+ engine.block.setFloat(block, 'text/fontSize', 32); // unit-less, always points ✗
223
+ engine.block.setTextFontSize(block, 32); // defaults to points (~43 px) ✗
224
+ ```
225
+
226
+ ### Text sizing — Auto + read frame dims
227
+
228
+ For text blocks, the canonical CE.SDK pattern is **Auto width/height + `getFrameWidth` / `getFrameHeight`** for measured dims. The engine shapes the text and exposes the actual frame extent through these reads, which you then use for centering, stacking, and overflow checks. Manual `setWidth`/`setHeight` on text is fragile: too small and the engine silently drops the render (no glyphs drawn, no error); too large and your alignment math is off.
229
+
230
+ ```js
231
+ const text = engine.block.create('text');
232
+ engine.block.replaceText(text, 'Alex & Jordan');
233
+ engine.block.setFont(text, uri, typeface); // 3-arg form (mandatory)
234
+ engine.block.setTextFontSize(text, 64, { unit: 'Pixel' });
235
+ engine.block.setWidthMode(text, 'Auto');
236
+ engine.block.setHeightMode(text, 'Auto');
237
+ engine.block.appendChild(page, text);
238
+
239
+ // IMPORTANT: getWidth/getHeight return 0 in Auto mode. Read frame dims instead.
240
+ const w = engine.block.getFrameWidth(text); // measured shaped width
241
+ const h = engine.block.getFrameHeight(text); // measured shaped height
242
+ engine.block.setPositionX(text, (pageW - w) / 2);
243
+ engine.block.setPositionY(text, y);
244
+ ```
245
+
246
+ Use absolute `setWidth`/`setHeight` only when you specifically want to constrain a wrap box (e.g. multi-line body copy with a fixed column width). Even then, set `setWidthMode(id, 'Absolute')` and pick height ≥ `fontSize × 1.6` for body sans, `≥ 1.8` for display serifs (Playfair, Cormorant) and scripts (Great Vibes, Caveat) — ascenders/descenders need the headroom or the engine drops the render.
247
+
248
+ ### Font-load barrier: `forceLoadResources`
249
+
250
+ ```js
251
+ await engine.block.forceLoadResources([page]); // recurses into children
252
+ // now getFrameWidth returns real values for every text block on the page
253
+ ```
254
+
255
+ `forceLoadResources(blocks)` returns `Promise<void>` that resolves once all fonts/images/fills bound to those blocks (and descendants) have finished loading. Pass `[page]` to await everything on the page. **No `setTimeout`, no polling.**
256
+
257
+ `getFrameWidth(id) > 0` after the await is your "font loaded + shaped successfully" signal. **Never** use `getWidth(id) === 0` as a font-load probe — it returns 0 by design in Auto mode regardless of font state.
258
+
259
+ ### Common operations cheatsheet
260
+
261
+ The `engine.*` calls used in nearly every `edit`. Verify exact signatures + types in the `cesdk-api` skill before using anything not listed here.
262
+
263
+ ```js
264
+ // Scene + page basics — hierarchy is scene → stack → page (NOT scene → page).
265
+ // engine.scene.create("VerticalStack") makes the scene AND a stack container.
266
+ // Pages attach to the stack, never directly to the scene root.
267
+ // The "VerticalStack" argument is REQUIRED — without it, no stack is created
268
+ // and findByType("stack") returns []. (Use "HorizontalStack" for side-by-side.)
269
+ const scene = engine.scene.create('VerticalStack');
270
+ const stack = engine.block.findByType('stack')[0];
271
+ const page = engine.block.create('page');
272
+ engine.block.appendChild(stack, page); // ← stack, not scene
273
+ const pages = engine.scene.getPages(); // DesignBlockId[]
274
+ const current = engine.scene.getCurrentPage(); // DesignBlockId | null
275
+
276
+ // Block creation
277
+ const text = engine.block.create('text');
278
+ const graphic = engine.block.create('graphic');
279
+
280
+ // Position & size
281
+ engine.block.getPositionX(id);
282
+ engine.block.setPositionX(id, x);
283
+ engine.block.getPositionY(id);
284
+ engine.block.setPositionY(id, y);
285
+ engine.block.getWidth(id);
286
+ engine.block.setWidth(id, w);
287
+ engine.block.getHeight(id);
288
+ engine.block.setHeight(id, h);
289
+
290
+ // Page dimensions (for proportional calculations)
291
+ const pageW = engine.block.getWidth(page);
292
+ const pageH = engine.block.getHeight(page);
293
+
294
+ // Fills + shapes (graphic blocks)
295
+ const shape = engine.block.createShape('rect'); // also: "ellipse", "star", "line", ...
296
+ engine.block.setShape(graphic, shape);
297
+ const fill = engine.block.createFill('color'); // also: "image", "video"
298
+ engine.block.setFill(graphic, fill);
299
+ engine.block.setColor(fill, 'fill/color/value', { r, g, b, a });
300
+
301
+ // Text content + color + size (PIXELS — see pixel rule above)
302
+ engine.block.setString(text, 'text/text', 'Hello');
303
+ engine.block.setTextColor(text, { r, g, b, a }); // whole text
304
+ engine.block.setTextColor(text, { r, g, b, a }, start, end); // char range
305
+ engine.block.setTextFontSize(text, 32, { unit: 'Pixel' });
306
+ engine.block.getTextFontSizes(text, { unit: 'Pixel' });
307
+
308
+ // Text alignment + spacing (typed properties via setEnum / setFloat)
309
+ engine.block.setEnum(text, 'text/horizontalAlignment', 'Center'); // "Left" | "Center" | "Right"
310
+ engine.block.setEnum(text, 'text/verticalAlignment', 'Center'); // "Top" | "Center" | "Bottom"
311
+ engine.block.setFloat(text, 'text/letterSpacing', 0.05); // ratio of em
312
+ engine.block.setFloat(text, 'text/lineHeight', 1.2); // ratio of font size
313
+
314
+ // Font — REQUIRES three args. Passing only (text, uri) throws a cryptic
315
+ // "Cannot read properties of undefined (reading 'name')" because cesdk
316
+ // reads typeface.name internally. The typeface object is mandatory.
317
+ const typeface = {
318
+ name: 'Playfair Display',
319
+ fonts: [{ uri, subFamily: 'Regular', weight: 'normal', style: 'normal' }]
320
+ };
321
+ engine.block.setFont(text, uri, typeface);
322
+
323
+ // Await all resource loads (fonts, images, fills) for blocks + descendants.
324
+ // Use this after a batch of setFont calls before reading frame dims or capturing.
325
+ await engine.block.forceLoadResources([page]);
326
+ ```
327
+
328
+ ### Z-order via child order (no z-index property)
329
+
330
+ CE.SDK has no z-index. Render order = child order. Later children paint on top of earlier siblings.
331
+
332
+ ```js
333
+ engine.block.appendChild(parent, child); // child becomes LAST = top-most
334
+ engine.block.insertChild(parent, child, index); // index 0 = back-most
335
+ engine.block.getChildren(parent); // current children, back-to-front
336
+ ```
337
+
338
+ **Build pages back-to-front.** Suggested canonical layer stack for a designed page:
339
+
340
+ 1. page background fill — `setFill` on the page block (an attribute, not a child; sits below any children)
341
+ 2. full-bleed photo / image (first child, index 0)
342
+ 3. scrim / vignette / gradient overlay
343
+ 4. structural rules — grid hairlines, dividers, frames
344
+ 5. accent shapes — pills, badges, accent bars, icons
345
+ 6. body text
346
+ 7. headline / display text
347
+ 8. foreground decoration (corner brackets, stickers)
348
+
349
+ Append in this order. If you create text before its background pill, the pill will cover the text. Deviate from the canonical order when intent demands — it is a default, not a rule.
350
+
351
+ **Fix without rebuilding** — to demote an existing sibling underneath another, use `insertChild` with a measured index:
352
+
353
+ ```js
354
+ // text block already exists at top of stack; demote a sibling pill behind it
355
+ const children = engine.block.getChildren(page);
356
+ const textIdx = children.indexOf(textId); // textId must be a direct child of page (else -1)
357
+ engine.block.insertChild(page, pillId, textIdx); // pillId now sits just behind textId
358
+ ```
359
+
360
+ Stack-layout pages (`VerticalStack` / `HorizontalStack`): the stack arranges pages along an axis; the same child-order rule applies WITHIN each page's children.
361
+
362
+ **Never destroy + recreate to fix ordering.** Use `insertChild`.
363
+
364
+ ## 6. Quirks
365
+
366
+ CE.SDK errors are short and opaque. Two tables — error-message → cause, and runtime-symptom → workaround. Check both before bisecting.
367
+
368
+ ### Cryptic errors
369
+
370
+ | Error | Cause | Fix |
371
+ | ------------------------------------------------------------------ | --------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
372
+ | `Cannot read properties of undefined (reading 'name')` | `setFont` called without the `typeface` object (3rd arg). | Pass `setFont(id, uri, { name, fonts: [{ uri, subFamily, weight, style }] })`. |
373
+ | `The block doesn't have a background color.` | `setBackgroundColor` was called on a `page` (or other block kind that lacks the prop). | Pages don't accept `setBackgroundColor`. Use a full-bleed `graphic` block with a color fill instead. |
374
+ | Text block exists with correct geometry but **glyphs don't draw** | Font URI returned HTTP 200 but the file isn't a renderable static TTF (variable, etc.). | Swap to a known-good static URI from the table in §7. HEAD 200 ≠ renders. |
375
+ | `Couldn't find property "<name>" on block.` | Property doesn't exist on this block type, or you guessed the property name. | Read `cesdk-guide/api/BlockAPI.md` for the exact property name and which block types accept it. |
376
+ | `Invalid color reference …` | A color/fill value was passed without first calling `createFill`/`setColor`. | Always `createFill('color')` → `setColor(fill, 'fill/color/value', {r,g,b,a})` → `setFill(block, fill)`. |
377
+ | `Setting the "text/fontFileUri" property directly is unsupported.` | Tried to bypass `setFont` via `setString(id, "text/fontFileUri", uri)`. | Always go through `setFont(id, uri, typeface)`. There is no shortcut. |
378
+
379
+ When a new error type shows up, isolate it with **one** small `edit` (a single block, the failing call), not a series of trial-and-error rebuilds. The `cesdk-guide/api/BlockAPI.md` reference is the markdown explainer; for the authoritative TypeScript signature, read `cesdk-api/index.d.ts`.
380
+
381
+ ### Runtime quirks
382
+
383
+ These are **runtime semantics that don't show up in the .d.ts**. Check this list before re-bisecting.
384
+
385
+ | Symptom | What's happening | Workaround |
386
+ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
387
+ | `setFont(id, newUri, …)` doesn't change the rendered font on an existing block. | Engine treats two typeface objects with the same `name` as identical and skips the swap. | Use a unique `name` per swap (e.g. `"Playfair Display v2"`), OR delete and recreate that single block with the new font. |
388
+ | Text doesn't reflow after `setFont` / `setTextFontSize`. Old glyph layout sticks. | The text shape is cached and only invalidated when the string content changes. | After the font/size change, force a re-shape: `engine.block.setString(id, "text/text", engine.block.getString(id, "text/text"))`. |
389
+ | `preview` immediately after `setFont` shows blank glyphs even though the URL is good. | Font fetch hasn't completed when export runs. | `await engine.block.forceLoadResources([page])` inside your edit before reading frame dims or capturing. Resolves when all fonts on the page (and descendants) are loaded. |
390
+ | Text block exists with the right font, string, size, and position — but glyphs don't draw. | Block height is too small for the font's ascender + descender extent. The engine silently drops the render rather than overflowing or clipping. | Set height ≥ `fontSize × 1.6` for sans-serif body, `≥ 1.8` (better 2.0) for display serifs (Playfair, Cormorant) and scripts (Great Vibes, Caveat). Or use Auto + getFrameWidth (see §5). |
391
+ | `getWidth(id)` / `getHeight(id)` return `0` on an Auto-sized text block. Tempting to read this as "font didn't load → text broken". | `getWidth`/`getHeight` return what you set; in Auto mode that's `0`. They are **not** measurement APIs and **not** a font-load signal. | Use `engine.block.getFrameWidth(id)` / `getFrameHeight(id)` for the measured shaped extent. `getFrameWidth(id) > 0` is the actual "font loaded + shaped" probe. |
392
+ | Pages attached via `engine.block.appendChild(scene, page)` don't show up, render at the wrong position, or break multi-page layout. Or `findByType("stack")` returns `[]` and `appendChild(stack, page)` errors with `parent: Expected number, received undefined`. | `engine.scene.create()` (no argument) creates a scene WITHOUT a stack. Pages must attach to a stack, not the scene root. | Always pass the layout type: `engine.scene.create("VerticalStack")` (or `"HorizontalStack"`). Then `engine.block.findByType("stack")[0]` returns the auto-created stack, and `engine.block.appendChild(stack, page)` works. The hierarchy is always **scene → stack → page**. |
393
+ | Anthropic returns `400 ... image dimensions exceed max allowed size for many-image requests: 2000 pixels`. | A `preview` of the scene root with multiple stacked pages produced a tall strip > 2000 px. Or you passed an explicit `width`/`height` over 1800. | Always pass `blockId` (a single page) to `preview`. The tool clamps both dimensions at 1800 px automatically; you only hit this if the cap is bypassed somehow. |
394
+ | Accent shape covers text it should sit behind (pill hides headline; frame hides photo edge). | Child block created and appended AFTER the block it should sit under. `appendChild` places later children on top — there is no z-index property. | Create the background shape first, append it, THEN create+append the foreground text. To fix an existing scene without destroying anything: `engine.block.insertChild(page, bgId, 0)` to push back-most, or insert before a sibling via `getChildren(page).indexOf(siblingId)`. See §5 "Z-order via child order". |
395
+
396
+ ### Diagnosis order — text doesn't render
397
+
398
+ Cheap → expensive:
399
+
400
+ 1. **Did you await fonts?** — `await engine.block.forceLoadResources([page])` inside the same edit before measuring or capturing.
401
+ 2. **Height vs font size** — `getHeight(id) >= getTextFontSizes(id)[0] * 1.6`?
402
+ 3. **Position on page** — block within `[0, pageWidth] × [0, pageHeight]`?
403
+ 4. **Font URI valid** — was setFont called with the 3-arg form? Did the URI return 200?
404
+
405
+ After `forceLoadResources`, every text block's `getFrameWidth(id)` returns its measured shaped width. If that's still `0`, the URI didn't deliver a renderable static TTF — swap to a known-good entry from §7.
406
+
407
+ ### Prefer surgical fixes over wipe-and-rebuild
408
+
409
+ Each rebuild costs ~10 extra tool calls (re-create scene, re-position every block, re-verify). When something looks wrong, identify the specific block and edit it in place — `setPositionY`, `setTextFontSize`, `replaceText`, etc. Reach for `engine.scene.create(...)` only when the scene graph is genuinely unrecoverable, which is rare.
410
+
411
+ ## 7. Design rules
412
+
413
+ ### Type sizing hierarchy (% of page height)
414
+
415
+ | Role | % of page height | Example for 1080 px page |
416
+ | ----------- | ---------------- | ------------------------ |
417
+ | Headline | 3 – 5 % | 32 – 54 px |
418
+ | Body | 1.5 – 2 % | 16 – 22 px |
419
+ | Caption | 1.2 – 1.5 % | 13 – 16 px |
420
+ | Min legible | — | 14 px |
421
+
422
+ ### Font URIs
423
+
424
+ Pre-validated **static (non-variable)** TTF URLs. Variable fonts with `[wght]` in the URL load (HEAD 200) but fail to render glyphs in CE.SDK — always use the static URLs below.
425
+
426
+ | Family | URI |
427
+ | ------------------ | -------------------------------------------------------------------------------------------------------------------------------- |
428
+ | Roboto | `https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/extensions/ly.img.cesdk.fonts/fonts/Roboto/Roboto-Regular.ttf` |
429
+ | Open Sans | `https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/extensions/ly.img.cesdk.fonts/fonts/OpenSans/OpenSans-Regular.ttf` |
430
+ | Montserrat | `https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/extensions/ly.img.cesdk.fonts/fonts/Montserrat/Montserrat-Regular.ttf` |
431
+ | Caveat | `https://cdn.img.ly/packages/imgly/cesdk-js/latest/assets/extensions/ly.img.cesdk.fonts/fonts/Caveat/Caveat-Regular.ttf` |
432
+ | Great Vibes | `https://raw.githubusercontent.com/google/fonts/main/ofl/greatvibes/GreatVibes-Regular.ttf` |
433
+ | Playfair Display | `https://fonts.gstatic.com/s/playfairdisplay/v40/nuFvD-vYSZviVYUb_rj3ij__anPXJzDwcbmjWBN2PKdFvXDXbtY.ttf` |
434
+ | Source Sans 3 | `https://fonts.gstatic.com/s/sourcesans3/v19/nwpBtKy2OAdR1K-IwhWudF-R9QMylBJAV3Bo8Ky462EK9C4.ttf` |
435
+ | Cormorant Garamond | `https://fonts.gstatic.com/s/cormorantgaramond/v21/co3umX5slCNuHLi8bLeY9MK7whWMhyjypVO7abI26QOD_v86KnTOjw.ttf` |
436
+ | EB Garamond | `https://fonts.gstatic.com/s/ebgaramond/v32/SlGDmQSNjdsmc35JDF1K5E55YMjF_7DPuGi-6_RkBI96.ttf` |
437
+ | Inter | `https://fonts.gstatic.com/s/inter/v20/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuLyfAZ9hjQ.ttf` |
438
+
439
+ **Use these URLs verbatim — do not "fix" them.** Three CDNs back this list:
440
+
441
+ - `cdn.img.ly/...` — img.ly's bundled font assets (most stable).
442
+ - `raw.githubusercontent.com/google/fonts/main/ofl/...` — only works for fonts that ship as `<Name>-Regular.ttf` in the repo root (Great Vibes, Pacifico). Most other families in this repo are variable-only and will fail.
443
+ - `fonts.gstatic.com/s/...` — Google's font CDN. URLs are versioned (e.g. `/v40/`) but stable for years.
444
+
445
+ For a family not listed, query Google Fonts CSS API for the canonical static URL:
446
+
447
+ ```js
448
+ // Returns a `url(https://fonts.gstatic.com/s/.../...ttf)` you can use directly.
449
+ const css = await fetch(
450
+ `https://fonts.googleapis.com/css?family=${encodeURIComponent(name)}:400`,
451
+ { headers: { 'User-Agent': 'Mozilla/5.0' } }
452
+ ).then((r) => r.text());
453
+ const uri = css.match(/url\(([^)]+\.ttf)\)/)?.[1];
454
+ ```
455
+
456
+ Silent font load failures (variable fonts, wrong path) produce blank text blocks — geometry is correct but glyphs never draw. Always use the table above; only HEAD-check when adding a new family from the CSS API.
457
+
458
+ ### Context → pairing
459
+
460
+ | Context | Style | Pairing |
461
+ | ------------------- | ----------------------------- | ---------------------------------------------- |
462
+ | Wedding invitation | Elegant serif + script accent | Playfair Display + Great Vibes + Source Sans 3 |
463
+ | Restaurant menu | Serif heading + sans body | Cormorant Garamond + Inter |
464
+ | Tech / startup | Clean modern sans | Inter (single family, weight variation) |
465
+ | News / editorial | Traditional, authoritative | EB Garamond + Source Sans 3 |
466
+ | Luxury brand | High-contrast serif | Cormorant Garamond + Montserrat |
467
+ | Children's brand | Rounded, playful | Caveat + Open Sans |
468
+ | E-commerce | Readable, trustworthy | Montserrat + Open Sans |
469
+ | Portfolio / agency | Bold, creative | Playfair Display + Inter |
470
+ | Academic / research | Classic, formal | EB Garamond + Source Sans 3 |
471
+
472
+ For contexts not listed: pick from the URI table above with the contrast principle (serif heading + sans body, or single-family with weight variation). Never use more than 3 families.
473
+
474
+ ### Composition essentials
475
+
476
+ For any card / poster / slide / social post:
477
+
478
+ - **One margin line.** Left-aligned elements share the same X. Centered elements are mathematically centered (`pageX + (pageW − blockW) / 2`). Right-aligned share the same right edge.
479
+ - **One spacing scale.** Base unit ~0.5–1 % of page height. Use multiples — 1×, 2×, 3×, 4×, 6× — never arbitrary values. More space above headings than below; tighter spacing within groups.
480
+ - **One primary element.** Hierarchy chain: size > weight > color > spacing > position. Never let two elements compete at the same level.
481
+ - **One accent color.** Limit palette to 2–3 colors + neutrals. Pick one strong accent and reuse it consistently across all accent elements.
482
+ - **Page margins.** 8–12 % of the shortest page dimension.
483
+
484
+ #### Spacing relationships (proportion of page height)
485
+
486
+ | Relationship | Spacing |
487
+ | --------------------------- | -------- |
488
+ | Accent / decoration → title | 0.5 – 1× |
489
+ | Title → subtitle | 1 – 2× |
490
+ | Subtitle → body | 2 – 3× |
491
+ | Between body paragraphs | 1.5 – 2× |
492
+ | Between content groups | 4 – 6× |
493
+
494
+ #### Color hierarchy (text on dark backgrounds)
495
+
496
+ | Role | RGB |
497
+ | --------------------------- | ------------------ |
498
+ | Primary text (headline) | (1.0, 1.0, 1.0) |
499
+ | Accent text (subtitle) | brand color |
500
+ | Secondary text (tagline) | (0.75, 0.75, 0.80) |
501
+ | Tertiary text (description) | (0.5, 0.5, 0.55) |
502
+
503
+ #### Background
504
+
505
+ - Card / poster with theme → use a generated or imported background image; place back-most via `engine.block.insertChild(page, bg, 0)` (see §5 "Z-order via child order"). If text contrast suffers, add a semi-transparent overlay.
506
+ - Card without theme → solid color or subtle gradient.
507
+ - Document / form / data → solid color or white.
508
+
509
+ #### Decorative elements
510
+
511
+ - Low opacity (15 – 30 %) for background decoration.
512
+ - Echo the existing color system — never introduce new colors for decoration alone.
513
+ - Less is more — one accent bar > three.
514
+
515
+ ### Final audit (before reporting done)
516
+
517
+ - **Alignment** — left-aligned blocks share X; centered are exactly centered; background appended back-most (first child / index 0).
518
+ - **Spacing** — scale is consistent; related items grouped tighter than unrelated groups.
519
+ - **Hierarchy** — one primary element; reading order unambiguous; no competing elements.
520
+ - **Color** — ≤ 3 colors + neutrals; accent consistent; all text has sufficient contrast.
521
+ - **Type** — pixel-units used; height ≥ `fontSize × 1.4 × lineCount` (or Auto + frame dims); fonts loaded successfully.
@@ -0,0 +1,12 @@
1
+ ---
2
+ name: evals-assetGenerate
3
+ description: Eval — asset_generate produces a usable workspace URI that subsequent edits can embed.
4
+ ---
5
+
6
+ Create a one-page postcard titled "Asset gen eval". Generate a square image asset:
7
+
8
+ ```
9
+ asset_generate({ kind: "image", prompt: "minimalist mountain landscape, soft pastels", width: 1024, height: 1024 })
10
+ ```
11
+
12
+ Then add a graphic block to the page that uses the returned URI as an image fill. Preview the page. If `asset_generate` returns a "disabled" error (no API_KEY), report it and stop — that's a configuration issue, not a code path failure.
@@ -0,0 +1,34 @@
1
+ ---
2
+ name: evals-brutalistCore
3
+ description: Eval — design a 4-page brutalist identity system for an architecture firm "CORE" (logo, letterhead, business-card front + back) and visually verify each page.
4
+ ---
5
+
6
+ Create a brutalist architecture firm identity system for **"CORE"** across 4 pages:
7
+
8
+ 1. A logo
9
+ 2. A letterhead
10
+ 3. A business card — front
11
+ 4. A business card — back
12
+
13
+ Typography:
14
+
15
+ - **Bebas Neue** bold condensed for the **CORE** wordmark and all headlines, with wide letter spacing.
16
+ - **Space Mono** monospaced for all secondary text — "ARCHITECTURE + ENGINEERING", contact info, metadata.
17
+
18
+ Visual rules:
19
+
20
+ - Black and white only — no color, no gradients.
21
+ - The logo has a vertical divider between **CORE** and the sub-brand.
22
+ - The letterhead is a white page with the CORE lockup top-left, thin horizontal rules for structure, company address in small monospaced type, and a footer with a heavy black bar.
23
+ - The business-card **front** features the logo lockup; the **back** includes a QR code linking to https://IMG.LY plus contact details.
24
+ - Throughout: heavy black bars and thin rules for structure, generous white space, minimal / raw / high contrast.
25
+
26
+ Workflow:
27
+
28
+ 1. Use `engine.scene.create()` once at the start, get the auto-created stack via `engine.block.findByType("stack")[0]`, then create each of the 4 pages and append to the stack.
29
+ 2. Build the content of each page with `design_exec`. Return only short status messages (`{ type: "text", text: "..." }`) — don't embed the full scene or PNG in your return value.
30
+ 3. After meaningful changes, visually verify with `design_capture({ blockId })` for the page in question. The PNG comes back inline.
31
+ 4. Iterate until the composition is right on each page. Don't move on to the next page until the current one looks correct.
32
+ 5. End with four final `design_capture` calls — one per page — so the user sees all four artworks.
33
+
34
+ When you're satisfied, summarize each page's typography (font sizes in pixels — confirm by reading them with `engine.block.getTextFontSizes(id, { unit: 'Pixel' })`).
@@ -0,0 +1,31 @@
1
+ ---
2
+ name: evals-danskCatalogue
3
+ description: Eval — generate a 5-page landscape furniture catalogue for "DANSK STUDIO" with image-left / typography-right pages and visually verify each one.
4
+ ---
5
+
6
+ Generate one landscape catalogue page per row for **5 products** from furniture designer **"DANSK STUDIO"**.
7
+
8
+ Layout (each page):
9
+
10
+ - 2-column grid.
11
+ - **Left column:** full-bleed product photo. Fill it with an elegant Danish-furniture photo in black-and-white (no heavy contrast). Use a real image URL (search e.g. unsplash.com for "danish chair", "danish table", "wooden lamp") or, if no fetch is possible, a neutral grey placeholder fill — but try the real image first.
12
+ - **Right column:** typography-led.
13
+ - **Product name** — large, light serif (e.g. Cormorant Garamond, EB Garamond, Playfair Display Regular).
14
+ - **Type category** (e.g. _LOUNGE CHAIR_, _DINING TABLE_) — small caps with generous tracking.
15
+ - **Description** — smaller weight, restrained line length.
16
+ - **Price in DKK** — anchored at the bottom of the right column.
17
+ - Lots of white space. No decorative elements. Don't make the text too small.
18
+
19
+ Vibe: think Muuto, Hay, Frama. Clean, cold, confident. White background, near-black text. No color, no rules, no ornaments.
20
+
21
+ Use placeholder furniture names, descriptions, and prices (DKK 1,200–18,000 range).
22
+
23
+ Workflow:
24
+
25
+ 1. `engine.scene.create("VerticalStack")` once at the start, get the stack via `engine.block.findByType("stack")[0]`.
26
+ 2. Create 5 landscape pages and append each to the stack. Stash all five page IDs on `globalThis` so subsequent `design_exec` calls can find them.
27
+ 3. For each product, build the content with `design_exec`. Return only short status messages (`{ type: "text", text: "..." }`) — don't embed images or scene state in your return value.
28
+ 4. Verify each page individually with `design_capture({ blockId: <pageId> })` after meaningful changes. Don't move on to the next product until the current one looks right.
29
+ 5. End with five final `design_capture` calls — one per page — so the user sees all five spreads.
30
+
31
+ When you're satisfied, summarize each page's typography (font sizes in pixels — confirm by reading them with `engine.block.getTextFontSizes(id, { unit: 'Pixel' })`).
@@ -0,0 +1,12 @@
1
+ ---
2
+ name: evals-exportRoundTrip
3
+ description: Eval — export writes a real artifact to the workspace and the returned URI is usable.
4
+ ---
5
+
6
+ Create a one-page A6 invitation card titled "Round-trip eval", set the title text to "Hello", then export the page as:
7
+
8
+ 1. A PDF (target: pdf, format: pdf)
9
+ 2. A PNG image (target: image, format: png, width 1024)
10
+ 3. The raw scene (target: scene, format: scene)
11
+
12
+ For each export, report the `uri` and `bytes` from the response. End by calling `list` and confirming the new design is there.