@pixel-point/toolcraft 0.0.14 → 0.0.15

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 (577) hide show
  1. package/README.md +13 -2
  2. package/package.json +1 -1
  3. package/scripts/prepare-pack.mjs +2 -28
  4. package/src/cli-io.mjs +174 -0
  5. package/src/cli-package-manager-flow.test.mjs +206 -0
  6. package/src/cli.mjs +7 -495
  7. package/src/cli.test.mjs +34 -177
  8. package/src/create-command.mjs +152 -0
  9. package/src/create-options.mjs +194 -0
  10. package/src/generate-test-assertions.mjs +27 -0
  11. package/src/generate-test-doc-assertions.mjs +162 -0
  12. package/src/generate-test-file-assertions.mjs +251 -0
  13. package/src/generate-test-fs-utils.mjs +59 -0
  14. package/src/generate-test-integrity-assertions.mjs +30 -0
  15. package/src/generate-test-integrity-framework-assertions.mjs +222 -0
  16. package/src/generate-test-integrity-manifest-assertions.mjs +150 -0
  17. package/src/generate-test-integrity-ownership-assertions.mjs +127 -0
  18. package/src/generate-test-integrity-test-utils.mjs +102 -0
  19. package/src/generate-test-package-assertions.mjs +75 -0
  20. package/src/generate-test-product-fixture.mjs +84 -0
  21. package/src/generate-test-product-fixture.test.mjs +73 -0
  22. package/src/generate-test-standalone-assertions.mjs +209 -0
  23. package/src/generate-transactional.test.mjs +151 -0
  24. package/src/generate.mjs +182 -102
  25. package/src/generate.test.mjs +242 -338
  26. package/src/generated-integrity-manifest.mjs +127 -0
  27. package/src/generated-integrity-manifest.test.mjs +151 -0
  28. package/src/generated-source-policy.mjs +22 -0
  29. package/src/generated-source-policy.test.mjs +35 -0
  30. package/src/generated-target-policy.mjs +55 -0
  31. package/src/generation-transaction.mjs +135 -0
  32. package/src/generation-transaction.test.mjs +74 -0
  33. package/src/package-json.mjs +18 -1
  34. package/src/package-json.test.mjs +38 -5
  35. package/src/package-manager.mjs +2 -0
  36. package/src/package-manager.test.mjs +5 -1
  37. package/src/packaged-template-fallback.test.mjs +126 -0
  38. package/src/prepare-pack-templates.mjs +34 -0
  39. package/templates/runtime/contracts/component-contract-builders.ts +95 -0
  40. package/templates/runtime/contracts/component-contracts.choices.test.ts +293 -0
  41. package/templates/runtime/contracts/component-contracts.choices.ts +322 -0
  42. package/templates/runtime/contracts/component-contracts.inputs.test.ts +210 -0
  43. package/templates/runtime/contracts/component-contracts.inputs.ts +252 -0
  44. package/templates/runtime/contracts/component-contracts.media-custom.test.ts +116 -0
  45. package/templates/runtime/contracts/component-contracts.media-custom.ts +144 -0
  46. package/templates/runtime/contracts/component-contracts.runtime-acceptance.test.ts +229 -0
  47. package/templates/runtime/contracts/component-contracts.runtime-labels.test.ts +76 -0
  48. package/templates/runtime/contracts/component-contracts.runtime-panels.test.ts +135 -0
  49. package/templates/runtime/contracts/component-contracts.runtime-shell.test.ts +148 -0
  50. package/templates/runtime/contracts/component-contracts.runtime.ts +361 -0
  51. package/templates/runtime/contracts/component-contracts.test.ts +39 -1458
  52. package/templates/runtime/contracts/component-contracts.ts +44 -1505
  53. package/templates/runtime/contracts/component-contracts.visual.test.ts +316 -0
  54. package/templates/runtime/contracts/component-contracts.visual.ts +385 -0
  55. package/templates/runtime/contracts/contract-manifest.test.ts +64 -0
  56. package/templates/runtime/contracts/decision-contracts.test.ts +29 -4
  57. package/templates/runtime/contracts/decision-contracts.ts +38 -1
  58. package/templates/runtime/index.ts +1 -0
  59. package/templates/runtime/react/{runtime-public-api.test.tsx → app-shell/runtime-public-api.test.tsx} +29 -7
  60. package/templates/runtime/react/{settings-transfer.test.ts → app-shell/settings-transfer.test.ts} +4 -4
  61. package/templates/runtime/react/{settings-transfer.ts → app-shell/settings-transfer.ts} +3 -3
  62. package/templates/runtime/react/{toolbar-panel.test.tsx → app-shell/toolbar-panel.test.tsx} +2 -2
  63. package/templates/runtime/react/{toolbar-panel.tsx → app-shell/toolbar-panel.tsx} +3 -3
  64. package/templates/runtime/react/{toolcraft-app.integration.test.tsx → app-shell/toolcraft-app.integration.test.tsx} +6 -6
  65. package/templates/runtime/react/{toolcraft-app.test.tsx → app-shell/toolcraft-app.test.tsx} +3 -3
  66. package/templates/runtime/react/{toolcraft-app.tsx → app-shell/toolcraft-app.tsx} +11 -8
  67. package/templates/runtime/react/{toolcraft-root.test.tsx → app-shell/toolcraft-root.test.tsx} +1 -1
  68. package/templates/runtime/react/{toolcraft-root.tsx → app-shell/toolcraft-root.tsx} +5 -5
  69. package/templates/runtime/react/{use-toolcraft.ts → app-shell/use-toolcraft.ts} +1 -1
  70. package/templates/runtime/react/canvas/canvas-default-media-layer.tsx +81 -0
  71. package/templates/runtime/react/canvas/canvas-media-transform.ts +33 -0
  72. package/templates/runtime/react/canvas/canvas-shell-interactions.test.tsx +156 -0
  73. package/templates/runtime/react/canvas/canvas-shell-media-rendering.test.tsx +87 -0
  74. package/templates/runtime/react/canvas/canvas-shell-rendering.test.tsx +102 -0
  75. package/templates/runtime/react/canvas/canvas-shell-test-utils.tsx +108 -0
  76. package/templates/runtime/react/canvas/canvas-shell-upload.test.tsx +106 -0
  77. package/templates/runtime/react/canvas/canvas-shell.tsx +146 -0
  78. package/templates/runtime/react/canvas/canvas-upload-routing.ts +84 -0
  79. package/templates/runtime/react/{media-file.ts → canvas/media-file.ts} +1 -1
  80. package/templates/runtime/react/canvas/use-canvas-drop-import.ts +145 -0
  81. package/templates/runtime/react/canvas/use-canvas-viewport-interactions.ts +227 -0
  82. package/templates/runtime/react/controls-panel/__tests__/control-conditions.test.ts +89 -0
  83. package/templates/runtime/react/{controls-panel-filedrop-reorder.test.tsx → controls-panel/__tests__/controls-panel-filedrop-reorder.test.tsx} +4 -4
  84. package/templates/runtime/react/controls-panel/__tests__/controls-panel.actions-layout.test.tsx +91 -0
  85. package/templates/runtime/react/controls-panel/__tests__/controls-panel.collection-actions.test.tsx +213 -0
  86. package/templates/runtime/react/controls-panel/__tests__/controls-panel.color-layout.test.tsx +366 -0
  87. package/templates/runtime/react/controls-panel/__tests__/controls-panel.color-picker-models.test.tsx +169 -0
  88. package/templates/runtime/react/controls-panel/__tests__/controls-panel.compound-layout.test.tsx +160 -0
  89. package/templates/runtime/react/controls-panel/__tests__/controls-panel.control-visibility.test.tsx +352 -0
  90. package/templates/runtime/react/controls-panel/__tests__/controls-panel.curves.test.tsx +226 -0
  91. package/templates/runtime/react/controls-panel/__tests__/controls-panel.floating-shell.test.tsx +13 -0
  92. package/templates/runtime/react/controls-panel/__tests__/controls-panel.font-picker.test.tsx +302 -0
  93. package/templates/runtime/react/controls-panel/__tests__/controls-panel.footer-actions.test.tsx +401 -0
  94. package/templates/runtime/react/controls-panel/__tests__/controls-panel.gradient-control.test.tsx +139 -0
  95. package/templates/runtime/react/controls-panel/__tests__/controls-panel.help-policy.test.tsx +103 -0
  96. package/templates/runtime/react/controls-panel/__tests__/controls-panel.image-picker.test.tsx +16 -0
  97. package/templates/runtime/react/controls-panel/__tests__/controls-panel.inline-layout.test.tsx +290 -0
  98. package/templates/runtime/react/controls-panel/__tests__/controls-panel.keyframes.test.tsx +175 -0
  99. package/templates/runtime/react/controls-panel/__tests__/controls-panel.media-upload-files.test.tsx +121 -0
  100. package/templates/runtime/react/controls-panel/__tests__/controls-panel.media-upload-image.test.tsx +363 -0
  101. package/templates/runtime/react/controls-panel/__tests__/controls-panel.media-upload-multi-image.test.tsx +105 -0
  102. package/templates/runtime/react/controls-panel/__tests__/controls-panel.range-slider-editing.test.tsx +149 -0
  103. package/templates/runtime/react/controls-panel/__tests__/controls-panel.section-shell.test.tsx +138 -0
  104. package/templates/runtime/react/controls-panel/__tests__/controls-panel.select-layout.test.tsx +148 -0
  105. package/templates/runtime/react/controls-panel/__tests__/controls-panel.setup-controls.test.tsx +189 -0
  106. package/templates/runtime/react/controls-panel/__tests__/controls-panel.slider-rendering.test.tsx +317 -0
  107. package/templates/runtime/react/controls-panel/__tests__/controls-panel.state-reset.test.tsx +137 -0
  108. package/templates/runtime/react/controls-panel/__tests__/controls-panel.structure.test.tsx +66 -0
  109. package/templates/runtime/react/controls-panel/__tests__/controls-panel.text-input.test.tsx +205 -0
  110. package/templates/runtime/react/controls-panel/__tests__/controls-panel.vector-interaction.test.tsx +388 -0
  111. package/templates/runtime/react/controls-panel/__tests__/controls-panel.vector-layout.test.tsx +155 -0
  112. package/templates/runtime/react/controls-panel/actions/controls-panel-actions.ts +172 -0
  113. package/templates/runtime/react/{control-conditions.ts → controls-panel/conditions/control-conditions.ts} +26 -3
  114. package/templates/runtime/react/{control-renderers.ts → controls-panel/control-renderers.ts} +2 -2
  115. package/templates/runtime/react/controls-panel/controls-panel.tsx +250 -0
  116. package/templates/runtime/react/controls-panel/keyframes/controls-panel-keyframes.tsx +265 -0
  117. package/templates/runtime/react/controls-panel/layout/controls-panel-collapse-storage.ts +131 -0
  118. package/templates/runtime/react/controls-panel/layout/controls-panel-help.tsx +132 -0
  119. package/templates/runtime/react/controls-panel/layout/controls-panel-inline-layout.tsx +311 -0
  120. package/templates/runtime/react/controls-panel/layout/controls-panel-layout.tsx +216 -0
  121. package/templates/runtime/react/controls-panel/layout/controls-panel-section.tsx +401 -0
  122. package/templates/runtime/react/controls-panel/renderers/controls-panel-action-renderer.tsx +137 -0
  123. package/templates/runtime/react/controls-panel/renderers/controls-panel-basic-renderers.tsx +421 -0
  124. package/templates/runtime/react/controls-panel/renderers/controls-panel-collection-renderer.tsx +286 -0
  125. package/templates/runtime/react/controls-panel/renderers/controls-panel-compound-renderers.tsx +366 -0
  126. package/templates/runtime/react/controls-panel/renderers/controls-panel-media-renderer.tsx +173 -0
  127. package/templates/runtime/react/controls-panel/renderers/controls-panel-renderer-registry.test.ts +23 -0
  128. package/templates/runtime/react/controls-panel/renderers/controls-panel-renderer-registry.ts +55 -0
  129. package/templates/runtime/react/controls-panel/renderers/controls-panel-settings-transfer-renderer.tsx +45 -0
  130. package/templates/runtime/react/controls-panel/testing/controls-panel-test-utils.tsx +300 -0
  131. package/templates/runtime/react/controls-panel/values/controls-panel-aspect-ratio-values.ts +94 -0
  132. package/templates/runtime/react/controls-panel/values/controls-panel-collection-values.ts +87 -0
  133. package/templates/runtime/react/controls-panel/values/controls-panel-color-values.ts +82 -0
  134. package/templates/runtime/react/controls-panel/values/controls-panel-font-values.ts +69 -0
  135. package/templates/runtime/react/controls-panel/values/controls-panel-spatial-values.ts +64 -0
  136. package/templates/runtime/react/controls-panel/values/controls-panel-value-labels.ts +93 -0
  137. package/templates/runtime/react/controls-panel/values/controls-panel-value-primitives.ts +30 -0
  138. package/templates/runtime/react/controls-panel/values/controls-panel-values.ts +7 -0
  139. package/templates/runtime/react/index.ts +13 -13
  140. package/templates/runtime/react/{layer-tree.ts → layers/layer-tree.ts} +1 -1
  141. package/templates/runtime/react/layers/layers-panel-drag-drop.test.tsx +190 -0
  142. package/templates/runtime/react/layers/layers-panel-editing.test.tsx +41 -0
  143. package/templates/runtime/react/layers/layers-panel-insert-targets.test.ts +87 -0
  144. package/templates/runtime/react/layers/layers-panel-insert-targets.ts +254 -0
  145. package/templates/runtime/react/layers/layers-panel-model.ts +15 -0
  146. package/templates/runtime/react/layers/layers-panel-rendering.test.tsx +43 -0
  147. package/templates/runtime/react/layers/layers-panel-reorder.ts +148 -0
  148. package/templates/runtime/react/layers/layers-panel-row.tsx +475 -0
  149. package/templates/runtime/react/layers/layers-panel-test-utils.tsx +135 -0
  150. package/templates/runtime/react/layers/layers-panel-visibility.test.tsx +126 -0
  151. package/templates/runtime/react/layers/layers-panel.tsx +349 -0
  152. package/templates/runtime/react/layers/use-layers-panel-drag-controller.ts +327 -0
  153. package/templates/runtime/react/{panel-host-types.ts → panel-host/panel-host-types.ts} +2 -2
  154. package/templates/runtime/react/{panel-host.test.tsx → panel-host/panel-host.test.tsx} +3 -3
  155. package/templates/runtime/react/{panel-host.tsx → panel-host/panel-host.tsx} +1 -1
  156. package/templates/runtime/react/timeline/timeline-easing-editor.tsx +409 -0
  157. package/templates/runtime/react/timeline/timeline-easing-geometry.ts +42 -0
  158. package/templates/runtime/react/timeline/timeline-easing-icons.tsx +135 -0
  159. package/templates/runtime/react/timeline/timeline-easing-model.test.ts +87 -0
  160. package/templates/runtime/react/timeline/timeline-easing-model.ts +271 -0
  161. package/templates/runtime/react/timeline/timeline-easing-popover-content.tsx +227 -0
  162. package/templates/runtime/react/timeline/timeline-easing-popover-layout.ts +69 -0
  163. package/templates/runtime/react/timeline/timeline-easing-popover.tsx +60 -0
  164. package/templates/runtime/react/timeline/timeline-event-targets.ts +19 -0
  165. package/templates/runtime/react/timeline/timeline-expanded-content.tsx +299 -0
  166. package/templates/runtime/react/timeline/timeline-icon-button.tsx +51 -0
  167. package/templates/runtime/react/timeline/timeline-keyframe-row.tsx +360 -0
  168. package/templates/runtime/react/timeline/timeline-keyframes.ts +23 -0
  169. package/templates/runtime/react/timeline/timeline-panel-floating-layout.test.tsx +328 -0
  170. package/templates/runtime/react/timeline/timeline-panel-header.tsx +404 -0
  171. package/templates/runtime/react/timeline/timeline-panel-keyframes.test.tsx +90 -0
  172. package/templates/runtime/react/timeline/timeline-panel-layout.ts +30 -0
  173. package/templates/runtime/react/timeline/timeline-panel-responsive-layout.ts +182 -0
  174. package/templates/runtime/react/timeline/timeline-panel-test-utils.tsx +88 -0
  175. package/templates/runtime/react/timeline/timeline-panel-transport.test.tsx +202 -0
  176. package/templates/runtime/react/timeline/timeline-panel-upload.test.tsx +53 -0
  177. package/templates/runtime/react/timeline/timeline-panel.tsx +449 -0
  178. package/templates/runtime/react/timeline/timeline-playback-hooks.ts +254 -0
  179. package/templates/runtime/schema/assembly-contract.ts +271 -0
  180. package/templates/runtime/schema/control-schema-normalization.ts +55 -0
  181. package/templates/runtime/schema/controls-panel-actions.ts +141 -0
  182. package/templates/runtime/schema/controls-panel-layout-groups.ts +144 -0
  183. package/templates/runtime/schema/controls-panel-normalization.ts +19 -0
  184. package/templates/runtime/schema/controls-panel-section-layout.ts +140 -0
  185. package/templates/runtime/schema/controls-panel-section-titles.ts +161 -0
  186. package/templates/runtime/schema/define-toolcraft-test-utils.ts +18 -0
  187. package/templates/runtime/schema/define-toolcraft.actions.test.ts +182 -0
  188. package/templates/runtime/schema/define-toolcraft.assembly.test.ts +246 -0
  189. package/templates/runtime/schema/define-toolcraft.canvas.test.ts +150 -0
  190. package/templates/runtime/schema/define-toolcraft.control-layout.test.ts +345 -0
  191. package/templates/runtime/schema/define-toolcraft.control-sections.test.ts +304 -0
  192. package/templates/runtime/schema/define-toolcraft.setup-canvas.test.ts +69 -0
  193. package/templates/runtime/schema/define-toolcraft.setup-persistence.test.ts +66 -0
  194. package/templates/runtime/schema/define-toolcraft.setup-render-scale-timeline.test.ts +116 -0
  195. package/templates/runtime/schema/define-toolcraft.setup-settings-transfer.test.ts +291 -0
  196. package/templates/runtime/schema/define-toolcraft.ts +24 -1449
  197. package/templates/runtime/schema/panels-schema-normalization.ts +49 -0
  198. package/templates/runtime/schema/runtime-section-titles.ts +1 -0
  199. package/templates/runtime/schema/runtime-setup-section.ts +282 -0
  200. package/templates/runtime/schema/schema-resolvers.ts +168 -0
  201. package/templates/runtime/schema/types.ts +17 -0
  202. package/templates/runtime/state/canvas-reducer.ts +106 -0
  203. package/templates/runtime/state/canvas-state.ts +209 -0
  204. package/templates/runtime/state/controls-reducer.ts +277 -0
  205. package/templates/runtime/state/history-patches.ts +174 -0
  206. package/templates/runtime/state/layer-state.ts +12 -0
  207. package/templates/runtime/state/layers-reducer.ts +318 -0
  208. package/templates/runtime/state/media-reducer.ts +283 -0
  209. package/templates/runtime/state/media-state.ts +105 -0
  210. package/templates/runtime/state/panels-reducer.ts +58 -0
  211. package/templates/runtime/state/persistence-merge.ts +53 -0
  212. package/templates/runtime/state/persistence-reader-canvas.ts +27 -0
  213. package/templates/runtime/state/persistence-reader-layers.ts +73 -0
  214. package/templates/runtime/state/persistence-reader-media.ts +82 -0
  215. package/templates/runtime/state/persistence-reader-panels.ts +56 -0
  216. package/templates/runtime/state/persistence-reader-primitives.ts +27 -0
  217. package/templates/runtime/state/persistence-reader-timeline.ts +145 -0
  218. package/templates/runtime/state/persistence-reader-values.ts +40 -0
  219. package/templates/runtime/state/persistence-readers.ts +72 -0
  220. package/templates/runtime/state/persistence-shared.ts +23 -0
  221. package/templates/runtime/state/persistence-snapshot.ts +57 -0
  222. package/templates/runtime/state/persistence.ts +16 -581
  223. package/templates/runtime/state/reducer-canvas-panels.test.ts +324 -0
  224. package/templates/runtime/state/reducer-controls.test.ts +158 -0
  225. package/templates/runtime/state/reducer-layers.test.ts +306 -0
  226. package/templates/runtime/state/reducer-media-import-sizing.test.ts +197 -0
  227. package/templates/runtime/state/reducer-media-reorder-history.test.ts +116 -0
  228. package/templates/runtime/state/reducer-media-reset.test.ts +249 -0
  229. package/templates/runtime/state/reducer-media-test-utils.ts +40 -0
  230. package/templates/runtime/state/reducer-media-transform.test.ts +52 -0
  231. package/templates/runtime/state/reducer-test-utils.ts +30 -0
  232. package/templates/runtime/state/reducer-timeline.test.ts +242 -0
  233. package/templates/runtime/state/reducer.ts +57 -1785
  234. package/templates/runtime/state/timeline-reducer.ts +412 -0
  235. package/templates/runtime/state/timeline-values.test.ts +45 -0
  236. package/templates/runtime/state/timeline-values.ts +45 -0
  237. package/templates/runtime/testing/performance-browser-policy.test.ts +81 -0
  238. package/templates/runtime/testing/performance-browser-policy.ts +102 -0
  239. package/templates/runtime/testing/performance-budget-validation.ts +84 -0
  240. package/templates/runtime/testing/performance-control-classification.test.ts +106 -0
  241. package/templates/runtime/testing/performance-control-classification.ts +101 -0
  242. package/templates/runtime/testing/performance-coverage-context.ts +44 -0
  243. package/templates/runtime/testing/performance-coverage-renderer-policy.ts +221 -0
  244. package/templates/runtime/testing/performance-coverage-scenario-policy.ts +147 -0
  245. package/templates/runtime/testing/performance-coverage-target-policy.ts +121 -0
  246. package/templates/runtime/testing/performance-coverage-validator.ts +34 -0
  247. package/templates/runtime/testing/performance-export-coverage.test.ts +234 -0
  248. package/templates/runtime/testing/performance-fixture-load-profile.test.ts +360 -0
  249. package/templates/runtime/testing/performance-fixture-media.test.ts +80 -0
  250. package/templates/runtime/testing/performance-fixture-stress.test.ts +314 -0
  251. package/templates/runtime/testing/performance-fixture-validation.ts +255 -0
  252. package/templates/runtime/testing/performance-fixture-values.ts +275 -0
  253. package/templates/runtime/testing/performance-fixture-workload.test.ts +140 -0
  254. package/templates/runtime/testing/performance-load-profile-validation.ts +467 -0
  255. package/templates/runtime/testing/performance-renderer-coverage.test.ts +325 -0
  256. package/templates/runtime/testing/performance-renderer-pipeline-coverage.test.ts +115 -0
  257. package/templates/runtime/testing/performance-renderer-pipeline-interactions.test.ts +201 -0
  258. package/templates/runtime/testing/performance-renderer-pipeline-passes.test.ts +247 -0
  259. package/templates/runtime/testing/performance-renderer-pipeline-validation.ts +360 -0
  260. package/templates/runtime/testing/performance-renderer-technique-validation.ts +329 -0
  261. package/templates/runtime/testing/performance-renderer-technique.test.ts +275 -0
  262. package/templates/runtime/testing/performance-renderer-validation.ts +2 -0
  263. package/templates/runtime/testing/performance-scenario-coverage.test.ts +303 -0
  264. package/templates/runtime/testing/performance-scenario-validation.ts +49 -0
  265. package/templates/runtime/testing/performance-schema-derived-workloads.test.ts +231 -0
  266. package/templates/runtime/testing/performance-schema-queries.ts +181 -0
  267. package/templates/runtime/testing/performance-test-fixtures/index.ts +4 -0
  268. package/templates/runtime/testing/performance-test-fixtures/renderer-pipelines.ts +322 -0
  269. package/templates/runtime/testing/performance-test-fixtures/scenarios.ts +172 -0
  270. package/templates/runtime/testing/performance-test-fixtures/schemas.ts +151 -0
  271. package/templates/runtime/testing/performance-test-fixtures/stress-fixtures.ts +133 -0
  272. package/templates/runtime/testing/performance-test-fixtures.ts +1 -0
  273. package/templates/runtime/testing/performance-types.ts +338 -0
  274. package/templates/runtime/testing/performance.ts +15 -2485
  275. package/templates/starter/AGENTS.md +41 -26
  276. package/templates/starter/LICENSE.md +18 -95
  277. package/templates/starter/NOTICE.md +3 -3
  278. package/templates/starter/docs/toolcraft/README.md +5 -5
  279. package/templates/starter/docs/toolcraft/acceptance-testing.md +36 -8
  280. package/templates/starter/docs/toolcraft/assembly-workflow.md +12 -15
  281. package/templates/starter/docs/toolcraft/component-rules.md +6 -2
  282. package/templates/starter/docs/toolcraft/core/layout.md +1 -0
  283. package/templates/starter/docs/toolcraft/core/performance.md +7 -4
  284. package/templates/starter/docs/toolcraft/core/runtime-boundary.md +11 -4
  285. package/templates/starter/docs/toolcraft/core/timeline-animation.md +1 -0
  286. package/templates/starter/docs/toolcraft/custom-controls.md +8 -1
  287. package/templates/starter/docs/toolcraft/decision-contract.md +26 -22
  288. package/templates/starter/docs/toolcraft/performance.md +42 -16
  289. package/templates/starter/docs/toolcraft/schema-reference.md +34 -23
  290. package/templates/starter/docs/toolcraft/workflow.md +25 -17
  291. package/templates/starter/e2e/app-browser-acceptance-evidence.spec.ts +111 -0
  292. package/templates/starter/e2e/app-browser-control-coverage.spec.ts +118 -0
  293. package/templates/starter/e2e/app-browser-performance-evidence.spec.ts +217 -0
  294. package/templates/starter/e2e/app-browser-performance-probe.spec.ts +322 -0
  295. package/templates/starter/e2e/app-browser-proof-session.spec.ts +196 -0
  296. package/templates/starter/e2e/app-browser-runtime-evidence.spec.ts +9 -0
  297. package/templates/starter/e2e/app-browser-runtime-provenance.spec.ts +240 -0
  298. package/templates/starter/e2e/app-browser-runtime-reporter.spec.ts +180 -0
  299. package/templates/starter/e2e/app-browser-runtime-requirements.spec.ts +310 -0
  300. package/templates/starter/e2e/app-browser-semantic-evidence.spec.ts +432 -0
  301. package/templates/starter/e2e/app-browser-shell.spec.ts +171 -0
  302. package/templates/starter/e2e/app-browser-timeline-layers-reference.spec.ts +70 -0
  303. package/templates/starter/e2e/app-performance.spec.ts +0 -491
  304. package/templates/starter/e2e/browser-acceptance-outcome-helpers.ts +97 -0
  305. package/templates/starter/e2e/browser-acceptance-transition-helpers.ts +74 -0
  306. package/templates/starter/e2e/browser-conditional-output-evidence-helpers.ts +230 -0
  307. package/templates/starter/e2e/browser-control-target-helpers.ts +109 -0
  308. package/templates/starter/e2e/browser-layer-evidence-helpers.ts +229 -0
  309. package/templates/starter/e2e/browser-proof-session.ts +392 -0
  310. package/templates/starter/e2e/browser-runtime-evidence-reporter.ts +136 -0
  311. package/templates/starter/e2e/browser-runtime-evidence-requirements.ts +290 -0
  312. package/templates/starter/e2e/browser-runtime-evidence.ts +27 -0
  313. package/templates/starter/e2e/browser-state-evidence-helpers.ts +205 -0
  314. package/templates/starter/e2e/browser-timeline-evidence-helpers.ts +319 -0
  315. package/templates/starter/e2e/canvas-handle-helpers.ts +86 -4
  316. package/templates/starter/e2e/export-artifact-helpers.ts +132 -0
  317. package/templates/starter/e2e/performance-budget-helpers.ts +159 -0
  318. package/templates/starter/e2e/performance-canvas-helpers.ts +123 -0
  319. package/templates/starter/e2e/performance-control-helpers.ts +3 -0
  320. package/templates/starter/e2e/performance-control-layout-helpers.ts +161 -0
  321. package/templates/starter/e2e/performance-fixture-helpers.ts +217 -0
  322. package/templates/starter/e2e/performance-frame-probe.ts +247 -0
  323. package/templates/starter/e2e/performance-helpers.ts +6 -854
  324. package/templates/starter/e2e/performance-interaction-measurement.ts +251 -0
  325. package/templates/starter/e2e/performance-measurement-evidence.ts +72 -0
  326. package/templates/starter/e2e/performance-output-action-helpers.spec.ts +43 -0
  327. package/templates/starter/e2e/performance-output-action-helpers.ts +109 -0
  328. package/templates/starter/e2e/performance-probe-helpers.ts +12 -0
  329. package/templates/starter/e2e/performance-render-scale-helpers.ts +55 -0
  330. package/templates/starter/e2e/performance-slider-helpers.ts +271 -0
  331. package/templates/starter/e2e/product-observable-helpers.ts +72 -17
  332. package/templates/starter/e2e/stable-outcome-helpers.ts +208 -0
  333. package/templates/starter/package.json +10 -5
  334. package/templates/starter/playwright.config.ts +5 -2
  335. package/templates/starter/scripts/check-ai-skills.mjs +14 -8
  336. package/templates/starter/scripts/check-ai-skills.test.mjs +64 -0
  337. package/templates/starter/scripts/check-toolcraft-code-health.mjs +108 -0
  338. package/templates/starter/scripts/check-toolcraft-code-health.test.mjs +213 -0
  339. package/templates/starter/scripts/check-toolcraft-docs.mjs +47 -34
  340. package/templates/starter/scripts/check-toolcraft-integrity.mjs +141 -144
  341. package/templates/starter/scripts/run-browser-performance.mjs +118 -0
  342. package/templates/starter/scripts/run-browser-performance.test.mjs +53 -0
  343. package/templates/starter/scripts/toolcraft-code-health-core.mjs +297 -0
  344. package/templates/starter/scripts/toolcraft-contract-doc-integrity.mjs +77 -0
  345. package/templates/starter/scripts/toolcraft-contract-doc-integrity.test.mjs +81 -0
  346. package/templates/starter/scripts/toolcraft-contract-manifest.json +113 -0
  347. package/templates/starter/scripts/toolcraft-contract-manifest.mjs +128 -0
  348. package/templates/starter/scripts/toolcraft-contract-manifest.test.mjs +72 -0
  349. package/templates/starter/scripts/toolcraft-integrity-manifest.mjs +172 -0
  350. package/templates/starter/scripts/toolcraft-integrity-policy.mjs +60 -0
  351. package/templates/starter/scripts/toolcraft-product-boundary-ast-utils.mjs +23 -0
  352. package/templates/starter/scripts/toolcraft-product-boundary-ast.mjs +264 -0
  353. package/templates/starter/scripts/toolcraft-product-boundary-test-fixtures.mjs +16 -0
  354. package/templates/starter/scripts/toolcraft-product-boundary.mjs +243 -0
  355. package/templates/starter/scripts/toolcraft-product-boundary.test.mjs +289 -0
  356. package/templates/starter/scripts/toolcraft-product-dependency-graph.mjs +176 -0
  357. package/templates/starter/scripts/toolcraft-product-dependency-graph.test.mjs +196 -0
  358. package/templates/starter/scripts/toolcraft-product-dependency-resolution.mjs +279 -0
  359. package/templates/starter/scripts/toolcraft-product-evidence-boundary-ast.mjs +91 -0
  360. package/templates/starter/scripts/toolcraft-product-evidence-boundary.test.mjs +138 -0
  361. package/templates/starter/scripts/toolcraft-product-style-boundary.mjs +219 -0
  362. package/templates/starter/scripts/toolcraft-source-inventory.d.mts +46 -0
  363. package/templates/starter/scripts/toolcraft-source-inventory.mjs +187 -0
  364. package/templates/starter/scripts/toolcraft-source-inventory.test.mjs +132 -0
  365. package/templates/starter/scripts/toolcraft-source-ownership.mjs +167 -0
  366. package/templates/starter/scripts/toolcraft-source-ownership.test.mjs +113 -0
  367. package/templates/starter/scripts/toolcraft-static-string.mjs +104 -0
  368. package/templates/starter/scripts/toolcraft-verification-inventory.mjs +123 -0
  369. package/templates/starter/scripts/toolcraft-verification-receipt.d.mts +19 -0
  370. package/templates/starter/scripts/toolcraft-verification-receipt.mjs +284 -0
  371. package/templates/starter/scripts/toolcraft-verification-receipt.test.mjs +282 -0
  372. package/templates/starter/scripts/toolcraft-vitest-runtime-contract.d.mts +32 -0
  373. package/templates/starter/scripts/toolcraft-vitest-runtime-contract.mjs +88 -0
  374. package/templates/starter/scripts/toolcraft-vitest-runtime-contract.test.mjs +87 -0
  375. package/templates/starter/scripts/toolcraft-vitest-runtime-evidence-reporter.mjs +109 -0
  376. package/templates/starter/scripts/toolcraft-vitest-runtime-evidence-reporter.test.mjs +111 -0
  377. package/templates/starter/scripts/toolcraft-workflow-routes.mjs +314 -0
  378. package/templates/starter/scripts/toolcraft-workflow-routes.test.mjs +204 -0
  379. package/templates/starter/src/app/acceptance/actions.ts +30 -0
  380. package/templates/starter/src/app/acceptance/animation-intent.ts +184 -0
  381. package/templates/starter/src/app/acceptance/canvas-handle-acceptance.ts +70 -0
  382. package/templates/starter/src/app/acceptance/color-bank-labels.ts +164 -0
  383. package/templates/starter/src/app/acceptance/conditions.ts +80 -0
  384. package/templates/starter/src/app/acceptance/control-acceptance-context.ts +70 -0
  385. package/templates/starter/src/app/acceptance/control-acceptance-coverage.ts +271 -0
  386. package/templates/starter/src/app/acceptance/control-acceptance-kind-rules.ts +149 -0
  387. package/templates/starter/src/app/acceptance/control-acceptance-policy.ts +189 -0
  388. package/templates/starter/src/app/acceptance/control-acceptance.ts +70 -0
  389. package/templates/starter/src/app/acceptance/control-component-rules.ts +277 -0
  390. package/templates/starter/src/app/acceptance/control-labels.ts +223 -0
  391. package/templates/starter/src/app/acceptance/control-layout-dependency-rules.ts +107 -0
  392. package/templates/starter/src/app/acceptance/control-layout-entity-rules.ts +104 -0
  393. package/templates/starter/src/app/acceptance/control-layout-model.ts +159 -0
  394. package/templates/starter/src/app/acceptance/control-layout-section-rules.ts +164 -0
  395. package/templates/starter/src/app/acceptance/control-layout.ts +45 -0
  396. package/templates/starter/src/app/acceptance/control-order.ts +123 -0
  397. package/templates/starter/src/app/acceptance/control-parts.ts +47 -0
  398. package/templates/starter/src/app/acceptance/control-section-inventory.ts +183 -0
  399. package/templates/starter/src/app/acceptance/controls.ts +27 -0
  400. package/templates/starter/src/app/acceptance/coverage.ts +81 -0
  401. package/templates/starter/src/app/acceptance/custom-controls.ts +140 -0
  402. package/templates/starter/src/app/acceptance/inline-layout.ts +192 -0
  403. package/templates/starter/src/app/acceptance/media-upload.ts +55 -0
  404. package/templates/starter/src/app/acceptance/output-background-rules.ts +135 -0
  405. package/templates/starter/src/app/acceptance/output-export-actions.test.ts +76 -0
  406. package/templates/starter/src/app/acceptance/output-export-actions.ts +34 -0
  407. package/templates/starter/src/app/acceptance/output-export-layout-rules.ts +46 -0
  408. package/templates/starter/src/app/acceptance/output-export-model.ts +146 -0
  409. package/templates/starter/src/app/acceptance/output-export.ts +45 -0
  410. package/templates/starter/src/app/acceptance/output-image-export-rules.ts +87 -0
  411. package/templates/starter/src/app/acceptance/reference-runtime-coverage.ts +96 -0
  412. package/templates/starter/src/app/acceptance/reference-runtime-feature-inventory.ts +171 -0
  413. package/templates/starter/src/app/acceptance/reference-runtime-study.ts +73 -0
  414. package/templates/starter/src/app/acceptance/reference-runtime-timeline.ts +291 -0
  415. package/templates/starter/src/app/acceptance/reference-runtime.ts +99 -0
  416. package/templates/starter/src/app/acceptance/runtime-coverage.ts +290 -0
  417. package/templates/starter/src/app/acceptance/runtime-setup.ts +117 -0
  418. package/templates/starter/src/app/acceptance/section-title-rules.ts +8 -0
  419. package/templates/starter/src/app/acceptance/sections.ts +6 -0
  420. package/templates/starter/src/app/acceptance/semantic.ts +63 -0
  421. package/templates/starter/src/app/acceptance/timeline-loop.ts +21 -0
  422. package/templates/starter/src/app/acceptance/types.ts +363 -0
  423. package/templates/starter/src/app/acceptance/validate-coverage.ts +217 -0
  424. package/templates/starter/src/app/acceptance/validation-pipeline.test.ts +56 -0
  425. package/templates/starter/src/app/acceptance/validation-pipeline.ts +60 -0
  426. package/templates/starter/src/app/acceptance/video-reference-study.ts +217 -0
  427. package/templates/starter/src/app/starter-acceptance-data.ts +21 -0
  428. package/templates/starter/src/app/starter-acceptance.animation-intent.test.ts +383 -0
  429. package/templates/starter/src/app/starter-acceptance.background-export.test.ts +349 -0
  430. package/templates/starter/src/app/starter-acceptance.base-coverage.test.ts +47 -0
  431. package/templates/starter/src/app/starter-acceptance.canvas-handles.test.ts +71 -0
  432. package/templates/starter/src/app/starter-acceptance.canvas-sizing.test.ts +199 -0
  433. package/templates/starter/src/app/starter-acceptance.compound-part-coverage.test.ts +244 -0
  434. package/templates/starter/src/app/starter-acceptance.contract-fixtures.ts +63 -0
  435. package/templates/starter/src/app/starter-acceptance.control-label-context.test.ts +172 -0
  436. package/templates/starter/src/app/starter-acceptance.control-labels.test.ts +387 -0
  437. package/templates/starter/src/app/starter-acceptance.control-naming-rules.test.ts +215 -0
  438. package/templates/starter/src/app/starter-acceptance.control-order.test.ts +274 -0
  439. package/templates/starter/src/app/starter-acceptance.control-state.test.ts +275 -0
  440. package/templates/starter/src/app/starter-acceptance.curves-rules.test.ts +184 -0
  441. package/templates/starter/src/app/starter-acceptance.custom-control-collections.test.ts +200 -0
  442. package/templates/starter/src/app/starter-acceptance.custom-control-coverage.test.ts +111 -0
  443. package/templates/starter/src/app/starter-acceptance.custom-control-fit-check.test.ts +135 -0
  444. package/templates/starter/src/app/starter-acceptance.custom-control-valid.test.ts +74 -0
  445. package/templates/starter/src/app/starter-acceptance.export-test-utils.ts +107 -0
  446. package/templates/starter/src/app/starter-acceptance.framework-boundary.test.ts +327 -0
  447. package/templates/starter/src/app/starter-acceptance.image-video-export-settings.test.ts +328 -0
  448. package/templates/starter/src/app/starter-acceptance.keyframes.test.ts +242 -0
  449. package/templates/starter/src/app/starter-acceptance.layers.test.ts +203 -0
  450. package/templates/starter/src/app/starter-acceptance.media-upload.fixtures.ts +110 -0
  451. package/templates/starter/src/app/starter-acceptance.media-upload.test.ts +153 -0
  452. package/templates/starter/src/app/starter-acceptance.output-export-rules.test.ts +97 -0
  453. package/templates/starter/src/app/starter-acceptance.persistence-coverage.test.ts +134 -0
  454. package/templates/starter/src/app/starter-acceptance.product-output-export.test.ts +202 -0
  455. package/templates/starter/src/app/starter-acceptance.product-readiness-rules.test.ts +14 -0
  456. package/templates/starter/src/app/starter-acceptance.product-readiness-test-utils.ts +25 -0
  457. package/templates/starter/src/app/starter-acceptance.product-readiness.test.ts +50 -0
  458. package/templates/starter/src/app/starter-acceptance.product-worklog.test.ts +27 -0
  459. package/templates/starter/src/app/starter-acceptance.range-slider-rules.test.ts +147 -0
  460. package/templates/starter/src/app/starter-acceptance.reference-custom-timeline.test.ts +197 -0
  461. package/templates/starter/src/app/starter-acceptance.reference-foundation.test.ts +304 -0
  462. package/templates/starter/src/app/starter-acceptance.reference-test-utils.ts +102 -0
  463. package/templates/starter/src/app/starter-acceptance.reference-timeline.test.ts +267 -0
  464. package/templates/starter/src/app/starter-acceptance.schema-test-utils.ts +116 -0
  465. package/templates/starter/src/app/starter-acceptance.section-cohesion.test.ts +373 -0
  466. package/templates/starter/src/app/starter-acceptance.section-dependencies.test.ts +260 -0
  467. package/templates/starter/src/app/starter-acceptance.section-titles.test.ts +180 -0
  468. package/templates/starter/src/app/starter-acceptance.setup-readiness.test.ts +205 -0
  469. package/templates/starter/src/app/starter-acceptance.slider-rules.test.ts +470 -0
  470. package/templates/starter/src/app/starter-acceptance.slider-unit-rules.test.ts +61 -0
  471. package/templates/starter/src/app/starter-acceptance.source-test-utils.ts +43 -0
  472. package/templates/starter/src/app/starter-acceptance.test-utils.ts +21 -0
  473. package/templates/starter/src/app/starter-acceptance.text-control-kind.test.ts +89 -0
  474. package/templates/starter/src/app/starter-acceptance.timeline-playback.test.ts +264 -0
  475. package/templates/starter/src/app/starter-acceptance.timeline-test-utils.ts +56 -0
  476. package/templates/starter/src/app/starter-acceptance.toggle-pair-layout.test.ts +200 -0
  477. package/templates/starter/src/app/starter-acceptance.toggle-parameter-layout.test.ts +277 -0
  478. package/templates/starter/src/app/starter-acceptance.ts +151 -4576
  479. package/templates/starter/src/app/starter-acceptance.video-export-test-utils.ts +37 -0
  480. package/templates/starter/src/app/starter-acceptance.video-reference-study.test.ts +262 -0
  481. package/templates/starter/src/app/starter-acceptance.worklog-test-utils.ts +428 -0
  482. package/templates/starter/src/app/starter-acceptance.worklog.test.ts +283 -0
  483. package/templates/starter/src/app/starter-automated-runtime-evidence.test.ts +34 -0
  484. package/templates/starter/src/app/starter-composition.tsx +7 -0
  485. package/templates/starter/src/app/starter-performance-test-utils.ts +275 -0
  486. package/templates/starter/src/app/starter-performance.budgets.test.ts +374 -0
  487. package/templates/starter/src/app/starter-performance.gates.test.ts +128 -0
  488. package/templates/starter/src/app/starter-performance.renderer-source.test.ts +136 -0
  489. package/templates/starter/src/app/starter-performance.renderer-technique.test.ts +291 -0
  490. package/templates/starter/src/app/starter-performance.scenarios.test.ts +355 -0
  491. package/templates/starter/src/app/test-evidence/browser-runtime-contract.test.ts +253 -0
  492. package/templates/starter/src/app/test-evidence/browser-runtime-contract.ts +243 -0
  493. package/templates/starter/src/routes/index.tsx +11 -2
  494. package/templates/starter/vite.config.ts +8 -0
  495. package/templates/ui/components/controls/color/color-control-types.ts +38 -0
  496. package/templates/ui/components/controls/color/color-control.tsx +19 -437
  497. package/templates/ui/components/controls/color/color-footer.tsx +272 -0
  498. package/templates/ui/components/controls/color/color-model-slider.tsx +271 -0
  499. package/templates/ui/components/controls/color/color-opacity-input.tsx +94 -0
  500. package/templates/ui/components/controls/color/color-surface.tsx +194 -0
  501. package/templates/ui/components/controls/color/color-value-control.tsx +159 -0
  502. package/templates/ui/components/controls/color/color-value-utils.ts +170 -0
  503. package/templates/ui/components/controls/color/index.ts +10 -3
  504. package/templates/ui/components/controls/color/palette-control-controller.ts +407 -0
  505. package/templates/ui/components/controls/color/palette-control-layout.ts +14 -0
  506. package/templates/ui/components/controls/color/palette-control-types.ts +50 -0
  507. package/templates/ui/components/controls/color/palette-control-view.tsx +174 -0
  508. package/templates/ui/components/controls/color/palette-control.tsx +6 -544
  509. package/templates/ui/components/controls/color/style-guide-color-picker-color-utils.ts +39 -0
  510. package/templates/ui/components/controls/color/style-guide-color-picker-controller.ts +370 -0
  511. package/templates/ui/components/controls/color/style-guide-color-picker-hue-handlers.ts +66 -0
  512. package/templates/ui/components/controls/color/style-guide-color-picker-interaction-state.ts +49 -0
  513. package/templates/ui/components/controls/color/style-guide-color-picker-interactions.ts +2 -2
  514. package/templates/ui/components/controls/color/style-guide-color-picker-model.ts +125 -0
  515. package/templates/ui/components/controls/color/style-guide-color-picker-parts.tsx +10 -707
  516. package/templates/ui/components/controls/color/style-guide-color-picker-surface-drag.ts +93 -0
  517. package/templates/ui/components/controls/color/style-guide-color-picker-surface-geometry.ts +114 -0
  518. package/templates/ui/components/controls/color/style-guide-color-picker-surface-preview.ts +45 -0
  519. package/templates/ui/components/controls/color/style-guide-color-picker-types.ts +84 -0
  520. package/templates/ui/components/controls/color/style-guide-color-picker-view.tsx +69 -0
  521. package/templates/ui/components/controls/color/style-guide-color-picker.tsx +6 -495
  522. package/templates/ui/components/controls/curves/curves-control.tsx +4 -3
  523. package/templates/ui/components/controls/file-drop/file-drop-control.tsx +39 -515
  524. package/templates/ui/components/controls/file-drop/file-drop-empty-state.tsx +35 -0
  525. package/templates/ui/components/controls/file-drop/file-drop-file-list.tsx +160 -0
  526. package/templates/ui/components/controls/file-drop/file-drop-image-grid.tsx +175 -0
  527. package/templates/ui/components/controls/file-drop/file-drop-model.tsx +170 -0
  528. package/templates/ui/components/controls/file-drop/file-drop-single-preview.tsx +63 -0
  529. package/templates/ui/components/controls/file-drop/file-drop-types.ts +48 -0
  530. package/templates/ui/components/controls/file-drop/index.ts +2 -2
  531. package/templates/ui/components/controls/font-picker/font-picker-control.tsx +133 -906
  532. package/templates/ui/components/controls/font-picker/font-picker-footer.tsx +116 -0
  533. package/templates/ui/components/controls/font-picker/font-picker-list.tsx +194 -0
  534. package/templates/ui/components/controls/font-picker/font-picker-popover-content.tsx +191 -0
  535. package/templates/ui/components/controls/font-picker/font-picker-value.ts +222 -0
  536. package/templates/ui/components/controls/font-picker/index.ts +4 -1
  537. package/templates/ui/components/controls/font-picker/use-font-picker-preview-pipeline.ts +163 -0
  538. package/templates/ui/components/controls/font-picker/use-font-picker-virtual-list.ts +293 -0
  539. package/templates/ui/components/controls/gradient/gradient-control-utils.ts +2 -25
  540. package/templates/ui/components/controls/gradient/gradient-control.tsx +4 -464
  541. package/templates/ui/components/controls/gradient/gradient-stops-controller.ts +332 -0
  542. package/templates/ui/components/controls/gradient/gradient-stops-track.tsx +159 -0
  543. package/templates/ui/components/controls/vector/vector-control-types.ts +26 -0
  544. package/templates/ui/components/controls/vector/vector-control.tsx +10 -486
  545. package/templates/ui/components/controls/vector/vector-pad-field.tsx +211 -0
  546. package/templates/ui/components/controls/vector/vector-pad-geometry.ts +61 -0
  547. package/templates/ui/components/controls/vector/vector-pad-parts.tsx +72 -0
  548. package/templates/ui/components/controls/vector/vector-pad-variants.ts +20 -0
  549. package/templates/ui/components/controls/vector/vector-size-field.tsx +104 -0
  550. package/templates/ui/components/controls/vector/vector-value.ts +46 -0
  551. package/templates/ui/components/primitives/slider/slider-discrete-state.ts +181 -0
  552. package/templates/ui/components/primitives/slider/slider-marker-policy.ts +52 -0
  553. package/templates/ui/components/primitives/slider/slider-pointer-dragging.ts +87 -0
  554. package/templates/ui/components/primitives/slider/slider-runtime.ts +109 -0
  555. package/templates/ui/components/primitives/slider/slider-types.ts +21 -0
  556. package/templates/ui/components/primitives/slider/slider.tsx +2 -403
  557. package/templates/runtime/react/canvas-shell.test.tsx +0 -554
  558. package/templates/runtime/react/canvas-shell.tsx +0 -585
  559. package/templates/runtime/react/controls-panel.test.tsx +0 -5446
  560. package/templates/runtime/react/controls-panel.tsx +0 -3220
  561. package/templates/runtime/react/layers-panel.test.tsx +0 -487
  562. package/templates/runtime/react/layers-panel.tsx +0 -1348
  563. package/templates/runtime/react/timeline-panel.test.tsx +0 -751
  564. package/templates/runtime/react/timeline-panel.tsx +0 -3078
  565. package/templates/runtime/schema/define-toolcraft.test.ts +0 -1742
  566. package/templates/runtime/state/reducer.test.ts +0 -1703
  567. package/templates/runtime/testing/performance.test.ts +0 -3081
  568. package/templates/starter/e2e/app-browser-acceptance.spec.ts +0 -785
  569. package/templates/starter/src/app/starter-acceptance.test.ts +0 -10068
  570. package/templates/starter/src/app/starter-performance.test.ts +0 -1583
  571. package/templates/ui/components/controls/color/style-guide-color-picker-logic.ts +0 -490
  572. /package/templates/runtime/react/{storage-key-migration.ts → app-shell/storage-key-migration.ts} +0 -0
  573. /package/templates/runtime/react/{theme-runtime.tsx → app-shell/theme-runtime.tsx} +0 -0
  574. /package/templates/runtime/react/{curve-geometry.test.ts → controls-panel/__tests__/curve-geometry.test.ts} +0 -0
  575. /package/templates/runtime/react/{panel-host-config.ts → panel-host/panel-host-config.ts} +0 -0
  576. /package/templates/runtime/react/{panel-host-geometry.test.ts → panel-host/panel-host-geometry.test.ts} +0 -0
  577. /package/templates/runtime/react/{panel-host-geometry.ts → panel-host/panel-host-geometry.ts} +0 -0
