@pixel-point/toolcraft 0.0.17 → 0.0.19

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 (503) hide show
  1. package/package.json +1 -1
  2. package/src/generate-demand-only-lifecycle.test.mjs +9 -1
  3. package/src/generate-performance-iteration-execution.test.mjs +3 -3
  4. package/src/generate-test-delivery-architecture-assertions.mjs +11 -73
  5. package/src/generate-test-demand-only-lifecycle.mjs +34 -36
  6. package/src/generate-test-dependency-sandbox.mjs +4 -1
  7. package/src/generate-test-doc-assertions.mjs +81 -89
  8. package/src/generate-test-doc-assertions.test.mjs +44 -1
  9. package/src/generate-test-doc-policy-assertions.mjs +92 -0
  10. package/src/generate-test-export-doc-assertions.mjs +53 -0
  11. package/src/generate-test-file-assertions.mjs +77 -83
  12. package/src/generate-test-integrity-assertions.mjs +5 -2
  13. package/src/generate-test-integrity-manifest-assertions.mjs +16 -5
  14. package/src/generate-test-integrity-ownership-assertions.mjs +36 -4
  15. package/src/generate-test-package-assertions.mjs +4 -0
  16. package/src/generate-test-product-fixture.mjs +1 -1
  17. package/src/generate-test-product-fixture.test.mjs +35 -38
  18. package/src/generate-test-product-iteration.mjs +0 -1
  19. package/src/generate-test-product-iteration.test.mjs +17 -1
  20. package/src/generate-test-runtime-boundary-assertions.mjs +178 -0
  21. package/src/generate-test-standalone-assertions.mjs +7 -13
  22. package/src/generate-test-standalone-delivery-stages.mjs +2 -86
  23. package/src/generate.test.mjs +4 -0
  24. package/src/generated-integrity-manifest.test.mjs +5 -2
  25. package/src/generated-source-policy.test.mjs +0 -4
  26. package/src/package-json.mjs +5 -0
  27. package/src/package-json.test.mjs +21 -0
  28. package/src/package-manager.mjs +2 -0
  29. package/src/package-manager.test.mjs +8 -0
  30. package/src/packaged-template-fallback-helpers.mjs +254 -0
  31. package/src/packaged-template-fallback.test.mjs +121 -46
  32. package/src/packaged-template-runtime-assertions.mjs +150 -0
  33. package/templates/runtime/contracts/component-contracts.choices.test.ts +64 -5
  34. package/templates/runtime/contracts/component-contracts.choices.ts +55 -5
  35. package/templates/runtime/contracts/component-contracts.inputs.test.ts +6 -6
  36. package/templates/runtime/contracts/component-contracts.inputs.ts +8 -7
  37. package/templates/runtime/contracts/component-contracts.media-custom.test.ts +8 -2
  38. package/templates/runtime/contracts/component-contracts.media-custom.ts +8 -2
  39. package/templates/runtime/contracts/component-contracts.runtime-acceptance.test.ts +22 -8
  40. package/templates/runtime/contracts/component-contracts.runtime-labels.test.ts +7 -1
  41. package/templates/runtime/contracts/component-contracts.runtime-panels.test.ts +3 -0
  42. package/templates/runtime/contracts/component-contracts.runtime-shell.test.ts +4 -1
  43. package/templates/runtime/contracts/component-contracts.runtime.ts +19 -12
  44. package/templates/runtime/contracts/component-contracts.test.ts +2 -0
  45. package/templates/runtime/contracts/component-contracts.visual.test.ts +20 -0
  46. package/templates/runtime/contracts/component-contracts.visual.ts +4 -0
  47. package/templates/runtime/contracts/decision-contracts.test.ts +35 -11
  48. package/templates/runtime/contracts/decision-contracts.ts +12 -12
  49. package/templates/runtime/contracts/performance-verification-policy.test.ts +12 -12
  50. package/templates/runtime/contracts/performance-verification-policy.ts +8 -8
  51. package/templates/runtime/export/artifact-download.ts +1 -0
  52. package/templates/runtime/export/artifact-frame-renderer.ts +2 -15
  53. package/templates/runtime/export/artifact-frame-state.ts +16 -0
  54. package/templates/runtime/export/artifact-scene-frame.test.ts +3 -3
  55. package/templates/runtime/export/artifact-scene-frame.ts +3 -3
  56. package/templates/runtime/export/export-background.ts +0 -19
  57. package/templates/runtime/export/export-error.ts +5 -0
  58. package/templates/runtime/export/export-renderer-coverage.ts +54 -0
  59. package/templates/runtime/export/export.test.ts +45 -42
  60. package/templates/runtime/export/image-artifact-export.ts +2 -2
  61. package/templates/runtime/export/index.ts +57 -16
  62. package/templates/runtime/export/product-export-renderer.test.ts +38 -4
  63. package/templates/runtime/export/product-export-renderer.ts +0 -41
  64. package/templates/runtime/export/product-svg-export-renderer.ts +21 -0
  65. package/templates/runtime/export/svg-artifact-export.test.ts +98 -0
  66. package/templates/runtime/export/svg-artifact-export.ts +120 -0
  67. package/templates/runtime/export/svg-document.test.ts +221 -0
  68. package/templates/runtime/export/svg-document.ts +400 -0
  69. package/templates/runtime/export/svg-policy.ts +47 -0
  70. package/templates/runtime/index.ts +3 -0
  71. package/templates/runtime/model-import/model-import-limits.ts +15 -4
  72. package/templates/runtime/react/app-shell/runtime-public-api.test.tsx +21 -1
  73. package/templates/runtime/react/app-shell/settings-transfer.test.ts +21 -0
  74. package/templates/runtime/react/app-shell/toolcraft-app.scene-export.test.tsx +75 -1
  75. package/templates/runtime/react/app-shell/toolcraft-app.tsx +24 -9
  76. package/templates/runtime/react/canvas/canvas-shell-interactions.test.tsx +30 -0
  77. package/templates/runtime/react/canvas/canvas-shell-pinch-interactions.test.tsx +155 -0
  78. package/templates/runtime/react/canvas/canvas-shell-rendering.test.tsx +77 -1
  79. package/templates/runtime/react/canvas/canvas-shell-test-utils.tsx +13 -1
  80. package/templates/runtime/react/canvas/canvas-shell.tsx +32 -6
  81. package/templates/runtime/react/canvas/canvas-viewport-geometry.ts +133 -0
  82. package/templates/runtime/react/canvas/product-scene-surface.test.tsx +195 -0
  83. package/templates/runtime/react/canvas/product-scene-surface.tsx +155 -0
  84. package/templates/runtime/react/canvas/runtime-scene-export.ts +1 -1
  85. package/templates/runtime/react/canvas/use-canvas-viewport-interactions.ts +285 -36
  86. package/templates/runtime/react/controls-panel/__tests__/control-conditions.test.ts +61 -0
  87. package/templates/runtime/react/controls-panel/__tests__/controls-panel.collection-actions.test.tsx +89 -0
  88. package/templates/runtime/react/controls-panel/__tests__/controls-panel.color-applicability-layout.test.tsx +134 -0
  89. package/templates/runtime/react/controls-panel/__tests__/controls-panel.color-layout.test.tsx +16 -1
  90. package/templates/runtime/react/controls-panel/__tests__/controls-panel.control-visibility.test.tsx +40 -19
  91. package/templates/runtime/react/controls-panel/__tests__/controls-panel.render-isolation.test.tsx +2 -0
  92. package/templates/runtime/react/controls-panel/__tests__/controls-panel.scene-export-actions.test.tsx +40 -1
  93. package/templates/runtime/react/controls-panel/__tests__/controls-panel.setup-controls.test.tsx +3 -3
  94. package/templates/runtime/react/controls-panel/__tests__/controls-panel.source-collection.test.tsx +59 -0
  95. package/templates/runtime/react/controls-panel/__tests__/controls-panel.source-color-bank.test.tsx +67 -0
  96. package/templates/runtime/react/controls-panel/__tests__/controls-panel.vector-interaction.test.tsx +6 -6
  97. package/templates/runtime/react/controls-panel/actions/controls-panel-actions.ts +4 -6
  98. package/templates/runtime/react/controls-panel/actions/export-action-runner.ts +41 -6
  99. package/templates/runtime/react/controls-panel/conditions/control-conditions.ts +32 -119
  100. package/templates/runtime/react/controls-panel/layout/controls-panel-control-group.tsx +5 -2
  101. package/templates/runtime/react/controls-panel/layout/controls-panel-layout.tsx +41 -10
  102. package/templates/runtime/react/controls-panel/layout/controls-panel-section.tsx +7 -4
  103. package/templates/runtime/react/controls-panel/renderers/controls-panel-action-renderer.tsx +2 -1
  104. package/templates/runtime/react/controls-panel/renderers/controls-panel-basic-renderers.tsx +2 -52
  105. package/templates/runtime/react/controls-panel/renderers/controls-panel-collection-item-fields.test.tsx +63 -0
  106. package/templates/runtime/react/controls-panel/renderers/controls-panel-collection-item-fields.tsx +138 -0
  107. package/templates/runtime/react/controls-panel/renderers/controls-panel-collection-items.tsx +104 -0
  108. package/templates/runtime/react/controls-panel/renderers/controls-panel-collection-renderer.tsx +115 -236
  109. package/templates/runtime/react/controls-panel/renderers/controls-panel-file-drop-item-controls.test.tsx +95 -0
  110. package/templates/runtime/react/controls-panel/renderers/controls-panel-file-drop-item-controls.tsx +82 -0
  111. package/templates/runtime/react/controls-panel/renderers/controls-panel-media-renderer.test.tsx +73 -1
  112. package/templates/runtime/react/controls-panel/renderers/controls-panel-media-renderer.tsx +50 -1
  113. package/templates/runtime/react/controls-panel/renderers/controls-panel-renderer-registry.test.ts +1 -1
  114. package/templates/runtime/react/controls-panel/renderers/controls-panel-renderer-registry.ts +2 -1
  115. package/templates/runtime/react/controls-panel/values/controls-panel-collection-values.ts +38 -6
  116. package/templates/runtime/react/controls-panel/values/controls-panel-color-values.ts +1 -9
  117. package/templates/runtime/react/controls-panel/values/controls-panel-spatial-values.ts +7 -2
  118. package/templates/runtime/react/controls-panel/values/controls-panel-value-labels.ts +1 -0
  119. package/templates/runtime/react/index.ts +4 -0
  120. package/templates/runtime/react/model-rendering/model-export.ts +1 -1
  121. package/templates/runtime/react/orientation-gizmo/orientation-gizmo-math.ts +9 -69
  122. package/templates/runtime/react/orientation-gizmo/orientation-gizmo-selection.ts +5 -5
  123. package/templates/runtime/react/orientation-gizmo/use-toolcraft-orientation-control-selection.ts +2 -2
  124. package/templates/runtime/scene/scene-bounds.test.ts +23 -0
  125. package/templates/runtime/scene/scene-bounds.ts +31 -17
  126. package/templates/runtime/schema/app-capabilities.test.ts +4 -0
  127. package/templates/runtime/schema/artifact-export-actions.test.ts +47 -0
  128. package/templates/runtime/schema/artifact-export-actions.ts +49 -0
  129. package/templates/runtime/schema/collection-item-controls.ts +29 -0
  130. package/templates/runtime/schema/control-applicability.test.ts +127 -0
  131. package/templates/runtime/schema/control-applicability.ts +433 -0
  132. package/templates/runtime/schema/control-schema-normalization.ts +177 -11
  133. package/templates/runtime/schema/controls-panel-actions.ts +2 -2
  134. package/templates/runtime/schema/controls-panel-section-layout.ts +14 -9
  135. package/templates/runtime/schema/controls-panel-section-roundtrip.test.ts +59 -0
  136. package/templates/runtime/schema/define-toolcraft.collection-actions-item-controls.test.ts +127 -0
  137. package/templates/runtime/schema/define-toolcraft.control-sections.test.ts +10 -4
  138. package/templates/runtime/schema/define-toolcraft.file-drop-item-controls.test.ts +98 -0
  139. package/templates/runtime/schema/define-toolcraft.file-drop-normalization.test.ts +27 -0
  140. package/templates/runtime/schema/define-toolcraft.segmented-control-fit.test.ts +20 -2
  141. package/templates/runtime/schema/define-toolcraft.setup-canvas.test.ts +16 -3
  142. package/templates/runtime/schema/define-toolcraft.source-collection.test.ts +79 -0
  143. package/templates/runtime/schema/runtime-setup-section.ts +24 -5
  144. package/templates/runtime/schema/types.ts +69 -13
  145. package/templates/runtime/state/canvas-background-state.ts +1 -16
  146. package/templates/runtime/state/canvas-state.ts +32 -20
  147. package/templates/runtime/state/control-value-codecs.test.ts +98 -0
  148. package/templates/runtime/state/control-value-codecs.ts +700 -0
  149. package/templates/runtime/state/control-value-normalization.test.ts +1 -1
  150. package/templates/runtime/state/control-value-normalization.ts +127 -135
  151. package/templates/runtime/state/controls-reducer.ts +26 -3
  152. package/templates/runtime/state/create-template-state.test.ts +30 -0
  153. package/templates/runtime/state/create-template-state.ts +52 -31
  154. package/templates/runtime/state/orientation-pose.ts +80 -0
  155. package/templates/runtime/state/persistence-control-values.test.ts +59 -0
  156. package/templates/runtime/state/reducer-controls.test.ts +45 -0
  157. package/templates/runtime/state/reducer-media-reset.test.ts +1 -1
  158. package/templates/runtime/state/reducer-timeline.test.ts +70 -0
  159. package/templates/runtime/state/timeline-reducer.ts +40 -2
  160. package/templates/runtime/testing/performance-schema-queries.ts +2 -2
  161. package/templates/starter/AGENTS.md +29 -28
  162. package/templates/starter/docs/toolcraft/README.md +6 -6
  163. package/templates/starter/docs/toolcraft/acceptance-testing.md +34 -48
  164. package/templates/starter/docs/toolcraft/agent-worklog.md +103 -1
  165. package/templates/starter/docs/toolcraft/assembly-workflow.md +16 -8
  166. package/templates/starter/docs/toolcraft/component-rules.md +9 -7
  167. package/templates/starter/docs/toolcraft/core/control-selection.md +9 -3
  168. package/templates/starter/docs/toolcraft/core/layout.md +13 -8
  169. package/templates/starter/docs/toolcraft/core/media-upload.md +3 -1
  170. package/templates/starter/docs/toolcraft/core/performance.md +8 -10
  171. package/templates/starter/docs/toolcraft/core/reference-study.md +80 -19
  172. package/templates/starter/docs/toolcraft/core/runtime-boundary.md +15 -3
  173. package/templates/starter/docs/toolcraft/core/setup-export.md +67 -11
  174. package/templates/starter/docs/toolcraft/custom-controls.md +6 -4
  175. package/templates/starter/docs/toolcraft/decision-contract.md +4 -2
  176. package/templates/starter/docs/toolcraft/performance.md +8 -10
  177. package/templates/starter/docs/toolcraft/renderer-technique.md +6 -2
  178. package/templates/starter/docs/toolcraft/schema-reference.md +24 -22
  179. package/templates/starter/docs/toolcraft/workflow.md +14 -14
  180. package/templates/starter/e2e/app-browser-control-applicability-requirements.spec.ts +163 -0
  181. package/templates/starter/e2e/app-browser-infinity-canvas-evidence.spec.ts +45 -2
  182. package/templates/starter/e2e/app-browser-motion-reference-requirements.spec.ts +411 -0
  183. package/templates/starter/e2e/app-browser-orientation-evidence.spec.ts +174 -21
  184. package/templates/starter/e2e/app-browser-proof-session.spec.ts +85 -0
  185. package/templates/starter/e2e/app-browser-runtime-requirements.spec.ts +63 -33
  186. package/templates/starter/e2e/app-browser-selection-scope-evidence.spec.ts +137 -0
  187. package/templates/starter/e2e/app-browser-semantic-evidence.spec.ts +61 -15
  188. package/templates/starter/e2e/{browser-conditional-output-evidence-helpers.ts → browser-background-output-evidence.ts} +0 -68
  189. package/templates/starter/e2e/browser-control-applicability-evidence.ts +114 -0
  190. package/templates/starter/e2e/browser-infinity-canvas-evidence.ts +20 -11
  191. package/templates/starter/e2e/browser-infinity-canvas-svg-evidence.ts +42 -0
  192. package/templates/starter/e2e/browser-layer-evidence-helpers.ts +15 -36
  193. package/templates/starter/e2e/browser-orientation-gizmo-evidence-helpers.ts +4 -0
  194. package/templates/starter/e2e/browser-orientation-gizmo-live-preconditions.ts +86 -0
  195. package/templates/starter/e2e/browser-product-raster-snapshot.ts +213 -0
  196. package/templates/starter/e2e/browser-proof-session.ts +43 -15
  197. package/templates/starter/e2e/browser-proof-surface-action.ts +79 -0
  198. package/templates/starter/e2e/browser-proof-types.ts +15 -0
  199. package/templates/starter/e2e/browser-runtime-applicability-requirements.ts +84 -0
  200. package/templates/starter/e2e/browser-runtime-evidence-reporter.ts +9 -2
  201. package/templates/starter/e2e/browser-runtime-evidence-requirements.ts +51 -32
  202. package/templates/starter/e2e/browser-selection-scope-evidence.ts +269 -0
  203. package/templates/starter/e2e/browser-semantic-evidence-test-helpers.ts +122 -0
  204. package/templates/starter/e2e/browser-svg-export-evidence.spec.ts +79 -0
  205. package/templates/starter/e2e/browser-svg-export-evidence.ts +152 -0
  206. package/templates/starter/e2e/export-artifact-helpers.ts +70 -0
  207. package/templates/starter/e2e/product-observable-helpers.ts +8 -129
  208. package/templates/starter/e2e/svg-artifact-inspection.spec.ts +136 -0
  209. package/templates/starter/e2e/svg-artifact-inspection.ts +331 -0
  210. package/templates/starter/e2e/svg-download-test-fixtures.ts +34 -0
  211. package/templates/starter/e2e/toolcraft-delivery-catalog-reporter.ts +198 -15
  212. package/templates/starter/e2e/toolcraft-feature-verification-reporter.spec.ts +149 -0
  213. package/templates/starter/e2e/toolcraft-feature-verification-reporter.ts +223 -0
  214. package/templates/starter/package.json +2 -0
  215. package/templates/starter/scripts/check-toolcraft-docs.mjs +1 -0
  216. package/templates/starter/scripts/create-toolcraft-motion-reference-study.mjs +233 -0
  217. package/templates/starter/scripts/create-toolcraft-motion-reference-study.test.mjs +459 -0
  218. package/templates/starter/scripts/playwright-test-title-selection.d.mts +45 -0
  219. package/templates/starter/scripts/run-browser-performance-test-helpers.mjs +0 -27
  220. package/templates/starter/scripts/run-browser-performance.mjs +0 -6
  221. package/templates/starter/scripts/run-browser-performance.test.mjs +5 -13
  222. package/templates/starter/scripts/run-delivery-verification-test-helpers.mjs +0 -34
  223. package/templates/starter/scripts/run-delivery-verification.test.mjs +135 -31
  224. package/templates/starter/scripts/run-feature-verification.mjs +212 -0
  225. package/templates/starter/scripts/run-feature-verification.test.mjs +226 -0
  226. package/templates/starter/scripts/toolcraft-checkpoint-delivery-state.mjs +21 -8
  227. package/templates/starter/scripts/toolcraft-checkpoint-delivery-state.test.mjs +32 -92
  228. package/templates/starter/scripts/toolcraft-checkpoint-transaction.mjs +28 -6
  229. package/templates/starter/scripts/toolcraft-checkpoint-transaction.test.mjs +8 -63
  230. package/templates/starter/scripts/toolcraft-contract-manifest.json +1 -0
  231. package/templates/starter/scripts/toolcraft-delivery-anchor.mjs +28 -8
  232. package/templates/starter/scripts/toolcraft-delivery-anchor.test.mjs +50 -61
  233. package/templates/starter/scripts/toolcraft-delivery-architecture-inventory.mjs +0 -4
  234. package/templates/starter/scripts/toolcraft-delivery-architecture-policy.mjs +0 -1
  235. package/templates/starter/scripts/toolcraft-delivery-evidence.test.mjs +2 -3
  236. package/templates/starter/scripts/toolcraft-delivery-executor.mjs +5 -1
  237. package/templates/starter/scripts/toolcraft-delivery-executor.test.mjs +5 -12
  238. package/templates/starter/scripts/toolcraft-delivery-functional-context.d.mts +1 -48
  239. package/templates/starter/scripts/toolcraft-delivery-functional-context.mjs +2 -30
  240. package/templates/starter/scripts/toolcraft-delivery-functional-context.test.mjs +4 -166
  241. package/templates/starter/scripts/toolcraft-delivery-functional-initial.test.mjs +4 -20
  242. package/templates/starter/scripts/toolcraft-delivery-lifecycle.mjs +43 -192
  243. package/templates/starter/scripts/toolcraft-delivery-performance-iteration-lifecycle.test.mjs +79 -440
  244. package/templates/starter/scripts/toolcraft-delivery-plan-authority.test.mjs +102 -297
  245. package/templates/starter/scripts/toolcraft-delivery-plan-construction.mjs +46 -97
  246. package/templates/starter/scripts/toolcraft-delivery-plan-test-helpers.mjs +125 -0
  247. package/templates/starter/scripts/toolcraft-delivery-plan-validation.test.mjs +58 -0
  248. package/templates/starter/scripts/toolcraft-delivery-plan.d.mts +19 -31
  249. package/templates/starter/scripts/toolcraft-delivery-plan.mjs +254 -252
  250. package/templates/starter/scripts/toolcraft-delivery-plan.test.mjs +29 -457
  251. package/templates/starter/scripts/toolcraft-delivery-receipt-performance.test.mjs +1 -1
  252. package/templates/starter/scripts/toolcraft-delivery-receipt-strictness.test.mjs +3 -72
  253. package/templates/starter/scripts/toolcraft-delivery-receipt-test-helpers.mjs +7 -36
  254. package/templates/starter/scripts/toolcraft-delivery-receipt.d.mts +3 -5
  255. package/templates/starter/scripts/toolcraft-delivery-receipt.mjs +15 -31
  256. package/templates/starter/scripts/toolcraft-delivery-receipt.test.mjs +28 -20
  257. package/templates/starter/scripts/toolcraft-delivery-receipt.types.test.mts +22 -30
  258. package/templates/starter/scripts/toolcraft-feature-verification-plan.d.mts +20 -0
  259. package/templates/starter/scripts/toolcraft-feature-verification-plan.mjs +146 -0
  260. package/templates/starter/scripts/toolcraft-feature-verification-plan.test.mjs +96 -0
  261. package/templates/starter/scripts/toolcraft-functional-proof-model.d.mts +3 -18
  262. package/templates/starter/scripts/toolcraft-functional-proof-model.mjs +39 -127
  263. package/templates/starter/scripts/toolcraft-functional-proof-model.test.mjs +25 -362
  264. package/templates/starter/scripts/toolcraft-functional-proof-model.types.test.mts +6 -83
  265. package/templates/starter/scripts/toolcraft-functional-proof-primitives.d.mts +11 -0
  266. package/templates/starter/scripts/toolcraft-functional-proof-primitives.mjs +61 -0
  267. package/templates/starter/scripts/toolcraft-functional-proof-primitives.test.mjs +43 -0
  268. package/templates/starter/scripts/toolcraft-integrity-policy.mjs +13 -0
  269. package/templates/starter/scripts/toolcraft-integrity-test-utils.mjs +1 -1
  270. package/templates/starter/scripts/toolcraft-layer-evidence-facade.test.mjs +58 -22
  271. package/templates/starter/scripts/toolcraft-motion-reference-analysis-protocol.mjs +111 -0
  272. package/templates/starter/scripts/toolcraft-motion-reference-analysis-protocol.test.mjs +116 -0
  273. package/templates/starter/scripts/toolcraft-motion-reference-artifacts.d.mts +37 -0
  274. package/templates/starter/scripts/toolcraft-motion-reference-artifacts.mjs +308 -0
  275. package/templates/starter/scripts/toolcraft-motion-reference-artifacts.test.mjs +420 -0
  276. package/templates/starter/scripts/toolcraft-motion-reference-artifacts.types.test.mts +50 -0
  277. package/templates/starter/scripts/toolcraft-motion-reference-command-options.mjs +195 -0
  278. package/templates/starter/scripts/toolcraft-motion-reference-command-options.test.mjs +224 -0
  279. package/templates/starter/scripts/toolcraft-motion-reference-contact-sheet.mjs +122 -0
  280. package/templates/starter/scripts/toolcraft-motion-reference-contact-sheet.test.mjs +153 -0
  281. package/templates/starter/scripts/toolcraft-motion-reference-evidence-assembly.mjs +270 -0
  282. package/templates/starter/scripts/toolcraft-motion-reference-evidence.test.mjs +432 -0
  283. package/templates/starter/scripts/toolcraft-motion-reference-ffmpeg-output.mjs +275 -0
  284. package/templates/starter/scripts/toolcraft-motion-reference-ffmpeg-output.test.mjs +294 -0
  285. package/templates/starter/scripts/toolcraft-motion-reference-group-inventory.mjs +148 -0
  286. package/templates/starter/scripts/toolcraft-motion-reference-image-filter-graph.mjs +101 -0
  287. package/templates/starter/scripts/toolcraft-motion-reference-image-filter-graph.test.mjs +124 -0
  288. package/templates/starter/scripts/toolcraft-motion-reference-image-source.mjs +259 -0
  289. package/templates/starter/scripts/toolcraft-motion-reference-image-source.test.mjs +338 -0
  290. package/templates/starter/scripts/toolcraft-motion-reference-image-timing.mjs +96 -0
  291. package/templates/starter/scripts/toolcraft-motion-reference-image-timing.test.mjs +81 -0
  292. package/templates/starter/scripts/toolcraft-motion-reference-lock-recovery.test.mjs +144 -0
  293. package/templates/starter/scripts/toolcraft-motion-reference-media-source.mjs +165 -0
  294. package/templates/starter/scripts/toolcraft-motion-reference-media-source.test.mjs +299 -0
  295. package/templates/starter/scripts/toolcraft-motion-reference-publication-discovery.test.mjs +142 -0
  296. package/templates/starter/scripts/toolcraft-motion-reference-publication-isolation.test.mjs +234 -0
  297. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal-schema.mjs +122 -0
  298. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal-store.mjs +89 -0
  299. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal-store.test.mjs +74 -0
  300. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal.mjs +264 -0
  301. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal.test.mjs +377 -0
  302. package/templates/starter/scripts/toolcraft-motion-reference-publication-lease.mjs +254 -0
  303. package/templates/starter/scripts/toolcraft-motion-reference-publication-lease.test.mjs +130 -0
  304. package/templates/starter/scripts/toolcraft-motion-reference-publication-staging.mjs +128 -0
  305. package/templates/starter/scripts/toolcraft-motion-reference-publication-staging.test.mjs +209 -0
  306. package/templates/starter/scripts/toolcraft-motion-reference-publication.fixtures.mjs +88 -0
  307. package/templates/starter/scripts/toolcraft-motion-reference-publication.mjs +249 -0
  308. package/templates/starter/scripts/toolcraft-motion-reference-publication.test.mjs +433 -0
  309. package/templates/starter/scripts/toolcraft-motion-reference-review-output.mjs +38 -0
  310. package/templates/starter/scripts/toolcraft-motion-reference-review-output.test.mjs +29 -0
  311. package/templates/starter/scripts/toolcraft-motion-reference-root-safety.test.mjs +84 -0
  312. package/templates/starter/scripts/toolcraft-motion-reference-roots.mjs +83 -0
  313. package/templates/starter/scripts/toolcraft-motion-reference-sampling.mjs +283 -0
  314. package/templates/starter/scripts/toolcraft-motion-reference-sampling.test.mjs +480 -0
  315. package/templates/starter/scripts/toolcraft-motion-reference-stage-registry.mjs +39 -0
  316. package/templates/starter/scripts/toolcraft-motion-reference-stage-registry.test.mjs +59 -0
  317. package/templates/starter/scripts/toolcraft-motion-reference-stage.mjs +71 -0
  318. package/templates/starter/scripts/toolcraft-motion-reference-stage.test.mjs +61 -0
  319. package/templates/starter/scripts/toolcraft-motion-review-numeric.mjs +74 -0
  320. package/templates/starter/scripts/toolcraft-motion-review-numeric.test.mjs +65 -0
  321. package/templates/starter/scripts/toolcraft-motion-review-partitioning.mjs +268 -0
  322. package/templates/starter/scripts/toolcraft-motion-review-partitioning.test.mjs +329 -0
  323. package/templates/starter/scripts/toolcraft-motion-review-protected-units.mjs +120 -0
  324. package/templates/starter/scripts/toolcraft-motion-review-protected-units.test.mjs +111 -0
  325. package/templates/starter/scripts/toolcraft-performance-escalation-policy.test.mjs +77 -345
  326. package/templates/starter/scripts/toolcraft-performance-receipt-validation.test.mjs +19 -21
  327. package/templates/starter/scripts/toolcraft-product-boundary-ast.mjs +85 -115
  328. package/templates/starter/scripts/toolcraft-product-boundary-module-policy.mjs +101 -0
  329. package/templates/starter/scripts/toolcraft-product-boundary.test.mjs +0 -72
  330. package/templates/starter/scripts/toolcraft-product-control-bindings.mjs +182 -0
  331. package/templates/starter/scripts/toolcraft-product-control-boundary.mjs +146 -0
  332. package/templates/starter/scripts/toolcraft-product-control-boundary.test.mjs +186 -0
  333. package/templates/starter/scripts/toolcraft-product-export-boundary.mjs +16 -18
  334. package/templates/starter/scripts/toolcraft-product-export-boundary.test.mjs +200 -0
  335. package/templates/starter/scripts/toolcraft-product-observable-facade.test.mjs +46 -1
  336. package/templates/starter/scripts/toolcraft-receipt-boundary.test.mjs +0 -1
  337. package/templates/starter/scripts/toolcraft-source-inventory.d.mts +5 -0
  338. package/templates/starter/scripts/toolcraft-source-inventory.mjs +25 -14
  339. package/templates/starter/scripts/toolcraft-source-inventory.test.mjs +48 -0
  340. package/templates/starter/scripts/toolcraft-source-ownership.mjs +0 -1
  341. package/templates/starter/scripts/toolcraft-source-ownership.test.mjs +30 -5
  342. package/templates/starter/scripts/toolcraft-typescript-source-evidence-structure.test.mjs +20 -0
  343. package/templates/starter/scripts/toolcraft-typescript-source-evidence.mjs +1 -0
  344. package/templates/starter/scripts/toolcraft-unavailable-resource-evidence-facade.test.mjs +2 -0
  345. package/templates/starter/scripts/toolcraft-verification-receipt-test-helpers.mjs +5 -26
  346. package/templates/starter/scripts/toolcraft-verification-receipt.d.mts +0 -7
  347. package/templates/starter/scripts/toolcraft-verification-receipt.mjs +3 -47
  348. package/templates/starter/scripts/toolcraft-verification-receipt.test.mjs +6 -87
  349. package/templates/starter/scripts/toolcraft-vitest-runtime-contract.d.mts +19 -0
  350. package/templates/starter/scripts/toolcraft-vitest-runtime-contract.mjs +107 -0
  351. package/templates/starter/scripts/toolcraft-vitest-runtime-contract.test.mjs +114 -0
  352. package/templates/starter/scripts/toolcraft-vitest-runtime-evidence-reporter.mjs +13 -2
  353. package/templates/starter/scripts/toolcraft-vitest-runtime-evidence-reporter.test.mjs +110 -0
  354. package/templates/starter/src/app/acceptance/artifact-export-intent.ts +161 -0
  355. package/templates/starter/src/app/acceptance/canvas-coverage.ts +1 -0
  356. package/templates/starter/src/app/acceptance/color-bank-labels.ts +11 -15
  357. package/templates/starter/src/app/acceptance/color-row-grouping.ts +33 -0
  358. package/templates/starter/src/app/acceptance/conditions.ts +1 -1
  359. package/templates/starter/src/app/acceptance/control-acceptance-context.ts +2 -2
  360. package/templates/starter/src/app/acceptance/control-acceptance-coverage.ts +6 -31
  361. package/templates/starter/src/app/acceptance/control-acceptance-kind-rules.ts +24 -5
  362. package/templates/starter/src/app/acceptance/control-acceptance-policy.ts +4 -16
  363. package/templates/starter/src/app/acceptance/control-applicability-cases.test.ts +321 -0
  364. package/templates/starter/src/app/acceptance/control-applicability-cases.ts +290 -0
  365. package/templates/starter/src/app/acceptance/control-applicability.ts +332 -0
  366. package/templates/starter/src/app/acceptance/control-component-rules.ts +0 -10
  367. package/templates/starter/src/app/acceptance/control-labels.ts +30 -1
  368. package/templates/starter/src/app/acceptance/control-layout-dependency-rules.ts +20 -9
  369. package/templates/starter/src/app/acceptance/control-layout-entity-rules.ts +4 -6
  370. package/templates/starter/src/app/acceptance/control-layout-model.ts +4 -4
  371. package/templates/starter/src/app/acceptance/control-layout-section-rules.ts +21 -10
  372. package/templates/starter/src/app/acceptance/control-parts.ts +8 -0
  373. package/templates/starter/src/app/acceptance/control-section-entity-cohesion.test.ts +215 -0
  374. package/templates/starter/src/app/acceptance/control-section-entity-cohesion.ts +132 -0
  375. package/templates/starter/src/app/acceptance/control-section-inventory.test.ts +87 -0
  376. package/templates/starter/src/app/acceptance/control-section-inventory.ts +74 -44
  377. package/templates/starter/src/app/acceptance/custom-controls.ts +11 -3
  378. package/templates/starter/src/app/acceptance/export-artifact-coverage.ts +25 -17
  379. package/templates/starter/src/app/acceptance/feature-verification-selection.test.ts +295 -0
  380. package/templates/starter/src/app/acceptance/feature-verification-selection.ts +161 -0
  381. package/templates/starter/src/app/acceptance/infinity-canvas.ts +10 -0
  382. package/templates/starter/src/app/acceptance/inline-layout.ts +64 -9
  383. package/templates/starter/src/app/acceptance/interaction-ownership-intent.ts +19 -1
  384. package/templates/starter/src/app/acceptance/interaction-ownership.ts +18 -2
  385. package/templates/starter/src/app/acceptance/media-upload.ts +5 -1
  386. package/templates/starter/src/app/acceptance/motion-reference-evidence-validation.mjs +65 -0
  387. package/templates/starter/src/app/acceptance/motion-reference-evidence-windows.mjs +301 -0
  388. package/templates/starter/src/app/acceptance/motion-reference-evidence.d.mts +11 -0
  389. package/templates/starter/src/app/acceptance/motion-reference-evidence.mjs +145 -0
  390. package/templates/starter/src/app/acceptance/motion-reference-study-behaviors.ts +162 -0
  391. package/templates/starter/src/app/acceptance/motion-reference-study-coverage.ts +206 -0
  392. package/templates/starter/src/app/acceptance/motion-reference-study-identity.ts +129 -0
  393. package/templates/starter/src/app/acceptance/motion-reference-study-partitions.ts +186 -0
  394. package/templates/starter/src/app/acceptance/motion-reference-study.ts +90 -0
  395. package/templates/starter/src/app/acceptance/orientation-gizmo.ts +18 -11
  396. package/templates/starter/src/app/acceptance/output-background-rules.ts +2 -2
  397. package/templates/starter/src/app/acceptance/output-export-actions.test.ts +9 -1
  398. package/templates/starter/src/app/acceptance/output-export-actions.ts +14 -22
  399. package/templates/starter/src/app/acceptance/output-export-layout-rules.ts +22 -10
  400. package/templates/starter/src/app/acceptance/output-export-model.ts +58 -11
  401. package/templates/starter/src/app/acceptance/output-export.ts +25 -10
  402. package/templates/starter/src/app/acceptance/output-video-export-rules.ts +99 -0
  403. package/templates/starter/src/app/acceptance/reference-study-types.ts +167 -17
  404. package/templates/starter/src/app/acceptance/runtime-coverage.ts +6 -1
  405. package/templates/starter/src/app/acceptance/selection-scope.test.ts +200 -0
  406. package/templates/starter/src/app/acceptance/selection-scope.ts +151 -0
  407. package/templates/starter/src/app/acceptance/transfer-mode-types.ts +114 -0
  408. package/templates/starter/src/app/acceptance/types.ts +65 -125
  409. package/templates/starter/src/app/acceptance/validate-coverage.ts +33 -5
  410. package/templates/starter/src/app/starter-acceptance-data.ts +1 -0
  411. package/templates/starter/src/app/starter-acceptance.animation-intent.test.ts +3 -0
  412. package/templates/starter/src/app/starter-acceptance.artifact-export-intent.test.ts +312 -0
  413. package/templates/starter/src/app/starter-acceptance.background-export.test.ts +35 -0
  414. package/templates/starter/src/app/starter-acceptance.canvas-sizing.test.ts +18 -1
  415. package/templates/starter/src/app/starter-acceptance.color-row-grouping.test.ts +118 -0
  416. package/templates/starter/src/app/starter-acceptance.compound-part-coverage.test.ts +66 -1
  417. package/templates/starter/src/app/starter-acceptance.contract-fixtures.test.ts +41 -0
  418. package/templates/starter/src/app/starter-acceptance.contract-fixtures.ts +113 -16
  419. package/templates/starter/src/app/starter-acceptance.control-applicability.test.ts +225 -0
  420. package/templates/starter/src/app/starter-acceptance.control-label-context.test.ts +1 -0
  421. package/templates/starter/src/app/starter-acceptance.control-labels.test.ts +78 -3
  422. package/templates/starter/src/app/starter-acceptance.control-naming-rules.test.ts +77 -1
  423. package/templates/starter/src/app/starter-acceptance.control-order.test.ts +58 -3
  424. package/templates/starter/src/app/starter-acceptance.control-state.test.ts +0 -111
  425. package/templates/starter/src/app/starter-acceptance.custom-control-collections.test.ts +3 -1
  426. package/templates/starter/src/app/starter-acceptance.custom-control-fit-check.test.ts +1 -1
  427. package/templates/starter/src/app/starter-acceptance.custom-control-valid.test.ts +1 -1
  428. package/templates/starter/src/app/starter-acceptance.export-artifact.test.ts +74 -3
  429. package/templates/starter/src/app/starter-acceptance.export-test-utils.ts +26 -0
  430. package/templates/starter/src/app/{starter-acceptance.image-video-export-settings.test.ts → starter-acceptance.image-export-settings.test.ts} +39 -9
  431. package/templates/starter/src/app/starter-acceptance.interaction-ownership.test.ts +31 -3
  432. package/templates/starter/src/app/starter-acceptance.layers.test.ts +2 -1
  433. package/templates/starter/src/app/starter-acceptance.media-upload.fixtures.ts +11 -1
  434. package/templates/starter/src/app/starter-acceptance.media-upload.test.ts +56 -0
  435. package/templates/starter/src/app/starter-acceptance.motion-reference-evidence.test.ts +17 -0
  436. package/templates/starter/src/app/starter-acceptance.motion-reference-identity.test.ts +163 -0
  437. package/templates/starter/src/app/starter-acceptance.motion-reference-mapping.test.ts +133 -0
  438. package/templates/starter/src/app/starter-acceptance.motion-reference-ownership.test.ts +121 -0
  439. package/templates/starter/src/app/starter-acceptance.motion-reference-partitions.test.ts +210 -0
  440. package/templates/starter/src/app/starter-acceptance.motion-reference-test-utils.ts +313 -0
  441. package/templates/starter/src/app/starter-acceptance.output-export-intent.test.ts +458 -0
  442. package/templates/starter/src/app/starter-acceptance.output-export-rules.test.ts +4 -0
  443. package/templates/starter/src/app/starter-acceptance.product-output-export.test.ts +116 -104
  444. package/templates/starter/src/app/starter-acceptance.product-readiness.test.ts +29 -0
  445. package/templates/starter/src/app/starter-acceptance.product-worklog.test.ts +123 -2
  446. package/templates/starter/src/app/starter-acceptance.reference-custom-timeline.test.ts +2 -0
  447. package/templates/starter/src/app/starter-acceptance.reference-foundation.test.ts +8 -0
  448. package/templates/starter/src/app/starter-acceptance.reference-timeline.test.ts +7 -0
  449. package/templates/starter/src/app/starter-acceptance.section-cohesion.test.ts +3 -1
  450. package/templates/starter/src/app/starter-acceptance.section-dependencies.test.ts +35 -24
  451. package/templates/starter/src/app/starter-acceptance.section-size.test.ts +72 -0
  452. package/templates/starter/src/app/starter-acceptance.timeline-playback.test.ts +5 -0
  453. package/templates/starter/src/app/starter-acceptance.ts +45 -10
  454. package/templates/starter/src/app/starter-acceptance.video-export-settings.test.ts +338 -0
  455. package/templates/starter/src/app/starter-acceptance.video-reference-study.test.ts +34 -236
  456. package/templates/starter/src/app/starter-acceptance.view-interaction.test.ts +12 -0
  457. package/templates/starter/src/app/starter-acceptance.worklog-test-utils.ts +122 -6
  458. package/templates/starter/src/app/starter-acceptance.worklog.test.ts +152 -16
  459. package/templates/starter/src/app/starter-performance.gates.test.ts +20 -18
  460. package/templates/starter/src/app/starter-performance.lifecycle.test.ts +22 -6
  461. package/templates/starter/src/app/test-evidence/browser-runtime-contract.ts +5 -2
  462. package/templates/starter/src/routes/index.tsx +1 -0
  463. package/templates/starter/tsconfig.json +1 -0
  464. package/templates/ui/components/composites/tabs.tsx +2 -2
  465. package/templates/ui/components/controls/collection-actions/collection-item-groups.test.tsx +38 -0
  466. package/templates/ui/components/controls/collection-actions/collection-item-groups.tsx +36 -0
  467. package/templates/ui/components/controls/collection-actions/index.ts +2 -0
  468. package/templates/ui/components/controls/file-drop/file-drop-collection-control.tsx +137 -0
  469. package/templates/ui/components/controls/file-drop/file-drop-control.test.tsx +189 -0
  470. package/templates/ui/components/controls/file-drop/file-drop-control.tsx +81 -88
  471. package/templates/ui/components/controls/file-drop/file-drop-presentation.tsx +131 -9
  472. package/templates/ui/components/controls/file-drop/file-drop-types.ts +36 -22
  473. package/templates/ui/components/controls/file-drop/index.ts +1 -0
  474. package/templates/ui/components/controls/index.ts +3 -0
  475. package/templates/ui/components/controls/range-slider/range-slider-control.tsx +1 -1
  476. package/templates/ui/components/controls/range-slider/range-slider-value.test.ts +14 -0
  477. package/templates/ui/components/controls/range-slider/range-slider-value.ts +3 -2
  478. package/templates/starter/scripts/toolcraft-browser-impact-selection.mjs +0 -26
  479. package/templates/starter/scripts/toolcraft-delivery-framework-refresh.test.mjs +0 -141
  480. package/templates/starter/scripts/toolcraft-delivery-functional-changed.test.mjs +0 -468
  481. package/templates/starter/scripts/toolcraft-delivery-functional-model-lifecycle.test.mjs +0 -254
  482. package/templates/starter/scripts/toolcraft-delivery-functional-semantic-regression.test.mjs +0 -135
  483. package/templates/starter/scripts/toolcraft-delivery-performance-iteration-durability.test.mjs +0 -329
  484. package/templates/starter/scripts/toolcraft-delivery-plan-errors.test.mjs +0 -430
  485. package/templates/starter/scripts/toolcraft-delivery-plan-functional-model.test.mjs +0 -358
  486. package/templates/starter/scripts/toolcraft-functional-proof-regression-fixtures.mjs +0 -298
  487. package/templates/starter/scripts/toolcraft-verification-impact-inventory.d.mts +0 -62
  488. package/templates/starter/scripts/toolcraft-verification-impact-inventory.mjs +0 -344
  489. package/templates/starter/scripts/toolcraft-verification-impact-inventory.test.mjs +0 -204
  490. package/templates/starter/scripts/toolcraft-verification-impact-performance-candidates.test.mjs +0 -210
  491. package/templates/starter/scripts/toolcraft-verification-impact-resolution.mjs +0 -344
  492. package/templates/starter/scripts/toolcraft-verification-impact-resolution.test.mjs +0 -270
  493. package/templates/starter/scripts/toolcraft-verification-impact-semantic-resolution.test.mjs +0 -449
  494. package/templates/starter/scripts/toolcraft-verification-impact-support-resolution.test.mjs +0 -195
  495. package/templates/starter/scripts/toolcraft-verification-impact.d.mts +0 -132
  496. package/templates/starter/scripts/toolcraft-verification-impact.mjs +0 -169
  497. package/templates/starter/scripts/toolcraft-verification-impact.test.mjs +0 -300
  498. package/templates/starter/scripts/toolcraft-verification-input-roles.mjs +0 -197
  499. package/templates/starter/scripts/toolcraft-verification-input-roles.test.mjs +0 -225
  500. package/templates/starter/src/app/acceptance/condition-exclusivity.test.ts +0 -60
  501. package/templates/starter/src/app/acceptance/condition-exclusivity.ts +0 -221
  502. package/templates/starter/src/app/acceptance/video-reference-study.ts +0 -217
  503. package/templates/starter/src/app/starter-verification-impact.json +0 -15
