@pixel-point/toolcraft 0.0.18 → 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.
- package/package.json +1 -1
- package/src/generate-demand-only-lifecycle.test.mjs +9 -1
- package/src/generate-performance-iteration-execution.test.mjs +3 -3
- package/src/generate-test-delivery-architecture-assertions.mjs +11 -73
- package/src/generate-test-demand-only-lifecycle.mjs +34 -36
- package/src/generate-test-dependency-sandbox.mjs +4 -1
- package/src/generate-test-doc-assertions.mjs +55 -53
- package/src/generate-test-doc-assertions.test.mjs +1 -1
- package/src/generate-test-doc-policy-assertions.mjs +1 -1
- package/src/generate-test-export-doc-assertions.mjs +53 -0
- package/src/generate-test-file-assertions.mjs +51 -8
- package/src/generate-test-integrity-assertions.mjs +5 -2
- package/src/generate-test-integrity-manifest-assertions.mjs +16 -5
- package/src/generate-test-integrity-ownership-assertions.mjs +36 -4
- package/src/generate-test-package-assertions.mjs +4 -0
- package/src/generate-test-product-fixture.mjs +1 -1
- package/src/generate-test-product-fixture.test.mjs +35 -38
- package/src/generate-test-product-iteration.mjs +0 -1
- package/src/generate-test-product-iteration.test.mjs +0 -1
- package/src/generate-test-runtime-boundary-assertions.mjs +20 -0
- package/src/generate-test-standalone-assertions.mjs +0 -16
- package/src/generate-test-standalone-delivery-stages.mjs +2 -86
- package/src/generate.test.mjs +4 -0
- package/src/generated-integrity-manifest.test.mjs +5 -2
- package/src/generated-source-policy.test.mjs +0 -4
- package/src/package-json.mjs +5 -0
- package/src/package-json.test.mjs +21 -0
- package/src/package-manager.mjs +2 -0
- package/src/package-manager.test.mjs +8 -0
- package/src/packaged-template-fallback-helpers.mjs +254 -0
- package/src/packaged-template-fallback.test.mjs +121 -46
- package/src/packaged-template-runtime-assertions.mjs +150 -0
- package/templates/runtime/contracts/component-contracts.choices.test.ts +18 -3
- package/templates/runtime/contracts/component-contracts.choices.ts +8 -3
- package/templates/runtime/contracts/component-contracts.inputs.ts +2 -1
- package/templates/runtime/contracts/component-contracts.runtime-acceptance.test.ts +18 -4
- package/templates/runtime/contracts/component-contracts.runtime-shell.test.ts +1 -1
- package/templates/runtime/contracts/component-contracts.runtime.ts +7 -4
- package/templates/runtime/contracts/component-contracts.visual.test.ts +20 -0
- package/templates/runtime/contracts/component-contracts.visual.ts +4 -0
- package/templates/runtime/contracts/decision-contracts.test.ts +18 -12
- package/templates/runtime/contracts/decision-contracts.ts +4 -4
- package/templates/runtime/contracts/performance-verification-policy.test.ts +12 -12
- package/templates/runtime/contracts/performance-verification-policy.ts +8 -8
- package/templates/runtime/export/artifact-download.ts +1 -0
- package/templates/runtime/export/artifact-frame-renderer.ts +2 -15
- package/templates/runtime/export/artifact-frame-state.ts +16 -0
- package/templates/runtime/export/artifact-scene-frame.test.ts +3 -3
- package/templates/runtime/export/artifact-scene-frame.ts +3 -3
- package/templates/runtime/export/export-error.ts +5 -0
- package/templates/runtime/export/export-renderer-coverage.ts +54 -0
- package/templates/runtime/export/image-artifact-export.ts +2 -2
- package/templates/runtime/export/index.ts +13 -0
- package/templates/runtime/export/product-export-renderer.test.ts +38 -4
- package/templates/runtime/export/product-export-renderer.ts +0 -41
- package/templates/runtime/export/product-svg-export-renderer.ts +21 -0
- package/templates/runtime/export/svg-artifact-export.test.ts +98 -0
- package/templates/runtime/export/svg-artifact-export.ts +120 -0
- package/templates/runtime/export/svg-document.test.ts +221 -0
- package/templates/runtime/export/svg-document.ts +400 -0
- package/templates/runtime/export/svg-policy.ts +47 -0
- package/templates/runtime/index.ts +1 -0
- package/templates/runtime/react/app-shell/runtime-public-api.test.tsx +10 -0
- package/templates/runtime/react/app-shell/settings-transfer.test.ts +21 -0
- package/templates/runtime/react/app-shell/toolcraft-app.scene-export.test.tsx +46 -1
- package/templates/runtime/react/app-shell/toolcraft-app.tsx +7 -2
- package/templates/runtime/react/canvas/canvas-shell-interactions.test.tsx +30 -0
- package/templates/runtime/react/canvas/canvas-shell-pinch-interactions.test.tsx +155 -0
- package/templates/runtime/react/canvas/canvas-shell-rendering.test.tsx +1 -1
- package/templates/runtime/react/canvas/canvas-shell.tsx +16 -5
- package/templates/runtime/react/canvas/canvas-viewport-geometry.ts +133 -0
- package/templates/runtime/react/canvas/use-canvas-viewport-interactions.ts +285 -36
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.color-applicability-layout.test.tsx +134 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.color-layout.test.tsx +16 -1
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.render-isolation.test.tsx +2 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.scene-export-actions.test.tsx +39 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.setup-controls.test.tsx +3 -3
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.source-collection.test.tsx +1 -4
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.source-color-bank.test.tsx +2 -2
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.vector-interaction.test.tsx +6 -6
- package/templates/runtime/react/controls-panel/actions/controls-panel-actions.ts +2 -2
- package/templates/runtime/react/controls-panel/actions/export-action-runner.ts +40 -11
- package/templates/runtime/react/controls-panel/layout/controls-panel-layout.tsx +31 -2
- package/templates/runtime/react/controls-panel/layout/controls-panel-section.tsx +4 -1
- package/templates/runtime/react/controls-panel/renderers/controls-panel-action-renderer.tsx +2 -1
- package/templates/runtime/react/controls-panel/renderers/controls-panel-basic-renderers.tsx +2 -52
- package/templates/runtime/react/controls-panel/values/controls-panel-color-values.ts +1 -9
- package/templates/runtime/react/controls-panel/values/controls-panel-spatial-values.ts +7 -2
- package/templates/runtime/react/orientation-gizmo/orientation-gizmo-math.ts +9 -69
- package/templates/runtime/schema/artifact-export-actions.test.ts +47 -0
- package/templates/runtime/schema/artifact-export-actions.ts +49 -0
- package/templates/runtime/schema/types.ts +1 -0
- package/templates/runtime/state/canvas-background-state.ts +1 -16
- package/templates/runtime/state/canvas-state.ts +32 -20
- package/templates/runtime/state/control-value-codecs.test.ts +98 -0
- package/templates/runtime/state/control-value-codecs.ts +700 -0
- package/templates/runtime/state/control-value-normalization.test.ts +1 -1
- package/templates/runtime/state/control-value-normalization.ts +127 -135
- package/templates/runtime/state/controls-reducer.ts +26 -3
- package/templates/runtime/state/create-template-state.test.ts +30 -0
- package/templates/runtime/state/create-template-state.ts +52 -31
- package/templates/runtime/state/orientation-pose.ts +80 -0
- package/templates/runtime/state/persistence-control-values.test.ts +59 -0
- package/templates/runtime/state/reducer-controls.test.ts +45 -0
- package/templates/runtime/state/reducer-media-reset.test.ts +1 -1
- package/templates/runtime/state/reducer-timeline.test.ts +70 -0
- package/templates/runtime/state/timeline-reducer.ts +40 -2
- package/templates/runtime/testing/performance-schema-queries.ts +2 -2
- package/templates/starter/AGENTS.md +21 -22
- package/templates/starter/docs/toolcraft/README.md +6 -6
- package/templates/starter/docs/toolcraft/acceptance-testing.md +20 -20
- package/templates/starter/docs/toolcraft/agent-worklog.md +88 -1
- package/templates/starter/docs/toolcraft/assembly-workflow.md +7 -6
- package/templates/starter/docs/toolcraft/component-rules.md +2 -2
- package/templates/starter/docs/toolcraft/core/layout.md +6 -1
- package/templates/starter/docs/toolcraft/core/media-upload.md +1 -1
- package/templates/starter/docs/toolcraft/core/performance.md +8 -10
- package/templates/starter/docs/toolcraft/core/reference-study.md +80 -19
- package/templates/starter/docs/toolcraft/core/runtime-boundary.md +2 -1
- package/templates/starter/docs/toolcraft/core/setup-export.md +43 -13
- package/templates/starter/docs/toolcraft/decision-contract.md +2 -2
- package/templates/starter/docs/toolcraft/performance.md +8 -10
- package/templates/starter/docs/toolcraft/renderer-technique.md +2 -2
- package/templates/starter/docs/toolcraft/schema-reference.md +8 -8
- package/templates/starter/docs/toolcraft/workflow.md +14 -14
- package/templates/starter/e2e/app-browser-infinity-canvas-evidence.spec.ts +38 -0
- package/templates/starter/e2e/app-browser-motion-reference-requirements.spec.ts +411 -0
- package/templates/starter/e2e/app-browser-proof-session.spec.ts +85 -0
- package/templates/starter/e2e/app-browser-runtime-requirements.spec.ts +62 -0
- package/templates/starter/e2e/app-browser-selection-scope-evidence.spec.ts +137 -0
- package/templates/starter/e2e/browser-infinity-canvas-svg-evidence.ts +42 -0
- package/templates/starter/e2e/browser-layer-evidence-helpers.ts +15 -36
- package/templates/starter/e2e/browser-product-raster-snapshot.ts +213 -0
- package/templates/starter/e2e/browser-proof-session.ts +43 -15
- package/templates/starter/e2e/browser-proof-surface-action.ts +79 -0
- package/templates/starter/e2e/browser-proof-types.ts +15 -0
- package/templates/starter/e2e/browser-runtime-evidence-requirements.ts +22 -6
- package/templates/starter/e2e/browser-selection-scope-evidence.ts +269 -0
- package/templates/starter/e2e/browser-semantic-evidence-test-helpers.ts +97 -0
- package/templates/starter/e2e/browser-svg-export-evidence.spec.ts +79 -0
- package/templates/starter/e2e/browser-svg-export-evidence.ts +152 -0
- package/templates/starter/e2e/export-artifact-helpers.ts +70 -0
- package/templates/starter/e2e/product-observable-helpers.ts +8 -129
- package/templates/starter/e2e/svg-artifact-inspection.spec.ts +136 -0
- package/templates/starter/e2e/svg-artifact-inspection.ts +331 -0
- package/templates/starter/e2e/svg-download-test-fixtures.ts +34 -0
- package/templates/starter/e2e/toolcraft-delivery-catalog-reporter.ts +198 -15
- package/templates/starter/e2e/toolcraft-feature-verification-reporter.spec.ts +149 -0
- package/templates/starter/e2e/toolcraft-feature-verification-reporter.ts +223 -0
- package/templates/starter/package.json +2 -0
- package/templates/starter/scripts/check-toolcraft-docs.mjs +1 -0
- package/templates/starter/scripts/create-toolcraft-motion-reference-study.mjs +233 -0
- package/templates/starter/scripts/create-toolcraft-motion-reference-study.test.mjs +459 -0
- package/templates/starter/scripts/playwright-test-title-selection.d.mts +45 -0
- package/templates/starter/scripts/run-browser-performance-test-helpers.mjs +0 -27
- package/templates/starter/scripts/run-browser-performance.mjs +0 -6
- package/templates/starter/scripts/run-browser-performance.test.mjs +5 -13
- package/templates/starter/scripts/run-delivery-verification-test-helpers.mjs +0 -34
- package/templates/starter/scripts/run-delivery-verification.test.mjs +135 -31
- package/templates/starter/scripts/run-feature-verification.mjs +212 -0
- package/templates/starter/scripts/run-feature-verification.test.mjs +226 -0
- package/templates/starter/scripts/toolcraft-checkpoint-delivery-state.mjs +21 -8
- package/templates/starter/scripts/toolcraft-checkpoint-delivery-state.test.mjs +32 -92
- package/templates/starter/scripts/toolcraft-checkpoint-transaction.mjs +28 -6
- package/templates/starter/scripts/toolcraft-checkpoint-transaction.test.mjs +8 -63
- package/templates/starter/scripts/toolcraft-delivery-anchor.mjs +28 -8
- package/templates/starter/scripts/toolcraft-delivery-anchor.test.mjs +50 -61
- package/templates/starter/scripts/toolcraft-delivery-architecture-inventory.mjs +0 -4
- package/templates/starter/scripts/toolcraft-delivery-architecture-policy.mjs +0 -1
- package/templates/starter/scripts/toolcraft-delivery-evidence.test.mjs +2 -3
- package/templates/starter/scripts/toolcraft-delivery-executor.mjs +5 -1
- package/templates/starter/scripts/toolcraft-delivery-executor.test.mjs +5 -12
- package/templates/starter/scripts/toolcraft-delivery-functional-context.d.mts +1 -48
- package/templates/starter/scripts/toolcraft-delivery-functional-context.mjs +2 -30
- package/templates/starter/scripts/toolcraft-delivery-functional-context.test.mjs +4 -166
- package/templates/starter/scripts/toolcraft-delivery-functional-initial.test.mjs +4 -20
- package/templates/starter/scripts/toolcraft-delivery-lifecycle.mjs +43 -192
- package/templates/starter/scripts/toolcraft-delivery-performance-iteration-lifecycle.test.mjs +79 -440
- package/templates/starter/scripts/toolcraft-delivery-plan-authority.test.mjs +102 -297
- package/templates/starter/scripts/toolcraft-delivery-plan-construction.mjs +46 -97
- package/templates/starter/scripts/toolcraft-delivery-plan-test-helpers.mjs +125 -0
- package/templates/starter/scripts/toolcraft-delivery-plan-validation.test.mjs +58 -0
- package/templates/starter/scripts/toolcraft-delivery-plan.d.mts +19 -31
- package/templates/starter/scripts/toolcraft-delivery-plan.mjs +254 -252
- package/templates/starter/scripts/toolcraft-delivery-plan.test.mjs +29 -457
- package/templates/starter/scripts/toolcraft-delivery-receipt-performance.test.mjs +1 -1
- package/templates/starter/scripts/toolcraft-delivery-receipt-strictness.test.mjs +3 -72
- package/templates/starter/scripts/toolcraft-delivery-receipt-test-helpers.mjs +7 -36
- package/templates/starter/scripts/toolcraft-delivery-receipt.d.mts +3 -5
- package/templates/starter/scripts/toolcraft-delivery-receipt.mjs +15 -31
- package/templates/starter/scripts/toolcraft-delivery-receipt.test.mjs +28 -20
- package/templates/starter/scripts/toolcraft-delivery-receipt.types.test.mts +22 -30
- package/templates/starter/scripts/toolcraft-feature-verification-plan.d.mts +20 -0
- package/templates/starter/scripts/toolcraft-feature-verification-plan.mjs +146 -0
- package/templates/starter/scripts/toolcraft-feature-verification-plan.test.mjs +96 -0
- package/templates/starter/scripts/toolcraft-functional-proof-model.d.mts +3 -18
- package/templates/starter/scripts/toolcraft-functional-proof-model.mjs +39 -127
- package/templates/starter/scripts/toolcraft-functional-proof-model.test.mjs +25 -362
- package/templates/starter/scripts/toolcraft-functional-proof-model.types.test.mts +6 -83
- package/templates/starter/scripts/toolcraft-functional-proof-primitives.d.mts +11 -0
- package/templates/starter/scripts/toolcraft-functional-proof-primitives.mjs +61 -0
- package/templates/starter/scripts/toolcraft-functional-proof-primitives.test.mjs +43 -0
- package/templates/starter/scripts/toolcraft-integrity-policy.mjs +13 -0
- package/templates/starter/scripts/toolcraft-integrity-test-utils.mjs +1 -1
- package/templates/starter/scripts/toolcraft-layer-evidence-facade.test.mjs +58 -22
- package/templates/starter/scripts/toolcraft-motion-reference-analysis-protocol.mjs +111 -0
- package/templates/starter/scripts/toolcraft-motion-reference-analysis-protocol.test.mjs +116 -0
- package/templates/starter/scripts/toolcraft-motion-reference-artifacts.d.mts +37 -0
- package/templates/starter/scripts/toolcraft-motion-reference-artifacts.mjs +308 -0
- package/templates/starter/scripts/toolcraft-motion-reference-artifacts.test.mjs +420 -0
- package/templates/starter/scripts/toolcraft-motion-reference-artifacts.types.test.mts +50 -0
- package/templates/starter/scripts/toolcraft-motion-reference-command-options.mjs +195 -0
- package/templates/starter/scripts/toolcraft-motion-reference-command-options.test.mjs +224 -0
- package/templates/starter/scripts/toolcraft-motion-reference-contact-sheet.mjs +122 -0
- package/templates/starter/scripts/toolcraft-motion-reference-contact-sheet.test.mjs +153 -0
- package/templates/starter/scripts/toolcraft-motion-reference-evidence-assembly.mjs +270 -0
- package/templates/starter/scripts/toolcraft-motion-reference-evidence.test.mjs +432 -0
- package/templates/starter/scripts/toolcraft-motion-reference-ffmpeg-output.mjs +275 -0
- package/templates/starter/scripts/toolcraft-motion-reference-ffmpeg-output.test.mjs +294 -0
- package/templates/starter/scripts/toolcraft-motion-reference-group-inventory.mjs +148 -0
- package/templates/starter/scripts/toolcraft-motion-reference-image-filter-graph.mjs +101 -0
- package/templates/starter/scripts/toolcraft-motion-reference-image-filter-graph.test.mjs +124 -0
- package/templates/starter/scripts/toolcraft-motion-reference-image-source.mjs +259 -0
- package/templates/starter/scripts/toolcraft-motion-reference-image-source.test.mjs +338 -0
- package/templates/starter/scripts/toolcraft-motion-reference-image-timing.mjs +96 -0
- package/templates/starter/scripts/toolcraft-motion-reference-image-timing.test.mjs +81 -0
- package/templates/starter/scripts/toolcraft-motion-reference-lock-recovery.test.mjs +144 -0
- package/templates/starter/scripts/toolcraft-motion-reference-media-source.mjs +165 -0
- package/templates/starter/scripts/toolcraft-motion-reference-media-source.test.mjs +299 -0
- package/templates/starter/scripts/toolcraft-motion-reference-publication-discovery.test.mjs +142 -0
- package/templates/starter/scripts/toolcraft-motion-reference-publication-isolation.test.mjs +234 -0
- package/templates/starter/scripts/toolcraft-motion-reference-publication-journal-schema.mjs +122 -0
- package/templates/starter/scripts/toolcraft-motion-reference-publication-journal-store.mjs +89 -0
- package/templates/starter/scripts/toolcraft-motion-reference-publication-journal-store.test.mjs +74 -0
- package/templates/starter/scripts/toolcraft-motion-reference-publication-journal.mjs +264 -0
- package/templates/starter/scripts/toolcraft-motion-reference-publication-journal.test.mjs +377 -0
- package/templates/starter/scripts/toolcraft-motion-reference-publication-lease.mjs +254 -0
- package/templates/starter/scripts/toolcraft-motion-reference-publication-lease.test.mjs +130 -0
- package/templates/starter/scripts/toolcraft-motion-reference-publication-staging.mjs +128 -0
- package/templates/starter/scripts/toolcraft-motion-reference-publication-staging.test.mjs +209 -0
- package/templates/starter/scripts/toolcraft-motion-reference-publication.fixtures.mjs +88 -0
- package/templates/starter/scripts/toolcraft-motion-reference-publication.mjs +249 -0
- package/templates/starter/scripts/toolcraft-motion-reference-publication.test.mjs +433 -0
- package/templates/starter/scripts/toolcraft-motion-reference-review-output.mjs +38 -0
- package/templates/starter/scripts/toolcraft-motion-reference-review-output.test.mjs +29 -0
- package/templates/starter/scripts/toolcraft-motion-reference-root-safety.test.mjs +84 -0
- package/templates/starter/scripts/toolcraft-motion-reference-roots.mjs +83 -0
- package/templates/starter/scripts/toolcraft-motion-reference-sampling.mjs +283 -0
- package/templates/starter/scripts/toolcraft-motion-reference-sampling.test.mjs +480 -0
- package/templates/starter/scripts/toolcraft-motion-reference-stage-registry.mjs +39 -0
- package/templates/starter/scripts/toolcraft-motion-reference-stage-registry.test.mjs +59 -0
- package/templates/starter/scripts/toolcraft-motion-reference-stage.mjs +71 -0
- package/templates/starter/scripts/toolcraft-motion-reference-stage.test.mjs +61 -0
- package/templates/starter/scripts/toolcraft-motion-review-numeric.mjs +74 -0
- package/templates/starter/scripts/toolcraft-motion-review-numeric.test.mjs +65 -0
- package/templates/starter/scripts/toolcraft-motion-review-partitioning.mjs +268 -0
- package/templates/starter/scripts/toolcraft-motion-review-partitioning.test.mjs +329 -0
- package/templates/starter/scripts/toolcraft-motion-review-protected-units.mjs +120 -0
- package/templates/starter/scripts/toolcraft-motion-review-protected-units.test.mjs +111 -0
- package/templates/starter/scripts/toolcraft-performance-escalation-policy.test.mjs +77 -345
- package/templates/starter/scripts/toolcraft-performance-receipt-validation.test.mjs +19 -21
- package/templates/starter/scripts/toolcraft-product-boundary-ast.mjs +1 -1
- package/templates/starter/scripts/toolcraft-product-export-boundary.mjs +10 -1
- package/templates/starter/scripts/toolcraft-product-export-boundary.test.mjs +5 -1
- package/templates/starter/scripts/toolcraft-product-observable-facade.test.mjs +46 -1
- package/templates/starter/scripts/toolcraft-receipt-boundary.test.mjs +0 -1
- package/templates/starter/scripts/toolcraft-source-inventory.d.mts +5 -0
- package/templates/starter/scripts/toolcraft-source-inventory.mjs +25 -14
- package/templates/starter/scripts/toolcraft-source-inventory.test.mjs +48 -0
- package/templates/starter/scripts/toolcraft-source-ownership.mjs +0 -1
- package/templates/starter/scripts/toolcraft-source-ownership.test.mjs +30 -5
- package/templates/starter/scripts/toolcraft-verification-receipt-test-helpers.mjs +5 -26
- package/templates/starter/scripts/toolcraft-verification-receipt.d.mts +0 -7
- package/templates/starter/scripts/toolcraft-verification-receipt.mjs +3 -47
- package/templates/starter/scripts/toolcraft-verification-receipt.test.mjs +6 -87
- package/templates/starter/scripts/toolcraft-vitest-runtime-contract.d.mts +19 -0
- package/templates/starter/scripts/toolcraft-vitest-runtime-contract.mjs +107 -0
- package/templates/starter/scripts/toolcraft-vitest-runtime-contract.test.mjs +114 -0
- package/templates/starter/scripts/toolcraft-vitest-runtime-evidence-reporter.mjs +13 -2
- package/templates/starter/scripts/toolcraft-vitest-runtime-evidence-reporter.test.mjs +110 -0
- package/templates/starter/src/app/acceptance/artifact-export-intent.ts +51 -20
- package/templates/starter/src/app/acceptance/canvas-coverage.ts +1 -0
- package/templates/starter/src/app/acceptance/color-bank-labels.ts +11 -15
- package/templates/starter/src/app/acceptance/color-row-grouping.ts +33 -0
- package/templates/starter/src/app/acceptance/control-acceptance-coverage.ts +0 -11
- package/templates/starter/src/app/acceptance/control-acceptance-policy.ts +2 -3
- package/templates/starter/src/app/acceptance/control-component-rules.ts +0 -10
- package/templates/starter/src/app/acceptance/control-labels.ts +30 -1
- package/templates/starter/src/app/acceptance/control-layout-section-rules.ts +18 -0
- package/templates/starter/src/app/acceptance/export-artifact-coverage.ts +25 -17
- package/templates/starter/src/app/acceptance/feature-verification-selection.test.ts +295 -0
- package/templates/starter/src/app/acceptance/feature-verification-selection.ts +161 -0
- package/templates/starter/src/app/acceptance/infinity-canvas.ts +10 -0
- package/templates/starter/src/app/acceptance/interaction-ownership-intent.ts +19 -1
- package/templates/starter/src/app/acceptance/interaction-ownership.ts +18 -2
- package/templates/starter/src/app/acceptance/motion-reference-evidence-validation.mjs +65 -0
- package/templates/starter/src/app/acceptance/motion-reference-evidence-windows.mjs +301 -0
- package/templates/starter/src/app/acceptance/motion-reference-evidence.d.mts +11 -0
- package/templates/starter/src/app/acceptance/motion-reference-evidence.mjs +145 -0
- package/templates/starter/src/app/acceptance/motion-reference-study-behaviors.ts +162 -0
- package/templates/starter/src/app/acceptance/motion-reference-study-coverage.ts +206 -0
- package/templates/starter/src/app/acceptance/motion-reference-study-identity.ts +129 -0
- package/templates/starter/src/app/acceptance/motion-reference-study-partitions.ts +186 -0
- package/templates/starter/src/app/acceptance/motion-reference-study.ts +90 -0
- package/templates/starter/src/app/acceptance/output-export-actions.test.ts +9 -1
- package/templates/starter/src/app/acceptance/output-export-actions.ts +14 -22
- package/templates/starter/src/app/acceptance/output-export-layout-rules.ts +5 -1
- package/templates/starter/src/app/acceptance/output-export-model.ts +4 -0
- package/templates/starter/src/app/acceptance/output-export.ts +4 -1
- package/templates/starter/src/app/acceptance/reference-study-types.ts +167 -17
- package/templates/starter/src/app/acceptance/runtime-coverage.ts +6 -1
- package/templates/starter/src/app/acceptance/selection-scope.test.ts +200 -0
- package/templates/starter/src/app/acceptance/selection-scope.ts +151 -0
- package/templates/starter/src/app/acceptance/transfer-mode-types.ts +114 -0
- package/templates/starter/src/app/acceptance/types.ts +43 -118
- package/templates/starter/src/app/acceptance/validate-coverage.ts +14 -3
- package/templates/starter/src/app/starter-acceptance-data.ts +1 -0
- package/templates/starter/src/app/starter-acceptance.animation-intent.test.ts +3 -0
- package/templates/starter/src/app/starter-acceptance.artifact-export-intent.test.ts +81 -8
- package/templates/starter/src/app/starter-acceptance.background-export.test.ts +2 -0
- package/templates/starter/src/app/starter-acceptance.canvas-sizing.test.ts +2 -0
- package/templates/starter/src/app/starter-acceptance.color-row-grouping.test.ts +118 -0
- package/templates/starter/src/app/starter-acceptance.compound-part-coverage.test.ts +1 -1
- package/templates/starter/src/app/starter-acceptance.contract-fixtures.ts +1 -0
- package/templates/starter/src/app/starter-acceptance.control-applicability.test.ts +1 -0
- package/templates/starter/src/app/starter-acceptance.control-label-context.test.ts +1 -0
- package/templates/starter/src/app/starter-acceptance.control-labels.test.ts +78 -3
- package/templates/starter/src/app/starter-acceptance.control-naming-rules.test.ts +77 -1
- package/templates/starter/src/app/starter-acceptance.custom-control-fit-check.test.ts +1 -1
- package/templates/starter/src/app/starter-acceptance.export-artifact.test.ts +74 -3
- package/templates/starter/src/app/starter-acceptance.export-test-utils.ts +5 -1
- package/templates/starter/src/app/starter-acceptance.image-export-settings.test.ts +2 -0
- package/templates/starter/src/app/starter-acceptance.interaction-ownership.test.ts +19 -3
- package/templates/starter/src/app/starter-acceptance.layers.test.ts +2 -1
- package/templates/starter/src/app/starter-acceptance.media-upload.test.ts +28 -0
- package/templates/starter/src/app/starter-acceptance.motion-reference-evidence.test.ts +17 -0
- package/templates/starter/src/app/starter-acceptance.motion-reference-identity.test.ts +163 -0
- package/templates/starter/src/app/starter-acceptance.motion-reference-mapping.test.ts +133 -0
- package/templates/starter/src/app/starter-acceptance.motion-reference-ownership.test.ts +121 -0
- package/templates/starter/src/app/starter-acceptance.motion-reference-partitions.test.ts +210 -0
- package/templates/starter/src/app/starter-acceptance.motion-reference-test-utils.ts +313 -0
- package/templates/starter/src/app/starter-acceptance.output-export-intent.test.ts +78 -4
- package/templates/starter/src/app/starter-acceptance.product-output-export.test.ts +6 -1
- package/templates/starter/src/app/starter-acceptance.product-readiness.test.ts +18 -1
- package/templates/starter/src/app/starter-acceptance.product-worklog.test.ts +123 -2
- package/templates/starter/src/app/starter-acceptance.reference-custom-timeline.test.ts +2 -0
- package/templates/starter/src/app/starter-acceptance.reference-foundation.test.ts +8 -0
- package/templates/starter/src/app/starter-acceptance.reference-timeline.test.ts +7 -0
- package/templates/starter/src/app/starter-acceptance.section-cohesion.test.ts +2 -0
- package/templates/starter/src/app/starter-acceptance.timeline-playback.test.ts +5 -0
- package/templates/starter/src/app/starter-acceptance.ts +34 -8
- package/templates/starter/src/app/starter-acceptance.video-export-settings.test.ts +2 -0
- package/templates/starter/src/app/starter-acceptance.video-reference-study.test.ts +34 -236
- package/templates/starter/src/app/starter-acceptance.view-interaction.test.ts +4 -0
- package/templates/starter/src/app/starter-acceptance.worklog-test-utils.ts +122 -6
- package/templates/starter/src/app/starter-acceptance.worklog.test.ts +152 -16
- package/templates/starter/src/app/starter-performance.gates.test.ts +20 -18
- package/templates/starter/src/app/starter-performance.lifecycle.test.ts +22 -6
- package/templates/starter/src/app/test-evidence/browser-runtime-contract.ts +3 -0
- package/templates/starter/tsconfig.json +1 -0
- package/templates/starter/scripts/toolcraft-browser-impact-selection.mjs +0 -26
- package/templates/starter/scripts/toolcraft-delivery-framework-refresh.test.mjs +0 -141
- package/templates/starter/scripts/toolcraft-delivery-functional-changed.test.mjs +0 -468
- package/templates/starter/scripts/toolcraft-delivery-functional-model-lifecycle.test.mjs +0 -254
- package/templates/starter/scripts/toolcraft-delivery-functional-semantic-regression.test.mjs +0 -135
- package/templates/starter/scripts/toolcraft-delivery-performance-iteration-durability.test.mjs +0 -329
- package/templates/starter/scripts/toolcraft-delivery-plan-errors.test.mjs +0 -430
- package/templates/starter/scripts/toolcraft-delivery-plan-functional-model.test.mjs +0 -358
- package/templates/starter/scripts/toolcraft-functional-proof-regression-fixtures.mjs +0 -298
- package/templates/starter/scripts/toolcraft-verification-impact-inventory.d.mts +0 -62
- package/templates/starter/scripts/toolcraft-verification-impact-inventory.mjs +0 -344
- package/templates/starter/scripts/toolcraft-verification-impact-inventory.test.mjs +0 -204
- package/templates/starter/scripts/toolcraft-verification-impact-performance-candidates.test.mjs +0 -210
- package/templates/starter/scripts/toolcraft-verification-impact-resolution.mjs +0 -344
- package/templates/starter/scripts/toolcraft-verification-impact-resolution.test.mjs +0 -270
- package/templates/starter/scripts/toolcraft-verification-impact-semantic-resolution.test.mjs +0 -449
- package/templates/starter/scripts/toolcraft-verification-impact-support-resolution.test.mjs +0 -195
- package/templates/starter/scripts/toolcraft-verification-impact.d.mts +0 -132
- package/templates/starter/scripts/toolcraft-verification-impact.mjs +0 -169
- package/templates/starter/scripts/toolcraft-verification-impact.test.mjs +0 -300
- package/templates/starter/scripts/toolcraft-verification-input-roles.mjs +0 -197
- package/templates/starter/scripts/toolcraft-verification-input-roles.test.mjs +0 -225
- package/templates/starter/src/app/acceptance/video-reference-study.ts +0 -217
- package/templates/starter/src/app/starter-verification-impact.json +0 -15
package/package.json
CHANGED
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
} from "./dependency-install.mjs";
|
|
19
19
|
import { generateToolcraft } from "./generate.mjs";
|
|
20
20
|
|
|
21
|
-
test("fresh generated app runs initial proof then
|
|
21
|
+
test("fresh generated app runs one initial proof then focused material verification", async (t) => {
|
|
22
22
|
const tempRoot = await fs.mkdtemp(
|
|
23
23
|
path.join(os.tmpdir(), "toolcraft-demand-only-lifecycle-"),
|
|
24
24
|
);
|
|
@@ -97,6 +97,14 @@ test("fresh generated app runs initial proof then one semantic material delivery
|
|
|
97
97
|
command: "pnpm",
|
|
98
98
|
},
|
|
99
99
|
{ args: ["verify:delivery"], command: "pnpm" },
|
|
100
|
+
{
|
|
101
|
+
args: ["exec", "vitest", "run", "src/app/material-output.test.tsx"],
|
|
102
|
+
command: "pnpm",
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
args: ["test:feature", "--", "material.layer"],
|
|
106
|
+
command: "pnpm",
|
|
107
|
+
},
|
|
100
108
|
{ args: ["verify:delivery"], command: "pnpm" },
|
|
101
109
|
]);
|
|
102
110
|
});
|
|
@@ -50,7 +50,7 @@ test("generated standalone app preserves authority-bound performance iteration l
|
|
|
50
50
|
receiptModule.TOOLCRAFT_DELIVERY_RECEIPT_VERSION,
|
|
51
51
|
targetedReportModule.TOOLCRAFT_TARGETED_PERFORMANCE_REPORT_VERSION,
|
|
52
52
|
],
|
|
53
|
-
[1,
|
|
53
|
+
[1, 6, 8, 3],
|
|
54
54
|
);
|
|
55
55
|
const authorityPolicySource = await fs.readFile(
|
|
56
56
|
path.join(
|
|
@@ -99,7 +99,7 @@ test("generated standalone app preserves authority-bound performance iteration l
|
|
|
99
99
|
}
|
|
100
100
|
const output = `${stdout}\n${stderr}`;
|
|
101
101
|
assert.doesNotMatch(output, /ERR_MODULE_NOT_FOUND/u);
|
|
102
|
-
assert.match(output, /^# tests
|
|
103
|
-
assert.match(output, /^# pass
|
|
102
|
+
assert.match(output, /^# tests 7$/mu);
|
|
103
|
+
assert.match(output, /^# pass 7$/mu);
|
|
104
104
|
assert.match(output, /^# fail 0$/mu);
|
|
105
105
|
});
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
2
|
import fs from "node:fs/promises";
|
|
3
3
|
import path from "node:path";
|
|
4
|
-
import { pathToFileURL } from "node:url";
|
|
5
4
|
|
|
6
5
|
export const deliveryArchitecturePaths = Object.freeze([
|
|
7
6
|
"e2e/toolcraft-delivery-catalog-reporter.ts",
|
|
8
7
|
"scripts/run-delivery-verification.mjs",
|
|
9
8
|
"scripts/toolcraft-delivery-anchor.mjs",
|
|
10
9
|
"scripts/toolcraft-delivery-executor.mjs",
|
|
10
|
+
"scripts/toolcraft-delivery-lifecycle.mjs",
|
|
11
11
|
"scripts/toolcraft-delivery-functional-context.d.mts",
|
|
12
12
|
"scripts/toolcraft-delivery-functional-context.mjs",
|
|
13
13
|
"scripts/toolcraft-delivery-plan-construction.mjs",
|
|
@@ -17,64 +17,12 @@ export const deliveryArchitecturePaths = Object.freeze([
|
|
|
17
17
|
"scripts/toolcraft-functional-proof-primitives.d.mts",
|
|
18
18
|
"scripts/toolcraft-functional-proof-primitives.mjs",
|
|
19
19
|
"scripts/toolcraft-proof-process.mjs",
|
|
20
|
-
"scripts/toolcraft-verification-impact-inventory.d.mts",
|
|
21
|
-
"scripts/toolcraft-verification-impact-inventory.mjs",
|
|
22
|
-
"scripts/toolcraft-verification-impact.mjs",
|
|
23
|
-
"scripts/toolcraft-verification-input-roles.d.mts",
|
|
24
|
-
"scripts/toolcraft-verification-input-roles.mjs",
|
|
25
20
|
]);
|
|
26
21
|
|
|
27
22
|
async function readGeneratedScript(targetDir, relativePath) {
|
|
28
23
|
return fs.readFile(path.join(targetDir, "scripts", relativePath), "utf8");
|
|
29
24
|
}
|
|
30
25
|
|
|
31
|
-
async function assertGeneratedInputRoleBehavior(targetDir) {
|
|
32
|
-
const scriptsDir = path.join(targetDir, "scripts");
|
|
33
|
-
const [
|
|
34
|
-
{ toolcraftVerificationInputRootFamilies },
|
|
35
|
-
{ createToolcraftProductVerificationContext },
|
|
36
|
-
] = await Promise.all([
|
|
37
|
-
import(
|
|
38
|
-
pathToFileURL(
|
|
39
|
-
path.join(
|
|
40
|
-
scriptsDir,
|
|
41
|
-
"toolcraft-verification-input-roles.mjs",
|
|
42
|
-
),
|
|
43
|
-
).href
|
|
44
|
-
),
|
|
45
|
-
import(
|
|
46
|
-
pathToFileURL(
|
|
47
|
-
path.join(scriptsDir, "toolcraft-verification-impact.mjs"),
|
|
48
|
-
).href
|
|
49
|
-
),
|
|
50
|
-
]);
|
|
51
|
-
const { generated, starter } = toolcraftVerificationInputRootFamilies;
|
|
52
|
-
const generatedPaths = [
|
|
53
|
-
...generated.runtimeRootPaths,
|
|
54
|
-
...generated.semanticProofRootPaths,
|
|
55
|
-
];
|
|
56
|
-
const starterPaths = [
|
|
57
|
-
...starter.runtimeRootPaths,
|
|
58
|
-
...starter.semanticProofRootPaths,
|
|
59
|
-
];
|
|
60
|
-
assert.equal(
|
|
61
|
-
generatedPaths.some((repoPath) => starterPaths.includes(repoPath)),
|
|
62
|
-
false,
|
|
63
|
-
"Generated and starter semantic root families must stay distinct.",
|
|
64
|
-
);
|
|
65
|
-
const { inputRoles: roles } =
|
|
66
|
-
await createToolcraftProductVerificationContext(targetDir);
|
|
67
|
-
assert.equal(roles.rootFamily, generated.name);
|
|
68
|
-
assert.equal(
|
|
69
|
-
roles.impactInventoryPath,
|
|
70
|
-
generated.impactInventoryPath,
|
|
71
|
-
);
|
|
72
|
-
assert.equal(
|
|
73
|
-
roles.runtimeProductionPaths.includes(generated.compositionPath),
|
|
74
|
-
true,
|
|
75
|
-
);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
26
|
export async function assertGeneratedDeliveryArchitecture(targetDir) {
|
|
79
27
|
for (const relativePath of deliveryArchitecturePaths) {
|
|
80
28
|
assert.ok(
|
|
@@ -82,15 +30,14 @@ export async function assertGeneratedDeliveryArchitecture(targetDir) {
|
|
|
82
30
|
`Generated output must contain ${relativePath}.`,
|
|
83
31
|
);
|
|
84
32
|
}
|
|
85
|
-
|
|
86
33
|
const sources = {
|
|
87
34
|
catalog: await readGeneratedScript(
|
|
88
35
|
targetDir,
|
|
89
36
|
"playwright-test-title-selection.mjs",
|
|
90
37
|
),
|
|
91
|
-
|
|
38
|
+
lifecycle: await readGeneratedScript(
|
|
92
39
|
targetDir,
|
|
93
|
-
"toolcraft-
|
|
40
|
+
"toolcraft-delivery-lifecycle.mjs",
|
|
94
41
|
),
|
|
95
42
|
model: await readGeneratedScript(
|
|
96
43
|
targetDir,
|
|
@@ -104,34 +51,25 @@ export async function assertGeneratedDeliveryArchitecture(targetDir) {
|
|
|
104
51
|
targetDir,
|
|
105
52
|
"toolcraft-delivery-receipt.mjs",
|
|
106
53
|
),
|
|
107
|
-
resolution: await readGeneratedScript(
|
|
108
|
-
targetDir,
|
|
109
|
-
"toolcraft-verification-impact-resolution.mjs",
|
|
110
|
-
),
|
|
111
54
|
};
|
|
112
55
|
|
|
113
56
|
assert.match(sources.catalog, /Delivery catalog\.version must be 2/);
|
|
114
|
-
assert.match(
|
|
115
|
-
sources.impact,
|
|
116
|
-
/TOOLCRAFT_VERIFICATION_IMPACT_VERSION = 3/,
|
|
117
|
-
);
|
|
118
57
|
assert.match(
|
|
119
58
|
sources.model,
|
|
120
|
-
/TOOLCRAFT_FUNCTIONAL_PROOF_MODEL_VERSION =
|
|
59
|
+
/TOOLCRAFT_FUNCTIONAL_PROOF_MODEL_VERSION = 2/,
|
|
121
60
|
);
|
|
122
|
-
assert.match(sources.plan, /TOOLCRAFT_DELIVERY_PLAN_VERSION =
|
|
123
|
-
assert.match(sources.receipt, /TOOLCRAFT_DELIVERY_RECEIPT_VERSION =
|
|
124
|
-
assert.
|
|
125
|
-
sources.
|
|
126
|
-
/
|
|
61
|
+
assert.match(sources.plan, /TOOLCRAFT_DELIVERY_PLAN_VERSION = 6/);
|
|
62
|
+
assert.match(sources.receipt, /TOOLCRAFT_DELIVERY_RECEIPT_VERSION = 8/);
|
|
63
|
+
assert.match(
|
|
64
|
+
sources.lifecycle,
|
|
65
|
+
/TOOLCRAFT_INITIAL_PROOF_ALREADY_COMPLETE/,
|
|
127
66
|
);
|
|
128
67
|
assert.doesNotMatch(
|
|
129
68
|
sources.plan,
|
|
130
|
-
/TOOLCRAFT_DELIVERY_PLAN_VERSION = [
|
|
69
|
+
/TOOLCRAFT_DELIVERY_PLAN_VERSION = [1-5]\b/,
|
|
131
70
|
);
|
|
132
71
|
assert.doesNotMatch(
|
|
133
72
|
sources.receipt,
|
|
134
|
-
/TOOLCRAFT_DELIVERY_RECEIPT_VERSION = [1-
|
|
73
|
+
/TOOLCRAFT_DELIVERY_RECEIPT_VERSION = [1-7]\b/,
|
|
135
74
|
);
|
|
136
|
-
await assertGeneratedInputRoleBehavior(targetDir);
|
|
137
75
|
}
|
|
@@ -5,17 +5,17 @@ import path from "node:path";
|
|
|
5
5
|
import {
|
|
6
6
|
loadGeneratedProofModule,
|
|
7
7
|
runGeneratedCommand,
|
|
8
|
+
runGeneratedExecutable,
|
|
9
|
+
runGeneratedScript,
|
|
8
10
|
} from "./generate-test-dependency-sandbox.mjs";
|
|
9
11
|
import {
|
|
10
12
|
assertGeneratedInitialFunctionalDelivery,
|
|
11
|
-
assertGeneratedLaterFunctionalDelivery,
|
|
12
13
|
} from "./generate-test-standalone-delivery-stages.mjs";
|
|
13
14
|
import {
|
|
14
15
|
writeGeneratedProductFixture,
|
|
15
16
|
} from "./generate-test-product-fixture.mjs";
|
|
16
17
|
import {
|
|
17
18
|
applyGeneratedProductMaterialIteration,
|
|
18
|
-
generatedProductMaterialIterationFixturePaths,
|
|
19
19
|
} from "./generate-test-product-iteration.mjs";
|
|
20
20
|
const materialAcceptanceIds = Object.freeze([
|
|
21
21
|
"material.chocolate",
|
|
@@ -35,30 +35,6 @@ const materialBrowserTestNames = Object.freeze([
|
|
|
35
35
|
"browser: sprinkle color changes material output",
|
|
36
36
|
"browser: sprinkles visibility changes material output",
|
|
37
37
|
]);
|
|
38
|
-
const materialDeliveryBrowserTestNames = Object.freeze([
|
|
39
|
-
"browser: ambient speed changes product output",
|
|
40
|
-
...materialBrowserTestNames,
|
|
41
|
-
"browser: timeline playback drives product output",
|
|
42
|
-
]);
|
|
43
|
-
const materialDeliveryAcceptanceIds = Object.freeze([
|
|
44
|
-
"animation.speed",
|
|
45
|
-
...materialAcceptanceIds,
|
|
46
|
-
"runtime.timeline",
|
|
47
|
-
]);
|
|
48
|
-
const materialProductTestFiles = Object.freeze([
|
|
49
|
-
"src/app/acceptance/validation-pipeline.test.ts",
|
|
50
|
-
"src/app/app-acceptance.base-coverage.test.ts",
|
|
51
|
-
"src/app/app-acceptance.product-output-export.test.ts",
|
|
52
|
-
"src/app/app-acceptance.product-readiness.test.ts",
|
|
53
|
-
"src/app/app-acceptance.product-worklog.test.ts",
|
|
54
|
-
"src/app/app-automated-runtime-evidence.test.ts",
|
|
55
|
-
"src/app/app-performance.fixture-helper.test.ts",
|
|
56
|
-
"src/app/app-performance.gates.test.ts",
|
|
57
|
-
"src/app/app-performance.lifecycle.test.ts",
|
|
58
|
-
"src/app/app-schema.test.ts",
|
|
59
|
-
"src/app/material-output.test.tsx",
|
|
60
|
-
]);
|
|
61
|
-
|
|
62
38
|
function deepFreeze(value) {
|
|
63
39
|
if (value && typeof value === "object" && !Object.isFrozen(value)) {
|
|
64
40
|
Object.values(value).forEach(deepFreeze);
|
|
@@ -131,6 +107,7 @@ async function loadInitialPlan({ targetDir }) {
|
|
|
131
107
|
const functionalContext =
|
|
132
108
|
await collectToolcraftDeliveryFunctionalContext(targetDir);
|
|
133
109
|
const planningInputs = await loadToolcraftDeliveryPlanningInputs({
|
|
110
|
+
authority: null,
|
|
134
111
|
currentInventory,
|
|
135
112
|
functionalContext,
|
|
136
113
|
integrity,
|
|
@@ -200,10 +177,11 @@ async function assertMalformedFunctionalPlanFailsClosed({
|
|
|
200
177
|
getEscalationRecommendation: () => null,
|
|
201
178
|
loadPlanningInputs: async () => fixture.planningInputs,
|
|
202
179
|
readDeliveryAnchor: async () => ({ missing: true }),
|
|
180
|
+
readPerformanceAuthority: async () => null,
|
|
203
181
|
}),
|
|
204
182
|
projectDir: targetDir,
|
|
205
183
|
}),
|
|
206
|
-
/functional
|
|
184
|
+
/initial delivery proof is not the fixed complete functional proof/iu,
|
|
207
185
|
);
|
|
208
186
|
assert.deepEqual(proofCalls, []);
|
|
209
187
|
assert.equal(checkpointWrites, 0);
|
|
@@ -287,6 +265,7 @@ export async function assertGeneratedFreshDemandOnlyLifecycle({
|
|
|
287
265
|
execFileAsync,
|
|
288
266
|
targetDir,
|
|
289
267
|
});
|
|
268
|
+
const initialCheckpointBytes = await fs.readFile(checkpointPath);
|
|
290
269
|
await applyGeneratedProductMaterialIteration(targetDir);
|
|
291
270
|
const materialCatalog = await collectToolcraftDeliveryCatalog(targetDir);
|
|
292
271
|
const materialRows = materialCatalog.acceptance.filter(
|
|
@@ -300,15 +279,34 @@ export async function assertGeneratedFreshDemandOnlyLifecycle({
|
|
|
300
279
|
materialRows.map(({ testName }) => testName).sort(),
|
|
301
280
|
materialBrowserTestNames,
|
|
302
281
|
);
|
|
303
|
-
await
|
|
304
|
-
acceptanceCatalog: materialCatalog.acceptance,
|
|
305
|
-
browserEnv,
|
|
306
|
-
checkpointPath,
|
|
282
|
+
await runGeneratedExecutable(
|
|
307
283
|
execFileAsync,
|
|
308
|
-
expectedAcceptanceIds: materialDeliveryAcceptanceIds,
|
|
309
|
-
expectedBrowserTestNames: materialDeliveryBrowserTestNames,
|
|
310
|
-
expectedChangedFiles: generatedProductMaterialIterationFixturePaths,
|
|
311
|
-
expectedProductTestFiles: materialProductTestFiles,
|
|
312
284
|
targetDir,
|
|
313
|
-
|
|
285
|
+
"vitest",
|
|
286
|
+
["run", "src/app/material-output.test.tsx"],
|
|
287
|
+
);
|
|
288
|
+
const focusedResult = await runGeneratedCommand(
|
|
289
|
+
execFileAsync,
|
|
290
|
+
targetDir,
|
|
291
|
+
["test:feature", "--", "material.layer"],
|
|
292
|
+
{ env: browserEnv },
|
|
293
|
+
);
|
|
294
|
+
const focusedOutput = `${focusedResult.stdout ?? ""}\n${focusedResult.stderr ?? ""}`;
|
|
295
|
+
for (const acceptanceId of materialAcceptanceIds.filter(
|
|
296
|
+
(id) => id !== "material.exportedAppearance",
|
|
297
|
+
)) {
|
|
298
|
+
assert.match(focusedOutput, new RegExp(acceptanceId.replace(".", "\\."), "u"));
|
|
299
|
+
}
|
|
300
|
+
assert.doesNotMatch(focusedOutput, /material\.exportedAppearance/u);
|
|
301
|
+
assert.doesNotMatch(focusedOutput, /actions\.output|canvas\.|lighting\./u);
|
|
302
|
+
await runGeneratedScript(
|
|
303
|
+
execFileAsync,
|
|
304
|
+
targetDir,
|
|
305
|
+
"verify:delivery",
|
|
306
|
+
);
|
|
307
|
+
assert.deepEqual(
|
|
308
|
+
await fs.readFile(checkpointPath),
|
|
309
|
+
initialCheckpointBytes,
|
|
310
|
+
"A repeated ordinary delivery command must preserve the initial checkpoint byte-for-byte.",
|
|
311
|
+
);
|
|
314
312
|
}
|
|
@@ -103,7 +103,10 @@ export async function withDeclaredDependencySandbox(targetDir, callback) {
|
|
|
103
103
|
}
|
|
104
104
|
}
|
|
105
105
|
|
|
106
|
-
function createGeneratedCommandEnvironment(
|
|
106
|
+
export function createGeneratedCommandEnvironment(
|
|
107
|
+
packageManager,
|
|
108
|
+
overrides = {},
|
|
109
|
+
) {
|
|
107
110
|
const childEnv = {
|
|
108
111
|
...process.env,
|
|
109
112
|
...overrides,
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
getMissingGeneratedPerformanceLifecycleMarkers,
|
|
9
9
|
getStaleAgentPerformanceWorkflowFailures,
|
|
10
10
|
} from "./generate-test-doc-policy-assertions.mjs";
|
|
11
|
+
import { assertGeneratedExportDocs } from "./generate-test-export-doc-assertions.mjs";
|
|
11
12
|
|
|
12
13
|
export {
|
|
13
14
|
assertGeneratedExportIntentDocsDoNotInferVideo,
|
|
@@ -80,12 +81,15 @@ export async function assertGeneratedDocs(targetDir) {
|
|
|
80
81
|
assert.match(agentsSource, /Verification Tier Classifier/);
|
|
81
82
|
assert.match(agentsSource, /Verification tier: Tier N/);
|
|
82
83
|
assert.match(agentsSource, /npm run verify:delivery/);
|
|
83
|
-
assert.match(agentsSource, /
|
|
84
|
+
assert.match(agentsSource, /first product delivery/i);
|
|
84
85
|
assert.match(
|
|
85
86
|
agentsSource,
|
|
86
|
-
/toolcraft-performance-lifecycle: first-delivery=functional; later-
|
|
87
|
+
/toolcraft-performance-lifecycle: first-delivery=functional-complete; later-edits=focused-only; complaint=one-authority-targeted-performance-iteration; full-audit=explicit-only/,
|
|
88
|
+
);
|
|
89
|
+
assert.match(
|
|
90
|
+
agentsSource,
|
|
91
|
+
/repeated bare `verify:delivery` exits before inventory, build, tests, export, and performance work/is,
|
|
87
92
|
);
|
|
88
|
-
assert.match(agentsSource, /bare `npm run verify:delivery` derives the required proof/i);
|
|
89
93
|
assert.match(
|
|
90
94
|
agentsSource,
|
|
91
95
|
/only exact request authority[^\n]*measured targeted performance/i,
|
|
@@ -94,7 +98,7 @@ export async function assertGeneratedDocs(targetDir) {
|
|
|
94
98
|
agentsSource,
|
|
95
99
|
/during development[^\n]*affected performance scenarios|targeted performance scenarios only for touched/i,
|
|
96
100
|
);
|
|
97
|
-
assert.match(agentsSource, /
|
|
101
|
+
assert.match(agentsSource, /ordinary edits use only the smallest feature-focused tests and browser checks/i);
|
|
98
102
|
assert.match(agentsSource, /does not depend only on a mutable package script/i);
|
|
99
103
|
assert.match(agentsSource, /pnpm ai:check/);
|
|
100
104
|
assert.match(agentsSource, /use `brainstorming`/);
|
|
@@ -102,6 +106,7 @@ export async function assertGeneratedDocs(targetDir) {
|
|
|
102
106
|
assert.match(agentsSource, /use `systematic-debugging`/);
|
|
103
107
|
assert.match(agentsSource, /browser` workflow/);
|
|
104
108
|
assert.match(agentsSource, /pnpm test:browser/);
|
|
109
|
+
assert.match(agentsSource, /npm run test:feature --/);
|
|
105
110
|
assert.match(agentsSource, /signed local `AGENTS\.md` and `docs\/toolcraft\/\*` files are the mandatory workflow authority/i);
|
|
106
111
|
assert.match(agentsSource, /generated with `--no-skills`, continue through the equivalent signed local workflow/i);
|
|
107
112
|
assert.match(agentsSource, /Do not silently ignore a missing workflow capability/);
|
|
@@ -116,6 +121,8 @@ export async function assertGeneratedDocs(targetDir) {
|
|
|
116
121
|
assert.match(agentsSource, /exportRenderer/);
|
|
117
122
|
assert.match(agentsSource, /renderDefaultCanvasMedia=\{false\}/);
|
|
118
123
|
assert.match(agentsSource, /onPanelAction/);
|
|
124
|
+
assert.match(agentsSource, /canonical runtime representation across defaults, live edits, persistence, settings import, and keyframes/i);
|
|
125
|
+
assert.match(agentsSource, /property edits declare `selectionScope` as global or selected-entity/i);
|
|
119
126
|
assert.match(agentsSource, /MIT License/);
|
|
120
127
|
assert.match(agentsSource, /LICENSE\.md/);
|
|
121
128
|
assert.match(agentsSource, /NOTICE\.md/);
|
|
@@ -156,6 +163,10 @@ export async function assertGeneratedDocs(targetDir) {
|
|
|
156
163
|
path.join(targetDir, "docs/toolcraft/core/timeline-animation.md"),
|
|
157
164
|
"utf8",
|
|
158
165
|
);
|
|
166
|
+
const coreReferenceStudySource = await fs.readFile(
|
|
167
|
+
path.join(targetDir, "docs/toolcraft/core/reference-study.md"),
|
|
168
|
+
"utf8",
|
|
169
|
+
);
|
|
159
170
|
|
|
160
171
|
assert.match(componentRulesSource, /Slider `step` means numeric snapping only/);
|
|
161
172
|
assert.match(componentRulesSource, /variant: "discrete"/);
|
|
@@ -189,48 +200,32 @@ export async function assertGeneratedDocs(targetDir) {
|
|
|
189
200
|
assert.match(coreRuntimeBoundarySource, /copied runtime tree or its signed integrity manifest is missing/);
|
|
190
201
|
assert.match(coreRuntimeBoundarySource, /modelPresentation/);
|
|
191
202
|
assert.match(coreRuntimeBoundarySource, /exportRenderer/);
|
|
192
|
-
assert.match(coreRuntimeBoundarySource, /runtime owns typed image\/video actions end to end/i);
|
|
193
203
|
assert.match(coreRuntimeBoundarySource, /does not suppress runtime model layers/);
|
|
194
204
|
assert.match(componentRulesSource, /Do not show Layers for a single-layer app/);
|
|
195
205
|
assert.match(coreTimelineSource, /Any app with `Export Video` must enable the top Toolcraft timeline/);
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
/image[^\n]*`user-requested`[^\n]*non-empty[^\n]*evidence/i,
|
|
208
|
-
);
|
|
209
|
-
assert.match(
|
|
210
|
-
coreSetupExportSource,
|
|
211
|
-
/image[^\n]*`user-removed`[^\n]*non-empty[^\n]*evidence/i,
|
|
212
|
-
);
|
|
213
|
-
assert.match(
|
|
214
|
-
coreSetupExportSource,
|
|
215
|
-
/video[^\n]*`user-requested`[^\n]*non-empty[^\n]*evidence/i,
|
|
216
|
-
);
|
|
217
|
-
for (const decisionStep of [
|
|
218
|
-
"Start every product with image export.",
|
|
219
|
-
"Add video export only when the user explicitly requests video delivery.",
|
|
220
|
-
"Do not infer video from animation, playback, keyframes, or timeline.",
|
|
221
|
-
"Keep image with video unless the user explicitly requests removal.",
|
|
222
|
-
"Record in `productReadiness.exportIntent`.",
|
|
206
|
+
for (const requiredReferenceStudyTerm of [
|
|
207
|
+
"npm run reference:study",
|
|
208
|
+
"--kind",
|
|
209
|
+
"--grid",
|
|
210
|
+
"--fps",
|
|
211
|
+
"--timestamps-file",
|
|
212
|
+
"12 FPS",
|
|
213
|
+
"120",
|
|
214
|
+
"referenceInputs",
|
|
215
|
+
"reference-parity",
|
|
216
|
+
"no-reference fast path",
|
|
223
217
|
]) {
|
|
224
|
-
assert.
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
`
|
|
218
|
+
assert.match(
|
|
219
|
+
coreReferenceStudySource,
|
|
220
|
+
new RegExp(requiredReferenceStudyTerm.replace(/[.*+?^${}()|[\]\\]/gu, "\\$&"), "iu"),
|
|
221
|
+
`Core reference-study docs must mention ${requiredReferenceStudyTerm}.`,
|
|
228
222
|
);
|
|
229
223
|
}
|
|
230
|
-
|
|
224
|
+
assertGeneratedExportDocs({
|
|
225
|
+
agentsSource,
|
|
226
|
+
coreRuntimeBoundarySource,
|
|
231
227
|
coreSetupExportSource,
|
|
232
|
-
|
|
233
|
-
);
|
|
228
|
+
});
|
|
234
229
|
assert.match(coreSetupExportSource, /renderScaleCoverage/);
|
|
235
230
|
assert.match(coreSetupExportSource, /selected-backing-pixels/);
|
|
236
231
|
assert.match(coreSetupExportSource, /canvas-render-scale-backing/);
|
|
@@ -281,7 +276,8 @@ export async function assertGeneratedDocs(targetDir) {
|
|
|
281
276
|
assert.match(acceptanceDocsSource, /Framework meta-tests are product-invariant/);
|
|
282
277
|
assert.match(acceptanceDocsSource, /protected neutral contract fixtures/);
|
|
283
278
|
assert.match(acceptanceDocsSource, /do not edit supplied `app-performance\.\*` meta-tests/i);
|
|
284
|
-
assert.match(acceptanceDocsSource, /
|
|
279
|
+
assert.match(acceptanceDocsSource, /Later ordinary edits do not derive an aggregate proof model/i);
|
|
280
|
+
assert.match(acceptanceDocsSource, /^(?=[\s\S]*test:feature)(?=[\s\S]*semantic)(?=[\s\S]*--all[\s\S]*product acceptance)/i);
|
|
285
281
|
assert.match(acceptanceDocsSource, /app-kernel-benchmarks\.ts/);
|
|
286
282
|
assert.match(acceptanceDocsSource, /renderScaleCoverage/);
|
|
287
283
|
assert.match(acceptanceDocsSource, /selected-backing-pixels/);
|
|
@@ -296,14 +292,8 @@ export async function assertGeneratedDocs(targetDir) {
|
|
|
296
292
|
);
|
|
297
293
|
assert.match(acceptanceDocsSource, /actual encoded packet metadata/i);
|
|
298
294
|
assert.match(acceptanceDocsSource, /distinct decoded frame hashes/i);
|
|
299
|
-
assert.match(
|
|
300
|
-
|
|
301
|
-
/Each browser file owns one acceptance domain/i,
|
|
302
|
-
);
|
|
303
|
-
assert.match(
|
|
304
|
-
acceptanceDocsSource,
|
|
305
|
-
/proof and test paths cannot own them/i,
|
|
306
|
-
);
|
|
295
|
+
assert.match(acceptanceDocsSource, /selectionScopeCoverage: "two-entity-isolation"/);
|
|
296
|
+
assert.match(acceptanceDocsSource, /editing A changes only A, editing B changes only B/i);
|
|
307
297
|
for (const coverage of [
|
|
308
298
|
"package-extraction",
|
|
309
299
|
"deterministic-root-selection",
|
|
@@ -339,6 +329,14 @@ export async function assertGeneratedDocs(targetDir) {
|
|
|
339
329
|
path.join(targetDir, "docs/toolcraft/core/performance.md"),
|
|
340
330
|
"utf8",
|
|
341
331
|
);
|
|
332
|
+
const schemaDocsSource = await fs.readFile(
|
|
333
|
+
path.join(targetDir, "docs/toolcraft/schema-reference.md"),
|
|
334
|
+
"utf8",
|
|
335
|
+
);
|
|
336
|
+
assert.match(schemaDocsSource, /one canonical runtime value model/i);
|
|
337
|
+
assert.match(schemaDocsSource, /`color` state is an expanded uppercase `#RRGGBB` string/i);
|
|
338
|
+
assert.match(componentRulesSource, /Built-in controls own canonical runtime values/i);
|
|
339
|
+
assert.match(worklogDocsSource, /Canonical control values and selected-entity isolation/i);
|
|
342
340
|
assert.deepEqual(
|
|
343
341
|
getMissingGeneratedPerformanceLifecycleMarkers([
|
|
344
342
|
{ docPath: "workflow.md", source: workflowDocsSource },
|
|
@@ -357,6 +355,7 @@ export async function assertGeneratedDocs(targetDir) {
|
|
|
357
355
|
assert.match(rendererDocsSource, /combined fixtures/i);
|
|
358
356
|
assert.match(rendererDocsSource, /modelPresentation/);
|
|
359
357
|
assert.match(rendererDocsSource, /ToolcraftAppComposition\.exportRenderer/);
|
|
358
|
+
assert.match(rendererDocsSource, /svgExportRenderer/);
|
|
360
359
|
assert.match(rendererDocsSource, /useToolcraftModelPresentationConsumer/);
|
|
361
360
|
assert.match(rendererDocsSource, /acquirePresentation/);
|
|
362
361
|
assert.match(rendererDocsSource, /lease\.release/);
|
|
@@ -387,9 +386,12 @@ export async function assertGeneratedDocs(targetDir) {
|
|
|
387
386
|
);
|
|
388
387
|
assert.match(corePerformanceDocsSource, /exact 30 FPS packet cadence[\s\S]*functional correctness/i);
|
|
389
388
|
assert.match(performanceDocsSource, /exact 30 FPS packet cadence[\s\S]*functional proof/i);
|
|
390
|
-
assert.match(performanceDocsSource, /
|
|
389
|
+
assert.match(performanceDocsSource, /first product delivery/i);
|
|
391
390
|
assert.match(performanceDocsSource, /verify:delivery/);
|
|
392
|
-
assert.match(
|
|
391
|
+
assert.match(
|
|
392
|
+
performanceDocsSource,
|
|
393
|
+
/repeated bare `verify:delivery` exits before inventory, build, tests, export, and performance work/i,
|
|
394
|
+
);
|
|
393
395
|
assert.match(performanceDocsSource, /performance-iteration/);
|
|
394
396
|
assert.match(performanceDocsSource, /renderScaleCoverage/);
|
|
395
397
|
assert.match(performanceDocsSource, /canvas-render-scale-backing/);
|
|
@@ -416,15 +418,15 @@ export async function assertGeneratedDocs(targetDir) {
|
|
|
416
418
|
assert.match(performanceDocsSource, /Use bare `npm run verify:delivery` once/i);
|
|
417
419
|
assert.match(
|
|
418
420
|
workflowDocsSource,
|
|
419
|
-
/
|
|
421
|
+
/Later ordinary edits:[^\n]*exact unit\/component test[^\n]*npm run test:feature -- <acceptance-id>/i,
|
|
420
422
|
);
|
|
421
423
|
assert.match(
|
|
422
424
|
workflowDocsSource,
|
|
423
|
-
/
|
|
425
|
+
/repeated bare `npm run verify:delivery` is a protected no-op[^\n]*exits before inventory, build, tests, export, and performance work/i,
|
|
424
426
|
);
|
|
425
427
|
assert.match(
|
|
426
428
|
workflowDocsSource,
|
|
427
|
-
/do not rerun the aggregate, export, or performance matrix after
|
|
429
|
+
/do not rerun the aggregate, export, or performance matrix after edits/i,
|
|
428
430
|
);
|
|
429
431
|
assert.match(
|
|
430
432
|
performanceDocsSource,
|
|
@@ -90,7 +90,7 @@ test("requires adaptive routing in every generated performance lifecycle documen
|
|
|
90
90
|
const routingMarker =
|
|
91
91
|
"<!-- toolcraft-performance-routing: localized=agent-targeted; ambiguous=one-user-facing-choice; broad=offer-targeted-or-full; full=explicit-only -->";
|
|
92
92
|
const existingMarkers = [
|
|
93
|
-
"<!-- toolcraft-performance-lifecycle: first-delivery=functional; later-
|
|
93
|
+
"<!-- toolcraft-performance-lifecycle: first-delivery=functional-complete; later-edits=focused-only; complaint=one-authority-targeted-performance-iteration; full-audit=explicit-only -->",
|
|
94
94
|
"<!-- toolcraft-performance-iteration: authority=exact-request-evidence+canonical-path-ids; fixture=reachable-development; after-pass=return-app-to-user+stop -->",
|
|
95
95
|
"<!-- toolcraft-performance-full-authority: automatic=forbidden; recommendation=two-compatible-iterations-or-broad-unlocalizable-problem; command=pnpm verify:perf; authority=explicit-user-request-or-accepted-offer -->",
|
|
96
96
|
].join("\n");
|
|
@@ -21,7 +21,7 @@ export const staleAnimationDerivedVideoPattern = new RegExp(
|
|
|
21
21
|
);
|
|
22
22
|
|
|
23
23
|
const generatedPerformanceLifecycleMarkers = [
|
|
24
|
-
"<!-- toolcraft-performance-lifecycle: first-delivery=functional; later-
|
|
24
|
+
"<!-- toolcraft-performance-lifecycle: first-delivery=functional-complete; later-edits=focused-only; complaint=one-authority-targeted-performance-iteration; full-audit=explicit-only -->",
|
|
25
25
|
"<!-- toolcraft-performance-iteration: authority=exact-request-evidence+canonical-path-ids; fixture=reachable-development; after-pass=return-app-to-user+stop -->",
|
|
26
26
|
"<!-- toolcraft-performance-full-authority: automatic=forbidden; recommendation=two-compatible-iterations-or-broad-unlocalizable-problem; command=pnpm verify:perf; authority=explicit-user-request-or-accepted-offer -->",
|
|
27
27
|
"<!-- toolcraft-performance-routing: localized=agent-targeted; ambiguous=one-user-facing-choice; broad=offer-targeted-or-full; full=explicit-only -->",
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
|
|
3
|
+
export function assertGeneratedExportDocs({
|
|
4
|
+
agentsSource,
|
|
5
|
+
coreRuntimeBoundarySource,
|
|
6
|
+
coreSetupExportSource,
|
|
7
|
+
}) {
|
|
8
|
+
assert.match(agentsSource, /svgExportRenderer/);
|
|
9
|
+
assert.match(coreRuntimeBoundarySource, /svgExportRenderer/);
|
|
10
|
+
assert.match(
|
|
11
|
+
coreRuntimeBoundarySource,
|
|
12
|
+
/runtime owns typed image\/SVG\/video actions end to end/i,
|
|
13
|
+
);
|
|
14
|
+
assert.match(coreSetupExportSource, /productReadiness\.exportIntent/);
|
|
15
|
+
assert.match(
|
|
16
|
+
coreSetupExportSource,
|
|
17
|
+
/image[^\n]*`toolcraft-default`[^\n]*`user-requested`[^\n]*`user-removed`/i,
|
|
18
|
+
);
|
|
19
|
+
assert.match(coreSetupExportSource, /video[^\n]*`not-requested`[^\n]*`user-requested`/i);
|
|
20
|
+
assert.match(coreSetupExportSource, /SVG[^\n]*`not-requested`[^\n]*`user-requested`/i);
|
|
21
|
+
assert.match(
|
|
22
|
+
coreSetupExportSource,
|
|
23
|
+
/image[^\n]*`user-requested`[^\n]*non-empty[^\n]*evidence/i,
|
|
24
|
+
);
|
|
25
|
+
assert.match(
|
|
26
|
+
coreSetupExportSource,
|
|
27
|
+
/image[^\n]*`user-removed`[^\n]*non-empty[^\n]*evidence/i,
|
|
28
|
+
);
|
|
29
|
+
assert.match(
|
|
30
|
+
coreSetupExportSource,
|
|
31
|
+
/video[^\n]*`user-requested`[^\n]*non-empty[^\n]*evidence/i,
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
for (const decisionStep of [
|
|
35
|
+
"Start every product with image export.",
|
|
36
|
+
"Add SVG export only when the user explicitly requests SVG delivery.",
|
|
37
|
+
"Add video export only when the user explicitly requests video delivery.",
|
|
38
|
+
"Do not infer SVG from an SVG preview renderer, or video from animation, playback, keyframes, or timeline.",
|
|
39
|
+
"Keep image with requested SVG/video unless the user explicitly requests image removal.",
|
|
40
|
+
"Record all three decisions in `productReadiness.exportIntent`.",
|
|
41
|
+
]) {
|
|
42
|
+
assert.equal(
|
|
43
|
+
coreSetupExportSource.split(decisionStep).length - 1,
|
|
44
|
+
1,
|
|
45
|
+
`Canonical export-intent step must appear exactly once: ${decisionStep}`,
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
assert.match(
|
|
50
|
+
coreSetupExportSource,
|
|
51
|
+
/Clipboard copy may be an additional product action, but it never changes or substitutes for the recorded artifact intent/,
|
|
52
|
+
);
|
|
53
|
+
}
|