@pixel-point/toolcraft 0.0.13 → 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.
- package/README.md +13 -2
- package/package.json +1 -1
- package/scripts/prepare-pack.mjs +2 -28
- package/src/cli-io.mjs +174 -0
- package/src/cli-package-manager-flow.test.mjs +206 -0
- package/src/cli.mjs +7 -495
- package/src/cli.test.mjs +34 -177
- package/src/create-command.mjs +152 -0
- package/src/create-options.mjs +194 -0
- package/src/generate-test-assertions.mjs +27 -0
- package/src/generate-test-doc-assertions.mjs +162 -0
- package/src/generate-test-file-assertions.mjs +251 -0
- package/src/generate-test-fs-utils.mjs +59 -0
- package/src/generate-test-integrity-assertions.mjs +30 -0
- package/src/generate-test-integrity-framework-assertions.mjs +222 -0
- package/src/generate-test-integrity-manifest-assertions.mjs +150 -0
- package/src/generate-test-integrity-ownership-assertions.mjs +127 -0
- package/src/generate-test-integrity-test-utils.mjs +102 -0
- package/src/generate-test-package-assertions.mjs +75 -0
- package/src/generate-test-product-fixture.mjs +84 -0
- package/src/generate-test-product-fixture.test.mjs +73 -0
- package/src/generate-test-standalone-assertions.mjs +209 -0
- package/src/generate-transactional.test.mjs +151 -0
- package/src/generate.mjs +182 -102
- package/src/generate.test.mjs +241 -294
- package/src/generated-integrity-manifest.mjs +127 -0
- package/src/generated-integrity-manifest.test.mjs +151 -0
- package/src/generated-source-policy.mjs +22 -0
- package/src/generated-source-policy.test.mjs +35 -0
- package/src/generated-target-policy.mjs +55 -0
- package/src/generation-transaction.mjs +135 -0
- package/src/generation-transaction.test.mjs +74 -0
- package/src/package-json.mjs +18 -1
- package/src/package-json.test.mjs +38 -5
- package/src/package-manager.mjs +2 -0
- package/src/package-manager.test.mjs +5 -1
- package/src/packaged-template-fallback.test.mjs +126 -0
- package/src/prepare-pack-templates.mjs +34 -0
- package/templates/runtime/contracts/component-contract-builders.ts +95 -0
- package/templates/runtime/contracts/component-contracts.choices.test.ts +293 -0
- package/templates/runtime/contracts/component-contracts.choices.ts +322 -0
- package/templates/runtime/contracts/component-contracts.inputs.test.ts +210 -0
- package/templates/runtime/contracts/component-contracts.inputs.ts +252 -0
- package/templates/runtime/contracts/component-contracts.media-custom.test.ts +116 -0
- package/templates/runtime/contracts/component-contracts.media-custom.ts +144 -0
- package/templates/runtime/contracts/component-contracts.runtime-acceptance.test.ts +229 -0
- package/templates/runtime/contracts/component-contracts.runtime-labels.test.ts +76 -0
- package/templates/runtime/contracts/component-contracts.runtime-panels.test.ts +135 -0
- package/templates/runtime/contracts/component-contracts.runtime-shell.test.ts +148 -0
- package/templates/runtime/contracts/component-contracts.runtime.ts +361 -0
- package/templates/runtime/contracts/component-contracts.test.ts +39 -1458
- package/templates/runtime/contracts/component-contracts.ts +44 -1505
- package/templates/runtime/contracts/component-contracts.visual.test.ts +316 -0
- package/templates/runtime/contracts/component-contracts.visual.ts +385 -0
- package/templates/runtime/contracts/contract-manifest.test.ts +64 -0
- package/templates/runtime/contracts/decision-contracts.test.ts +29 -4
- package/templates/runtime/contracts/decision-contracts.ts +38 -1
- package/templates/runtime/index.ts +1 -0
- package/templates/runtime/react/{runtime-public-api.test.tsx → app-shell/runtime-public-api.test.tsx} +29 -7
- package/templates/runtime/react/{settings-transfer.test.ts → app-shell/settings-transfer.test.ts} +4 -4
- package/templates/runtime/react/{settings-transfer.ts → app-shell/settings-transfer.ts} +3 -3
- package/templates/runtime/react/{toolbar-panel.test.tsx → app-shell/toolbar-panel.test.tsx} +2 -2
- package/templates/runtime/react/{toolbar-panel.tsx → app-shell/toolbar-panel.tsx} +3 -3
- package/templates/runtime/react/{toolcraft-app.integration.test.tsx → app-shell/toolcraft-app.integration.test.tsx} +6 -6
- package/templates/runtime/react/{toolcraft-app.test.tsx → app-shell/toolcraft-app.test.tsx} +3 -3
- package/templates/runtime/react/{toolcraft-app.tsx → app-shell/toolcraft-app.tsx} +11 -8
- package/templates/runtime/react/{toolcraft-root.test.tsx → app-shell/toolcraft-root.test.tsx} +1 -1
- package/templates/runtime/react/{toolcraft-root.tsx → app-shell/toolcraft-root.tsx} +5 -5
- package/templates/runtime/react/{use-toolcraft.ts → app-shell/use-toolcraft.ts} +1 -1
- package/templates/runtime/react/canvas/canvas-default-media-layer.tsx +81 -0
- package/templates/runtime/react/canvas/canvas-media-transform.ts +33 -0
- package/templates/runtime/react/canvas/canvas-shell-interactions.test.tsx +156 -0
- package/templates/runtime/react/canvas/canvas-shell-media-rendering.test.tsx +87 -0
- package/templates/runtime/react/canvas/canvas-shell-rendering.test.tsx +102 -0
- package/templates/runtime/react/canvas/canvas-shell-test-utils.tsx +108 -0
- package/templates/runtime/react/canvas/canvas-shell-upload.test.tsx +106 -0
- package/templates/runtime/react/canvas/canvas-shell.tsx +146 -0
- package/templates/runtime/react/canvas/canvas-upload-routing.ts +84 -0
- package/templates/runtime/react/{media-file.ts → canvas/media-file.ts} +1 -1
- package/templates/runtime/react/canvas/use-canvas-drop-import.ts +145 -0
- package/templates/runtime/react/canvas/use-canvas-viewport-interactions.ts +227 -0
- package/templates/runtime/react/controls-panel/__tests__/control-conditions.test.ts +89 -0
- package/templates/runtime/react/{controls-panel-filedrop-reorder.test.tsx → controls-panel/__tests__/controls-panel-filedrop-reorder.test.tsx} +4 -4
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.actions-layout.test.tsx +91 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.collection-actions.test.tsx +213 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.color-layout.test.tsx +366 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.color-picker-models.test.tsx +169 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.compound-layout.test.tsx +160 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.control-visibility.test.tsx +352 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.curves.test.tsx +226 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.floating-shell.test.tsx +13 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.font-picker.test.tsx +302 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.footer-actions.test.tsx +401 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.gradient-control.test.tsx +139 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.help-policy.test.tsx +103 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.image-picker.test.tsx +16 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.inline-layout.test.tsx +290 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.keyframes.test.tsx +175 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.media-upload-files.test.tsx +121 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.media-upload-image.test.tsx +363 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.media-upload-multi-image.test.tsx +105 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.range-slider-editing.test.tsx +149 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.section-shell.test.tsx +138 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.select-layout.test.tsx +148 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.setup-controls.test.tsx +189 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.slider-rendering.test.tsx +317 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.state-reset.test.tsx +137 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.structure.test.tsx +66 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.text-input.test.tsx +205 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.vector-interaction.test.tsx +388 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.vector-layout.test.tsx +155 -0
- package/templates/runtime/react/controls-panel/actions/controls-panel-actions.ts +172 -0
- package/templates/runtime/react/{control-conditions.ts → controls-panel/conditions/control-conditions.ts} +26 -3
- package/templates/runtime/react/{control-renderers.ts → controls-panel/control-renderers.ts} +2 -2
- package/templates/runtime/react/controls-panel/controls-panel.tsx +250 -0
- package/templates/runtime/react/controls-panel/keyframes/controls-panel-keyframes.tsx +265 -0
- package/templates/runtime/react/controls-panel/layout/controls-panel-collapse-storage.ts +131 -0
- package/templates/runtime/react/controls-panel/layout/controls-panel-help.tsx +132 -0
- package/templates/runtime/react/controls-panel/layout/controls-panel-inline-layout.tsx +311 -0
- package/templates/runtime/react/controls-panel/layout/controls-panel-layout.tsx +216 -0
- package/templates/runtime/react/controls-panel/layout/controls-panel-section.tsx +401 -0
- package/templates/runtime/react/controls-panel/renderers/controls-panel-action-renderer.tsx +137 -0
- package/templates/runtime/react/controls-panel/renderers/controls-panel-basic-renderers.tsx +421 -0
- package/templates/runtime/react/controls-panel/renderers/controls-panel-collection-renderer.tsx +286 -0
- package/templates/runtime/react/controls-panel/renderers/controls-panel-compound-renderers.tsx +366 -0
- package/templates/runtime/react/controls-panel/renderers/controls-panel-media-renderer.tsx +173 -0
- package/templates/runtime/react/controls-panel/renderers/controls-panel-renderer-registry.test.ts +23 -0
- package/templates/runtime/react/controls-panel/renderers/controls-panel-renderer-registry.ts +55 -0
- package/templates/runtime/react/controls-panel/renderers/controls-panel-settings-transfer-renderer.tsx +45 -0
- package/templates/runtime/react/controls-panel/testing/controls-panel-test-utils.tsx +300 -0
- package/templates/runtime/react/controls-panel/values/controls-panel-aspect-ratio-values.ts +94 -0
- package/templates/runtime/react/controls-panel/values/controls-panel-collection-values.ts +87 -0
- package/templates/runtime/react/controls-panel/values/controls-panel-color-values.ts +82 -0
- package/templates/runtime/react/controls-panel/values/controls-panel-font-values.ts +69 -0
- package/templates/runtime/react/controls-panel/values/controls-panel-spatial-values.ts +64 -0
- package/templates/runtime/react/controls-panel/values/controls-panel-value-labels.ts +93 -0
- package/templates/runtime/react/controls-panel/values/controls-panel-value-primitives.ts +30 -0
- package/templates/runtime/react/controls-panel/values/controls-panel-values.ts +7 -0
- package/templates/runtime/react/index.ts +13 -13
- package/templates/runtime/react/{layer-tree.ts → layers/layer-tree.ts} +1 -1
- package/templates/runtime/react/layers/layers-panel-drag-drop.test.tsx +190 -0
- package/templates/runtime/react/layers/layers-panel-editing.test.tsx +41 -0
- package/templates/runtime/react/layers/layers-panel-insert-targets.test.ts +87 -0
- package/templates/runtime/react/layers/layers-panel-insert-targets.ts +254 -0
- package/templates/runtime/react/layers/layers-panel-model.ts +15 -0
- package/templates/runtime/react/layers/layers-panel-rendering.test.tsx +43 -0
- package/templates/runtime/react/layers/layers-panel-reorder.ts +148 -0
- package/templates/runtime/react/layers/layers-panel-row.tsx +475 -0
- package/templates/runtime/react/layers/layers-panel-test-utils.tsx +135 -0
- package/templates/runtime/react/layers/layers-panel-visibility.test.tsx +126 -0
- package/templates/runtime/react/layers/layers-panel.tsx +349 -0
- package/templates/runtime/react/layers/use-layers-panel-drag-controller.ts +327 -0
- package/templates/runtime/react/{panel-host-types.ts → panel-host/panel-host-types.ts} +2 -2
- package/templates/runtime/react/{panel-host.test.tsx → panel-host/panel-host.test.tsx} +3 -3
- package/templates/runtime/react/{panel-host.tsx → panel-host/panel-host.tsx} +1 -1
- package/templates/runtime/react/timeline/timeline-easing-editor.tsx +409 -0
- package/templates/runtime/react/timeline/timeline-easing-geometry.ts +42 -0
- package/templates/runtime/react/timeline/timeline-easing-icons.tsx +135 -0
- package/templates/runtime/react/timeline/timeline-easing-model.test.ts +87 -0
- package/templates/runtime/react/timeline/timeline-easing-model.ts +271 -0
- package/templates/runtime/react/timeline/timeline-easing-popover-content.tsx +227 -0
- package/templates/runtime/react/timeline/timeline-easing-popover-layout.ts +69 -0
- package/templates/runtime/react/timeline/timeline-easing-popover.tsx +60 -0
- package/templates/runtime/react/timeline/timeline-event-targets.ts +19 -0
- package/templates/runtime/react/timeline/timeline-expanded-content.tsx +299 -0
- package/templates/runtime/react/timeline/timeline-icon-button.tsx +51 -0
- package/templates/runtime/react/timeline/timeline-keyframe-row.tsx +360 -0
- package/templates/runtime/react/timeline/timeline-keyframes.ts +23 -0
- package/templates/runtime/react/timeline/timeline-panel-floating-layout.test.tsx +328 -0
- package/templates/runtime/react/timeline/timeline-panel-header.tsx +404 -0
- package/templates/runtime/react/timeline/timeline-panel-keyframes.test.tsx +90 -0
- package/templates/runtime/react/timeline/timeline-panel-layout.ts +30 -0
- package/templates/runtime/react/timeline/timeline-panel-responsive-layout.ts +182 -0
- package/templates/runtime/react/timeline/timeline-panel-test-utils.tsx +88 -0
- package/templates/runtime/react/timeline/timeline-panel-transport.test.tsx +202 -0
- package/templates/runtime/react/timeline/timeline-panel-upload.test.tsx +53 -0
- package/templates/runtime/react/timeline/timeline-panel.tsx +449 -0
- package/templates/runtime/react/timeline/timeline-playback-hooks.ts +254 -0
- package/templates/runtime/schema/assembly-contract.ts +271 -0
- package/templates/runtime/schema/control-schema-normalization.ts +55 -0
- package/templates/runtime/schema/controls-panel-actions.ts +141 -0
- package/templates/runtime/schema/controls-panel-layout-groups.ts +144 -0
- package/templates/runtime/schema/controls-panel-normalization.ts +19 -0
- package/templates/runtime/schema/controls-panel-section-layout.ts +140 -0
- package/templates/runtime/schema/controls-panel-section-titles.ts +161 -0
- package/templates/runtime/schema/define-toolcraft-test-utils.ts +18 -0
- package/templates/runtime/schema/define-toolcraft.actions.test.ts +182 -0
- package/templates/runtime/schema/define-toolcraft.assembly.test.ts +246 -0
- package/templates/runtime/schema/define-toolcraft.canvas.test.ts +150 -0
- package/templates/runtime/schema/define-toolcraft.control-layout.test.ts +345 -0
- package/templates/runtime/schema/define-toolcraft.control-sections.test.ts +304 -0
- package/templates/runtime/schema/define-toolcraft.setup-canvas.test.ts +69 -0
- package/templates/runtime/schema/define-toolcraft.setup-persistence.test.ts +66 -0
- package/templates/runtime/schema/define-toolcraft.setup-render-scale-timeline.test.ts +116 -0
- package/templates/runtime/schema/define-toolcraft.setup-settings-transfer.test.ts +291 -0
- package/templates/runtime/schema/define-toolcraft.ts +24 -1449
- package/templates/runtime/schema/panels-schema-normalization.ts +49 -0
- package/templates/runtime/schema/runtime-section-titles.ts +1 -0
- package/templates/runtime/schema/runtime-setup-section.ts +282 -0
- package/templates/runtime/schema/schema-resolvers.ts +168 -0
- package/templates/runtime/schema/types.ts +17 -0
- package/templates/runtime/state/canvas-reducer.ts +106 -0
- package/templates/runtime/state/canvas-state.ts +209 -0
- package/templates/runtime/state/controls-reducer.ts +277 -0
- package/templates/runtime/state/history-patches.ts +174 -0
- package/templates/runtime/state/layer-state.ts +12 -0
- package/templates/runtime/state/layers-reducer.ts +318 -0
- package/templates/runtime/state/media-reducer.ts +283 -0
- package/templates/runtime/state/media-state.ts +105 -0
- package/templates/runtime/state/panels-reducer.ts +58 -0
- package/templates/runtime/state/persistence-merge.ts +53 -0
- package/templates/runtime/state/persistence-reader-canvas.ts +27 -0
- package/templates/runtime/state/persistence-reader-layers.ts +73 -0
- package/templates/runtime/state/persistence-reader-media.ts +82 -0
- package/templates/runtime/state/persistence-reader-panels.ts +56 -0
- package/templates/runtime/state/persistence-reader-primitives.ts +27 -0
- package/templates/runtime/state/persistence-reader-timeline.ts +145 -0
- package/templates/runtime/state/persistence-reader-values.ts +40 -0
- package/templates/runtime/state/persistence-readers.ts +72 -0
- package/templates/runtime/state/persistence-shared.ts +23 -0
- package/templates/runtime/state/persistence-snapshot.ts +57 -0
- package/templates/runtime/state/persistence.ts +16 -581
- package/templates/runtime/state/reducer-canvas-panels.test.ts +324 -0
- package/templates/runtime/state/reducer-controls.test.ts +158 -0
- package/templates/runtime/state/reducer-layers.test.ts +306 -0
- package/templates/runtime/state/reducer-media-import-sizing.test.ts +197 -0
- package/templates/runtime/state/reducer-media-reorder-history.test.ts +116 -0
- package/templates/runtime/state/reducer-media-reset.test.ts +249 -0
- package/templates/runtime/state/reducer-media-test-utils.ts +40 -0
- package/templates/runtime/state/reducer-media-transform.test.ts +52 -0
- package/templates/runtime/state/reducer-test-utils.ts +30 -0
- package/templates/runtime/state/reducer-timeline.test.ts +242 -0
- package/templates/runtime/state/reducer.ts +57 -1785
- package/templates/runtime/state/timeline-reducer.ts +412 -0
- package/templates/runtime/state/timeline-values.test.ts +45 -0
- package/templates/runtime/state/timeline-values.ts +45 -0
- package/templates/runtime/testing/performance-browser-policy.test.ts +81 -0
- package/templates/runtime/testing/performance-browser-policy.ts +102 -0
- package/templates/runtime/testing/performance-budget-validation.ts +84 -0
- package/templates/runtime/testing/performance-control-classification.test.ts +106 -0
- package/templates/runtime/testing/performance-control-classification.ts +101 -0
- package/templates/runtime/testing/performance-coverage-context.ts +44 -0
- package/templates/runtime/testing/performance-coverage-renderer-policy.ts +221 -0
- package/templates/runtime/testing/performance-coverage-scenario-policy.ts +147 -0
- package/templates/runtime/testing/performance-coverage-target-policy.ts +121 -0
- package/templates/runtime/testing/performance-coverage-validator.ts +34 -0
- package/templates/runtime/testing/performance-export-coverage.test.ts +234 -0
- package/templates/runtime/testing/performance-fixture-load-profile.test.ts +360 -0
- package/templates/runtime/testing/performance-fixture-media.test.ts +80 -0
- package/templates/runtime/testing/performance-fixture-stress.test.ts +314 -0
- package/templates/runtime/testing/performance-fixture-validation.ts +255 -0
- package/templates/runtime/testing/performance-fixture-values.ts +275 -0
- package/templates/runtime/testing/performance-fixture-workload.test.ts +140 -0
- package/templates/runtime/testing/performance-load-profile-validation.ts +467 -0
- package/templates/runtime/testing/performance-renderer-coverage.test.ts +325 -0
- package/templates/runtime/testing/performance-renderer-pipeline-coverage.test.ts +115 -0
- package/templates/runtime/testing/performance-renderer-pipeline-interactions.test.ts +201 -0
- package/templates/runtime/testing/performance-renderer-pipeline-passes.test.ts +247 -0
- package/templates/runtime/testing/performance-renderer-pipeline-validation.ts +360 -0
- package/templates/runtime/testing/performance-renderer-technique-validation.ts +329 -0
- package/templates/runtime/testing/performance-renderer-technique.test.ts +275 -0
- package/templates/runtime/testing/performance-renderer-validation.ts +2 -0
- package/templates/runtime/testing/performance-scenario-coverage.test.ts +303 -0
- package/templates/runtime/testing/performance-scenario-validation.ts +49 -0
- package/templates/runtime/testing/performance-schema-derived-workloads.test.ts +231 -0
- package/templates/runtime/testing/performance-schema-queries.ts +181 -0
- package/templates/runtime/testing/performance-test-fixtures/index.ts +4 -0
- package/templates/runtime/testing/performance-test-fixtures/renderer-pipelines.ts +322 -0
- package/templates/runtime/testing/performance-test-fixtures/scenarios.ts +172 -0
- package/templates/runtime/testing/performance-test-fixtures/schemas.ts +151 -0
- package/templates/runtime/testing/performance-test-fixtures/stress-fixtures.ts +133 -0
- package/templates/runtime/testing/performance-test-fixtures.ts +1 -0
- package/templates/runtime/testing/performance-types.ts +338 -0
- package/templates/runtime/testing/performance.ts +15 -2485
- package/templates/starter/AGENTS.md +45 -29
- package/templates/starter/LICENSE.md +18 -95
- package/templates/starter/NOTICE.md +3 -3
- package/templates/starter/docs/toolcraft/README.md +19 -4
- package/templates/starter/docs/toolcraft/acceptance-testing.md +38 -8
- package/templates/starter/docs/toolcraft/assembly-workflow.md +46 -185
- package/templates/starter/docs/toolcraft/component-rules.md +18 -190
- package/templates/starter/docs/toolcraft/core/control-selection.md +93 -0
- package/templates/starter/docs/toolcraft/core/layout.md +105 -0
- package/templates/starter/docs/toolcraft/core/media-upload.md +85 -0
- package/templates/starter/docs/toolcraft/core/performance.md +86 -0
- package/templates/starter/docs/toolcraft/core/reference-study.md +115 -0
- package/templates/starter/docs/toolcraft/core/runtime-boundary.md +60 -0
- package/templates/starter/docs/toolcraft/core/setup-export.md +86 -0
- package/templates/starter/docs/toolcraft/core/timeline-animation.md +68 -0
- package/templates/starter/docs/toolcraft/custom-controls.md +10 -1
- package/templates/starter/docs/toolcraft/decision-contract.md +26 -22
- package/templates/starter/docs/toolcraft/performance.md +44 -16
- package/templates/starter/docs/toolcraft/renderer-technique.md +2 -0
- package/templates/starter/docs/toolcraft/schema-reference.md +127 -366
- package/templates/starter/docs/toolcraft/workflow.md +26 -16
- package/templates/starter/e2e/app-browser-acceptance-evidence.spec.ts +111 -0
- package/templates/starter/e2e/app-browser-control-coverage.spec.ts +118 -0
- package/templates/starter/e2e/app-browser-performance-evidence.spec.ts +217 -0
- package/templates/starter/e2e/app-browser-performance-probe.spec.ts +322 -0
- package/templates/starter/e2e/app-browser-proof-session.spec.ts +196 -0
- package/templates/starter/e2e/app-browser-runtime-evidence.spec.ts +9 -0
- package/templates/starter/e2e/app-browser-runtime-provenance.spec.ts +240 -0
- package/templates/starter/e2e/app-browser-runtime-reporter.spec.ts +180 -0
- package/templates/starter/e2e/app-browser-runtime-requirements.spec.ts +310 -0
- package/templates/starter/e2e/app-browser-semantic-evidence.spec.ts +432 -0
- package/templates/starter/e2e/app-browser-shell.spec.ts +171 -0
- package/templates/starter/e2e/app-browser-timeline-layers-reference.spec.ts +70 -0
- package/templates/starter/e2e/app-performance.spec.ts +0 -491
- package/templates/starter/e2e/browser-acceptance-outcome-helpers.ts +97 -0
- package/templates/starter/e2e/browser-acceptance-transition-helpers.ts +74 -0
- package/templates/starter/e2e/browser-conditional-output-evidence-helpers.ts +230 -0
- package/templates/starter/e2e/browser-control-target-helpers.ts +109 -0
- package/templates/starter/e2e/browser-layer-evidence-helpers.ts +229 -0
- package/templates/starter/e2e/browser-proof-session.ts +392 -0
- package/templates/starter/e2e/browser-runtime-evidence-reporter.ts +136 -0
- package/templates/starter/e2e/browser-runtime-evidence-requirements.ts +290 -0
- package/templates/starter/e2e/browser-runtime-evidence.ts +27 -0
- package/templates/starter/e2e/browser-state-evidence-helpers.ts +205 -0
- package/templates/starter/e2e/browser-timeline-evidence-helpers.ts +319 -0
- package/templates/starter/e2e/canvas-handle-helpers.ts +86 -4
- package/templates/starter/e2e/export-artifact-helpers.ts +132 -0
- package/templates/starter/e2e/performance-budget-helpers.ts +159 -0
- package/templates/starter/e2e/performance-canvas-helpers.ts +123 -0
- package/templates/starter/e2e/performance-control-helpers.ts +3 -0
- package/templates/starter/e2e/performance-control-layout-helpers.ts +161 -0
- package/templates/starter/e2e/performance-fixture-helpers.ts +217 -0
- package/templates/starter/e2e/performance-frame-probe.ts +247 -0
- package/templates/starter/e2e/performance-helpers.ts +6 -854
- package/templates/starter/e2e/performance-interaction-measurement.ts +251 -0
- package/templates/starter/e2e/performance-measurement-evidence.ts +72 -0
- package/templates/starter/e2e/performance-output-action-helpers.spec.ts +43 -0
- package/templates/starter/e2e/performance-output-action-helpers.ts +109 -0
- package/templates/starter/e2e/performance-probe-helpers.ts +12 -0
- package/templates/starter/e2e/performance-render-scale-helpers.ts +55 -0
- package/templates/starter/e2e/performance-slider-helpers.ts +271 -0
- package/templates/starter/e2e/product-observable-helpers.ts +72 -17
- package/templates/starter/e2e/stable-outcome-helpers.ts +208 -0
- package/templates/starter/package.json +10 -5
- package/templates/starter/playwright.config.ts +5 -2
- package/templates/starter/scripts/check-ai-skills.mjs +14 -8
- package/templates/starter/scripts/check-ai-skills.test.mjs +64 -0
- package/templates/starter/scripts/check-toolcraft-code-health.mjs +108 -0
- package/templates/starter/scripts/check-toolcraft-code-health.test.mjs +213 -0
- package/templates/starter/scripts/check-toolcraft-docs.mjs +70 -35
- package/templates/starter/scripts/check-toolcraft-integrity.mjs +141 -144
- package/templates/starter/scripts/run-browser-performance.mjs +118 -0
- package/templates/starter/scripts/run-browser-performance.test.mjs +53 -0
- package/templates/starter/scripts/toolcraft-code-health-core.mjs +297 -0
- package/templates/starter/scripts/toolcraft-contract-doc-integrity.mjs +77 -0
- package/templates/starter/scripts/toolcraft-contract-doc-integrity.test.mjs +81 -0
- package/templates/starter/scripts/toolcraft-contract-manifest.json +113 -0
- package/templates/starter/scripts/toolcraft-contract-manifest.mjs +128 -0
- package/templates/starter/scripts/toolcraft-contract-manifest.test.mjs +72 -0
- package/templates/starter/scripts/toolcraft-integrity-manifest.mjs +172 -0
- package/templates/starter/scripts/toolcraft-integrity-policy.mjs +60 -0
- package/templates/starter/scripts/toolcraft-product-boundary-ast-utils.mjs +23 -0
- package/templates/starter/scripts/toolcraft-product-boundary-ast.mjs +264 -0
- package/templates/starter/scripts/toolcraft-product-boundary-test-fixtures.mjs +16 -0
- package/templates/starter/scripts/toolcraft-product-boundary.mjs +243 -0
- package/templates/starter/scripts/toolcraft-product-boundary.test.mjs +289 -0
- package/templates/starter/scripts/toolcraft-product-dependency-graph.mjs +176 -0
- package/templates/starter/scripts/toolcraft-product-dependency-graph.test.mjs +196 -0
- package/templates/starter/scripts/toolcraft-product-dependency-resolution.mjs +279 -0
- package/templates/starter/scripts/toolcraft-product-evidence-boundary-ast.mjs +91 -0
- package/templates/starter/scripts/toolcraft-product-evidence-boundary.test.mjs +138 -0
- package/templates/starter/scripts/toolcraft-product-style-boundary.mjs +219 -0
- package/templates/starter/scripts/toolcraft-source-inventory.d.mts +46 -0
- package/templates/starter/scripts/toolcraft-source-inventory.mjs +187 -0
- package/templates/starter/scripts/toolcraft-source-inventory.test.mjs +132 -0
- package/templates/starter/scripts/toolcraft-source-ownership.mjs +167 -0
- package/templates/starter/scripts/toolcraft-source-ownership.test.mjs +113 -0
- package/templates/starter/scripts/toolcraft-static-string.mjs +104 -0
- package/templates/starter/scripts/toolcraft-verification-inventory.mjs +123 -0
- package/templates/starter/scripts/toolcraft-verification-receipt.d.mts +19 -0
- package/templates/starter/scripts/toolcraft-verification-receipt.mjs +284 -0
- package/templates/starter/scripts/toolcraft-verification-receipt.test.mjs +282 -0
- package/templates/starter/scripts/toolcraft-vitest-runtime-contract.d.mts +32 -0
- package/templates/starter/scripts/toolcraft-vitest-runtime-contract.mjs +88 -0
- package/templates/starter/scripts/toolcraft-vitest-runtime-contract.test.mjs +87 -0
- package/templates/starter/scripts/toolcraft-vitest-runtime-evidence-reporter.mjs +109 -0
- package/templates/starter/scripts/toolcraft-vitest-runtime-evidence-reporter.test.mjs +111 -0
- package/templates/starter/scripts/toolcraft-workflow-routes.mjs +314 -0
- package/templates/starter/scripts/toolcraft-workflow-routes.test.mjs +204 -0
- package/templates/starter/src/app/acceptance/actions.ts +30 -0
- package/templates/starter/src/app/acceptance/animation-intent.ts +184 -0
- package/templates/starter/src/app/acceptance/canvas-handle-acceptance.ts +70 -0
- package/templates/starter/src/app/acceptance/color-bank-labels.ts +164 -0
- package/templates/starter/src/app/acceptance/conditions.ts +80 -0
- package/templates/starter/src/app/acceptance/control-acceptance-context.ts +70 -0
- package/templates/starter/src/app/acceptance/control-acceptance-coverage.ts +271 -0
- package/templates/starter/src/app/acceptance/control-acceptance-kind-rules.ts +149 -0
- package/templates/starter/src/app/acceptance/control-acceptance-policy.ts +189 -0
- package/templates/starter/src/app/acceptance/control-acceptance.ts +70 -0
- package/templates/starter/src/app/acceptance/control-component-rules.ts +277 -0
- package/templates/starter/src/app/acceptance/control-labels.ts +223 -0
- package/templates/starter/src/app/acceptance/control-layout-dependency-rules.ts +107 -0
- package/templates/starter/src/app/acceptance/control-layout-entity-rules.ts +104 -0
- package/templates/starter/src/app/acceptance/control-layout-model.ts +159 -0
- package/templates/starter/src/app/acceptance/control-layout-section-rules.ts +164 -0
- package/templates/starter/src/app/acceptance/control-layout.ts +45 -0
- package/templates/starter/src/app/acceptance/control-order.ts +123 -0
- package/templates/starter/src/app/acceptance/control-parts.ts +47 -0
- package/templates/starter/src/app/acceptance/control-section-inventory.ts +183 -0
- package/templates/starter/src/app/acceptance/controls.ts +27 -0
- package/templates/starter/src/app/acceptance/coverage.ts +81 -0
- package/templates/starter/src/app/acceptance/custom-controls.ts +140 -0
- package/templates/starter/src/app/acceptance/inline-layout.ts +192 -0
- package/templates/starter/src/app/acceptance/media-upload.ts +55 -0
- package/templates/starter/src/app/acceptance/output-background-rules.ts +135 -0
- package/templates/starter/src/app/acceptance/output-export-actions.test.ts +76 -0
- package/templates/starter/src/app/acceptance/output-export-actions.ts +34 -0
- package/templates/starter/src/app/acceptance/output-export-layout-rules.ts +46 -0
- package/templates/starter/src/app/acceptance/output-export-model.ts +146 -0
- package/templates/starter/src/app/acceptance/output-export.ts +45 -0
- package/templates/starter/src/app/acceptance/output-image-export-rules.ts +87 -0
- package/templates/starter/src/app/acceptance/reference-runtime-coverage.ts +96 -0
- package/templates/starter/src/app/acceptance/reference-runtime-feature-inventory.ts +171 -0
- package/templates/starter/src/app/acceptance/reference-runtime-study.ts +73 -0
- package/templates/starter/src/app/acceptance/reference-runtime-timeline.ts +291 -0
- package/templates/starter/src/app/acceptance/reference-runtime.ts +99 -0
- package/templates/starter/src/app/acceptance/runtime-coverage.ts +290 -0
- package/templates/starter/src/app/acceptance/runtime-setup.ts +117 -0
- package/templates/starter/src/app/acceptance/section-title-rules.ts +8 -0
- package/templates/starter/src/app/acceptance/sections.ts +6 -0
- package/templates/starter/src/app/acceptance/semantic.ts +63 -0
- package/templates/starter/src/app/acceptance/timeline-loop.ts +21 -0
- package/templates/starter/src/app/acceptance/types.ts +363 -0
- package/templates/starter/src/app/acceptance/validate-coverage.ts +217 -0
- package/templates/starter/src/app/acceptance/validation-pipeline.test.ts +56 -0
- package/templates/starter/src/app/acceptance/validation-pipeline.ts +60 -0
- package/templates/starter/src/app/acceptance/video-reference-study.ts +217 -0
- package/templates/starter/src/app/starter-acceptance-data.ts +21 -0
- package/templates/starter/src/app/starter-acceptance.animation-intent.test.ts +383 -0
- package/templates/starter/src/app/starter-acceptance.background-export.test.ts +349 -0
- package/templates/starter/src/app/starter-acceptance.base-coverage.test.ts +47 -0
- package/templates/starter/src/app/starter-acceptance.canvas-handles.test.ts +71 -0
- package/templates/starter/src/app/starter-acceptance.canvas-sizing.test.ts +199 -0
- package/templates/starter/src/app/starter-acceptance.compound-part-coverage.test.ts +244 -0
- package/templates/starter/src/app/starter-acceptance.contract-fixtures.ts +63 -0
- package/templates/starter/src/app/starter-acceptance.control-label-context.test.ts +172 -0
- package/templates/starter/src/app/starter-acceptance.control-labels.test.ts +387 -0
- package/templates/starter/src/app/starter-acceptance.control-naming-rules.test.ts +215 -0
- package/templates/starter/src/app/starter-acceptance.control-order.test.ts +274 -0
- package/templates/starter/src/app/starter-acceptance.control-state.test.ts +275 -0
- package/templates/starter/src/app/starter-acceptance.curves-rules.test.ts +184 -0
- package/templates/starter/src/app/starter-acceptance.custom-control-collections.test.ts +200 -0
- package/templates/starter/src/app/starter-acceptance.custom-control-coverage.test.ts +111 -0
- package/templates/starter/src/app/starter-acceptance.custom-control-fit-check.test.ts +135 -0
- package/templates/starter/src/app/starter-acceptance.custom-control-valid.test.ts +74 -0
- package/templates/starter/src/app/starter-acceptance.export-test-utils.ts +107 -0
- package/templates/starter/src/app/starter-acceptance.framework-boundary.test.ts +327 -0
- package/templates/starter/src/app/starter-acceptance.image-video-export-settings.test.ts +328 -0
- package/templates/starter/src/app/starter-acceptance.keyframes.test.ts +242 -0
- package/templates/starter/src/app/starter-acceptance.layers.test.ts +203 -0
- package/templates/starter/src/app/starter-acceptance.media-upload.fixtures.ts +110 -0
- package/templates/starter/src/app/starter-acceptance.media-upload.test.ts +153 -0
- package/templates/starter/src/app/starter-acceptance.output-export-rules.test.ts +97 -0
- package/templates/starter/src/app/starter-acceptance.persistence-coverage.test.ts +134 -0
- package/templates/starter/src/app/starter-acceptance.product-output-export.test.ts +202 -0
- package/templates/starter/src/app/starter-acceptance.product-readiness-rules.test.ts +14 -0
- package/templates/starter/src/app/starter-acceptance.product-readiness-test-utils.ts +25 -0
- package/templates/starter/src/app/starter-acceptance.product-readiness.test.ts +50 -0
- package/templates/starter/src/app/starter-acceptance.product-worklog.test.ts +27 -0
- package/templates/starter/src/app/starter-acceptance.range-slider-rules.test.ts +147 -0
- package/templates/starter/src/app/starter-acceptance.reference-custom-timeline.test.ts +197 -0
- package/templates/starter/src/app/starter-acceptance.reference-foundation.test.ts +304 -0
- package/templates/starter/src/app/starter-acceptance.reference-test-utils.ts +102 -0
- package/templates/starter/src/app/starter-acceptance.reference-timeline.test.ts +267 -0
- package/templates/starter/src/app/starter-acceptance.schema-test-utils.ts +116 -0
- package/templates/starter/src/app/starter-acceptance.section-cohesion.test.ts +373 -0
- package/templates/starter/src/app/starter-acceptance.section-dependencies.test.ts +260 -0
- package/templates/starter/src/app/starter-acceptance.section-titles.test.ts +180 -0
- package/templates/starter/src/app/starter-acceptance.setup-readiness.test.ts +205 -0
- package/templates/starter/src/app/starter-acceptance.slider-rules.test.ts +470 -0
- package/templates/starter/src/app/starter-acceptance.slider-unit-rules.test.ts +61 -0
- package/templates/starter/src/app/starter-acceptance.source-test-utils.ts +43 -0
- package/templates/starter/src/app/starter-acceptance.test-utils.ts +21 -0
- package/templates/starter/src/app/starter-acceptance.text-control-kind.test.ts +89 -0
- package/templates/starter/src/app/starter-acceptance.timeline-playback.test.ts +264 -0
- package/templates/starter/src/app/starter-acceptance.timeline-test-utils.ts +56 -0
- package/templates/starter/src/app/starter-acceptance.toggle-pair-layout.test.ts +200 -0
- package/templates/starter/src/app/starter-acceptance.toggle-parameter-layout.test.ts +277 -0
- package/templates/starter/src/app/starter-acceptance.ts +151 -4576
- package/templates/starter/src/app/starter-acceptance.video-export-test-utils.ts +37 -0
- package/templates/starter/src/app/starter-acceptance.video-reference-study.test.ts +262 -0
- package/templates/starter/src/app/starter-acceptance.worklog-test-utils.ts +428 -0
- package/templates/starter/src/app/starter-acceptance.worklog.test.ts +283 -0
- package/templates/starter/src/app/starter-automated-runtime-evidence.test.ts +34 -0
- package/templates/starter/src/app/starter-composition.tsx +7 -0
- package/templates/starter/src/app/starter-performance-test-utils.ts +275 -0
- package/templates/starter/src/app/starter-performance.budgets.test.ts +374 -0
- package/templates/starter/src/app/starter-performance.gates.test.ts +128 -0
- package/templates/starter/src/app/starter-performance.renderer-source.test.ts +136 -0
- package/templates/starter/src/app/starter-performance.renderer-technique.test.ts +291 -0
- package/templates/starter/src/app/starter-performance.scenarios.test.ts +355 -0
- package/templates/starter/src/app/test-evidence/browser-runtime-contract.test.ts +253 -0
- package/templates/starter/src/app/test-evidence/browser-runtime-contract.ts +243 -0
- package/templates/starter/src/routes/index.tsx +11 -2
- package/templates/starter/vite.config.ts +8 -0
- package/templates/ui/components/controls/color/color-control-types.ts +38 -0
- package/templates/ui/components/controls/color/color-control.tsx +19 -437
- package/templates/ui/components/controls/color/color-footer.tsx +272 -0
- package/templates/ui/components/controls/color/color-model-slider.tsx +271 -0
- package/templates/ui/components/controls/color/color-opacity-input.tsx +94 -0
- package/templates/ui/components/controls/color/color-surface.tsx +194 -0
- package/templates/ui/components/controls/color/color-value-control.tsx +159 -0
- package/templates/ui/components/controls/color/color-value-utils.ts +170 -0
- package/templates/ui/components/controls/color/index.ts +10 -3
- package/templates/ui/components/controls/color/palette-control-controller.ts +407 -0
- package/templates/ui/components/controls/color/palette-control-layout.ts +14 -0
- package/templates/ui/components/controls/color/palette-control-types.ts +50 -0
- package/templates/ui/components/controls/color/palette-control-view.tsx +174 -0
- package/templates/ui/components/controls/color/palette-control.tsx +6 -544
- package/templates/ui/components/controls/color/style-guide-color-picker-color-utils.ts +39 -0
- package/templates/ui/components/controls/color/style-guide-color-picker-controller.ts +370 -0
- package/templates/ui/components/controls/color/style-guide-color-picker-hue-handlers.ts +66 -0
- package/templates/ui/components/controls/color/style-guide-color-picker-interaction-state.ts +49 -0
- package/templates/ui/components/controls/color/style-guide-color-picker-interactions.ts +2 -2
- package/templates/ui/components/controls/color/style-guide-color-picker-model.ts +125 -0
- package/templates/ui/components/controls/color/style-guide-color-picker-parts.tsx +10 -707
- package/templates/ui/components/controls/color/style-guide-color-picker-surface-drag.ts +93 -0
- package/templates/ui/components/controls/color/style-guide-color-picker-surface-geometry.ts +114 -0
- package/templates/ui/components/controls/color/style-guide-color-picker-surface-preview.ts +45 -0
- package/templates/ui/components/controls/color/style-guide-color-picker-types.ts +84 -0
- package/templates/ui/components/controls/color/style-guide-color-picker-view.tsx +69 -0
- package/templates/ui/components/controls/color/style-guide-color-picker.tsx +6 -495
- package/templates/ui/components/controls/curves/curves-control.tsx +4 -3
- package/templates/ui/components/controls/file-drop/file-drop-control.tsx +39 -515
- package/templates/ui/components/controls/file-drop/file-drop-empty-state.tsx +35 -0
- package/templates/ui/components/controls/file-drop/file-drop-file-list.tsx +160 -0
- package/templates/ui/components/controls/file-drop/file-drop-image-grid.tsx +175 -0
- package/templates/ui/components/controls/file-drop/file-drop-model.tsx +170 -0
- package/templates/ui/components/controls/file-drop/file-drop-single-preview.tsx +63 -0
- package/templates/ui/components/controls/file-drop/file-drop-types.ts +48 -0
- package/templates/ui/components/controls/file-drop/index.ts +2 -2
- package/templates/ui/components/controls/font-picker/font-picker-control.tsx +133 -906
- package/templates/ui/components/controls/font-picker/font-picker-footer.tsx +116 -0
- package/templates/ui/components/controls/font-picker/font-picker-list.tsx +194 -0
- package/templates/ui/components/controls/font-picker/font-picker-popover-content.tsx +191 -0
- package/templates/ui/components/controls/font-picker/font-picker-value.ts +222 -0
- package/templates/ui/components/controls/font-picker/index.ts +4 -1
- package/templates/ui/components/controls/font-picker/use-font-picker-preview-pipeline.ts +163 -0
- package/templates/ui/components/controls/font-picker/use-font-picker-virtual-list.ts +293 -0
- package/templates/ui/components/controls/gradient/gradient-control-utils.ts +2 -25
- package/templates/ui/components/controls/gradient/gradient-control.tsx +4 -464
- package/templates/ui/components/controls/gradient/gradient-stops-controller.ts +332 -0
- package/templates/ui/components/controls/gradient/gradient-stops-track.tsx +159 -0
- package/templates/ui/components/controls/vector/vector-control-types.ts +26 -0
- package/templates/ui/components/controls/vector/vector-control.tsx +10 -486
- package/templates/ui/components/controls/vector/vector-pad-field.tsx +211 -0
- package/templates/ui/components/controls/vector/vector-pad-geometry.ts +61 -0
- package/templates/ui/components/controls/vector/vector-pad-parts.tsx +72 -0
- package/templates/ui/components/controls/vector/vector-pad-variants.ts +20 -0
- package/templates/ui/components/controls/vector/vector-size-field.tsx +104 -0
- package/templates/ui/components/controls/vector/vector-value.ts +46 -0
- package/templates/ui/components/primitives/slider/slider-discrete-state.ts +181 -0
- package/templates/ui/components/primitives/slider/slider-marker-policy.ts +52 -0
- package/templates/ui/components/primitives/slider/slider-pointer-dragging.ts +87 -0
- package/templates/ui/components/primitives/slider/slider-runtime.ts +109 -0
- package/templates/ui/components/primitives/slider/slider-types.ts +21 -0
- package/templates/ui/components/primitives/slider/slider.tsx +2 -403
- package/templates/runtime/react/canvas-shell.test.tsx +0 -554
- package/templates/runtime/react/canvas-shell.tsx +0 -585
- package/templates/runtime/react/controls-panel.test.tsx +0 -5446
- package/templates/runtime/react/controls-panel.tsx +0 -3220
- package/templates/runtime/react/layers-panel.test.tsx +0 -487
- package/templates/runtime/react/layers-panel.tsx +0 -1348
- package/templates/runtime/react/timeline-panel.test.tsx +0 -751
- package/templates/runtime/react/timeline-panel.tsx +0 -3078
- package/templates/runtime/schema/define-toolcraft.test.ts +0 -1742
- package/templates/runtime/state/reducer.test.ts +0 -1703
- package/templates/runtime/testing/performance.test.ts +0 -3081
- package/templates/starter/e2e/app-browser-acceptance.spec.ts +0 -785
- package/templates/starter/src/app/starter-acceptance.test.ts +0 -10067
- package/templates/starter/src/app/starter-performance.test.ts +0 -1583
- package/templates/ui/components/controls/color/style-guide-color-picker-logic.ts +0 -490
- /package/templates/runtime/react/{storage-key-migration.ts → app-shell/storage-key-migration.ts} +0 -0
- /package/templates/runtime/react/{theme-runtime.tsx → app-shell/theme-runtime.tsx} +0 -0
- /package/templates/runtime/react/{curve-geometry.test.ts → controls-panel/__tests__/curve-geometry.test.ts} +0 -0
- /package/templates/runtime/react/{panel-host-config.ts → panel-host/panel-host-config.ts} +0 -0
- /package/templates/runtime/react/{panel-host-geometry.test.ts → panel-host/panel-host-geometry.test.ts} +0 -0
- /package/templates/runtime/react/{panel-host-geometry.ts → panel-host/panel-host-geometry.ts} +0 -0
|
@@ -17,22 +17,30 @@ Before planning or editing app code, runtime code, controls, canvas, panels, ren
|
|
|
17
17
|
|
|
18
18
|
Do not edit implementation files until this preflight is complete.
|
|
19
19
|
|
|
20
|
+
## Local Contract Authority
|
|
21
|
+
|
|
22
|
+
The signed local `AGENTS.md` plus `docs/toolcraft/*` are sufficient and mandatory workflow input for a standalone generated app. External workflow skills should be used when available, but missing skills never invalidate `--no-skills` generation and never justify skipping the equivalent local spec, plan, debugging, browser, or verification requirement. `pnpm ai:check` enforces local code health and reports missing external skills as actionable guidance rather than a build failure.
|
|
23
|
+
|
|
24
|
+
Core modules are required reading when listed by the routing table. Read each listed module fully, one phase at a time. Open exactly one listed document per terminal or tool read, even when several documents belong to the same route and phase. Do not concatenate documents or rely on a truncated excerpt; finish the current phase, then open the next phase when the work reaches it. The signed host and runtime validators enforce platform boundaries, while product organization remains open inside those boundaries.
|
|
25
|
+
|
|
20
26
|
## Task Routing
|
|
21
27
|
|
|
22
|
-
Use the smallest
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
|
26
|
-
|
|
|
27
|
-
|
|
|
28
|
-
|
|
|
29
|
-
|
|
|
30
|
-
|
|
|
31
|
-
|
|
|
32
|
-
|
|
|
33
|
-
|
|
|
34
|
-
|
|
|
35
|
-
|
|
|
28
|
+
Use the smallest route set that covers the changed surface. When a task matches multiple routes, process them sequentially inside the phase currently in progress and skip documents already read in that phase; open each document separately and never concatenate route documents into one terminal output. Read Plan documents before the spec or implementation plan, Implementation documents immediately before code, and Verification documents immediately before writing or running proof. A broken behavior still starts with the failing test, log, or reproduction before its Plan documents; a Figma task still starts with Figma MCP/design context.
|
|
29
|
+
|
|
30
|
+
[//]: # (toolcraft-workflow-routes:start)
|
|
31
|
+
| Task route | Plan phase | Implementation phase | Verification phase |
|
|
32
|
+
| --- | --- | --- | --- |
|
|
33
|
+
| App assembly, route structure, generated app porting | `core/runtime-boundary.md`<br>`assembly-workflow.md` | `decision-contract.md` | `acceptance-testing.md` |
|
|
34
|
+
| Reference app study, audit, or port | `core/reference-study.md`<br>`core/runtime-boundary.md`<br>`assembly-workflow.md` | `schema-reference.md`<br>`decision-contract.md` | `acceptance-testing.md` |
|
|
35
|
+
| Schema, controls, defaults, persistence, actions | `core/control-selection.md`<br>`core/layout.md` | `schema-reference.md`<br>`component-rules.md` | `acceptance-testing.md` |
|
|
36
|
+
| Custom controls | `core/control-selection.md`<br>`core/layout.md` | `custom-controls.md`<br>`component-rules.md` | `acceptance-testing.md` |
|
|
37
|
+
| Renderer, canvas output, visual technique | `core/runtime-boundary.md`<br>`core/performance.md` | `renderer-technique.md`<br>`performance.md` | `acceptance-testing.md` |
|
|
38
|
+
| Timeline, keyframes, animation transport | `core/timeline-animation.md`<br>`core/performance.md` | `decision-contract.md`<br>`component-rules.md` | `acceptance-testing.md` |
|
|
39
|
+
| Layers | `core/runtime-boundary.md`<br>`core/layout.md` | `decision-contract.md`<br>`component-rules.md` | `acceptance-testing.md` |
|
|
40
|
+
| Export, copy, media, background | `core/setup-export.md`<br>`core/media-upload.md` | `schema-reference.md`<br>`component-rules.md` | `acceptance-testing.md`<br>`performance.md` |
|
|
41
|
+
| Broken control, visual mismatch, failed build, export bug, performance issue | `decision-contract.md`<br>`core/runtime-boundary.md` | `component-rules.md`<br>`renderer-technique.md` | `acceptance-testing.md`<br>`performance.md` |
|
|
42
|
+
| Figma implementation | `core/reference-study.md`<br>`core/runtime-boundary.md`<br>`assembly-workflow.md` | `schema-reference.md`<br>`component-rules.md` | `acceptance-testing.md` |
|
|
43
|
+
[//]: # (toolcraft-workflow-routes:end)
|
|
36
44
|
|
|
37
45
|
## Worklog Gate
|
|
38
46
|
|
|
@@ -68,6 +76,8 @@ Use the runtime extension points described in the current contracts:
|
|
|
68
76
|
|
|
69
77
|
Do not recreate controls, panels, toolbar, timeline, layers, canvas shell, or runtime surfaces by hand. If a shared behavior is wrong, fix the shared runtime/template source and regenerate when needed.
|
|
70
78
|
|
|
79
|
+
Browser verification is outcome-based. Protected helpers attach versioned evidence only after a persistent observable change, an observed fixture application, a decoded non-empty export inspection, a completed output action, an immutable scenario measurement, and its matching budget check. The signed reporter derives required evidence from acceptance and performance config and fails skipped, missing, duplicate, transient, unmeasured, or unbudgeted scenarios.
|
|
80
|
+
|
|
71
81
|
## Verification Gate
|
|
72
82
|
|
|
73
83
|
Choose the tier from `AGENTS.md` before editing. Use the tier to decide checks.
|
|
@@ -75,7 +85,7 @@ Choose the tier from `AGENTS.md` before editing. Use the tier to decide checks.
|
|
|
75
85
|
- Tier 0-1: targeted docs/typecheck/unit plus focused browser when visual.
|
|
76
86
|
- Tier 2: `pnpm verify:quick` plus relevant browser acceptance.
|
|
77
87
|
- Tier 3: `pnpm verify:quick`, targeted browser acceptance, and targeted performance scenarios only for touched workload/viewport/export paths.
|
|
78
|
-
- Tier 4: `
|
|
88
|
+
- Tier 4: run `node scripts/check-toolcraft-integrity.mjs` directly. For the first working product version, run the browser performance checkpoint and record its current-source receipt first, then run `pnpm verify:final`, then start `pnpm dev` for the local URL.
|
|
79
89
|
|
|
80
90
|
Run a full performance checkpoint only when:
|
|
81
91
|
|
|
@@ -84,4 +94,4 @@ Run a full performance checkpoint only when:
|
|
|
84
94
|
|
|
85
95
|
Fast feature loops after the first working version do not run the full performance suite by default. Renderer, canvas, animation, export, timeline, layers, `canvas.renderScale`, bug fixes, and performance-sensitive controls still need targeted functional/browser checks first, plus targeted performance scenarios only when they directly exercise the touched path. Record any skipped full performance run and reason in the worklog.
|
|
86
96
|
|
|
87
|
-
The app is not complete when required checks are failed, incomplete, pending, blocked, or listed as skipped. First working product delivery
|
|
97
|
+
The app is not complete when required checks are failed, incomplete, pending, blocked, or listed as skipped. Run the integrity checker directly before the final gate so verification does not depend only on mutable package-script dispatch. First working product delivery runs `pnpm verify:perf` before `pnpm verify:final`; the protected Playwright checkpoint records the machine receipt, while agent-controlled browser work remains targeted diagnostic evidence. `verify:final` rejects missing or stale receipts. After the first working version, use the typed `pnpm verify:perf:record-exemption -- --tier=<0|1|2>` path only for a post-first-working non-performance edit backed by a prior passed receipt.
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { expect, test, type TestInfo } from "@playwright/test";
|
|
2
|
+
|
|
3
|
+
import { expectToolcraftAcceptanceOutcome, expectToolcraftExportedArtifact } from "./browser-acceptance-outcome-helpers";
|
|
4
|
+
|
|
5
|
+
test("acceptance outcome rejects a return to its baseline during stability sampling", async () => {
|
|
6
|
+
let actionStarted = false;
|
|
7
|
+
let postActionObservations = 0;
|
|
8
|
+
|
|
9
|
+
await expect(
|
|
10
|
+
expectToolcraftAcceptanceOutcome(
|
|
11
|
+
async () => {
|
|
12
|
+
if (!actionStarted) return "before";
|
|
13
|
+
postActionObservations += 1;
|
|
14
|
+
return postActionObservations === 1 ? "after" : "before";
|
|
15
|
+
},
|
|
16
|
+
async () => {
|
|
17
|
+
actionStarted = true;
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
evidenceType: "command-side-effect",
|
|
21
|
+
requirementId: "command.delayed-transient",
|
|
22
|
+
stabilityIntervalMs: 0,
|
|
23
|
+
},
|
|
24
|
+
),
|
|
25
|
+
).rejects.toThrow(/stability window/i);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
test("acceptance outcome snapshots a reused mutable observation", async ({}) => {
|
|
29
|
+
const outcome = { value: "before" };
|
|
30
|
+
|
|
31
|
+
await expect(
|
|
32
|
+
expectToolcraftAcceptanceOutcome(
|
|
33
|
+
async () => outcome,
|
|
34
|
+
async () => {
|
|
35
|
+
outcome.value = "after";
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
evidenceType: "command-side-effect",
|
|
39
|
+
requirementId: "command.mutable-observation",
|
|
40
|
+
stabilityIntervalMs: 0,
|
|
41
|
+
},
|
|
42
|
+
),
|
|
43
|
+
).resolves.toEqual({ value: "after" });
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
test("generic acceptance outcomes cannot claim specialized runtime evidence", async ({
|
|
47
|
+
page,
|
|
48
|
+
}) => {
|
|
49
|
+
await page.setContent('<div id="outcome">before</div>');
|
|
50
|
+
|
|
51
|
+
await expect(
|
|
52
|
+
expectToolcraftAcceptanceOutcome(
|
|
53
|
+
() => page.locator("#outcome").textContent(),
|
|
54
|
+
() =>
|
|
55
|
+
page.locator("#outcome").evaluate((node) => {
|
|
56
|
+
node.textContent = "after";
|
|
57
|
+
}),
|
|
58
|
+
{
|
|
59
|
+
evidenceType: "timeline-duration" as never,
|
|
60
|
+
requirementId: "timeline.duration",
|
|
61
|
+
},
|
|
62
|
+
),
|
|
63
|
+
).rejects.toThrow(/specialized evidence/i);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test("export evidence requires a typed positive artifact inspection", async ({}, testInfo: TestInfo) => {
|
|
67
|
+
const attachmentCount = testInfo.attachments.length;
|
|
68
|
+
|
|
69
|
+
await expect(
|
|
70
|
+
expectToolcraftExportedArtifact(
|
|
71
|
+
async () => new Uint8Array([1, 2, 3]),
|
|
72
|
+
async () => ({ ok: true }),
|
|
73
|
+
{ requirementId: "export.nominal-object" },
|
|
74
|
+
),
|
|
75
|
+
).rejects.toThrow(/byteLength/i);
|
|
76
|
+
await expect(
|
|
77
|
+
expectToolcraftExportedArtifact(
|
|
78
|
+
async () => new Uint8Array([1, 2, 3]),
|
|
79
|
+
async () => ({ byteLength: 0 }),
|
|
80
|
+
{ requirementId: "export.zero-bytes" },
|
|
81
|
+
),
|
|
82
|
+
).rejects.toThrow(/positive byteLength/i);
|
|
83
|
+
await expect(
|
|
84
|
+
expectToolcraftExportedArtifact(
|
|
85
|
+
async () => new Uint8Array([1, 2, 3]),
|
|
86
|
+
async () => ({ byteLength: 2.5 }),
|
|
87
|
+
{ requirementId: "export.fractional-bytes" },
|
|
88
|
+
),
|
|
89
|
+
).rejects.toThrow(/byteLength integer/i);
|
|
90
|
+
await expect(
|
|
91
|
+
expectToolcraftExportedArtifact(
|
|
92
|
+
async () => new Uint8Array([1, 2, 3]),
|
|
93
|
+
async () => ({ byteLength: 3, width: 1.5 }),
|
|
94
|
+
{ requirementId: "export.fractional-width" },
|
|
95
|
+
),
|
|
96
|
+
).rejects.toThrow(/width integer/i);
|
|
97
|
+
expect(testInfo.attachments).toHaveLength(attachmentCount);
|
|
98
|
+
|
|
99
|
+
await expectToolcraftExportedArtifact(
|
|
100
|
+
async () => new Uint8Array([1, 2, 3]),
|
|
101
|
+
async (artifact) => ({
|
|
102
|
+
byteLength: artifact.byteLength,
|
|
103
|
+
contentHash: "pixel-hash",
|
|
104
|
+
height: 1,
|
|
105
|
+
mediaType: "image/png",
|
|
106
|
+
width: 1,
|
|
107
|
+
}),
|
|
108
|
+
{ requirementId: "export.valid-inspection" },
|
|
109
|
+
);
|
|
110
|
+
expect(testInfo.attachments).toHaveLength(attachmentCount + 1);
|
|
111
|
+
});
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { expect, test } from "@playwright/test";
|
|
2
|
+
import type { ToolcraftPerformanceConfig } from "@repo/toolcraft-runtime";
|
|
3
|
+
|
|
4
|
+
import { parseToolcraftBrowserRuntimeEvidence } from "../src/app/test-evidence/browser-runtime-contract";
|
|
5
|
+
import { expectToolcraftExportedArtifact } from "./browser-acceptance-outcome-helpers";
|
|
6
|
+
import {
|
|
7
|
+
dragToolcraftSliderToPerformanceStressValue,
|
|
8
|
+
expectToolcraftSegmentedControlCellsPreservePadding,
|
|
9
|
+
getToolcraftFieldByLabel,
|
|
10
|
+
} from "./performance-helpers";
|
|
11
|
+
|
|
12
|
+
test("segmented layout helper catches paddingless or colliding cells", async ({ page }) => {
|
|
13
|
+
await page.setContent(`
|
|
14
|
+
<div data-slot="field">FX Preset
|
|
15
|
+
<div data-slot="toggle-group" style="display:flex;width:360px;">
|
|
16
|
+
<button data-slot="toggle-group-item" style="box-sizing:border-box;width:120px;padding:0 12px;">One</button>
|
|
17
|
+
<button data-slot="toggle-group-item" style="box-sizing:border-box;width:120px;padding:0 12px;">Two</button>
|
|
18
|
+
<button data-slot="toggle-group-item" style="box-sizing:border-box;width:120px;padding:0 12px;">Off</button>
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
|
+
`);
|
|
22
|
+
|
|
23
|
+
await expectToolcraftSegmentedControlCellsPreservePadding(page, "FX Preset");
|
|
24
|
+
|
|
25
|
+
await page.setContent(`
|
|
26
|
+
<div data-slot="field">FX Preset
|
|
27
|
+
<div data-slot="toggle-group" style="display:flex;width:180px;">
|
|
28
|
+
<button data-slot="toggle-group-item" style="box-sizing:border-box;width:60px;padding:0;">Full Stack</button>
|
|
29
|
+
<button data-slot="toggle-group-item" style="box-sizing:border-box;width:60px;padding:0;">RGB Split</button>
|
|
30
|
+
<button data-slot="toggle-group-item" style="box-sizing:border-box;width:60px;padding:0;">Lines</button>
|
|
31
|
+
</div>
|
|
32
|
+
</div>
|
|
33
|
+
`);
|
|
34
|
+
|
|
35
|
+
await expect(
|
|
36
|
+
expectToolcraftSegmentedControlCellsPreservePadding(page, "FX Preset"),
|
|
37
|
+
).rejects.toThrow(/must preserve cell padding/);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
test("performance helpers match control labels literally", async ({ page }) => {
|
|
41
|
+
await page.setContent(`
|
|
42
|
+
<div data-slot="field" data-testid="literal-label">Size (px)<input type="range" /></div>
|
|
43
|
+
<div data-slot="field" data-testid="regex-lookalike">Size px<input type="range" /></div>
|
|
44
|
+
`);
|
|
45
|
+
|
|
46
|
+
await expect(await getToolcraftFieldByLabel(page, "Size (px)")).toHaveAttribute(
|
|
47
|
+
"data-testid",
|
|
48
|
+
"literal-label",
|
|
49
|
+
);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
test("slider stress helper applies the declared value and emits runtime evidence", async ({
|
|
53
|
+
page,
|
|
54
|
+
}, testInfo) => {
|
|
55
|
+
await page.setContent(`
|
|
56
|
+
<div data-slot="toolcraft-runtime-app">
|
|
57
|
+
<div class="contents" data-toolcraft-control-target="density.value">
|
|
58
|
+
<div data-slot="field">Density
|
|
59
|
+
<input data-slot="slider" role="slider" type="range" min="0" max="10" value="0" style="width:200px;height:20px;" />
|
|
60
|
+
</div>
|
|
61
|
+
</div>
|
|
62
|
+
</div>
|
|
63
|
+
`);
|
|
64
|
+
const config = {
|
|
65
|
+
rendererStrategy: "none",
|
|
66
|
+
rendererWorkload: "none",
|
|
67
|
+
scenarios: [{
|
|
68
|
+
automated: true,
|
|
69
|
+
automatedTestName: "perf: density stress",
|
|
70
|
+
browser: true,
|
|
71
|
+
browserTestName: "browser perf: density stress",
|
|
72
|
+
budget: { maxInteractionMs: 500 },
|
|
73
|
+
expectedObservable: "Density drag completes.",
|
|
74
|
+
fixture: "Density stress fixture.",
|
|
75
|
+
id: "density-stress",
|
|
76
|
+
interaction: "control-drag",
|
|
77
|
+
stressFixture: { kind: "max-value", reason: "Maximum density.", value: 9 },
|
|
78
|
+
target: "density.value",
|
|
79
|
+
workload: true,
|
|
80
|
+
}],
|
|
81
|
+
usesCustomRenderer: false,
|
|
82
|
+
workloadTargets: ["density.value"],
|
|
83
|
+
} as const satisfies ToolcraftPerformanceConfig;
|
|
84
|
+
|
|
85
|
+
await dragToolcraftSliderToPerformanceStressValue(
|
|
86
|
+
page,
|
|
87
|
+
"Density",
|
|
88
|
+
config,
|
|
89
|
+
"density-stress",
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
expect(
|
|
93
|
+
testInfo.attachments.map((attachment) =>
|
|
94
|
+
parseToolcraftBrowserRuntimeEvidence(attachment)?.evidenceType,
|
|
95
|
+
),
|
|
96
|
+
).toEqual(expect.arrayContaining([
|
|
97
|
+
"performance-control-drag",
|
|
98
|
+
"performance-stress-fixture",
|
|
99
|
+
]));
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
test("export acceptance rejects a verifier that does not return an artifact observation", async () => {
|
|
103
|
+
await expect(
|
|
104
|
+
expectToolcraftExportedArtifact(
|
|
105
|
+
async () => new Uint8Array([1, 2, 3]),
|
|
106
|
+
async () => ({}),
|
|
107
|
+
{ requirementId: "image-export-artifact" },
|
|
108
|
+
),
|
|
109
|
+
).rejects.toThrow(/artifact inspection/i);
|
|
110
|
+
|
|
111
|
+
await expect(
|
|
112
|
+
expectToolcraftExportedArtifact(
|
|
113
|
+
async () => undefined,
|
|
114
|
+
async () => ({ byteLength: 1 }),
|
|
115
|
+
{ requirementId: "missing-export-artifact" },
|
|
116
|
+
),
|
|
117
|
+
).rejects.toThrow(/non-empty export artifact/i);
|
|
118
|
+
});
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { expect, test, type TestInfo } from "@playwright/test";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
TOOLCRAFT_BROWSER_RUNTIME_EVIDENCE_ATTACHMENT_NAME,
|
|
5
|
+
parseToolcraftBrowserRuntimeEvidence,
|
|
6
|
+
} from "../src/app/test-evidence/browser-runtime-contract";
|
|
7
|
+
import {
|
|
8
|
+
applyToolcraftPerformanceStressFixture,
|
|
9
|
+
applyToolcraftPerformanceStressValue,
|
|
10
|
+
} from "./performance-fixture-helpers";
|
|
11
|
+
import { measureToolcraftInteraction } from "./performance-probe-helpers";
|
|
12
|
+
|
|
13
|
+
const fixtureConfig = {
|
|
14
|
+
rendererStrategy: "none",
|
|
15
|
+
rendererWorkload: "none",
|
|
16
|
+
scenarios: [
|
|
17
|
+
{
|
|
18
|
+
automated: true,
|
|
19
|
+
automatedTestName: "perf: fixture outcome",
|
|
20
|
+
browser: true,
|
|
21
|
+
browserTestName: "browser perf: fixture outcome",
|
|
22
|
+
budget: { maxInteractionMs: 1_000 },
|
|
23
|
+
expectedObservable: "The fixture value is applied.",
|
|
24
|
+
fixture: "Fixture outcome",
|
|
25
|
+
id: "fixture-outcome",
|
|
26
|
+
interaction: "control-change",
|
|
27
|
+
stressFixture: { kind: "max-value", reason: "Exercise the maximum.", value: 8 },
|
|
28
|
+
workload: true,
|
|
29
|
+
},
|
|
30
|
+
],
|
|
31
|
+
usesCustomRenderer: false,
|
|
32
|
+
workloadTargets: [],
|
|
33
|
+
} as const;
|
|
34
|
+
|
|
35
|
+
const objectFixtureConfig = {
|
|
36
|
+
...fixtureConfig,
|
|
37
|
+
scenarios: [
|
|
38
|
+
{
|
|
39
|
+
...fixtureConfig.scenarios[0],
|
|
40
|
+
id: "object-fixture-outcome",
|
|
41
|
+
stressFixture: {
|
|
42
|
+
kind: "combined",
|
|
43
|
+
reason: "Exercise the combined final state.",
|
|
44
|
+
value: { first: 1, second: 2 },
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
} as const;
|
|
49
|
+
|
|
50
|
+
function evidenceTypesSince(testInfo: TestInfo, attachmentCount: number) {
|
|
51
|
+
return testInfo.attachments
|
|
52
|
+
.slice(attachmentCount)
|
|
53
|
+
.filter(
|
|
54
|
+
(attachment) =>
|
|
55
|
+
attachment.name === TOOLCRAFT_BROWSER_RUNTIME_EVIDENCE_ATTACHMENT_NAME,
|
|
56
|
+
)
|
|
57
|
+
.map((attachment) => parseToolcraftBrowserRuntimeEvidence(attachment)?.evidenceType);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
test("performance interaction evidence requires a persistent changed outcome", async ({
|
|
61
|
+
page,
|
|
62
|
+
}, testInfo) => {
|
|
63
|
+
await page.setContent('<div id="outcome">before</div>');
|
|
64
|
+
const attachmentCount = testInfo.attachments.length;
|
|
65
|
+
|
|
66
|
+
await expect(
|
|
67
|
+
measureToolcraftInteraction(page, async () => undefined, {
|
|
68
|
+
observeOutcome: () => page.locator("#outcome").textContent(),
|
|
69
|
+
outcomeTimeoutMs: 100,
|
|
70
|
+
scenarioId: "no-op-outcome",
|
|
71
|
+
}),
|
|
72
|
+
).rejects.toThrow(/performance outcome/i);
|
|
73
|
+
expect(evidenceTypesSince(testInfo, attachmentCount)).toEqual([]);
|
|
74
|
+
|
|
75
|
+
const result = await measureToolcraftInteraction(
|
|
76
|
+
page,
|
|
77
|
+
() => page.locator("#outcome").evaluate((node) => {
|
|
78
|
+
node.textContent = "after";
|
|
79
|
+
}),
|
|
80
|
+
{
|
|
81
|
+
observeOutcome: () => page.locator("#outcome").textContent(),
|
|
82
|
+
scenarioId: "changed-outcome",
|
|
83
|
+
stabilityIntervalMs: 10,
|
|
84
|
+
},
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
expect(Object.isFrozen(result)).toBe(true);
|
|
88
|
+
expect(evidenceTypesSince(testInfo, attachmentCount)).toEqual([
|
|
89
|
+
"performance-product-outcome",
|
|
90
|
+
"performance-measurement",
|
|
91
|
+
]);
|
|
92
|
+
|
|
93
|
+
const mutableOutcome = { value: "before" };
|
|
94
|
+
const mutableAttachmentCount = testInfo.attachments.length;
|
|
95
|
+
await measureToolcraftInteraction(
|
|
96
|
+
page,
|
|
97
|
+
async () => {
|
|
98
|
+
mutableOutcome.value = "after";
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
observeOutcome: async () => mutableOutcome,
|
|
102
|
+
scenarioId: "mutable-outcome",
|
|
103
|
+
stabilityIntervalMs: 0,
|
|
104
|
+
},
|
|
105
|
+
);
|
|
106
|
+
expect(evidenceTypesSince(testInfo, mutableAttachmentCount)).toEqual([
|
|
107
|
+
"performance-product-outcome",
|
|
108
|
+
"performance-measurement",
|
|
109
|
+
]);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
test("performance interaction rejects autonomous deltas and times an expected semantic outcome", async ({
|
|
113
|
+
page,
|
|
114
|
+
}, testInfo) => {
|
|
115
|
+
await page.setContent(`
|
|
116
|
+
<div id="animated-output">0</div>
|
|
117
|
+
<div id="semantic-outcome">idle</div>
|
|
118
|
+
<script>
|
|
119
|
+
let frame = 0;
|
|
120
|
+
setInterval(() => {
|
|
121
|
+
frame += 1;
|
|
122
|
+
document.querySelector("#animated-output").textContent = String(frame);
|
|
123
|
+
}, 8);
|
|
124
|
+
</script>
|
|
125
|
+
`);
|
|
126
|
+
const attachmentCount = testInfo.attachments.length;
|
|
127
|
+
|
|
128
|
+
await expect(
|
|
129
|
+
measureToolcraftInteraction(page, async () => undefined, {
|
|
130
|
+
baselineStabilityIntervalMs: 12,
|
|
131
|
+
baselineStabilitySamples: 3,
|
|
132
|
+
observeOutcome: () => page.locator("#animated-output").textContent(),
|
|
133
|
+
outcomeTimeoutMs: 150,
|
|
134
|
+
scenarioId: "autonomous-no-op",
|
|
135
|
+
}),
|
|
136
|
+
).rejects.toThrow(/baseline must remain stable/u);
|
|
137
|
+
expect(evidenceTypesSince(testInfo, attachmentCount)).toEqual([]);
|
|
138
|
+
|
|
139
|
+
const result = await measureToolcraftInteraction(
|
|
140
|
+
page,
|
|
141
|
+
async () => {
|
|
142
|
+
await page.waitForTimeout(40);
|
|
143
|
+
await page.locator("#semantic-outcome").evaluate((node) => {
|
|
144
|
+
node.textContent = "applied";
|
|
145
|
+
});
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
expectedOutcome: "applied",
|
|
149
|
+
observeOutcome: () => page.locator("#semantic-outcome").textContent(),
|
|
150
|
+
scenarioId: "expected-semantic-outcome",
|
|
151
|
+
stabilityIntervalMs: 10,
|
|
152
|
+
},
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
expect(result.durationMs).toBeGreaterThanOrEqual(30);
|
|
156
|
+
expect(evidenceTypesSince(testInfo, attachmentCount)).toEqual([
|
|
157
|
+
"performance-product-outcome",
|
|
158
|
+
"performance-measurement",
|
|
159
|
+
]);
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
test("performance fixture evidence requires the declared value to be observable", async ({
|
|
163
|
+
page,
|
|
164
|
+
}, testInfo) => {
|
|
165
|
+
await page.setContent('<div id="fixture-value">0</div>');
|
|
166
|
+
const attachmentCount = testInfo.attachments.length;
|
|
167
|
+
|
|
168
|
+
await expect(
|
|
169
|
+
applyToolcraftPerformanceStressValue(fixtureConfig, "fixture-outcome", {
|
|
170
|
+
applyValue: async () => undefined,
|
|
171
|
+
observeValue: async () => Number(await page.locator("#fixture-value").textContent()),
|
|
172
|
+
}),
|
|
173
|
+
).rejects.toThrow(/observed fixture value/i);
|
|
174
|
+
expect(evidenceTypesSince(testInfo, attachmentCount)).toEqual([]);
|
|
175
|
+
|
|
176
|
+
await applyToolcraftPerformanceStressValue(fixtureConfig, "fixture-outcome", {
|
|
177
|
+
applyValue: (value) => page.locator("#fixture-value").evaluate((node, nextValue) => {
|
|
178
|
+
node.textContent = String(nextValue);
|
|
179
|
+
}, value),
|
|
180
|
+
observeValue: async () => Number(await page.locator("#fixture-value").textContent()),
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
expect(evidenceTypesSince(testInfo, attachmentCount)).toEqual([
|
|
184
|
+
"performance-stress-fixture",
|
|
185
|
+
]);
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
test("object fixture evidence verifies the complete final state", async ({
|
|
189
|
+
page,
|
|
190
|
+
}, testInfo) => {
|
|
191
|
+
const state = { first: 0, second: 0 };
|
|
192
|
+
const attachmentCount = testInfo.attachments.length;
|
|
193
|
+
|
|
194
|
+
await expect(
|
|
195
|
+
applyToolcraftPerformanceStressFixture(
|
|
196
|
+
page,
|
|
197
|
+
objectFixtureConfig,
|
|
198
|
+
"object-fixture-outcome",
|
|
199
|
+
{
|
|
200
|
+
first: {
|
|
201
|
+
applyValue: (value) => {
|
|
202
|
+
state.first = Number(value);
|
|
203
|
+
},
|
|
204
|
+
observeValue: () => state.first,
|
|
205
|
+
},
|
|
206
|
+
second: {
|
|
207
|
+
applyValue: (value) => {
|
|
208
|
+
state.second = Number(value);
|
|
209
|
+
state.first = 0;
|
|
210
|
+
},
|
|
211
|
+
observeValue: () => state.second,
|
|
212
|
+
},
|
|
213
|
+
},
|
|
214
|
+
),
|
|
215
|
+
).rejects.toThrow(/complete stressFixture/i);
|
|
216
|
+
expect(evidenceTypesSince(testInfo, attachmentCount)).toEqual([]);
|
|
217
|
+
});
|