@zxyycom/vibe-check 0.0.1
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/LICENSE +21 -0
- package/README.md +154 -0
- package/dist/esm/check/check.mjs +5 -0
- package/dist/esm/check/check.mjs.map +1 -0
- package/dist/esm/check/descriptor-validation.mjs +37 -0
- package/dist/esm/check/descriptor-validation.mjs.map +1 -0
- package/dist/esm/check/descriptor.mjs +2 -0
- package/dist/esm/check/descriptor.mjs.map +1 -0
- package/dist/esm/check/inherited-collection.mjs +62 -0
- package/dist/esm/check/inherited-collection.mjs.map +1 -0
- package/dist/esm/check/options-snapshot.mjs +75 -0
- package/dist/esm/check/options-snapshot.mjs.map +1 -0
- package/dist/esm/check-settlement/fact-validation.mjs +216 -0
- package/dist/esm/check-settlement/fact-validation.mjs.map +1 -0
- package/dist/esm/check-settlement/facts.mjs +2 -0
- package/dist/esm/check-settlement/facts.mjs.map +1 -0
- package/dist/esm/check-settlement/outcome-normalization.mjs +80 -0
- package/dist/esm/check-settlement/outcome-normalization.mjs.map +1 -0
- package/dist/esm/check-settlement/record-store.mjs +59 -0
- package/dist/esm/check-settlement/record-store.mjs.map +1 -0
- package/dist/esm/check-settlement/session.mjs +179 -0
- package/dist/esm/check-settlement/session.mjs.map +1 -0
- package/dist/esm/data-boundary/canonical-data.mjs +159 -0
- package/dist/esm/data-boundary/canonical-data.mjs.map +1 -0
- package/dist/esm/data-boundary/canonical-json.mjs +2 -0
- package/dist/esm/data-boundary/canonical-json.mjs.map +1 -0
- package/dist/esm/data-boundary/closed-values.mjs +98 -0
- package/dist/esm/data-boundary/closed-values.mjs.map +1 -0
- package/dist/esm/data-boundary/value-shapes.mjs +13 -0
- package/dist/esm/data-boundary/value-shapes.mjs.map +1 -0
- package/dist/esm/finding-waivers/reconciliation.mjs +84 -0
- package/dist/esm/finding-waivers/reconciliation.mjs.map +1 -0
- package/dist/esm/index.mjs +26 -0
- package/dist/esm/index.mjs.map +1 -0
- package/dist/esm/machine-output/v4/atomic-publication.mjs +102 -0
- package/dist/esm/machine-output/v4/atomic-publication.mjs.map +1 -0
- package/dist/esm/machine-output/v4/freeze-publication-value.mjs +14 -0
- package/dist/esm/machine-output/v4/freeze-publication-value.mjs.map +1 -0
- package/dist/esm/machine-output/v4/projection.mjs +23 -0
- package/dist/esm/machine-output/v4/projection.mjs.map +1 -0
- package/dist/esm/machine-output/v4/publication-invariants.mjs +59 -0
- package/dist/esm/machine-output/v4/publication-invariants.mjs.map +1 -0
- package/dist/esm/machine-output/v4/publication-model.mjs +19 -0
- package/dist/esm/machine-output/v4/publication-model.mjs.map +1 -0
- package/dist/esm/machine-output/v4/publish.mjs +20 -0
- package/dist/esm/machine-output/v4/publish.mjs.map +1 -0
- package/dist/esm/machine-output/v4/records-fingerprint.mjs +9 -0
- package/dist/esm/machine-output/v4/records-fingerprint.mjs.map +1 -0
- package/dist/esm/machine-output/v4/schema-identities.mjs +8 -0
- package/dist/esm/machine-output/v4/schema-identities.mjs.map +1 -0
- package/dist/esm/machine-output/v4/schema.mjs +50 -0
- package/dist/esm/machine-output/v4/schema.mjs.map +1 -0
- package/dist/esm/machine-output/v4/serializers.mjs +9 -0
- package/dist/esm/machine-output/v4/serializers.mjs.map +1 -0
- package/dist/esm/machine-output/v4/validation-result.mjs +16 -0
- package/dist/esm/machine-output/v4/validation-result.mjs.map +1 -0
- package/dist/esm/machine-output/v4/validation.mjs +131 -0
- package/dist/esm/machine-output/v4/validation.mjs.map +1 -0
- package/dist/esm/package-checks/code-quality-findings/policy.mjs +49 -0
- package/dist/esm/package-checks/code-quality-findings/policy.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/area-policy.mjs +71 -0
- package/dist/esm/package-checks/duplicate-detection/area-policy.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/cache/cache-contract.mjs +2 -0
- package/dist/esm/package-checks/duplicate-detection/cache/cache-contract.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/cache/identity.mjs +37 -0
- package/dist/esm/package-checks/duplicate-detection/cache/identity.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/cache/key.mjs +38 -0
- package/dist/esm/package-checks/duplicate-detection/cache/key.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/cache/payload.mjs +47 -0
- package/dist/esm/package-checks/duplicate-detection/cache/payload.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/cache/store.mjs +44 -0
- package/dist/esm/package-checks/duplicate-detection/cache/store.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/default-check.mjs +39 -0
- package/dist/esm/package-checks/duplicate-detection/default-check.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/execution.mjs +124 -0
- package/dist/esm/package-checks/duplicate-detection/execution.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/final-data.mjs +6 -0
- package/dist/esm/package-checks/duplicate-detection/final-data.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs +77 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/command-path.mjs +6 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/command-path.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/command-resolution.mjs +87 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/command-resolution.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/json-report.mjs +94 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/json-report.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/scanner-contract.mjs +2 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/scanner-contract.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/scanner.mjs +180 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/scanner.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/scoped-fragments.mjs +10 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/scoped-fragments.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/measurement-model.mjs +2 -0
- package/dist/esm/package-checks/duplicate-detection/measurement-model.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/measurement.mjs +151 -0
- package/dist/esm/package-checks/duplicate-detection/measurement.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/options-resolution.mjs +126 -0
- package/dist/esm/package-checks/duplicate-detection/options-resolution.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/options-validation.mjs +60 -0
- package/dist/esm/package-checks/duplicate-detection/options-validation.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/options.mjs +2 -0
- package/dist/esm/package-checks/duplicate-detection/options.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/project-revision.mjs +5 -0
- package/dist/esm/package-checks/duplicate-detection/project-revision.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/records.mjs +119 -0
- package/dist/esm/package-checks/duplicate-detection/records.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/constructor.mjs +39 -0
- package/dist/esm/package-checks/file-metrics/constructor.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/execution.mjs +170 -0
- package/dist/esm/package-checks/file-metrics/execution.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/final-data.mjs +6 -0
- package/dist/esm/package-checks/file-metrics/final-data.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/measurement-model.mjs +2 -0
- package/dist/esm/package-checks/file-metrics/measurement-model.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/measurement.mjs +33 -0
- package/dist/esm/package-checks/file-metrics/measurement.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/options-resolution.mjs +171 -0
- package/dist/esm/package-checks/file-metrics/options-resolution.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/options-validation.mjs +82 -0
- package/dist/esm/package-checks/file-metrics/options-validation.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/options.mjs +2 -0
- package/dist/esm/package-checks/file-metrics/options.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/records.mjs +109 -0
- package/dist/esm/package-checks/file-metrics/records.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/scc/availability.mjs +59 -0
- package/dist/esm/package-checks/file-metrics/scc/availability.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/scc/csv.mjs +17 -0
- package/dist/esm/package-checks/file-metrics/scc/csv.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/scc/parser.mjs +145 -0
- package/dist/esm/package-checks/file-metrics/scc/parser.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/scc/scanner.mjs +54 -0
- package/dist/esm/package-checks/file-metrics/scc/scanner.mjs.map +1 -0
- package/dist/esm/package-checks/final-data-parsing.mjs +35 -0
- package/dist/esm/package-checks/final-data-parsing.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analysis.mjs +96 -0
- package/dist/esm/package-checks/function-metrics/analysis.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/constructor.mjs +43 -0
- package/dist/esm/package-checks/function-metrics/constructor.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/execution.mjs +178 -0
- package/dist/esm/package-checks/function-metrics/execution.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/final-data.mjs +6 -0
- package/dist/esm/package-checks/function-metrics/final-data.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/lizard/availability.mjs +64 -0
- package/dist/esm/package-checks/function-metrics/lizard/availability.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/lizard/csv.mjs +17 -0
- package/dist/esm/package-checks/function-metrics/lizard/csv.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/lizard/parser.mjs +138 -0
- package/dist/esm/package-checks/function-metrics/lizard/parser.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/lizard/scanner.mjs +35 -0
- package/dist/esm/package-checks/function-metrics/lizard/scanner.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/measurement-model.mjs +2 -0
- package/dist/esm/package-checks/function-metrics/measurement-model.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/measurement.mjs +35 -0
- package/dist/esm/package-checks/function-metrics/measurement.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/options-resolution.mjs +171 -0
- package/dist/esm/package-checks/function-metrics/options-resolution.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/options-validation.mjs +71 -0
- package/dist/esm/package-checks/function-metrics/options-validation.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/options.mjs +2 -0
- package/dist/esm/package-checks/function-metrics/options.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/records.mjs +133 -0
- package/dist/esm/package-checks/function-metrics/records.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/target-files.mjs +75 -0
- package/dist/esm/package-checks/function-metrics/target-files.mjs.map +1 -0
- package/dist/esm/package-checks/host-environment/error-message.mjs +4 -0
- package/dist/esm/package-checks/host-environment/error-message.mjs.map +1 -0
- package/dist/esm/package-checks/host-environment/filesystem.mjs +81 -0
- package/dist/esm/package-checks/host-environment/filesystem.mjs.map +1 -0
- package/dist/esm/package-checks/host-environment/git.mjs +51 -0
- package/dist/esm/package-checks/host-environment/git.mjs.map +1 -0
- package/dist/esm/package-checks/host-environment/path.mjs +18 -0
- package/dist/esm/package-checks/host-environment/path.mjs.map +1 -0
- package/dist/esm/package-checks/host-environment/process/command.mjs +13 -0
- package/dist/esm/package-checks/host-environment/process/command.mjs.map +1 -0
- package/dist/esm/package-checks/host-environment/process/contract.mjs +2 -0
- package/dist/esm/package-checks/host-environment/process/contract.mjs.map +1 -0
- package/dist/esm/package-checks/host-environment/process/env.mjs +19 -0
- package/dist/esm/package-checks/host-environment/process/env.mjs.map +1 -0
- package/dist/esm/package-checks/host-environment/process/failure.mjs +34 -0
- package/dist/esm/package-checks/host-environment/process/failure.mjs.map +1 -0
- package/dist/esm/package-checks/host-environment/process/result.mjs +33 -0
- package/dist/esm/package-checks/host-environment/process/result.mjs.map +1 -0
- package/dist/esm/package-checks/host-environment/process/runner.mjs +30 -0
- package/dist/esm/package-checks/host-environment/process/runner.mjs.map +1 -0
- package/dist/esm/package-checks/json-document/strict-document.mjs +163 -0
- package/dist/esm/package-checks/json-document/strict-document.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/default-check.mjs +39 -0
- package/dist/esm/package-checks/json-schema-validation/default-check.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/execution-stages.mjs +141 -0
- package/dist/esm/package-checks/json-schema-validation/execution-stages.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/final-data.mjs +64 -0
- package/dist/esm/package-checks/json-schema-validation/final-data.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/issue-collector.mjs +35 -0
- package/dist/esm/package-checks/json-schema-validation/issue-collector.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/json-schema-validation.mjs +118 -0
- package/dist/esm/package-checks/json-schema-validation/json-schema-validation.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/options-resolution.mjs +45 -0
- package/dist/esm/package-checks/json-schema-validation/options-resolution.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/options-validation.mjs +212 -0
- package/dist/esm/package-checks/json-schema-validation/options-validation.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/options.mjs +2 -0
- package/dist/esm/package-checks/json-schema-validation/options.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/reference-resolver.mjs +128 -0
- package/dist/esm/package-checks/json-schema-validation/reference-resolver.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/remote-response.mjs +71 -0
- package/dist/esm/package-checks/json-schema-validation/remote-response.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/schema-engine.mjs +190 -0
- package/dist/esm/package-checks/json-schema-validation/schema-engine.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/schema-policy.mjs +234 -0
- package/dist/esm/package-checks/json-schema-validation/schema-policy.mjs.map +1 -0
- package/dist/esm/package-checks/json-validation/default-check.mjs +39 -0
- package/dist/esm/package-checks/json-validation/default-check.mjs.map +1 -0
- package/dist/esm/package-checks/json-validation/final-data.mjs +27 -0
- package/dist/esm/package-checks/json-validation/final-data.mjs.map +1 -0
- package/dist/esm/package-checks/json-validation/json-validation.mjs +138 -0
- package/dist/esm/package-checks/json-validation/json-validation.mjs.map +1 -0
- package/dist/esm/package-checks/json-validation/options-resolution.mjs +33 -0
- package/dist/esm/package-checks/json-validation/options-resolution.mjs.map +1 -0
- package/dist/esm/package-checks/json-validation/options-validation.mjs +16 -0
- package/dist/esm/package-checks/json-validation/options-validation.mjs.map +1 -0
- package/dist/esm/package-checks/json-validation/options.mjs +2 -0
- package/dist/esm/package-checks/json-validation/options.mjs.map +1 -0
- package/dist/esm/package-checks/maintenance-reminders/assessment-results.mjs +73 -0
- package/dist/esm/package-checks/maintenance-reminders/assessment-results.mjs.map +1 -0
- package/dist/esm/package-checks/maintenance-reminders/final-data.mjs +153 -0
- package/dist/esm/package-checks/maintenance-reminders/final-data.mjs.map +1 -0
- package/dist/esm/package-checks/maintenance-reminders/maintenance-reminders.mjs +155 -0
- package/dist/esm/package-checks/maintenance-reminders/maintenance-reminders.mjs.map +1 -0
- package/dist/esm/package-checks/maintenance-reminders/maintenance-support.mjs +58 -0
- package/dist/esm/package-checks/maintenance-reminders/maintenance-support.mjs.map +1 -0
- package/dist/esm/package-checks/maintenance-reminders/measurement.mjs +125 -0
- package/dist/esm/package-checks/maintenance-reminders/measurement.mjs.map +1 -0
- package/dist/esm/package-checks/maintenance-reminders/options-validation.mjs +72 -0
- package/dist/esm/package-checks/maintenance-reminders/options-validation.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/default-check.mjs +55 -0
- package/dist/esm/package-checks/markdown-link-validation/default-check.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/execution.mjs +199 -0
- package/dist/esm/package-checks/markdown-link-validation/execution.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/filesystem-probes.mjs +109 -0
- package/dist/esm/package-checks/markdown-link-validation/filesystem-probes.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/final-data.mjs +28 -0
- package/dist/esm/package-checks/markdown-link-validation/final-data.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/local-resolution.mjs +158 -0
- package/dist/esm/package-checks/markdown-link-validation/local-resolution.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/local-resolver.mjs +17 -0
- package/dist/esm/package-checks/markdown-link-validation/local-resolver.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/markdown-parser.mjs +191 -0
- package/dist/esm/package-checks/markdown-link-validation/markdown-parser.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs +83 -0
- package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs +50 -0
- package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/options.mjs +2 -0
- package/dist/esm/package-checks/markdown-link-validation/options.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/records.mjs +32 -0
- package/dist/esm/package-checks/markdown-link-validation/records.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/resolver-engine.mjs +196 -0
- package/dist/esm/package-checks/markdown-link-validation/resolver-engine.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/target-descriptor.mjs +23 -0
- package/dist/esm/package-checks/markdown-link-validation/target-descriptor.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/traversal-result.mjs +41 -0
- package/dist/esm/package-checks/markdown-link-validation/traversal-result.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/collection.mjs +142 -0
- package/dist/esm/package-checks/project-files/collection.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/config-glob.mjs +11 -0
- package/dist/esm/package-checks/project-files/config-glob.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/configuration.mjs +104 -0
- package/dist/esm/package-checks/project-files/configuration.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/exact-input-measurement.mjs +24 -0
- package/dist/esm/package-checks/project-files/exact-input-measurement.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/file-fingerprint.mjs +36 -0
- package/dist/esm/package-checks/project-files/file-fingerprint.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/gitlink-revision.mjs +57 -0
- package/dist/esm/package-checks/project-files/gitlink-revision.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/gitlink-worktree.mjs +72 -0
- package/dist/esm/package-checks/project-files/gitlink-worktree.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/input-eligibility.mjs +13 -0
- package/dist/esm/package-checks/project-files/input-eligibility.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/reported-path.mjs +30 -0
- package/dist/esm/package-checks/project-files/reported-path.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/revision-paths.mjs +19 -0
- package/dist/esm/package-checks/project-files/revision-paths.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/revision-worktree-files.mjs +102 -0
- package/dist/esm/package-checks/project-files/revision-worktree-files.mjs.map +1 -0
- package/dist/esm/project-definition/check-tree/authoring.mjs +242 -0
- package/dist/esm/project-definition/check-tree/authoring.mjs.map +1 -0
- package/dist/esm/project-definition/check-tree/materialization.mjs +50 -0
- package/dist/esm/project-definition/check-tree/materialization.mjs.map +1 -0
- package/dist/esm/project-definition/check-tree/resolution.mjs +60 -0
- package/dist/esm/project-definition/check-tree/resolution.mjs.map +1 -0
- package/dist/esm/project-definition/output-defaults.mjs +7 -0
- package/dist/esm/project-definition/output-defaults.mjs.map +1 -0
- package/dist/esm/project-definition/output-validation.mjs +44 -0
- package/dist/esm/project-definition/output-validation.mjs.map +1 -0
- package/dist/esm/project-definition/project-definition-validation.mjs +95 -0
- package/dist/esm/project-definition/project-definition-validation.mjs.map +1 -0
- package/dist/esm/project-definition/project-definition.mjs +92 -0
- package/dist/esm/project-definition/project-definition.mjs.map +1 -0
- package/dist/esm/project-run/aggregation.mjs +66 -0
- package/dist/esm/project-run/aggregation.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/callback.mjs +70 -0
- package/dist/esm/project-run/check-execution/callback.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/dependencies.mjs +50 -0
- package/dist/esm/project-run/check-execution/dependencies.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/execution-finalization.mjs +103 -0
- package/dist/esm/project-run/check-execution/execution-finalization.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/execution-settlement.mjs +90 -0
- package/dist/esm/project-run/check-execution/execution-settlement.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/messages.mjs +38 -0
- package/dist/esm/project-run/check-execution/messages.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/plan.mjs +35 -0
- package/dist/esm/project-run/check-execution/plan.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/preflight-result.mjs +83 -0
- package/dist/esm/project-run/check-execution/preflight-result.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/preflight.mjs +186 -0
- package/dist/esm/project-run/check-execution/preflight.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/resolved-checks.mjs +168 -0
- package/dist/esm/project-run/check-execution/resolved-checks.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/terminal-result.mjs +49 -0
- package/dist/esm/project-run/check-execution/terminal-result.mjs.map +1 -0
- package/dist/esm/project-run/completion.mjs +173 -0
- package/dist/esm/project-run/completion.mjs.map +1 -0
- package/dist/esm/project-run/controls/contract.mjs +2 -0
- package/dist/esm/project-run/controls/contract.mjs.map +1 -0
- package/dist/esm/project-run/controls/outputs-override-validation.mjs +61 -0
- package/dist/esm/project-run/controls/outputs-override-validation.mjs.map +1 -0
- package/dist/esm/project-run/controls/validation-result.mjs +2 -0
- package/dist/esm/project-run/controls/validation-result.mjs.map +1 -0
- package/dist/esm/project-run/controls/validation.mjs +156 -0
- package/dist/esm/project-run/controls/validation.mjs.map +1 -0
- package/dist/esm/project-run/diagnostic-logging/diagnostic-detail-rendering.mjs +182 -0
- package/dist/esm/project-run/diagnostic-logging/diagnostic-detail-rendering.mjs.map +1 -0
- package/dist/esm/project-run/diagnostic-logging/logger.mjs +242 -0
- package/dist/esm/project-run/diagnostic-logging/logger.mjs.map +1 -0
- package/dist/esm/project-run/invocation-creation.mjs +111 -0
- package/dist/esm/project-run/invocation-creation.mjs.map +1 -0
- package/dist/esm/project-run/invocation.mjs +195 -0
- package/dist/esm/project-run/invocation.mjs.map +1 -0
- package/dist/esm/project-run/machine-publication.mjs +16 -0
- package/dist/esm/project-run/machine-publication.mjs.map +1 -0
- package/dist/esm/project-run/output-configuration.mjs +17 -0
- package/dist/esm/project-run/output-configuration.mjs.map +1 -0
- package/dist/esm/project-run/output-status.mjs +43 -0
- package/dist/esm/project-run/output-status.mjs.map +1 -0
- package/dist/esm/project-run/progress-rendering/presentation.mjs +135 -0
- package/dist/esm/project-run/progress-rendering/presentation.mjs.map +1 -0
- package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs +100 -0
- package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs.map +1 -0
- package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs +123 -0
- package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs.map +1 -0
- package/dist/esm/project-run/progress-rendering/renderer.mjs +12 -0
- package/dist/esm/project-run/progress-rendering/renderer.mjs.map +1 -0
- package/dist/esm/project-run/project-context.mjs +8 -0
- package/dist/esm/project-run/project-context.mjs.map +1 -0
- package/dist/esm/project-run/result.mjs +54 -0
- package/dist/esm/project-run/result.mjs.map +1 -0
- package/dist/esm/project-run/run.mjs +23 -0
- package/dist/esm/project-run/run.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/execution-state.mjs +66 -0
- package/dist/esm/project-run/task-scheduler/execution-state.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/graph-validation.mjs +119 -0
- package/dist/esm/project-run/task-scheduler/graph-validation.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/graph.mjs +116 -0
- package/dist/esm/project-run/task-scheduler/graph.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/scheduler-admission-decision.mjs +82 -0
- package/dist/esm/project-run/task-scheduler/scheduler-admission-decision.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/scheduler-blocker-summary.mjs +27 -0
- package/dist/esm/project-run/task-scheduler/scheduler-blocker-summary.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/scheduler-decision-inspection.mjs +125 -0
- package/dist/esm/project-run/task-scheduler/scheduler-decision-inspection.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/scheduler-decision-model.mjs +45 -0
- package/dist/esm/project-run/task-scheduler/scheduler-decision-model.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/scheduler-decision.mjs +74 -0
- package/dist/esm/project-run/task-scheduler/scheduler-decision.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/scheduler.mjs +147 -0
- package/dist/esm/project-run/task-scheduler/scheduler.mjs.map +1 -0
- package/docs/api-mechanics.md +205 -0
- package/docs/checks/duplicate-detection.md +195 -0
- package/docs/checks/file-metrics.md +229 -0
- package/docs/checks/function-metrics.md +222 -0
- package/docs/checks/json-schema-validation.md +190 -0
- package/docs/checks/json-validation.md +133 -0
- package/docs/checks/maintenance-reminders.md +158 -0
- package/docs/checks/markdown-link-validation.md +192 -0
- package/docs/examples/artifacts/mixed-outcomes/definition.ts +195 -0
- package/docs/examples/artifacts/mixed-outcomes/records.ndjson +2 -0
- package/docs/examples/artifacts/mixed-outcomes/run.json +70 -0
- package/docs/output.md +97 -0
- package/docs/schemas/vibe-check-record.schema.json +33 -0
- package/docs/schemas/vibe-check-run.schema.json +173 -0
- package/index.mjs +1 -0
- package/package.json +49 -0
- package/src/check/check.ts +497 -0
- package/src/check/descriptor-validation.ts +60 -0
- package/src/check/descriptor.ts +5 -0
- package/src/check/inherited-collection.ts +101 -0
- package/src/check/options-snapshot.ts +80 -0
- package/src/check-settlement/fact-validation.ts +289 -0
- package/src/check-settlement/facts.ts +27 -0
- package/src/check-settlement/outcome-normalization.ts +118 -0
- package/src/check-settlement/record-store.ts +73 -0
- package/src/check-settlement/session.ts +257 -0
- package/src/data-boundary/canonical-data.ts +188 -0
- package/src/data-boundary/canonical-json.ts +11 -0
- package/src/data-boundary/closed-values.ts +126 -0
- package/src/data-boundary/value-shapes.ts +15 -0
- package/src/finding-waivers/reconciliation.ts +176 -0
- package/src/index.ts +123 -0
- package/src/machine-output/v4/atomic-publication.ts +123 -0
- package/src/machine-output/v4/freeze-publication-value.ts +12 -0
- package/src/machine-output/v4/projection.ts +36 -0
- package/src/machine-output/v4/publication-invariants.ts +89 -0
- package/src/machine-output/v4/publication-model.ts +38 -0
- package/src/machine-output/v4/publish.ts +23 -0
- package/src/machine-output/v4/records-fingerprint.ts +12 -0
- package/src/machine-output/v4/schema-identities.ts +8 -0
- package/src/machine-output/v4/schema.ts +97 -0
- package/src/machine-output/v4/serializers.ts +18 -0
- package/src/machine-output/v4/validation-result.ts +59 -0
- package/src/machine-output/v4/validation.ts +166 -0
- package/src/package-checks/code-quality-findings/policy.ts +85 -0
- package/src/package-checks/duplicate-detection/area-policy.ts +103 -0
- package/src/package-checks/duplicate-detection/cache/cache-contract.ts +49 -0
- package/src/package-checks/duplicate-detection/cache/identity.ts +61 -0
- package/src/package-checks/duplicate-detection/cache/key.ts +46 -0
- package/src/package-checks/duplicate-detection/cache/payload.ts +78 -0
- package/src/package-checks/duplicate-detection/cache/store.ts +77 -0
- package/src/package-checks/duplicate-detection/default-check.ts +50 -0
- package/src/package-checks/duplicate-detection/execution.ts +168 -0
- package/src/package-checks/duplicate-detection/final-data.ts +10 -0
- package/src/package-checks/duplicate-detection/jscpd/availability.ts +137 -0
- package/src/package-checks/duplicate-detection/jscpd/command-path.ts +8 -0
- package/src/package-checks/duplicate-detection/jscpd/command-resolution.ts +112 -0
- package/src/package-checks/duplicate-detection/jscpd/json-report.ts +137 -0
- package/src/package-checks/duplicate-detection/jscpd/scanner-contract.ts +18 -0
- package/src/package-checks/duplicate-detection/jscpd/scanner.ts +257 -0
- package/src/package-checks/duplicate-detection/jscpd/scoped-fragments.ts +17 -0
- package/src/package-checks/duplicate-detection/measurement-model.ts +44 -0
- package/src/package-checks/duplicate-detection/measurement.ts +223 -0
- package/src/package-checks/duplicate-detection/options-resolution.ts +162 -0
- package/src/package-checks/duplicate-detection/options-validation.ts +75 -0
- package/src/package-checks/duplicate-detection/options.ts +72 -0
- package/src/package-checks/duplicate-detection/project-revision.ts +5 -0
- package/src/package-checks/duplicate-detection/records.ts +171 -0
- package/src/package-checks/file-metrics/constructor.ts +46 -0
- package/src/package-checks/file-metrics/execution.ts +233 -0
- package/src/package-checks/file-metrics/final-data.ts +10 -0
- package/src/package-checks/file-metrics/measurement-model.ts +10 -0
- package/src/package-checks/file-metrics/measurement.ts +52 -0
- package/src/package-checks/file-metrics/options-resolution.ts +213 -0
- package/src/package-checks/file-metrics/options-validation.ts +104 -0
- package/src/package-checks/file-metrics/options.ts +91 -0
- package/src/package-checks/file-metrics/records.ts +182 -0
- package/src/package-checks/file-metrics/scc/availability.ts +100 -0
- package/src/package-checks/file-metrics/scc/csv.ts +20 -0
- package/src/package-checks/file-metrics/scc/parser.ts +223 -0
- package/src/package-checks/file-metrics/scc/scanner.ts +68 -0
- package/src/package-checks/final-data-parsing.ts +49 -0
- package/src/package-checks/function-metrics/analysis.ts +138 -0
- package/src/package-checks/function-metrics/constructor.ts +55 -0
- package/src/package-checks/function-metrics/execution.ts +263 -0
- package/src/package-checks/function-metrics/final-data.ts +10 -0
- package/src/package-checks/function-metrics/lizard/availability.ts +90 -0
- package/src/package-checks/function-metrics/lizard/csv.ts +20 -0
- package/src/package-checks/function-metrics/lizard/parser.ts +179 -0
- package/src/package-checks/function-metrics/lizard/scanner.ts +62 -0
- package/src/package-checks/function-metrics/measurement-model.ts +30 -0
- package/src/package-checks/function-metrics/measurement.ts +57 -0
- package/src/package-checks/function-metrics/options-resolution.ts +215 -0
- package/src/package-checks/function-metrics/options-validation.ts +89 -0
- package/src/package-checks/function-metrics/options.ts +84 -0
- package/src/package-checks/function-metrics/records.ts +254 -0
- package/src/package-checks/function-metrics/target-files.ts +85 -0
- package/src/package-checks/host-environment/error-message.ts +3 -0
- package/src/package-checks/host-environment/filesystem.ts +110 -0
- package/src/package-checks/host-environment/git.ts +68 -0
- package/src/package-checks/host-environment/path.ts +20 -0
- package/src/package-checks/host-environment/process/command.ts +21 -0
- package/src/package-checks/host-environment/process/contract.ts +56 -0
- package/src/package-checks/host-environment/process/env.ts +25 -0
- package/src/package-checks/host-environment/process/failure.ts +40 -0
- package/src/package-checks/host-environment/process/result.ts +39 -0
- package/src/package-checks/host-environment/process/runner.ts +47 -0
- package/src/package-checks/json-document/strict-document.ts +209 -0
- package/src/package-checks/json-schema-validation/default-check.ts +54 -0
- package/src/package-checks/json-schema-validation/execution-stages.ts +230 -0
- package/src/package-checks/json-schema-validation/final-data.ts +115 -0
- package/src/package-checks/json-schema-validation/issue-collector.ts +43 -0
- package/src/package-checks/json-schema-validation/json-schema-validation.ts +191 -0
- package/src/package-checks/json-schema-validation/options-resolution.ts +61 -0
- package/src/package-checks/json-schema-validation/options-validation.ts +256 -0
- package/src/package-checks/json-schema-validation/options.ts +66 -0
- package/src/package-checks/json-schema-validation/reference-resolver.ts +165 -0
- package/src/package-checks/json-schema-validation/remote-response.ts +84 -0
- package/src/package-checks/json-schema-validation/schema-engine.ts +263 -0
- package/src/package-checks/json-schema-validation/schema-policy.ts +275 -0
- package/src/package-checks/json-validation/default-check.ts +48 -0
- package/src/package-checks/json-validation/final-data.ts +46 -0
- package/src/package-checks/json-validation/json-validation.ts +212 -0
- package/src/package-checks/json-validation/options-resolution.ts +50 -0
- package/src/package-checks/json-validation/options-validation.ts +27 -0
- package/src/package-checks/json-validation/options.ts +18 -0
- package/src/package-checks/maintenance-reminders/assessment-results.ts +117 -0
- package/src/package-checks/maintenance-reminders/final-data.ts +239 -0
- package/src/package-checks/maintenance-reminders/maintenance-reminders.ts +264 -0
- package/src/package-checks/maintenance-reminders/maintenance-support.ts +67 -0
- package/src/package-checks/maintenance-reminders/measurement.ts +183 -0
- package/src/package-checks/maintenance-reminders/options-validation.ts +88 -0
- package/src/package-checks/markdown-link-validation/default-check.ts +70 -0
- package/src/package-checks/markdown-link-validation/execution.ts +325 -0
- package/src/package-checks/markdown-link-validation/filesystem-probes.ts +127 -0
- package/src/package-checks/markdown-link-validation/final-data.ts +47 -0
- package/src/package-checks/markdown-link-validation/local-resolution.ts +306 -0
- package/src/package-checks/markdown-link-validation/local-resolver.ts +51 -0
- package/src/package-checks/markdown-link-validation/markdown-parser.ts +302 -0
- package/src/package-checks/markdown-link-validation/options-resolution.ts +114 -0
- package/src/package-checks/markdown-link-validation/options-validation.ts +72 -0
- package/src/package-checks/markdown-link-validation/options.ts +50 -0
- package/src/package-checks/markdown-link-validation/records.ts +77 -0
- package/src/package-checks/markdown-link-validation/resolver-engine.ts +276 -0
- package/src/package-checks/markdown-link-validation/target-descriptor.ts +34 -0
- package/src/package-checks/markdown-link-validation/traversal-result.ts +58 -0
- package/src/package-checks/project-files/collection.ts +199 -0
- package/src/package-checks/project-files/config-glob.ts +17 -0
- package/src/package-checks/project-files/configuration.ts +152 -0
- package/src/package-checks/project-files/exact-input-measurement.ts +38 -0
- package/src/package-checks/project-files/file-fingerprint.ts +46 -0
- package/src/package-checks/project-files/gitlink-revision.ts +82 -0
- package/src/package-checks/project-files/gitlink-worktree.ts +106 -0
- package/src/package-checks/project-files/input-eligibility.ts +21 -0
- package/src/package-checks/project-files/reported-path.ts +35 -0
- package/src/package-checks/project-files/revision-paths.ts +34 -0
- package/src/package-checks/project-files/revision-worktree-files.ts +148 -0
- package/src/project-definition/check-tree/authoring.ts +332 -0
- package/src/project-definition/check-tree/materialization.ts +56 -0
- package/src/project-definition/check-tree/resolution.ts +108 -0
- package/src/project-definition/output-defaults.ts +6 -0
- package/src/project-definition/output-validation.ts +54 -0
- package/src/project-definition/project-definition-validation.ts +123 -0
- package/src/project-definition/project-definition.ts +184 -0
- package/src/project-run/aggregation.ts +90 -0
- package/src/project-run/check-execution/callback.ts +106 -0
- package/src/project-run/check-execution/dependencies.ts +70 -0
- package/src/project-run/check-execution/execution-finalization.ts +177 -0
- package/src/project-run/check-execution/execution-settlement.ts +147 -0
- package/src/project-run/check-execution/messages.ts +46 -0
- package/src/project-run/check-execution/plan.ts +46 -0
- package/src/project-run/check-execution/preflight-result.ts +131 -0
- package/src/project-run/check-execution/preflight.ts +321 -0
- package/src/project-run/check-execution/resolved-checks.ts +285 -0
- package/src/project-run/check-execution/terminal-result.ts +74 -0
- package/src/project-run/completion.ts +263 -0
- package/src/project-run/controls/contract.ts +24 -0
- package/src/project-run/controls/outputs-override-validation.ts +86 -0
- package/src/project-run/controls/validation-result.ts +12 -0
- package/src/project-run/controls/validation.ts +176 -0
- package/src/project-run/diagnostic-logging/diagnostic-detail-rendering.ts +223 -0
- package/src/project-run/diagnostic-logging/logger.ts +325 -0
- package/src/project-run/invocation-creation.ts +160 -0
- package/src/project-run/invocation.ts +303 -0
- package/src/project-run/machine-publication.ts +23 -0
- package/src/project-run/output-configuration.ts +24 -0
- package/src/project-run/output-status.ts +69 -0
- package/src/project-run/progress-rendering/presentation.ts +189 -0
- package/src/project-run/progress-rendering/renderer-formatting.ts +141 -0
- package/src/project-run/progress-rendering/renderer-lifecycle.ts +152 -0
- package/src/project-run/progress-rendering/renderer.ts +68 -0
- package/src/project-run/project-context.ts +11 -0
- package/src/project-run/result.ts +175 -0
- package/src/project-run/run.ts +50 -0
- package/src/project-run/task-scheduler/execution-state.ts +153 -0
- package/src/project-run/task-scheduler/graph-validation.ts +176 -0
- package/src/project-run/task-scheduler/graph.ts +185 -0
- package/src/project-run/task-scheduler/scheduler-admission-decision.ts +177 -0
- package/src/project-run/task-scheduler/scheduler-blocker-summary.ts +42 -0
- package/src/project-run/task-scheduler/scheduler-decision-inspection.ts +199 -0
- package/src/project-run/task-scheduler/scheduler-decision-model.ts +158 -0
- package/src/project-run/task-scheduler/scheduler-decision.ts +103 -0
- package/src/project-run/task-scheduler/scheduler.ts +228 -0
- package/third-party-licenses/momoa-3.3.12-LICENSE +201 -0
- package/types/check/check.d.ts +350 -0
- package/types/check/descriptor-validation.d.ts +18 -0
- package/types/check/descriptor.d.ts +5 -0
- package/types/check/inherited-collection.d.ts +35 -0
- package/types/check/options-snapshot.d.ts +2 -0
- package/types/check-settlement/fact-validation.d.ts +14 -0
- package/types/check-settlement/facts.d.ts +19 -0
- package/types/check-settlement/outcome-normalization.d.ts +9 -0
- package/types/check-settlement/record-store.d.ts +14 -0
- package/types/check-settlement/session.d.ts +41 -0
- package/types/data-boundary/canonical-data.d.ts +13 -0
- package/types/data-boundary/canonical-json.d.ts +6 -0
- package/types/data-boundary/closed-values.d.ts +8 -0
- package/types/data-boundary/value-shapes.d.ts +4 -0
- package/types/finding-waivers/reconciliation.d.ts +66 -0
- package/types/index.d.ts +57 -0
- package/types/machine-output/v4/atomic-publication.d.ts +9 -0
- package/types/machine-output/v4/freeze-publication-value.d.ts +6 -0
- package/types/machine-output/v4/projection.d.ts +7 -0
- package/types/machine-output/v4/publication-invariants.d.ts +3 -0
- package/types/machine-output/v4/publication-model.d.ts +15 -0
- package/types/machine-output/v4/publish.d.ts +7 -0
- package/types/machine-output/v4/records-fingerprint.d.ts +4 -0
- package/types/machine-output/v4/schema-identities.d.ts +7 -0
- package/types/machine-output/v4/schema.d.ts +44 -0
- package/types/machine-output/v4/serializers.d.ts +6 -0
- package/types/machine-output/v4/validation-result.d.ts +26 -0
- package/types/machine-output/v4/validation.d.ts +6 -0
- package/types/package-checks/code-quality-findings/policy.d.ts +20 -0
- package/types/package-checks/duplicate-detection/area-policy.d.ts +3 -0
- package/types/package-checks/duplicate-detection/cache/cache-contract.d.ts +48 -0
- package/types/package-checks/duplicate-detection/cache/identity.d.ts +17 -0
- package/types/package-checks/duplicate-detection/cache/key.d.ts +4 -0
- package/types/package-checks/duplicate-detection/cache/payload.d.ts +4 -0
- package/types/package-checks/duplicate-detection/cache/store.d.ts +18 -0
- package/types/package-checks/duplicate-detection/default-check.d.ts +11 -0
- package/types/package-checks/duplicate-detection/execution.d.ts +11 -0
- package/types/package-checks/duplicate-detection/final-data.d.ts +5 -0
- package/types/package-checks/duplicate-detection/jscpd/availability.d.ts +19 -0
- package/types/package-checks/duplicate-detection/jscpd/command-path.d.ts +1 -0
- package/types/package-checks/duplicate-detection/jscpd/command-resolution.d.ts +23 -0
- package/types/package-checks/duplicate-detection/jscpd/json-report.d.ts +2 -0
- package/types/package-checks/duplicate-detection/jscpd/scanner-contract.d.ts +11 -0
- package/types/package-checks/duplicate-detection/jscpd/scanner.d.ts +21 -0
- package/types/package-checks/duplicate-detection/jscpd/scoped-fragments.d.ts +4 -0
- package/types/package-checks/duplicate-detection/measurement-model.d.ts +36 -0
- package/types/package-checks/duplicate-detection/measurement.d.ts +14 -0
- package/types/package-checks/duplicate-detection/options-resolution.d.ts +3 -0
- package/types/package-checks/duplicate-detection/options-validation.d.ts +1 -0
- package/types/package-checks/duplicate-detection/options.d.ts +65 -0
- package/types/package-checks/duplicate-detection/project-revision.d.ts +1 -0
- package/types/package-checks/duplicate-detection/records.d.ts +22 -0
- package/types/package-checks/file-metrics/constructor.d.ts +11 -0
- package/types/package-checks/file-metrics/execution.d.ts +11 -0
- package/types/package-checks/file-metrics/final-data.d.ts +5 -0
- package/types/package-checks/file-metrics/measurement-model.d.ts +12 -0
- package/types/package-checks/file-metrics/measurement.d.ts +13 -0
- package/types/package-checks/file-metrics/options-resolution.d.ts +3 -0
- package/types/package-checks/file-metrics/options-validation.d.ts +3 -0
- package/types/package-checks/file-metrics/options.d.ts +75 -0
- package/types/package-checks/file-metrics/records.d.ts +43 -0
- package/types/package-checks/file-metrics/scc/availability.d.ts +18 -0
- package/types/package-checks/file-metrics/scc/csv.d.ts +1 -0
- package/types/package-checks/file-metrics/scc/parser.d.ts +25 -0
- package/types/package-checks/file-metrics/scc/scanner.d.ts +14 -0
- package/types/package-checks/final-data-parsing.d.ts +9 -0
- package/types/package-checks/function-metrics/analysis.d.ts +10 -0
- package/types/package-checks/function-metrics/constructor.d.ts +11 -0
- package/types/package-checks/function-metrics/execution.d.ts +7 -0
- package/types/package-checks/function-metrics/final-data.d.ts +5 -0
- package/types/package-checks/function-metrics/lizard/availability.d.ts +11 -0
- package/types/package-checks/function-metrics/lizard/csv.d.ts +1 -0
- package/types/package-checks/function-metrics/lizard/parser.d.ts +17 -0
- package/types/package-checks/function-metrics/lizard/scanner.d.ts +15 -0
- package/types/package-checks/function-metrics/measurement-model.d.ts +26 -0
- package/types/package-checks/function-metrics/measurement.d.ts +21 -0
- package/types/package-checks/function-metrics/options-resolution.d.ts +3 -0
- package/types/package-checks/function-metrics/options-validation.d.ts +3 -0
- package/types/package-checks/function-metrics/options.d.ts +76 -0
- package/types/package-checks/function-metrics/records.d.ts +37 -0
- package/types/package-checks/function-metrics/target-files.d.ts +3 -0
- package/types/package-checks/host-environment/error-message.d.ts +1 -0
- package/types/package-checks/host-environment/filesystem.d.ts +19 -0
- package/types/package-checks/host-environment/git.d.ts +13 -0
- package/types/package-checks/host-environment/path.d.ts +3 -0
- package/types/package-checks/host-environment/process/command.d.ts +7 -0
- package/types/package-checks/host-environment/process/contract.d.ts +50 -0
- package/types/package-checks/host-environment/process/env.d.ts +16 -0
- package/types/package-checks/host-environment/process/failure.d.ts +4 -0
- package/types/package-checks/host-environment/process/result.d.ts +2 -0
- package/types/package-checks/host-environment/process/runner.d.ts +3 -0
- package/types/package-checks/json-document/strict-document.d.ts +35 -0
- package/types/package-checks/json-schema-validation/default-check.d.ts +11 -0
- package/types/package-checks/json-schema-validation/execution-stages.d.ts +27 -0
- package/types/package-checks/json-schema-validation/final-data.d.ts +15 -0
- package/types/package-checks/json-schema-validation/issue-collector.d.ts +12 -0
- package/types/package-checks/json-schema-validation/json-schema-validation.d.ts +42 -0
- package/types/package-checks/json-schema-validation/options-resolution.d.ts +3 -0
- package/types/package-checks/json-schema-validation/options-validation.d.ts +2 -0
- package/types/package-checks/json-schema-validation/options.d.ts +53 -0
- package/types/package-checks/json-schema-validation/reference-resolver.d.ts +23 -0
- package/types/package-checks/json-schema-validation/remote-response.d.ts +2 -0
- package/types/package-checks/json-schema-validation/schema-engine.d.ts +33 -0
- package/types/package-checks/json-schema-validation/schema-policy.d.ts +17 -0
- package/types/package-checks/json-validation/default-check.d.ts +11 -0
- package/types/package-checks/json-validation/final-data.d.ts +10 -0
- package/types/package-checks/json-validation/json-validation.d.ts +28 -0
- package/types/package-checks/json-validation/options-resolution.d.ts +3 -0
- package/types/package-checks/json-validation/options-validation.d.ts +2 -0
- package/types/package-checks/json-validation/options.d.ts +13 -0
- package/types/package-checks/maintenance-reminders/assessment-results.d.ts +10 -0
- package/types/package-checks/maintenance-reminders/final-data.d.ts +47 -0
- package/types/package-checks/maintenance-reminders/maintenance-reminders.d.ts +111 -0
- package/types/package-checks/maintenance-reminders/maintenance-support.d.ts +7 -0
- package/types/package-checks/maintenance-reminders/measurement.d.ts +10 -0
- package/types/package-checks/maintenance-reminders/options-validation.d.ts +3 -0
- package/types/package-checks/markdown-link-validation/default-check.d.ts +27 -0
- package/types/package-checks/markdown-link-validation/execution.d.ts +12 -0
- package/types/package-checks/markdown-link-validation/filesystem-probes.d.ts +10 -0
- package/types/package-checks/markdown-link-validation/final-data.d.ts +10 -0
- package/types/package-checks/markdown-link-validation/local-resolution.d.ts +92 -0
- package/types/package-checks/markdown-link-validation/local-resolver.d.ts +5 -0
- package/types/package-checks/markdown-link-validation/markdown-parser.d.ts +37 -0
- package/types/package-checks/markdown-link-validation/options-resolution.d.ts +3 -0
- package/types/package-checks/markdown-link-validation/options-validation.d.ts +2 -0
- package/types/package-checks/markdown-link-validation/options.d.ts +43 -0
- package/types/package-checks/markdown-link-validation/records.d.ts +37 -0
- package/types/package-checks/markdown-link-validation/resolver-engine.d.ts +15 -0
- package/types/package-checks/markdown-link-validation/target-descriptor.d.ts +5 -0
- package/types/package-checks/markdown-link-validation/traversal-result.d.ts +12 -0
- package/types/package-checks/project-files/collection.d.ts +9 -0
- package/types/package-checks/project-files/config-glob.d.ts +5 -0
- package/types/package-checks/project-files/configuration.d.ts +31 -0
- package/types/package-checks/project-files/exact-input-measurement.d.ts +12 -0
- package/types/package-checks/project-files/file-fingerprint.d.ts +7 -0
- package/types/package-checks/project-files/gitlink-revision.d.ts +9 -0
- package/types/package-checks/project-files/gitlink-worktree.d.ts +26 -0
- package/types/package-checks/project-files/input-eligibility.d.ts +7 -0
- package/types/package-checks/project-files/reported-path.d.ts +1 -0
- package/types/package-checks/project-files/revision-paths.d.ts +12 -0
- package/types/package-checks/project-files/revision-worktree-files.d.ts +5 -0
- package/types/project-definition/check-tree/authoring.d.ts +41 -0
- package/types/project-definition/check-tree/materialization.d.ts +4 -0
- package/types/project-definition/check-tree/resolution.d.ts +25 -0
- package/types/project-definition/output-defaults.d.ts +14 -0
- package/types/project-definition/output-validation.d.ts +3 -0
- package/types/project-definition/project-definition-validation.d.ts +6 -0
- package/types/project-definition/project-definition.d.ts +88 -0
- package/types/project-run/aggregation.d.ts +7 -0
- package/types/project-run/check-execution/callback.d.ts +24 -0
- package/types/project-run/check-execution/dependencies.d.ts +9 -0
- package/types/project-run/check-execution/execution-finalization.d.ts +18 -0
- package/types/project-run/check-execution/execution-settlement.d.ts +41 -0
- package/types/project-run/check-execution/messages.d.ts +3 -0
- package/types/project-run/check-execution/plan.d.ts +10 -0
- package/types/project-run/check-execution/preflight-result.d.ts +23 -0
- package/types/project-run/check-execution/preflight.d.ts +27 -0
- package/types/project-run/check-execution/resolved-checks.d.ts +51 -0
- package/types/project-run/check-execution/terminal-result.d.ts +27 -0
- package/types/project-run/completion.d.ts +14 -0
- package/types/project-run/controls/contract.d.ts +24 -0
- package/types/project-run/controls/outputs-override-validation.d.ts +3 -0
- package/types/project-run/controls/validation-result.d.ts +14 -0
- package/types/project-run/controls/validation.d.ts +3 -0
- package/types/project-run/diagnostic-logging/diagnostic-detail-rendering.d.ts +11 -0
- package/types/project-run/diagnostic-logging/logger.d.ts +33 -0
- package/types/project-run/invocation-creation.d.ts +12 -0
- package/types/project-run/invocation.d.ts +34 -0
- package/types/project-run/machine-publication.d.ts +10 -0
- package/types/project-run/output-configuration.d.ts +3 -0
- package/types/project-run/output-status.d.ts +21 -0
- package/types/project-run/progress-rendering/presentation.d.ts +28 -0
- package/types/project-run/progress-rendering/renderer-formatting.d.ts +23 -0
- package/types/project-run/progress-rendering/renderer-lifecycle.d.ts +24 -0
- package/types/project-run/progress-rendering/renderer.d.ts +44 -0
- package/types/project-run/project-context.d.ts +7 -0
- package/types/project-run/result.d.ts +99 -0
- package/types/project-run/run.d.ts +18 -0
- package/types/project-run/task-scheduler/execution-state.d.ts +67 -0
- package/types/project-run/task-scheduler/graph-validation.d.ts +11 -0
- package/types/project-run/task-scheduler/graph.d.ts +40 -0
- package/types/project-run/task-scheduler/scheduler-admission-decision.d.ts +8 -0
- package/types/project-run/task-scheduler/scheduler-blocker-summary.d.ts +4 -0
- package/types/project-run/task-scheduler/scheduler-decision-inspection.d.ts +24 -0
- package/types/project-run/task-scheduler/scheduler-decision-model.d.ts +94 -0
- package/types/project-run/task-scheduler/scheduler-decision.d.ts +8 -0
- package/types/project-run/task-scheduler/scheduler.d.ts +3 -0
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { reconcileFindingWaivers } from "../../finding-waivers/reconciliation.mjs";
|
|
2
|
+
import { collectProjectFileSets, requireProjectFileSet } from "../project-files/collection.mjs";
|
|
3
|
+
import { settleFindings } from "../code-quality-findings/policy.mjs";
|
|
4
|
+
import { measureFileMetrics } from "./measurement.mjs";
|
|
5
|
+
import { isValidResolvedFileMetricsOptions } from "./options-validation.mjs";
|
|
6
|
+
import { buildFileRecordCandidates, fileMetricsWaiverAuditRecord, fileMetricsWaiverIdentity } from "./records.mjs";
|
|
7
|
+
export const FILE_METRICS_CHECK_DEFINITION = {
|
|
8
|
+
checkId: "file-metrics",
|
|
9
|
+
displayName: "File metrics"
|
|
10
|
+
};
|
|
11
|
+
/** 使用 resolved area policy 和 scanner selection 执行一次完整的 file-metrics measurement。 */
|
|
12
|
+
export async function executeFileMetrics(context) {
|
|
13
|
+
if (!isValidResolvedFileMetricsOptions(context.options))
|
|
14
|
+
return unavailable("invalid-options");
|
|
15
|
+
let collectedScope;
|
|
16
|
+
try {
|
|
17
|
+
collectedScope = collectAreaScope(context.project.root, context.options.codeAreas);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return unavailable("source-unavailable");
|
|
21
|
+
}
|
|
22
|
+
if (collectedScope.approvedExactPaths.length === 0) {
|
|
23
|
+
return noEligibleInputResult(context);
|
|
24
|
+
}
|
|
25
|
+
const measurement = await measureFileMetrics(collectedScope, context.options.scanner);
|
|
26
|
+
if (measurement.kind !== "complete")
|
|
27
|
+
return measurementFailureResult(measurement);
|
|
28
|
+
const candidates = buildFileRecordCandidates(measurement.metrics, {
|
|
29
|
+
areaIdsByPath: collectedScope.areaIdsByPath,
|
|
30
|
+
codeAreas: context.options.codeAreas
|
|
31
|
+
});
|
|
32
|
+
if (candidates === undefined)
|
|
33
|
+
return unavailable("external-result-invalid");
|
|
34
|
+
const reconciliation = reconcileFileMetricWaivers(candidates, context.options.findingWaivers);
|
|
35
|
+
for (const finding of reconciliation.findings) {
|
|
36
|
+
const data = finding.disposition === "waived"
|
|
37
|
+
? Object.freeze({
|
|
38
|
+
...finding.finding.data,
|
|
39
|
+
blocking: false,
|
|
40
|
+
waiver: Object.freeze({ reason: finding.waiver.reason })
|
|
41
|
+
})
|
|
42
|
+
: finding.finding.data;
|
|
43
|
+
context.records.report({ id: finding.finding.id }, data);
|
|
44
|
+
}
|
|
45
|
+
reportWaiverAuditRecords(context, reconciliation);
|
|
46
|
+
const settlement = settleFindings(reconciliation.findings.map(({ disposition, finding }) => ({
|
|
47
|
+
actionable: disposition !== "waived",
|
|
48
|
+
blocking: finding.data.blocking
|
|
49
|
+
})));
|
|
50
|
+
return appendWaiverMessages(settlement, reconciliation);
|
|
51
|
+
}
|
|
52
|
+
function noEligibleInputResult(context) {
|
|
53
|
+
const reconciliation = reconcileFileMetricWaivers([], context.options.findingWaivers);
|
|
54
|
+
reportWaiverAuditRecords(context, reconciliation);
|
|
55
|
+
return appendWaiverMessages(Object.freeze({ status: "not-applicable", reason: { code: "no-eligible-input" } }), reconciliation);
|
|
56
|
+
}
|
|
57
|
+
function reconcileFileMetricWaivers(candidates, waivers) {
|
|
58
|
+
return reconcileFindingWaivers({
|
|
59
|
+
findings: candidates,
|
|
60
|
+
identify: ({ data }) => ({ metric: data.metric, path: data.path }),
|
|
61
|
+
waivers
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
function reportWaiverAuditRecords(context, reconciliation) {
|
|
65
|
+
for (const audit of reconciliation.waiverAudits) {
|
|
66
|
+
const record = fileMetricsWaiverAuditRecord(audit);
|
|
67
|
+
if (record !== undefined)
|
|
68
|
+
context.records.report({ id: record.id }, record.data);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function appendWaiverMessages(settlement, reconciliation) {
|
|
72
|
+
const waiverMessages = [];
|
|
73
|
+
for (const audit of reconciliation.waiverAudits) {
|
|
74
|
+
const identity = fileMetricsWaiverIdentity(audit.waiver);
|
|
75
|
+
switch (audit.status) {
|
|
76
|
+
case "applied":
|
|
77
|
+
waiverMessages.push(Object.freeze({
|
|
78
|
+
code: "finding-waived",
|
|
79
|
+
level: "info",
|
|
80
|
+
message: `File metric finding for ${identity.path} was waived: ${audit.waiver.reason}`
|
|
81
|
+
}));
|
|
82
|
+
break;
|
|
83
|
+
case "unused":
|
|
84
|
+
waiverMessages.push(Object.freeze({
|
|
85
|
+
code: "unused-finding-waiver",
|
|
86
|
+
level: "warning",
|
|
87
|
+
message: `Configured file-metrics finding waiver for ${identity.path} matched no finding; remove it or update its identity. Reason: ${audit.waiver.reason}`
|
|
88
|
+
}));
|
|
89
|
+
break;
|
|
90
|
+
case "overmatched":
|
|
91
|
+
waiverMessages.push(Object.freeze({
|
|
92
|
+
code: "overmatched-finding-waiver",
|
|
93
|
+
level: "warning",
|
|
94
|
+
message: `Configured file-metrics finding waiver for ${identity.path} matched ${audit.matchCount} findings and was not applied; narrow its identity. Reason: ${audit.waiver.reason}`
|
|
95
|
+
}));
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (waiverMessages.length === 0)
|
|
100
|
+
return settlement;
|
|
101
|
+
return Object.freeze({
|
|
102
|
+
...settlement,
|
|
103
|
+
messages: Object.freeze([...(settlement.messages ?? []), ...waiverMessages])
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
function collectAreaScope(rootDir, codeAreas) {
|
|
107
|
+
const areaIdsByPath = new Map();
|
|
108
|
+
const filesByArea = collectProjectFileSets(rootDir, Object.fromEntries(Object.entries(codeAreas).map(([areaId, area]) => [areaId, area.files])));
|
|
109
|
+
for (const [areaId] of Object.entries(codeAreas)) {
|
|
110
|
+
for (const path of requireProjectFileSet(filesByArea, areaId)) {
|
|
111
|
+
const areaIds = areaIdsByPath.get(path);
|
|
112
|
+
if (areaIds === undefined)
|
|
113
|
+
areaIdsByPath.set(path, [areaId]);
|
|
114
|
+
else
|
|
115
|
+
areaIds.push(areaId);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
const normalizedMembership = new Map();
|
|
119
|
+
for (const [path, areaIds] of areaIdsByPath) {
|
|
120
|
+
normalizedMembership.set(path, Object.freeze(areaIds.sort(compareText)));
|
|
121
|
+
}
|
|
122
|
+
return Object.freeze({
|
|
123
|
+
approvedExactPaths: Object.freeze([...normalizedMembership.keys()].sort(compareText)),
|
|
124
|
+
areaIdsByPath: normalizedMembership,
|
|
125
|
+
rootDir
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
function measurementFailureResult(measurement) {
|
|
129
|
+
switch (measurement.kind) {
|
|
130
|
+
case "execution-failed":
|
|
131
|
+
return unavailable("external-execution-failed");
|
|
132
|
+
case "invalid-result":
|
|
133
|
+
return unavailable("external-result-invalid");
|
|
134
|
+
case "unavailable":
|
|
135
|
+
return unavailable("external-dependency-unavailable");
|
|
136
|
+
}
|
|
137
|
+
const exhaustiveMeasurement = measurement;
|
|
138
|
+
return exhaustiveMeasurement;
|
|
139
|
+
}
|
|
140
|
+
function unavailable(code) {
|
|
141
|
+
return Object.freeze({
|
|
142
|
+
status: "unavailable",
|
|
143
|
+
reason: { code },
|
|
144
|
+
messages: Object.freeze([
|
|
145
|
+
Object.freeze({ code, level: "error", message: unavailableMessage(code) })
|
|
146
|
+
])
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
function unavailableMessage(code) {
|
|
150
|
+
switch (code) {
|
|
151
|
+
case "invalid-options":
|
|
152
|
+
return "fileMetrics options are invalid; recreate the Check with fileMetrics(options) or restore its complete resolved options.";
|
|
153
|
+
case "source-unavailable":
|
|
154
|
+
return "File metrics could not collect its configured project files; check the project root, file permissions, and selected file source.";
|
|
155
|
+
case "external-dependency-unavailable":
|
|
156
|
+
return "The configured SCC command is unavailable or incompatible; install SCC 3.7.0 or configure a compatible executable.";
|
|
157
|
+
case "external-execution-failed":
|
|
158
|
+
return "SCC did not complete successfully; run the configured command directly and inspect its environment.";
|
|
159
|
+
case "external-result-invalid":
|
|
160
|
+
return "SCC output could not form a trusted complete result; check the executable version and CSV compatibility.";
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
function compareText(left, right) {
|
|
164
|
+
if (left < right)
|
|
165
|
+
return -1;
|
|
166
|
+
if (left > right)
|
|
167
|
+
return 1;
|
|
168
|
+
return 0;
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=execution.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution.mjs","sourceRoot":"","sources":["../../../../src/package-checks/file-metrics/execution.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CheckExecutionContext, CheckMessage, CheckResult } from \"../../check/check.ts\";\nimport {\n reconcileFindingWaivers,\n type FindingWaiverReconciliation\n} from \"../../finding-waivers/reconciliation.ts\";\nimport { collectProjectFileSets, requireProjectFileSet } from \"../project-files/collection.ts\";\nimport { settleFindings } from \"../code-quality-findings/policy.ts\";\nimport { measureFileMetrics, type FileMeasurementResult } from \"./measurement.ts\";\nimport type { FileMetricsExactInputSet } from \"./measurement-model.ts\";\nimport type {\n FileMetricsFindingWaiver,\n ResolvedFileMetricsCodeAreaOptions,\n ResolvedFileMetricsOptions\n} from \"./options.ts\";\nimport { isValidResolvedFileMetricsOptions } from \"./options-validation.ts\";\nimport {\n buildFileRecordCandidates,\n fileMetricsWaiverAuditRecord,\n fileMetricsWaiverIdentity,\n type FileRecordCandidate\n} from \"./records.ts\";\nimport type { FileMetricsFinalData } from \"./final-data.ts\";\n\nexport const FILE_METRICS_CHECK_DEFINITION = {\n checkId: \"file-metrics\",\n displayName: \"File metrics\"\n} as const;\n\n/** `file-metrics` whole-Check unavailable outcome 的稳定 reason code。 */\nexport type FileMetricsUnavailableReasonCode =\n | \"external-dependency-unavailable\"\n | \"external-execution-failed\"\n | \"external-result-invalid\"\n | \"invalid-options\"\n | \"source-unavailable\";\n\ninterface CollectedFileMetricsScope extends FileMetricsExactInputSet {\n readonly areaIdsByPath: ReadonlyMap<string, readonly string[]>;\n}\n\n/** 使用 resolved area policy 和 scanner selection 执行一次完整的 file-metrics measurement。 */\nexport async function executeFileMetrics(\n context: CheckExecutionContext<ResolvedFileMetricsOptions>\n): Promise<CheckResult<FileMetricsFinalData>> {\n if (!isValidResolvedFileMetricsOptions(context.options)) return unavailable(\"invalid-options\");\n\n let collectedScope: CollectedFileMetricsScope;\n try {\n collectedScope = collectAreaScope(context.project.root, context.options.codeAreas);\n } catch {\n return unavailable(\"source-unavailable\");\n }\n if (collectedScope.approvedExactPaths.length === 0) {\n return noEligibleInputResult(context);\n }\n const measurement = await measureFileMetrics(collectedScope, context.options.scanner);\n if (measurement.kind !== \"complete\") return measurementFailureResult(measurement);\n const candidates = buildFileRecordCandidates(measurement.metrics, {\n areaIdsByPath: collectedScope.areaIdsByPath,\n codeAreas: context.options.codeAreas\n });\n if (candidates === undefined) return unavailable(\"external-result-invalid\");\n const reconciliation = reconcileFileMetricWaivers(candidates, context.options.findingWaivers);\n for (const finding of reconciliation.findings) {\n const data =\n finding.disposition === \"waived\"\n ? Object.freeze({\n ...finding.finding.data,\n blocking: false,\n waiver: Object.freeze({ reason: finding.waiver.reason })\n })\n : finding.finding.data;\n context.records.report({ id: finding.finding.id }, data);\n }\n reportWaiverAuditRecords(context, reconciliation);\n const settlement = settleFindings(\n reconciliation.findings.map(({ disposition, finding }) => ({\n actionable: disposition !== \"waived\",\n blocking: finding.data.blocking\n }))\n );\n return appendWaiverMessages(settlement, reconciliation);\n}\n\nfunction noEligibleInputResult(\n context: CheckExecutionContext<ResolvedFileMetricsOptions>\n): CheckResult<FileMetricsFinalData> {\n const reconciliation = reconcileFileMetricWaivers([], context.options.findingWaivers);\n reportWaiverAuditRecords(context, reconciliation);\n return appendWaiverMessages(\n Object.freeze({ status: \"not-applicable\", reason: { code: \"no-eligible-input\" } }),\n reconciliation\n );\n}\n\nfunction reconcileFileMetricWaivers(\n candidates: readonly FileRecordCandidate[],\n waivers: readonly FileMetricsFindingWaiver[]\n): FindingWaiverReconciliation<FileRecordCandidate> {\n return reconcileFindingWaivers({\n findings: candidates,\n identify: ({ data }) => ({ metric: data.metric, path: data.path }),\n waivers\n });\n}\n\nfunction reportWaiverAuditRecords(\n context: CheckExecutionContext<ResolvedFileMetricsOptions>,\n reconciliation: FindingWaiverReconciliation<FileRecordCandidate>\n): void {\n for (const audit of reconciliation.waiverAudits) {\n const record = fileMetricsWaiverAuditRecord(audit);\n if (record !== undefined) context.records.report({ id: record.id }, record.data);\n }\n}\n\nfunction appendWaiverMessages(\n settlement: CheckResult<FileMetricsFinalData>,\n reconciliation: FindingWaiverReconciliation<FileRecordCandidate>\n): CheckResult<FileMetricsFinalData> {\n const waiverMessages: CheckMessage[] = [];\n for (const audit of reconciliation.waiverAudits) {\n const identity = fileMetricsWaiverIdentity(audit.waiver);\n switch (audit.status) {\n case \"applied\":\n waiverMessages.push(\n Object.freeze({\n code: \"finding-waived\",\n level: \"info\",\n message: `File metric finding for ${identity.path} was waived: ${audit.waiver.reason}`\n })\n );\n break;\n case \"unused\":\n waiverMessages.push(\n Object.freeze({\n code: \"unused-finding-waiver\",\n level: \"warning\",\n message: `Configured file-metrics finding waiver for ${identity.path} matched no finding; remove it or update its identity. Reason: ${audit.waiver.reason}`\n })\n );\n break;\n case \"overmatched\":\n waiverMessages.push(\n Object.freeze({\n code: \"overmatched-finding-waiver\",\n level: \"warning\",\n message: `Configured file-metrics finding waiver for ${identity.path} matched ${audit.matchCount} findings and was not applied; narrow its identity. Reason: ${audit.waiver.reason}`\n })\n );\n break;\n }\n }\n if (waiverMessages.length === 0) return settlement;\n return Object.freeze({\n ...settlement,\n messages: Object.freeze([...(settlement.messages ?? []), ...waiverMessages])\n });\n}\n\nfunction collectAreaScope(\n rootDir: string,\n codeAreas: Readonly<Record<string, ResolvedFileMetricsCodeAreaOptions>>\n): CollectedFileMetricsScope {\n const areaIdsByPath = new Map<string, string[]>();\n const filesByArea = collectProjectFileSets(\n rootDir,\n Object.fromEntries(Object.entries(codeAreas).map(([areaId, area]) => [areaId, area.files]))\n );\n for (const [areaId] of Object.entries(codeAreas)) {\n for (const path of requireProjectFileSet(filesByArea, areaId)) {\n const areaIds = areaIdsByPath.get(path);\n if (areaIds === undefined) areaIdsByPath.set(path, [areaId]);\n else areaIds.push(areaId);\n }\n }\n\n const normalizedMembership = new Map<string, readonly string[]>();\n for (const [path, areaIds] of areaIdsByPath) {\n normalizedMembership.set(path, Object.freeze(areaIds.sort(compareText)));\n }\n return Object.freeze({\n approvedExactPaths: Object.freeze([...normalizedMembership.keys()].sort(compareText)),\n areaIdsByPath: normalizedMembership,\n rootDir\n });\n}\n\nfunction measurementFailureResult(\n measurement: Exclude<FileMeasurementResult, { kind: \"complete\" }>\n): CheckResult<FileMetricsFinalData> {\n switch (measurement.kind) {\n case \"execution-failed\":\n return unavailable(\"external-execution-failed\");\n case \"invalid-result\":\n return unavailable(\"external-result-invalid\");\n case \"unavailable\":\n return unavailable(\"external-dependency-unavailable\");\n }\n const exhaustiveMeasurement: never = measurement;\n return exhaustiveMeasurement;\n}\n\nfunction unavailable(code: FileMetricsUnavailableReasonCode): CheckResult<FileMetricsFinalData> {\n return Object.freeze({\n status: \"unavailable\",\n reason: { code },\n messages: Object.freeze([\n Object.freeze({ code, level: \"error\" as const, message: unavailableMessage(code) })\n ])\n });\n}\n\nfunction unavailableMessage(code: FileMetricsUnavailableReasonCode): string {\n switch (code) {\n case \"invalid-options\":\n return \"fileMetrics options are invalid; recreate the Check with fileMetrics(options) or restore its complete resolved options.\";\n case \"source-unavailable\":\n return \"File metrics could not collect its configured project files; check the project root, file permissions, and selected file source.\";\n case \"external-dependency-unavailable\":\n return \"The configured SCC command is unavailable or incompatible; install SCC 3.7.0 or configure a compatible executable.\";\n case \"external-execution-failed\":\n return \"SCC did not complete successfully; run the configured command directly and inspect its environment.\";\n case \"external-result-invalid\":\n return \"SCC output could not form a trusted complete result; check the executable version and CSV compatibility.\";\n }\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"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { parseFindingSummaryData } from "../final-data-parsing.mjs";
|
|
2
|
+
/** 验证并脱离一份 `file-metrics` canonical final-data object。 */
|
|
3
|
+
export function parseFileMetricsData(data) {
|
|
4
|
+
return parseFindingSummaryData(data, "fileMetrics");
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=final-data.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"final-data.mjs","sourceRoot":"","sources":["../../../../src/package-checks/file-metrics/final-data.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAKnE,0DAA0D;AAC1D,MAAM,UAAU,oBAAoB,CAAC,IAAa;IAChD,OAAO,uBAAuB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;AACtD,CAAC","sourcesContent":["import type { FindingSummary } from \"../code-quality-findings/policy.ts\";\nimport { parseFindingSummaryData } from \"../final-data-parsing.ts\";\n\n/** `file-metrics` 在 passed/failed outcome 中发布的主数据。 */\nexport type FileMetricsFinalData = FindingSummary;\n\n/** 验证并脱离一份 `file-metrics` canonical final-data object。 */\nexport function parseFileMetricsData(data: unknown): FileMetricsFinalData {\n return parseFindingSummaryData(data, \"fileMetrics\");\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"measurement-model.mjs","sourceRoot":"","sources":["../../../../src/package-checks/file-metrics/measurement-model.ts"],"names":[],"mappings":"","sourcesContent":["export interface FileMetric {\n readonly codeLines: number;\n readonly decisionTokens: Readonly<{ readonly source: \"scc\"; readonly value: number | null }>;\n readonly path: string;\n}\n\nexport interface FileMetricsExactInputSet {\n readonly approvedExactPaths: readonly string[];\n readonly rootDir: string;\n}\n"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { acceptExactInputMeasurements } from "../project-files/exact-input-measurement.mjs";
|
|
2
|
+
import { checkScc } from "./scc/availability.mjs";
|
|
3
|
+
import { scanWithScc } from "./scc/scanner.mjs";
|
|
4
|
+
export async function measureFileMetrics(exactInputs, scanner) {
|
|
5
|
+
if (exactInputs.approvedExactPaths.length === 0) {
|
|
6
|
+
return Object.freeze({ kind: "complete", metrics: Object.freeze([]) });
|
|
7
|
+
}
|
|
8
|
+
const scannerAvailability = await checkScc(exactInputs.rootDir, scanner);
|
|
9
|
+
if (!scannerAvailability.available) {
|
|
10
|
+
return Object.freeze({ kind: "unavailable" });
|
|
11
|
+
}
|
|
12
|
+
return runFileScanner(exactInputs, scanner);
|
|
13
|
+
}
|
|
14
|
+
function runFileScanner(exactInputs, scanner) {
|
|
15
|
+
const scanResult = scanWithScc({
|
|
16
|
+
cwd: exactInputs.rootDir,
|
|
17
|
+
scanner,
|
|
18
|
+
includePaths: exactInputs.approvedExactPaths
|
|
19
|
+
});
|
|
20
|
+
if (!scanResult.ok) {
|
|
21
|
+
return Object.freeze({
|
|
22
|
+
kind: scanResult.reason === "execution" ? "execution-failed" : "invalid-result"
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
const acceptedMeasurements = acceptExactInputMeasurements(scanResult.measurements, exactInputs.approvedExactPaths);
|
|
26
|
+
return acceptedMeasurements.ok
|
|
27
|
+
? Object.freeze({
|
|
28
|
+
kind: "complete",
|
|
29
|
+
metrics: Object.freeze([...acceptedMeasurements.payloads])
|
|
30
|
+
})
|
|
31
|
+
: Object.freeze({ kind: "invalid-result" });
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=measurement.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"measurement.mjs","sourceRoot":"","sources":["../../../../src/package-checks/file-metrics/measurement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,6CAA6C,CAAC;AAG3F,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAS/C,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,WAAqC,EACrC,OAA0C;IAE1C,IAAI,WAAW,CAAC,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,MAAM,mBAAmB,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACzE,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,CAAC;QACnC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,cAAc,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,cAAc,CACrB,WAAqC,EACrC,OAA0C;IAE1C,MAAM,UAAU,GAAG,WAAW,CAAC;QAC7B,GAAG,EAAE,WAAW,CAAC,OAAO;QACxB,OAAO;QACP,YAAY,EAAE,WAAW,CAAC,kBAAkB;KAC7C,CAAC,CAAC;IACH,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;QACnB,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,UAAU,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,gBAAgB;SAChF,CAAC,CAAC;IACL,CAAC;IACD,MAAM,oBAAoB,GAAG,4BAA4B,CACvD,UAAU,CAAC,YAAY,EACvB,WAAW,CAAC,kBAAkB,CAC/B,CAAC;IACF,OAAO,oBAAoB,CAAC,EAAE;QAC5B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;YACZ,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;SAC3D,CAAC;QACJ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;AAChD,CAAC","sourcesContent":["import { acceptExactInputMeasurements } from \"../project-files/exact-input-measurement.ts\";\nimport type { FileMetric, FileMetricsExactInputSet } from \"./measurement-model.ts\";\nimport type { ResolvedFileMetricsScannerOptions } from \"./options.ts\";\nimport { checkScc } from \"./scc/availability.ts\";\nimport { scanWithScc } from \"./scc/scanner.ts\";\n\nexport type FileMeasurementResult = Readonly<\n | { kind: \"complete\"; metrics: readonly FileMetric[] }\n | { kind: \"execution-failed\" }\n | { kind: \"invalid-result\" }\n | { kind: \"unavailable\" }\n>;\n\nexport async function measureFileMetrics(\n exactInputs: FileMetricsExactInputSet,\n scanner: ResolvedFileMetricsScannerOptions\n): Promise<FileMeasurementResult> {\n if (exactInputs.approvedExactPaths.length === 0) {\n return Object.freeze({ kind: \"complete\", metrics: Object.freeze([]) });\n }\n const scannerAvailability = await checkScc(exactInputs.rootDir, scanner);\n if (!scannerAvailability.available) {\n return Object.freeze({ kind: \"unavailable\" });\n }\n return runFileScanner(exactInputs, scanner);\n}\n\nfunction runFileScanner(\n exactInputs: FileMetricsExactInputSet,\n scanner: ResolvedFileMetricsScannerOptions\n): FileMeasurementResult {\n const scanResult = scanWithScc({\n cwd: exactInputs.rootDir,\n scanner,\n includePaths: exactInputs.approvedExactPaths\n });\n if (!scanResult.ok) {\n return Object.freeze({\n kind: scanResult.reason === \"execution\" ? \"execution-failed\" : \"invalid-result\"\n });\n }\n const acceptedMeasurements = acceptExactInputMeasurements(\n scanResult.measurements,\n exactInputs.approvedExactPaths\n );\n return acceptedMeasurements.ok\n ? Object.freeze({\n kind: \"complete\",\n metrics: Object.freeze([...acceptedMeasurements.payloads])\n })\n : Object.freeze({ kind: \"invalid-result\" });\n}\n"]}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { hasRequiredAndOptionalRecordKeys, snapshotClosedArray, snapshotClosedRecord } from "../../data-boundary/closed-values.mjs";
|
|
2
|
+
import { resolveProjectFileSelection, snapshotDefaultProjectFileSelection } from "../project-files/configuration.mjs";
|
|
3
|
+
import { DEFAULT_FINDING_POLICY, resolveFindingPolicy } from "../code-quality-findings/policy.mjs";
|
|
4
|
+
import { isNormalizedProjectRelativePath } from "../host-environment/path.mjs";
|
|
5
|
+
import { isValidResolvedFileMetricsOptions } from "./options-validation.mjs";
|
|
6
|
+
const DEFAULT_EXECUTABLE = "scc";
|
|
7
|
+
const DEFAULT_MAXIMUM_CODE_LINES = 360;
|
|
8
|
+
const DEFAULT_ALLOWANCE_MAXIMUM_CODE_LINES = 600;
|
|
9
|
+
const DEFAULT_ALLOWANCE_MAXIMUM_DECISION_TOKENS = 12;
|
|
10
|
+
/** 校验 constructor input,并将所有可省略 policy 物化为完整、冻结的 Check options。 */
|
|
11
|
+
export function resolveFileMetricsOptions(authoredOptions) {
|
|
12
|
+
const input = snapshotPolicyRecord(authoredOptions, {
|
|
13
|
+
optional: ["codeAreas", "findingPolicy", "findingWaivers", "scanner"]
|
|
14
|
+
});
|
|
15
|
+
if (input === undefined)
|
|
16
|
+
return undefined;
|
|
17
|
+
const findingPolicy = resolveFindingPolicy(input.findingPolicy, DEFAULT_FINDING_POLICY);
|
|
18
|
+
if (findingPolicy === undefined)
|
|
19
|
+
return undefined;
|
|
20
|
+
const codeAreas = resolveCodeAreas(input.codeAreas, findingPolicy);
|
|
21
|
+
const findingWaivers = resolveFindingWaivers(input.findingWaivers);
|
|
22
|
+
const scanner = resolveScanner(input.scanner);
|
|
23
|
+
if (codeAreas === undefined || findingWaivers === undefined || scanner === undefined)
|
|
24
|
+
return undefined;
|
|
25
|
+
const options = Object.freeze({ codeAreas, findingWaivers, scanner });
|
|
26
|
+
return isValidResolvedFileMetricsOptions(options) ? options : undefined;
|
|
27
|
+
}
|
|
28
|
+
function resolveFindingWaivers(value) {
|
|
29
|
+
if (value === undefined)
|
|
30
|
+
return Object.freeze([]);
|
|
31
|
+
const candidates = snapshotClosedArray(value);
|
|
32
|
+
if (candidates === undefined)
|
|
33
|
+
return undefined;
|
|
34
|
+
const waivers = [];
|
|
35
|
+
const seenIdentities = new Set();
|
|
36
|
+
for (const candidate of candidates) {
|
|
37
|
+
const waiver = resolveFindingWaiver(candidate);
|
|
38
|
+
if (waiver === undefined)
|
|
39
|
+
return undefined;
|
|
40
|
+
const identityKey = `${waiver.identity.metric}\u0000${waiver.identity.path}`;
|
|
41
|
+
if (seenIdentities.has(identityKey))
|
|
42
|
+
return undefined;
|
|
43
|
+
seenIdentities.add(identityKey);
|
|
44
|
+
waivers.push(waiver);
|
|
45
|
+
}
|
|
46
|
+
return Object.freeze(waivers);
|
|
47
|
+
}
|
|
48
|
+
function resolveFindingWaiver(value) {
|
|
49
|
+
const waiver = snapshotPolicyRecord(value, { required: ["identity", "reason"] });
|
|
50
|
+
if (waiver === undefined || !isNonEmptyString(waiver.reason))
|
|
51
|
+
return undefined;
|
|
52
|
+
const identity = resolveFindingIdentity(waiver.identity);
|
|
53
|
+
return identity === undefined ? undefined : Object.freeze({ identity, reason: waiver.reason });
|
|
54
|
+
}
|
|
55
|
+
function resolveFindingIdentity(value) {
|
|
56
|
+
const identity = snapshotPolicyRecord(value, { required: ["metric", "path"] });
|
|
57
|
+
return identity === undefined ||
|
|
58
|
+
identity.metric !== "code-lines" ||
|
|
59
|
+
!isNormalizedProjectRelativePath(identity.path)
|
|
60
|
+
? undefined
|
|
61
|
+
: Object.freeze({ metric: "code-lines", path: identity.path });
|
|
62
|
+
}
|
|
63
|
+
function resolveCodeAreas(value, defaultFindingPolicy) {
|
|
64
|
+
if (value === undefined)
|
|
65
|
+
return Object.freeze({ project: defaultCodeArea(defaultFindingPolicy) });
|
|
66
|
+
const areas = snapshotClosedRecord(value);
|
|
67
|
+
if (areas === undefined || Object.keys(areas).length === 0)
|
|
68
|
+
return undefined;
|
|
69
|
+
const resolvedEntries = [];
|
|
70
|
+
for (const [areaId, candidate] of Object.entries(areas)) {
|
|
71
|
+
if (!isNonEmptyString(areaId))
|
|
72
|
+
return undefined;
|
|
73
|
+
const area = resolveCodeArea(candidate, defaultFindingPolicy);
|
|
74
|
+
if (area === undefined)
|
|
75
|
+
return undefined;
|
|
76
|
+
resolvedEntries.push([areaId, area]);
|
|
77
|
+
}
|
|
78
|
+
return Object.freeze(Object.fromEntries(resolvedEntries));
|
|
79
|
+
}
|
|
80
|
+
function defaultCodeArea(findingPolicy) {
|
|
81
|
+
return Object.freeze({
|
|
82
|
+
codeLines: defaultCodeLines(),
|
|
83
|
+
files: snapshotDefaultProjectFileSelection(),
|
|
84
|
+
findingPolicy
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
function resolveCodeArea(value, defaultFindingPolicy) {
|
|
88
|
+
const area = snapshotPolicyRecord(value, {
|
|
89
|
+
optional: ["codeLines", "findingPolicy"],
|
|
90
|
+
required: ["files"]
|
|
91
|
+
});
|
|
92
|
+
if (area === undefined)
|
|
93
|
+
return undefined;
|
|
94
|
+
const files = resolveProjectFileSelection(area.files);
|
|
95
|
+
const findingPolicy = resolveFindingPolicy(area.findingPolicy, defaultFindingPolicy);
|
|
96
|
+
const codeLines = resolveCodeLines(area.codeLines);
|
|
97
|
+
return files === undefined || findingPolicy === undefined || codeLines === undefined
|
|
98
|
+
? undefined
|
|
99
|
+
: Object.freeze({ codeLines, files, findingPolicy });
|
|
100
|
+
}
|
|
101
|
+
function resolveCodeLines(value) {
|
|
102
|
+
if (value === undefined)
|
|
103
|
+
return defaultCodeLines();
|
|
104
|
+
const codeLines = snapshotPolicyRecord(value, {
|
|
105
|
+
optional: ["lowDecisionTokenAllowance", "maximum"]
|
|
106
|
+
});
|
|
107
|
+
if (codeLines === undefined)
|
|
108
|
+
return undefined;
|
|
109
|
+
const maximum = codeLines.maximum ?? DEFAULT_MAXIMUM_CODE_LINES;
|
|
110
|
+
const lowDecisionTokenAllowance = resolveAllowance(codeLines.lowDecisionTokenAllowance);
|
|
111
|
+
if (!isPositiveSafeInteger(maximum) ||
|
|
112
|
+
lowDecisionTokenAllowance === undefined ||
|
|
113
|
+
lowDecisionTokenAllowance.maximumCodeLines <= maximum) {
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
return Object.freeze({ lowDecisionTokenAllowance, maximum });
|
|
117
|
+
}
|
|
118
|
+
function defaultCodeLines() {
|
|
119
|
+
return Object.freeze({
|
|
120
|
+
lowDecisionTokenAllowance: Object.freeze({
|
|
121
|
+
maximumCodeLines: DEFAULT_ALLOWANCE_MAXIMUM_CODE_LINES,
|
|
122
|
+
maximumDecisionTokens: DEFAULT_ALLOWANCE_MAXIMUM_DECISION_TOKENS
|
|
123
|
+
}),
|
|
124
|
+
maximum: DEFAULT_MAXIMUM_CODE_LINES
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
function resolveAllowance(value) {
|
|
128
|
+
if (value === undefined)
|
|
129
|
+
return defaultCodeLines().lowDecisionTokenAllowance;
|
|
130
|
+
const allowance = snapshotPolicyRecord(value, {
|
|
131
|
+
optional: ["maximumCodeLines", "maximumDecisionTokens"]
|
|
132
|
+
});
|
|
133
|
+
if (allowance === undefined)
|
|
134
|
+
return undefined;
|
|
135
|
+
const maximumCodeLines = allowance.maximumCodeLines ?? DEFAULT_ALLOWANCE_MAXIMUM_CODE_LINES;
|
|
136
|
+
const maximumDecisionTokens = allowance.maximumDecisionTokens ?? DEFAULT_ALLOWANCE_MAXIMUM_DECISION_TOKENS;
|
|
137
|
+
if (!isPositiveSafeInteger(maximumCodeLines) ||
|
|
138
|
+
!isNonNegativeSafeInteger(maximumDecisionTokens)) {
|
|
139
|
+
return undefined;
|
|
140
|
+
}
|
|
141
|
+
return Object.freeze({ maximumCodeLines, maximumDecisionTokens });
|
|
142
|
+
}
|
|
143
|
+
function resolveScanner(value) {
|
|
144
|
+
if (value === undefined)
|
|
145
|
+
return Object.freeze({ executable: DEFAULT_EXECUTABLE });
|
|
146
|
+
const scanner = snapshotPolicyRecord(value, { optional: ["executable"] });
|
|
147
|
+
if (scanner === undefined)
|
|
148
|
+
return undefined;
|
|
149
|
+
const executable = scanner.executable ?? DEFAULT_EXECUTABLE;
|
|
150
|
+
return isNonEmptyString(executable) ? Object.freeze({ executable }) : undefined;
|
|
151
|
+
}
|
|
152
|
+
function snapshotPolicyRecord(value, keys) {
|
|
153
|
+
const record = snapshotClosedRecord(value);
|
|
154
|
+
return record !== undefined &&
|
|
155
|
+
hasRequiredAndOptionalRecordKeys(record, {
|
|
156
|
+
optional: keys.optional ?? [],
|
|
157
|
+
required: keys.required ?? []
|
|
158
|
+
})
|
|
159
|
+
? record
|
|
160
|
+
: undefined;
|
|
161
|
+
}
|
|
162
|
+
function isPositiveSafeInteger(value) {
|
|
163
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value > 0;
|
|
164
|
+
}
|
|
165
|
+
function isNonNegativeSafeInteger(value) {
|
|
166
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
|
|
167
|
+
}
|
|
168
|
+
function isNonEmptyString(value) {
|
|
169
|
+
return typeof value === "string" && value.length > 0;
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=options-resolution.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options-resolution.mjs","sourceRoot":"","sources":["../../../../src/package-checks/file-metrics/options-resolution.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n hasRequiredAndOptionalRecordKeys,\n snapshotClosedArray,\n snapshotClosedRecord\n} from \"../../data-boundary/closed-values.ts\";\nimport {\n resolveProjectFileSelection,\n snapshotDefaultProjectFileSelection\n} from \"../project-files/configuration.ts\";\nimport {\n DEFAULT_FINDING_POLICY,\n resolveFindingPolicy,\n type FindingPolicy\n} from \"../code-quality-findings/policy.ts\";\nimport { isNormalizedProjectRelativePath } from \"../host-environment/path.ts\";\nimport type {\n FileMetricsFindingIdentity,\n FileMetricsFindingWaiver,\n ResolvedFileMetricsCodeAreaOptions,\n ResolvedFileMetricsOptions\n} from \"./options.ts\";\nimport { isValidResolvedFileMetricsOptions } from \"./options-validation.ts\";\n\nconst DEFAULT_EXECUTABLE = \"scc\";\nconst DEFAULT_MAXIMUM_CODE_LINES = 360;\nconst DEFAULT_ALLOWANCE_MAXIMUM_CODE_LINES = 600;\nconst DEFAULT_ALLOWANCE_MAXIMUM_DECISION_TOKENS = 12;\n\ninterface PolicyRecordKeys {\n readonly optional?: readonly string[];\n readonly required?: readonly string[];\n}\n\n/** 校验 constructor input,并将所有可省略 policy 物化为完整、冻结的 Check options。 */\nexport function resolveFileMetricsOptions(\n authoredOptions: unknown\n): ResolvedFileMetricsOptions | undefined {\n const input = snapshotPolicyRecord(authoredOptions, {\n optional: [\"codeAreas\", \"findingPolicy\", \"findingWaivers\", \"scanner\"]\n });\n if (input === undefined) return undefined;\n\n const findingPolicy = resolveFindingPolicy(input.findingPolicy, DEFAULT_FINDING_POLICY);\n if (findingPolicy === undefined) return undefined;\n const codeAreas = resolveCodeAreas(input.codeAreas, findingPolicy);\n const findingWaivers = resolveFindingWaivers(input.findingWaivers);\n const scanner = resolveScanner(input.scanner);\n if (codeAreas === undefined || findingWaivers === undefined || scanner === undefined)\n return undefined;\n\n const options = Object.freeze({ codeAreas, findingWaivers, scanner });\n return isValidResolvedFileMetricsOptions(options) ? options : undefined;\n}\n\nfunction resolveFindingWaivers(value: unknown): readonly FileMetricsFindingWaiver[] | undefined {\n if (value === undefined) return Object.freeze([]);\n const candidates = snapshotClosedArray(value);\n if (candidates === undefined) return undefined;\n const waivers: FileMetricsFindingWaiver[] = [];\n const seenIdentities = new Set<string>();\n for (const candidate of candidates) {\n const waiver = resolveFindingWaiver(candidate);\n if (waiver === undefined) return undefined;\n const identityKey = `${waiver.identity.metric}\\u0000${waiver.identity.path}`;\n if (seenIdentities.has(identityKey)) return undefined;\n seenIdentities.add(identityKey);\n waivers.push(waiver);\n }\n return Object.freeze(waivers);\n}\n\nfunction resolveFindingWaiver(value: unknown): FileMetricsFindingWaiver | undefined {\n const waiver = snapshotPolicyRecord(value, { required: [\"identity\", \"reason\"] });\n if (waiver === undefined || !isNonEmptyString(waiver.reason)) return undefined;\n const identity = resolveFindingIdentity(waiver.identity);\n return identity === undefined ? undefined : Object.freeze({ identity, reason: waiver.reason });\n}\n\nfunction resolveFindingIdentity(value: unknown): FileMetricsFindingIdentity | undefined {\n const identity = snapshotPolicyRecord(value, { required: [\"metric\", \"path\"] });\n return identity === undefined ||\n identity.metric !== \"code-lines\" ||\n !isNormalizedProjectRelativePath(identity.path)\n ? undefined\n : Object.freeze({ metric: \"code-lines\", path: identity.path });\n}\n\nfunction resolveCodeAreas(\n value: unknown,\n defaultFindingPolicy: FindingPolicy\n): ResolvedFileMetricsOptions[\"codeAreas\"] | undefined {\n if (value === undefined) return Object.freeze({ project: defaultCodeArea(defaultFindingPolicy) });\n const areas = snapshotClosedRecord(value);\n if (areas === undefined || Object.keys(areas).length === 0) return undefined;\n\n const resolvedEntries: Array<readonly [string, ResolvedFileMetricsCodeAreaOptions]> = [];\n for (const [areaId, candidate] of Object.entries(areas)) {\n if (!isNonEmptyString(areaId)) return undefined;\n const area = resolveCodeArea(candidate, defaultFindingPolicy);\n if (area === undefined) return undefined;\n resolvedEntries.push([areaId, area]);\n }\n return Object.freeze(Object.fromEntries(resolvedEntries));\n}\n\nfunction defaultCodeArea(findingPolicy: FindingPolicy): ResolvedFileMetricsCodeAreaOptions {\n return Object.freeze({\n codeLines: defaultCodeLines(),\n files: snapshotDefaultProjectFileSelection(),\n findingPolicy\n });\n}\n\nfunction resolveCodeArea(\n value: unknown,\n defaultFindingPolicy: FindingPolicy\n): ResolvedFileMetricsCodeAreaOptions | undefined {\n const area = snapshotPolicyRecord(value, {\n optional: [\"codeLines\", \"findingPolicy\"],\n required: [\"files\"]\n });\n if (area === undefined) return undefined;\n const files = resolveProjectFileSelection(area.files);\n const findingPolicy = resolveFindingPolicy(area.findingPolicy, defaultFindingPolicy);\n const codeLines = resolveCodeLines(area.codeLines);\n return files === undefined || findingPolicy === undefined || codeLines === undefined\n ? undefined\n : Object.freeze({ codeLines, files, findingPolicy });\n}\n\nfunction resolveCodeLines(\n value: unknown\n): ResolvedFileMetricsCodeAreaOptions[\"codeLines\"] | undefined {\n if (value === undefined) return defaultCodeLines();\n const codeLines = snapshotPolicyRecord(value, {\n optional: [\"lowDecisionTokenAllowance\", \"maximum\"]\n });\n if (codeLines === undefined) return undefined;\n const maximum = codeLines.maximum ?? DEFAULT_MAXIMUM_CODE_LINES;\n const lowDecisionTokenAllowance = resolveAllowance(codeLines.lowDecisionTokenAllowance);\n if (\n !isPositiveSafeInteger(maximum) ||\n lowDecisionTokenAllowance === undefined ||\n lowDecisionTokenAllowance.maximumCodeLines <= maximum\n ) {\n return undefined;\n }\n return Object.freeze({ lowDecisionTokenAllowance, maximum });\n}\n\nfunction defaultCodeLines(): ResolvedFileMetricsCodeAreaOptions[\"codeLines\"] {\n return Object.freeze({\n lowDecisionTokenAllowance: Object.freeze({\n maximumCodeLines: DEFAULT_ALLOWANCE_MAXIMUM_CODE_LINES,\n maximumDecisionTokens: DEFAULT_ALLOWANCE_MAXIMUM_DECISION_TOKENS\n }),\n maximum: DEFAULT_MAXIMUM_CODE_LINES\n });\n}\n\nfunction resolveAllowance(\n value: unknown\n): ResolvedFileMetricsCodeAreaOptions[\"codeLines\"][\"lowDecisionTokenAllowance\"] | undefined {\n if (value === undefined) return defaultCodeLines().lowDecisionTokenAllowance;\n const allowance = snapshotPolicyRecord(value, {\n optional: [\"maximumCodeLines\", \"maximumDecisionTokens\"]\n });\n if (allowance === undefined) return undefined;\n const maximumCodeLines = allowance.maximumCodeLines ?? DEFAULT_ALLOWANCE_MAXIMUM_CODE_LINES;\n const maximumDecisionTokens =\n allowance.maximumDecisionTokens ?? DEFAULT_ALLOWANCE_MAXIMUM_DECISION_TOKENS;\n if (\n !isPositiveSafeInteger(maximumCodeLines) ||\n !isNonNegativeSafeInteger(maximumDecisionTokens)\n ) {\n return undefined;\n }\n return Object.freeze({ maximumCodeLines, maximumDecisionTokens });\n}\n\nfunction resolveScanner(value: unknown): ResolvedFileMetricsOptions[\"scanner\"] | undefined {\n if (value === undefined) return Object.freeze({ executable: DEFAULT_EXECUTABLE });\n const scanner = snapshotPolicyRecord(value, { optional: [\"executable\"] });\n if (scanner === undefined) return undefined;\n const executable = scanner.executable ?? DEFAULT_EXECUTABLE;\n return isNonEmptyString(executable) ? Object.freeze({ executable }) : undefined;\n}\n\nfunction snapshotPolicyRecord(\n value: unknown,\n keys: PolicyRecordKeys\n): Readonly<Record<string, unknown>> | undefined {\n const record = snapshotClosedRecord(value);\n return record !== undefined &&\n hasRequiredAndOptionalRecordKeys(record, {\n optional: keys.optional ?? [],\n required: keys.required ?? []\n })\n ? record\n : undefined;\n}\n\nfunction isPositiveSafeInteger(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value > 0;\n}\n\nfunction isNonNegativeSafeInteger(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n"]}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { snapshotClosedArray, snapshotClosedRecord } from "../../data-boundary/closed-values.mjs";
|
|
2
|
+
import { validProjectFileSelection } from "../project-files/configuration.mjs";
|
|
3
|
+
import { validFindingPolicy } from "../code-quality-findings/policy.mjs";
|
|
4
|
+
import { isNormalizedProjectRelativePath } from "../host-environment/path.mjs";
|
|
5
|
+
/** 验证 constructor 产物或普通对象组合形成的完整 file-metrics options。 */
|
|
6
|
+
export function isValidResolvedFileMetricsOptions(resolvedOptions) {
|
|
7
|
+
const options = exactRecord(resolvedOptions, ["codeAreas", "findingWaivers", "scanner"]);
|
|
8
|
+
return (options !== undefined &&
|
|
9
|
+
isValidCodeAreas(options.codeAreas) &&
|
|
10
|
+
isValidFindingWaivers(options.findingWaivers) &&
|
|
11
|
+
isValidScanner(options.scanner));
|
|
12
|
+
}
|
|
13
|
+
function isValidFindingWaivers(value) {
|
|
14
|
+
const waivers = snapshotClosedArray(value);
|
|
15
|
+
if (waivers === undefined)
|
|
16
|
+
return false;
|
|
17
|
+
const identities = new Set();
|
|
18
|
+
for (const candidate of waivers) {
|
|
19
|
+
const waiver = exactRecord(candidate, ["identity", "reason"]);
|
|
20
|
+
const identity = waiver === undefined ? undefined : exactRecord(waiver.identity, ["metric", "path"]);
|
|
21
|
+
if (waiver === undefined ||
|
|
22
|
+
identity === undefined ||
|
|
23
|
+
identity.metric !== "code-lines" ||
|
|
24
|
+
!isNormalizedProjectRelativePath(identity.path) ||
|
|
25
|
+
!isNonEmptyString(waiver.reason)) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
const identityKey = `${identity.metric}\u0000${identity.path}`;
|
|
29
|
+
if (identities.has(identityKey))
|
|
30
|
+
return false;
|
|
31
|
+
identities.add(identityKey);
|
|
32
|
+
}
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
function isValidCodeAreas(value) {
|
|
36
|
+
const codeAreas = snapshotClosedRecord(value);
|
|
37
|
+
if (codeAreas === undefined || Object.keys(codeAreas).length === 0)
|
|
38
|
+
return false;
|
|
39
|
+
return Object.entries(codeAreas).every(([areaId, candidate]) => areaId.length > 0 && isValidCodeArea(candidate));
|
|
40
|
+
}
|
|
41
|
+
function isValidCodeArea(value) {
|
|
42
|
+
const area = exactRecord(value, ["codeLines", "files", "findingPolicy"]);
|
|
43
|
+
return (area !== undefined &&
|
|
44
|
+
validProjectFileSelection(area.files) &&
|
|
45
|
+
validFindingPolicy(area.findingPolicy) &&
|
|
46
|
+
isValidCodeLinePolicy(area.codeLines));
|
|
47
|
+
}
|
|
48
|
+
function isValidCodeLinePolicy(value) {
|
|
49
|
+
const policy = exactRecord(value, ["lowDecisionTokenAllowance", "maximum"]);
|
|
50
|
+
if (policy === undefined || !isPositiveSafeInteger(policy.maximum))
|
|
51
|
+
return false;
|
|
52
|
+
const allowance = exactRecord(policy.lowDecisionTokenAllowance, [
|
|
53
|
+
"maximumCodeLines",
|
|
54
|
+
"maximumDecisionTokens"
|
|
55
|
+
]);
|
|
56
|
+
return (allowance !== undefined &&
|
|
57
|
+
isPositiveSafeInteger(allowance.maximumCodeLines) &&
|
|
58
|
+
allowance.maximumCodeLines > policy.maximum &&
|
|
59
|
+
isNonNegativeSafeInteger(allowance.maximumDecisionTokens));
|
|
60
|
+
}
|
|
61
|
+
function isValidScanner(value) {
|
|
62
|
+
const scanner = exactRecord(value, ["executable"]);
|
|
63
|
+
return scanner !== undefined && isNonEmptyString(scanner.executable);
|
|
64
|
+
}
|
|
65
|
+
function exactRecord(value, keys) {
|
|
66
|
+
const record = snapshotClosedRecord(value);
|
|
67
|
+
return record !== undefined &&
|
|
68
|
+
Object.keys(record).length === keys.length &&
|
|
69
|
+
keys.every((key) => Object.hasOwn(record, key))
|
|
70
|
+
? record
|
|
71
|
+
: undefined;
|
|
72
|
+
}
|
|
73
|
+
function isPositiveSafeInteger(value) {
|
|
74
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value > 0;
|
|
75
|
+
}
|
|
76
|
+
function isNonNegativeSafeInteger(value) {
|
|
77
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
|
|
78
|
+
}
|
|
79
|
+
function isNonEmptyString(value) {
|
|
80
|
+
return typeof value === "string" && value.length > 0;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=options-validation.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options-validation.mjs","sourceRoot":"","sources":["../../../../src/package-checks/file-metrics/options-validation.ts"],"names":[],"mappings":"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","sourcesContent":["import { snapshotClosedArray, snapshotClosedRecord } from \"../../data-boundary/closed-values.ts\";\nimport { validProjectFileSelection } from \"../project-files/configuration.ts\";\nimport { validFindingPolicy } from \"../code-quality-findings/policy.ts\";\nimport { isNormalizedProjectRelativePath } from \"../host-environment/path.ts\";\nimport type { ResolvedFileMetricsOptions } from \"./options.ts\";\n\n/** 验证 constructor 产物或普通对象组合形成的完整 file-metrics options。 */\nexport function isValidResolvedFileMetricsOptions(\n resolvedOptions: unknown\n): resolvedOptions is ResolvedFileMetricsOptions {\n const options = exactRecord(resolvedOptions, [\"codeAreas\", \"findingWaivers\", \"scanner\"]);\n return (\n options !== undefined &&\n isValidCodeAreas(options.codeAreas) &&\n isValidFindingWaivers(options.findingWaivers) &&\n isValidScanner(options.scanner)\n );\n}\n\nfunction isValidFindingWaivers(value: unknown): boolean {\n const waivers = snapshotClosedArray(value);\n if (waivers === undefined) return false;\n const identities = new Set<string>();\n for (const candidate of waivers) {\n const waiver = exactRecord(candidate, [\"identity\", \"reason\"]);\n const identity =\n waiver === undefined ? undefined : exactRecord(waiver.identity, [\"metric\", \"path\"]);\n if (\n waiver === undefined ||\n identity === undefined ||\n identity.metric !== \"code-lines\" ||\n !isNormalizedProjectRelativePath(identity.path) ||\n !isNonEmptyString(waiver.reason)\n ) {\n return false;\n }\n const identityKey = `${identity.metric}\\u0000${identity.path}`;\n if (identities.has(identityKey)) return false;\n identities.add(identityKey);\n }\n return true;\n}\n\nfunction isValidCodeAreas(value: unknown): boolean {\n const codeAreas = snapshotClosedRecord(value);\n if (codeAreas === undefined || Object.keys(codeAreas).length === 0) return false;\n return Object.entries(codeAreas).every(\n ([areaId, candidate]) => areaId.length > 0 && isValidCodeArea(candidate)\n );\n}\n\nfunction isValidCodeArea(value: unknown): boolean {\n const area = exactRecord(value, [\"codeLines\", \"files\", \"findingPolicy\"]);\n return (\n area !== undefined &&\n validProjectFileSelection(area.files) &&\n validFindingPolicy(area.findingPolicy) &&\n isValidCodeLinePolicy(area.codeLines)\n );\n}\n\nfunction isValidCodeLinePolicy(value: unknown): boolean {\n const policy = exactRecord(value, [\"lowDecisionTokenAllowance\", \"maximum\"]);\n if (policy === undefined || !isPositiveSafeInteger(policy.maximum)) return false;\n const allowance = exactRecord(policy.lowDecisionTokenAllowance, [\n \"maximumCodeLines\",\n \"maximumDecisionTokens\"\n ]);\n return (\n allowance !== undefined &&\n isPositiveSafeInteger(allowance.maximumCodeLines) &&\n allowance.maximumCodeLines > policy.maximum &&\n isNonNegativeSafeInteger(allowance.maximumDecisionTokens)\n );\n}\n\nfunction isValidScanner(value: unknown): boolean {\n const scanner = exactRecord(value, [\"executable\"]);\n return scanner !== undefined && isNonEmptyString(scanner.executable);\n}\n\nfunction exactRecord(\n value: unknown,\n keys: readonly string[]\n): Readonly<Record<string, unknown>> | undefined {\n const record = snapshotClosedRecord(value);\n return record !== undefined &&\n Object.keys(record).length === keys.length &&\n keys.every((key) => Object.hasOwn(record, key))\n ? record\n : undefined;\n}\n\nfunction isPositiveSafeInteger(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value > 0;\n}\n\nfunction isNonNegativeSafeInteger(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.mjs","sourceRoot":"","sources":["../../../../src/package-checks/file-metrics/options.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n ProjectFileSelection,\n ProjectFileSelectionOptions\n} from \"../project-files/configuration.ts\";\nimport type { FindingPolicy } from \"../code-quality-findings/policy.ts\";\nimport type { FindingWaiver } from \"../../finding-waivers/reconciliation.ts\";\n\n/** `fileMetrics` 构造函数可省略的 SCC 可执行文件策略。 */\nexport interface FileMetricsScannerOptions {\n /** 省略时直接执行 `scc`;显式命令必须直接接受 adapter 拥有的 SCC 参数。 */\n readonly executable?: string;\n}\n\n/** file-metrics 区域可省略并由构造函数补齐的文件策略。 */\nexport type FileMetricsFileOptions = ProjectFileSelectionOptions;\n\n/** SCC decision-token 数较低的文件可使用的代码行宽限策略。 */\nexport interface FileMetricsLowDecisionTokenAllowanceOptions {\n /** 省略时为 `600`;必须严格大于同一区域的普通代码行上限。 */\n readonly maximumCodeLines?: number;\n /** 省略时为 `12`;decision-token measurement 不大于此值时应用宽限上限。 */\n readonly maximumDecisionTokens?: number;\n}\n\n/** 一个区域可省略的文件代码行策略。 */\nexport interface FileMetricsCodeLineOptions {\n /** 省略时为 `360`;只有严格超过此值才产生 finding。 */\n readonly maximum?: number;\n /** 省略时使用完整默认宽限策略。 */\n readonly lowDecisionTokenAllowance?: FileMetricsLowDecisionTokenAllowanceOptions;\n}\n\n/** 可独立选择文件并定义代码行与 finding policy 的 file-metrics 区域。 */\nexport interface FileMetricsCodeAreaOptions {\n /** 显式区域必须声明本字段;其中各子字段可省略并使用 package 默认值。 */\n readonly files: FileMetricsFileOptions;\n /** 省略时继承顶层 `findingPolicy`。 */\n readonly findingPolicy?: FindingPolicy;\n /** 省略时使用 package 默认代码行策略。 */\n readonly codeLines?: FileMetricsCodeLineOptions;\n}\n\n/** file-metrics 用于识别可豁免 finding 的稳定语义字段。 */\nexport interface FileMetricsFindingIdentity {\n /** file-metrics 当前只产生文件代码行 finding。 */\n readonly metric: \"code-lines\";\n /** 已 normalized 的 project-root-relative slash path;不得为绝对、含反斜杠或含 `.`/`..` 的路径。 */\n readonly path: string;\n}\n\n/** 一项 file-metrics finding 的声明式豁免;执行时仍会扫描并发布该 finding。 */\nexport type FileMetricsFindingWaiver = FindingWaiver<FileMetricsFindingIdentity>;\n\n/** `fileMetrics(options?)` 接受并补齐默认值的公开策略。 */\nexport interface FileMetricsOptions {\n /** 省略时建立默认 `project` 区域;显式映射必须非空。 */\n readonly codeAreas?: Readonly<Record<string, FileMetricsCodeAreaOptions>>;\n /** 省略时为 `non-blocking`;区域可局部覆盖。 */\n readonly findingPolicy?: FindingPolicy;\n /** 省略时没有豁免;每项以 `{ metric, path }` 精确匹配,并必须提供非空理由。 */\n readonly findingWaivers?: readonly FileMetricsFindingWaiver[];\n /** 省略时直接执行 `scc`;CLI 协议由 owning adapter 固定。 */\n readonly scanner?: FileMetricsScannerOptions;\n}\n\n/** 构造函数生成并由 Check preflight/execution 消费的完整 options。 */\nexport interface ResolvedFileMetricsOptions {\n readonly codeAreas: Readonly<Record<string, ResolvedFileMetricsCodeAreaOptions>>;\n readonly findingWaivers: readonly FileMetricsFindingWaiver[];\n readonly scanner: ResolvedFileMetricsScannerOptions;\n}\n\nexport interface ResolvedFileMetricsCodeAreaOptions {\n readonly codeLines: ResolvedFileMetricsCodeLineOptions;\n readonly files: ProjectFileSelection;\n readonly findingPolicy: FindingPolicy;\n}\n\nexport interface ResolvedFileMetricsCodeLineOptions {\n readonly lowDecisionTokenAllowance: ResolvedFileMetricsLowDecisionTokenAllowanceOptions;\n readonly maximum: number;\n}\n\nexport interface ResolvedFileMetricsLowDecisionTokenAllowanceOptions {\n readonly maximumCodeLines: number;\n readonly maximumDecisionTokens: number;\n}\n\nexport interface ResolvedFileMetricsScannerOptions {\n readonly executable: string;\n}\n"]}
|