@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
@@ -0,0 +1,146 @@
1
+ import ts from "typescript";
2
+
3
+ import { createToolcraftUiInputBindingTracker } from "./toolcraft-product-control-bindings.mjs";
4
+
5
+ const workspacePrivateControlModulePattern =
6
+ /^@repo\/ui\/(?:src\/)?(?:components\/controls(?:\/|$)|controls\/)/u;
7
+
8
+ const forbiddenInputTypes = new Map([
9
+ ["checkbox", "checkbox or switch"],
10
+ ["color", "color or colorOpacity"],
11
+ ["file", "fileDrop"],
12
+ ["radio", "segmented or select"],
13
+ ["range", "slider or rangeSlider"],
14
+ ]);
15
+
16
+ function normalizeSpecifier(value) {
17
+ return value.replaceAll("\\", "/");
18
+ }
19
+
20
+ export function isToolcraftPrivateControlImplementationModule({
21
+ moduleSpecifier,
22
+ resolvedSpecifier,
23
+ }) {
24
+ const normalizedSpecifier = normalizeSpecifier(moduleSpecifier);
25
+ const normalizedResolvedSpecifier = resolvedSpecifier
26
+ ? normalizeSpecifier(resolvedSpecifier)
27
+ : "";
28
+
29
+ return (
30
+ workspacePrivateControlModulePattern.test(normalizedSpecifier) ||
31
+ /^[#@]\/toolcraft\/ui\/(?:components\/)?controls\//u.test(
32
+ normalizedSpecifier,
33
+ ) ||
34
+ /^[#@]\/toolcraft\/ui\/components\/controls(?:\/|$)/u.test(
35
+ normalizedSpecifier,
36
+ ) ||
37
+ /\/src\/toolcraft\/ui\/components\/controls(?:\/|$)/u.test(
38
+ normalizedResolvedSpecifier,
39
+ ) ||
40
+ /\/packages\/ui\/src\/components\/controls(?:\/|$)/u.test(
41
+ normalizedResolvedSpecifier,
42
+ )
43
+ );
44
+ }
45
+
46
+ function getJsxTagName(tagName) {
47
+ if (ts.isIdentifier(tagName)) return tagName.text;
48
+ if (ts.isPropertyAccessExpression(tagName)) return tagName.name.text;
49
+ return null;
50
+ }
51
+
52
+ export function createToolcraftProductControlInspector({
53
+ checker,
54
+ getNodeLocation,
55
+ repoPath,
56
+ resolveStaticString,
57
+ sourceFile,
58
+ }) {
59
+ const { isTrackedInputTag } = createToolcraftUiInputBindingTracker({
60
+ checker,
61
+ resolveStaticString,
62
+ });
63
+
64
+ function createViolation(node, message) {
65
+ return {
66
+ ...getNodeLocation(sourceFile, node),
67
+ kind: "native-control-recreation",
68
+ message,
69
+ repoPath,
70
+ };
71
+ }
72
+
73
+ function getInputType(attributes) {
74
+ let inputType = "text";
75
+ for (const property of attributes.properties) {
76
+ if (ts.isJsxSpreadAttribute(property)) {
77
+ inputType = null;
78
+ continue;
79
+ }
80
+ if (!ts.isIdentifier(property.name) || property.name.text !== "type") {
81
+ continue;
82
+ }
83
+ if (!property.initializer) {
84
+ inputType = null;
85
+ } else if (ts.isStringLiteral(property.initializer)) {
86
+ inputType = property.initializer.text;
87
+ } else if (
88
+ ts.isJsxExpression(property.initializer) &&
89
+ property.initializer.expression
90
+ ) {
91
+ inputType = resolveStaticString(property.initializer.expression) ?? null;
92
+ } else {
93
+ inputType = null;
94
+ }
95
+ }
96
+ return inputType?.toLowerCase() ?? null;
97
+ }
98
+
99
+ function inspectNode(node) {
100
+ if (!ts.isJsxOpeningElement(node) && !ts.isJsxSelfClosingElement(node)) {
101
+ return [];
102
+ }
103
+
104
+ const tagName = getJsxTagName(node.tagName);
105
+ if (tagName === "select") {
106
+ return [
107
+ createViolation(
108
+ node.tagName,
109
+ "Product source must not recreate the built-in Select with a native <select>. Declare a select schema control.",
110
+ ),
111
+ ];
112
+ }
113
+ if (tagName === "textarea") {
114
+ return [
115
+ createViolation(
116
+ node.tagName,
117
+ "Product source must not recreate built-in text or code controls with a native <textarea>. Declare a text or code schema control.",
118
+ ),
119
+ ];
120
+ }
121
+
122
+ if (tagName !== "input" && !isTrackedInputTag(node.tagName)) return [];
123
+
124
+ const inputType = getInputType(node.attributes);
125
+ if (inputType === null) {
126
+ return [
127
+ createViolation(
128
+ node.tagName,
129
+ "Product Input type must be statically resolvable so the Toolcraft boundary can verify that it does not recreate a built-in control.",
130
+ ),
131
+ ];
132
+ }
133
+
134
+ const builtInSchemaType = forbiddenInputTypes.get(inputType);
135
+ if (!builtInSchemaType) return [];
136
+
137
+ return [
138
+ createViolation(
139
+ node.tagName,
140
+ `Product source must not recreate a built-in control with input type "${inputType}". Declare the built-in ${builtInSchemaType} schema control.`,
141
+ ),
142
+ ];
143
+ }
144
+
145
+ return { inspectNode };
146
+ }
@@ -0,0 +1,186 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+
4
+ import { evaluateToolcraftProductBoundary } from "./toolcraft-product-boundary.mjs";
5
+ import { createToolcraftProductBoundaryFixture as createFixture } from "./toolcraft-product-boundary-test-fixtures.mjs";
6
+
7
+ const workspaceUiModule = ["@", "repo/ui"].join("");
8
+
9
+ test("finds built-in controls through every module form", async (context) => {
10
+ const rootDir = await createFixture(context, {
11
+ "src/features/control-bridge.ts": `
12
+ export { SliderControl as ProductSlider } from "@repo/ui/controls";
13
+ export { Color as ProductColor } from "@/toolcraft/ui";
14
+ `,
15
+ "src/features/dynamic.ts": `
16
+ export async function loadControls() {
17
+ return import("@/toolcraft/ui/components/controls/slider");
18
+ }
19
+ `,
20
+ "src/features/namespace.ts": `
21
+ import * as Controls from "@repo/ui";
22
+ export const Slider = Controls.Slider;
23
+ `,
24
+ });
25
+
26
+ const result = await evaluateToolcraftProductBoundary({ rootDir });
27
+
28
+ assert.deepEqual(
29
+ result.violations.map((violation) => violation.kind),
30
+ [
31
+ "built-in-control",
32
+ "built-in-control",
33
+ "built-in-control-implementation",
34
+ "built-in-control",
35
+ ],
36
+ );
37
+ });
38
+
39
+ test("rejects every deep import path into built-in control implementations", async (context) => {
40
+ const rootDir = await createFixture(context, {
41
+ "src/features/direct.tsx": `
42
+ import { ColorPickerPopover } from "@/toolcraft/ui/components/controls/color/color-picker-popover";
43
+ export const Direct = ColorPickerPopover;
44
+ `,
45
+ "src/features/directory-index.ts": `
46
+ import * as PrivateControls from "${workspaceUiModule}/components/controls";
47
+ export const DirectoryIndex = PrivateControls;
48
+ `,
49
+ "src/features/dynamic.ts": `
50
+ export const loadPrivateControl = () => import("${workspaceUiModule}/components/controls/color/color-value-utils");
51
+ `,
52
+ "src/features/namespace.ts": `
53
+ import * as PrivateColor from "@/toolcraft/ui/components/controls/color";
54
+ export const Namespace = PrivateColor;
55
+ `,
56
+ "src/features/reexport.ts": `
57
+ export { getCommittedHexColor } from "@/toolcraft/ui/components/controls/color/color-value-utils";
58
+ `,
59
+ "src/features/require.ts": `
60
+ export const privateControl = require("@/toolcraft/ui/components/controls/color/color-picker-popover");
61
+ `,
62
+ "src/features/workspace-source.ts": `
63
+ import { ColorPickerPopover } from "${workspaceUiModule}/src/components/controls/color/color-picker-popover";
64
+ export const WorkspaceSource = ColorPickerPopover;
65
+ `,
66
+ });
67
+
68
+ const result = await evaluateToolcraftProductBoundary({ rootDir });
69
+
70
+ assert.equal(result.violations.length, 7);
71
+ assert.equal(
72
+ result.violations.every(
73
+ (violation) => violation.kind === "built-in-control-implementation",
74
+ ),
75
+ true,
76
+ );
77
+ assert.equal(
78
+ result.violations.every((violation) =>
79
+ /deep control implementation|public schema control/u.test(
80
+ violation.message,
81
+ ),
82
+ ),
83
+ true,
84
+ );
85
+ });
86
+
87
+ test("rejects the badge color-control copy at both private imports", async (context) => {
88
+ const rootDir = await createFixture(context, {
89
+ "src/features/badge-color-control.tsx": `
90
+ import { ColorPickerPopover } from "@/toolcraft/ui/components/controls/color/color-picker-popover";
91
+ import { getCommittedHexColor } from "@/toolcraft/ui/components/controls/color/color-value-utils";
92
+ export const BadgeColorControl = { ColorPickerPopover, getCommittedHexColor };
93
+ `,
94
+ });
95
+
96
+ const result = await evaluateToolcraftProductBoundary({ rootDir });
97
+
98
+ assert.deepEqual(
99
+ result.violations.map(({ column, kind, line, repoPath }) => ({
100
+ column,
101
+ kind,
102
+ line,
103
+ repoPath,
104
+ })),
105
+ [
106
+ {
107
+ column: 7,
108
+ kind: "built-in-control-implementation",
109
+ line: 2,
110
+ repoPath: "src/features/badge-color-control.tsx",
111
+ },
112
+ {
113
+ column: 7,
114
+ kind: "built-in-control-implementation",
115
+ line: 3,
116
+ repoPath: "src/features/badge-color-control.tsx",
117
+ },
118
+ ],
119
+ );
120
+ });
121
+
122
+ test("rejects native and kit-primitive recreations of built-in controls", async (context) => {
123
+ const rootDir = await createFixture(context, {
124
+ "src/features/kit-inputs.tsx": `
125
+ import { Input as FieldInput } from "@/toolcraft/ui/primitives";
126
+ import * as Primitives from "@/toolcraft/ui/primitives";
127
+ const AliasedInput = FieldInput;
128
+ const { Input: RequiredInput } = require("@/toolcraft/ui/primitives");
129
+ export const Color = <FieldInput type="color" />;
130
+ export const File = <AliasedInput type={"file"} />;
131
+ export const Range = <Primitives.Input type="range" />;
132
+ export const Radio = <RequiredInput type="radio" />;
133
+ export function Dynamic({ kind }) {
134
+ return <FieldInput type={kind} />;
135
+ }
136
+ `,
137
+ "src/features/native.tsx": `
138
+ const rangeType = "range";
139
+ export const Range = <input type={rangeType} />;
140
+ export const Checkbox = <input type="checkbox" />;
141
+ export const Radio = <input type="radio" />;
142
+ export const Select = <select><option>One</option></select>;
143
+ export const Notes = <textarea />;
144
+ `,
145
+ "src/features/private-primitive.tsx": `
146
+ import PrimitiveInput from "${workspaceUiModule}/components/primitives/input";
147
+ export const PrivatePrimitiveColor = <PrimitiveInput type="color" />;
148
+ `,
149
+ });
150
+
151
+ const result = await evaluateToolcraftProductBoundary({ rootDir });
152
+
153
+ assert.equal(result.violations.length, 11);
154
+ assert.equal(
155
+ result.violations.every(
156
+ (violation) => violation.kind === "native-control-recreation",
157
+ ),
158
+ true,
159
+ );
160
+ });
161
+
162
+ test("allows generic text inputs, buttons, canvas, and product components", async (context) => {
163
+ const rootDir = await createFixture(context, {
164
+ "src/features/safe-controls.tsx": `
165
+ import { Button, Input as FieldInput } from "@/toolcraft/ui/primitives";
166
+ function ProductInput() { return <div>Product value</div>; }
167
+ function ShadowedInput(FieldInput) { return <FieldInput type="color" />; }
168
+ export const Safe = (
169
+ <>
170
+ <FieldInput type="text" />
171
+ <input type="email" />
172
+ <input type="hidden" />
173
+ <Button>Run</Button>
174
+ <button type="button">Local action</button>
175
+ <canvas />
176
+ <ProductInput />
177
+ <ShadowedInput />
178
+ </>
179
+ );
180
+ `,
181
+ });
182
+
183
+ const result = await evaluateToolcraftProductBoundary({ rootDir });
184
+
185
+ assert.deepEqual(result.violations, []);
186
+ });
@@ -1,8 +1,4 @@
1
1
  import ts from "typescript";