@@ -3,6 +3,7 @@ import { defineToolcraft } from "@repo/toolcraft-runtime";
3
3
 
4
4
  import {
5
5
  schemaHasPngExportPanelAction,
6
+ schemaHasSvgExportPanelAction,
6
7
  schemaHasVideoExportPanelAction,
7
8
  } from "./output-export-actions";
8
9
 
@@ -16,6 +17,11 @@ function createOutputSchema() {
16
17
  controls: {
17
18
  output: {
18
19
  actions: [
20
+ {
21
+ label: "Guardar vector",
22
+ role: "export-svg",
23
+ value: "salida.vector",
24
+ },
19
25
  {
20
26
  label: "Guardar imagen",
21
27
  role: "export-image",
@@ -41,10 +47,11 @@ function createOutputSchema() {
41
47
  }
42
48
 
43
49
  describe("Toolcraft typed output action roles", () => {
44
- it("detects image and video export without parsing labels or values", () => {
50
+ it("detects image, SVG, and video export without parsing labels or values", () => {
45
51
  const schema = createOutputSchema();
46
52
 
47
53
  expect(schemaHasPngExportPanelAction(schema)).toBe(true);
54
+ expect(schemaHasSvgExportPanelAction(schema)).toBe(true);
48
55
  expect(schemaHasVideoExportPanelAction(schema)).toBe(true);
49
56
  });
50
57
 
@@ -71,6 +78,7 @@ describe("Toolcraft typed output action roles", () => {
71
78
  });
72
79
 
73
80
  expect(schemaHasPngExportPanelAction(schema)).toBe(false);
81
+ expect(schemaHasSvgExportPanelAction(schema)).toBe(false);
74
82
  expect(schemaHasVideoExportPanelAction(schema)).toBe(false);
75
83
  });
76
84
  });
@@ -1,34 +1,26 @@
1
1
  import type {
2
2
  ResolvedToolcraftAppSchema,
3
- ToolcraftActionSchema,
3
+ ToolcraftArtifactExportActionRole,
4
4
  } from "@repo/toolcraft-runtime";
5
+ import { getToolcraftArtifactExportActions } from "@repo/toolcraft-runtime";
5
6
 
6
- import { getControlActions } from "./actions";
7
-
8
- function actionLooksLikePngExport(action: ToolcraftActionSchema | string): boolean {
9
- return typeof action !== "string" && action.role === "export-image";
7
+ function schemaHasExportPanelAction(
8
+ schema: ResolvedToolcraftAppSchema,
9
+ role: ToolcraftArtifactExportActionRole,
10
+ ): boolean {
11
+ return getToolcraftArtifactExportActions(schema).some(
12
+ (action) => action.role === role,
13
+ );
10
14
  }
11
15
 
12
- function actionLooksLikeVideoExport(action: ToolcraftActionSchema | string): boolean {
13
- return typeof action !== "string" && action.role === "export-video";
16
+ export function schemaHasPngExportPanelAction(schema: ResolvedToolcraftAppSchema): boolean {
17
+ return schemaHasExportPanelAction(schema, "export-image");
14
18
  }
15
19
 
16
- export function schemaHasPngExportPanelAction(schema: ResolvedToolcraftAppSchema): boolean {
17
- return (schema.panels.controls?.sections ?? []).some((section) =>
18
- Object.values(section.controls).some(
19
- (control) =>
20
- control.type === "panelActions" &&
21
- getControlActions(control).some(actionLooksLikePngExport),
22
- ),
23
- );
20
+ export function schemaHasSvgExportPanelAction(schema: ResolvedToolcraftAppSchema): boolean {
21
+ return schemaHasExportPanelAction(schema, "export-svg");
24
22
  }
25
23
 
26
24
  export function schemaHasVideoExportPanelAction(schema: ResolvedToolcraftAppSchema): boolean {
27
- return (schema.panels.controls?.sections ?? []).some((section) =>
28
- Object.values(section.controls).some(
29
- (control) =>
30
- control.type === "panelActions" &&
31
- getControlActions(control).some(actionLooksLikeVideoExport),
32
- ),
33
- );
25
+ return schemaHasExportPanelAction(schema, "export-video");
34
26
  }
@@ -1,20 +1,31 @@
1
+ import type { ToolcraftArtifactExportDelivery } from "./artifact-export-intent";
1
2
  import type { ToolcraftOutputExportFacts } from "./output-export-model";
2
3
 
3
- export function getToolcraftOutputExportLayoutErrors(
4
- facts: ToolcraftOutputExportFacts,
5
- ): string[] {
4
+ export function getToolcraftOutputExportLayoutErrors({
5
+ delivery,
6
+ facts,
7
+ }: {
8
+ delivery: ToolcraftArtifactExportDelivery;
9
+ facts: ToolcraftOutputExportFacts;
10
+ }): string[] {
11
+ if (
12
+ !delivery.imageEnabled &&
13
+ !delivery.svgEnabled &&
14
+ !delivery.videoEnabled
15
+ ) {
16
+ return [];
17
+ }
18
+
6
19
  const errors: string[] = [];
7
20
 
8
21
  if (facts.backgroundSection) {
9
22
  errors.push(
10
- 'Product apps with Export PNG must not render a separate "Background" section; runtime Setup owns Background, Infinity canvas, and Color.',
23
+ 'Product apps with artifact export must not render a separate "Background" section; runtime Setup owns Background, Infinity canvas, and Color.',
11
24
  );
12
25
  }
13
26
 
14
27
  if (!facts.setupSection || facts.setupSectionIndex !== 0) {
15
- errors.push(
16
- "Runtime Setup must remain the first controls block.",
17
- );
28
+ errors.push("Runtime Setup must remain the first controls block.");
18
29
  }
19
30
 
20
31
  if (
@@ -23,18 +34,19 @@ export function getToolcraftOutputExportLayoutErrors(
23
34
  facts.finalExportSettingsIndex !== facts.panelActionsSectionIndex - 1
24
35
  ) {
25
36
  errors.push(
26
- 'Export settings must sit directly above sticky footer actions: Image Export for still apps, or Video Export after Image Export for animated apps.',
37
+ "The final enabled artifact export settings section must sit directly above sticky footer actions.",
27
38
  );
28
39
  }
29
40
 
30
41
  if (
31
- facts.hasVideoExportAction &&
42
+ delivery.imageEnabled &&
43
+ delivery.videoEnabled &&
32
44
  facts.imageExportSectionIndex >= 0 &&
33
45
  facts.videoExportSectionIndex >= 0 &&
34
46
  facts.imageExportSectionIndex !== facts.videoExportSectionIndex - 1
35
47
  ) {
36
48
  errors.push(
37
- 'Animated apps with both Export PNG and Export Video must place Image Export immediately before Video Export.',
49
+ 'Products with image and video delivery must place "Image Export" immediately before "Video Export".',
38
50
  );
39
51
  }
40
52
 
@@ -4,6 +4,11 @@ import type {
4
4
  } from "@repo/toolcraft-runtime";
5
5
 
6
6
  import { getControlLabelText } from "./controls";
7
+ import {
8
+ schemaHasPngExportPanelAction,
9
+ schemaHasSvgExportPanelAction,
10
+ schemaHasVideoExportPanelAction,
11
+ } from "./output-export-actions";
7
12
  import { normalizeToolcraftSemanticText } from "./semantic";
8
13
 
9
14
  export type ToolcraftControlsSection = NonNullable<
@@ -14,6 +19,8 @@ export type ToolcraftOutputExportFacts = {
14
19
  backgroundColorEntry: readonly [string, ToolcraftControlSchema] | undefined;
15
20
  backgroundSection: ToolcraftControlsSection | undefined;
16
21
  finalExportSettingsIndex: number;
22
+ hasImageExportAction: boolean;
23
+ hasSvgExportAction: boolean;
17
24
  hasVideoExportAction: boolean;
18
25
  imageExportSection: ToolcraftControlsSection | undefined;
19
26
  imageExportSectionIndex: number;
@@ -25,7 +32,10 @@ export type ToolcraftOutputExportFacts = {
25
32
  setupSection: ToolcraftControlsSection | undefined;
26
33
  setupSectionIndex: number;
27
34
  timelineEntry: readonly [string, ToolcraftControlSchema] | undefined;
35
+ videoExportSection: ToolcraftControlsSection | undefined;
28
36
  videoExportSectionIndex: number;
37
+ videoFormatEntry: readonly [string, ToolcraftControlSchema] | undefined;
38
+ videoResolutionEntry: readonly [string, ToolcraftControlSchema] | undefined;
29
39
  };
30
40
 
31
41
  export function getSearchableControlText({
@@ -47,9 +57,13 @@ export function getSearchableControlText({
47
57
  .replace(/([a-z])([A-Z])/g, "$1 $2");
48
58
  }
49
59
 
50
- function getFirstPanelActionsSectionIndex(schema: ResolvedToolcraftAppSchema): number {
60
+ function getFirstPanelActionsSectionIndex(
61
+ schema: ResolvedToolcraftAppSchema,
62
+ ): number {
51
63
  return (schema.panels.controls?.sections ?? []).findIndex((section) =>
52
- Object.values(section.controls).some((control) => control.type === "panelActions"),
64
+ Object.values(section.controls).some(
65
+ (control) => control.type === "panelActions",
66
+ ),
53
67
  );
54
68
  }
55
69
 
@@ -60,7 +74,8 @@ function getSchemaControlsSectionByTitle(
60
74
  const normalizedTitle = normalizeToolcraftSemanticText(title);
61
75
 
62
76
  return (schema.panels.controls?.sections ?? []).find(
63
- (section) => normalizeToolcraftSemanticText(section.title) === normalizedTitle,
77
+ (section) =>
78
+ normalizeToolcraftSemanticText(section.title) === normalizedTitle,
64
79
  );
65
80
  }
66
81
 
@@ -83,7 +98,9 @@ function getSectionControlEntryByTarget(
83
98
  return undefined;
84
99
  }
85
100
 
86
- return Object.entries(section.controls).find(([, control]) => control.target === target);
101
+ return Object.entries(section.controls).find(
102
+ ([, control]) => control.target === target,
103
+ );
87
104
  }
88
105
 
89
106
  function getOutputBackgroundColorEntry(
@@ -107,24 +124,45 @@ function getOutputBackgroundColorEntry(
107
124
  }
108
125
 
109
126
  export function buildToolcraftOutputExportFacts({
110
- hasVideoExportAction,
111
127
  schema,
112
128
  }: {
113
- hasVideoExportAction: boolean;
114
129
  schema: ResolvedToolcraftAppSchema;
115
130
  }): ToolcraftOutputExportFacts {
116
- const backgroundSection = getSchemaControlsSectionByTitle(schema, "Background");
131
+ const backgroundSection = getSchemaControlsSectionByTitle(
132
+ schema,
133
+ "Background",
134
+ );
117
135
  const setupSection = getSchemaControlsSectionByTitle(schema, "Setup");
118
- const imageExportSection = getSchemaControlsSectionByTitle(schema, "Image Export");
119
- const imageExportSectionIndex = getSchemaControlsSectionIndexByTitle(schema, "Image Export");
120
- const videoExportSectionIndex = getSchemaControlsSectionIndexByTitle(schema, "Video Export");
136
+ const imageExportSection = getSchemaControlsSectionByTitle(
137
+ schema,
138
+ "Image Export",
139
+ );
140
+ const videoExportSection = getSchemaControlsSectionByTitle(
141
+ schema,
142
+ "Video Export",
143
+ );
144
+ const imageExportSectionIndex = getSchemaControlsSectionIndexByTitle(
145
+ schema,
146
+ "Image Export",
147
+ );
148
+ const videoExportSectionIndex = getSchemaControlsSectionIndexByTitle(
149
+ schema,
150
+ "Video Export",
151
+ );
152
+ const hasImageExportAction = schemaHasPngExportPanelAction(schema);
153
+ const hasSvgExportAction = schemaHasSvgExportPanelAction(schema);
154
+ const hasVideoExportAction = schemaHasVideoExportPanelAction(schema);
121
155
 
122
156
  return {
123
157
  backgroundColorEntry: getOutputBackgroundColorEntry(setupSection),
124
158
  backgroundSection,
125
159
  finalExportSettingsIndex: hasVideoExportAction
126
160
  ? videoExportSectionIndex
127
- : imageExportSectionIndex,
161
+ : hasImageExportAction
162
+ ? imageExportSectionIndex
163
+ : -1,
164
+ hasImageExportAction,
165
+ hasSvgExportAction,
128
166
  hasVideoExportAction,
129
167
  imageExportSection,
130
168
  imageExportSectionIndex,
@@ -151,6 +189,15 @@ export function buildToolcraftOutputExportFacts({
151
189
  setupSection,
152
190
  "panels.timeline.extended",
153
191
  ),
192
+ videoExportSection,
154
193
  videoExportSectionIndex,
194
+ videoFormatEntry: getSectionControlEntryByTarget(
195
+ videoExportSection,
196
+ "export.video.format",
197
+ ),
198
+ videoResolutionEntry: getSectionControlEntryByTarget(
199
+ videoExportSection,
200
+ "export.video.resolution",
201
+ ),
155
202
  };
156
203
  }
@@ -1,56 +1,71 @@
1
1
  import type { ResolvedToolcraftAppSchema } from "@repo/toolcraft-runtime";
2
2
 
3
+ import { validateToolcraftArtifactExportIntentCorrespondence } from "./artifact-export-intent";
3
4
  import {
4
5
  getToolcraftOutputBackgroundErrors,
5
6
  isOutputBackgroundToggleControl,
6
7
  } from "./output-background-rules";
7
8
  import {
8
9
  schemaHasPngExportPanelAction,
10
+ schemaHasSvgExportPanelAction,
9
11
  schemaHasVideoExportPanelAction,
10
12
  } from "./output-export-actions";
11
13
  import { getToolcraftOutputExportLayoutErrors } from "./output-export-layout-rules";
12
14
  import { buildToolcraftOutputExportFacts } from "./output-export-model";
13
15
  import { getToolcraftImageExportErrors } from "./output-image-export-rules";
16
+ import { getToolcraftVideoExportErrors } from "./output-video-export-rules";
14
17
  import { getToolcraftExportArtifactCoverageErrors } from "./export-artifact-coverage";
15
18
  import type {
16
19
  ToolcraftComponentAcceptance,
20
+ ToolcraftProductReadiness,
17
21
  ToolcraftVisibleControl,
18
22
  } from "./types";
19
23
 
20
24
  export {
21
25
  isOutputBackgroundToggleControl,
22
26
  schemaHasPngExportPanelAction,
27
+ schemaHasSvgExportPanelAction,
23
28
  schemaHasVideoExportPanelAction,
24
29
  };
25
30
 
26
31
  export function getToolcraftOutputExportErrors({
27
32
  acceptance,
28
33
  controls,
34
+ productReadiness,
29
35
  schema,
30
- hasVideoExportAction = schemaHasVideoExportPanelAction(schema),
31
36
  }: {
32
37
  acceptance: readonly ToolcraftComponentAcceptance[];
33
38
  controls: readonly ToolcraftVisibleControl[];
34
- hasVideoExportAction?: boolean;
39
+ productReadiness: ToolcraftProductReadiness;
35
40
  schema: ResolvedToolcraftAppSchema;
36
41
  }): string[] {
37
42
  const exportArtifactCoverageErrors = getToolcraftExportArtifactCoverageErrors({
38
43
  acceptance,
39
44
  schema,
40
45
  });
41
- if (!schemaHasPngExportPanelAction(schema)) {
46
+ if (productReadiness.mode === "starter") {
42
47
  return exportArtifactCoverageErrors;
43
48
  }
44
49
 
45
- const facts = buildToolcraftOutputExportFacts({
46
- hasVideoExportAction,
47
- schema,
48
- });
50
+ const facts = buildToolcraftOutputExportFacts({ schema });
51
+ const { delivery, errors: intentErrors } =
52
+ validateToolcraftArtifactExportIntentCorrespondence({
53
+ hasImageExportAction: facts.hasImageExportAction,
54
+ hasImageExportSection: facts.imageExportSection !== undefined,
55
+ hasSvgExportAction: facts.hasSvgExportAction,
56
+ hasVideoExportAction: facts.hasVideoExportAction,
57
+ hasVideoExportSection: facts.videoExportSection !== undefined,
58
+ intent: productReadiness.exportIntent,
59
+ });
49
60
 
50
61
  return [
51
- ...getToolcraftOutputExportLayoutErrors(facts),
52
- ...getToolcraftOutputBackgroundErrors({ controls, facts }),
53
- ...getToolcraftImageExportErrors(facts),
62
+ ...intentErrors,
63
+ ...(delivery.imageEnabled ? getToolcraftImageExportErrors(facts) : []),
64
+ ...(delivery.videoEnabled ? getToolcraftVideoExportErrors(facts) : []),
65
+ ...(delivery.imageEnabled || delivery.svgEnabled || delivery.videoEnabled
66
+ ? getToolcraftOutputBackgroundErrors({ controls, facts })
67
+ : []),
68
+ ...getToolcraftOutputExportLayoutErrors({ delivery, facts }),
54
69
  ...exportArtifactCoverageErrors,
55
70
  ];
56
71
  }
@@ -0,0 +1,99 @@
1
+ import { sectionHasInlineLayoutGroupForPair } from "./inline-layout";
2
+ import type { ToolcraftOutputExportFacts } from "./output-export-model";
3
+
4
+ function hasExactOptionValueSet(
5
+ actual: readonly string[],
6
+ expected: readonly string[],
7
+ ): boolean {
8
+ return (
9
+ actual.length === expected.length &&
10
+ new Set(actual).size === expected.length &&
11
+ expected.every((value) => actual.includes(value))
12
+ );
13
+ }
14
+
15
+ export function getToolcraftVideoExportErrors(
16
+ facts: ToolcraftOutputExportFacts,
17
+ ): string[] {
18
+ const errors: string[] = [];
19
+ const videoFormatControl = facts.videoFormatEntry?.[1];
20
+ const videoResolutionControl = facts.videoResolutionEntry?.[1];
21
+ const videoFormatOptionValues =
22
+ videoFormatControl?.options?.map((option) => option.value.toLowerCase()) ??
23
+ [];
24
+ const videoResolutionOptionValues =
25
+ videoResolutionControl?.options?.map((option) =>
26
+ option.value.toLowerCase(),
27
+ ) ?? [];
28
+
29
+ if (!facts.videoExportSection) {
30
+ errors.push(
31
+ 'Apps with Export Video must expose video export settings in a separate controls section titled "Video Export" directly above sticky footer export actions.',
32
+ );
33
+ }
34
+
35
+ if (!videoFormatControl) {
36
+ errors.push(
37
+ 'The separate "Video Export" section must include a format control with target "export.video.format".',
38
+ );
39
+ } else {
40
+ if (
41
+ videoFormatControl.type !== "select" &&
42
+ videoFormatControl.type !== "segmented"
43
+ ) {
44
+ errors.push("Video Export format must be a Select or Segmented control.");
45
+ }
46
+
47
+ if (!hasExactOptionValueSet(videoFormatOptionValues, ["mp4", "webm"])) {
48
+ errors.push(
49
+ 'Video Export format options must be exactly "mp4" and "webm".',
50
+ );
51
+ }
52
+
53
+ if (videoFormatControl.defaultValue !== "mp4") {
54
+ errors.push('Video Export format must default to "mp4".');
55
+ }
56
+ }
57
+
58
+ if (!videoResolutionControl) {
59
+ errors.push(
60
+ 'The separate "Video Export" section must include a resolution control with target "export.video.resolution".',
61
+ );
62
+ } else {
63
+ if (videoResolutionControl.type !== "select") {
64
+ errors.push("Video Export resolution must be a Select control.");
65
+ }
66
+
67
+ if (
68
+ !hasExactOptionValueSet(videoResolutionOptionValues, ["current", "4k"])
69
+ ) {
70
+ errors.push(
71
+ 'Video Export resolution options must be exactly "current" and "4k".',
72
+ );
73
+ }
74
+
75
+ if (videoResolutionControl.defaultValue !== "current") {
76
+ errors.push('Video Export resolution must default to "current".');
77
+ }
78
+ }
79
+
80
+ const videoFormatControlId = facts.videoFormatEntry?.[0];
81
+ const videoResolutionControlId = facts.videoResolutionEntry?.[0];
82
+ const videoExportHasInlinePair =
83
+ facts.videoExportSection !== undefined &&
84
+ videoFormatControlId !== undefined &&
85
+ videoResolutionControlId !== undefined &&
86
+ sectionHasInlineLayoutGroupForPair(
87
+ facts.videoExportSection,
88
+ videoFormatControlId,
89
+ videoResolutionControlId,
90
+ );
91
+
92
+ if (!videoExportHasInlinePair) {
93
+ errors.push(
94
+ "Video Export format and resolution must render as one exact two-column inline row.",
95
+ );
96
+ }
97
+
98
+ return errors;
99
+ }
@@ -12,36 +12,186 @@ export type ToolcraftReferenceStudyEvidence = {
12
12
  status: ToolcraftReferenceStudyStatus;
13
13
  };
14
14
 
15
- export type ToolcraftVideoReferenceStoryboardFrame = {
16
- behaviorObservation: string;
15
+ export type ToolcraftMotionReferenceTimingMode = "ordinal" | "seconds";
16
+
17
+ export type ToolcraftMotionReferenceSourceKind =
18
+ | "contact-sheet"
19
+ | "frame-sequence"
20
+ | "gif"
21
+ | "screen-recording"
22
+ | "video";
23
+
24
+ type ToolcraftMotionReferenceFrameBase = {
25
+ cell: Readonly<{ column: number; row: number }>;
17
26
  frameId: string;
18
- frameSource: string;
19
- timeSeconds: number;
20
- visualObservation: string;
27
+ sourceFrameIndex: number;
28
+ sourceLocator: string;
29
+ sourceSha256: string;
21
30
  };
22
31
 
23
- export type ToolcraftVideoReferenceTransition = {
24
- behaviorDelta: string;
32
+ export type ToolcraftMotionReferenceOrdinalFrame =
33
+ ToolcraftMotionReferenceFrameBase & { timeSeconds?: never };
34
+
35
+ export type ToolcraftMotionReferenceTimedFrame =
36
+ ToolcraftMotionReferenceFrameBase & { timeSeconds: number };
37
+
38
+ export type ToolcraftMotionReferenceEvidenceEvent = {
39
+ afterFrameId: string;
40
+ beforeFrameId: string;
41
+ eventId: string;
42
+ kind: "change" | "loop-seam";
43
+ peakFrameId: string;
44
+ score: number;
45
+ windowFrameIds: readonly string[];
46
+ };
47
+
48
+ type ToolcraftMotionReferenceEvidenceBase = {
49
+ changeMetric: "max-yuva-diff-v1";
50
+ contactSheet: Readonly<{
51
+ columns: number;
52
+ height: number;
53
+ path: `src/app/reference-studies/${string}/contact-sheet.png`;
54
+ rows: number;
55
+ sha256: string;
56
+ width: number;
57
+ }>;
58
+ decodedFrameCount: number;
59
+ detectedEvents: readonly ToolcraftMotionReferenceEvidenceEvent[];
60
+ evidenceVersion: 1;
61
+ ffmpegVersion: string;
62
+ ffprobeVersion: string;
63
+ height: number;
64
+ scannedFrameCount: number;
65
+ sourceBasename: string;
66
+ sourceSha256: string;
67
+ studyId: string;
68
+ width: number;
69
+ };
70
+
71
+ export type ToolcraftMotionReferenceEvidence =
72
+ ToolcraftMotionReferenceEvidenceBase &
73
+ (
74
+ | {
75
+ sourceGrid: Readonly<{ columns: number; rows: number }>;
76
+ sourceKind: "contact-sheet";
77
+ }
78
+ | {
79
+ sourceGrid?: never;
80
+ sourceKind: Exclude<
81
+ ToolcraftMotionReferenceSourceKind,
82
+ "contact-sheet"
83
+ >;
84
+ }
85
+ ) &
86
+ (
87
+ | {
88
+ focusWindows: readonly [];
89
+ overviewFrameIds: readonly string[];
90
+ reviewedFrames: readonly ToolcraftMotionReferenceOrdinalFrame[];
91
+ timingMode: "ordinal";
92
+ }
93
+ | {
94
+ durationSeconds: number;
95
+ focusWindows: readonly Readonly<{
96
+ endSeconds: number;
97
+ frameIds: readonly string[];
98
+ sourceFrameEndIndex: number;
99
+ sourceFrameStartIndex: number;
100
+ startSeconds: number;
101
+ }>[];
102
+ maximumSourceFrameGapSeconds: number;
103
+ nominalFrameRate?: number;
104
+ overviewFrameIds: readonly string[];
105
+ overviewTargetFps: number;
106
+ reviewPartition?: Readonly<{
107
+ count: number;
108
+ groupId: `motion-group-v1-${string}`;
109
+ index: number;
110
+ planSha256: string;
111
+ scope: Readonly<{ endSeconds: number; startSeconds: number }>;
112
+ }>;
113
+ reviewedFrames: readonly ToolcraftMotionReferenceTimedFrame[];
114
+ segment?: Readonly<{ endSeconds: number; startSeconds: number }>;
115
+ timing: Readonly<
116
+ | { authority: "decoded-timestamps" }
117
+ | { authority: "declared-fps"; framesPerSecond: number }
118
+ | {
119
+ authority: "declared-timestamps";
120
+ timestampsSha256: string;
121
+ }
122
+ >;
123
+ timingMode: "seconds";
124
+ }
125
+ );
126
+
127
+ export type ToolcraftMotionReferencePhase = {
128
+ behaviorIds: readonly string[];
25
129
  fromFrameId: string;
26
130
  id: string;
27
131
  toFrameId: string;
132
+ visualState: string;
28
133
  };
29
134
 
30
- export type ToolcraftVideoReferenceAcceptanceMapping = {
135
+ export type ToolcraftMotionReferenceEvent = {
136
+ evidenceEventId: string;
137
+ id: string;
138
+ } &
139
+ (
140
+ | {
141
+ behaviorIds: readonly string[];
142
+ classification: "product-behavior";
143
+ reason?: never;
144
+ }
145
+ | {
146
+ behaviorIds: readonly [];
147
+ classification:
148
+ | "edit-boundary"
149
+ | "encoding-artifact"
150
+ | "irrelevant-change";
151
+ reason: string;
152
+ }
153
+ );
154
+
155
+ export type ToolcraftMotionReferenceTimingClaim =
156
+ | "cadence"
157
+ | "duration"
158
+ | "easing"
159
+ | "loop-seam"
160
+ | "speed";
161
+
162
+ export type ToolcraftMotionReferenceBehavior = {
31
163
  acceptanceId: string;
32
- behavior: string;
33
- frameIds: readonly string[];
164
+ description: string;
165
+ id: string;
166
+ implementationIntent: string;
167
+ timingClaims: readonly Readonly<{
168
+ claim: ToolcraftMotionReferenceTimingClaim;
169
+ studyId: string;
170
+ }>[];
34
171
  };
35
172
 
36
- export type ToolcraftVideoReferenceStudyEvidence = {
37
- acceptanceMapping: readonly ToolcraftVideoReferenceAcceptanceMapping[];
38
- behaviorDecomposition: string;
39
- extractionEvidence: string;
40
- referenceLocation: string;
41
- storyboard: readonly ToolcraftVideoReferenceStoryboardFrame[];
42
- transitionAnalysis: readonly ToolcraftVideoReferenceTransition[];
173
+ export type ToolcraftMotionReferenceStudy = {
174
+ evidence: ToolcraftMotionReferenceEvidence;
175
+ evidencePath: `src/app/reference-studies/${string}/evidence.json`;
176
+ events: readonly ToolcraftMotionReferenceEvent[];
177
+ phases: readonly ToolcraftMotionReferencePhase[];
178
+ studyId: string;
43
179
  };
44
180
 
181
+ export type ToolcraftMotionReferenceInput = {
182
+ behaviors: readonly ToolcraftMotionReferenceBehavior[];
183
+ kind: "motion-reference";
184
+ referenceId: `motion-reference-v1-${string}`;
185
+ studies: readonly ToolcraftMotionReferenceStudy[];
186
+ };
187
+
188
+ export type ToolcraftReferenceInput = ToolcraftMotionReferenceInput;
189
+
190
+ export type ToolcraftMotionReferenceCoverage = Readonly<{
191
+ behaviorId: string;
192
+ referenceId: ToolcraftMotionReferenceInput["referenceId"];
193
+ }>;
194
+
45
195
  export type ToolcraftReferenceFeatureStatus =
46
196
  | "intentionally-changed"
47
197
  | "ported"