@@ -0,0 +1,271 @@
1
+ import { expect, type Locator, type Page } from "@playwright/test";
2
+
3
+ import type { ToolcraftPerformanceConfig } from "@repo/toolcraft-runtime";
4
+
5
+ import {
6
+ expectToolcraftPerformanceBudget,
7
+ getToolcraftPerformanceStressValue,
8
+ } from "./performance-budget-helpers";
9
+ import { attachToolcraftBrowserRuntimeEvidence } from "./browser-runtime-evidence";
10
+ import { getToolcraftControlFieldByTarget } from "./browser-control-target-helpers";
11
+ import { getToolcraftFieldByLabel } from "./performance-control-layout-helpers";
12
+ import { measureToolcraftInteraction } from "./performance-interaction-measurement";
13
+ import type {
14
+ ToolcraftInteractionOptions,
15
+ ToolcraftInteractionResult,
16
+ } from "./performance-measurement-evidence";
17
+
18
+ async function dragToolcraftSliderInField(
19
+ page: Page,
20
+ field: Locator,
21
+ description: string,
22
+ targetRatio: number,
23
+ ): Promise<void> {
24
+ const slider = field.locator('[data-slot="slider"]').first();
25
+ const sliderValues = field.getByRole("slider");
26
+
27
+ await expect(slider, `Toolcraft slider "${description}" should be visible`).toBeVisible();
28
+
29
+ const box = await slider.boundingBox();
30
+ if (!box) {
31
+ throw new Error(`Could not measure slider "${description}".`);
32
+ }
33
+
34
+ const startX = box.x + box.width * 0.15;
35
+ const endX = box.x + box.width * targetRatio;
36
+ const y = box.y + box.height / 2;
37
+ const valuesBefore = await sliderValues.evaluateAll((elements) =>
38
+ elements.map((element) =>
39
+ element.getAttribute("aria-valuenow") ??
40
+ (element instanceof HTMLInputElement ? element.value : null),
41
+ ),
42
+ );
43
+
44
+ await page.mouse.move(startX, y);
45
+ await page.mouse.down();
46
+ await page.mouse.move(endX, y, { steps: 12 });
47
+ await page.mouse.up();
48
+
49
+ const valuesAfter = await sliderValues.evaluateAll((elements) =>
50
+ elements.map((element) =>
51
+ element.getAttribute("aria-valuenow") ??
52
+ (element instanceof HTMLInputElement ? element.value : null),
53
+ ),
54
+ );
55
+ expect(
56
+ valuesAfter,
57
+ `Toolcraft slider "${description}" must expose a changed value after its drag interaction.`,
58
+ ).not.toEqual(valuesBefore);
59
+ }
60
+
61
+ export async function dragToolcraftSliderByLabel(
62
+ page: Page,
63
+ label: string,
64
+ targetRatio: number,
65
+ options: { scenarioId?: string } = {},
66
+ ): Promise<void> {
67
+ if (options.scenarioId) {
68
+ throw new Error(
69
+ "Performance slider evidence must use dragToolcraftSliderByTarget(schemaTarget), not a visible label.",
70
+ );
71
+ }
72
+ const field = await getToolcraftFieldByLabel(page, label);
73
+ await dragToolcraftSliderInField(page, field, label, targetRatio);
74
+ }
75
+
76
+ export async function dragToolcraftSliderByTarget(
77
+ page: Page,
78
+ target: string,
79
+ targetRatio: number,
80
+ options: { scenarioId?: string } = {},
81
+ ): Promise<void> {
82
+ const field = await getToolcraftControlFieldByTarget(page, target);
83
+ await dragToolcraftSliderInField(page, field, target, targetRatio);
84
+ if (options.scenarioId) {
85
+ await attachToolcraftBrowserRuntimeEvidence({
86
+ evidenceType: "performance-control-drag",
87
+ requirementId: options.scenarioId,
88
+ target,
89
+ });
90
+ }
91
+ }
92
+
93
+ export async function dragToolcraftSliderToValue(
94
+ page: Page,
95
+ label: string,
96
+ value: number,
97
+ options: { scenarioId?: string } = {},
98
+ ): Promise<void> {
99
+ const field = await getToolcraftFieldByLabel(page, label);
100
+ const slider = field.getByRole("slider").first();
101
+
102
+ await expect(slider, `Toolcraft slider "${label}" should be visible`).toBeVisible();
103
+
104
+ const range = await slider.evaluate((element) => {
105
+ const htmlElement = element as HTMLElement;
106
+ const min = Number(
107
+ htmlElement.getAttribute("aria-valuemin") ??
108
+ (htmlElement as HTMLInputElement).min ??
109
+ "0",
110
+ );
111
+ const max = Number(
112
+ htmlElement.getAttribute("aria-valuemax") ??
113
+ (htmlElement as HTMLInputElement).max ??
114
+ "100",
115
+ );
116
+
117
+ return {
118
+ max: Number.isFinite(max) ? max : 100,
119
+ min: Number.isFinite(min) ? min : 0,
120
+ };
121
+ });
122
+ const denominator = range.max - range.min;
123
+ const ratio = denominator === 0 ? 0 : (value - range.min) / denominator;
124
+
125
+ await dragToolcraftSliderByLabel(
126
+ page,
127
+ label,
128
+ Math.min(1, Math.max(0, ratio)),
129
+ options,
130
+ );
131
+ }
132
+
133
+ export async function dragToolcraftSliderTargetToValue(
134
+ page: Page,
135
+ target: string,
136
+ value: number,
137
+ options: { scenarioId?: string } = {},
138
+ ): Promise<void> {
139
+ const field = await getToolcraftControlFieldByTarget(page, target);
140
+ const slider = field.getByRole("slider").first();
141
+ const range = await slider.evaluate((element) => {
142
+ const htmlElement = element as HTMLElement;
143
+ const min = Number(
144
+ htmlElement.getAttribute("aria-valuemin") ??
145
+ (htmlElement as HTMLInputElement).min ??
146
+ "0",
147
+ );
148
+ const max = Number(
149
+ htmlElement.getAttribute("aria-valuemax") ??
150
+ (htmlElement as HTMLInputElement).max ??
151
+ "100",
152
+ );
153
+ return {
154
+ max: Number.isFinite(max) ? max : 100,
155
+ min: Number.isFinite(min) ? min : 0,
156
+ };
157
+ });
158
+ const denominator = range.max - range.min;
159
+ const ratio = denominator === 0 ? 0 : (value - range.min) / denominator;
160
+ await dragToolcraftSliderByTarget(
161
+ page,
162
+ target,
163
+ Math.min(1, Math.max(0, ratio)),
164
+ options,
165
+ );
166
+ }
167
+
168
+ export async function dragToolcraftSliderToPerformanceStressValue(
169
+ page: Page,
170
+ label: string,
171
+ config: ToolcraftPerformanceConfig,
172
+ scenarioId: string,
173
+ ): Promise<void> {
174
+ const value = getToolcraftPerformanceStressValue(config, scenarioId);
175
+ const scenario = config.scenarios.find((item) => item.id === scenarioId);
176
+
177
+ if (typeof value !== "number" || !Number.isFinite(value)) {
178
+ throw new Error(
179
+ `Toolcraft performance scenario "${scenarioId}" must provide a numeric stressFixture.value for slider "${label}".`,
180
+ );
181
+ }
182
+ if (!scenario?.target) {
183
+ throw new Error(
184
+ `Toolcraft slider performance scenario "${scenarioId}" must declare its schema target.`,
185
+ );
186
+ }
187
+
188
+ await dragToolcraftSliderTargetToValue(page, scenario.target, value, { scenarioId });
189
+ const field = await getToolcraftControlFieldByTarget(page, scenario.target);
190
+ const observedValues = await field.getByRole("slider").evaluateAll((elements) =>
191
+ elements.map((element) =>
192
+ Number(
193
+ element.getAttribute("aria-valuenow") ??
194
+ (element instanceof HTMLInputElement ? element.value : Number.NaN),
195
+ ),
196
+ ),
197
+ );
198
+ expect(
199
+ observedValues.some((observedValue) => Math.abs(observedValue - value) < 0.000_001),
200
+ `Toolcraft performance scenario "${scenarioId}" must visibly apply stressFixture.value ${value} to slider "${label}".`,
201
+ ).toBe(true);
202
+ await attachToolcraftBrowserRuntimeEvidence({
203
+ evidenceType: "performance-stress-fixture",
204
+ requirementId: scenarioId,
205
+ target: scenario.target,
206
+ });
207
+ }
208
+
209
+ export async function expectToolcraftDiscreteSliderDragSmoothness(
210
+ page: Page,
211
+ label: string,
212
+ options: ToolcraftInteractionOptions & {
213
+ expectMarkers?: boolean;
214
+ maxFrameGapMs?: number;
215
+ maxInteractionMs?: number;
216
+ requirementId?: string;
217
+ target?: string;
218
+ } = {},
219
+ ): Promise<ToolcraftInteractionResult> {
220
+ const field = options.target
221
+ ? await getToolcraftControlFieldByTarget(page, options.target)
222
+ : await getToolcraftFieldByLabel(page, label);
223
+ const slider = field.locator('[data-slot="slider"][data-variant="discrete"]').first();
224
+
225
+ await expect(
226
+ slider,
227
+ `Toolcraft discrete slider "${label}" should render the discrete variant.`,
228
+ ).toBeVisible();
229
+
230
+ const markers = field.locator('[data-slot="slider-marker"]');
231
+ if (options.expectMarkers === false) {
232
+ await expect(
233
+ markers,
234
+ `Toolcraft half-width discrete slider "${label}" should hide over-budget tick markers.`,
235
+ ).toHaveCount(0);
236
+ } else {
237
+ await expect(
238
+ markers.first(),
239
+ `Toolcraft discrete slider "${label}" should render tick markers.`,
240
+ ).toBeVisible();
241
+ }
242
+
243
+ const result = await measureToolcraftInteraction(
244
+ page,
245
+ async () => {
246
+ if (options.target) {
247
+ await dragToolcraftSliderByTarget(page, options.target, 0.85);
248
+ } else {
249
+ await dragToolcraftSliderByLabel(page, label, 0.85);
250
+ }
251
+ },
252
+ options,
253
+ );
254
+
255
+ expectToolcraftPerformanceBudget(result, {
256
+ maxFrameGapMs: options.maxFrameGapMs ?? 80,
257
+ maxInteractionMs: options.maxInteractionMs ?? 500,
258
+ });
259
+ if (options.requirementId) {
260
+ if (!options.target) {
261
+ throw new Error("Discrete-slider runtime evidence requires a schema target.");
262
+ }
263
+ await attachToolcraftBrowserRuntimeEvidence({
264
+ evidenceType: "discrete-slider-layout",
265
+ requirementId: options.requirementId,
266
+ target: options.target,
267
+ });
268
+ }
269
+
270
+ return result;
271
+ }
@@ -1,5 +1,18 @@
1
1
  import { expect, type Page } from "@playwright/test";
