@zxyycom/vibe-check 0.0.2 → 0.0.3
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 +36 -5
- package/dist/esm/check/check.mjs +4 -0
- package/dist/esm/check/check.mjs.map +1 -1
- package/dist/esm/check/flag-enablement.mjs +32 -0
- package/dist/esm/check/flag-enablement.mjs.map +1 -0
- package/dist/esm/check/handoff-provider-identity.mjs +18 -0
- package/dist/esm/check/handoff-provider-identity.mjs.map +1 -0
- package/dist/esm/check/inherited-collection.mjs +1 -1
- package/dist/esm/check/inherited-collection.mjs.map +1 -1
- package/dist/esm/check/project-changes.mjs +2 -0
- package/dist/esm/check/project-changes.mjs.map +1 -0
- package/dist/esm/check/project-context.mjs +2 -0
- package/dist/esm/check/project-context.mjs.map +1 -0
- package/dist/esm/check-settlement/facts.mjs.map +1 -1
- package/dist/esm/check-settlement/record-store.mjs +1 -1
- package/dist/esm/check-settlement/record-store.mjs.map +1 -1
- package/dist/esm/data-boundary/canonical-data.mjs +36 -7
- package/dist/esm/data-boundary/canonical-data.mjs.map +1 -1
- package/dist/esm/data-boundary/canonical-json.mjs.map +1 -1
- package/dist/esm/data-boundary/closed-values.mjs +28 -4
- package/dist/esm/data-boundary/closed-values.mjs.map +1 -1
- package/dist/esm/{package-checks/project-files → data-boundary}/config-glob.mjs +3 -3
- package/dist/esm/data-boundary/config-glob.mjs.map +1 -0
- package/dist/esm/data-boundary/project-path.mjs +19 -0
- package/dist/esm/data-boundary/project-path.mjs.map +1 -0
- package/dist/esm/index.mjs +12 -5
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/machine-output/v4/atomic-publication.mjs +4 -1
- package/dist/esm/machine-output/v4/atomic-publication.mjs.map +1 -1
- package/dist/esm/package-checks/check-authoring.mjs +69 -0
- package/dist/esm/package-checks/check-authoring.mjs.map +1 -0
- package/dist/esm/package-checks/code-quality-findings/finding-waiver-authoring.mjs.map +1 -1
- package/dist/esm/package-checks/code-quality-findings/finding-waiver-evidence.mjs.map +1 -1
- package/dist/esm/package-checks/command-check/command-check.mjs +55 -0
- package/dist/esm/package-checks/command-check/command-check.mjs.map +1 -0
- package/dist/esm/package-checks/command-check/contract.mjs +2 -0
- package/dist/esm/package-checks/command-check/contract.mjs.map +1 -0
- package/dist/esm/package-checks/command-check/execution.mjs +134 -0
- package/dist/esm/package-checks/command-check/execution.mjs.map +1 -0
- package/dist/esm/package-checks/command-check/options.mjs +284 -0
- package/dist/esm/package-checks/command-check/options.mjs.map +1 -0
- package/dist/esm/package-checks/command-check/transcript.mjs +26 -0
- package/dist/esm/package-checks/command-check/transcript.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/default-check.mjs +9 -11
- package/dist/esm/package-checks/duplicate-detection/default-check.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/execution.mjs +2 -4
- package/dist/esm/package-checks/duplicate-detection/execution.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/finding-messages.mjs +1 -1
- package/dist/esm/package-checks/duplicate-detection/finding-messages.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs +1 -1
- package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/options.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/records.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/constructor.mjs +9 -11
- package/dist/esm/package-checks/file-metrics/constructor.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/execution.mjs +2 -4
- package/dist/esm/package-checks/file-metrics/execution.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/finding-messages.mjs +1 -1
- package/dist/esm/package-checks/file-metrics/finding-messages.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/options.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/records.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/scc/availability.mjs +1 -1
- package/dist/esm/package-checks/file-metrics/scc/availability.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/scc/batch-planner.mjs +38 -0
- package/dist/esm/package-checks/file-metrics/scc/batch-planner.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/scc/logical-scan-resources.mjs +35 -0
- package/dist/esm/package-checks/file-metrics/scc/logical-scan-resources.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/scc/scanner.mjs +102 -29
- package/dist/esm/package-checks/file-metrics/scc/scanner.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analysis.mjs +7 -2
- package/dist/esm/package-checks/function-metrics/analysis.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/analysis-model.mjs +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/analysis-model.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs +1 -3
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/protocol.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/pipeline.mjs +3 -2
- package/dist/esm/package-checks/function-metrics/analyzer/pipeline.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/erlang.mjs +6 -6
- package/dist/esm/package-checks/function-metrics/analyzer/readers/erlang.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/fortran.mjs +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/fortran.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/objc.mjs +9 -3
- package/dist/esm/package-checks/function-metrics/analyzer/readers/objc.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/php-states.mjs +12 -7
- package/dist/esm/package-checks/function-metrics/analyzer/readers/php-states.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/plsql.mjs +6 -6
- package/dist/esm/package-checks/function-metrics/analyzer/readers/plsql.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/python.mjs +5 -3
- package/dist/esm/package-checks/function-metrics/analyzer/readers/python.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/r.mjs +2 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/r.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/ttcn.mjs +9 -3
- package/dist/esm/package-checks/function-metrics/analyzer/readers/ttcn.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/typescript.mjs +9 -3
- package/dist/esm/package-checks/function-metrics/analyzer/readers/typescript.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/zig.mjs +3 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/zig.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/shared/code-reader.mjs +3 -1
- package/dist/esm/package-checks/function-metrics/analyzer/shared/code-reader.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/shared/js-style-regex.mjs +12 -5
- package/dist/esm/package-checks/function-metrics/analyzer/shared/js-style-regex.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer-worker-port.mjs +20 -8
- package/dist/esm/package-checks/function-metrics/analyzer-worker-port.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/constructor.mjs +9 -11
- package/dist/esm/package-checks/function-metrics/constructor.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/execution.mjs +2 -4
- package/dist/esm/package-checks/function-metrics/execution.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/finding-messages.mjs +1 -1
- package/dist/esm/package-checks/function-metrics/finding-messages.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/measurement.mjs +3 -1
- package/dist/esm/package-checks/function-metrics/measurement.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/options.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/records.mjs.map +1 -1
- package/dist/esm/package-checks/host-environment/git.mjs +11 -0
- package/dist/esm/package-checks/host-environment/git.mjs.map +1 -1
- package/dist/esm/package-checks/host-environment/path.mjs +1 -17
- package/dist/esm/package-checks/host-environment/path.mjs.map +1 -1
- package/dist/esm/package-checks/host-environment/process/contract.mjs.map +1 -1
- package/dist/esm/package-checks/host-environment/process/result.mjs +43 -17
- package/dist/esm/package-checks/host-environment/process/result.mjs.map +1 -1
- package/dist/esm/package-checks/host-environment/process/runner.mjs +7 -5
- package/dist/esm/package-checks/host-environment/process/runner.mjs.map +1 -1
- package/dist/esm/package-checks/json-schema-validation/default-check.mjs +9 -11
- package/dist/esm/package-checks/json-schema-validation/default-check.mjs.map +1 -1
- package/dist/esm/package-checks/json-schema-validation/options.mjs.map +1 -1
- package/dist/esm/package-checks/json-schema-validation/reference-resolver.mjs +6 -2
- package/dist/esm/package-checks/json-schema-validation/reference-resolver.mjs.map +1 -1
- package/dist/esm/package-checks/json-schema-validation/schema-policy.mjs +11 -3
- package/dist/esm/package-checks/json-schema-validation/schema-policy.mjs.map +1 -1
- package/dist/esm/package-checks/json-validation/default-check.mjs +9 -11
- package/dist/esm/package-checks/json-validation/default-check.mjs.map +1 -1
- package/dist/esm/package-checks/json-validation/options.mjs.map +1 -1
- package/dist/esm/package-checks/local-cache-options.mjs +28 -0
- package/dist/esm/package-checks/local-cache-options.mjs.map +1 -0
- package/dist/esm/package-checks/maintenance-reminders/maintenance-reminders.mjs +37 -45
- package/dist/esm/package-checks/maintenance-reminders/maintenance-reminders.mjs.map +1 -1
- package/dist/esm/package-checks/maintenance-reminders/maintenance-support.mjs +3 -1
- package/dist/esm/package-checks/maintenance-reminders/maintenance-support.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/default-check.mjs +19 -33
- package/dist/esm/package-checks/markdown-link-validation/default-check.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/execution.mjs +1 -1
- package/dist/esm/package-checks/markdown-link-validation/execution.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/finding-messages.mjs +1 -1
- package/dist/esm/package-checks/markdown-link-validation/finding-messages.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/markdown-parser.mjs +1 -3
- package/dist/esm/package-checks/markdown-link-validation/markdown-parser.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs +3 -18
- package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs +2 -14
- package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/options.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache-payload.mjs +4 -5
- package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache-payload.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-lint/adapter.mjs +125 -0
- package/dist/esm/package-checks/markdown-lint/adapter.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/default-check.mjs +37 -0
- package/dist/esm/package-checks/markdown-lint/default-check.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/execution.mjs +202 -0
- package/dist/esm/package-checks/markdown-lint/execution.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/final-data.mjs +16 -0
- package/dist/esm/package-checks/markdown-lint/final-data.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/finding-messages.mjs +72 -0
- package/dist/esm/package-checks/markdown-lint/finding-messages.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/finding-waiver-identity.mjs +41 -0
- package/dist/esm/package-checks/markdown-lint/finding-waiver-identity.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/findings-cache.mjs +110 -0
- package/dist/esm/package-checks/markdown-lint/findings-cache.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/options-resolution.mjs +74 -0
- package/dist/esm/package-checks/markdown-lint/options-resolution.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/options-validation.mjs +41 -0
- package/dist/esm/package-checks/markdown-lint/options-validation.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/options.mjs +13 -0
- package/dist/esm/package-checks/markdown-lint/options.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/records.mjs +65 -0
- package/dist/esm/package-checks/markdown-lint/records.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/unavailable-reasons.mjs +14 -0
- package/dist/esm/package-checks/markdown-lint/unavailable-reasons.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/collection.mjs +23 -19
- package/dist/esm/package-checks/project-files/collection.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/configuration.mjs +1 -1
- package/dist/esm/package-checks/project-files/configuration.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/gitlink-revision.mjs +2 -5
- package/dist/esm/package-checks/project-files/gitlink-revision.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/gitlink-worktree.mjs +22 -6
- package/dist/esm/package-checks/project-files/gitlink-worktree.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/public-collection.mjs +1 -1
- package/dist/esm/package-checks/project-files/public-collection.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/revision-paths.mjs +3 -3
- package/dist/esm/package-checks/project-files/revision-paths.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/revision-worktree-files.mjs +11 -15
- package/dist/esm/package-checks/project-files/revision-worktree-files.mjs.map +1 -1
- package/dist/esm/package-checks/secret-detection/default-check.mjs +9 -11
- package/dist/esm/package-checks/secret-detection/default-check.mjs.map +1 -1
- package/dist/esm/package-checks/secret-detection/execution.mjs +2 -2
- package/dist/esm/package-checks/secret-detection/execution.mjs.map +1 -1
- package/dist/esm/package-checks/secret-detection/input-preparation.mjs +46 -7
- package/dist/esm/package-checks/secret-detection/input-preparation.mjs.map +1 -1
- package/dist/esm/package-checks/secret-detection/options.mjs.map +1 -1
- package/dist/esm/package-checks/secret-detection/records.mjs.map +1 -1
- package/dist/esm/package-checks/secret-detection/secretlint/adapter.mjs +3 -4
- package/dist/esm/package-checks/secret-detection/secretlint/adapter.mjs.map +1 -1
- package/dist/esm/package-tools/admission-policy/define-admission-policy.mjs +10 -0
- package/dist/esm/package-tools/admission-policy/define-admission-policy.mjs.map +1 -0
- package/dist/esm/{cache → package-tools/cache}/cache-json-by-key.mjs +13 -14
- package/dist/esm/package-tools/cache/cache-json-by-key.mjs.map +1 -0
- package/dist/esm/package-tools/finding-presentation/finding-presentation.mjs.map +1 -0
- package/dist/esm/{finding-waivers → package-tools/finding-waivers}/reconciliation.mjs +14 -5
- package/dist/esm/package-tools/finding-waivers/reconciliation.mjs.map +1 -0
- package/dist/esm/package-tools/learned-critical-path/critical-path-ranking.mjs.map +1 -0
- package/dist/esm/package-tools/learned-critical-path/duration-model/bounded-history.mjs.map +1 -0
- package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/prediction.mjs +2 -2
- package/dist/esm/package-tools/learned-critical-path/duration-model/prediction.mjs.map +1 -0
- package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/preparation.mjs +4 -2
- package/dist/esm/package-tools/learned-critical-path/duration-model/preparation.mjs.map +1 -0
- package/dist/esm/package-tools/learned-critical-path/duration-model/recording.mjs.map +1 -0
- package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/storage.mjs +8 -8
- package/dist/esm/package-tools/learned-critical-path/duration-model/storage.mjs.map +1 -0
- package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/selection-layers.mjs +1 -2
- package/dist/esm/package-tools/learned-critical-path/selection-layers.mjs.map +1 -0
- package/dist/esm/package-tools/learned-critical-path/static-decision.mjs.map +1 -0
- package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/strategy.mjs +3 -3
- package/dist/esm/package-tools/learned-critical-path/strategy.mjs.map +1 -0
- package/dist/esm/project-definition/check-tree/authoring.mjs +8 -5
- package/dist/esm/project-definition/check-tree/authoring.mjs.map +1 -1
- package/dist/esm/project-definition/check-tree/check-fields-authoring.mjs +79 -66
- package/dist/esm/project-definition/check-tree/check-fields-authoring.mjs.map +1 -1
- package/dist/esm/project-definition/check-tree/flag-conditions.mjs +71 -0
- package/dist/esm/project-definition/check-tree/flag-conditions.mjs.map +1 -0
- package/dist/esm/project-definition/check-tree/materialization.mjs +13 -8
- package/dist/esm/project-definition/check-tree/materialization.mjs.map +1 -1
- package/dist/esm/project-definition/check-tree/resolution.mjs +7 -6
- package/dist/esm/project-definition/check-tree/resolution.mjs.map +1 -1
- package/dist/esm/project-definition/declarative-snapshot.mjs +2 -1
- package/dist/esm/project-definition/declarative-snapshot.mjs.map +1 -1
- package/dist/esm/project-definition/project-changes.mjs +70 -0
- package/dist/esm/project-definition/project-changes.mjs.map +1 -0
- package/dist/esm/project-definition/project-definition-validation.mjs +40 -8
- package/dist/esm/project-definition/project-definition-validation.mjs.map +1 -1
- package/dist/esm/project-definition/project-definition.mjs +22 -15
- package/dist/esm/project-definition/project-definition.mjs.map +1 -1
- package/dist/esm/project-definition/scheduler-policy.mjs.map +1 -1
- package/dist/esm/project-run/admission-strategy-provider/custom-strategy-preparation.mjs +9 -6
- package/dist/esm/project-run/admission-strategy-provider/custom-strategy-preparation.mjs.map +1 -1
- package/dist/esm/project-run/admission-strategy-provider/prepared-admission-strategy.mjs.map +1 -1
- package/dist/esm/project-run/aggregation.mjs +42 -59
- package/dist/esm/project-run/aggregation.mjs.map +1 -1
- package/dist/esm/project-run/changes/git.mjs +161 -0
- package/dist/esm/project-run/changes/git.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/admitted-check-execution.mjs +41 -0
- package/dist/esm/project-run/check-execution/admitted-check-execution.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/callback.mjs +3 -2
- package/dist/esm/project-run/check-execution/callback.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/dependencies.mjs +80 -5
- package/dist/esm/project-run/check-execution/dependencies.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/execution-finalization.mjs +5 -3
- package/dist/esm/project-run/check-execution/execution-finalization.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/execution-settlement.mjs +37 -16
- package/dist/esm/project-run/check-execution/execution-settlement.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/flag-controls.mjs +15 -7
- package/dist/esm/project-run/check-execution/flag-controls.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/lifecycle.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/{preflight-result.mjs → preparation-result.mjs} +24 -24
- package/dist/esm/project-run/check-execution/preparation-result.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/{preflight.mjs → preparation.mjs} +52 -52
- package/dist/esm/project-run/check-execution/preparation.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/ready-check-execution.mjs +71 -0
- package/dist/esm/project-run/check-execution/ready-check-execution.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/resolved-checks.mjs +27 -164
- package/dist/esm/project-run/check-execution/resolved-checks.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/scheduled-check-run.mjs +79 -0
- package/dist/esm/project-run/check-execution/scheduled-check-run.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/terminal-result.mjs +70 -25
- package/dist/esm/project-run/check-execution/terminal-result.mjs.map +1 -1
- package/dist/esm/project-run/completion/completion.mjs +18 -1
- package/dist/esm/project-run/completion/completion.mjs.map +1 -1
- package/dist/esm/project-run/controls/contract.mjs.map +1 -1
- package/dist/esm/project-run/controls/validation.mjs +7 -54
- package/dist/esm/project-run/controls/validation.mjs.map +1 -1
- package/dist/esm/project-run/diagnostic-logging/diagnostic-detail-rendering.mjs +3 -3
- package/dist/esm/project-run/diagnostic-logging/diagnostic-detail-rendering.mjs.map +1 -1
- package/dist/esm/project-run/diagnostic-logging/observation-rendering.mjs +1 -1
- package/dist/esm/project-run/diagnostic-logging/observation-rendering.mjs.map +1 -1
- package/dist/esm/project-run/invocation/candidate.mjs +17 -13
- package/dist/esm/project-run/invocation/candidate.mjs.map +1 -1
- package/dist/esm/project-run/invocation/candidates.mjs +26 -0
- package/dist/esm/project-run/invocation/candidates.mjs.map +1 -0
- package/dist/esm/project-run/invocation/creation.mjs +7 -3
- package/dist/esm/project-run/invocation/creation.mjs.map +1 -1
- package/dist/esm/project-run/invocation/execution.mjs +98 -0
- package/dist/esm/project-run/invocation/execution.mjs.map +1 -0
- package/dist/esm/project-run/invocation/run.mjs +13 -112
- package/dist/esm/project-run/invocation/run.mjs.map +1 -1
- package/dist/esm/project-run/invocation/scheduler.mjs +13 -6
- package/dist/esm/project-run/invocation/scheduler.mjs.map +1 -1
- package/dist/esm/project-run/outputs/status.mjs +12 -12
- package/dist/esm/project-run/outputs/status.mjs.map +1 -1
- package/dist/esm/project-run/progress-rendering/presentation.mjs +31 -11
- package/dist/esm/project-run/progress-rendering/presentation.mjs.map +1 -1
- package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs +11 -4
- package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs.map +1 -1
- package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs +20 -6
- package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs.map +1 -1
- package/dist/esm/project-run/progress-rendering/renderer.mjs +6 -2
- package/dist/esm/project-run/progress-rendering/renderer.mjs.map +1 -1
- package/dist/esm/project-run/project-context.mjs +2 -1
- package/dist/esm/project-run/project-context.mjs.map +1 -1
- package/dist/esm/project-run/result.mjs +2 -2
- package/dist/esm/project-run/result.mjs.map +1 -1
- package/dist/esm/project-run/run.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph-lookup.mjs +45 -0
- package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph-lookup.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph.mjs +9 -4
- package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/admission-core/selection-query.mjs +3 -5
- package/dist/esm/project-run/task-scheduler/admission-core/selection-query.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/admission-core/selection-seed.mjs +25 -8
- package/dist/esm/project-run/task-scheduler/admission-core/selection-seed.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/admission-core/selection-transition.mjs +8 -8
- package/dist/esm/project-run/task-scheduler/admission-core/selection-transition.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/execution-state.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/measurement/diagnostics.mjs +8 -4
- package/dist/esm/project-run/task-scheduler/measurement/diagnostics.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/measurement/timing.mjs +12 -6
- package/dist/esm/project-run/task-scheduler/measurement/timing.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/scheduler-observation.mjs +3 -1
- package/dist/esm/project-run/task-scheduler/scheduler-observation.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/scheduler-terminal-measurement.mjs +17 -17
- package/dist/esm/project-run/task-scheduler/scheduler-terminal-measurement.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/scheduler.mjs +18 -6
- package/dist/esm/project-run/task-scheduler/scheduler.mjs.map +1 -1
- package/docs/api-mechanics.md +147 -28
- package/docs/changelog.md +145 -2
- package/docs/checks/duplicate-detection.md +22 -3
- package/docs/checks/file-metrics.md +25 -6
- package/docs/checks/function-metrics.md +21 -2
- package/docs/checks/json-schema-validation.md +25 -4
- package/docs/checks/json-validation.md +24 -5
- package/docs/checks/maintenance-reminders.md +30 -6
- package/docs/checks/markdown-link-validation.md +24 -4
- package/docs/checks/markdown-lint.md +167 -0
- package/docs/checks/secret-detection.md +31 -7
- package/docs/examples/artifacts/mixed-outcomes/definition.ts +10 -10
- package/docs/guides/building-project-gate.md +706 -0
- package/docs/guides/callbacks.md +81 -22
- package/docs/guides/check-dependencies.md +41 -10
- package/docs/guides/collecting-project-files.md +7 -7
- package/docs/guides/command-check.md +155 -0
- package/docs/guides/data-boundaries.md +140 -0
- package/docs/guides/extending-check-lifecycle.md +77 -25
- package/docs/guides/finding-waivers.md +43 -1
- package/docs/guides/learned-scheduling.md +1 -1
- package/docs/guides/run-outputs.md +35 -9
- package/docs/guides/scheduling.md +15 -15
- package/docs/output.md +6 -5
- package/package.json +2 -1
- package/src/check/check.ts +332 -92
- package/src/check/flag-enablement.ts +76 -0
- package/src/check/handoff-provider-identity.ts +34 -0
- package/src/check/inherited-collection.ts +1 -1
- package/src/check/project-changes.ts +14 -0
- package/src/check/project-context.ts +11 -0
- package/src/check-settlement/facts.ts +1 -1
- package/src/check-settlement/record-store.ts +1 -1
- package/src/data-boundary/canonical-data.ts +36 -9
- package/src/data-boundary/canonical-json.ts +18 -1
- package/src/data-boundary/closed-values.ts +26 -6
- package/src/data-boundary/config-glob.ts +17 -0
- package/src/data-boundary/project-path.ts +21 -0
- package/src/index.ts +72 -11
- package/src/machine-output/v4/atomic-publication.ts +3 -1
- package/src/package-checks/check-authoring.ts +136 -0
- package/src/package-checks/code-quality-findings/finding-waiver-authoring.ts +1 -1
- package/src/package-checks/code-quality-findings/finding-waiver-evidence.ts +1 -1
- package/src/package-checks/command-check/command-check.ts +152 -0
- package/src/package-checks/command-check/contract.ts +168 -0
- package/src/package-checks/command-check/execution.ts +211 -0
- package/src/package-checks/command-check/options.ts +331 -0
- package/src/package-checks/command-check/transcript.ts +35 -0
- package/src/package-checks/duplicate-detection/default-check.ts +37 -6
- package/src/package-checks/duplicate-detection/execution.ts +2 -4
- package/src/package-checks/duplicate-detection/finding-messages.ts +2 -2
- package/src/package-checks/duplicate-detection/jscpd/availability.ts +1 -1
- package/src/package-checks/duplicate-detection/options.ts +6 -3
- package/src/package-checks/duplicate-detection/records.ts +1 -1
- package/src/package-checks/file-metrics/constructor.ts +29 -6
- package/src/package-checks/file-metrics/execution.ts +2 -4
- package/src/package-checks/file-metrics/finding-messages.ts +1 -1
- package/src/package-checks/file-metrics/options.ts +6 -3
- package/src/package-checks/file-metrics/records.ts +1 -1
- package/src/package-checks/file-metrics/scc/availability.ts +1 -1
- package/src/package-checks/file-metrics/scc/batch-planner.ts +56 -0
- package/src/package-checks/file-metrics/scc/logical-scan-resources.ts +59 -0
- package/src/package-checks/file-metrics/scc/scanner.ts +134 -32
- package/src/package-checks/function-metrics/analysis.ts +7 -2
- package/src/package-checks/function-metrics/analyzer/analysis-model.ts +1 -1
- package/src/package-checks/function-metrics/analyzer/extension-output.ts +14 -6
- package/src/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.ts +1 -3
- package/src/package-checks/function-metrics/analyzer/extensions/protocol.ts +3 -3
- package/src/package-checks/function-metrics/analyzer/pipeline.ts +4 -2
- package/src/package-checks/function-metrics/analyzer/readers/erlang.ts +6 -6
- package/src/package-checks/function-metrics/analyzer/readers/fortran.ts +1 -1
- package/src/package-checks/function-metrics/analyzer/readers/objc.ts +9 -3
- package/src/package-checks/function-metrics/analyzer/readers/php-states.ts +14 -7
- package/src/package-checks/function-metrics/analyzer/readers/plsql.ts +8 -4
- package/src/package-checks/function-metrics/analyzer/readers/python.ts +4 -3
- package/src/package-checks/function-metrics/analyzer/readers/r.ts +2 -1
- package/src/package-checks/function-metrics/analyzer/readers/ttcn.ts +9 -3
- package/src/package-checks/function-metrics/analyzer/readers/typescript.ts +9 -3
- package/src/package-checks/function-metrics/analyzer/readers/zig.ts +2 -1
- package/src/package-checks/function-metrics/analyzer/shared/code-reader.ts +3 -1
- package/src/package-checks/function-metrics/analyzer/shared/js-style-regex.ts +10 -5
- package/src/package-checks/function-metrics/analyzer-worker-port.ts +20 -6
- package/src/package-checks/function-metrics/constructor.ts +30 -7
- package/src/package-checks/function-metrics/execution.ts +2 -4
- package/src/package-checks/function-metrics/finding-messages.ts +2 -2
- package/src/package-checks/function-metrics/measurement.ts +3 -1
- package/src/package-checks/function-metrics/options.ts +6 -3
- package/src/package-checks/function-metrics/records.ts +1 -1
- package/src/package-checks/host-environment/git.ts +11 -0
- package/src/package-checks/host-environment/path.ts +1 -20
- package/src/package-checks/host-environment/process/contract.ts +17 -9
- package/src/package-checks/host-environment/process/result.ts +48 -20
- package/src/package-checks/host-environment/process/runner.ts +8 -4
- package/src/package-checks/json-schema-validation/default-check.ts +38 -5
- package/src/package-checks/json-schema-validation/options.ts +4 -1
- package/src/package-checks/json-schema-validation/reference-resolver.ts +6 -2
- package/src/package-checks/json-schema-validation/schema-policy.ts +10 -5
- package/src/package-checks/json-validation/default-check.ts +27 -6
- package/src/package-checks/json-validation/options.ts +4 -1
- package/src/package-checks/local-cache-options.ts +40 -0
- package/src/package-checks/maintenance-reminders/maintenance-reminders.ts +89 -9
- package/src/package-checks/maintenance-reminders/maintenance-support.ts +3 -3
- package/src/package-checks/markdown-link-validation/default-check.ts +48 -5
- package/src/package-checks/markdown-link-validation/execution.ts +1 -1
- package/src/package-checks/markdown-link-validation/finding-messages.ts +1 -1
- package/src/package-checks/markdown-link-validation/markdown-parser.ts +1 -5
- package/src/package-checks/markdown-link-validation/options-resolution.ts +2 -19
- package/src/package-checks/markdown-link-validation/options-validation.ts +2 -17
- package/src/package-checks/markdown-link-validation/options.ts +6 -7
- package/src/package-checks/markdown-link-validation/parse-facts-cache-payload.ts +4 -5
- package/src/package-checks/markdown-lint/adapter.ts +167 -0
- package/src/package-checks/markdown-lint/default-check.ts +92 -0
- package/src/package-checks/markdown-lint/execution.ts +266 -0
- package/src/package-checks/markdown-lint/final-data.ts +33 -0
- package/src/package-checks/markdown-lint/finding-messages.ts +87 -0
- package/src/package-checks/markdown-lint/finding-waiver-identity.ts +54 -0
- package/src/package-checks/markdown-lint/findings-cache.ts +141 -0
- package/src/package-checks/markdown-lint/options-resolution.ts +102 -0
- package/src/package-checks/markdown-lint/options-validation.ts +50 -0
- package/src/package-checks/markdown-lint/options.ts +82 -0
- package/src/package-checks/markdown-lint/records.ts +132 -0
- package/src/package-checks/markdown-lint/unavailable-reasons.ts +33 -0
- package/src/package-checks/project-files/collection.ts +38 -22
- package/src/package-checks/project-files/config-glob.ts +1 -17
- package/src/package-checks/project-files/configuration.ts +1 -1
- package/src/package-checks/project-files/gitlink-revision.ts +4 -6
- package/src/package-checks/project-files/gitlink-worktree.ts +35 -7
- package/src/package-checks/project-files/public-collection.ts +1 -1
- package/src/package-checks/project-files/revision-paths.ts +3 -3
- package/src/package-checks/project-files/revision-worktree-files.ts +16 -16
- package/src/package-checks/secret-detection/default-check.ts +29 -6
- package/src/package-checks/secret-detection/execution.ts +2 -2
- package/src/package-checks/secret-detection/input-preparation.ts +64 -7
- package/src/package-checks/secret-detection/options.ts +5 -2
- package/src/package-checks/secret-detection/records.ts +1 -1
- package/src/package-checks/secret-detection/secretlint/adapter.ts +3 -4
- package/src/package-tools/admission-policy/define-admission-policy.ts +54 -0
- package/src/{cache → package-tools/cache}/cache-json-by-key.ts +13 -17
- package/src/{check → package-tools/finding-presentation}/finding-presentation.ts +3 -1
- package/src/{finding-waivers → package-tools/finding-waivers}/reconciliation.ts +16 -8
- package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/prediction.ts +5 -2
- package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/preparation.ts +5 -3
- package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/recording.ts +5 -4
- package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/storage.ts +9 -10
- package/src/{learned-critical-path → package-tools/learned-critical-path}/selection-layers.ts +2 -3
- package/src/{learned-critical-path → package-tools/learned-critical-path}/static-decision.ts +1 -1
- package/src/{learned-critical-path → package-tools/learned-critical-path}/strategy.ts +7 -4
- package/src/project-definition/check-tree/authoring.ts +15 -8
- package/src/project-definition/check-tree/check-fields-authoring.ts +106 -91
- package/src/project-definition/check-tree/flag-conditions.ts +99 -0
- package/src/project-definition/check-tree/materialization.ts +12 -8
- package/src/project-definition/check-tree/resolution.ts +13 -15
- package/src/project-definition/declarative-snapshot.ts +9 -2
- package/src/project-definition/project-changes.ts +112 -0
- package/src/project-definition/project-definition-validation.ts +58 -10
- package/src/project-definition/project-definition.ts +41 -68
- package/src/project-definition/scheduler-policy.ts +6 -3
- package/src/project-run/admission-strategy-provider/custom-strategy-preparation.ts +11 -8
- package/src/project-run/admission-strategy-provider/prepared-admission-strategy.ts +2 -2
- package/src/project-run/aggregation.ts +51 -74
- package/src/project-run/changes/git.ts +206 -0
- package/src/project-run/check-execution/admitted-check-execution.ts +62 -0
- package/src/project-run/check-execution/callback.ts +3 -2
- package/src/project-run/check-execution/dependencies.ts +120 -6
- package/src/project-run/check-execution/execution-finalization.ts +6 -4
- package/src/project-run/check-execution/execution-settlement.ts +88 -29
- package/src/project-run/check-execution/flag-controls.ts +22 -8
- package/src/project-run/check-execution/lifecycle.ts +14 -6
- package/src/project-run/check-execution/{preflight-result.ts → preparation-result.ts} +34 -32
- package/src/project-run/check-execution/{preflight.ts → preparation.ts} +92 -84
- package/src/project-run/check-execution/ready-check-execution.ts +97 -0
- package/src/project-run/check-execution/resolved-checks.ts +40 -219
- package/src/project-run/check-execution/scheduled-check-run.ts +119 -0
- package/src/project-run/check-execution/terminal-result.ts +108 -29
- package/src/project-run/completion/completion.ts +17 -3
- package/src/project-run/controls/contract.ts +6 -16
- package/src/project-run/controls/validation.ts +7 -60
- package/src/project-run/diagnostic-logging/diagnostic-detail-rendering.ts +1 -2
- package/src/project-run/diagnostic-logging/observation-rendering.ts +1 -1
- package/src/project-run/invocation/candidate.ts +28 -15
- package/src/project-run/invocation/candidates.ts +56 -0
- package/src/project-run/invocation/creation.ts +7 -3
- package/src/project-run/invocation/execution.ts +136 -0
- package/src/project-run/invocation/run.ts +15 -179
- package/src/project-run/invocation/scheduler.ts +13 -6
- package/src/project-run/outputs/status.ts +15 -15
- package/src/project-run/progress-rendering/presentation.ts +35 -13
- package/src/project-run/progress-rendering/renderer-formatting.ts +20 -7
- package/src/project-run/progress-rendering/renderer-lifecycle.ts +23 -6
- package/src/project-run/progress-rendering/renderer.ts +10 -4
- package/src/project-run/project-context.ts +8 -4
- package/src/project-run/result.ts +5 -5
- package/src/project-run/run.ts +1 -1
- package/src/project-run/task-scheduler/admission-core/compiled-graph-lookup.ts +71 -0
- package/src/project-run/task-scheduler/admission-core/compiled-graph.ts +9 -4
- package/src/project-run/task-scheduler/admission-core/selection-query.ts +6 -4
- package/src/project-run/task-scheduler/admission-core/selection-seed.ts +36 -6
- package/src/project-run/task-scheduler/admission-core/selection-transition.ts +17 -8
- package/src/project-run/task-scheduler/execution-state.ts +4 -4
- package/src/project-run/task-scheduler/measurement/diagnostics.ts +10 -4
- package/src/project-run/task-scheduler/measurement/timing.ts +13 -5
- package/src/project-run/task-scheduler/scheduler-observation.ts +3 -1
- package/src/project-run/task-scheduler/scheduler-terminal-measurement.ts +24 -22
- package/src/project-run/task-scheduler/scheduler.ts +23 -6
- package/types/check/check.d.ts +178 -67
- package/types/check/flag-enablement.d.ts +42 -0
- package/types/check/handoff-provider-identity.d.ts +12 -0
- package/types/check/project-changes.d.ts +13 -0
- package/types/check/project-context.d.ts +10 -0
- package/types/check-settlement/facts.d.ts +1 -1
- package/types/data-boundary/canonical-data.d.ts +28 -5
- package/types/data-boundary/canonical-json.d.ts +18 -1
- package/types/data-boundary/closed-values.d.ts +17 -1
- package/types/data-boundary/config-glob.d.ts +5 -0
- package/types/data-boundary/project-path.d.ts +4 -0
- package/types/index.d.ts +27 -11
- package/types/package-checks/check-authoring.d.ts +45 -0
- package/types/package-checks/code-quality-findings/finding-waiver-authoring.d.ts +1 -1
- package/types/package-checks/code-quality-findings/finding-waiver-evidence.d.ts +1 -1
- package/types/package-checks/command-check/command-check.d.ts +48 -0
- package/types/package-checks/command-check/contract.d.ts +108 -0
- package/types/package-checks/command-check/execution.d.ts +7 -0
- package/types/package-checks/command-check/options.d.ts +11 -0
- package/types/package-checks/command-check/transcript.d.ts +8 -0
- package/types/package-checks/duplicate-detection/default-check.d.ts +5 -2
- package/types/package-checks/duplicate-detection/finding-messages.d.ts +1 -1
- package/types/package-checks/duplicate-detection/options.d.ts +4 -3
- package/types/package-checks/duplicate-detection/records.d.ts +1 -1
- package/types/package-checks/file-metrics/constructor.d.ts +5 -2
- package/types/package-checks/file-metrics/options.d.ts +4 -3
- package/types/package-checks/file-metrics/records.d.ts +1 -1
- package/types/package-checks/file-metrics/scc/batch-planner.d.ts +18 -0
- package/types/package-checks/file-metrics/scc/logical-scan-resources.d.ts +14 -0
- package/types/package-checks/function-metrics/analyzer/extensions/protocol.d.ts +3 -3
- package/types/package-checks/function-metrics/constructor.d.ts +5 -2
- package/types/package-checks/function-metrics/finding-messages.d.ts +1 -1
- package/types/package-checks/function-metrics/options.d.ts +4 -3
- package/types/package-checks/function-metrics/records.d.ts +1 -1
- package/types/package-checks/host-environment/git.d.ts +2 -0
- package/types/package-checks/host-environment/path.d.ts +1 -3
- package/types/package-checks/host-environment/process/contract.d.ts +17 -9
- package/types/package-checks/json-schema-validation/default-check.d.ts +4 -1
- package/types/package-checks/json-schema-validation/options.d.ts +2 -1
- package/types/package-checks/json-validation/default-check.d.ts +4 -1
- package/types/package-checks/json-validation/options.d.ts +2 -1
- package/types/package-checks/local-cache-options.d.ts +9 -0
- package/types/package-checks/maintenance-reminders/maintenance-reminders.d.ts +11 -2
- package/types/package-checks/markdown-link-validation/default-check.d.ts +4 -1
- package/types/package-checks/markdown-link-validation/options.d.ts +4 -7
- package/types/package-checks/markdown-lint/adapter.d.ts +10 -0
- package/types/package-checks/markdown-lint/default-check.d.ts +37 -0
- package/types/package-checks/markdown-lint/execution.d.ts +24 -0
- package/types/package-checks/markdown-lint/final-data.d.ts +8 -0
- package/types/package-checks/markdown-lint/finding-messages.d.ts +6 -0
- package/types/package-checks/markdown-lint/finding-waiver-identity.d.ts +3 -0
- package/types/package-checks/markdown-lint/findings-cache.d.ts +17 -0
- package/types/package-checks/markdown-lint/options-resolution.d.ts +3 -0
- package/types/package-checks/markdown-lint/options-validation.d.ts +2 -0
- package/types/package-checks/markdown-lint/options.d.ts +65 -0
- package/types/package-checks/markdown-lint/records.d.ts +39 -0
- package/types/package-checks/markdown-lint/unavailable-reasons.d.ts +3 -0
- package/types/package-checks/secret-detection/default-check.d.ts +4 -1
- package/types/package-checks/secret-detection/options.d.ts +3 -2
- package/types/package-tools/admission-policy/define-admission-policy.d.ts +26 -0
- package/types/{check → package-tools/finding-presentation}/finding-presentation.d.ts +3 -1
- package/types/{finding-waivers → package-tools/finding-waivers}/reconciliation.d.ts +3 -3
- package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/prediction.d.ts +2 -2
- package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/preparation.d.ts +1 -1
- package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/recording.d.ts +1 -1
- package/types/{learned-critical-path → package-tools/learned-critical-path}/selection-layers.d.ts +1 -1
- package/types/{learned-critical-path → package-tools/learned-critical-path}/static-decision.d.ts +1 -1
- package/types/{learned-critical-path → package-tools/learned-critical-path}/strategy.d.ts +1 -1
- package/types/project-definition/check-tree/authoring.d.ts +5 -3
- package/types/project-definition/check-tree/check-fields-authoring.d.ts +12 -7
- package/types/project-definition/check-tree/flag-conditions.d.ts +5 -0
- package/types/project-definition/check-tree/resolution.d.ts +6 -4
- package/types/project-definition/declarative-snapshot.d.ts +4 -1
- package/types/project-definition/project-changes.d.ts +30 -0
- package/types/project-definition/project-definition.d.ts +15 -30
- package/types/project-definition/scheduler-policy.d.ts +3 -3
- package/types/project-run/admission-strategy-provider/prepared-admission-strategy.d.ts +2 -2
- package/types/project-run/aggregation.d.ts +8 -6
- package/types/project-run/changes/git.d.ts +14 -0
- package/types/project-run/check-execution/admitted-check-execution.d.ts +18 -0
- package/types/project-run/check-execution/dependencies.d.ts +3 -0
- package/types/project-run/check-execution/execution-finalization.d.ts +1 -1
- package/types/project-run/check-execution/execution-settlement.d.ts +15 -7
- package/types/project-run/check-execution/flag-controls.d.ts +1 -1
- package/types/project-run/check-execution/lifecycle.d.ts +9 -5
- package/types/project-run/check-execution/{preflight-result.d.ts → preparation-result.d.ts} +3 -3
- package/types/project-run/check-execution/{preflight.d.ts → preparation.d.ts} +10 -9
- package/types/project-run/check-execution/ready-check-execution.d.ts +18 -0
- package/types/project-run/check-execution/resolved-checks.d.ts +12 -13
- package/types/project-run/check-execution/scheduled-check-run.d.ts +10 -0
- package/types/project-run/check-execution/terminal-result.d.ts +13 -1
- package/types/project-run/completion/completion.d.ts +3 -1
- package/types/project-run/controls/contract.d.ts +6 -16
- package/types/project-run/invocation/candidates.d.ts +8 -0
- package/types/project-run/invocation/execution.d.ts +5 -0
- package/types/project-run/invocation/run.d.ts +2 -2
- package/types/project-run/outputs/status.d.ts +4 -4
- package/types/project-run/progress-rendering/presentation.d.ts +4 -3
- package/types/project-run/progress-rendering/renderer-formatting.d.ts +5 -2
- package/types/project-run/progress-rendering/renderer-lifecycle.d.ts +2 -0
- package/types/project-run/progress-rendering/renderer.d.ts +4 -2
- package/types/project-run/project-context.d.ts +3 -3
- package/types/project-run/result.d.ts +3 -3
- package/types/project-run/run.d.ts +1 -1
- package/types/project-run/task-scheduler/admission-core/compiled-graph-lookup.d.ts +10 -0
- package/types/project-run/task-scheduler/execution-state.d.ts +4 -4
- package/types/project-run/task-scheduler/measurement/diagnostics.d.ts +2 -2
- package/types/project-run/task-scheduler/scheduler-terminal-measurement.d.ts +1 -1
- package/dist/esm/cache/cache-json-by-key.mjs.map +0 -1
- package/dist/esm/check/finding-presentation.mjs.map +0 -1
- package/dist/esm/finding-waivers/reconciliation.mjs.map +0 -1
- package/dist/esm/learned-critical-path/duration-model/bounded-history.mjs.map +0 -1
- package/dist/esm/learned-critical-path/duration-model/prediction.mjs.map +0 -1
- package/dist/esm/learned-critical-path/duration-model/preparation.mjs.map +0 -1
- package/dist/esm/learned-critical-path/duration-model/recording.mjs.map +0 -1
- package/dist/esm/learned-critical-path/duration-model/storage.mjs.map +0 -1
- package/dist/esm/learned-critical-path/selection-layers.mjs.map +0 -1
- package/dist/esm/learned-critical-path/static-decision.mjs.map +0 -1
- package/dist/esm/learned-critical-path/strategy.mjs.map +0 -1
- package/dist/esm/package-checks/project-files/config-glob.mjs.map +0 -1
- package/dist/esm/project-run/check-execution/preflight-result.mjs.map +0 -1
- package/dist/esm/project-run/check-execution/preflight.mjs.map +0 -1
- package/dist/esm/project-run/task-scheduler/critical-path-ranking.mjs.map +0 -1
- package/types/package-checks/project-files/config-glob.d.ts +0 -5
- /package/dist/esm/{check → package-tools/finding-presentation}/finding-presentation.mjs +0 -0
- /package/dist/esm/{project-run/task-scheduler → package-tools/learned-critical-path}/critical-path-ranking.mjs +0 -0
- /package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/bounded-history.mjs +0 -0
- /package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/recording.mjs +0 -0
- /package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/static-decision.mjs +0 -0
- /package/src/{project-run/task-scheduler → package-tools/learned-critical-path}/critical-path-ranking.ts +0 -0
- /package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/bounded-history.ts +0 -0
- /package/types/{cache → package-tools/cache}/cache-json-by-key.d.ts +0 -0
- /package/types/{project-run/task-scheduler → package-tools/learned-critical-path}/critical-path-ranking.d.ts +0 -0
- /package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/bounded-history.d.ts +0 -0
- /package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/storage.d.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-fields-authoring.mjs","sourceRoot":"","sources":["../../../../src/project-definition/check-tree/check-fields-authoring.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CheckDescriptor } from \"../../check/descriptor.ts\";\nimport {\n type CheckVisibility,\n type CheckFlagEnablement,\n type CheckFlagEnablementMode,\n type CheckExecution,\n type CheckPreflight\n} from \"../../check/check.ts\";\nimport { validateCheckDescriptor } from \"../../check/descriptor-validation.ts\";\nimport { snapshotJsonObject } from \"../../check/options-snapshot.ts\";\nimport { snapshotClosedRecord } from \"../../data-boundary/closed-values.ts\";\nimport { parseUniqueIdentifiers } from \"./collection-authoring.ts\";\n\nexport type TrustedDataParser = (this: void, ...parameters: never[]) => unknown;\n\nexport interface CheckAuthoringData extends Readonly<Record<string, unknown>> {\n readonly checkId: string;\n readonly displayName: string;\n}\n\nexport interface ParsedCheckFields {\n readonly definition: CheckDescriptor | null;\n readonly enabledByFlags: CheckFlagEnablement | null;\n readonly execution: CheckExecution | null;\n readonly options: object | null;\n readonly parseData: TrustedDataParser | null;\n readonly preflight: CheckPreflight | null;\n readonly visibility: CheckVisibility | null;\n}\n\nexport interface ParsedCheckFieldPrelude {\n readonly enabledByFlags: CheckFlagEnablement | null;\n readonly execution: CheckExecution | null;\n readonly parseData: TrustedDataParser | null;\n readonly preflight: CheckPreflight | null;\n}\n\ninterface ParsedFlagEnablementControl extends Readonly<Record<string, unknown>> {\n readonly flags: unknown;\n readonly mode: CheckFlagEnablementMode;\n readonly propagateDependsOn?: true;\n}\n\nconst CHECK_KEYS = [\n \"admissionPriority\",\n \"checkId\",\n \"checks\",\n \"dependsOn\",\n \"displayName\",\n \"enabledByFlags\",\n \"execution\",\n \"maxParallel\",\n \"mutex\",\n \"options\",\n \"observes\",\n \"parseData\",\n \"preflight\",\n \"resourceClaims\",\n \"visibility\"\n] as const;\nconst FLAG_ENABLEMENT_KEYS = [\"flags\", \"mode\", \"propagateDependsOn\"] as const;\n\nconst CONTAINER_CHECK_FIELDS: ParsedCheckFields = Object.freeze({\n definition: null,\n enabledByFlags: null,\n execution: null,\n options: null,\n parseData: null,\n preflight: null,\n visibility: null\n});\n\nexport function parseCheckAuthoringData(value: unknown): CheckAuthoringData | undefined {\n const data = snapshotClosedRecord(value);\n return data !== undefined && hasValidCheckIdentity(data) ? data : undefined;\n}\n\nfunction hasValidCheckIdentity(\n data: Readonly<Record<string, unknown>>\n): data is CheckAuthoringData {\n return (\n hasOnlyCheckKeys(data) &&\n typeof data.checkId === \"string\" &&\n data.checkId.length > 0 &&\n typeof data.displayName === \"string\" &&\n data.displayName.length > 0\n );\n}\n\nexport function parseCheckFieldPrelude(\n data: CheckAuthoringData\n): ParsedCheckFieldPrelude | undefined {\n const execution = parseExecution(data);\n if (execution === undefined) return undefined;\n const parseData = parseDataParser(data);\n if (parseData === undefined) return undefined;\n const preflight = parsePreflight(data);\n if (preflight === undefined) return undefined;\n const enabledByFlags = parseEnabledByFlags(data);\n return enabledByFlags === undefined\n ? undefined\n : Object.freeze({ enabledByFlags, execution, parseData, preflight });\n}\n\nexport function parseCheckFields(\n data: CheckAuthoringData,\n prelude: ParsedCheckFieldPrelude\n): ParsedCheckFields | undefined {\n if (prelude.execution === null) {\n return Object.hasOwn(data, \"options\") ||\n Object.hasOwn(data, \"enabledByFlags\") ||\n Object.hasOwn(data, \"visibility\") ||\n prelude.parseData !== null ||\n prelude.preflight !== null\n ? undefined\n : CONTAINER_CHECK_FIELDS;\n }\n const definition = parseDefinition(data);\n if (definition === undefined) return undefined;\n const options = parseOptions(data);\n if (options === undefined) return undefined;\n const visibility = parseVisibility(data);\n if (visibility === undefined) return undefined;\n return Object.freeze({\n definition,\n enabledByFlags: prelude.enabledByFlags,\n execution: prelude.execution,\n options,\n parseData: prelude.parseData,\n preflight: prelude.preflight,\n visibility\n });\n}\n\nfunction hasOnlyCheckKeys(data: Readonly<Record<string, unknown>>): boolean {\n return Object.keys(data).every((key) => CHECK_KEYS.some((checkKey) => checkKey === key));\n}\n\nfunction parseExecution(data: CheckAuthoringData): CheckExecution | null | undefined {\n if (!Object.hasOwn(data, \"execution\")) return null;\n return isTrustedFunction<CheckExecution>(data.execution) ? data.execution : undefined;\n}\n\nfunction parseDataParser(data: CheckAuthoringData): TrustedDataParser | null | undefined {\n if (!Object.hasOwn(data, \"parseData\") || data.parseData === undefined) return null;\n return isTrustedFunction<TrustedDataParser>(data.parseData) ? data.parseData : undefined;\n}\n\nfunction parsePreflight(data: CheckAuthoringData): CheckPreflight | null | undefined {\n if (!Object.hasOwn(data, \"preflight\")) return null;\n return isTrustedFunction<CheckPreflight>(data.preflight) ? data.preflight : undefined;\n}\n\nfunction isTrustedFunction<FunctionType extends (...parameters: never[]) => unknown>(\n value: unknown\n): value is FunctionType {\n return typeof value === \"function\";\n}\n\nfunction parseDefinition(data: CheckAuthoringData): CheckDescriptor | undefined {\n const definition = validateCheckDescriptor({\n checkId: data.checkId,\n displayName: data.displayName\n });\n return definition.ok ? definition.value : undefined;\n}\n\nfunction parseOptions(data: CheckAuthoringData): object | undefined {\n if (!Object.hasOwn(data, \"options\")) return Object.freeze({});\n const options = snapshotClosedRecord(data.options);\n if (options === undefined) return undefined;\n return snapshotJsonObject(options);\n}\n\nfunction parseEnabledByFlags(data: CheckAuthoringData): CheckFlagEnablement | null | undefined {\n if (!Object.hasOwn(data, \"enabledByFlags\")) return null;\n const control = parseFlagEnablementControl(data.enabledByFlags);\n if (control === undefined) return undefined;\n const flags = parseUniqueIdentifiers(control.flags);\n return flags === undefined ? undefined : canonicalFlagEnablement(control, flags);\n}\n\nfunction parseFlagEnablementControl(value: unknown): ParsedFlagEnablementControl | undefined {\n const control = snapshotClosedRecord(value);\n if (control === undefined || !hasOnlyFlagEnablementKeys(control)) return undefined;\n return hasFlagEnablementFields(control) ? control : undefined;\n}\n\nfunction hasFlagEnablementFields(\n control: Readonly<Record<string, unknown>>\n): control is ParsedFlagEnablementControl {\n if (!Object.hasOwn(control, \"flags\") || !Object.hasOwn(control, \"mode\")) return false;\n if (!isCheckFlagEnablementMode(control.mode)) return false;\n return !Object.hasOwn(control, \"propagateDependsOn\") || control.propagateDependsOn === true;\n}\n\nfunction canonicalFlagEnablement(\n control: ParsedFlagEnablementControl,\n flags: readonly string[]\n): CheckFlagEnablement | undefined {\n const [firstFlag, ...remainingFlags] = [...flags].sort();\n if (firstFlag === undefined) return undefined;\n const canonicalFlags: [string, ...string[]] = [firstFlag, ...remainingFlags];\n return Object.freeze({\n flags: Object.freeze(canonicalFlags),\n mode: control.mode,\n ...(control.propagateDependsOn === true ? { propagateDependsOn: true as const } : {})\n });\n}\n\nfunction hasOnlyFlagEnablementKeys(control: Readonly<Record<string, unknown>>): boolean {\n return Object.keys(control).every((key) =>\n FLAG_ENABLEMENT_KEYS.some((allowed) => allowed === key)\n );\n}\n\nfunction isCheckFlagEnablementMode(value: unknown): value is CheckFlagEnablementMode {\n return value === \"all\" || value === \"any\" || value === \"none\" || value === \"not-all\";\n}\n\nfunction parseVisibility(data: CheckAuthoringData): CheckVisibility | undefined {\n if (!Object.hasOwn(data, \"visibility\")) return \"always\";\n const visibility = data.visibility;\n return visibility === undefined || visibility === \"always\" || visibility === \"attention\"\n ? (visibility ?? \"always\")\n : undefined;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"check-fields-authoring.mjs","sourceRoot":"","sources":["../../../../src/project-definition/check-tree/check-fields-authoring.ts"],"names":[],"mappings":"AACA,OAAO,EAA+D,MAAM,sBAAsB,CAAC;AAEnG,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AA4BvE,MAAM,UAAU,GAAG;IACjB,mBAAmB;IACnB,SAAS;IACT,QAAQ;IACR,WAAW;IACX,aAAa;IACb,gBAAgB;IAChB,SAAS;IACT,SAAS;IACT,aAAa;IACb,OAAO;IACP,SAAS;IACT,UAAU;IACV,WAAW;IACX,SAAS;IACT,gBAAgB;IAChB,oBAAoB;CACZ,CAAC;AACX,MAAM,+BAA+B,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAU,CAAC;AAEhF,MAAM,sBAAsB,GAAsB,MAAM,CAAC,MAAM,CAAC;IAC9D,UAAU,EAAE,IAAI;IAChB,cAAc,EAAE,IAAI;IACpB,OAAO,EAAE,IAAI;IACb,OAAO,EAAE,IAAI;IACb,OAAO,EAAE,IAAI;IACb,SAAS,EAAE,IAAI;IACf,OAAO,EAAE,IAAI;IACb,kBAAkB,EAAE,IAAI;CACzB,CAAC,CAAC;AAEH,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,MAAM,IAAI,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACzC,OAAO,IAAI,KAAK,SAAS,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9E,CAAC;AAED,SAAS,qBAAqB,CAC5B,IAAuC;IAEvC,OAAO,CACL,gBAAgB,CAAC,IAAI,CAAC;QACtB,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ;QAChC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;QACvB,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ;QACpC,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAC5B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,IAAwB,EACxB,uBAA4D;IAE5D,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC9C,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,uBAAuB,CAAC,CAAC;IAC5D,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5C,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC9C,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,WAAW,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAChD,MAAM,cAAc,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACjD,OAAO,cAAc,KAAK,SAAS;QACjC,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;YACZ,cAAc;YACd,OAAO,EAAE,SAAS;YAClB,OAAO;YACP,SAAS;YACT,OAAO,EAAE,WAAW;SACrB,CAAC,CAAC;AACT,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,IAAwB,EACxB,OAAgC;IAEhC,IAAI,OAAO,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QAC7B,OAAO,4BAA4B,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,sBAAsB,CAAC;IAC1F,CAAC;IACD,OAAO,0BAA0B,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACnD,CAAC;AAED,wFAAwF;AACxF,SAAS,4BAA4B,CACnC,IAAwB,EACxB,OAAgC;IAEhC,OAAO,CACL,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,gBAAgB,CAAC;QACrC,OAAO,CAAC,OAAO,KAAK,IAAI;QACxB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,oBAAoB,CAAC;QACzC,OAAO,CAAC,SAAS,KAAK,IAAI;QAC1B,OAAO,CAAC,OAAO,KAAK,IAAI,CACzB,CAAC;AACJ,CAAC;AAED,kFAAkF;AAClF,SAAS,0BAA0B,CACjC,IAAwB,EACxB,OAAgC;IAEhC,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC/C,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5C,MAAM,kBAAkB,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IACzD,IAAI,kBAAkB,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACvD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,UAAU;QACV,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO;QACP,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,kBAAkB;KACnB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAuC;IAC/D,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC;AAC3F,CAAC;AAED,SAAS,cAAc,CACrB,IAAwB;IAExB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,OAAO,iBAAiB,CAAgC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACnG,CAAC;AAED,SAAS,YAAY,CACnB,IAAwB,EACxB,uBAA4D;IAE5D,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,OAAO,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,uBAAuB,KAAK,SAAS;QACnE,CAAC,CAAC,uBAAuB;QACzB,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CAAC,IAAwB;IAC/C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACnF,OAAO,iBAAiB,CAAoB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3F,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAwB;IAChD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,OAAO,iBAAiB,CAAmB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACtF,CAAC;AAED,SAAS,iBAAiB,CACxB,KAAc;IAEd,OAAO,OAAO,KAAK,KAAK,UAAU,CAAC;AACrC,CAAC;AAED,SAAS,eAAe,CAAC,IAAwB;IAC/C,MAAM,UAAU,GAAG,uBAAuB,CAAC;QACzC,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,CAAC,CAAC;IACH,OAAO,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACtD,CAAC;AAED,SAAS,YAAY,CAAC,IAAwB;IAC5C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnD,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5C,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAwB;IACnD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,gBAAgB,CAAC;QAAE,OAAO,IAAI,CAAC;IACxD,OAAO,0BAA0B,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AACzD,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,0BAA0B,CAAC,KAAc;IACvD,MAAM,OAAO,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC5C,IACE,OAAO,KAAK,SAAS;QACrB,CAAC,WAAW,CAAC,OAAO,EAAE,+BAA+B,CAAC;QACtD,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,EAC/B,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACrD,OAAO,IAAI,KAAK,SAAS,IAAI,kBAAkB,KAAK,SAAS;QAC3D,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;YACZ,IAAI;YACJ,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,IAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrE,CAAC,CAAC;AACT,CAAC;AAED,SAAS,gBAAgB,CAAC,OAA0C;IAClE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,oBAAoB,CAAC;QAAE,OAAO,KAAK,CAAC;IAChE,OAAO,OAAO,CAAC,kBAAkB,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AAChE,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAwB;IACvD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,oBAAoB,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7D,OAAO,IAAI,CAAC,kBAAkB,KAAK,SAAS,IAAI,IAAI,CAAC,kBAAkB,KAAK,IAAI;QAC9E,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,IAAI,KAAK,CAAC;QACpC,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC","sourcesContent":["import type { CheckDescriptor } from \"../../check/descriptor.ts\";\nimport { type Check, type CheckFlagEnablement, type CheckPreparation } from \"../../check/check.ts\";\nimport type { HandoffProviderIdentity } from \"../../check/handoff-provider-identity.ts\";\nimport { validateCheckDescriptor } from \"../../check/descriptor-validation.ts\";\nimport { snapshotJsonObject } from \"../../check/options-snapshot.ts\";\nimport { snapshotClosedRecord } from \"../../data-boundary/closed-values.ts\";\nimport { hasOnlyKeys, parseFlagCondition } from \"./flag-conditions.ts\";\n\nexport type TrustedDataParser = (this: void, ...parameters: never[]) => unknown;\n\nexport interface CheckAuthoringData extends Readonly<Record<string, unknown>> {\n readonly checkId: string;\n readonly displayName: string;\n}\n\nexport interface ParsedCheckFields {\n readonly definition: CheckDescriptor | null;\n readonly enabledByFlags: CheckFlagEnablement | null;\n readonly execute: NonNullable<Check[\"execute\"]> | null;\n readonly handoff: HandoffProviderIdentity | null;\n readonly options: object | null;\n readonly parseData: TrustedDataParser | null;\n readonly prepare: CheckPreparation | null;\n readonly omitQuietPassedRow: boolean | null;\n}\n\nexport interface ParsedCheckFieldPrelude {\n readonly enabledByFlags: CheckFlagEnablement | null;\n readonly execute: NonNullable<Check[\"execute\"]> | null;\n readonly handoff: HandoffProviderIdentity | null;\n readonly parseData: TrustedDataParser | null;\n readonly prepare: CheckPreparation | null;\n}\n\nconst CHECK_KEYS = [\n \"admissionPriority\",\n \"checkId\",\n \"checks\",\n \"dependsOn\",\n \"displayName\",\n \"enabledByFlags\",\n \"execute\",\n \"handoff\",\n \"maxParallel\",\n \"mutex\",\n \"options\",\n \"observes\",\n \"parseData\",\n \"prepare\",\n \"resourceClaims\",\n \"omitQuietPassedRow\"\n] as const;\nconst FLAG_ENABLEMENT_EXPRESSION_KEYS = [\"when\", \"propagateDependsOn\"] as const;\n\nconst CONTAINER_CHECK_FIELDS: ParsedCheckFields = Object.freeze({\n definition: null,\n enabledByFlags: null,\n execute: null,\n handoff: null,\n options: null,\n parseData: null,\n prepare: null,\n omitQuietPassedRow: null\n});\n\nexport function parseCheckAuthoringData(value: unknown): CheckAuthoringData | undefined {\n const data = snapshotClosedRecord(value);\n return data !== undefined && hasValidCheckIdentity(data) ? data : undefined;\n}\n\nfunction hasValidCheckIdentity(\n data: Readonly<Record<string, unknown>>\n): data is CheckAuthoringData {\n return (\n hasOnlyCheckKeys(data) &&\n typeof data.checkId === \"string\" &&\n data.checkId.length > 0 &&\n typeof data.displayName === \"string\" &&\n data.displayName.length > 0\n );\n}\n\nexport function parseCheckFieldPrelude(\n data: CheckAuthoringData,\n handoffProviderIdentity: HandoffProviderIdentity | undefined\n): ParsedCheckFieldPrelude | undefined {\n const execution = parseExecution(data);\n if (execution === undefined) return undefined;\n const handoff = parseHandoff(data, handoffProviderIdentity);\n if (handoff === undefined) return undefined;\n const parseData = parseDataParser(data);\n if (parseData === undefined) return undefined;\n const preparation = parsePreparation(data);\n if (preparation === undefined) return undefined;\n const enabledByFlags = parseEnabledByFlags(data);\n return enabledByFlags === undefined\n ? undefined\n : Object.freeze({\n enabledByFlags,\n execute: execution,\n handoff,\n parseData,\n prepare: preparation\n });\n}\n\nexport function parseCheckFields(\n data: CheckAuthoringData,\n prelude: ParsedCheckFieldPrelude\n): ParsedCheckFields | undefined {\n if (prelude.execute === null) {\n return containerHasExecutableFields(data, prelude) ? undefined : CONTAINER_CHECK_FIELDS;\n }\n return parseExecutableCheckFields(data, prelude);\n}\n\n/** Container nodes cannot carry values that only an executable callback can consume. */\nfunction containerHasExecutableFields(\n data: CheckAuthoringData,\n prelude: ParsedCheckFieldPrelude\n): boolean {\n return (\n Object.hasOwn(data, \"options\") ||\n Object.hasOwn(data, \"enabledByFlags\") ||\n prelude.handoff !== null ||\n Object.hasOwn(data, \"omitQuietPassedRow\") ||\n prelude.parseData !== null ||\n prelude.prepare !== null\n );\n}\n\n/** Parses the callback-owned fields that form one executable Check definition. */\nfunction parseExecutableCheckFields(\n data: CheckAuthoringData,\n prelude: ParsedCheckFieldPrelude\n): ParsedCheckFields | undefined {\n const definition = parseDefinition(data);\n if (definition === undefined) return undefined;\n const options = parseOptions(data);\n if (options === undefined) return undefined;\n const omitQuietPassedRow = parseOmitQuietPassedRow(data);\n if (omitQuietPassedRow === undefined) return undefined;\n return Object.freeze({\n definition,\n enabledByFlags: prelude.enabledByFlags,\n execute: prelude.execute,\n handoff: prelude.handoff,\n options,\n parseData: prelude.parseData,\n prepare: prelude.prepare,\n omitQuietPassedRow\n });\n}\n\nfunction hasOnlyCheckKeys(data: Readonly<Record<string, unknown>>): boolean {\n return Object.keys(data).every((key) => CHECK_KEYS.some((checkKey) => checkKey === key));\n}\n\nfunction parseExecution(\n data: CheckAuthoringData\n): NonNullable<Check[\"execute\"]> | null | undefined {\n if (!Object.hasOwn(data, \"execute\")) return null;\n return isTrustedFunction<NonNullable<Check[\"execute\"]>>(data.execute) ? data.execute : undefined;\n}\n\nfunction parseHandoff(\n data: CheckAuthoringData,\n handoffProviderIdentity: HandoffProviderIdentity | undefined\n): HandoffProviderIdentity | null | undefined {\n if (!Object.hasOwn(data, \"handoff\")) return null;\n return data.handoff === true && handoffProviderIdentity !== undefined\n ? handoffProviderIdentity\n : undefined;\n}\n\nfunction parseDataParser(data: CheckAuthoringData): TrustedDataParser | null | undefined {\n if (!Object.hasOwn(data, \"parseData\") || data.parseData === undefined) return null;\n return isTrustedFunction<TrustedDataParser>(data.parseData) ? data.parseData : undefined;\n}\n\nfunction parsePreparation(data: CheckAuthoringData): CheckPreparation | null | undefined {\n if (!Object.hasOwn(data, \"prepare\")) return null;\n return isTrustedFunction<CheckPreparation>(data.prepare) ? data.prepare : undefined;\n}\n\nfunction isTrustedFunction<FunctionType extends (...parameters: never[]) => unknown>(\n value: unknown\n): value is FunctionType {\n return typeof value === \"function\";\n}\n\nfunction parseDefinition(data: CheckAuthoringData): CheckDescriptor | undefined {\n const definition = validateCheckDescriptor({\n checkId: data.checkId,\n displayName: data.displayName\n });\n return definition.ok ? definition.value : undefined;\n}\n\nfunction parseOptions(data: CheckAuthoringData): object | undefined {\n if (!Object.hasOwn(data, \"options\")) return Object.freeze({});\n const options = snapshotClosedRecord(data.options);\n if (options === undefined) return undefined;\n return snapshotJsonObject(options);\n}\n\nfunction parseEnabledByFlags(data: CheckAuthoringData): CheckFlagEnablement | null | undefined {\n if (!Object.hasOwn(data, \"enabledByFlags\")) return null;\n return parseFlagEnablementControl(data.enabledByFlags);\n}\n\n/** Parses one closed flag-enablement field without validating its Project flag references. */\nexport function parseFlagEnablementControl(value: unknown): CheckFlagEnablement | undefined {\n const control = snapshotClosedRecord(value);\n if (\n control === undefined ||\n !hasOnlyKeys(control, FLAG_ENABLEMENT_EXPRESSION_KEYS) ||\n !Object.hasOwn(control, \"when\")\n ) {\n return undefined;\n }\n const when = parseFlagCondition(control.when);\n const propagateDependsOn = parsePropagation(control);\n return when === undefined || propagateDependsOn === undefined\n ? undefined\n : Object.freeze({\n when,\n ...(propagateDependsOn ? { propagateDependsOn: true as const } : {})\n });\n}\n\nfunction parsePropagation(control: Readonly<Record<string, unknown>>): boolean | undefined {\n if (!Object.hasOwn(control, \"propagateDependsOn\")) return false;\n return control.propagateDependsOn === true ? true : undefined;\n}\n\nfunction parseOmitQuietPassedRow(data: CheckAuthoringData): boolean | undefined {\n if (!Object.hasOwn(data, \"omitQuietPassedRow\")) return false;\n return data.omitQuietPassedRow === undefined || data.omitQuietPassedRow === true\n ? (data.omitQuietPassedRow ?? false)\n : undefined;\n}\n"]}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { snapshotClosedArray, snapshotClosedRecord } from "../../data-boundary/closed-values.mjs";
|
|
2
|
+
const FLAG_CONDITION_MAX_DEPTH = 16;
|
|
3
|
+
const FLAG_CONDITION_MAX_NODES = 256;
|
|
4
|
+
/** Parses and snapshots one bounded recursive flag condition while retaining child order and multiplicity. */
|
|
5
|
+
export function parseFlagCondition(value) {
|
|
6
|
+
return parseBoundedFlagCondition(value, 1, { nodes: 0 });
|
|
7
|
+
}
|
|
8
|
+
/** Checks that a closed record has no author-supplied keys outside this grammar fragment. */
|
|
9
|
+
export function hasOnlyKeys(value, keys) {
|
|
10
|
+
return Object.keys(value).every((key) => keys.includes(key));
|
|
11
|
+
}
|
|
12
|
+
function parseBoundedFlagCondition(value, depth, state) {
|
|
13
|
+
if (exceedsFlagConditionBounds(depth, state))
|
|
14
|
+
return undefined;
|
|
15
|
+
if (isNonEmptyIdentifier(value))
|
|
16
|
+
return value;
|
|
17
|
+
const condition = snapshotClosedRecord(value);
|
|
18
|
+
const kind = condition?.kind;
|
|
19
|
+
if (condition === undefined || typeof kind !== "string")
|
|
20
|
+
return undefined;
|
|
21
|
+
return kind === "not"
|
|
22
|
+
? parseFlagNegationCondition(condition, depth, state)
|
|
23
|
+
: parseFlagConditionSet(condition, kind, depth, state);
|
|
24
|
+
}
|
|
25
|
+
function exceedsFlagConditionBounds(depth, state) {
|
|
26
|
+
state.nodes += 1;
|
|
27
|
+
return depth > FLAG_CONDITION_MAX_DEPTH || state.nodes > FLAG_CONDITION_MAX_NODES;
|
|
28
|
+
}
|
|
29
|
+
function parseFlagNegationCondition(condition, depth, state) {
|
|
30
|
+
if (!hasOnlyKeys(condition, ["condition", "kind"]) || !Object.hasOwn(condition, "condition")) {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
const child = parseBoundedFlagCondition(condition.condition, depth + 1, state);
|
|
34
|
+
return child === undefined ? undefined : Object.freeze({ condition: child, kind: "not" });
|
|
35
|
+
}
|
|
36
|
+
function parseFlagConditionSet(condition, kind, depth, state) {
|
|
37
|
+
if (!isFlagConditionSetKind(kind))
|
|
38
|
+
return undefined;
|
|
39
|
+
const conditions = parseFlagConditionChildren(condition, depth, state);
|
|
40
|
+
return conditions === undefined ? undefined : Object.freeze({ kind, conditions });
|
|
41
|
+
}
|
|
42
|
+
function parseFlagConditionChildren(condition, depth, state) {
|
|
43
|
+
if (!hasOnlyKeys(condition, ["conditions", "kind"]) || !Object.hasOwn(condition, "conditions")) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
const children = snapshotClosedArray(condition.conditions);
|
|
47
|
+
if (children === undefined || children.length === 0)
|
|
48
|
+
return undefined;
|
|
49
|
+
const normalized = [];
|
|
50
|
+
for (const child of children) {
|
|
51
|
+
const parsed = parseBoundedFlagCondition(child, depth + 1, state);
|
|
52
|
+
if (parsed === undefined)
|
|
53
|
+
return undefined;
|
|
54
|
+
normalized.push(parsed);
|
|
55
|
+
}
|
|
56
|
+
const [firstCondition, ...remainingConditions] = normalized;
|
|
57
|
+
return firstCondition === undefined
|
|
58
|
+
? undefined
|
|
59
|
+
: Object.freeze([firstCondition, ...remainingConditions]);
|
|
60
|
+
}
|
|
61
|
+
function isNonEmptyIdentifier(value) {
|
|
62
|
+
return typeof value === "string" && value.length > 0;
|
|
63
|
+
}
|
|
64
|
+
function isFlagConditionSetKind(value) {
|
|
65
|
+
return (value === "all" ||
|
|
66
|
+
value === "any" ||
|
|
67
|
+
value === "none" ||
|
|
68
|
+
value === "not-all" ||
|
|
69
|
+
value === "exactly-one");
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=flag-conditions.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flag-conditions.mjs","sourceRoot":"","sources":["../../../../src/project-definition/check-tree/flag-conditions.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CheckFlagCondition } from \"../../check/check.ts\";\nimport { snapshotClosedArray, snapshotClosedRecord } from \"../../data-boundary/closed-values.ts\";\n\nconst FLAG_CONDITION_MAX_DEPTH = 16;\nconst FLAG_CONDITION_MAX_NODES = 256;\n\n/** Parses and snapshots one bounded recursive flag condition while retaining child order and multiplicity. */\nexport function parseFlagCondition(value: unknown): CheckFlagCondition | undefined {\n return parseBoundedFlagCondition(value, 1, { nodes: 0 });\n}\n\n/** Checks that a closed record has no author-supplied keys outside this grammar fragment. */\nexport function hasOnlyKeys(\n value: Readonly<Record<string, unknown>>,\n keys: readonly string[]\n): boolean {\n return Object.keys(value).every((key) => keys.includes(key));\n}\n\nfunction parseBoundedFlagCondition(\n value: unknown,\n depth: number,\n state: { nodes: number }\n): CheckFlagCondition | undefined {\n if (exceedsFlagConditionBounds(depth, state)) return undefined;\n if (isNonEmptyIdentifier(value)) return value;\n const condition = snapshotClosedRecord(value);\n const kind = condition?.kind;\n if (condition === undefined || typeof kind !== \"string\") return undefined;\n return kind === \"not\"\n ? parseFlagNegationCondition(condition, depth, state)\n : parseFlagConditionSet(condition, kind, depth, state);\n}\n\nfunction exceedsFlagConditionBounds(depth: number, state: { nodes: number }): boolean {\n state.nodes += 1;\n return depth > FLAG_CONDITION_MAX_DEPTH || state.nodes > FLAG_CONDITION_MAX_NODES;\n}\n\nfunction parseFlagNegationCondition(\n condition: Readonly<Record<string, unknown>>,\n depth: number,\n state: { nodes: number }\n): CheckFlagCondition | undefined {\n if (!hasOnlyKeys(condition, [\"condition\", \"kind\"]) || !Object.hasOwn(condition, \"condition\")) {\n return undefined;\n }\n const child = parseBoundedFlagCondition(condition.condition, depth + 1, state);\n return child === undefined ? undefined : Object.freeze({ condition: child, kind: \"not\" });\n}\n\nfunction parseFlagConditionSet(\n condition: Readonly<Record<string, unknown>>,\n kind: string,\n depth: number,\n state: { nodes: number }\n): CheckFlagCondition | undefined {\n if (!isFlagConditionSetKind(kind)) return undefined;\n const conditions = parseFlagConditionChildren(condition, depth, state);\n return conditions === undefined ? undefined : Object.freeze({ kind, conditions });\n}\n\nfunction parseFlagConditionChildren(\n condition: Readonly<Record<string, unknown>>,\n depth: number,\n state: { nodes: number }\n): readonly [CheckFlagCondition, ...CheckFlagCondition[]] | undefined {\n if (!hasOnlyKeys(condition, [\"conditions\", \"kind\"]) || !Object.hasOwn(condition, \"conditions\")) {\n return undefined;\n }\n const children = snapshotClosedArray(condition.conditions);\n if (children === undefined || children.length === 0) return undefined;\n const normalized: CheckFlagCondition[] = [];\n for (const child of children) {\n const parsed = parseBoundedFlagCondition(child, depth + 1, state);\n if (parsed === undefined) return undefined;\n normalized.push(parsed);\n }\n const [firstCondition, ...remainingConditions] = normalized;\n return firstCondition === undefined\n ? undefined\n : Object.freeze([firstCondition, ...remainingConditions]);\n}\n\nfunction isNonEmptyIdentifier(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n\nfunction isFlagConditionSetKind(\n value: string\n): value is \"all\" | \"any\" | \"none\" | \"not-all\" | \"exactly-one\" {\n return (\n value === \"all\" ||\n value === \"any\" ||\n value === \"none\" ||\n value === \"not-all\" ||\n value === \"exactly-one\"\n );\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { inherit } from "../../check/check.mjs";
|
|
2
|
+
import { bindHandoffProviderIdentity } from "../../check/handoff-provider-identity.mjs";
|
|
2
3
|
/** Rebuilds the validated public authoring shape without retaining untyped input. */
|
|
3
4
|
export function materializeCheckTreeAuthoring(parsed) {
|
|
4
5
|
return materializeChecks(parsed.checks);
|
|
@@ -12,8 +13,8 @@ function materializeCheck(check) {
|
|
|
12
13
|
const enabledByFlags = check.enabledByFlags;
|
|
13
14
|
const mutex = materializeCollection(check.mutex);
|
|
14
15
|
const observes = materializeCollection(check.observes);
|
|
15
|
-
const
|
|
16
|
-
const
|
|
16
|
+
const omitQuietPassedRow = check.omitQuietPassedRow;
|
|
17
|
+
const preparation = check.prepare;
|
|
17
18
|
const scheduling = {
|
|
18
19
|
...(check.admissionPriority === undefined
|
|
19
20
|
? {}
|
|
@@ -25,9 +26,9 @@ function materializeCheck(check) {
|
|
|
25
26
|
...(check.resourceClaims === undefined ? {} : { resourceClaims: check.resourceClaims })
|
|
26
27
|
};
|
|
27
28
|
if (check.definition === null ||
|
|
28
|
-
check.
|
|
29
|
+
check.execute === null ||
|
|
29
30
|
check.options === null ||
|
|
30
|
-
|
|
31
|
+
omitQuietPassedRow === null) {
|
|
31
32
|
return Object.freeze({
|
|
32
33
|
checkId: check.checkId,
|
|
33
34
|
checks,
|
|
@@ -35,18 +36,22 @@ function materializeCheck(check) {
|
|
|
35
36
|
...scheduling
|
|
36
37
|
});
|
|
37
38
|
}
|
|
38
|
-
|
|
39
|
+
const materialized = Object.freeze({
|
|
39
40
|
checkId: check.checkId,
|
|
40
41
|
checks,
|
|
41
42
|
displayName: check.displayName,
|
|
42
43
|
...(enabledByFlags === null ? {} : { enabledByFlags }),
|
|
43
|
-
|
|
44
|
+
execute: check.execute,
|
|
45
|
+
...(check.handoff === null ? {} : { handoff: true }),
|
|
44
46
|
...(check.parseData === null ? {} : { parseData: check.parseData }),
|
|
45
47
|
options: check.options,
|
|
46
|
-
...(
|
|
48
|
+
...(preparation === null ? {} : { prepare: preparation }),
|
|
47
49
|
...scheduling,
|
|
48
|
-
|
|
50
|
+
...(omitQuietPassedRow ? { omitQuietPassedRow: true } : {})
|
|
49
51
|
});
|
|
52
|
+
if (check.handoff !== null)
|
|
53
|
+
bindHandoffProviderIdentity(materialized, check.handoff);
|
|
54
|
+
return materialized;
|
|
50
55
|
}
|
|
51
56
|
function materializeCollection(collection) {
|
|
52
57
|
if (collection === undefined)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"materialization.mjs","sourceRoot":"","sources":["../../../../src/project-definition/check-tree/materialization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAA+C,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"materialization.mjs","sourceRoot":"","sources":["../../../../src/project-definition/check-tree/materialization.ts"],"names":[],"mappings":"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","sourcesContent":["import { inherit, type Check, type InheritableCheckCollection } from \"../../check/check.ts\";\nimport { bindHandoffProviderIdentity } from \"../../check/handoff-provider-identity.ts\";\nimport type { ParsedCheck, ParsedCheckCollection, ParsedCheckTree } from \"./authoring.ts\";\n\n/** Rebuilds the validated public authoring shape without retaining untyped input. */\nexport function materializeCheckTreeAuthoring(parsed: ParsedCheckTree): readonly Check[] {\n return materializeChecks(parsed.checks);\n}\n\nfunction materializeChecks(checks: readonly ParsedCheck[]): readonly Check[] {\n return Object.freeze(checks.map((check) => materializeCheck(check)));\n}\n\nfunction materializeCheck(check: ParsedCheck): Check {\n const checks = materializeChecks(check.checks);\n const dependsOn = materializeCollection(check.dependsOn);\n const enabledByFlags = check.enabledByFlags;\n const mutex = materializeCollection(check.mutex);\n const observes = materializeCollection(check.observes);\n const omitQuietPassedRow = check.omitQuietPassedRow;\n const preparation = check.prepare;\n const scheduling = {\n ...(check.admissionPriority === undefined\n ? {}\n : { admissionPriority: check.admissionPriority }),\n ...(dependsOn === undefined ? {} : { dependsOn }),\n ...(check.maxParallel === undefined ? {} : { maxParallel: check.maxParallel }),\n ...(mutex === undefined ? {} : { mutex }),\n ...(observes === undefined ? {} : { observes }),\n ...(check.resourceClaims === undefined ? {} : { resourceClaims: check.resourceClaims })\n };\n if (\n check.definition === null ||\n check.execute === null ||\n check.options === null ||\n omitQuietPassedRow === null\n ) {\n return Object.freeze({\n checkId: check.checkId,\n checks,\n displayName: check.displayName,\n ...scheduling\n });\n }\n const materialized = Object.freeze({\n checkId: check.checkId,\n checks,\n displayName: check.displayName,\n ...(enabledByFlags === null ? {} : { enabledByFlags }),\n execute: check.execute,\n ...(check.handoff === null ? {} : { handoff: true }),\n ...(check.parseData === null ? {} : { parseData: check.parseData }),\n options: check.options,\n ...(preparation === null ? {} : { prepare: preparation }),\n ...scheduling,\n ...(omitQuietPassedRow ? { omitQuietPassedRow: true as const } : {})\n });\n if (check.handoff !== null) bindHandoffProviderIdentity(materialized, check.handoff);\n return materialized;\n}\n\nfunction materializeCollection(\n collection: ParsedCheckCollection | undefined\n): InheritableCheckCollection<string> | undefined {\n if (collection === undefined) return undefined;\n if (collection.kind === \"exact\") return collection.values;\n return inherit({ add: collection.add, remove: collection.remove });\n}\n"]}
|
|
@@ -53,24 +53,25 @@ function resolveScheduling(check, inherited) {
|
|
|
53
53
|
});
|
|
54
54
|
}
|
|
55
55
|
function resolvedLeafFor(check, scheduling) {
|
|
56
|
-
const
|
|
57
|
-
if (check.
|
|
56
|
+
const omitQuietPassedRow = check.omitQuietPassedRow;
|
|
57
|
+
if (check.execute !== null &&
|
|
58
58
|
check.definition !== null &&
|
|
59
59
|
check.options !== null &&
|
|
60
|
-
|
|
60
|
+
omitQuietPassedRow !== null) {
|
|
61
61
|
return Object.freeze({
|
|
62
62
|
admissionPriority: scheduling.admissionPriority,
|
|
63
63
|
definition: check.definition,
|
|
64
64
|
dependsOn: scheduling.dependsOn,
|
|
65
65
|
...(check.enabledByFlags === null ? {} : { enabledByFlags: check.enabledByFlags }),
|
|
66
|
-
|
|
66
|
+
execute: check.execute,
|
|
67
|
+
...(check.handoff === null ? {} : { handoff: check.handoff }),
|
|
67
68
|
maxParallel: scheduling.maxParallel,
|
|
68
69
|
mutex: scheduling.mutex,
|
|
69
70
|
observes: scheduling.observes,
|
|
70
71
|
options: check.options,
|
|
71
|
-
...(check.
|
|
72
|
+
...(check.prepare === null ? {} : { prepare: check.prepare }),
|
|
72
73
|
resourceClaims: scheduling.resourceClaims,
|
|
73
|
-
|
|
74
|
+
omitQuietPassedRow
|
|
74
75
|
});
|
|
75
76
|
}
|
|
76
77
|
return undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolution.mjs","sourceRoot":"","sources":["../../../../src/project-definition/check-tree/resolution.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"resolution.mjs","sourceRoot":"","sources":["../../../../src/project-definition/check-tree/resolution.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CheckDescriptor } from \"../../check/descriptor.ts\";\nimport type { Check, CheckPreparation, CheckFlagEnablement } from \"../../check/check.ts\";\nimport type { HandoffProviderIdentity } from \"../../check/handoff-provider-identity.ts\";\nimport {\n parseCheckTreeAuthoring,\n type MeaninglessCheckWarning,\n type ParsedCheck,\n type ParsedCheckCollection,\n type ParsedCheckTree\n} from \"./authoring.ts\";\nimport { EMPTY_RESOURCE_UNIT_MAPPING, type ResourceUnitMapping } from \"../resource-unit-mapping.ts\";\n\nexport type { Check, InheritableCheckCollection } from \"../../check/check.ts\";\n\nexport interface ResolvedCheckTreeLeaf {\n readonly admissionPriority: number;\n readonly definition: CheckDescriptor;\n readonly dependsOn: readonly string[];\n readonly enabledByFlags?: CheckFlagEnablement;\n readonly execute: NonNullable<Check[\"execute\"]>;\n readonly handoff?: HandoffProviderIdentity;\n readonly maxParallel: number;\n readonly mutex: readonly string[];\n readonly observes: readonly string[];\n readonly options: object;\n readonly prepare?: CheckPreparation;\n readonly resourceClaims: ResourceUnitMapping;\n readonly omitQuietPassedRow: boolean;\n}\n\nexport interface ResolvedCheckTree {\n readonly leaves: readonly ResolvedCheckTreeLeaf[];\n readonly warnings: readonly MeaninglessCheckWarning[];\n}\n\ninterface InheritedScheduling {\n readonly admissionPriority: number;\n readonly dependsOn: readonly string[];\n readonly maxParallel: number;\n readonly mutex: readonly string[];\n readonly observes: readonly string[];\n readonly resourceClaims: ResourceUnitMapping;\n}\n\n/**\n * Traverses the recursive authoring tree. Containment only passes scheduling\n * values to descendants; it never creates an execution dependency or output\n * hierarchy.\n */\nexport function resolveCheckTree(\n value: unknown,\n rootMaxParallel: number,\n resourceCapacities: ResourceUnitMapping = EMPTY_RESOURCE_UNIT_MAPPING\n): ResolvedCheckTree | undefined {\n const parsed = parseCheckTreeAuthoring(value);\n return parsed === undefined\n ? undefined\n : resolveParsedCheckTree(parsed, rootMaxParallel, resourceCapacities);\n}\n\nexport function resolveParsedCheckTree(\n parsed: ParsedCheckTree,\n rootMaxParallel: number,\n resourceCapacities: ResourceUnitMapping = EMPTY_RESOURCE_UNIT_MAPPING\n): ResolvedCheckTree | undefined {\n if (!Number.isSafeInteger(rootMaxParallel) || rootMaxParallel <= 0) return undefined;\n const leaves: ResolvedCheckTreeLeaf[] = [];\n const root: InheritedScheduling = Object.freeze({\n admissionPriority: 0,\n dependsOn: Object.freeze([]),\n maxParallel: rootMaxParallel,\n mutex: Object.freeze([]),\n observes: Object.freeze([]),\n resourceClaims: EMPTY_RESOURCE_UNIT_MAPPING\n });\n for (const check of parsed.checks) {\n if (!flattenCheck(check, root, resourceCapacities, leaves)) return undefined;\n }\n return Object.freeze({ leaves: Object.freeze(leaves), warnings: parsed.warnings });\n}\n\nfunction flattenCheck(\n check: ParsedCheck,\n inherited: InheritedScheduling,\n resourceCapacities: ResourceUnitMapping,\n leaves: ResolvedCheckTreeLeaf[]\n): boolean {\n const scheduling = resolveScheduling(check, inherited);\n if (!claimsFitCapacities(scheduling.resourceClaims, resourceCapacities)) return false;\n const leaf = resolvedLeafFor(check, scheduling);\n if (leaf !== undefined) leaves.push(leaf);\n for (const child of check.checks) {\n if (!flattenCheck(child, scheduling, resourceCapacities, leaves)) return false;\n }\n return true;\n}\n\nfunction resolveScheduling(\n check: ParsedCheck,\n inherited: InheritedScheduling\n): InheritedScheduling {\n return Object.freeze({\n admissionPriority: check.admissionPriority ?? inherited.admissionPriority,\n dependsOn: resolveCollection(inherited.dependsOn, check.dependsOn),\n maxParallel: check.maxParallel ?? inherited.maxParallel,\n mutex: resolveCollection(inherited.mutex, check.mutex),\n observes: resolveCollection(inherited.observes, check.observes),\n resourceClaims: check.resourceClaims ?? inherited.resourceClaims\n });\n}\n\nfunction resolvedLeafFor(\n check: ParsedCheck,\n scheduling: InheritedScheduling\n): ResolvedCheckTreeLeaf | undefined {\n const omitQuietPassedRow = check.omitQuietPassedRow;\n if (\n check.execute !== null &&\n check.definition !== null &&\n check.options !== null &&\n omitQuietPassedRow !== null\n ) {\n return Object.freeze({\n admissionPriority: scheduling.admissionPriority,\n definition: check.definition,\n dependsOn: scheduling.dependsOn,\n ...(check.enabledByFlags === null ? {} : { enabledByFlags: check.enabledByFlags }),\n execute: check.execute,\n ...(check.handoff === null ? {} : { handoff: check.handoff }),\n maxParallel: scheduling.maxParallel,\n mutex: scheduling.mutex,\n observes: scheduling.observes,\n options: check.options,\n ...(check.prepare === null ? {} : { prepare: check.prepare }),\n resourceClaims: scheduling.resourceClaims,\n omitQuietPassedRow\n });\n }\n return undefined;\n}\n\nfunction claimsFitCapacities(\n claims: ResourceUnitMapping,\n capacities: ResourceUnitMapping\n): boolean {\n return Object.entries(claims).every(\n ([resourceId, units]) =>\n Object.hasOwn(capacities, resourceId) && units <= (capacities[resourceId] ?? 0)\n );\n}\n\nfunction resolveCollection(\n inherited: readonly string[],\n authored: ParsedCheckCollection | undefined\n): readonly string[] {\n if (authored === undefined) return inherited;\n if (authored.kind === \"exact\") return canonicalize(authored.values);\n const removed = new Set(authored.remove);\n return canonicalize([...inherited.filter((value) => !removed.has(value)), ...authored.add]);\n}\n\nfunction canonicalize(values: readonly string[]): readonly string[] {\n return Object.freeze([...new Set(values)].sort());\n}\n"]}
|
|
@@ -6,11 +6,12 @@ import { isNonArrayRecord } from "../data-boundary/value-shapes.mjs";
|
|
|
6
6
|
*/
|
|
7
7
|
export function createDeclarativeProjectSnapshot(definition, checks) {
|
|
8
8
|
const declarations = checks
|
|
9
|
-
.map(({
|
|
9
|
+
.map(({ execute: _execution, handoff: _handoff, prepare: _preparation, ...declaration }) => declaration)
|
|
10
10
|
.sort((left, right) => compareText(left.definition.checkId, right.definition.checkId));
|
|
11
11
|
return deepFreeze({
|
|
12
12
|
apiVersion: definition.apiVersion,
|
|
13
13
|
checks: declarations,
|
|
14
|
+
...(definition.changes === undefined ? {} : { changes: definition.changes }),
|
|
14
15
|
outputs: declarativeOutputs(definition),
|
|
15
16
|
scheduler: Object.freeze({
|
|
16
17
|
admissionPolicy: declarativeAdmissionPolicy(definition.scheduler.admissionPolicy),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"declarative-snapshot.mjs","sourceRoot":"","sources":["../../../src/project-definition/declarative-snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AASzC,OAAO,EAAE,8BAA8B,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"declarative-snapshot.mjs","sourceRoot":"","sources":["../../../src/project-definition/declarative-snapshot.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\n\nimport type { AdmissionPolicy, DeclarativeSchedulerPolicy } from \"./scheduler-policy.ts\";\nimport type {\n DeclarativeProjectOutputs,\n DeclarativeProjectSnapshot,\n NormalizedCheck,\n ProjectDefinition\n} from \"./project-definition.ts\";\nimport { resolveProgressRenderingOutput } from \"./output-defaults.ts\";\nimport { isNonArrayRecord } from \"../data-boundary/value-shapes.ts\";\nimport type { NormalizedProjectChangesConfiguration } from \"./project-changes.ts\";\n\n/**\n * Produces the immutable, callback-free Definition identity consumed by fingerprinting.\n */\nexport function createDeclarativeProjectSnapshot(\n definition: Omit<ProjectDefinition, \"changes\"> & {\n readonly changes?: NormalizedProjectChangesConfiguration;\n },\n checks: readonly NormalizedCheck[]\n): DeclarativeProjectSnapshot {\n const declarations = checks\n .map(\n ({ execute: _execution, handoff: _handoff, prepare: _preparation, ...declaration }) =>\n declaration\n )\n .sort((left, right) => compareText(left.definition.checkId, right.definition.checkId));\n return deepFreeze({\n apiVersion: definition.apiVersion,\n checks: declarations,\n ...(definition.changes === undefined ? {} : { changes: definition.changes }),\n outputs: declarativeOutputs(definition),\n scheduler: Object.freeze({\n admissionPolicy: declarativeAdmissionPolicy(definition.scheduler.admissionPolicy),\n maxParallel: definition.scheduler.maxParallel,\n resourceCapacities: definition.scheduler.resourceCapacities\n })\n });\n}\n\nfunction declarativeOutputs(definition: ProjectDefinition): DeclarativeProjectOutputs {\n const progressRendering = resolveProgressRenderingOutput(definition.outputs.progressRendering);\n return Object.freeze({\n diagnosticLogging: definition.outputs.diagnosticLogging,\n machinePublication: definition.outputs.machinePublication,\n progressRendering: Object.freeze({\n enabled: progressRendering.enabled,\n formatter: progressRendering.formatter === null ? \"default\" : \"custom\",\n messagePreviewLimit: progressRendering.messagePreviewLimit,\n recordPreviewLimit: progressRendering.recordPreviewLimit,\n textPreviewCodePointLimit: progressRendering.textPreviewCodePointLimit\n })\n });\n}\n\n/** Generates the stable SHA-256 fingerprint for one declarative Definition snapshot. */\nexport function createDeclarativeFingerprint(snapshot: DeclarativeProjectSnapshot): string {\n return createHash(\"sha256\").update(stableJson(snapshot)).digest(\"hex\");\n}\n\nfunction declarativeAdmissionPolicy(\n policy: AdmissionPolicy\n): DeclarativeSchedulerPolicy[\"admissionPolicy\"] {\n if (policy.kind === \"custom\") {\n return Object.freeze({\n kind: \"custom\" as const,\n strategy: Object.freeze({ kind: policy.strategy.kind })\n });\n }\n return Object.freeze({ kind: \"static\" as const });\n}\n\nfunction compareText(left: string, right: string): number {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n\nfunction deepFreeze<T>(value: T): T {\n if (typeof value !== \"object\" || value === null || Object.isFrozen(value)) return value;\n for (const item of Object.values(value)) deepFreeze(item);\n return Object.freeze(value);\n}\n\nfunction stableJson(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(stableJson).join(\",\")}]`;\n if (isNonArrayRecord(value))\n return `{${Object.keys(value)\n .sort()\n .map((key) => `${JSON.stringify(key)}:${stableJson(value[key])}`)\n .join(\",\")}}`;\n return JSON.stringify(value);\n}\n"]}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { hasExactPlainRecordKeys, snapshotClosedArray, snapshotClosedPolicyRecord, snapshotClosedRecord } from "../data-boundary/closed-values.mjs";
|
|
2
|
+
/**
|
|
3
|
+
* 解析并冻结 change preparation 的 closed Definition grammar。
|
|
4
|
+
* Runtime Git acquisition 与 region matching 有各自的 Run owner,不在此边界执行。
|
|
5
|
+
*/
|
|
6
|
+
export function parseProjectChangesConfiguration(value) {
|
|
7
|
+
const data = snapshotClosedRecord(value);
|
|
8
|
+
if (data === undefined || !hasExactPlainRecordKeys(data, ["flags", "source"]))
|
|
9
|
+
return undefined;
|
|
10
|
+
const source = parseSource(data.source);
|
|
11
|
+
const flags = parseFlags(data.flags);
|
|
12
|
+
return source === undefined || flags === undefined ? undefined : Object.freeze({ flags, source });
|
|
13
|
+
}
|
|
14
|
+
function parseSource(value) {
|
|
15
|
+
const source = snapshotClosedRecord(value);
|
|
16
|
+
if (source === undefined ||
|
|
17
|
+
!hasExactPlainRecordKeys(source, ["compareWith"]) ||
|
|
18
|
+
!isGitComparisonRevision(source.compareWith)) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
return Object.freeze({ compareWith: source.compareWith });
|
|
22
|
+
}
|
|
23
|
+
function parseFlags(value) {
|
|
24
|
+
const flags = snapshotClosedRecord(value);
|
|
25
|
+
if (flags === undefined || Object.keys(flags).length === 0)
|
|
26
|
+
return undefined;
|
|
27
|
+
const parsed = {};
|
|
28
|
+
for (const [flagId, region] of Object.entries(flags)) {
|
|
29
|
+
if (!isNonEmptyString(flagId))
|
|
30
|
+
return undefined;
|
|
31
|
+
const normalizedRegion = parseRegion(region);
|
|
32
|
+
if (normalizedRegion === undefined)
|
|
33
|
+
return undefined;
|
|
34
|
+
Object.defineProperty(parsed, flagId, {
|
|
35
|
+
configurable: false,
|
|
36
|
+
enumerable: true,
|
|
37
|
+
value: normalizedRegion,
|
|
38
|
+
writable: false
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return Object.freeze(parsed);
|
|
42
|
+
}
|
|
43
|
+
function parseRegion(value) {
|
|
44
|
+
const region = snapshotClosedPolicyRecord(value, {
|
|
45
|
+
optional: ["exclude"],
|
|
46
|
+
required: ["include"]
|
|
47
|
+
});
|
|
48
|
+
if (region === undefined)
|
|
49
|
+
return undefined;
|
|
50
|
+
const exclude = Object.hasOwn(region, "exclude")
|
|
51
|
+
? parseStringArray(region.exclude)
|
|
52
|
+
: Object.freeze([]);
|
|
53
|
+
const include = parseStringArray(region.include);
|
|
54
|
+
return exclude === undefined || include === undefined
|
|
55
|
+
? undefined
|
|
56
|
+
: Object.freeze({ exclude, include });
|
|
57
|
+
}
|
|
58
|
+
function parseStringArray(value) {
|
|
59
|
+
const values = snapshotClosedArray(value);
|
|
60
|
+
return values === undefined || !values.every(isNonEmptyString)
|
|
61
|
+
? undefined
|
|
62
|
+
: Object.freeze([...values]);
|
|
63
|
+
}
|
|
64
|
+
function isGitComparisonRevision(value) {
|
|
65
|
+
return isNonEmptyString(value) && !value.startsWith("-") && !value.includes("\0");
|
|
66
|
+
}
|
|
67
|
+
function isNonEmptyString(value) {
|
|
68
|
+
return typeof value === "string" && value.length > 0;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=project-changes.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-changes.mjs","sourceRoot":"","sources":["../../../src/project-definition/project-changes.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n hasExactPlainRecordKeys,\n snapshotClosedArray,\n snapshotClosedPolicyRecord,\n snapshotClosedRecord\n} from \"../data-boundary/closed-values.ts\";\n\n/** Project 自有的 Git comparison,用于为一次 Run 推导 change flags。 */\nexport interface ProjectChangeSource {\n /** 作为 comparison base 的 Git revision。 */\n readonly compareWith: string;\n}\n\n/** 一个 change flag 的 project-root-relative、exclude-first glob region。 */\nexport interface ProjectChangeFlagRegion {\n /** 可省略的排除 glob;省略等同空数组,显式 undefined 不是合法数组。 */\n readonly exclude?: readonly string[];\n readonly include: readonly string[];\n}\n\n/** 由 Project Definition 拥有的静态 change preparation 配置。 */\nexport interface ProjectChangesConfiguration {\n readonly source: ProjectChangeSource;\n /** 至少一个非空 author ID 到其匹配 region 的映射。 */\n readonly flags: Readonly<Record<string, ProjectChangeFlagRegion>>;\n}\n\n/** Definition 已验证、补齐并冻结的 region;Run 不再解释 authoring defaults。 */\nexport interface NormalizedProjectChangeFlagRegion extends ProjectChangeFlagRegion {\n readonly exclude: readonly string[];\n}\n\n/** 仅供 Definition snapshot 与 Run 消费的完整 change 配置。 */\nexport interface NormalizedProjectChangesConfiguration extends ProjectChangesConfiguration {\n readonly flags: Readonly<Record<string, NormalizedProjectChangeFlagRegion>>;\n}\n\n/**\n * 解析并冻结 change preparation 的 closed Definition grammar。\n * Runtime Git acquisition 与 region matching 有各自的 Run owner,不在此边界执行。\n */\nexport function parseProjectChangesConfiguration(\n value: unknown\n): NormalizedProjectChangesConfiguration | undefined {\n const data = snapshotClosedRecord(value);\n if (data === undefined || !hasExactPlainRecordKeys(data, [\"flags\", \"source\"])) return undefined;\n const source = parseSource(data.source);\n const flags = parseFlags(data.flags);\n return source === undefined || flags === undefined ? undefined : Object.freeze({ flags, source });\n}\n\nfunction parseSource(value: unknown): ProjectChangeSource | undefined {\n const source = snapshotClosedRecord(value);\n if (\n source === undefined ||\n !hasExactPlainRecordKeys(source, [\"compareWith\"]) ||\n !isGitComparisonRevision(source.compareWith)\n ) {\n return undefined;\n }\n return Object.freeze({ compareWith: source.compareWith });\n}\n\nfunction parseFlags(\n value: unknown\n): Readonly<Record<string, NormalizedProjectChangeFlagRegion>> | undefined {\n const flags = snapshotClosedRecord(value);\n if (flags === undefined || Object.keys(flags).length === 0) return undefined;\n const parsed: Record<string, NormalizedProjectChangeFlagRegion> = {};\n for (const [flagId, region] of Object.entries(flags)) {\n if (!isNonEmptyString(flagId)) return undefined;\n const normalizedRegion = parseRegion(region);\n if (normalizedRegion === undefined) return undefined;\n Object.defineProperty(parsed, flagId, {\n configurable: false,\n enumerable: true,\n value: normalizedRegion,\n writable: false\n });\n }\n return Object.freeze(parsed);\n}\n\nfunction parseRegion(value: unknown): NormalizedProjectChangeFlagRegion | undefined {\n const region = snapshotClosedPolicyRecord(value, {\n optional: [\"exclude\"],\n required: [\"include\"]\n });\n if (region === undefined) return undefined;\n const exclude = Object.hasOwn(region, \"exclude\")\n ? parseStringArray(region.exclude)\n : Object.freeze([]);\n const include = parseStringArray(region.include);\n return exclude === undefined || include === undefined\n ? undefined\n : Object.freeze({ exclude, include });\n}\n\nfunction parseStringArray(value: unknown): readonly string[] | undefined {\n const values = snapshotClosedArray(value);\n return values === undefined || !values.every(isNonEmptyString)\n ? undefined\n : Object.freeze([...values]);\n}\n\nfunction isGitComparisonRevision(value: unknown): value is string {\n return isNonEmptyString(value) && !value.startsWith(\"-\") && !value.includes(\"\\0\");\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n"]}
|
|
@@ -5,7 +5,14 @@ import { parseOutputs } from "./output-validation.mjs";
|
|
|
5
5
|
import {} from "./project-definition.mjs";
|
|
6
6
|
import { snapshotClosedArray, snapshotClosedPolicyRecord, snapshotClosedRecord } from "../data-boundary/closed-values.mjs";
|
|
7
7
|
import { snapshotResourceUnitMapping } from "./resource-unit-mapping.mjs";
|
|
8
|
-
|
|
8
|
+
import { parseProjectChangesConfiguration } from "./project-changes.mjs";
|
|
9
|
+
const PROJECT_DEFINITION_KEYS = [
|
|
10
|
+
"apiVersion",
|
|
11
|
+
"changes",
|
|
12
|
+
"checks",
|
|
13
|
+
"outputs",
|
|
14
|
+
"scheduler"
|
|
15
|
+
];
|
|
9
16
|
/**
|
|
10
17
|
* Validates one closed Definition before Run can invoke any project callback.
|
|
11
18
|
* Successful validation carries information-only Check warnings separately.
|
|
@@ -28,6 +35,12 @@ function parseProjectDefinitionFields(data) {
|
|
|
28
35
|
const scheduler = parseScheduler(data.scheduler);
|
|
29
36
|
if (scheduler === undefined)
|
|
30
37
|
return invalidDefinition("definition.scheduler");
|
|
38
|
+
const changes = Object.hasOwn(data, "changes")
|
|
39
|
+
? parseProjectChangesConfiguration(data.changes)
|
|
40
|
+
: undefined;
|
|
41
|
+
if (Object.hasOwn(data, "changes") && changes === undefined) {
|
|
42
|
+
return invalidDefinition("definition.changes");
|
|
43
|
+
}
|
|
31
44
|
const checks = snapshotClosedArray(data.checks);
|
|
32
45
|
if (checks === undefined)
|
|
33
46
|
return invalidDefinition("definition.checks");
|
|
@@ -37,6 +50,9 @@ function parseProjectDefinitionFields(data) {
|
|
|
37
50
|
const tree = resolveParsedCheckTree(parsedChecks, scheduler.maxParallel, scheduler.resourceCapacities);
|
|
38
51
|
if (tree === undefined)
|
|
39
52
|
return invalidDefinition("definition.checks");
|
|
53
|
+
if (!hasOnlyKnownChangeFlagReferences(tree.leaves, changes)) {
|
|
54
|
+
return invalidDefinition("definition.checks");
|
|
55
|
+
}
|
|
40
56
|
const outputs = parseOutputs(data.outputs);
|
|
41
57
|
if (outputs === undefined)
|
|
42
58
|
return invalidDefinition("definition.outputs");
|
|
@@ -45,12 +61,28 @@ function parseProjectDefinitionFields(data) {
|
|
|
45
61
|
value: {
|
|
46
62
|
apiVersion: "1",
|
|
47
63
|
checks: materializeCheckTreeAuthoring(parsedChecks),
|
|
64
|
+
...(changes === undefined ? {} : { changes }),
|
|
48
65
|
outputs,
|
|
49
66
|
scheduler
|
|
50
67
|
},
|
|
51
68
|
warnings: tree.warnings
|
|
52
69
|
});
|
|
53
70
|
}
|
|
71
|
+
function hasOnlyKnownChangeFlagReferences(checks, changes) {
|
|
72
|
+
return checks.every((check) => check.enabledByFlags === undefined ||
|
|
73
|
+
hasOnlyKnownChangeFlagConditionReferences(check.enabledByFlags.when, changes));
|
|
74
|
+
}
|
|
75
|
+
function hasOnlyKnownChangeFlagConditionReferences(condition, changes) {
|
|
76
|
+
if (typeof condition === "string") {
|
|
77
|
+
const prefix = "vibe-check:change:";
|
|
78
|
+
return (!condition.startsWith(prefix) ||
|
|
79
|
+
(changes !== undefined && Object.hasOwn(changes.flags, condition.slice(prefix.length))));
|
|
80
|
+
}
|
|
81
|
+
if (condition.kind === "not") {
|
|
82
|
+
return hasOnlyKnownChangeFlagConditionReferences(condition.condition, changes);
|
|
83
|
+
}
|
|
84
|
+
return condition.conditions.every((child) => hasOnlyKnownChangeFlagConditionReferences(child, changes));
|
|
85
|
+
}
|
|
54
86
|
function exactProjectDefinition(value) {
|
|
55
87
|
const data = exactRecord(value, PROJECT_DEFINITION_KEYS, "invalid-project-definition", "definition");
|
|
56
88
|
if (!data.ok)
|
|
@@ -70,7 +102,7 @@ function exactRecord(value, allowedKeys, kind, path) {
|
|
|
70
102
|
}
|
|
71
103
|
function parseScheduler(value) {
|
|
72
104
|
const data = snapshotClosedPolicyRecord(value, {
|
|
73
|
-
optional: ["admissionPolicy", "
|
|
105
|
+
optional: ["admissionPolicy", "terminalEffects", "resourceCapacities"],
|
|
74
106
|
required: ["maxParallel"]
|
|
75
107
|
});
|
|
76
108
|
if (data === undefined)
|
|
@@ -80,8 +112,8 @@ function parseScheduler(value) {
|
|
|
80
112
|
: Object.freeze({ kind: "static" });
|
|
81
113
|
if (admissionPolicy === undefined)
|
|
82
114
|
return undefined;
|
|
83
|
-
const
|
|
84
|
-
if (
|
|
115
|
+
const terminalEffects = parseTerminalEffects(data.terminalEffects);
|
|
116
|
+
if (terminalEffects === undefined)
|
|
85
117
|
return undefined;
|
|
86
118
|
const resourceCapacities = snapshotResourceUnitMapping(Object.hasOwn(data, "resourceCapacities") ? data.resourceCapacities : {});
|
|
87
119
|
if (resourceCapacities === undefined)
|
|
@@ -89,25 +121,25 @@ function parseScheduler(value) {
|
|
|
89
121
|
const maxParallel = positiveSafeInteger(data.maxParallel);
|
|
90
122
|
if (maxParallel === undefined)
|
|
91
123
|
return undefined;
|
|
92
|
-
return Object.freeze({ admissionPolicy, maxParallel,
|
|
124
|
+
return Object.freeze({ admissionPolicy, maxParallel, terminalEffects, resourceCapacities });
|
|
93
125
|
}
|
|
94
126
|
function positiveSafeInteger(value) {
|
|
95
127
|
return typeof value === "number" && Number.isSafeInteger(value) && value > 0 ? value : undefined;
|
|
96
128
|
}
|
|
97
|
-
function
|
|
129
|
+
function parseTerminalEffects(value) {
|
|
98
130
|
if (value === undefined)
|
|
99
131
|
return Object.freeze([]);
|
|
100
132
|
if (!Array.isArray(value))
|
|
101
133
|
return undefined;
|
|
102
134
|
const hooks = [];
|
|
103
135
|
for (const hook of value) {
|
|
104
|
-
if (!
|
|
136
|
+
if (!isTerminalEffect(hook))
|
|
105
137
|
return undefined;
|
|
106
138
|
hooks.push(hook);
|
|
107
139
|
}
|
|
108
140
|
return Object.freeze(hooks);
|
|
109
141
|
}
|
|
110
|
-
function
|
|
142
|
+
function isTerminalEffect(value) {
|
|
111
143
|
return typeof value === "function";
|
|
112
144
|
}
|
|
113
145
|
function parseAdmissionPolicy(value) {
|