2
-
3
- const forbiddenRuntimeExportNames = new Set([
4
- "createToolcraftPngExportCanvas",
5
- ]);
6
2
  const forbiddenGlobalExportConstructors = new Set([
7
3
  "MediaRecorder",
8
4
  "VideoEncoder",
@@ -12,6 +8,7 @@ const forbiddenCanvasExportMethods = new Set([
12
8
  "toBlob",
13
9
  "toDataURL",
14
10
  ]);
11
+ const forbiddenGlobalExportFunctions = new Set(["showSaveFilePicker"]);
15
12
 
16
13
  export function getToolcraftProductExportModuleKind(
17
14
  normalizedSpecifier,
@@ -21,24 +18,17 @@ export function getToolcraftProductExportModuleKind(
21
18
  return "runtime-export-mechanics";
22
19
  }
23
20
  if (
24
- normalizedSpecifier === "@repo/toolcraft-runtime" ||
25
- /^[#@]\/toolcraft\/runtime\/?$/u.test(normalizedSpecifier) ||
26
- /\/src\/toolcraft\/runtime$/u.test(resolvedSpecifier ?? "")
21
+ /^@repo\/toolcraft-runtime\/export(?:\/|$)/u.test(normalizedSpecifier) ||
22
+ /^[#@]\/toolcraft\/runtime\/export(?:\/|$)/u.test(normalizedSpecifier) ||
23
+ /\/src\/toolcraft\/runtime\/export(?:\/|$)/u.test(resolvedSpecifier ?? "")
27
24
  ) {
28
- return "runtime-export-api";
25
+ return "runtime-export-mechanics";
29
26
  }
30
27
  return null;
31
28
  }
32
29
 
33
- export function isForbiddenToolcraftRuntimeExport(
34
- moduleKind,
35
- importedName,
36
- ) {
37
- return (
38
- moduleKind === "runtime-export-mechanics" ||
39
- (moduleKind === "runtime-export-api" &&
40
- forbiddenRuntimeExportNames.has(importedName))
41
- );
30
+ export function isForbiddenToolcraftRuntimeExport(moduleKind) {
31
+ return moduleKind === "runtime-export-mechanics";
42
32
  }
43
33
 
44
34
  function getDeclarationScope(node, sourceFile) {
@@ -127,12 +117,20 @@ export function createToolcraftProductExportInspector({
127
117
  return {
128
118
  ...getNodeLocation(sourceFile, node),
129
119
  kind: "runtime-export-ownership",
130
- message: `Product source must not own ${subject}. Declare exportRenderer and let runtime export actions encode and download the artifact.`,
120
+ message: `Product source must not own ${subject}. Declare exportRenderer for image/video or svgExportRenderer for SVG and let runtime export actions create and download the artifact.`,
131
121
  repoPath,
132
122
  };
133
123
  }
134
124
 
135
125
  return (node) => {
126
+ if (
127
+ ts.isCallExpression(node) &&
128
+ ts.isIdentifier(node.expression) &&
129
+ forbiddenGlobalExportFunctions.has(node.expression.text) &&
130
+ !isLexicallyDeclared(node.expression)
131
+ ) {
132
+ return [violation(node, `${node.expression.text} artifact delivery`)];
133
+ }
136
134
  if (
137
135
  ts.isNewExpression(node) &&
138
136
  ts.isIdentifier(node.expression) &&
@@ -0,0 +1,200 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+
4
+ import { evaluateToolcraftProductBoundary } from "./toolcraft-product-boundary.mjs";
5
+ import { createToolcraftProductBoundaryFixture as createFixture } from "./toolcraft-product-boundary-test-fixtures.mjs";
6
+
7
+ test("keeps artifact encoding and download mechanics runtime-owned", async (context) => {
8
+ const workspaceRuntimeExportSpecifier = [
9
+ "@repo",
10
+ "toolcraft-runtime",
11
+ "export",
12
+ "image-artifact-export",
13
+ ].join("/");
14
+ const rootDir = await createFixture(context, {
15
+ "src/features/export-mechanics.ts": `
16
+ import { createToolcraftVideoEncoderBackend as createAliasBackend } from "@/toolcraft/runtime/export/video-encoding-backend";
17
+ import { exportToolcraftImageArtifact } from "${workspaceRuntimeExportSpecifier}";
18
+ import { downloadToolcraftArtifact } from "../toolcraft/runtime/export/artifact-download";
19
+ import { Output } from "mediabunny";
20
+ export function exportArtifact(canvas: HTMLCanvasElement) {
21
+ const recorder = new MediaRecorder(canvas.captureStream());
22
+ const encoder = new VideoEncoder({ error() {}, output() {} });
23
+ canvas.toBlob(() => undefined);
24
+ canvas.toDataURL();
25
+ URL.createObjectURL(new Blob());
26
+ showSaveFilePicker();
27
+ void createAliasBackend;
28
+ void exportToolcraftImageArtifact;
29
+ void downloadToolcraftArtifact;
30
+ void Output;
31
+ void recorder;
32
+ void encoder;
33
+ }
34
+ `,
35
+ "src/features/safe-renderer.ts": `
36
+ import * as Runtime from "@/toolcraft/runtime";
37
+ import {
38
+ getToolcraftImageExportSize,
39
+ shouldIncludeToolcraftPreviewBackground,
40
+ validateToolcraftArtifactSize,
41
+ } from "@/toolcraft/runtime";
42
+ import type {
43
+ ToolcraftExportFrame,
44
+ ToolcraftProductExportRenderer,
45
+ ToolcraftProductSvgExportRenderer,
46
+ } from "@/toolcraft/runtime";
47
+ export const renderFrame = ({ context }) => context.fillRect(0, 0, 1, 1);
48
+ void Runtime;
49
+ void getToolcraftImageExportSize;
50
+ void shouldIncludeToolcraftPreviewBackground;
51
+ void validateToolcraftArtifactSize;
52
+ void (null as unknown as ToolcraftExportFrame);
53
+ void (null as unknown as ToolcraftProductExportRenderer);
54
+ void (null as unknown as ToolcraftProductSvgExportRenderer);
55
+ void new XMLSerializer();
56
+ `,
57
+ "src/features/shadowed-globals.ts": `
58
+ export function localNames(MediaRecorder, VideoEncoder, URL) {
59
+ void new MediaRecorder();
60
+ void new VideoEncoder();
61
+ URL.createObjectURL();
62
+ }
63
+ `,
64
+ });
65
+
66
+ const result = await evaluateToolcraftProductBoundary({ rootDir });
67
+
68
+ assert.equal(result.violations.length, 11);
69
+ assert.equal(
70
+ result.violations.every(
71
+ (violation) => violation.kind === "runtime-export-ownership",
72
+ ),
73
+ true,
74
+ );
75
+ assert.equal(
76
+ result.violations.some((violation) =>
77
+ violation.repoPath.endsWith("shadowed-globals.ts"),
78
+ ),
79
+ false,
80
+ );
81
+ assert.equal(
82
+ result.violations.some((violation) =>
83
+ violation.repoPath.endsWith("safe-renderer.ts"),
84
+ ),
85
+ false,
86
+ );
87
+ });
88
+
89
+ test("classifies every runtime export mechanics module reference once", async (context) => {
90
+ const workspaceRuntimeExportRoot = [
91
+ "@repo",
92
+ "toolcraft-runtime",
93
+ "export",
94
+ ].join("/");
95
+ const rootDir = await createFixture(context, {
96
+ "src/features/dynamic-import.ts": `
97
+ export async function loadMedia() {
98
+ return import("mediabunny");
99
+ }
100
+ `,
101
+ "src/features/import-equals.ts": `
102
+ import Backend = require("@/toolcraft/runtime/export/video-encoding-backend");
103
+ void Backend;
104
+ `,
105
+ "src/features/import-type.ts": `
106
+ type Backend = import("@/toolcraft/runtime/export/video-encoding-backend").ToolcraftVideoEncoderBackend;
107
+ void (null as unknown as Backend);
108
+ `,
109
+ "src/features/regular-export.ts": `
110
+ export {
111
+ createToolcraftVideoEncoderBackend as createFirstBackend,
112
+ createToolcraftVideoEncoderBackend as createSecondBackend,
113
+ } from "@/toolcraft/runtime/export/video-encoding-backend";
114
+ `,
115
+ "src/features/regular-import.ts": `
116
+ import {
117
+ createToolcraftVideoEncoderBackend as createFirstBackend,
118
+ createToolcraftVideoEncoderBackend as createSecondBackend,
119
+ } from "@/toolcraft/runtime/export/video-encoding-backend";
120
+ void createFirstBackend;
121
+ void createSecondBackend;
122
+ `,
123
+ "src/features/require.ts": `
124
+ export const backend = require("${workspaceRuntimeExportRoot}/video-encoding-backend");
125
+ `,
126
+ "src/features/safe-root-type-import.ts": `
127
+ import type { ToolcraftExportFrame } from "@/toolcraft/runtime";
128
+ void (null as unknown as ToolcraftExportFrame);
129
+ `,
130
+ "src/features/side-effect-import.ts": `import "mediabunny";`,
131
+ "src/features/type-only-export.ts": `
132
+ export type {
133
+ ToolcraftImageArtifactExportRequest,
134
+ ToolcraftImageArtifactExportResult,
135
+ } from "${workspaceRuntimeExportRoot}/image-artifact-export";
136
+ `,
137
+ "src/features/type-only-import-equals.ts": `
138
+ import type Backend = require("@/toolcraft/runtime/export/video-encoding-backend");
139
+ void (null as unknown as Backend);
140
+ `,
141
+ "src/features/type-only-import.ts": `
142
+ import type {
143
+ ToolcraftVideoArtifactExportRequest,
144
+ ToolcraftVideoArtifactExportResult,
145
+ } from "${workspaceRuntimeExportRoot}/video-artifact-export";
146
+ void (null as unknown as ToolcraftVideoArtifactExportRequest);
147
+ void (null as unknown as ToolcraftVideoArtifactExportResult);
148
+ `,
149
+ "src/features/typeof-import-type.ts": `
150
+ type MediaBunny = typeof import("mediabunny");
151
+ void (null as unknown as MediaBunny);
152
+ `,
153
+ "src/features/export-boundary.test.ts": `
154
+ import type { ToolcraftVideoEncoderBackend } from "@/toolcraft/runtime/export/video-encoding-backend";
155
+ void (null as unknown as ToolcraftVideoEncoderBackend);
156
+ `,
157
+ "e2e/test-support/export-fixture.ts": `
158
+ export type { ToolcraftVideoEncoderBackend } from "@/toolcraft/runtime/export/video-encoding-backend";
159
+ `,
160
+ });
161
+
162
+ const result = await evaluateToolcraftProductBoundary({ rootDir });
163
+
164
+ assert.deepEqual(
165
+ result.violations.map(({ repoPath }) => repoPath).sort(),
166
+ [
167
+ "src/features/dynamic-import.ts",
168
+ "src/features/import-equals.ts",
169
+ "src/features/import-type.ts",
170
+ "src/features/regular-export.ts",
171
+ "src/features/regular-import.ts",
172
+ "src/features/require.ts",
173
+ "src/features/side-effect-import.ts",
174
+ "src/features/type-only-export.ts",
175
+ "src/features/type-only-import-equals.ts",
176
+ "src/features/type-only-import.ts",
177
+ "src/features/typeof-import-type.ts",
178
+ ],
179
+ );
180
+ assert.equal(
181
+ new Set(result.violations.map(({ repoPath }) => repoPath)).size,
182
+ result.violations.length,
183
+ );
184
+ assert.equal(
185
+ result.violations.every(
186
+ (violation) => violation.kind === "runtime-export-ownership",
187
+ ),
188
+ true,
189
+ );
190
+ assert.equal(
191
+ result.violations.some(({ repoPath }) =>
192
+ [
193
+ "src/features/export-boundary.test.ts",
194
+ "src/features/safe-root-type-import.ts",
195
+ "e2e/test-support/export-fixture.ts",
196
+ ].includes(repoPath),
197
+ ),
198
+ false,
199
+ );
200
+ });
@@ -20,7 +20,11 @@ async function loadProductObservableFacade(context) {
20
20
  .replaceAll('"@playwright/test"', '"./playwright.mjs"')
21
21
  .replaceAll('"./browser-runtime-evidence"', '"./evidence.mjs"')
22
22
  .replaceAll('"./browser-proof-session"', '"./proof-session.mjs"')
23
- .replaceAll('"./stable-outcome-helpers"', '"./stable-outcome.mjs"');
23
+ .replaceAll('"./stable-outcome-helpers"', '"./stable-outcome.mjs"')
24
+ .replaceAll(
25
+ '"./browser-product-raster-snapshot"',
26
+ '"./raster-snapshot.mjs"',
27
+ );
24
28
  const { outputText } = ts.transpileModule(source, {
25
29
  compilerOptions: {
26
30
  module: ts.ModuleKind.ESNext,
@@ -91,6 +95,47 @@ async function loadProductObservableFacade(context) {
91
95
  }
92
96
  `,
93
97
  ),
98
+ fs.writeFile(
99
+ path.join(outputDir, "raster-snapshot.mjs"),
100
+ `
101
+ const warmedPages = new WeakSet();
102
+ const screenshotOptions = {
103
+ animations: "disabled",
104
+ caret: "hide",
105
+ scale: "css",
106
+ type: "png",
107
+ };
108
+
109
+ export async function resolveToolcraftProductRasterProbe(page, probe) {
110
+ const locator = page.locator(probe.selector);
111
+ const bounds = await locator.boundingBox();
112
+ if (
113
+ !bounds ||
114
+ bounds.width <= 0 ||
115
+ bounds.height <= 0 ||
116
+ bounds.width > 4096 ||
117
+ bounds.height > 4096 ||
118
+ bounds.width * bounds.height > 8_388_608
119
+ ) {
120
+ throw new Error(
121
+ 'Raster probe exceeds the bounded visual proof limit.',
122
+ );
123
+ }
124
+ return {
125
+ bounds,
126
+ locator,
127
+ async capture() {
128
+ if (!warmedPages.has(page)) {
129
+ await locator.screenshot(screenshotOptions);
130
+ warmedPages.add(page);
131
+ }
132
+ const raster = await locator.screenshot(screenshotOptions);
133
+ return JSON.stringify(await page.evaluate(() => undefined, raster));
134
+ },
135
+ };
136
+ }
137
+ `,
138
+ ),
94
139
  ]);
95
140
 
96
141
  return import(`${pathToFileURL(outputPath).href}?test=${Date.now()}`);
@@ -35,7 +35,6 @@ const expectedVerificationReceiptExports = [
35
35
  "assertToolcraftVerificationInputsUnchanged",
36
36
  "collectToolcraftVerificationInputs",
37
37
  "readToolcraftDurablePerformanceBaseline",
38
- "validateToolcraftCurrentPerformanceImpactInventory",
39
38
  "validateToolcraftPerformanceReceipt",
40
39
  "validateToolcraftVerificationReceipt",
41
40
  ];
@@ -32,6 +32,11 @@ export type ToolcraftSourceInventoryOptions = {
32
32
 
33
33
  export const toolcraftSourceExtensions: ReadonlySet<string>;
34
34
 
35
+ export function resolveToolcraftRootResourcePath(
36
+ resourcePath: string,
37
+ rootDir: string,
38
+ ): string;
39
+
35
40
  export function classifyToolcraftSourcePath(
36
41
  repoPath: string,
37
42
  options?: Omit<ToolcraftSourceInventoryOptions, "rootDir" | "sourceRoots">,