2
2
 
3
+ import { attachToolcraftBrowserRuntimeEvidence } from "./browser-runtime-evidence";
4
+ import {
5
+ assertToolcraftBrowserActionForSession,
6
+ getToolcraftBrowserActionTarget,
7
+ getToolcraftBrowserProofPage,
8
+ isToolcraftBrowserAction,
9
+ isToolcraftBrowserProofSession,
10
+ runToolcraftBrowserAction,
11
+ type ToolcraftBrowserAction,
12
+ type ToolcraftBrowserProofSession,
13
+ } from "./browser-proof-session";
14
+ import { expectToolcraftPersistentOutcomeAfterAction } from "./stable-outcome-helpers";
15
+
3
16
  const defaultProductObservableSelector = [
4
17
  "[data-toolcraft-product-output]",
5
18
  "[data-toolcraft-product-text]",
@@ -16,7 +29,12 @@ export type ToolcraftProductObservableSnapshotOptions = {
16
29
 
17
30
  export type ToolcraftProductObservableChangeOptions =
18
31
  ToolcraftProductObservableSnapshotOptions & {
32
+ baselineStabilityIntervalMs?: number;
33
+ baselineStabilitySamples?: number;
19
34
  message?: string;
35
+ requirementId?: string;
36
+ stabilityIntervalMs?: number;
37
+ stabilitySamples?: number;
20
38
  };
21
39
 
22
40
  export async function getToolcraftProductObservableSnapshot(
@@ -148,23 +166,60 @@ export async function getToolcraftProductObservableSnapshot(
148
166
  }
149
167
 
150
168
  export async function expectToolcraftProductObservableToChange(
151
- page: Page,
152
- action: () => Promise<void>,
169
+ pageOrSession: Page | ToolcraftBrowserProofSession,
170
+ action: (() => Promise<void>) | ToolcraftBrowserAction,
153
171
  options: ToolcraftProductObservableChangeOptions = {},
154
172
  ): Promise<void> {
155
- const before = await getToolcraftProductObservableSnapshot(page, options);
156
-
157
- await action();
158
-
159
- await expect
160
- .poll(
161
- async () => getToolcraftProductObservableSnapshot(page, options),
162
- {
163
- message:
164
- options.message ??
165
- "Product output should change after the visible user interaction.",
166
- timeout: options.timeoutMs ?? 5000,
167
- },
168
- )
169
- .not.toBe(before);
173
+ if (options.requirementId !== undefined && !isToolcraftBrowserProofSession(pageOrSession)) {
174
+ throw new Error(
175
+ "Product-observable runtime evidence requires a verified Toolcraft browser proof session; a raw Page may be used only for non-evidence helper checks.",
176
+ );
177
+ }
178
+ const page = isToolcraftBrowserProofSession(pageOrSession)
179
+ ? await getToolcraftBrowserProofPage(pageOrSession)
180
+ : pageOrSession;
181
+ let target: string | undefined;
182
+ let runAction: () => Promise<void>;
183
+
184
+ if (isToolcraftBrowserAction(action)) {
185
+ if (isToolcraftBrowserProofSession(pageOrSession)) {
186
+ assertToolcraftBrowserActionForSession(pageOrSession, action);
187
+ }
188
+ target = getToolcraftBrowserActionTarget(action);
189
+ runAction = () => runToolcraftBrowserAction(action);
190
+ } else {
191
+ runAction = action;
192
+ }
193
+
194
+ if (options.requirementId !== undefined && target === undefined) {
195
+ throw new Error(
196
+ "Product-observable runtime evidence requires a target-scoped proofSession.controlAction(schemaTarget, action).",
197
+ );
198
+ }
199
+
200
+ await expectToolcraftPersistentOutcomeAfterAction(
201
+ () => getToolcraftProductObservableSnapshot(page, options),
202
+ runAction,
203
+ {
204
+ baselineStabilityIntervalMs: options.baselineStabilityIntervalMs,
205
+ baselineStabilitySamples: options.baselineStabilitySamples,
206
+ message:
207
+ options.message ??
208
+ "Product output should change after the visible user interaction.",
209
+ stabilityIntervalMs: options.stabilityIntervalMs,
210
+ stabilitySamples: options.stabilitySamples,
211
+ timeoutMs: options.timeoutMs ?? 5000,
212
+ },
213
+ );
214
+
215
+ if (options.requirementId !== undefined) {
216
+ await getToolcraftBrowserProofPage(
217
+ pageOrSession as ToolcraftBrowserProofSession,
218
+ );
219
+ await attachToolcraftBrowserRuntimeEvidence({
220
+ evidenceType: "product-observable-change",
221
+ requirementId: options.requirementId,
222
+ target,
223
+ });
224
+ }
170
225
  }
@@ -0,0 +1,208 @@
1
+ import { expect } from "@playwright/test";
2
+
3
+ export type ToolcraftStableOutcomeOptions = {
4
+ baselineStabilityIntervalMs?: number;
5
+ baselineStabilitySamples?: number;
6
+ message: string;
7
+ onFirstChange?: () => Promise<void> | void;
8
+ pollIntervalMs?: number;
9
+ stabilityIntervalMs?: number;
10
+ stabilitySamples?: number;
11
+ timeoutMs?: number;
12
+ };
13
+
14
+ type ToolcraftOutcomeChangeOptions = Pick<
15
+ ToolcraftStableOutcomeOptions,
16
+ "message" | "onFirstChange" | "pollIntervalMs" | "timeoutMs"
17
+ >;
18
+
19
+ function delay(durationMs: number): Promise<void> {
20
+ return new Promise((resolve) => setTimeout(resolve, durationMs));
21
+ }
22
+
23
+ export function snapshotToolcraftOutcome<T>(value: T, message: string): T {
24
+ try {
25
+ return structuredClone(value);
26
+ } catch {
27
+ throw new Error(
28
+ `${message} Outcome observations must be structured-cloneable snapshots.`,
29
+ );
30
+ }
31
+ }
32
+
33
+ export async function waitForToolcraftOutcomeChange<T>(
34
+ observeOutcome: () => Promise<T>,
35
+ before: T,
36
+ {
37
+ message,
38
+ onFirstChange,
39
+ pollIntervalMs,
40
+ timeoutMs = 5_000,
41
+ }: ToolcraftOutcomeChangeOptions,
42
+ ): Promise<T> {
43
+ const baseline = snapshotToolcraftOutcome(before, message);
44
+ let current = before;
45
+
46
+ await expect
47
+ .poll(
48
+ async () => {
49
+ current = await observeOutcome();
50
+ return current;
51
+ },
52
+ {
53
+ message,
54
+ ...(pollIntervalMs === undefined
55
+ ? {}
56
+ : { intervals: [Math.max(1, pollIntervalMs)] }),
57
+ timeout: timeoutMs,
58
+ },
59
+ )
60
+ .not.toEqual(baseline);
61
+
62
+ await onFirstChange?.();
63
+
64
+ return current;
65
+ }
66
+
67
+ export async function waitForToolcraftExpectedOutcome<T>(
68
+ observeOutcome: () => Promise<T>,
69
+ expected: T,
70
+ {
71
+ message,
72
+ onFirstChange,
73
+ pollIntervalMs,
74
+ timeoutMs = 5_000,
75
+ }: ToolcraftOutcomeChangeOptions,
76
+ ): Promise<T> {
77
+ const expectedSnapshot = snapshotToolcraftOutcome(expected, message);
78
+ let current = await observeOutcome();
79
+
80
+ await expect
81
+ .poll(
82
+ async () => {
83
+ current = await observeOutcome();
84
+ return current;
85
+ },
86
+ {
87
+ message,
88
+ ...(pollIntervalMs === undefined
89
+ ? {}
90
+ : { intervals: [Math.max(1, pollIntervalMs)] }),
91
+ timeout: timeoutMs,
92
+ },
93
+ )
94
+ .toEqual(expectedSnapshot);
95
+
96
+ await onFirstChange?.();
97
+ return current;
98
+ }
99
+
100
+ export async function expectToolcraftStableOutcomeBaseline<T>(
101
+ observeOutcome: () => Promise<T>,
102
+ baseline: T,
103
+ {
104
+ baselineStabilityIntervalMs,
105
+ baselineStabilitySamples,
106
+ message,
107
+ stabilityIntervalMs = 50,
108
+ stabilitySamples = 3,
109
+ }: ToolcraftStableOutcomeOptions,
110
+ ): Promise<T> {
111
+ const baselineSnapshot = snapshotToolcraftOutcome(baseline, message);
112
+ const intervalMs = Math.max(
113
+ 0,
114
+ baselineStabilityIntervalMs ?? stabilityIntervalMs,
115
+ );
116
+ const sampleCount = Math.max(
117
+ 2,
118
+ baselineStabilitySamples ?? stabilitySamples,
119
+ );
120
+ let current = baselineSnapshot;
121
+
122
+ for (let sample = 1; sample < sampleCount; sample += 1) {
123
+ await delay(intervalMs);
124
+ current = await observeOutcome();
125
+ expect(
126
+ current,
127
+ `${message} The baseline must remain stable before the action; autonomous output requires an expected semantic observation or a deterministic fixed phase.`,
128
+ ).toEqual(baselineSnapshot);
129
+ }
130
+
131
+ return current;
132
+ }
133
+
134
+ export async function expectToolcraftPersistentOutcomeChange<T>(
135
+ observeOutcome: () => Promise<T>,
136
+ before: T,
137
+ {
138
+ message,
139
+ onFirstChange,
140
+ pollIntervalMs,
141
+ stabilityIntervalMs = 50,
142
+ stabilitySamples = 3,
143
+ timeoutMs = 5_000,
144
+ }: ToolcraftStableOutcomeOptions,
145
+ ): Promise<T> {
146
+ const baseline = snapshotToolcraftOutcome(before, message);
147
+ let current = await waitForToolcraftOutcomeChange(observeOutcome, baseline, {
148
+ message,
149
+ onFirstChange,
150
+ pollIntervalMs,
151
+ timeoutMs,
152
+ });
153
+
154
+ for (let sample = 1; sample < Math.max(2, stabilitySamples); sample += 1) {
155
+ await delay(Math.max(0, stabilityIntervalMs));
156
+ current = await observeOutcome();
157
+ expect(
158
+ current,
159
+ `${message} The changed outcome must remain different from its baseline throughout the stability window.`,
160
+ ).not.toEqual(baseline);
161
+ }
162
+
163
+ return current;
164
+ }
165
+
166
+ export async function expectToolcraftPersistentExpectedOutcome<T>(
167
+ observeOutcome: () => Promise<T>,
168
+ expected: T,
169
+ {
170
+ message,
171
+ pollIntervalMs,
172
+ stabilityIntervalMs = 50,
173
+ stabilitySamples = 3,
174
+ timeoutMs = 5_000,
175
+ }: ToolcraftStableOutcomeOptions,
176
+ ): Promise<T> {
177
+ const expectedSnapshot = snapshotToolcraftOutcome(expected, message);
178
+ let current = await waitForToolcraftExpectedOutcome(
179
+ observeOutcome,
180
+ expectedSnapshot,
181
+ { message, pollIntervalMs, timeoutMs },
182
+ );
183
+
184
+ for (let sample = 1; sample < Math.max(2, stabilitySamples); sample += 1) {
185
+ await delay(Math.max(0, stabilityIntervalMs));
186
+ current = await observeOutcome();
187
+ expect(
188
+ current,
189
+ `${message} The expected outcome must remain stable throughout the verification window.`,
190
+ ).toEqual(expectedSnapshot);
191
+ }
192
+
193
+ return current;
194
+ }
195
+
196
+ export async function expectToolcraftPersistentOutcomeAfterAction<T>(
197
+ observeOutcome: () => Promise<T>,
198
+ action: () => Promise<void>,
199
+ options: ToolcraftStableOutcomeOptions,
200
+ ): Promise<T> {
201
+ const before = snapshotToolcraftOutcome(
202
+ await observeOutcome(),
203
+ options.message,
204
+ );
205
+ await expectToolcraftStableOutcomeBaseline(observeOutcome, before, options);
206
+ await action();
207
+ return expectToolcraftPersistentOutcomeChange(observeOutcome, before, options);
208
+ }
@@ -1,25 +1,28 @@
1
1
  {
2
2
  "name": "toolcraft-starter",
3
3
  "private": true,
4
- "license": "SEE LICENSE IN LICENSE.md",
4
+ "license": "MIT",
5
5
  "type": "module",
6
6
  "scripts": {
7
- "ai:check": "node scripts/check-ai-skills.mjs",
7
+ "ai:check": "node scripts/check-toolcraft-code-health.mjs && node scripts/toolcraft-product-boundary.mjs --allow-missing-compiler && node scripts/check-ai-skills.mjs",
8
8
  "dev": "node scripts/run-vite-on-free-port.mjs dev",
9
9
  "dev:restart": "node scripts/run-vite-on-free-port.mjs dev --toolcraft-restart",
10
10
  "build": "tsc -p tsconfig.json --noEmit && vite build",
11
11
  "preview": "node scripts/run-vite-on-free-port.mjs preview",
12
12
  "preview:restart": "node scripts/run-vite-on-free-port.mjs preview --toolcraft-restart",
13
13
  "docs:check": "node scripts/check-toolcraft-docs.mjs",
14
- "test": "node scripts/check-toolcraft-docs.mjs && node scripts/check-toolcraft-integrity.mjs && node --test scripts/*.test.mjs && vitest run src --passWithNoTests",
14
+ "test": "node scripts/check-toolcraft-docs.mjs && node --test scripts/*.test.mjs && vitest run src --passWithNoTests --reporter=default --reporter=./scripts/toolcraft-vitest-runtime-evidence-reporter.mjs",
15
+ "test:generated": "node scripts/check-toolcraft-docs.mjs && node scripts/check-toolcraft-integrity.mjs && node --test scripts/*.test.mjs && vitest run src --passWithNoTests --reporter=default --reporter=./scripts/toolcraft-vitest-runtime-evidence-reporter.mjs",
15
16
  "test:browser": "playwright install chromium && playwright test --grep-invert \"browser perf:\"",
16
- "test:browser:perf": "playwright install chromium && playwright test --grep \"browser perf:\" --workers=1 --pass-with-no-tests",
17
+ "test:browser:perf": "node scripts/run-browser-performance.mjs",
17
18
  "typecheck": "tsc -p tsconfig.json --noEmit",
18
19
  "verify:quick": "pnpm ai:check && pnpm test",
19
20
  "verify:ui": "pnpm test:browser",
20
21
  "verify:perf": "pnpm test:browser:perf",
21
22
  "verify:perf:playwright": "pnpm test:browser:perf",
22
- "verify:final": "pnpm ai:check && pnpm test && pnpm build && pnpm test:browser"
23
+ "verify:perf:record-exemption": "node scripts/toolcraft-verification-receipt.mjs record-exemption",
24
+ "verify:receipt": "node scripts/toolcraft-verification-receipt.mjs validate",
25
+ "verify:final": "pnpm ai:check && pnpm test && pnpm build && pnpm test:browser && pnpm verify:receipt"
23
26
  },
24
27
  "dependencies": {
25
28
  "@base-ui/react": "^1.4.1",
@@ -45,6 +48,8 @@
45
48
  },
46
49
  "devDependencies": {
47
50
  "@playwright/test": "^1.51.1",
51
+ "postcss": "^8.5.6",
52
+ "postcss-selector-parser": "^7.1.0",
48
53
  "@tailwindcss/vite": "^4.1.18",
49
54
  "@types/node": "22.19.19",
50
55
  "@types/react": "^19.2.14",
@@ -15,6 +15,8 @@ const testPort =
15
15
  ? resolvedTestPort
16
16
  : await findAvailablePort(preferredTestPort);
17
17
  const testBaseUrl = `http://localhost:${testPort}`;
18
+ const browserServerMode =
19
+ process.env.TOOLCRAFT_BROWSER_SERVER_MODE === "preview" ? "preview" : "dev";
18
20
  process.env[resolvedTestPortEnvName] = String(testPort);
19
21
 
20
22
  if (!resolvedTestPort && testPort !== preferredTestPort) {
@@ -22,20 +24,21 @@ if (!resolvedTestPort && testPort !== preferredTestPort) {
22
24
  }
23
25
 
24
26
  export default defineConfig({
27
+ forbidOnly: true,
25
28
  testDir: "./e2e",
26
29
  timeout: 30_000,
27
30
  expect: {
28
31
  timeout: 5_000,
29
32
  },
30
33
  fullyParallel: false,
31
- reporter: [["list"]],
34
+ reporter: [["list"], ["./e2e/browser-runtime-evidence-reporter.ts"]],
32
35
  use: {
33
36
  ...devices["Desktop Chrome"],
34
37
  baseURL: testBaseUrl,
35
38
  trace: "retain-on-failure",
36
39
  },
37
40
  webServer: {
38
- command: `pnpm exec vite dev --host 127.0.0.1 --port ${testPort} --strictPort`,
41
+ command: `pnpm exec vite ${browserServerMode} --host 127.0.0.1 --port ${testPort} --strictPort`,
39
42
  reuseExistingServer: false,
40
43
  timeout: 60_000,
41
44
  url: testBaseUrl,
@@ -117,14 +117,20 @@ if (missingSkills.length === 0) {
117
117
  process.exit(0);
118
118
  }
119
119
 
120
- console.error("Missing required AI workflow skills:");
120
+ console.warn("Optional AI workflow skills are not installed:");
121
121
  for (const skill of missingSkills) {
122
- console.error(`- ${skill.name}: ${skill.purpose}`);
122
+ console.warn(`- ${skill.name}: ${skill.purpose}`);
123
123
  }
124
124
 
125
- console.error("");
126
- console.error("If your AI environment supports Codex skills, install the missing skills before implementation.");
127
- console.error("If installation is not available, stop and ask the user to install them.");
128
- console.error("Checked project and global skill locations for Codex, Claude Code, Cursor, and OpenCode-compatible agents.");
129
-
130
- process.exit(1);
125
+ console.warn("");
126
+ console.warn(
127
+ "Signed local AGENTS.md and docs/toolcraft contracts remain the mandatory workflow authority.",
128
+ );
129
+ console.warn(
130
+ "Continue with the local Toolcraft workflow; install available external skills when the environment supports them.",
131
+ );
132
+ console.warn(
133
+ "Checked project and global skill locations for Codex, Claude Code, Cursor, and OpenCode-compatible agents.",
134
+ );
135
+
136
+ process.exit(0);