@zxyycom/vibe-check 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -74
- package/dist/esm/cache/cache-json-by-key.mjs +189 -0
- package/dist/esm/cache/cache-json-by-key.mjs.map +1 -0
- package/dist/esm/check/check.mjs.map +1 -1
- package/dist/esm/check/finding-presentation.mjs +40 -0
- package/dist/esm/check/finding-presentation.mjs.map +1 -0
- package/dist/esm/check/inherited-collection.mjs +1 -1
- package/dist/esm/check/inherited-collection.mjs.map +1 -1
- package/dist/esm/check-settlement/fact-validation.mjs +17 -23
- package/dist/esm/check-settlement/fact-validation.mjs.map +1 -1
- package/dist/esm/check-settlement/outcome-normalization.mjs +9 -19
- package/dist/esm/check-settlement/outcome-normalization.mjs.map +1 -1
- package/dist/esm/check-settlement/reason-shape.mjs +12 -0
- package/dist/esm/check-settlement/reason-shape.mjs.map +1 -0
- package/dist/esm/check-settlement/record-store.mjs +14 -17
- package/dist/esm/check-settlement/record-store.mjs.map +1 -1
- package/dist/esm/check-settlement/session.mjs +8 -2
- package/dist/esm/check-settlement/session.mjs.map +1 -1
- package/dist/esm/data-boundary/closed-values.mjs +16 -0
- package/dist/esm/data-boundary/closed-values.mjs.map +1 -1
- package/dist/esm/data-boundary/value-shapes.mjs +9 -0
- package/dist/esm/data-boundary/value-shapes.mjs.map +1 -1
- package/dist/esm/index.mjs +9 -2
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/learned-critical-path/duration-model/bounded-history.mjs +56 -0
- package/dist/esm/learned-critical-path/duration-model/bounded-history.mjs.map +1 -0
- package/dist/esm/learned-critical-path/duration-model/prediction.mjs +122 -0
- package/dist/esm/learned-critical-path/duration-model/prediction.mjs.map +1 -0
- package/dist/esm/learned-critical-path/duration-model/preparation.mjs +41 -0
- package/dist/esm/learned-critical-path/duration-model/preparation.mjs.map +1 -0
- package/dist/esm/learned-critical-path/duration-model/recording.mjs +109 -0
- package/dist/esm/learned-critical-path/duration-model/recording.mjs.map +1 -0
- package/dist/esm/learned-critical-path/duration-model/storage.mjs +187 -0
- package/dist/esm/learned-critical-path/duration-model/storage.mjs.map +1 -0
- package/dist/esm/learned-critical-path/selection-layers.mjs +28 -0
- package/dist/esm/learned-critical-path/selection-layers.mjs.map +1 -0
- package/dist/esm/learned-critical-path/static-decision.mjs +55 -0
- package/dist/esm/learned-critical-path/static-decision.mjs.map +1 -0
- package/dist/esm/learned-critical-path/strategy.mjs +179 -0
- package/dist/esm/learned-critical-path/strategy.mjs.map +1 -0
- package/dist/esm/machine-output/v4/atomic-publication.mjs +1 -15
- package/dist/esm/machine-output/v4/atomic-publication.mjs.map +1 -1
- package/dist/esm/package-checks/code-quality-findings/finding-waiver-authoring.mjs +40 -0
- package/dist/esm/package-checks/code-quality-findings/finding-waiver-authoring.mjs.map +1 -0
- package/dist/esm/package-checks/code-quality-findings/finding-waiver-evidence.mjs +48 -0
- package/dist/esm/package-checks/code-quality-findings/finding-waiver-evidence.mjs.map +1 -0
- package/dist/esm/package-checks/code-quality-findings/policy.mjs +20 -0
- package/dist/esm/package-checks/code-quality-findings/policy.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/area-policy.mjs +15 -7
- package/dist/esm/package-checks/duplicate-detection/area-policy.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/cache/identity.mjs +1 -1
- package/dist/esm/package-checks/duplicate-detection/cache/identity.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/default-check.mjs +1 -1
- package/dist/esm/package-checks/duplicate-detection/default-check.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/execution.mjs +44 -18
- package/dist/esm/package-checks/duplicate-detection/execution.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/finding-messages.mjs +59 -0
- package/dist/esm/package-checks/duplicate-detection/finding-messages.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/finding-waiver-identity.mjs +55 -0
- package/dist/esm/package-checks/duplicate-detection/finding-waiver-identity.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs +1 -1
- package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/jscpd/command-resolution.mjs +1 -1
- package/dist/esm/package-checks/duplicate-detection/jscpd/command-resolution.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/jscpd/json-report.mjs +15 -5
- package/dist/esm/package-checks/duplicate-detection/jscpd/json-report.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/jscpd/scanner.mjs +5 -4
- package/dist/esm/package-checks/duplicate-detection/jscpd/scanner.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/options-resolution.mjs +22 -47
- package/dist/esm/package-checks/duplicate-detection/options-resolution.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/options-validation.mjs +20 -25
- package/dist/esm/package-checks/duplicate-detection/options-validation.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/options.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/records.mjs +27 -6
- package/dist/esm/package-checks/duplicate-detection/records.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/execution.mjs +10 -17
- package/dist/esm/package-checks/file-metrics/execution.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/finding-messages.mjs +22 -0
- package/dist/esm/package-checks/file-metrics/finding-messages.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/options-resolution.mjs +11 -43
- package/dist/esm/package-checks/file-metrics/options-resolution.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/options-validation.mjs +15 -25
- package/dist/esm/package-checks/file-metrics/options-validation.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/records.mjs +2 -9
- package/dist/esm/package-checks/file-metrics/records.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/scc/availability.mjs +1 -1
- package/dist/esm/package-checks/file-metrics/scc/availability.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/scc/parser.mjs +4 -4
- package/dist/esm/package-checks/file-metrics/scc/parser.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/scc/scanner.mjs +2 -2
- package/dist/esm/package-checks/file-metrics/scc/scanner.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analysis.mjs +56 -15
- package/dist/esm/package-checks/function-metrics/analysis.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/analysis-context.mjs +550 -0
- package/dist/esm/package-checks/function-metrics/analyzer/analysis-context.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/analysis-model.mjs +332 -0
- package/dist/esm/package-checks/function-metrics/analyzer/analysis-model.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/contracts.mjs +7 -0
- package/dist/esm/package-checks/function-metrics/analyzer/contracts.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs +24 -0
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardnd.mjs +113 -0
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardnd.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/protocol.mjs +180 -0
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/protocol.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/registry.mjs +121 -0
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/registry.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/pipeline.mjs +217 -0
- package/dist/esm/package-checks/function-metrics/analyzer/pipeline.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/port-facade.mjs +96 -0
- package/dist/esm/package-checks/function-metrics/analyzer/port-facade.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/reader-registry.mjs +76 -0
- package/dist/esm/package-checks/function-metrics/analyzer/reader-registry.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/csharp.mjs +88 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/csharp.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/erlang.mjs +466 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/erlang.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/fortran.mjs +289 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/fortran.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/gdscript.mjs +38 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/gdscript.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/go.mjs +44 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/go.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/java-body-states.mjs +113 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/java-body-states.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/java.mjs +247 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/java.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/javascript.mjs +16 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/javascript.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/kotlin.mjs +103 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/kotlin.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/lua.mjs +55 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/lua.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/objc.mjs +100 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/objc.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/perl.mjs +367 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/perl.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/php-states.mjs +260 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/php-states.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/php.mjs +53 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/php.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/plsql.mjs +306 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/plsql.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/python.mjs +402 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/python.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/r.mjs +214 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/r.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/ruby.mjs +75 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/ruby.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/rust.mjs +32 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/rust.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/scala.mjs +47 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/scala.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/solidity.mjs +22 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/solidity.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/st.mjs +142 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/st.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/swift.mjs +94 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/swift.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/tsx.mjs +149 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/tsx.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/ttcn.mjs +79 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/ttcn.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/typescript.mjs +606 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/typescript.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/vue.mjs +31 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/vue.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/zig.mjs +23 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/zig.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/clike.mjs +492 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/clike.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/code-reader.mjs +542 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/code-reader.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/golike.mjs +141 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/golike.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/js-style-regex.mjs +62 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/js-style-regex.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/rubylike.mjs +154 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/rubylike.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/script-language.mjs +36 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/script-language.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer-adapter.mjs +56 -0
- package/dist/esm/package-checks/function-metrics/analyzer-adapter.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer-worker-contract.mjs +2 -0
- package/dist/esm/package-checks/function-metrics/analyzer-worker-contract.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer-worker-port.mjs +108 -0
- package/dist/esm/package-checks/function-metrics/analyzer-worker-port.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer-worker.mjs +24 -0
- package/dist/esm/package-checks/function-metrics/analyzer-worker.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/constructor.mjs +2 -2
- package/dist/esm/package-checks/function-metrics/constructor.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/execution.mjs +51 -33
- package/dist/esm/package-checks/function-metrics/execution.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/finding-messages.mjs +75 -0
- package/dist/esm/package-checks/function-metrics/finding-messages.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/finding-waiver-identity.mjs +28 -0
- package/dist/esm/package-checks/function-metrics/finding-waiver-identity.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/measurement-model.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/measurement.mjs +161 -26
- package/dist/esm/package-checks/function-metrics/measurement.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/options-resolution.mjs +30 -63
- package/dist/esm/package-checks/function-metrics/options-resolution.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/options-validation.mjs +27 -32
- package/dist/esm/package-checks/function-metrics/options-validation.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/options.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/records.mjs +31 -1
- package/dist/esm/package-checks/function-metrics/records.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/target-files.mjs +6 -67
- package/dist/esm/package-checks/function-metrics/target-files.mjs.map +1 -1
- package/dist/esm/package-checks/{file-metrics/scc → host-environment}/csv.mjs +1 -0
- package/dist/esm/package-checks/host-environment/csv.mjs.map +1 -0
- package/dist/esm/package-checks/host-environment/git.mjs +1 -1
- package/dist/esm/package-checks/host-environment/git.mjs.map +1 -1
- package/dist/esm/package-checks/host-environment/process.mjs +5 -0
- package/dist/esm/package-checks/host-environment/process.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/final-data.mjs.map +1 -1
- package/dist/esm/package-checks/json-schema-validation/options-validation.mjs +15 -17
- package/dist/esm/package-checks/json-schema-validation/options-validation.mjs.map +1 -1
- package/dist/esm/package-checks/json-schema-validation/options.mjs.map +1 -1
- package/dist/esm/package-checks/json-validation/final-data.mjs.map +1 -1
- package/dist/esm/package-checks/json-validation/options-validation.mjs +4 -10
- package/dist/esm/package-checks/json-validation/options-validation.mjs.map +1 -1
- package/dist/esm/package-checks/maintenance-reminders/final-data.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/default-check.mjs +9 -3
- package/dist/esm/package-checks/markdown-link-validation/default-check.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/execution.mjs +27 -24
- package/dist/esm/package-checks/markdown-link-validation/execution.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/filesystem-probes.mjs +82 -53
- package/dist/esm/package-checks/markdown-link-validation/filesystem-probes.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/final-data.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/finding-messages.mjs +36 -0
- package/dist/esm/package-checks/markdown-link-validation/finding-messages.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/local-resolution.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/local-resolver.mjs +2 -2
- package/dist/esm/package-checks/markdown-link-validation/local-resolver.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs +26 -4
- package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs +24 -11
- package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/options.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache-payload.mjs +185 -0
- package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache-payload.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache.mjs +131 -0
- package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/resolver-engine.mjs +58 -57
- package/dist/esm/package-checks/markdown-link-validation/resolver-engine.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/source-reader.mjs +54 -0
- package/dist/esm/package-checks/markdown-link-validation/source-reader.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/unavailable-reasons.mjs +16 -0
- package/dist/esm/package-checks/markdown-link-validation/unavailable-reasons.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/collection.mjs +1 -1
- package/dist/esm/package-checks/project-files/collection.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/configuration.mjs +2 -10
- package/dist/esm/package-checks/project-files/configuration.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/gitlink-revision.mjs +1 -1
- package/dist/esm/package-checks/project-files/gitlink-revision.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/gitlink-worktree.mjs +1 -1
- package/dist/esm/package-checks/project-files/gitlink-worktree.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/public-collection.mjs +56 -0
- package/dist/esm/package-checks/project-files/public-collection.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/revision-worktree-files.mjs +1 -1
- package/dist/esm/package-checks/project-files/revision-worktree-files.mjs.map +1 -1
- package/dist/esm/package-checks/secret-detection/classification.mjs +15 -0
- package/dist/esm/package-checks/secret-detection/classification.mjs.map +1 -0
- package/dist/esm/package-checks/secret-detection/default-check.mjs +39 -0
- package/dist/esm/package-checks/secret-detection/default-check.mjs.map +1 -0
- package/dist/esm/package-checks/secret-detection/execution.mjs +172 -0
- package/dist/esm/package-checks/secret-detection/execution.mjs.map +1 -0
- package/dist/esm/package-checks/secret-detection/final-data.mjs +33 -0
- package/dist/esm/package-checks/secret-detection/final-data.mjs.map +1 -0
- package/dist/esm/package-checks/secret-detection/finding-waiver-identity.mjs +30 -0
- package/dist/esm/package-checks/secret-detection/finding-waiver-identity.mjs.map +1 -0
- package/dist/esm/package-checks/secret-detection/input-preparation.mjs +153 -0
- package/dist/esm/package-checks/secret-detection/input-preparation.mjs.map +1 -0
- package/dist/esm/package-checks/secret-detection/options-resolution.mjs +40 -0
- package/dist/esm/package-checks/secret-detection/options-resolution.mjs.map +1 -0
- package/dist/esm/package-checks/secret-detection/options-validation.mjs +22 -0
- package/dist/esm/package-checks/secret-detection/options-validation.mjs.map +1 -0
- package/dist/esm/package-checks/secret-detection/options.mjs +2 -0
- package/dist/esm/package-checks/secret-detection/options.mjs.map +1 -0
- package/dist/esm/package-checks/secret-detection/records.mjs +31 -0
- package/dist/esm/package-checks/secret-detection/records.mjs.map +1 -0
- package/dist/esm/package-checks/secret-detection/secretlint/adapter.mjs +85 -0
- package/dist/esm/package-checks/secret-detection/secretlint/adapter.mjs.map +1 -0
- package/dist/esm/project-definition/check-tree/authoring.mjs +12 -172
- package/dist/esm/project-definition/check-tree/authoring.mjs.map +1 -1
- package/dist/esm/project-definition/check-tree/check-fields-authoring.mjs +171 -0
- package/dist/esm/project-definition/check-tree/check-fields-authoring.mjs.map +1 -0
- package/dist/esm/project-definition/check-tree/collection-authoring.mjs +16 -0
- package/dist/esm/project-definition/check-tree/collection-authoring.mjs.map +1 -0
- package/dist/esm/project-definition/check-tree/materialization.mjs +9 -1
- package/dist/esm/project-definition/check-tree/materialization.mjs.map +1 -1
- package/dist/esm/project-definition/check-tree/resolution.mjs +45 -13
- package/dist/esm/project-definition/check-tree/resolution.mjs.map +1 -1
- package/dist/esm/project-definition/check-tree/scheduling-authoring.mjs +73 -0
- package/dist/esm/project-definition/check-tree/scheduling-authoring.mjs.map +1 -0
- package/dist/esm/project-definition/declarative-snapshot.mjs +73 -0
- package/dist/esm/project-definition/declarative-snapshot.mjs.map +1 -0
- package/dist/esm/project-definition/output-defaults.mjs +18 -1
- package/dist/esm/project-definition/output-defaults.mjs.map +1 -1
- package/dist/esm/project-definition/output-validation.mjs +15 -15
- package/dist/esm/project-definition/output-validation.mjs.map +1 -1
- package/dist/esm/project-definition/progress-rendering-output.mjs +52 -0
- package/dist/esm/project-definition/progress-rendering-output.mjs.map +1 -0
- package/dist/esm/project-definition/project-definition-validation.mjs +100 -16
- package/dist/esm/project-definition/project-definition-validation.mjs.map +1 -1
- package/dist/esm/project-definition/project-definition.mjs +52 -47
- package/dist/esm/project-definition/project-definition.mjs.map +1 -1
- package/dist/esm/project-definition/resource-unit-mapping.mjs +21 -0
- package/dist/esm/project-definition/resource-unit-mapping.mjs.map +1 -0
- package/dist/esm/project-definition/scheduler-policy.mjs +2 -0
- package/dist/esm/project-definition/scheduler-policy.mjs.map +1 -0
- package/dist/esm/project-run/admission-strategy-provider/custom-strategy-preparation.mjs +54 -0
- package/dist/esm/project-run/admission-strategy-provider/custom-strategy-preparation.mjs.map +1 -0
- package/dist/esm/project-run/admission-strategy-provider/prepared-admission-strategy.mjs +2 -0
- package/dist/esm/project-run/admission-strategy-provider/prepared-admission-strategy.mjs.map +1 -0
- package/dist/esm/project-run/admission-strategy-provider/provider.mjs +23 -0
- package/dist/esm/project-run/admission-strategy-provider/provider.mjs.map +1 -0
- package/dist/esm/project-run/aggregation.mjs +7 -5
- package/dist/esm/project-run/aggregation.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/callback.mjs +35 -8
- package/dist/esm/project-run/check-execution/callback.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/console-capture.mjs +220 -0
- package/dist/esm/project-run/check-execution/console-capture.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/dependencies.mjs +21 -3
- package/dist/esm/project-run/check-execution/dependencies.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/execution-finalization.mjs +54 -13
- package/dist/esm/project-run/check-execution/execution-finalization.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/execution-settlement.mjs +13 -9
- package/dist/esm/project-run/check-execution/execution-settlement.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/flag-controls.mjs +87 -0
- package/dist/esm/project-run/check-execution/flag-controls.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/lifecycle.mjs +2 -0
- package/dist/esm/project-run/check-execution/lifecycle.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/messages.mjs +5 -0
- package/dist/esm/project-run/check-execution/messages.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/plan.mjs +9 -5
- package/dist/esm/project-run/check-execution/plan.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/preflight.mjs +18 -32
- package/dist/esm/project-run/check-execution/preflight.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/resolved-checks.mjs +100 -58
- package/dist/esm/project-run/check-execution/resolved-checks.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/resolved-execution-result.mjs +2 -0
- package/dist/esm/project-run/check-execution/resolved-execution-result.mjs.map +1 -0
- package/dist/esm/project-run/{completion.mjs → completion/completion.mjs} +16 -38
- package/dist/esm/project-run/completion/completion.mjs.map +1 -0
- package/dist/esm/project-run/{machine-publication.mjs → completion/machine-publication.mjs} +1 -1
- package/dist/esm/project-run/completion/machine-publication.mjs.map +1 -0
- package/dist/esm/project-run/completion/result-resolver.mjs +36 -0
- package/dist/esm/project-run/completion/result-resolver.mjs.map +1 -0
- package/dist/esm/project-run/controls/contract.mjs.map +1 -1
- package/dist/esm/project-run/controls/outputs-override-validation.mjs +67 -47
- package/dist/esm/project-run/controls/outputs-override-validation.mjs.map +1 -1
- package/dist/esm/project-run/controls/validation-result.mjs.map +1 -1
- package/dist/esm/project-run/controls/validation.mjs +75 -11
- package/dist/esm/project-run/controls/validation.mjs.map +1 -1
- package/dist/esm/project-run/diagnostic-logging/logger.mjs +100 -161
- package/dist/esm/project-run/diagnostic-logging/logger.mjs.map +1 -1
- package/dist/esm/project-run/diagnostic-logging/observation-rendering.mjs +159 -0
- package/dist/esm/project-run/diagnostic-logging/observation-rendering.mjs.map +1 -0
- package/dist/esm/project-run/invocation/candidate.mjs +61 -0
- package/dist/esm/project-run/invocation/candidate.mjs.map +1 -0
- package/dist/esm/project-run/invocation/creation.mjs +79 -0
- package/dist/esm/project-run/invocation/creation.mjs.map +1 -0
- package/dist/esm/project-run/invocation/paths.mjs +77 -0
- package/dist/esm/project-run/invocation/paths.mjs.map +1 -0
- package/dist/esm/project-run/invocation/progress.mjs +30 -0
- package/dist/esm/project-run/invocation/progress.mjs.map +1 -0
- package/dist/esm/project-run/{invocation.mjs → invocation/run.mjs} +78 -92
- package/dist/esm/project-run/invocation/run.mjs.map +1 -0
- package/dist/esm/project-run/invocation/scheduler.mjs +57 -0
- package/dist/esm/project-run/invocation/scheduler.mjs.map +1 -0
- package/dist/esm/project-run/{output-configuration.mjs → outputs/configuration.mjs} +3 -2
- package/dist/esm/project-run/outputs/configuration.mjs.map +1 -0
- package/dist/esm/project-run/outputs/status.mjs +105 -0
- package/dist/esm/project-run/outputs/status.mjs.map +1 -0
- package/dist/esm/project-run/progress-rendering/presentation.mjs +112 -18
- package/dist/esm/project-run/progress-rendering/presentation.mjs.map +1 -1
- package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs +108 -19
- package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs.map +1 -1
- package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs +30 -4
- package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs.map +1 -1
- package/dist/esm/project-run/progress-rendering/renderer.mjs +5 -2
- package/dist/esm/project-run/progress-rendering/renderer.mjs.map +1 -1
- package/dist/esm/project-run/project-context.mjs +1 -1
- package/dist/esm/project-run/project-context.mjs.map +1 -1
- package/dist/esm/project-run/result.mjs +2 -0
- package/dist/esm/project-run/result.mjs.map +1 -1
- package/dist/esm/project-run/run.mjs +1 -1
- package/dist/esm/project-run/run.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph.mjs +166 -0
- package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/admission-core/core.mjs +163 -0
- package/dist/esm/project-run/task-scheduler/admission-core/core.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/admission-core/input.mjs +119 -0
- package/dist/esm/project-run/task-scheduler/admission-core/input.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/admission-core/projection.mjs +124 -0
- package/dist/esm/project-run/task-scheduler/admission-core/projection.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/admission-core/selection-index.mjs +99 -0
- package/dist/esm/project-run/task-scheduler/admission-core/selection-index.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/admission-core/selection-query.mjs +198 -0
- package/dist/esm/project-run/task-scheduler/admission-core/selection-query.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/admission-core/selection-seed.mjs +151 -0
- package/dist/esm/project-run/task-scheduler/admission-core/selection-seed.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/admission-core/selection-transition.mjs +121 -0
- package/dist/esm/project-run/task-scheduler/admission-core/selection-transition.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/admission-core/selection.mjs +65 -0
- package/dist/esm/project-run/task-scheduler/admission-core/selection.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/admission-scope-layers.mjs +25 -0
- package/dist/esm/project-run/task-scheduler/admission-scope-layers.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/admission-selection-policy.mjs +55 -0
- package/dist/esm/project-run/task-scheduler/admission-selection-policy.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/critical-path-ranking.mjs +46 -0
- package/dist/esm/project-run/task-scheduler/critical-path-ranking.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/custom-admission-policy.mjs +110 -0
- package/dist/esm/project-run/task-scheduler/custom-admission-policy.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/execution-state.mjs +34 -5
- package/dist/esm/project-run/task-scheduler/execution-state.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/forced-block-effect-replay.mjs +46 -0
- package/dist/esm/project-run/task-scheduler/forced-block-effect-replay.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/graph-validation.mjs +54 -26
- package/dist/esm/project-run/task-scheduler/graph-validation.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/graph.mjs +79 -3
- package/dist/esm/project-run/task-scheduler/graph.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/measurement/diagnostics.mjs +207 -0
- package/dist/esm/project-run/task-scheduler/measurement/diagnostics.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/measurement/integrals.mjs +116 -0
- package/dist/esm/project-run/task-scheduler/measurement/integrals.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/measurement/policy.mjs +67 -0
- package/dist/esm/project-run/task-scheduler/measurement/policy.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/measurement/summary.mjs +123 -0
- package/dist/esm/project-run/task-scheduler/measurement/summary.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/measurement/timing.mjs +158 -0
- package/dist/esm/project-run/task-scheduler/measurement/timing.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/scheduler-admission-decision.mjs +90 -62
- package/dist/esm/project-run/task-scheduler/scheduler-admission-decision.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/scheduler-blocker-summary.mjs +20 -6
- package/dist/esm/project-run/task-scheduler/scheduler-blocker-summary.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/scheduler-decision-inspection.mjs +5 -105
- package/dist/esm/project-run/task-scheduler/scheduler-decision-inspection.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/scheduler-decision-model.mjs +0 -9
- package/dist/esm/project-run/task-scheduler/scheduler-decision-model.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/scheduler-decision.mjs +48 -28
- package/dist/esm/project-run/task-scheduler/scheduler-decision.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/scheduler-observation.mjs +89 -0
- package/dist/esm/project-run/task-scheduler/scheduler-observation.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/scheduler-task-lifecycle.mjs +94 -0
- package/dist/esm/project-run/task-scheduler/scheduler-task-lifecycle.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/scheduler-terminal-measurement.mjs +66 -0
- package/dist/esm/project-run/task-scheduler/scheduler-terminal-measurement.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/scheduler.mjs +171 -114
- package/dist/esm/project-run/task-scheduler/scheduler.mjs.map +1 -1
- package/docs/api-mechanics.md +64 -137
- package/docs/changelog.md +157 -0
- package/docs/checks/duplicate-detection.md +111 -59
- package/docs/checks/file-metrics.md +46 -43
- package/docs/checks/function-metrics.md +100 -163
- package/docs/checks/json-schema-validation.md +43 -36
- package/docs/checks/json-validation.md +38 -25
- package/docs/checks/maintenance-reminders.md +41 -29
- package/docs/checks/markdown-link-validation.md +82 -54
- package/docs/checks/secret-detection.md +129 -0
- package/docs/examples/artifacts/mixed-outcomes/definition.ts +5 -5
- package/docs/guides/cache-results.md +63 -0
- package/docs/guides/callbacks.md +34 -0
- package/docs/guides/check-dependencies.md +121 -0
- package/docs/guides/collecting-project-files.md +59 -0
- package/docs/guides/extending-check-lifecycle.md +112 -0
- package/docs/guides/finding-waivers.md +45 -0
- package/docs/guides/learned-scheduling.md +83 -0
- package/docs/guides/presenting-findings.md +54 -0
- package/docs/guides/run-outputs.md +145 -0
- package/docs/guides/scheduling.md +208 -0
- package/docs/guides/simulating-admission.md +55 -0
- package/docs/output.md +11 -20
- package/licenses/Lizard-1.24.0-MIT.txt +30 -0
- package/{third-party-licenses/momoa-3.3.12-LICENSE → licenses/Lizard-1.24.0-lizard.py-Apache-2.0.txt} +1 -0
- package/licenses/Pygments-2.18.0-BSD-2-Clause.txt +25 -0
- package/licenses/analyzer-translations-NOTICE.md +24 -0
- package/licenses/lizard-1.24.0-provenance.json +957 -0
- package/package.json +18 -6
- package/src/cache/cache-json-by-key.ts +304 -0
- package/src/check/check.ts +67 -17
- package/src/check/finding-presentation.ts +67 -0
- package/src/check/inherited-collection.ts +1 -1
- package/src/check-settlement/fact-validation.ts +29 -39
- package/src/check-settlement/outcome-normalization.ts +17 -35
- package/src/check-settlement/reason-shape.ts +20 -0
- package/src/check-settlement/record-store.ts +18 -15
- package/src/check-settlement/session.ts +12 -3
- package/src/data-boundary/closed-values.ts +29 -0
- package/src/data-boundary/value-shapes.ts +12 -0
- package/src/index.ts +70 -2
- package/src/learned-critical-path/duration-model/bounded-history.ts +108 -0
- package/src/learned-critical-path/duration-model/prediction.ts +181 -0
- package/src/learned-critical-path/duration-model/preparation.ts +77 -0
- package/src/learned-critical-path/duration-model/recording.ts +208 -0
- package/src/learned-critical-path/duration-model/storage.ts +252 -0
- package/src/learned-critical-path/selection-layers.ts +72 -0
- package/src/learned-critical-path/static-decision.ts +105 -0
- package/src/learned-critical-path/strategy.ts +299 -0
- package/src/machine-output/v4/atomic-publication.ts +1 -16
- package/src/package-checks/code-quality-findings/finding-waiver-authoring.ts +46 -0
- package/src/package-checks/code-quality-findings/finding-waiver-evidence.ts +95 -0
- package/src/package-checks/code-quality-findings/policy.ts +23 -0
- package/src/package-checks/duplicate-detection/area-policy.ts +24 -13
- package/src/package-checks/duplicate-detection/cache/identity.ts +1 -1
- package/src/package-checks/duplicate-detection/default-check.ts +1 -1
- package/src/package-checks/duplicate-detection/execution.ts +82 -22
- package/src/package-checks/duplicate-detection/finding-messages.ts +75 -0
- package/src/package-checks/duplicate-detection/finding-waiver-identity.ts +68 -0
- package/src/package-checks/duplicate-detection/jscpd/availability.ts +1 -1
- package/src/package-checks/duplicate-detection/jscpd/command-resolution.ts +1 -1
- package/src/package-checks/duplicate-detection/jscpd/json-report.ts +24 -5
- package/src/package-checks/duplicate-detection/jscpd/scanner.ts +6 -7
- package/src/package-checks/duplicate-detection/options-resolution.ts +32 -57
- package/src/package-checks/duplicate-detection/options-validation.ts +23 -31
- package/src/package-checks/duplicate-detection/options.ts +21 -1
- package/src/package-checks/duplicate-detection/records.ts +65 -12
- package/src/package-checks/file-metrics/execution.ts +16 -17
- package/src/package-checks/file-metrics/finding-messages.ts +29 -0
- package/src/package-checks/file-metrics/options-resolution.ts +19 -52
- package/src/package-checks/file-metrics/options-validation.ts +23 -32
- package/src/package-checks/file-metrics/records.ts +11 -23
- package/src/package-checks/file-metrics/scc/availability.ts +1 -1
- package/src/package-checks/file-metrics/scc/parser.ts +4 -4
- package/src/package-checks/file-metrics/scc/scanner.ts +2 -2
- package/src/package-checks/function-metrics/analysis.ts +76 -21
- package/src/package-checks/function-metrics/analyzer/analysis-context.ts +749 -0
- package/src/package-checks/function-metrics/analyzer/analysis-model.ts +421 -0
- package/src/package-checks/function-metrics/analyzer/contracts.ts +54 -0
- package/src/package-checks/function-metrics/analyzer/extension-output.ts +261 -0
- package/src/package-checks/function-metrics/analyzer/extensions/extension-base.ts +33 -0
- package/src/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.ts +27 -0
- package/src/package-checks/function-metrics/analyzer/extensions/lizardnd.ts +144 -0
- package/src/package-checks/function-metrics/analyzer/extensions/protocol.ts +345 -0
- package/src/package-checks/function-metrics/analyzer/extensions/registry.ts +157 -0
- package/src/package-checks/function-metrics/analyzer/pipeline.ts +311 -0
- package/src/package-checks/function-metrics/analyzer/port-facade.ts +142 -0
- package/src/package-checks/function-metrics/analyzer/reader-registry.ts +84 -0
- package/src/package-checks/function-metrics/analyzer/readers/csharp.ts +110 -0
- package/src/package-checks/function-metrics/analyzer/readers/erlang.ts +501 -0
- package/src/package-checks/function-metrics/analyzer/readers/fortran.ts +294 -0
- package/src/package-checks/function-metrics/analyzer/readers/gdscript.ts +42 -0
- package/src/package-checks/function-metrics/analyzer/readers/go.ts +53 -0
- package/src/package-checks/function-metrics/analyzer/readers/java-body-states.ts +141 -0
- package/src/package-checks/function-metrics/analyzer/readers/java.ts +270 -0
- package/src/package-checks/function-metrics/analyzer/readers/javascript.ts +19 -0
- package/src/package-checks/function-metrics/analyzer/readers/kotlin.ts +120 -0
- package/src/package-checks/function-metrics/analyzer/readers/lua.ts +68 -0
- package/src/package-checks/function-metrics/analyzer/readers/objc.ts +107 -0
- package/src/package-checks/function-metrics/analyzer/readers/perl.ts +340 -0
- package/src/package-checks/function-metrics/analyzer/readers/php-states.ts +246 -0
- package/src/package-checks/function-metrics/analyzer/readers/php.ts +63 -0
- package/src/package-checks/function-metrics/analyzer/readers/plsql.ts +306 -0
- package/src/package-checks/function-metrics/analyzer/readers/python.ts +431 -0
- package/src/package-checks/function-metrics/analyzer/readers/r.ts +234 -0
- package/src/package-checks/function-metrics/analyzer/readers/ruby.ts +88 -0
- package/src/package-checks/function-metrics/analyzer/readers/rust.ts +47 -0
- package/src/package-checks/function-metrics/analyzer/readers/scala.ts +60 -0
- package/src/package-checks/function-metrics/analyzer/readers/solidity.ts +32 -0
- package/src/package-checks/function-metrics/analyzer/readers/st.ts +161 -0
- package/src/package-checks/function-metrics/analyzer/readers/swift.ts +116 -0
- package/src/package-checks/function-metrics/analyzer/readers/tsx.ts +165 -0
- package/src/package-checks/function-metrics/analyzer/readers/ttcn.ts +90 -0
- package/src/package-checks/function-metrics/analyzer/readers/typescript.ts +593 -0
- package/src/package-checks/function-metrics/analyzer/readers/vue.ts +43 -0
- package/src/package-checks/function-metrics/analyzer/readers/zig.ts +35 -0
- package/src/package-checks/function-metrics/analyzer/shared/clike.ts +541 -0
- package/src/package-checks/function-metrics/analyzer/shared/code-reader.ts +682 -0
- package/src/package-checks/function-metrics/analyzer/shared/golike.ts +143 -0
- package/src/package-checks/function-metrics/analyzer/shared/js-style-regex.ts +75 -0
- package/src/package-checks/function-metrics/analyzer/shared/rubylike.ts +161 -0
- package/src/package-checks/function-metrics/analyzer/shared/script-language.ts +50 -0
- package/src/package-checks/function-metrics/analyzer-adapter.ts +84 -0
- package/src/package-checks/function-metrics/analyzer-worker-contract.ts +10 -0
- package/src/package-checks/function-metrics/analyzer-worker-port.ts +150 -0
- package/src/package-checks/function-metrics/analyzer-worker.ts +31 -0
- package/src/package-checks/function-metrics/constructor.ts +2 -2
- package/src/package-checks/function-metrics/execution.ts +94 -39
- package/src/package-checks/function-metrics/finding-messages.ts +95 -0
- package/src/package-checks/function-metrics/finding-waiver-identity.ts +36 -0
- package/src/package-checks/function-metrics/measurement-model.ts +15 -1
- package/src/package-checks/function-metrics/measurement.ts +221 -36
- package/src/package-checks/function-metrics/options-resolution.ts +39 -75
- package/src/package-checks/function-metrics/options-validation.ts +30 -39
- package/src/package-checks/function-metrics/options.ts +27 -11
- package/src/package-checks/function-metrics/records.ts +73 -7
- package/src/package-checks/function-metrics/target-files.ts +10 -70
- package/src/package-checks/{file-metrics/scc → host-environment}/csv.ts +1 -2
- package/src/package-checks/host-environment/git.ts +2 -2
- package/src/package-checks/host-environment/process.ts +10 -0
- package/src/package-checks/json-schema-validation/final-data.ts +8 -0
- package/src/package-checks/json-schema-validation/options-validation.ts +16 -23
- package/src/package-checks/json-schema-validation/options.ts +23 -0
- package/src/package-checks/json-validation/final-data.ts +5 -0
- package/src/package-checks/json-validation/options-validation.ts +4 -18
- package/src/package-checks/maintenance-reminders/final-data.ts +18 -0
- package/src/package-checks/markdown-link-validation/default-check.ts +9 -3
- package/src/package-checks/markdown-link-validation/execution.ts +51 -57
- package/src/package-checks/markdown-link-validation/filesystem-probes.ts +108 -51
- package/src/package-checks/markdown-link-validation/final-data.ts +5 -0
- package/src/package-checks/markdown-link-validation/finding-messages.ts +48 -0
- package/src/package-checks/markdown-link-validation/local-resolution.ts +17 -9
- package/src/package-checks/markdown-link-validation/local-resolver.ts +5 -2
- package/src/package-checks/markdown-link-validation/options-resolution.ts +31 -3
- package/src/package-checks/markdown-link-validation/options-validation.ts +27 -19
- package/src/package-checks/markdown-link-validation/options.ts +15 -0
- package/src/package-checks/markdown-link-validation/parse-facts-cache-payload.ts +246 -0
- package/src/package-checks/markdown-link-validation/parse-facts-cache.ts +154 -0
- package/src/package-checks/markdown-link-validation/resolver-engine.ts +75 -65
- package/src/package-checks/markdown-link-validation/source-reader.ts +86 -0
- package/src/package-checks/markdown-link-validation/unavailable-reasons.ts +42 -0
- package/src/package-checks/project-files/collection.ts +1 -1
- package/src/package-checks/project-files/configuration.ts +3 -14
- package/src/package-checks/project-files/gitlink-revision.ts +1 -1
- package/src/package-checks/project-files/gitlink-worktree.ts +1 -1
- package/src/package-checks/project-files/public-collection.ts +92 -0
- package/src/package-checks/project-files/revision-worktree-files.ts +1 -1
- package/src/package-checks/secret-detection/classification.ts +30 -0
- package/src/package-checks/secret-detection/default-check.ts +50 -0
- package/src/package-checks/secret-detection/execution.ts +247 -0
- package/src/package-checks/secret-detection/final-data.ts +57 -0
- package/src/package-checks/secret-detection/finding-waiver-identity.ts +37 -0
- package/src/package-checks/secret-detection/input-preparation.ts +233 -0
- package/src/package-checks/secret-detection/options-resolution.ts +65 -0
- package/src/package-checks/secret-detection/options-validation.ts +27 -0
- package/src/package-checks/secret-detection/options.ts +36 -0
- package/src/package-checks/secret-detection/records.ts +77 -0
- package/src/package-checks/secret-detection/secretlint/adapter.ts +123 -0
- package/src/project-definition/check-tree/authoring.ts +29 -230
- package/src/project-definition/check-tree/check-fields-authoring.ts +227 -0
- package/src/project-definition/check-tree/collection-authoring.ts +13 -0
- package/src/project-definition/check-tree/materialization.ts +9 -1
- package/src/project-definition/check-tree/resolution.ts +80 -22
- package/src/project-definition/check-tree/scheduling-authoring.ts +114 -0
- package/src/project-definition/declarative-snapshot.ts +87 -0
- package/src/project-definition/output-defaults.ts +32 -1
- package/src/project-definition/output-validation.ts +15 -15
- package/src/project-definition/progress-rendering-output.ts +121 -0
- package/src/project-definition/project-definition-validation.ts +117 -18
- package/src/project-definition/project-definition.ts +198 -61
- package/src/project-definition/resource-unit-mapping.ts +25 -0
- package/src/project-definition/scheduler-policy.ts +553 -0
- package/src/project-run/admission-strategy-provider/custom-strategy-preparation.ts +80 -0
- package/src/project-run/admission-strategy-provider/prepared-admission-strategy.ts +27 -0
- package/src/project-run/admission-strategy-provider/provider.ts +45 -0
- package/src/project-run/aggregation.ts +10 -5
- package/src/project-run/check-execution/callback.ts +50 -8
- package/src/project-run/check-execution/console-capture.ts +262 -0
- package/src/project-run/check-execution/dependencies.ts +43 -6
- package/src/project-run/check-execution/execution-finalization.ts +99 -25
- package/src/project-run/check-execution/execution-settlement.ts +19 -11
- package/src/project-run/check-execution/flag-controls.ts +132 -0
- package/src/project-run/check-execution/lifecycle.ts +21 -0
- package/src/project-run/check-execution/messages.ts +8 -0
- package/src/project-run/check-execution/plan.ts +12 -8
- package/src/project-run/check-execution/preflight.ts +23 -43
- package/src/project-run/check-execution/resolved-checks.ts +165 -126
- package/src/project-run/check-execution/resolved-execution-result.ts +22 -0
- package/src/project-run/{completion.ts → completion/completion.ts} +17 -57
- package/src/project-run/{machine-publication.ts → completion/machine-publication.ts} +4 -4
- package/src/project-run/completion/result-resolver.ts +60 -0
- package/src/project-run/controls/contract.ts +25 -2
- package/src/project-run/controls/outputs-override-validation.ts +83 -60
- package/src/project-run/controls/validation-result.ts +17 -6
- package/src/project-run/controls/validation.ts +107 -12
- package/src/project-run/diagnostic-logging/logger.ts +132 -207
- package/src/project-run/diagnostic-logging/observation-rendering.ts +203 -0
- package/src/project-run/invocation/candidate.ts +86 -0
- package/src/project-run/invocation/creation.ts +116 -0
- package/src/project-run/invocation/paths.ts +154 -0
- package/src/project-run/invocation/progress.ts +38 -0
- package/src/project-run/{invocation.ts → invocation/run.ts} +125 -120
- package/src/project-run/invocation/scheduler.ts +75 -0
- package/src/project-run/{output-configuration.ts → outputs/configuration.ts} +6 -5
- package/src/project-run/outputs/status.ts +161 -0
- package/src/project-run/progress-rendering/presentation.ts +118 -26
- package/src/project-run/progress-rendering/renderer-formatting.ts +166 -19
- package/src/project-run/progress-rendering/renderer-lifecycle.ts +38 -3
- package/src/project-run/progress-rendering/renderer.ts +13 -2
- package/src/project-run/project-context.ts +3 -2
- package/src/project-run/result.ts +49 -3
- package/src/project-run/run.ts +7 -6
- package/src/project-run/task-scheduler/admission-core/compiled-graph.ts +316 -0
- package/src/project-run/task-scheduler/admission-core/core.ts +278 -0
- package/src/project-run/task-scheduler/admission-core/input.ts +138 -0
- package/src/project-run/task-scheduler/admission-core/projection.ts +164 -0
- package/src/project-run/task-scheduler/admission-core/selection-index.ts +165 -0
- package/src/project-run/task-scheduler/admission-core/selection-query.ts +295 -0
- package/src/project-run/task-scheduler/admission-core/selection-seed.ts +252 -0
- package/src/project-run/task-scheduler/admission-core/selection-transition.ts +236 -0
- package/src/project-run/task-scheduler/admission-core/selection.ts +140 -0
- package/src/project-run/task-scheduler/admission-core/trace.ts +177 -0
- package/src/project-run/task-scheduler/admission-scope-layers.ts +44 -0
- package/src/project-run/task-scheduler/admission-selection-policy.ts +116 -0
- package/src/project-run/task-scheduler/critical-path-ranking.ts +76 -0
- package/src/project-run/task-scheduler/custom-admission-policy.ts +128 -0
- package/src/project-run/task-scheduler/execution-state.ts +97 -6
- package/src/project-run/task-scheduler/forced-block-effect-replay.ts +68 -0
- package/src/project-run/task-scheduler/graph-validation.ts +77 -31
- package/src/project-run/task-scheduler/graph.ts +111 -3
- package/src/project-run/task-scheduler/measurement/diagnostics.ts +261 -0
- package/src/project-run/task-scheduler/measurement/integrals.ts +177 -0
- package/src/project-run/task-scheduler/measurement/policy.ts +105 -0
- package/src/project-run/task-scheduler/measurement/summary.ts +175 -0
- package/src/project-run/task-scheduler/measurement/timing.ts +190 -0
- package/src/project-run/task-scheduler/scheduler-admission-decision.ts +143 -134
- package/src/project-run/task-scheduler/scheduler-blocker-summary.ts +34 -9
- package/src/project-run/task-scheduler/scheduler-decision-inspection.ts +28 -170
- package/src/project-run/task-scheduler/scheduler-decision-model.ts +36 -40
- package/src/project-run/task-scheduler/scheduler-decision.ts +68 -36
- package/src/project-run/task-scheduler/scheduler-observation.ts +124 -0
- package/src/project-run/task-scheduler/scheduler-task-lifecycle.ts +150 -0
- package/src/project-run/task-scheduler/scheduler-terminal-measurement.ts +95 -0
- package/src/project-run/task-scheduler/scheduler.ts +216 -171
- package/types/cache/cache-json-by-key.d.ts +53 -0
- package/types/check/check.d.ts +62 -17
- package/types/check/finding-presentation.d.ts +25 -0
- package/types/check/inherited-collection.d.ts +1 -1
- package/types/check-settlement/reason-shape.d.ts +5 -0
- package/types/check-settlement/record-store.d.ts +2 -2
- package/types/check-settlement/session.d.ts +3 -1
- package/types/data-boundary/closed-values.d.ts +8 -0
- package/types/data-boundary/value-shapes.d.ts +3 -0
- package/types/index.d.ts +22 -7
- package/types/learned-critical-path/duration-model/bounded-history.d.ts +34 -0
- package/types/learned-critical-path/duration-model/prediction.d.ts +32 -0
- package/types/learned-critical-path/duration-model/preparation.d.ts +28 -0
- package/types/learned-critical-path/duration-model/recording.d.ts +28 -0
- package/types/learned-critical-path/duration-model/storage.d.ts +12 -0
- package/types/learned-critical-path/selection-layers.d.ts +14 -0
- package/types/learned-critical-path/static-decision.d.ts +3 -0
- package/types/learned-critical-path/strategy.d.ts +35 -0
- package/types/package-checks/code-quality-findings/finding-waiver-authoring.d.ts +7 -0
- package/types/package-checks/code-quality-findings/finding-waiver-evidence.d.ts +34 -0
- package/types/package-checks/code-quality-findings/policy.d.ts +4 -0
- package/types/package-checks/duplicate-detection/area-policy.d.ts +1 -1
- package/types/package-checks/duplicate-detection/finding-messages.d.ts +7 -0
- package/types/package-checks/duplicate-detection/finding-waiver-identity.d.ts +3 -0
- package/types/package-checks/duplicate-detection/jscpd/command-resolution.d.ts +1 -1
- package/types/package-checks/duplicate-detection/options.d.ts +18 -1
- package/types/package-checks/duplicate-detection/records.d.ts +20 -3
- package/types/package-checks/file-metrics/finding-messages.d.ts +4 -0
- package/types/package-checks/file-metrics/records.d.ts +5 -10
- package/types/package-checks/file-metrics/scc/parser.d.ts +4 -4
- package/types/package-checks/function-metrics/analysis.d.ts +1 -1
- package/types/package-checks/function-metrics/analyzer/analysis-context.d.ts +174 -0
- package/types/package-checks/function-metrics/analyzer/analysis-model.d.ts +135 -0
- package/types/package-checks/function-metrics/analyzer/contracts.d.ts +48 -0
- package/types/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.d.ts +13 -0
- package/types/package-checks/function-metrics/analyzer/extensions/lizardnd.d.ts +28 -0
- package/types/package-checks/function-metrics/analyzer/extensions/protocol.d.ts +99 -0
- package/types/package-checks/function-metrics/analyzer/extensions/registry.d.ts +34 -0
- package/types/package-checks/function-metrics/analyzer/pipeline.d.ts +67 -0
- package/types/package-checks/function-metrics/analyzer/port-facade.d.ts +38 -0
- package/types/package-checks/function-metrics/analyzer/reader-registry.d.ts +18 -0
- package/types/package-checks/function-metrics/analyzer/readers/csharp.d.ts +22 -0
- package/types/package-checks/function-metrics/analyzer/readers/erlang.d.ts +22 -0
- package/types/package-checks/function-metrics/analyzer/readers/fortran.d.ts +29 -0
- package/types/package-checks/function-metrics/analyzer/readers/gdscript.d.ts +18 -0
- package/types/package-checks/function-metrics/analyzer/readers/go.d.ts +18 -0
- package/types/package-checks/function-metrics/analyzer/readers/java-body-states.d.ts +18 -0
- package/types/package-checks/function-metrics/analyzer/readers/java.d.ts +44 -0
- package/types/package-checks/function-metrics/analyzer/readers/javascript.d.ts +14 -0
- package/types/package-checks/function-metrics/analyzer/readers/kotlin.d.ts +23 -0
- package/types/package-checks/function-metrics/analyzer/readers/lua.d.ts +16 -0
- package/types/package-checks/function-metrics/analyzer/readers/objc.d.ts +18 -0
- package/types/package-checks/function-metrics/analyzer/readers/perl.d.ts +28 -0
- package/types/package-checks/function-metrics/analyzer/readers/php-states.d.ts +41 -0
- package/types/package-checks/function-metrics/analyzer/readers/php.d.ts +22 -0
- package/types/package-checks/function-metrics/analyzer/readers/plsql.d.ts +24 -0
- package/types/package-checks/function-metrics/analyzer/readers/python.d.ts +50 -0
- package/types/package-checks/function-metrics/analyzer/readers/r.d.ts +22 -0
- package/types/package-checks/function-metrics/analyzer/readers/ruby.d.ts +16 -0
- package/types/package-checks/function-metrics/analyzer/readers/rust.d.ts +20 -0
- package/types/package-checks/function-metrics/analyzer/readers/scala.d.ts +20 -0
- package/types/package-checks/function-metrics/analyzer/readers/solidity.d.ts +19 -0
- package/types/package-checks/function-metrics/analyzer/readers/st.d.ts +37 -0
- package/types/package-checks/function-metrics/analyzer/readers/swift.d.ts +30 -0
- package/types/package-checks/function-metrics/analyzer/readers/tsx.d.ts +15 -0
- package/types/package-checks/function-metrics/analyzer/readers/ttcn.d.ts +22 -0
- package/types/package-checks/function-metrics/analyzer/readers/typescript.d.ts +35 -0
- package/types/package-checks/function-metrics/analyzer/readers/vue.d.ts +18 -0
- package/types/package-checks/function-metrics/analyzer/readers/zig.d.ts +19 -0
- package/types/package-checks/function-metrics/analyzer/shared/clike.d.ts +101 -0
- package/types/package-checks/function-metrics/analyzer/shared/code-reader.d.ts +176 -0
- package/types/package-checks/function-metrics/analyzer/shared/golike.d.ts +39 -0
- package/types/package-checks/function-metrics/analyzer/shared/js-style-regex.d.ts +16 -0
- package/types/package-checks/function-metrics/analyzer/shared/rubylike.d.ts +40 -0
- package/types/package-checks/function-metrics/analyzer/shared/script-language.d.ts +17 -0
- package/types/package-checks/function-metrics/analyzer-adapter.d.ts +26 -0
- package/types/package-checks/function-metrics/analyzer-worker-contract.d.ts +5 -0
- package/types/package-checks/function-metrics/analyzer-worker-port.d.ts +24 -0
- package/types/package-checks/function-metrics/analyzer-worker.d.ts +1 -0
- package/types/package-checks/function-metrics/constructor.d.ts +1 -1
- package/types/package-checks/function-metrics/execution.d.ts +5 -2
- package/types/package-checks/function-metrics/finding-messages.d.ts +9 -0
- package/types/package-checks/function-metrics/finding-waiver-identity.d.ts +2 -0
- package/types/package-checks/function-metrics/measurement-model.d.ts +13 -1
- package/types/package-checks/function-metrics/measurement.d.ts +22 -7
- package/types/package-checks/function-metrics/options.d.ts +23 -10
- package/types/package-checks/function-metrics/records.d.ts +24 -5
- package/types/package-checks/function-metrics/target-files.d.ts +4 -3
- package/types/package-checks/host-environment/csv.d.ts +2 -0
- package/types/package-checks/host-environment/git.d.ts +1 -1
- package/types/package-checks/host-environment/process.d.ts +5 -0
- package/types/package-checks/json-schema-validation/final-data.d.ts +8 -0
- package/types/package-checks/json-schema-validation/options.d.ts +31 -3
- package/types/package-checks/json-validation/final-data.d.ts +5 -0
- package/types/package-checks/maintenance-reminders/final-data.d.ts +18 -0
- package/types/package-checks/markdown-link-validation/default-check.d.ts +9 -3
- package/types/package-checks/markdown-link-validation/execution.d.ts +1 -3
- package/types/package-checks/markdown-link-validation/final-data.d.ts +5 -0
- package/types/package-checks/markdown-link-validation/finding-messages.d.ts +4 -0
- package/types/package-checks/markdown-link-validation/local-resolution.d.ts +12 -6
- package/types/package-checks/markdown-link-validation/local-resolver.d.ts +2 -1
- package/types/package-checks/markdown-link-validation/options.d.ts +15 -0
- package/types/package-checks/markdown-link-validation/parse-facts-cache-payload.d.ts +24 -0
- package/types/package-checks/markdown-link-validation/parse-facts-cache.d.ts +13 -0
- package/types/package-checks/markdown-link-validation/resolver-engine.d.ts +6 -4
- package/types/package-checks/markdown-link-validation/source-reader.d.ts +11 -0
- package/types/package-checks/markdown-link-validation/unavailable-reasons.d.ts +4 -0
- package/types/package-checks/project-files/public-collection.d.ts +16 -0
- package/types/package-checks/secret-detection/classification.d.ts +12 -0
- package/types/package-checks/secret-detection/default-check.d.ts +11 -0
- package/types/package-checks/secret-detection/execution.d.ts +14 -0
- package/types/package-checks/secret-detection/final-data.d.ts +15 -0
- package/types/package-checks/secret-detection/finding-waiver-identity.d.ts +5 -0
- package/types/package-checks/secret-detection/input-preparation.d.ts +24 -0
- package/types/package-checks/secret-detection/options-resolution.d.ts +6 -0
- package/types/package-checks/secret-detection/options-validation.d.ts +3 -0
- package/types/package-checks/secret-detection/options.d.ts +32 -0
- package/types/package-checks/secret-detection/records.d.ts +35 -0
- package/types/package-checks/secret-detection/secretlint/adapter.d.ts +28 -0
- package/types/project-definition/check-tree/authoring.d.ts +11 -14
- package/types/project-definition/check-tree/check-fields-authoring.d.ts +25 -0
- package/types/project-definition/check-tree/collection-authoring.d.ts +2 -0
- package/types/project-definition/check-tree/resolution.d.ts +8 -3
- package/types/project-definition/check-tree/scheduling-authoring.d.ts +19 -0
- package/types/project-definition/declarative-snapshot.d.ts +7 -0
- package/types/project-definition/output-defaults.d.ts +7 -0
- package/types/project-definition/output-validation.d.ts +2 -1
- package/types/project-definition/progress-rendering-output.d.ts +41 -0
- package/types/project-definition/project-definition.d.ts +61 -16
- package/types/project-definition/resource-unit-mapping.d.ts +4 -0
- package/types/project-definition/scheduler-policy.d.ts +497 -0
- package/types/project-run/admission-strategy-provider/custom-strategy-preparation.d.ts +9 -0
- package/types/project-run/admission-strategy-provider/prepared-admission-strategy.d.ts +23 -0
- package/types/project-run/admission-strategy-provider/provider.d.ts +13 -0
- package/types/project-run/aggregation.d.ts +1 -1
- package/types/project-run/check-execution/callback.d.ts +5 -1
- package/types/project-run/check-execution/console-capture.d.ts +18 -0
- package/types/project-run/check-execution/dependencies.d.ts +1 -1
- package/types/project-run/check-execution/execution-finalization.d.ts +17 -7
- package/types/project-run/check-execution/execution-settlement.d.ts +5 -2
- package/types/project-run/check-execution/flag-controls.d.ts +27 -0
- package/types/project-run/check-execution/lifecycle.d.ts +20 -0
- package/types/project-run/check-execution/messages.d.ts +2 -0
- package/types/project-run/check-execution/plan.d.ts +2 -3
- package/types/project-run/check-execution/preflight.d.ts +6 -5
- package/types/project-run/check-execution/resolved-checks.d.ts +32 -38
- package/types/project-run/check-execution/resolved-execution-result.d.ts +21 -0
- package/types/project-run/{completion.d.ts → completion/completion.d.ts} +4 -4
- package/types/project-run/{machine-publication.d.ts → completion/machine-publication.d.ts} +3 -3
- package/types/project-run/completion/result-resolver.d.ts +4 -0
- package/types/project-run/controls/contract.d.ts +25 -2
- package/types/project-run/controls/outputs-override-validation.d.ts +2 -1
- package/types/project-run/controls/validation-result.d.ts +12 -4
- package/types/project-run/diagnostic-logging/logger.d.ts +34 -4
- package/types/project-run/diagnostic-logging/observation-rendering.d.ts +7 -0
- package/types/project-run/invocation/candidate.d.ts +12 -0
- package/types/project-run/{invocation-creation.d.ts → invocation/creation.d.ts} +3 -3
- package/types/project-run/invocation/paths.d.ts +40 -0
- package/types/project-run/invocation/progress.d.ts +11 -0
- package/types/project-run/invocation/run.d.ts +43 -0
- package/types/project-run/invocation/scheduler.d.ts +16 -0
- package/types/project-run/outputs/configuration.d.ts +3 -0
- package/types/project-run/outputs/status.d.ts +48 -0
- package/types/project-run/progress-rendering/presentation.d.ts +9 -5
- package/types/project-run/progress-rendering/renderer-formatting.d.ts +8 -0
- package/types/project-run/progress-rendering/renderer-lifecycle.d.ts +6 -1
- package/types/project-run/progress-rendering/renderer.d.ts +7 -1
- package/types/project-run/project-context.d.ts +2 -1
- package/types/project-run/result.d.ts +37 -3
- package/types/project-run/run.d.ts +6 -5
- package/types/project-run/task-scheduler/admission-core/compiled-graph.d.ts +31 -0
- package/types/project-run/task-scheduler/admission-core/core.d.ts +57 -0
- package/types/project-run/task-scheduler/admission-core/input.d.ts +4 -0
- package/types/project-run/task-scheduler/admission-core/projection.d.ts +22 -0
- package/types/project-run/task-scheduler/admission-core/selection-index.d.ts +61 -0
- package/types/project-run/task-scheduler/admission-core/selection-query.d.ts +28 -0
- package/types/project-run/task-scheduler/admission-core/selection-seed.d.ts +9 -0
- package/types/project-run/task-scheduler/admission-core/selection-transition.d.ts +4 -0
- package/types/project-run/task-scheduler/admission-core/selection.d.ts +20 -0
- package/types/project-run/task-scheduler/admission-scope-layers.d.ts +8 -0
- package/types/project-run/task-scheduler/admission-selection-policy.d.ts +31 -0
- package/types/project-run/task-scheduler/critical-path-ranking.d.ts +19 -0
- package/types/project-run/task-scheduler/custom-admission-policy.d.ts +6 -0
- package/types/project-run/task-scheduler/execution-state.d.ts +43 -1
- package/types/project-run/task-scheduler/forced-block-effect-replay.d.ts +9 -0
- package/types/project-run/task-scheduler/graph-validation.d.ts +3 -2
- package/types/project-run/task-scheduler/graph.d.ts +15 -0
- package/types/project-run/task-scheduler/measurement/diagnostics.d.ts +47 -0
- package/types/project-run/task-scheduler/measurement/integrals.d.ts +27 -0
- package/types/project-run/task-scheduler/measurement/policy.d.ts +10 -0
- package/types/project-run/task-scheduler/measurement/summary.d.ts +3 -0
- package/types/project-run/task-scheduler/measurement/timing.d.ts +33 -0
- package/types/project-run/task-scheduler/scheduler-admission-decision.d.ts +13 -1
- package/types/project-run/task-scheduler/scheduler-decision-inspection.d.ts +20 -19
- package/types/project-run/task-scheduler/scheduler-decision-model.d.ts +38 -22
- package/types/project-run/task-scheduler/scheduler-decision.d.ts +4 -1
- package/types/project-run/task-scheduler/scheduler-observation.d.ts +14 -0
- package/types/project-run/task-scheduler/scheduler-task-lifecycle.d.ts +18 -0
- package/types/project-run/task-scheduler/scheduler-terminal-measurement.d.ts +9 -0
- package/dist/esm/package-checks/file-metrics/scc/csv.mjs.map +0 -1
- package/dist/esm/package-checks/function-metrics/lizard/availability.mjs +0 -64
- package/dist/esm/package-checks/function-metrics/lizard/availability.mjs.map +0 -1
- package/dist/esm/package-checks/function-metrics/lizard/csv.mjs +0 -17
- package/dist/esm/package-checks/function-metrics/lizard/csv.mjs.map +0 -1
- package/dist/esm/package-checks/function-metrics/lizard/parser.mjs +0 -138
- package/dist/esm/package-checks/function-metrics/lizard/parser.mjs.map +0 -1
- package/dist/esm/package-checks/function-metrics/lizard/scanner.mjs +0 -35
- package/dist/esm/package-checks/function-metrics/lizard/scanner.mjs.map +0 -1
- package/dist/esm/package-checks/host-environment/process/command.mjs +0 -13
- package/dist/esm/package-checks/host-environment/process/command.mjs.map +0 -1
- package/dist/esm/project-run/completion.mjs.map +0 -1
- package/dist/esm/project-run/invocation-creation.mjs +0 -111
- package/dist/esm/project-run/invocation-creation.mjs.map +0 -1
- package/dist/esm/project-run/invocation.mjs.map +0 -1
- package/dist/esm/project-run/machine-publication.mjs.map +0 -1
- package/dist/esm/project-run/output-configuration.mjs.map +0 -1
- package/dist/esm/project-run/output-status.mjs +0 -43
- package/dist/esm/project-run/output-status.mjs.map +0 -1
- package/src/package-checks/function-metrics/lizard/availability.ts +0 -90
- package/src/package-checks/function-metrics/lizard/csv.ts +0 -20
- package/src/package-checks/function-metrics/lizard/parser.ts +0 -179
- package/src/package-checks/function-metrics/lizard/scanner.ts +0 -62
- package/src/package-checks/host-environment/process/command.ts +0 -21
- package/src/project-run/invocation-creation.ts +0 -160
- package/src/project-run/output-status.ts +0 -69
- package/types/package-checks/file-metrics/scc/csv.d.ts +0 -1
- package/types/package-checks/function-metrics/lizard/availability.d.ts +0 -11
- package/types/package-checks/function-metrics/lizard/csv.d.ts +0 -1
- package/types/package-checks/function-metrics/lizard/parser.d.ts +0 -17
- package/types/package-checks/function-metrics/lizard/scanner.d.ts +0 -15
- package/types/package-checks/host-environment/process/command.d.ts +0 -7
- package/types/project-run/invocation.d.ts +0 -34
- package/types/project-run/output-configuration.d.ts +0 -3
- package/types/project-run/output-status.d.ts +0 -21
|
@@ -1,25 +1,20 @@
|
|
|
1
|
-
import { snapshotClosedRecord } from "../../data-boundary/closed-values.mjs";
|
|
1
|
+
import { snapshotClosedRecord, snapshotExactClosedRecord } from "../../data-boundary/closed-values.mjs";
|
|
2
|
+
import { isNonEmptyString, isPositiveSafeInteger } from "../../data-boundary/value-shapes.mjs";
|
|
2
3
|
import { validProjectFileSelection } from "../project-files/configuration.mjs";
|
|
3
4
|
import { validFindingPolicy } from "../code-quality-findings/policy.mjs";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
return record !== undefined &&
|
|
7
|
-
Object.keys(record).length === keys.length &&
|
|
8
|
-
keys.every((key) => Object.hasOwn(record, key))
|
|
9
|
-
? record
|
|
10
|
-
: undefined;
|
|
11
|
-
}
|
|
12
|
-
function positiveSafeInteger(value) {
|
|
13
|
-
return typeof value === "number" && Number.isSafeInteger(value) && value > 0;
|
|
14
|
-
}
|
|
15
|
-
function nonEmptyString(value) {
|
|
16
|
-
return typeof value === "string" && value.length > 0;
|
|
17
|
-
}
|
|
5
|
+
import { validResolvedFindingWaivers } from "../code-quality-findings/finding-waiver-authoring.mjs";
|
|
6
|
+
import { resolveDuplicateDetectionFindingIdentity } from "./finding-waiver-identity.mjs";
|
|
18
7
|
export function validResolvedDuplicateDetectionOptions(value) {
|
|
19
|
-
const options =
|
|
8
|
+
const options = snapshotExactClosedRecord(value, [
|
|
9
|
+
"cache",
|
|
10
|
+
"codeAreas",
|
|
11
|
+
"findingWaivers",
|
|
12
|
+
"scanner"
|
|
13
|
+
]);
|
|
20
14
|
return (options !== undefined &&
|
|
21
15
|
validDuplicateCache(options.cache) &&
|
|
22
16
|
validDuplicateCodeAreas(options.codeAreas) &&
|
|
17
|
+
validResolvedFindingWaivers(options.findingWaivers, resolveDuplicateDetectionFindingIdentity) &&
|
|
23
18
|
validDuplicateDetectionScanner(options.scanner));
|
|
24
19
|
}
|
|
25
20
|
function validDuplicateCodeAreas(value) {
|
|
@@ -27,22 +22,22 @@ function validDuplicateCodeAreas(value) {
|
|
|
27
22
|
if (areas === undefined || Object.keys(areas).length === 0)
|
|
28
23
|
return false;
|
|
29
24
|
return Object.entries(areas).every(([areaId, candidate]) => {
|
|
30
|
-
const area =
|
|
25
|
+
const area = snapshotExactClosedRecord(candidate, [
|
|
31
26
|
"files",
|
|
32
27
|
"findingPolicy",
|
|
33
28
|
"minimumLines",
|
|
34
29
|
"minimumTokens"
|
|
35
30
|
]);
|
|
36
|
-
return (
|
|
31
|
+
return (isNonEmptyString(areaId) &&
|
|
37
32
|
area !== undefined &&
|
|
38
33
|
validProjectFileSelection(area.files) &&
|
|
39
34
|
validFindingPolicy(area.findingPolicy) &&
|
|
40
|
-
|
|
41
|
-
|
|
35
|
+
isPositiveSafeInteger(area.minimumLines) &&
|
|
36
|
+
isPositiveSafeInteger(area.minimumTokens));
|
|
42
37
|
});
|
|
43
38
|
}
|
|
44
39
|
function validDuplicateDetectionScanner(value) {
|
|
45
|
-
const scanner =
|
|
40
|
+
const scanner = snapshotExactClosedRecord(value, ["command"]);
|
|
46
41
|
return scanner !== undefined && validJscpdCommand(scanner.command);
|
|
47
42
|
}
|
|
48
43
|
function validJscpdCommand(value) {
|
|
@@ -50,11 +45,11 @@ function validJscpdCommand(value) {
|
|
|
50
45
|
if (record?.kind === "package") {
|
|
51
46
|
return Object.keys(record).length === 1;
|
|
52
47
|
}
|
|
53
|
-
const command =
|
|
54
|
-
return command?.kind === "custom" &&
|
|
48
|
+
const command = snapshotExactClosedRecord(value, ["executable", "kind"]);
|
|
49
|
+
return command?.kind === "custom" && isNonEmptyString(command.executable);
|
|
55
50
|
}
|
|
56
51
|
function validDuplicateCache(value) {
|
|
57
|
-
const cache =
|
|
58
|
-
return (cache !== undefined &&
|
|
52
|
+
const cache = snapshotExactClosedRecord(value, ["directory", "enabled"]);
|
|
53
|
+
return (cache !== undefined && isNonEmptyString(cache.directory) && typeof cache.enabled === "boolean");
|
|
59
54
|
}
|
|
60
55
|
//# sourceMappingURL=options-validation.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options-validation.mjs","sourceRoot":"","sources":["../../../../src/package-checks/duplicate-detection/options-validation.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"options-validation.mjs","sourceRoot":"","sources":["../../../../src/package-checks/duplicate-detection/options-validation.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n snapshotClosedRecord,\n snapshotExactClosedRecord\n} from \"../../data-boundary/closed-values.ts\";\nimport { isNonEmptyString, isPositiveSafeInteger } from \"../../data-boundary/value-shapes.ts\";\nimport { validProjectFileSelection } from \"../project-files/configuration.ts\";\nimport { validFindingPolicy } from \"../code-quality-findings/policy.ts\";\nimport { validResolvedFindingWaivers } from \"../code-quality-findings/finding-waiver-authoring.ts\";\nimport { resolveDuplicateDetectionFindingIdentity } from \"./finding-waiver-identity.ts\";\n\nexport function validResolvedDuplicateDetectionOptions(value: object): boolean {\n const options = snapshotExactClosedRecord(value, [\n \"cache\",\n \"codeAreas\",\n \"findingWaivers\",\n \"scanner\"\n ]);\n return (\n options !== undefined &&\n validDuplicateCache(options.cache) &&\n validDuplicateCodeAreas(options.codeAreas) &&\n validResolvedFindingWaivers(options.findingWaivers, resolveDuplicateDetectionFindingIdentity) &&\n validDuplicateDetectionScanner(options.scanner)\n );\n}\n\nfunction validDuplicateCodeAreas(value: unknown): boolean {\n const areas = snapshotClosedRecord(value);\n if (areas === undefined || Object.keys(areas).length === 0) return false;\n return Object.entries(areas).every(([areaId, candidate]) => {\n const area = snapshotExactClosedRecord(candidate, [\n \"files\",\n \"findingPolicy\",\n \"minimumLines\",\n \"minimumTokens\"\n ]);\n return (\n isNonEmptyString(areaId) &&\n area !== undefined &&\n validProjectFileSelection(area.files) &&\n validFindingPolicy(area.findingPolicy) &&\n isPositiveSafeInteger(area.minimumLines) &&\n isPositiveSafeInteger(area.minimumTokens)\n );\n });\n}\n\nfunction validDuplicateDetectionScanner(value: unknown): boolean {\n const scanner = snapshotExactClosedRecord(value, [\"command\"]);\n return scanner !== undefined && validJscpdCommand(scanner.command);\n}\n\nfunction validJscpdCommand(value: unknown): boolean {\n const record = snapshotClosedRecord(value);\n if (record?.kind === \"package\") {\n return Object.keys(record).length === 1;\n }\n const command = snapshotExactClosedRecord(value, [\"executable\", \"kind\"]);\n return command?.kind === \"custom\" && isNonEmptyString(command.executable);\n}\n\nfunction validDuplicateCache(value: unknown): boolean {\n const cache = snapshotExactClosedRecord(value, [\"directory\", \"enabled\"]);\n return (\n cache !== undefined && isNonEmptyString(cache.directory) && typeof cache.enabled === \"boolean\"\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.mjs","sourceRoot":"","sources":["../../../../src/package-checks/duplicate-detection/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\";\n\nexport type DuplicateDetectionScannerCommand =\n /** 使用随 `@zxyycom/vibe-check` 安装的 jscpd。 */\n | Readonly<{ readonly kind: \"package\" }>\n /** 显式授权另一个 jscpd 命令。 */\n | Readonly<{\n /** 项目已授权且直接接受 jscpd CLI 参数的非空命令。 */\n readonly executable: string;\n readonly kind: \"custom\";\n }>;\n\n/** `duplicateDetection` 构造函数可省略的缓存策略。 */\nexport interface DuplicateDetectionCacheOptions {\n /** 省略时为 `.cache/vibe-check`;相对路径以项目根目录解析。 */\n readonly directory?: string;\n /** 省略时启用。 */\n readonly enabled?: boolean;\n}\n\n/** `duplicateDetection` 构造函数可省略的 scanner 策略。 */\nexport interface DuplicateDetectionScannerOptions {\n /** 省略时使用随 `@zxyycom/vibe-check` 安装的 jscpd。 */\n readonly command?: DuplicateDetectionScannerCommand;\n}\n\n/** 重复代码区域可省略并由构造函数补齐的文件策略。 */\nexport type DuplicateDetectionFileOptions = ProjectFileSelectionOptions;\n\n/**
|
|
1
|
+
{"version":3,"file":"options.mjs","sourceRoot":"","sources":["../../../../src/package-checks/duplicate-detection/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\nexport type DuplicateDetectionScannerCommand =\n /** 使用随 `@zxyycom/vibe-check` 安装的 jscpd。 */\n | Readonly<{ readonly kind: \"package\" }>\n /** 显式授权另一个 jscpd 命令。 */\n | Readonly<{\n /** 项目已授权且直接接受 jscpd CLI 参数的非空命令。 */\n readonly executable: string;\n readonly kind: \"custom\";\n }>;\n\n/** `duplicateDetection` 构造函数可省略的缓存策略。 */\nexport interface DuplicateDetectionCacheOptions {\n /** 省略时为 `.cache/vibe-check`;相对路径以项目根目录解析。 */\n readonly directory?: string;\n /** 省略时启用。 */\n readonly enabled?: boolean;\n}\n\n/** `duplicateDetection` 构造函数可省略的 scanner 策略。 */\nexport interface DuplicateDetectionScannerOptions {\n /** 省略时使用随 `@zxyycom/vibe-check` 安装的 jscpd。 */\n readonly command?: DuplicateDetectionScannerCommand;\n}\n\n/** duplicate-detection identity 的 locations 数组中的一段 project-relative range。 */\nexport interface DuplicateDetectionFindingLocation {\n readonly endLine: number;\n readonly path: string;\n readonly startLine: number;\n}\n\n/** duplicate-detection 用于精确识别一条可豁免 finding 的稳定字段。 */\nexport interface DuplicateDetectionFindingIdentity {\n readonly locations: readonly DuplicateDetectionFindingLocation[];\n readonly metric: \"duplicate-tokens\";\n}\n\n/** 一项 duplicate-detection finding 的声明式豁免。 */\nexport type DuplicateDetectionFindingWaiver = FindingWaiver<DuplicateDetectionFindingIdentity>;\n\n/** 重复代码区域可省略并由构造函数补齐的文件策略。 */\nexport type DuplicateDetectionFileOptions = ProjectFileSelectionOptions;\n\n/** 同时拥有文件选择、比较边界、阈值和 finding policy 的重复代码区域。 */\nexport interface DuplicateDetectionCodeAreaOptions {\n /** 显式区域必须声明本字段;其中各子字段可省略并使用 package 默认值。 */\n readonly files: DuplicateDetectionFileOptions;\n /** 省略时继承顶层 `findingPolicy`。 */\n readonly findingPolicy?: FindingPolicy;\n /** 省略时为 `4`。 */\n readonly minimumLines?: number;\n /** 省略时为 `100`。 */\n readonly minimumTokens?: number;\n}\n\n/** `duplicateDetection(options?)` 接受并补齐默认值的公开策略。 */\nexport interface DuplicateDetectionOptions {\n /** 省略时建立默认 `project` 区域;显式映射必须非空。 */\n readonly codeAreas?: Readonly<Record<string, DuplicateDetectionCodeAreaOptions>>;\n readonly cache?: DuplicateDetectionCacheOptions;\n /** 省略时为 `non-blocking`;区域可局部覆盖。 */\n readonly findingPolicy?: FindingPolicy;\n /** 省略时没有豁免;identity 使用 Finding 发布的完整排序 location ranges。 */\n readonly findingWaivers?: readonly DuplicateDetectionFindingWaiver[];\n readonly scanner?: DuplicateDetectionScannerOptions;\n}\n\n/** 构造函数生成并由 Check preflight/execution 消费的完整 options。 */\nexport interface ResolvedDuplicateDetectionOptions {\n readonly cache: Readonly<{ readonly directory: string; readonly enabled: boolean }>;\n readonly codeAreas: Readonly<Record<string, ResolvedDuplicateDetectionCodeAreaOptions>>;\n readonly findingWaivers: readonly DuplicateDetectionFindingWaiver[];\n readonly scanner: ResolvedDuplicateDetectionScannerOptions;\n}\n\nexport interface ResolvedDuplicateDetectionCodeAreaOptions {\n readonly files: ProjectFileSelection;\n readonly findingPolicy: FindingPolicy;\n readonly minimumLines: number;\n readonly minimumTokens: number;\n}\n\nexport interface ResolvedDuplicateDetectionScannerOptions {\n readonly command: DuplicateDetectionScannerCommand;\n}\n"]}
|
|
@@ -1,6 +1,26 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { canonicalJsonBytes } from "../../data-boundary/canonical-data.mjs";
|
|
3
|
+
import { buildHashedFindingWaiverAuditRecord } from "../code-quality-findings/finding-waiver-evidence.mjs";
|
|
3
4
|
import { isBlockingFinding } from "../code-quality-findings/policy.mjs";
|
|
5
|
+
import { compareDuplicateFindingLocations, resolveDuplicateDetectionFindingIdentity } from "./finding-waiver-identity.mjs";
|
|
6
|
+
export function duplicateDetectionFindingIdentity(candidate) {
|
|
7
|
+
return Object.freeze({
|
|
8
|
+
locations: candidate.data.locations,
|
|
9
|
+
metric: candidate.data.metric
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
export function duplicateDetectionWaiverIdentity(waiver) {
|
|
13
|
+
const identity = resolveDuplicateDetectionFindingIdentity(waiver.identity);
|
|
14
|
+
if (identity === undefined) {
|
|
15
|
+
throw new TypeError("duplicateDetection waiver identity must retain sorted valid locations");
|
|
16
|
+
}
|
|
17
|
+
return identity;
|
|
18
|
+
}
|
|
19
|
+
/** 为一项未使用或过宽 waiver 构造 Check-owned audit Record。 */
|
|
20
|
+
export function duplicateDetectionWaiverAuditRecord(audit) {
|
|
21
|
+
const identity = duplicateDetectionWaiverIdentity(audit.waiver);
|
|
22
|
+
return buildHashedFindingWaiverAuditRecord(identity, audit);
|
|
23
|
+
}
|
|
4
24
|
/** Builds Check-owned supplemental facts without adding a Product record catalog. */
|
|
5
25
|
export function buildDuplicateRecordCandidates(fragments, codeAreas) {
|
|
6
26
|
const ids = duplicateIdsInOrder(fragments);
|
|
@@ -51,9 +71,15 @@ export function isValidDuplicateFragment(fragment) {
|
|
|
51
71
|
Array.isArray(fragment.locations) &&
|
|
52
72
|
fragment.locations.length >= 2 &&
|
|
53
73
|
fragment.locations.every(isValidLocation) &&
|
|
74
|
+
locationsAreDistinct(fragment.locations) &&
|
|
54
75
|
Array.isArray(fragment.codeAreas) &&
|
|
55
76
|
fragment.codeAreas.every(nonEmptyString));
|
|
56
77
|
}
|
|
78
|
+
function locationsAreDistinct(locations) {
|
|
79
|
+
return locations.every((location, index) => locations
|
|
80
|
+
.slice(index + 1)
|
|
81
|
+
.every((other) => compareDuplicateFindingLocations(location, other) !== 0));
|
|
82
|
+
}
|
|
57
83
|
function hasValidFragmentMeasurements(fragment) {
|
|
58
84
|
return (nonNegativeSafeInteger(fragment.id) &&
|
|
59
85
|
nonNegativeSafeInteger(fragment.lineCount) &&
|
|
@@ -99,12 +125,7 @@ function duplicateFingerprint(fragment) {
|
|
|
99
125
|
.digest("hex");
|
|
100
126
|
}
|
|
101
127
|
function sortedLocations(locations) {
|
|
102
|
-
return [...locations].sort(
|
|
103
|
-
}
|
|
104
|
-
function locationSortKey(location) {
|
|
105
|
-
const startLine = String(location.startLine).padStart(12, "0");
|
|
106
|
-
const endLine = String(location.endLine).padStart(12, "0");
|
|
107
|
-
return `${location.path}\u0000${startLine}\u0000${endLine}`;
|
|
128
|
+
return [...locations].sort(compareDuplicateFindingLocations);
|
|
108
129
|
}
|
|
109
130
|
function uniqueSorted(values) {
|
|
110
131
|
return [...new Set(values)].sort(compareText);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"records.mjs","sourceRoot":"","sources":["../../../../src/package-checks/duplicate-detection/records.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\n\nimport { canonicalJsonBytes } from \"../../data-boundary/canonical-data.ts\";\nimport { isBlockingFinding, type FindingPolicy } from \"../code-quality-findings/policy.ts\";\nimport type { DuplicateCodeFragment, DuplicateCodeLocation } from \"./measurement-model.ts\";\nimport type { ResolvedDuplicateDetectionOptions } from \"./options.ts\";\n\n/** 一条可信重复片段 supplemental Record 的 data。 */\nexport type DuplicateDetectionRecordData = Readonly<{\n readonly blocking: boolean;\n readonly codeAreas: readonly string[];\n readonly lineCount: number;\n readonly locations: readonly Readonly<{\n readonly endLine: number;\n readonly path: string;\n readonly startLine: number;\n }>[];\n readonly metric: \"duplicate-tokens\";\n readonly tokenCount: number;\n}>;\n\nexport interface DuplicateRecordCandidate {\n readonly data: DuplicateDetectionRecordData;\n readonly id: string;\n}\n\n/** Builds Check-owned supplemental facts without adding a Product record catalog. */\nexport function buildDuplicateRecordCandidates(\n fragments: readonly DuplicateCodeFragment[],\n codeAreas: ResolvedDuplicateDetectionOptions[\"codeAreas\"]\n): readonly DuplicateRecordCandidate[] | undefined {\n const ids = duplicateIdsInOrder(fragments);\n if (ids === undefined) return undefined;\n\n const candidates: DuplicateRecordCandidate[] = [];\n for (const [index, fragment] of fragments.entries()) {\n const candidate = createDuplicateRecordCandidate(fragment, ids[index], codeAreas);\n if (candidate === undefined) return undefined;\n candidates.push(candidate);\n }\n candidates.sort((left, right) => compareText(left.id, right.id));\n return Object.freeze(candidates);\n}\n\nfunction createDuplicateRecordCandidate(\n fragment: DuplicateCodeFragment,\n id: string | undefined,\n configuredAreas: ResolvedDuplicateDetectionOptions[\"codeAreas\"]\n): DuplicateRecordCandidate | undefined {\n if (!isValidDuplicateFragment(fragment) || id === undefined) return undefined;\n\n const locations = sortedLocations(fragment.locations);\n const codeAreas = uniqueSorted(fragment.codeAreas);\n if (codeAreas.length === 0 || !sameStrings(codeAreas, fragment.codeAreas)) return undefined;\n const findingPolicies: FindingPolicy[] = [];\n for (const areaId of codeAreas) {\n const area = configuredAreas[areaId];\n if (area === undefined) return undefined;\n findingPolicies.push(area.findingPolicy);\n }\n\n return Object.freeze({\n id,\n data: Object.freeze({\n blocking: isBlockingFinding(findingPolicies),\n codeAreas: Object.freeze(codeAreas),\n lineCount: fragment.lineCount,\n locations: Object.freeze(\n locations.map((location) =>\n Object.freeze({\n endLine: location.endLine,\n path: location.path,\n startLine: location.startLine\n })\n )\n ),\n metric: \"duplicate-tokens\",\n tokenCount: fragment.tokenCount\n })\n });\n}\n\nexport function isValidDuplicateFragment(fragment: DuplicateCodeFragment): boolean {\n return (\n hasValidFragmentMeasurements(fragment) &&\n Array.isArray(fragment.locations) &&\n fragment.locations.length >= 2 &&\n fragment.locations.every(isValidLocation) &&\n Array.isArray(fragment.codeAreas) &&\n fragment.codeAreas.every(nonEmptyString)\n );\n}\n\nfunction hasValidFragmentMeasurements(fragment: DuplicateCodeFragment): boolean {\n return (\n nonNegativeSafeInteger(fragment.id) &&\n nonNegativeSafeInteger(fragment.lineCount) &&\n nonNegativeSafeInteger(fragment.tokenCount)\n );\n}\n\nfunction nonNegativeSafeInteger(value: number): boolean {\n return Number.isSafeInteger(value) && value >= 0;\n}\n\nfunction isValidLocation(location: DuplicateCodeLocation): boolean {\n const validPath = typeof location.path === \"string\" && location.path.length > 0;\n const validLines =\n Number.isSafeInteger(location.startLine) &&\n location.startLine >= 1 &&\n Number.isSafeInteger(location.endLine) &&\n location.endLine >= location.startLine;\n return validPath && validLines;\n}\n\nfunction nonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n\nfunction sameStrings(left: readonly string[], right: readonly string[]): boolean {\n return left.length === right.length && left.every((value, index) => value === right[index]);\n}\n\nfunction duplicateIdsInOrder(\n fragments: readonly DuplicateCodeFragment[]\n): readonly string[] | undefined {\n const occurrences = new Map<string, number>();\n const ids: string[] = [];\n for (const fragment of fragments) {\n if (!isValidDuplicateFragment(fragment)) return undefined;\n const fingerprint = duplicateFingerprint(fragment);\n const occurrence = (occurrences.get(fingerprint) ?? 0) + 1;\n occurrences.set(fingerprint, occurrence);\n ids.push(`duplicate-fragment/v1/sha256:${fingerprint}/occurrence:${occurrence}`);\n }\n return Object.freeze(ids);\n}\n\nfunction duplicateFingerprint(fragment: DuplicateCodeFragment): string {\n return createHash(\"sha256\")\n .update(\n canonicalJsonBytes({\n lineCount: fragment.lineCount,\n paths: uniqueSorted(fragment.locations.map((location) => location.path)),\n tokenCount: fragment.tokenCount\n })\n )\n .digest(\"hex\");\n}\n\nfunction sortedLocations(locations: readonly DuplicateCodeLocation[]): DuplicateCodeLocation[] {\n return [...locations].sort((left, right) =>\n compareText(locationSortKey(left), locationSortKey(right))\n );\n}\n\nfunction locationSortKey(location: DuplicateCodeLocation): string {\n const startLine = String(location.startLine).padStart(12, \"0\");\n const endLine = String(location.endLine).padStart(12, \"0\");\n return `${location.path}\\u0000${startLine}\\u0000${endLine}`;\n}\n\nfunction uniqueSorted(values: readonly string[]): string[] {\n return [...new Set(values)].sort(compareText);\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"]}
|
|
1
|
+
{"version":3,"file":"records.mjs","sourceRoot":"","sources":["../../../../src/package-checks/duplicate-detection/records.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\n\nimport { canonicalJsonBytes } from \"../../data-boundary/canonical-data.ts\";\nimport type { MaterializedFindingWaiver } from \"../../finding-waivers/reconciliation.ts\";\nimport {\n buildHashedFindingWaiverAuditRecord,\n type FindingWaiverAuditRecordData,\n type FindingWaiverRecordAudit\n} from \"../code-quality-findings/finding-waiver-evidence.ts\";\nimport { isBlockingFinding, type FindingPolicy } from \"../code-quality-findings/policy.ts\";\nimport {\n compareDuplicateFindingLocations,\n resolveDuplicateDetectionFindingIdentity\n} from \"./finding-waiver-identity.ts\";\nimport type { DuplicateCodeFragment, DuplicateCodeLocation } from \"./measurement-model.ts\";\nimport type {\n DuplicateDetectionFindingIdentity,\n ResolvedDuplicateDetectionOptions\n} from \"./options.ts\";\n\n/** 一条可信重复片段 supplemental Record 的 data。 */\nexport type DuplicateDetectionFindingRecordData = Readonly<{\n readonly blocking: boolean;\n readonly codeAreas: readonly string[];\n readonly lineCount: number;\n readonly locations: readonly Readonly<{\n readonly endLine: number;\n readonly path: string;\n readonly startLine: number;\n }>[];\n readonly metric: \"duplicate-tokens\";\n readonly tokenCount: number;\n /** 精确匹配 waiver 时保留理由,并令该 finding 不再参与 actionable settlement。 */\n readonly waiver?: Readonly<{ readonly reason: string }>;\n}>;\n\n/** 未使用或过宽 duplicate-detection waiver 的 supplemental audit Record data。 */\nexport type DuplicateDetectionFindingWaiverAuditRecordData =\n FindingWaiverAuditRecordData<DuplicateDetectionFindingIdentity>;\n\n/** duplicateDetection 发布的 normal finding 或 waiver-audit Record data。 */\nexport type DuplicateDetectionRecordData =\n | DuplicateDetectionFindingRecordData\n | DuplicateDetectionFindingWaiverAuditRecordData;\n\nexport interface DuplicateRecordCandidate {\n readonly data: DuplicateDetectionFindingRecordData;\n readonly id: string;\n}\n\nexport function duplicateDetectionFindingIdentity(\n candidate: DuplicateRecordCandidate\n): DuplicateDetectionFindingIdentity {\n return Object.freeze({\n locations: candidate.data.locations,\n metric: candidate.data.metric\n });\n}\n\nexport function duplicateDetectionWaiverIdentity(\n waiver: MaterializedFindingWaiver\n): DuplicateDetectionFindingIdentity {\n const identity = resolveDuplicateDetectionFindingIdentity(waiver.identity);\n if (identity === undefined) {\n throw new TypeError(\"duplicateDetection waiver identity must retain sorted valid locations\");\n }\n return identity;\n}\n\n/** 为一项未使用或过宽 waiver 构造 Check-owned audit Record。 */\nexport function duplicateDetectionWaiverAuditRecord(audit: FindingWaiverRecordAudit): Readonly<{\n readonly data: DuplicateDetectionFindingWaiverAuditRecordData;\n readonly id: string;\n}> {\n const identity = duplicateDetectionWaiverIdentity(audit.waiver);\n return buildHashedFindingWaiverAuditRecord(identity, audit);\n}\n\n/** Builds Check-owned supplemental facts without adding a Product record catalog. */\nexport function buildDuplicateRecordCandidates(\n fragments: readonly DuplicateCodeFragment[],\n codeAreas: ResolvedDuplicateDetectionOptions[\"codeAreas\"]\n): readonly DuplicateRecordCandidate[] | undefined {\n const ids = duplicateIdsInOrder(fragments);\n if (ids === undefined) return undefined;\n\n const candidates: DuplicateRecordCandidate[] = [];\n for (const [index, fragment] of fragments.entries()) {\n const candidate = createDuplicateRecordCandidate(fragment, ids[index], codeAreas);\n if (candidate === undefined) return undefined;\n candidates.push(candidate);\n }\n candidates.sort((left, right) => compareText(left.id, right.id));\n return Object.freeze(candidates);\n}\n\nfunction createDuplicateRecordCandidate(\n fragment: DuplicateCodeFragment,\n id: string | undefined,\n configuredAreas: ResolvedDuplicateDetectionOptions[\"codeAreas\"]\n): DuplicateRecordCandidate | undefined {\n if (!isValidDuplicateFragment(fragment) || id === undefined) return undefined;\n\n const locations = sortedLocations(fragment.locations);\n const codeAreas = uniqueSorted(fragment.codeAreas);\n if (codeAreas.length === 0 || !sameStrings(codeAreas, fragment.codeAreas)) return undefined;\n const findingPolicies: FindingPolicy[] = [];\n for (const areaId of codeAreas) {\n const area = configuredAreas[areaId];\n if (area === undefined) return undefined;\n findingPolicies.push(area.findingPolicy);\n }\n\n return Object.freeze({\n id,\n data: Object.freeze({\n blocking: isBlockingFinding(findingPolicies),\n codeAreas: Object.freeze(codeAreas),\n lineCount: fragment.lineCount,\n locations: Object.freeze(\n locations.map((location) =>\n Object.freeze({\n endLine: location.endLine,\n path: location.path,\n startLine: location.startLine\n })\n )\n ),\n metric: \"duplicate-tokens\",\n tokenCount: fragment.tokenCount\n })\n });\n}\n\nexport function isValidDuplicateFragment(fragment: DuplicateCodeFragment): boolean {\n return (\n hasValidFragmentMeasurements(fragment) &&\n Array.isArray(fragment.locations) &&\n fragment.locations.length >= 2 &&\n fragment.locations.every(isValidLocation) &&\n locationsAreDistinct(fragment.locations) &&\n Array.isArray(fragment.codeAreas) &&\n fragment.codeAreas.every(nonEmptyString)\n );\n}\n\nfunction locationsAreDistinct(locations: readonly DuplicateCodeLocation[]): boolean {\n return locations.every((location, index) =>\n locations\n .slice(index + 1)\n .every((other) => compareDuplicateFindingLocations(location, other) !== 0)\n );\n}\n\nfunction hasValidFragmentMeasurements(fragment: DuplicateCodeFragment): boolean {\n return (\n nonNegativeSafeInteger(fragment.id) &&\n nonNegativeSafeInteger(fragment.lineCount) &&\n nonNegativeSafeInteger(fragment.tokenCount)\n );\n}\n\nfunction nonNegativeSafeInteger(value: number): boolean {\n return Number.isSafeInteger(value) && value >= 0;\n}\n\nfunction isValidLocation(location: DuplicateCodeLocation): boolean {\n const validPath = typeof location.path === \"string\" && location.path.length > 0;\n const validLines =\n Number.isSafeInteger(location.startLine) &&\n location.startLine >= 1 &&\n Number.isSafeInteger(location.endLine) &&\n location.endLine >= location.startLine;\n return validPath && validLines;\n}\n\nfunction nonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n\nfunction sameStrings(left: readonly string[], right: readonly string[]): boolean {\n return left.length === right.length && left.every((value, index) => value === right[index]);\n}\n\nfunction duplicateIdsInOrder(\n fragments: readonly DuplicateCodeFragment[]\n): readonly string[] | undefined {\n const occurrences = new Map<string, number>();\n const ids: string[] = [];\n for (const fragment of fragments) {\n if (!isValidDuplicateFragment(fragment)) return undefined;\n const fingerprint = duplicateFingerprint(fragment);\n const occurrence = (occurrences.get(fingerprint) ?? 0) + 1;\n occurrences.set(fingerprint, occurrence);\n ids.push(`duplicate-fragment/v1/sha256:${fingerprint}/occurrence:${occurrence}`);\n }\n return Object.freeze(ids);\n}\n\nfunction duplicateFingerprint(fragment: DuplicateCodeFragment): string {\n return createHash(\"sha256\")\n .update(\n canonicalJsonBytes({\n lineCount: fragment.lineCount,\n paths: uniqueSorted(fragment.locations.map((location) => location.path)),\n tokenCount: fragment.tokenCount\n })\n )\n .digest(\"hex\");\n}\n\nfunction sortedLocations(locations: readonly DuplicateCodeLocation[]): DuplicateCodeLocation[] {\n return [...locations].sort(compareDuplicateFindingLocations);\n}\n\nfunction uniqueSorted(values: readonly string[]): string[] {\n return [...new Set(values)].sort(compareText);\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"]}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { reconcileFindingWaivers } from "../../finding-waivers/reconciliation.mjs";
|
|
2
2
|
import { collectProjectFileSets, requireProjectFileSet } from "../project-files/collection.mjs";
|
|
3
3
|
import { settleFindings } from "../code-quality-findings/policy.mjs";
|
|
4
|
+
import { reportFindingWaiverAudits, reportReconciledCodeQualityFindingRecords } from "../code-quality-findings/finding-waiver-evidence.mjs";
|
|
5
|
+
import { appendCheckMessages } from "../../check/finding-presentation.mjs";
|
|
6
|
+
import { fileMetricFindingMessages } from "./finding-messages.mjs";
|
|
4
7
|
import { measureFileMetrics } from "./measurement.mjs";
|
|
5
8
|
import { isValidResolvedFileMetricsOptions } from "./options-validation.mjs";
|
|
6
9
|
import { buildFileRecordCandidates, fileMetricsWaiverAuditRecord, fileMetricsWaiverIdentity } from "./records.mjs";
|
|
@@ -32,22 +35,16 @@ export async function executeFileMetrics(context) {
|
|
|
32
35
|
if (candidates === undefined)
|
|
33
36
|
return unavailable("external-result-invalid");
|
|
34
37
|
const reconciliation = reconcileFileMetricWaivers(candidates, context.options.findingWaivers);
|
|
35
|
-
|
|
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
|
-
}
|
|
38
|
+
reportReconciledCodeQualityFindingRecords(context, reconciliation);
|
|
45
39
|
reportWaiverAuditRecords(context, reconciliation);
|
|
46
40
|
const settlement = settleFindings(reconciliation.findings.map(({ disposition, finding }) => ({
|
|
47
41
|
actionable: disposition !== "waived",
|
|
48
42
|
blocking: finding.data.blocking
|
|
49
43
|
})));
|
|
50
|
-
|
|
44
|
+
const actionableFindings = reconciliation.findings
|
|
45
|
+
.filter(({ disposition }) => disposition !== "waived")
|
|
46
|
+
.map(({ finding }) => finding);
|
|
47
|
+
return appendWaiverMessages(appendCheckMessages(settlement, fileMetricFindingMessages(actionableFindings)), reconciliation);
|
|
51
48
|
}
|
|
52
49
|
function noEligibleInputResult(context) {
|
|
53
50
|
const reconciliation = reconcileFileMetricWaivers([], context.options.findingWaivers);
|
|
@@ -62,11 +59,7 @@ function reconcileFileMetricWaivers(candidates, waivers) {
|
|
|
62
59
|
});
|
|
63
60
|
}
|
|
64
61
|
function reportWaiverAuditRecords(context, reconciliation) {
|
|
65
|
-
|
|
66
|
-
const record = fileMetricsWaiverAuditRecord(audit);
|
|
67
|
-
if (record !== undefined)
|
|
68
|
-
context.records.report({ id: record.id }, record.data);
|
|
69
|
-
}
|
|
62
|
+
reportFindingWaiverAudits(context, reconciliation, fileMetricsWaiverAuditRecord);
|
|
70
63
|
}
|
|
71
64
|
function appendWaiverMessages(settlement, reconciliation) {
|
|
72
65
|
const waiverMessages = [];
|
|
@@ -153,7 +146,7 @@ function unavailableMessage(code) {
|
|
|
153
146
|
case "source-unavailable":
|
|
154
147
|
return "File metrics could not collect its configured project files; check the project root, file permissions, and selected file source.";
|
|
155
148
|
case "external-dependency-unavailable":
|
|
156
|
-
return "The configured SCC command is unavailable or incompatible; install SCC
|
|
149
|
+
return "The configured SCC command is unavailable or incompatible; install SCC 4.0.0 or configure a compatible executable.";
|
|
157
150
|
case "external-execution-failed":
|
|
158
151
|
return "SCC did not complete successfully; run the configured command directly and inspect its environment.";
|
|
159
152
|
case "external-result-invalid":
|
|
@@ -1 +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"]}
|
|
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 {\n reportFindingWaiverAudits,\n reportReconciledCodeQualityFindingRecords\n} from \"../code-quality-findings/finding-waiver-evidence.ts\";\nimport { appendCheckMessages } from \"../../check/finding-presentation.ts\";\nimport { fileMetricFindingMessages } from \"./finding-messages.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 reportReconciledCodeQualityFindingRecords(context, reconciliation);\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 const actionableFindings = reconciliation.findings\n .filter(({ disposition }) => disposition !== \"waived\")\n .map(({ finding }) => finding);\n return appendWaiverMessages(\n appendCheckMessages(settlement, fileMetricFindingMessages(actionableFindings)),\n reconciliation\n );\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 reportFindingWaiverAudits(context, reconciliation, fileMetricsWaiverAuditRecord);\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 4.0.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,22 @@
|
|
|
1
|
+
import { presentCheckFindings } from "../../check/finding-presentation.mjs";
|
|
2
|
+
const PRESENTED_FINDING_LIMIT = 10;
|
|
3
|
+
/** Projects actionable file-metric Records into bounded terminal summaries. */
|
|
4
|
+
export function fileMetricFindingMessages(findings) {
|
|
5
|
+
return presentCheckFindings({
|
|
6
|
+
findings,
|
|
7
|
+
limit: PRESENTED_FINDING_LIMIT,
|
|
8
|
+
message: ({ data }) => Object.freeze({
|
|
9
|
+
code: "finding-detail",
|
|
10
|
+
level: data.blocking ? "error" : "warning",
|
|
11
|
+
message: `${data.path}: ${data.codeLines} code lines exceeds the ${data.limit} line limit (areas: ${data.codeAreas.join(", ")}).`
|
|
12
|
+
}),
|
|
13
|
+
omittedMessage: ({ omittedCount, omittedFindings }) => Object.freeze({
|
|
14
|
+
code: "findings-omitted",
|
|
15
|
+
level: omittedFindings.some(({ data }) => data.blocking)
|
|
16
|
+
? "error"
|
|
17
|
+
: "warning",
|
|
18
|
+
message: `${omittedCount} additional file metric finding(s) were not shown; inspect this Check's Records for the complete set.`
|
|
19
|
+
})
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=finding-messages.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-messages.mjs","sourceRoot":"","sources":["../../../../src/package-checks/file-metrics/finding-messages.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAG3E,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAEnC,+EAA+E;AAC/E,MAAM,UAAU,yBAAyB,CACvC,QAAwC;IAExC,OAAO,oBAAoB,CAAC;QAC1B,QAAQ;QACR,KAAK,EAAE,uBAAuB;QAC9B,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CACpB,MAAM,CAAC,MAAM,CAAC;YACZ,IAAI,EAAE,gBAAgB;YACtB,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAE,OAAiB,CAAC,CAAC,CAAE,SAAmB;YAChE,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,2BAA2B,IAAI,CAAC,KAAK,uBAAuB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;SAClI,CAAC;QACJ,cAAc,EAAE,CAAC,EAAE,YAAY,EAAE,eAAe,EAAE,EAAE,EAAE,CACpD,MAAM,CAAC,MAAM,CAAC;YACZ,IAAI,EAAE,kBAAkB;YACxB,KAAK,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;gBACtD,CAAC,CAAE,OAAiB;gBACpB,CAAC,CAAE,SAAmB;YACxB,OAAO,EAAE,GAAG,YAAY,uGAAuG;SAChI,CAAC;KACL,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { CheckMessage } from \"../../check/check.ts\";\nimport { presentCheckFindings } from \"../../check/finding-presentation.ts\";\nimport type { FileRecordCandidate } from \"./records.ts\";\n\nconst PRESENTED_FINDING_LIMIT = 10;\n\n/** Projects actionable file-metric Records into bounded terminal summaries. */\nexport function fileMetricFindingMessages(\n findings: readonly FileRecordCandidate[]\n): readonly CheckMessage[] {\n return presentCheckFindings({\n findings,\n limit: PRESENTED_FINDING_LIMIT,\n message: ({ data }) =>\n Object.freeze({\n code: \"finding-detail\",\n level: data.blocking ? (\"error\" as const) : (\"warning\" as const),\n message: `${data.path}: ${data.codeLines} code lines exceeds the ${data.limit} line limit (areas: ${data.codeAreas.join(\", \")}).`\n }),\n omittedMessage: ({ omittedCount, omittedFindings }) =>\n Object.freeze({\n code: \"findings-omitted\",\n level: omittedFindings.some(({ data }) => data.blocking)\n ? (\"error\" as const)\n : (\"warning\" as const),\n message: `${omittedCount} additional file metric finding(s) were not shown; inspect this Check's Records for the complete set.`\n })\n });\n}\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { snapshotClosedArray, snapshotClosedPolicyRecord } from "../../data-boundary/closed-values.mjs";
|
|
2
|
+
import { isNonEmptyString, isNonNegativeSafeInteger, isPositiveSafeInteger } from "../../data-boundary/value-shapes.mjs";
|
|
2
3
|
import { resolveProjectFileSelection, snapshotDefaultProjectFileSelection } from "../project-files/configuration.mjs";
|
|
3
|
-
import { DEFAULT_FINDING_POLICY, resolveFindingPolicy } from "../code-quality-findings/policy.mjs";
|
|
4
|
+
import { DEFAULT_FINDING_POLICY, resolveCodeAreaPolicyMap, resolveFindingPolicy } from "../code-quality-findings/policy.mjs";
|
|
4
5
|
import { isNormalizedProjectRelativePath } from "../host-environment/path.mjs";
|
|
5
6
|
import { isValidResolvedFileMetricsOptions } from "./options-validation.mjs";
|
|
6
7
|
const DEFAULT_EXECUTABLE = "scc";
|
|
@@ -9,7 +10,7 @@ const DEFAULT_ALLOWANCE_MAXIMUM_CODE_LINES = 600;
|
|
|
9
10
|
const DEFAULT_ALLOWANCE_MAXIMUM_DECISION_TOKENS = 12;
|
|
10
11
|
/** 校验 constructor input,并将所有可省略 policy 物化为完整、冻结的 Check options。 */
|
|
11
12
|
export function resolveFileMetricsOptions(authoredOptions) {
|
|
12
|
-
const input =
|
|
13
|
+
const input = snapshotClosedPolicyRecord(authoredOptions, {
|
|
13
14
|
optional: ["codeAreas", "findingPolicy", "findingWaivers", "scanner"]
|
|
14
15
|
});
|
|
15
16
|
if (input === undefined)
|
|
@@ -46,14 +47,14 @@ function resolveFindingWaivers(value) {
|
|
|
46
47
|
return Object.freeze(waivers);
|
|
47
48
|
}
|
|
48
49
|
function resolveFindingWaiver(value) {
|
|
49
|
-
const waiver =
|
|
50
|
+
const waiver = snapshotClosedPolicyRecord(value, { required: ["identity", "reason"] });
|
|
50
51
|
if (waiver === undefined || !isNonEmptyString(waiver.reason))
|
|
51
52
|
return undefined;
|
|
52
53
|
const identity = resolveFindingIdentity(waiver.identity);
|
|
53
54
|
return identity === undefined ? undefined : Object.freeze({ identity, reason: waiver.reason });
|
|
54
55
|
}
|
|
55
56
|
function resolveFindingIdentity(value) {
|
|
56
|
-
const identity =
|
|
57
|
+
const identity = snapshotClosedPolicyRecord(value, { required: ["metric", "path"] });
|
|
57
58
|
return identity === undefined ||
|
|
58
59
|
identity.metric !== "code-lines" ||
|
|
59
60
|
!isNormalizedProjectRelativePath(identity.path)
|
|
@@ -61,21 +62,7 @@ function resolveFindingIdentity(value) {
|
|
|
61
62
|
: Object.freeze({ metric: "code-lines", path: identity.path });
|
|
62
63
|
}
|
|
63
64
|
function resolveCodeAreas(value, defaultFindingPolicy) {
|
|
64
|
-
|
|
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));
|
|
65
|
+
return resolveCodeAreaPolicyMap(value, () => defaultCodeArea(defaultFindingPolicy), (candidate) => resolveCodeArea(candidate, defaultFindingPolicy));
|
|
79
66
|
}
|
|
80
67
|
function defaultCodeArea(findingPolicy) {
|
|
81
68
|
return Object.freeze({
|
|
@@ -85,7 +72,7 @@ function defaultCodeArea(findingPolicy) {
|
|
|
85
72
|
});
|
|
86
73
|
}
|
|
87
74
|
function resolveCodeArea(value, defaultFindingPolicy) {
|
|
88
|
-
const area =
|
|
75
|
+
const area = snapshotClosedPolicyRecord(value, {
|
|
89
76
|
optional: ["codeLines", "findingPolicy"],
|
|
90
77
|
required: ["files"]
|
|
91
78
|
});
|
|
@@ -101,7 +88,7 @@ function resolveCodeArea(value, defaultFindingPolicy) {
|
|
|
101
88
|
function resolveCodeLines(value) {
|
|
102
89
|
if (value === undefined)
|
|
103
90
|
return defaultCodeLines();
|
|
104
|
-
const codeLines =
|
|
91
|
+
const codeLines = snapshotClosedPolicyRecord(value, {
|
|
105
92
|
optional: ["lowDecisionTokenAllowance", "maximum"]
|
|
106
93
|
});
|
|
107
94
|
if (codeLines === undefined)
|
|
@@ -127,7 +114,7 @@ function defaultCodeLines() {
|
|
|
127
114
|
function resolveAllowance(value) {
|
|
128
115
|
if (value === undefined)
|
|
129
116
|
return defaultCodeLines().lowDecisionTokenAllowance;
|
|
130
|
-
const allowance =
|
|
117
|
+
const allowance = snapshotClosedPolicyRecord(value, {
|
|
131
118
|
optional: ["maximumCodeLines", "maximumDecisionTokens"]
|
|
132
119
|
});
|
|
133
120
|
if (allowance === undefined)
|
|
@@ -143,29 +130,10 @@ function resolveAllowance(value) {
|
|
|
143
130
|
function resolveScanner(value) {
|
|
144
131
|
if (value === undefined)
|
|
145
132
|
return Object.freeze({ executable: DEFAULT_EXECUTABLE });
|
|
146
|
-
const scanner =
|
|
133
|
+
const scanner = snapshotClosedPolicyRecord(value, { optional: ["executable"] });
|
|
147
134
|
if (scanner === undefined)
|
|
148
135
|
return undefined;
|
|
149
136
|
const executable = scanner.executable ?? DEFAULT_EXECUTABLE;
|
|
150
137
|
return isNonEmptyString(executable) ? Object.freeze({ executable }) : undefined;
|
|
151
138
|
}
|
|
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
139
|
//# sourceMappingURL=options-resolution.mjs.map
|
|
@@ -1 +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"]}
|
|
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 snapshotClosedArray,\n snapshotClosedPolicyRecord\n} from \"../../data-boundary/closed-values.ts\";\nimport {\n isNonEmptyString,\n isNonNegativeSafeInteger,\n isPositiveSafeInteger\n} from \"../../data-boundary/value-shapes.ts\";\nimport {\n resolveProjectFileSelection,\n snapshotDefaultProjectFileSelection\n} from \"../project-files/configuration.ts\";\nimport {\n DEFAULT_FINDING_POLICY,\n resolveCodeAreaPolicyMap,\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\n/** 校验 constructor input,并将所有可省略 policy 物化为完整、冻结的 Check options。 */\nexport function resolveFileMetricsOptions(\n authoredOptions: unknown\n): ResolvedFileMetricsOptions | undefined {\n const input = snapshotClosedPolicyRecord(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 = snapshotClosedPolicyRecord(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 = snapshotClosedPolicyRecord(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 return resolveCodeAreaPolicyMap(\n value,\n () => defaultCodeArea(defaultFindingPolicy),\n (candidate) => resolveCodeArea(candidate, defaultFindingPolicy)\n );\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 = snapshotClosedPolicyRecord(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 = snapshotClosedPolicyRecord(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 = snapshotClosedPolicyRecord(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 = snapshotClosedPolicyRecord(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"]}
|