@zxyycom/vibe-check 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +154 -0
- package/dist/esm/check/check.mjs +5 -0
- package/dist/esm/check/check.mjs.map +1 -0
- package/dist/esm/check/descriptor-validation.mjs +37 -0
- package/dist/esm/check/descriptor-validation.mjs.map +1 -0
- package/dist/esm/check/descriptor.mjs +2 -0
- package/dist/esm/check/descriptor.mjs.map +1 -0
- package/dist/esm/check/inherited-collection.mjs +62 -0
- package/dist/esm/check/inherited-collection.mjs.map +1 -0
- package/dist/esm/check/options-snapshot.mjs +75 -0
- package/dist/esm/check/options-snapshot.mjs.map +1 -0
- package/dist/esm/check-settlement/fact-validation.mjs +216 -0
- package/dist/esm/check-settlement/fact-validation.mjs.map +1 -0
- package/dist/esm/check-settlement/facts.mjs +2 -0
- package/dist/esm/check-settlement/facts.mjs.map +1 -0
- package/dist/esm/check-settlement/outcome-normalization.mjs +80 -0
- package/dist/esm/check-settlement/outcome-normalization.mjs.map +1 -0
- package/dist/esm/check-settlement/record-store.mjs +59 -0
- package/dist/esm/check-settlement/record-store.mjs.map +1 -0
- package/dist/esm/check-settlement/session.mjs +179 -0
- package/dist/esm/check-settlement/session.mjs.map +1 -0
- package/dist/esm/data-boundary/canonical-data.mjs +159 -0
- package/dist/esm/data-boundary/canonical-data.mjs.map +1 -0
- package/dist/esm/data-boundary/canonical-json.mjs +2 -0
- package/dist/esm/data-boundary/canonical-json.mjs.map +1 -0
- package/dist/esm/data-boundary/closed-values.mjs +98 -0
- package/dist/esm/data-boundary/closed-values.mjs.map +1 -0
- package/dist/esm/data-boundary/value-shapes.mjs +13 -0
- package/dist/esm/data-boundary/value-shapes.mjs.map +1 -0
- package/dist/esm/finding-waivers/reconciliation.mjs +84 -0
- package/dist/esm/finding-waivers/reconciliation.mjs.map +1 -0
- package/dist/esm/index.mjs +26 -0
- package/dist/esm/index.mjs.map +1 -0
- package/dist/esm/machine-output/v4/atomic-publication.mjs +102 -0
- package/dist/esm/machine-output/v4/atomic-publication.mjs.map +1 -0
- package/dist/esm/machine-output/v4/freeze-publication-value.mjs +14 -0
- package/dist/esm/machine-output/v4/freeze-publication-value.mjs.map +1 -0
- package/dist/esm/machine-output/v4/projection.mjs +23 -0
- package/dist/esm/machine-output/v4/projection.mjs.map +1 -0
- package/dist/esm/machine-output/v4/publication-invariants.mjs +59 -0
- package/dist/esm/machine-output/v4/publication-invariants.mjs.map +1 -0
- package/dist/esm/machine-output/v4/publication-model.mjs +19 -0
- package/dist/esm/machine-output/v4/publication-model.mjs.map +1 -0
- package/dist/esm/machine-output/v4/publish.mjs +20 -0
- package/dist/esm/machine-output/v4/publish.mjs.map +1 -0
- package/dist/esm/machine-output/v4/records-fingerprint.mjs +9 -0
- package/dist/esm/machine-output/v4/records-fingerprint.mjs.map +1 -0
- package/dist/esm/machine-output/v4/schema-identities.mjs +8 -0
- package/dist/esm/machine-output/v4/schema-identities.mjs.map +1 -0
- package/dist/esm/machine-output/v4/schema.mjs +50 -0
- package/dist/esm/machine-output/v4/schema.mjs.map +1 -0
- package/dist/esm/machine-output/v4/serializers.mjs +9 -0
- package/dist/esm/machine-output/v4/serializers.mjs.map +1 -0
- package/dist/esm/machine-output/v4/validation-result.mjs +16 -0
- package/dist/esm/machine-output/v4/validation-result.mjs.map +1 -0
- package/dist/esm/machine-output/v4/validation.mjs +131 -0
- package/dist/esm/machine-output/v4/validation.mjs.map +1 -0
- package/dist/esm/package-checks/code-quality-findings/policy.mjs +49 -0
- package/dist/esm/package-checks/code-quality-findings/policy.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/area-policy.mjs +71 -0
- package/dist/esm/package-checks/duplicate-detection/area-policy.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/cache/cache-contract.mjs +2 -0
- package/dist/esm/package-checks/duplicate-detection/cache/cache-contract.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/cache/identity.mjs +37 -0
- package/dist/esm/package-checks/duplicate-detection/cache/identity.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/cache/key.mjs +38 -0
- package/dist/esm/package-checks/duplicate-detection/cache/key.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/cache/payload.mjs +47 -0
- package/dist/esm/package-checks/duplicate-detection/cache/payload.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/cache/store.mjs +44 -0
- package/dist/esm/package-checks/duplicate-detection/cache/store.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/default-check.mjs +39 -0
- package/dist/esm/package-checks/duplicate-detection/default-check.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/execution.mjs +124 -0
- package/dist/esm/package-checks/duplicate-detection/execution.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/final-data.mjs +6 -0
- package/dist/esm/package-checks/duplicate-detection/final-data.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs +77 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/command-path.mjs +6 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/command-path.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/command-resolution.mjs +87 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/command-resolution.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/json-report.mjs +94 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/json-report.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/scanner-contract.mjs +2 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/scanner-contract.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/scanner.mjs +180 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/scanner.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/scoped-fragments.mjs +10 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/scoped-fragments.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/measurement-model.mjs +2 -0
- package/dist/esm/package-checks/duplicate-detection/measurement-model.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/measurement.mjs +151 -0
- package/dist/esm/package-checks/duplicate-detection/measurement.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/options-resolution.mjs +126 -0
- package/dist/esm/package-checks/duplicate-detection/options-resolution.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/options-validation.mjs +60 -0
- package/dist/esm/package-checks/duplicate-detection/options-validation.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/options.mjs +2 -0
- package/dist/esm/package-checks/duplicate-detection/options.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/project-revision.mjs +5 -0
- package/dist/esm/package-checks/duplicate-detection/project-revision.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/records.mjs +119 -0
- package/dist/esm/package-checks/duplicate-detection/records.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/constructor.mjs +39 -0
- package/dist/esm/package-checks/file-metrics/constructor.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/execution.mjs +170 -0
- package/dist/esm/package-checks/file-metrics/execution.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/final-data.mjs +6 -0
- package/dist/esm/package-checks/file-metrics/final-data.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/measurement-model.mjs +2 -0
- package/dist/esm/package-checks/file-metrics/measurement-model.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/measurement.mjs +33 -0
- package/dist/esm/package-checks/file-metrics/measurement.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/options-resolution.mjs +171 -0
- package/dist/esm/package-checks/file-metrics/options-resolution.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/options-validation.mjs +82 -0
- package/dist/esm/package-checks/file-metrics/options-validation.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/options.mjs +2 -0
- package/dist/esm/package-checks/file-metrics/options.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/records.mjs +109 -0
- package/dist/esm/package-checks/file-metrics/records.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/scc/availability.mjs +59 -0
- package/dist/esm/package-checks/file-metrics/scc/availability.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/scc/csv.mjs +17 -0
- package/dist/esm/package-checks/file-metrics/scc/csv.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/scc/parser.mjs +145 -0
- package/dist/esm/package-checks/file-metrics/scc/parser.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/scc/scanner.mjs +54 -0
- package/dist/esm/package-checks/file-metrics/scc/scanner.mjs.map +1 -0
- package/dist/esm/package-checks/final-data-parsing.mjs +35 -0
- package/dist/esm/package-checks/final-data-parsing.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analysis.mjs +96 -0
- package/dist/esm/package-checks/function-metrics/analysis.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/constructor.mjs +43 -0
- package/dist/esm/package-checks/function-metrics/constructor.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/execution.mjs +178 -0
- package/dist/esm/package-checks/function-metrics/execution.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/final-data.mjs +6 -0
- package/dist/esm/package-checks/function-metrics/final-data.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/lizard/availability.mjs +64 -0
- package/dist/esm/package-checks/function-metrics/lizard/availability.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/lizard/csv.mjs +17 -0
- package/dist/esm/package-checks/function-metrics/lizard/csv.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/lizard/parser.mjs +138 -0
- package/dist/esm/package-checks/function-metrics/lizard/parser.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/lizard/scanner.mjs +35 -0
- package/dist/esm/package-checks/function-metrics/lizard/scanner.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/measurement-model.mjs +2 -0
- package/dist/esm/package-checks/function-metrics/measurement-model.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/measurement.mjs +35 -0
- package/dist/esm/package-checks/function-metrics/measurement.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/options-resolution.mjs +171 -0
- package/dist/esm/package-checks/function-metrics/options-resolution.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/options-validation.mjs +71 -0
- package/dist/esm/package-checks/function-metrics/options-validation.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/options.mjs +2 -0
- package/dist/esm/package-checks/function-metrics/options.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/records.mjs +133 -0
- package/dist/esm/package-checks/function-metrics/records.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/target-files.mjs +75 -0
- package/dist/esm/package-checks/function-metrics/target-files.mjs.map +1 -0
- package/dist/esm/package-checks/host-environment/error-message.mjs +4 -0
- package/dist/esm/package-checks/host-environment/error-message.mjs.map +1 -0
- package/dist/esm/package-checks/host-environment/filesystem.mjs +81 -0
- package/dist/esm/package-checks/host-environment/filesystem.mjs.map +1 -0
- package/dist/esm/package-checks/host-environment/git.mjs +51 -0
- package/dist/esm/package-checks/host-environment/git.mjs.map +1 -0
- package/dist/esm/package-checks/host-environment/path.mjs +18 -0
- package/dist/esm/package-checks/host-environment/path.mjs.map +1 -0
- package/dist/esm/package-checks/host-environment/process/command.mjs +13 -0
- package/dist/esm/package-checks/host-environment/process/command.mjs.map +1 -0
- package/dist/esm/package-checks/host-environment/process/contract.mjs +2 -0
- package/dist/esm/package-checks/host-environment/process/contract.mjs.map +1 -0
- package/dist/esm/package-checks/host-environment/process/env.mjs +19 -0
- package/dist/esm/package-checks/host-environment/process/env.mjs.map +1 -0
- package/dist/esm/package-checks/host-environment/process/failure.mjs +34 -0
- package/dist/esm/package-checks/host-environment/process/failure.mjs.map +1 -0
- package/dist/esm/package-checks/host-environment/process/result.mjs +33 -0
- package/dist/esm/package-checks/host-environment/process/result.mjs.map +1 -0
- package/dist/esm/package-checks/host-environment/process/runner.mjs +30 -0
- package/dist/esm/package-checks/host-environment/process/runner.mjs.map +1 -0
- package/dist/esm/package-checks/json-document/strict-document.mjs +163 -0
- package/dist/esm/package-checks/json-document/strict-document.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/default-check.mjs +39 -0
- package/dist/esm/package-checks/json-schema-validation/default-check.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/execution-stages.mjs +141 -0
- package/dist/esm/package-checks/json-schema-validation/execution-stages.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/final-data.mjs +64 -0
- package/dist/esm/package-checks/json-schema-validation/final-data.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/issue-collector.mjs +35 -0
- package/dist/esm/package-checks/json-schema-validation/issue-collector.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/json-schema-validation.mjs +118 -0
- package/dist/esm/package-checks/json-schema-validation/json-schema-validation.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/options-resolution.mjs +45 -0
- package/dist/esm/package-checks/json-schema-validation/options-resolution.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/options-validation.mjs +212 -0
- package/dist/esm/package-checks/json-schema-validation/options-validation.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/options.mjs +2 -0
- package/dist/esm/package-checks/json-schema-validation/options.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/reference-resolver.mjs +128 -0
- package/dist/esm/package-checks/json-schema-validation/reference-resolver.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/remote-response.mjs +71 -0
- package/dist/esm/package-checks/json-schema-validation/remote-response.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/schema-engine.mjs +190 -0
- package/dist/esm/package-checks/json-schema-validation/schema-engine.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/schema-policy.mjs +234 -0
- package/dist/esm/package-checks/json-schema-validation/schema-policy.mjs.map +1 -0
- package/dist/esm/package-checks/json-validation/default-check.mjs +39 -0
- package/dist/esm/package-checks/json-validation/default-check.mjs.map +1 -0
- package/dist/esm/package-checks/json-validation/final-data.mjs +27 -0
- package/dist/esm/package-checks/json-validation/final-data.mjs.map +1 -0
- package/dist/esm/package-checks/json-validation/json-validation.mjs +138 -0
- package/dist/esm/package-checks/json-validation/json-validation.mjs.map +1 -0
- package/dist/esm/package-checks/json-validation/options-resolution.mjs +33 -0
- package/dist/esm/package-checks/json-validation/options-resolution.mjs.map +1 -0
- package/dist/esm/package-checks/json-validation/options-validation.mjs +16 -0
- package/dist/esm/package-checks/json-validation/options-validation.mjs.map +1 -0
- package/dist/esm/package-checks/json-validation/options.mjs +2 -0
- package/dist/esm/package-checks/json-validation/options.mjs.map +1 -0
- package/dist/esm/package-checks/maintenance-reminders/assessment-results.mjs +73 -0
- package/dist/esm/package-checks/maintenance-reminders/assessment-results.mjs.map +1 -0
- package/dist/esm/package-checks/maintenance-reminders/final-data.mjs +153 -0
- package/dist/esm/package-checks/maintenance-reminders/final-data.mjs.map +1 -0
- package/dist/esm/package-checks/maintenance-reminders/maintenance-reminders.mjs +155 -0
- package/dist/esm/package-checks/maintenance-reminders/maintenance-reminders.mjs.map +1 -0
- package/dist/esm/package-checks/maintenance-reminders/maintenance-support.mjs +58 -0
- package/dist/esm/package-checks/maintenance-reminders/maintenance-support.mjs.map +1 -0
- package/dist/esm/package-checks/maintenance-reminders/measurement.mjs +125 -0
- package/dist/esm/package-checks/maintenance-reminders/measurement.mjs.map +1 -0
- package/dist/esm/package-checks/maintenance-reminders/options-validation.mjs +72 -0
- package/dist/esm/package-checks/maintenance-reminders/options-validation.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/default-check.mjs +55 -0
- package/dist/esm/package-checks/markdown-link-validation/default-check.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/execution.mjs +199 -0
- package/dist/esm/package-checks/markdown-link-validation/execution.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/filesystem-probes.mjs +109 -0
- package/dist/esm/package-checks/markdown-link-validation/filesystem-probes.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/final-data.mjs +28 -0
- package/dist/esm/package-checks/markdown-link-validation/final-data.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/local-resolution.mjs +158 -0
- package/dist/esm/package-checks/markdown-link-validation/local-resolution.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/local-resolver.mjs +17 -0
- package/dist/esm/package-checks/markdown-link-validation/local-resolver.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/markdown-parser.mjs +191 -0
- package/dist/esm/package-checks/markdown-link-validation/markdown-parser.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs +83 -0
- package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs +50 -0
- package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/options.mjs +2 -0
- package/dist/esm/package-checks/markdown-link-validation/options.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/records.mjs +32 -0
- package/dist/esm/package-checks/markdown-link-validation/records.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/resolver-engine.mjs +196 -0
- package/dist/esm/package-checks/markdown-link-validation/resolver-engine.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/target-descriptor.mjs +23 -0
- package/dist/esm/package-checks/markdown-link-validation/target-descriptor.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/traversal-result.mjs +41 -0
- package/dist/esm/package-checks/markdown-link-validation/traversal-result.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/collection.mjs +142 -0
- package/dist/esm/package-checks/project-files/collection.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/config-glob.mjs +11 -0
- package/dist/esm/package-checks/project-files/config-glob.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/configuration.mjs +104 -0
- package/dist/esm/package-checks/project-files/configuration.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/exact-input-measurement.mjs +24 -0
- package/dist/esm/package-checks/project-files/exact-input-measurement.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/file-fingerprint.mjs +36 -0
- package/dist/esm/package-checks/project-files/file-fingerprint.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/gitlink-revision.mjs +57 -0
- package/dist/esm/package-checks/project-files/gitlink-revision.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/gitlink-worktree.mjs +72 -0
- package/dist/esm/package-checks/project-files/gitlink-worktree.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/input-eligibility.mjs +13 -0
- package/dist/esm/package-checks/project-files/input-eligibility.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/reported-path.mjs +30 -0
- package/dist/esm/package-checks/project-files/reported-path.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/revision-paths.mjs +19 -0
- package/dist/esm/package-checks/project-files/revision-paths.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/revision-worktree-files.mjs +102 -0
- package/dist/esm/package-checks/project-files/revision-worktree-files.mjs.map +1 -0
- package/dist/esm/project-definition/check-tree/authoring.mjs +242 -0
- package/dist/esm/project-definition/check-tree/authoring.mjs.map +1 -0
- package/dist/esm/project-definition/check-tree/materialization.mjs +50 -0
- package/dist/esm/project-definition/check-tree/materialization.mjs.map +1 -0
- package/dist/esm/project-definition/check-tree/resolution.mjs +60 -0
- package/dist/esm/project-definition/check-tree/resolution.mjs.map +1 -0
- package/dist/esm/project-definition/output-defaults.mjs +7 -0
- package/dist/esm/project-definition/output-defaults.mjs.map +1 -0
- package/dist/esm/project-definition/output-validation.mjs +44 -0
- package/dist/esm/project-definition/output-validation.mjs.map +1 -0
- package/dist/esm/project-definition/project-definition-validation.mjs +95 -0
- package/dist/esm/project-definition/project-definition-validation.mjs.map +1 -0
- package/dist/esm/project-definition/project-definition.mjs +92 -0
- package/dist/esm/project-definition/project-definition.mjs.map +1 -0
- package/dist/esm/project-run/aggregation.mjs +66 -0
- package/dist/esm/project-run/aggregation.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/callback.mjs +70 -0
- package/dist/esm/project-run/check-execution/callback.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/dependencies.mjs +50 -0
- package/dist/esm/project-run/check-execution/dependencies.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/execution-finalization.mjs +103 -0
- package/dist/esm/project-run/check-execution/execution-finalization.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/execution-settlement.mjs +90 -0
- package/dist/esm/project-run/check-execution/execution-settlement.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/messages.mjs +38 -0
- package/dist/esm/project-run/check-execution/messages.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/plan.mjs +35 -0
- package/dist/esm/project-run/check-execution/plan.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/preflight-result.mjs +83 -0
- package/dist/esm/project-run/check-execution/preflight-result.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/preflight.mjs +186 -0
- package/dist/esm/project-run/check-execution/preflight.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/resolved-checks.mjs +168 -0
- package/dist/esm/project-run/check-execution/resolved-checks.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/terminal-result.mjs +49 -0
- package/dist/esm/project-run/check-execution/terminal-result.mjs.map +1 -0
- package/dist/esm/project-run/completion.mjs +173 -0
- package/dist/esm/project-run/completion.mjs.map +1 -0
- package/dist/esm/project-run/controls/contract.mjs +2 -0
- package/dist/esm/project-run/controls/contract.mjs.map +1 -0
- package/dist/esm/project-run/controls/outputs-override-validation.mjs +61 -0
- package/dist/esm/project-run/controls/outputs-override-validation.mjs.map +1 -0
- package/dist/esm/project-run/controls/validation-result.mjs +2 -0
- package/dist/esm/project-run/controls/validation-result.mjs.map +1 -0
- package/dist/esm/project-run/controls/validation.mjs +156 -0
- package/dist/esm/project-run/controls/validation.mjs.map +1 -0
- package/dist/esm/project-run/diagnostic-logging/diagnostic-detail-rendering.mjs +182 -0
- package/dist/esm/project-run/diagnostic-logging/diagnostic-detail-rendering.mjs.map +1 -0
- package/dist/esm/project-run/diagnostic-logging/logger.mjs +242 -0
- package/dist/esm/project-run/diagnostic-logging/logger.mjs.map +1 -0
- package/dist/esm/project-run/invocation-creation.mjs +111 -0
- package/dist/esm/project-run/invocation-creation.mjs.map +1 -0
- package/dist/esm/project-run/invocation.mjs +195 -0
- package/dist/esm/project-run/invocation.mjs.map +1 -0
- package/dist/esm/project-run/machine-publication.mjs +16 -0
- package/dist/esm/project-run/machine-publication.mjs.map +1 -0
- package/dist/esm/project-run/output-configuration.mjs +17 -0
- package/dist/esm/project-run/output-configuration.mjs.map +1 -0
- package/dist/esm/project-run/output-status.mjs +43 -0
- package/dist/esm/project-run/output-status.mjs.map +1 -0
- package/dist/esm/project-run/progress-rendering/presentation.mjs +135 -0
- package/dist/esm/project-run/progress-rendering/presentation.mjs.map +1 -0
- package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs +100 -0
- package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs.map +1 -0
- package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs +123 -0
- package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs.map +1 -0
- package/dist/esm/project-run/progress-rendering/renderer.mjs +12 -0
- package/dist/esm/project-run/progress-rendering/renderer.mjs.map +1 -0
- package/dist/esm/project-run/project-context.mjs +8 -0
- package/dist/esm/project-run/project-context.mjs.map +1 -0
- package/dist/esm/project-run/result.mjs +54 -0
- package/dist/esm/project-run/result.mjs.map +1 -0
- package/dist/esm/project-run/run.mjs +23 -0
- package/dist/esm/project-run/run.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/execution-state.mjs +66 -0
- package/dist/esm/project-run/task-scheduler/execution-state.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/graph-validation.mjs +119 -0
- package/dist/esm/project-run/task-scheduler/graph-validation.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/graph.mjs +116 -0
- package/dist/esm/project-run/task-scheduler/graph.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/scheduler-admission-decision.mjs +82 -0
- package/dist/esm/project-run/task-scheduler/scheduler-admission-decision.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/scheduler-blocker-summary.mjs +27 -0
- package/dist/esm/project-run/task-scheduler/scheduler-blocker-summary.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/scheduler-decision-inspection.mjs +125 -0
- package/dist/esm/project-run/task-scheduler/scheduler-decision-inspection.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/scheduler-decision-model.mjs +45 -0
- package/dist/esm/project-run/task-scheduler/scheduler-decision-model.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/scheduler-decision.mjs +74 -0
- package/dist/esm/project-run/task-scheduler/scheduler-decision.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/scheduler.mjs +147 -0
- package/dist/esm/project-run/task-scheduler/scheduler.mjs.map +1 -0
- package/docs/api-mechanics.md +205 -0
- package/docs/checks/duplicate-detection.md +195 -0
- package/docs/checks/file-metrics.md +229 -0
- package/docs/checks/function-metrics.md +222 -0
- package/docs/checks/json-schema-validation.md +190 -0
- package/docs/checks/json-validation.md +133 -0
- package/docs/checks/maintenance-reminders.md +158 -0
- package/docs/checks/markdown-link-validation.md +192 -0
- package/docs/examples/artifacts/mixed-outcomes/definition.ts +195 -0
- package/docs/examples/artifacts/mixed-outcomes/records.ndjson +2 -0
- package/docs/examples/artifacts/mixed-outcomes/run.json +70 -0
- package/docs/output.md +97 -0
- package/docs/schemas/vibe-check-record.schema.json +33 -0
- package/docs/schemas/vibe-check-run.schema.json +173 -0
- package/index.mjs +1 -0
- package/package.json +49 -0
- package/src/check/check.ts +497 -0
- package/src/check/descriptor-validation.ts +60 -0
- package/src/check/descriptor.ts +5 -0
- package/src/check/inherited-collection.ts +101 -0
- package/src/check/options-snapshot.ts +80 -0
- package/src/check-settlement/fact-validation.ts +289 -0
- package/src/check-settlement/facts.ts +27 -0
- package/src/check-settlement/outcome-normalization.ts +118 -0
- package/src/check-settlement/record-store.ts +73 -0
- package/src/check-settlement/session.ts +257 -0
- package/src/data-boundary/canonical-data.ts +188 -0
- package/src/data-boundary/canonical-json.ts +11 -0
- package/src/data-boundary/closed-values.ts +126 -0
- package/src/data-boundary/value-shapes.ts +15 -0
- package/src/finding-waivers/reconciliation.ts +176 -0
- package/src/index.ts +123 -0
- package/src/machine-output/v4/atomic-publication.ts +123 -0
- package/src/machine-output/v4/freeze-publication-value.ts +12 -0
- package/src/machine-output/v4/projection.ts +36 -0
- package/src/machine-output/v4/publication-invariants.ts +89 -0
- package/src/machine-output/v4/publication-model.ts +38 -0
- package/src/machine-output/v4/publish.ts +23 -0
- package/src/machine-output/v4/records-fingerprint.ts +12 -0
- package/src/machine-output/v4/schema-identities.ts +8 -0
- package/src/machine-output/v4/schema.ts +97 -0
- package/src/machine-output/v4/serializers.ts +18 -0
- package/src/machine-output/v4/validation-result.ts +59 -0
- package/src/machine-output/v4/validation.ts +166 -0
- package/src/package-checks/code-quality-findings/policy.ts +85 -0
- package/src/package-checks/duplicate-detection/area-policy.ts +103 -0
- package/src/package-checks/duplicate-detection/cache/cache-contract.ts +49 -0
- package/src/package-checks/duplicate-detection/cache/identity.ts +61 -0
- package/src/package-checks/duplicate-detection/cache/key.ts +46 -0
- package/src/package-checks/duplicate-detection/cache/payload.ts +78 -0
- package/src/package-checks/duplicate-detection/cache/store.ts +77 -0
- package/src/package-checks/duplicate-detection/default-check.ts +50 -0
- package/src/package-checks/duplicate-detection/execution.ts +168 -0
- package/src/package-checks/duplicate-detection/final-data.ts +10 -0
- package/src/package-checks/duplicate-detection/jscpd/availability.ts +137 -0
- package/src/package-checks/duplicate-detection/jscpd/command-path.ts +8 -0
- package/src/package-checks/duplicate-detection/jscpd/command-resolution.ts +112 -0
- package/src/package-checks/duplicate-detection/jscpd/json-report.ts +137 -0
- package/src/package-checks/duplicate-detection/jscpd/scanner-contract.ts +18 -0
- package/src/package-checks/duplicate-detection/jscpd/scanner.ts +257 -0
- package/src/package-checks/duplicate-detection/jscpd/scoped-fragments.ts +17 -0
- package/src/package-checks/duplicate-detection/measurement-model.ts +44 -0
- package/src/package-checks/duplicate-detection/measurement.ts +223 -0
- package/src/package-checks/duplicate-detection/options-resolution.ts +162 -0
- package/src/package-checks/duplicate-detection/options-validation.ts +75 -0
- package/src/package-checks/duplicate-detection/options.ts +72 -0
- package/src/package-checks/duplicate-detection/project-revision.ts +5 -0
- package/src/package-checks/duplicate-detection/records.ts +171 -0
- package/src/package-checks/file-metrics/constructor.ts +46 -0
- package/src/package-checks/file-metrics/execution.ts +233 -0
- package/src/package-checks/file-metrics/final-data.ts +10 -0
- package/src/package-checks/file-metrics/measurement-model.ts +10 -0
- package/src/package-checks/file-metrics/measurement.ts +52 -0
- package/src/package-checks/file-metrics/options-resolution.ts +213 -0
- package/src/package-checks/file-metrics/options-validation.ts +104 -0
- package/src/package-checks/file-metrics/options.ts +91 -0
- package/src/package-checks/file-metrics/records.ts +182 -0
- package/src/package-checks/file-metrics/scc/availability.ts +100 -0
- package/src/package-checks/file-metrics/scc/csv.ts +20 -0
- package/src/package-checks/file-metrics/scc/parser.ts +223 -0
- package/src/package-checks/file-metrics/scc/scanner.ts +68 -0
- package/src/package-checks/final-data-parsing.ts +49 -0
- package/src/package-checks/function-metrics/analysis.ts +138 -0
- package/src/package-checks/function-metrics/constructor.ts +55 -0
- package/src/package-checks/function-metrics/execution.ts +263 -0
- package/src/package-checks/function-metrics/final-data.ts +10 -0
- package/src/package-checks/function-metrics/lizard/availability.ts +90 -0
- package/src/package-checks/function-metrics/lizard/csv.ts +20 -0
- package/src/package-checks/function-metrics/lizard/parser.ts +179 -0
- package/src/package-checks/function-metrics/lizard/scanner.ts +62 -0
- package/src/package-checks/function-metrics/measurement-model.ts +30 -0
- package/src/package-checks/function-metrics/measurement.ts +57 -0
- package/src/package-checks/function-metrics/options-resolution.ts +215 -0
- package/src/package-checks/function-metrics/options-validation.ts +89 -0
- package/src/package-checks/function-metrics/options.ts +84 -0
- package/src/package-checks/function-metrics/records.ts +254 -0
- package/src/package-checks/function-metrics/target-files.ts +85 -0
- package/src/package-checks/host-environment/error-message.ts +3 -0
- package/src/package-checks/host-environment/filesystem.ts +110 -0
- package/src/package-checks/host-environment/git.ts +68 -0
- package/src/package-checks/host-environment/path.ts +20 -0
- package/src/package-checks/host-environment/process/command.ts +21 -0
- package/src/package-checks/host-environment/process/contract.ts +56 -0
- package/src/package-checks/host-environment/process/env.ts +25 -0
- package/src/package-checks/host-environment/process/failure.ts +40 -0
- package/src/package-checks/host-environment/process/result.ts +39 -0
- package/src/package-checks/host-environment/process/runner.ts +47 -0
- package/src/package-checks/json-document/strict-document.ts +209 -0
- package/src/package-checks/json-schema-validation/default-check.ts +54 -0
- package/src/package-checks/json-schema-validation/execution-stages.ts +230 -0
- package/src/package-checks/json-schema-validation/final-data.ts +115 -0
- package/src/package-checks/json-schema-validation/issue-collector.ts +43 -0
- package/src/package-checks/json-schema-validation/json-schema-validation.ts +191 -0
- package/src/package-checks/json-schema-validation/options-resolution.ts +61 -0
- package/src/package-checks/json-schema-validation/options-validation.ts +256 -0
- package/src/package-checks/json-schema-validation/options.ts +66 -0
- package/src/package-checks/json-schema-validation/reference-resolver.ts +165 -0
- package/src/package-checks/json-schema-validation/remote-response.ts +84 -0
- package/src/package-checks/json-schema-validation/schema-engine.ts +263 -0
- package/src/package-checks/json-schema-validation/schema-policy.ts +275 -0
- package/src/package-checks/json-validation/default-check.ts +48 -0
- package/src/package-checks/json-validation/final-data.ts +46 -0
- package/src/package-checks/json-validation/json-validation.ts +212 -0
- package/src/package-checks/json-validation/options-resolution.ts +50 -0
- package/src/package-checks/json-validation/options-validation.ts +27 -0
- package/src/package-checks/json-validation/options.ts +18 -0
- package/src/package-checks/maintenance-reminders/assessment-results.ts +117 -0
- package/src/package-checks/maintenance-reminders/final-data.ts +239 -0
- package/src/package-checks/maintenance-reminders/maintenance-reminders.ts +264 -0
- package/src/package-checks/maintenance-reminders/maintenance-support.ts +67 -0
- package/src/package-checks/maintenance-reminders/measurement.ts +183 -0
- package/src/package-checks/maintenance-reminders/options-validation.ts +88 -0
- package/src/package-checks/markdown-link-validation/default-check.ts +70 -0
- package/src/package-checks/markdown-link-validation/execution.ts +325 -0
- package/src/package-checks/markdown-link-validation/filesystem-probes.ts +127 -0
- package/src/package-checks/markdown-link-validation/final-data.ts +47 -0
- package/src/package-checks/markdown-link-validation/local-resolution.ts +306 -0
- package/src/package-checks/markdown-link-validation/local-resolver.ts +51 -0
- package/src/package-checks/markdown-link-validation/markdown-parser.ts +302 -0
- package/src/package-checks/markdown-link-validation/options-resolution.ts +114 -0
- package/src/package-checks/markdown-link-validation/options-validation.ts +72 -0
- package/src/package-checks/markdown-link-validation/options.ts +50 -0
- package/src/package-checks/markdown-link-validation/records.ts +77 -0
- package/src/package-checks/markdown-link-validation/resolver-engine.ts +276 -0
- package/src/package-checks/markdown-link-validation/target-descriptor.ts +34 -0
- package/src/package-checks/markdown-link-validation/traversal-result.ts +58 -0
- package/src/package-checks/project-files/collection.ts +199 -0
- package/src/package-checks/project-files/config-glob.ts +17 -0
- package/src/package-checks/project-files/configuration.ts +152 -0
- package/src/package-checks/project-files/exact-input-measurement.ts +38 -0
- package/src/package-checks/project-files/file-fingerprint.ts +46 -0
- package/src/package-checks/project-files/gitlink-revision.ts +82 -0
- package/src/package-checks/project-files/gitlink-worktree.ts +106 -0
- package/src/package-checks/project-files/input-eligibility.ts +21 -0
- package/src/package-checks/project-files/reported-path.ts +35 -0
- package/src/package-checks/project-files/revision-paths.ts +34 -0
- package/src/package-checks/project-files/revision-worktree-files.ts +148 -0
- package/src/project-definition/check-tree/authoring.ts +332 -0
- package/src/project-definition/check-tree/materialization.ts +56 -0
- package/src/project-definition/check-tree/resolution.ts +108 -0
- package/src/project-definition/output-defaults.ts +6 -0
- package/src/project-definition/output-validation.ts +54 -0
- package/src/project-definition/project-definition-validation.ts +123 -0
- package/src/project-definition/project-definition.ts +184 -0
- package/src/project-run/aggregation.ts +90 -0
- package/src/project-run/check-execution/callback.ts +106 -0
- package/src/project-run/check-execution/dependencies.ts +70 -0
- package/src/project-run/check-execution/execution-finalization.ts +177 -0
- package/src/project-run/check-execution/execution-settlement.ts +147 -0
- package/src/project-run/check-execution/messages.ts +46 -0
- package/src/project-run/check-execution/plan.ts +46 -0
- package/src/project-run/check-execution/preflight-result.ts +131 -0
- package/src/project-run/check-execution/preflight.ts +321 -0
- package/src/project-run/check-execution/resolved-checks.ts +285 -0
- package/src/project-run/check-execution/terminal-result.ts +74 -0
- package/src/project-run/completion.ts +263 -0
- package/src/project-run/controls/contract.ts +24 -0
- package/src/project-run/controls/outputs-override-validation.ts +86 -0
- package/src/project-run/controls/validation-result.ts +12 -0
- package/src/project-run/controls/validation.ts +176 -0
- package/src/project-run/diagnostic-logging/diagnostic-detail-rendering.ts +223 -0
- package/src/project-run/diagnostic-logging/logger.ts +325 -0
- package/src/project-run/invocation-creation.ts +160 -0
- package/src/project-run/invocation.ts +303 -0
- package/src/project-run/machine-publication.ts +23 -0
- package/src/project-run/output-configuration.ts +24 -0
- package/src/project-run/output-status.ts +69 -0
- package/src/project-run/progress-rendering/presentation.ts +189 -0
- package/src/project-run/progress-rendering/renderer-formatting.ts +141 -0
- package/src/project-run/progress-rendering/renderer-lifecycle.ts +152 -0
- package/src/project-run/progress-rendering/renderer.ts +68 -0
- package/src/project-run/project-context.ts +11 -0
- package/src/project-run/result.ts +175 -0
- package/src/project-run/run.ts +50 -0
- package/src/project-run/task-scheduler/execution-state.ts +153 -0
- package/src/project-run/task-scheduler/graph-validation.ts +176 -0
- package/src/project-run/task-scheduler/graph.ts +185 -0
- package/src/project-run/task-scheduler/scheduler-admission-decision.ts +177 -0
- package/src/project-run/task-scheduler/scheduler-blocker-summary.ts +42 -0
- package/src/project-run/task-scheduler/scheduler-decision-inspection.ts +199 -0
- package/src/project-run/task-scheduler/scheduler-decision-model.ts +158 -0
- package/src/project-run/task-scheduler/scheduler-decision.ts +103 -0
- package/src/project-run/task-scheduler/scheduler.ts +228 -0
- package/third-party-licenses/momoa-3.3.12-LICENSE +201 -0
- package/types/check/check.d.ts +350 -0
- package/types/check/descriptor-validation.d.ts +18 -0
- package/types/check/descriptor.d.ts +5 -0
- package/types/check/inherited-collection.d.ts +35 -0
- package/types/check/options-snapshot.d.ts +2 -0
- package/types/check-settlement/fact-validation.d.ts +14 -0
- package/types/check-settlement/facts.d.ts +19 -0
- package/types/check-settlement/outcome-normalization.d.ts +9 -0
- package/types/check-settlement/record-store.d.ts +14 -0
- package/types/check-settlement/session.d.ts +41 -0
- package/types/data-boundary/canonical-data.d.ts +13 -0
- package/types/data-boundary/canonical-json.d.ts +6 -0
- package/types/data-boundary/closed-values.d.ts +8 -0
- package/types/data-boundary/value-shapes.d.ts +4 -0
- package/types/finding-waivers/reconciliation.d.ts +66 -0
- package/types/index.d.ts +57 -0
- package/types/machine-output/v4/atomic-publication.d.ts +9 -0
- package/types/machine-output/v4/freeze-publication-value.d.ts +6 -0
- package/types/machine-output/v4/projection.d.ts +7 -0
- package/types/machine-output/v4/publication-invariants.d.ts +3 -0
- package/types/machine-output/v4/publication-model.d.ts +15 -0
- package/types/machine-output/v4/publish.d.ts +7 -0
- package/types/machine-output/v4/records-fingerprint.d.ts +4 -0
- package/types/machine-output/v4/schema-identities.d.ts +7 -0
- package/types/machine-output/v4/schema.d.ts +44 -0
- package/types/machine-output/v4/serializers.d.ts +6 -0
- package/types/machine-output/v4/validation-result.d.ts +26 -0
- package/types/machine-output/v4/validation.d.ts +6 -0
- package/types/package-checks/code-quality-findings/policy.d.ts +20 -0
- package/types/package-checks/duplicate-detection/area-policy.d.ts +3 -0
- package/types/package-checks/duplicate-detection/cache/cache-contract.d.ts +48 -0
- package/types/package-checks/duplicate-detection/cache/identity.d.ts +17 -0
- package/types/package-checks/duplicate-detection/cache/key.d.ts +4 -0
- package/types/package-checks/duplicate-detection/cache/payload.d.ts +4 -0
- package/types/package-checks/duplicate-detection/cache/store.d.ts +18 -0
- package/types/package-checks/duplicate-detection/default-check.d.ts +11 -0
- package/types/package-checks/duplicate-detection/execution.d.ts +11 -0
- package/types/package-checks/duplicate-detection/final-data.d.ts +5 -0
- package/types/package-checks/duplicate-detection/jscpd/availability.d.ts +19 -0
- package/types/package-checks/duplicate-detection/jscpd/command-path.d.ts +1 -0
- package/types/package-checks/duplicate-detection/jscpd/command-resolution.d.ts +23 -0
- package/types/package-checks/duplicate-detection/jscpd/json-report.d.ts +2 -0
- package/types/package-checks/duplicate-detection/jscpd/scanner-contract.d.ts +11 -0
- package/types/package-checks/duplicate-detection/jscpd/scanner.d.ts +21 -0
- package/types/package-checks/duplicate-detection/jscpd/scoped-fragments.d.ts +4 -0
- package/types/package-checks/duplicate-detection/measurement-model.d.ts +36 -0
- package/types/package-checks/duplicate-detection/measurement.d.ts +14 -0
- package/types/package-checks/duplicate-detection/options-resolution.d.ts +3 -0
- package/types/package-checks/duplicate-detection/options-validation.d.ts +1 -0
- package/types/package-checks/duplicate-detection/options.d.ts +65 -0
- package/types/package-checks/duplicate-detection/project-revision.d.ts +1 -0
- package/types/package-checks/duplicate-detection/records.d.ts +22 -0
- package/types/package-checks/file-metrics/constructor.d.ts +11 -0
- package/types/package-checks/file-metrics/execution.d.ts +11 -0
- package/types/package-checks/file-metrics/final-data.d.ts +5 -0
- package/types/package-checks/file-metrics/measurement-model.d.ts +12 -0
- package/types/package-checks/file-metrics/measurement.d.ts +13 -0
- package/types/package-checks/file-metrics/options-resolution.d.ts +3 -0
- package/types/package-checks/file-metrics/options-validation.d.ts +3 -0
- package/types/package-checks/file-metrics/options.d.ts +75 -0
- package/types/package-checks/file-metrics/records.d.ts +43 -0
- package/types/package-checks/file-metrics/scc/availability.d.ts +18 -0
- package/types/package-checks/file-metrics/scc/csv.d.ts +1 -0
- package/types/package-checks/file-metrics/scc/parser.d.ts +25 -0
- package/types/package-checks/file-metrics/scc/scanner.d.ts +14 -0
- package/types/package-checks/final-data-parsing.d.ts +9 -0
- package/types/package-checks/function-metrics/analysis.d.ts +10 -0
- package/types/package-checks/function-metrics/constructor.d.ts +11 -0
- package/types/package-checks/function-metrics/execution.d.ts +7 -0
- package/types/package-checks/function-metrics/final-data.d.ts +5 -0
- package/types/package-checks/function-metrics/lizard/availability.d.ts +11 -0
- package/types/package-checks/function-metrics/lizard/csv.d.ts +1 -0
- package/types/package-checks/function-metrics/lizard/parser.d.ts +17 -0
- package/types/package-checks/function-metrics/lizard/scanner.d.ts +15 -0
- package/types/package-checks/function-metrics/measurement-model.d.ts +26 -0
- package/types/package-checks/function-metrics/measurement.d.ts +21 -0
- package/types/package-checks/function-metrics/options-resolution.d.ts +3 -0
- package/types/package-checks/function-metrics/options-validation.d.ts +3 -0
- package/types/package-checks/function-metrics/options.d.ts +76 -0
- package/types/package-checks/function-metrics/records.d.ts +37 -0
- package/types/package-checks/function-metrics/target-files.d.ts +3 -0
- package/types/package-checks/host-environment/error-message.d.ts +1 -0
- package/types/package-checks/host-environment/filesystem.d.ts +19 -0
- package/types/package-checks/host-environment/git.d.ts +13 -0
- package/types/package-checks/host-environment/path.d.ts +3 -0
- package/types/package-checks/host-environment/process/command.d.ts +7 -0
- package/types/package-checks/host-environment/process/contract.d.ts +50 -0
- package/types/package-checks/host-environment/process/env.d.ts +16 -0
- package/types/package-checks/host-environment/process/failure.d.ts +4 -0
- package/types/package-checks/host-environment/process/result.d.ts +2 -0
- package/types/package-checks/host-environment/process/runner.d.ts +3 -0
- package/types/package-checks/json-document/strict-document.d.ts +35 -0
- package/types/package-checks/json-schema-validation/default-check.d.ts +11 -0
- package/types/package-checks/json-schema-validation/execution-stages.d.ts +27 -0
- package/types/package-checks/json-schema-validation/final-data.d.ts +15 -0
- package/types/package-checks/json-schema-validation/issue-collector.d.ts +12 -0
- package/types/package-checks/json-schema-validation/json-schema-validation.d.ts +42 -0
- package/types/package-checks/json-schema-validation/options-resolution.d.ts +3 -0
- package/types/package-checks/json-schema-validation/options-validation.d.ts +2 -0
- package/types/package-checks/json-schema-validation/options.d.ts +53 -0
- package/types/package-checks/json-schema-validation/reference-resolver.d.ts +23 -0
- package/types/package-checks/json-schema-validation/remote-response.d.ts +2 -0
- package/types/package-checks/json-schema-validation/schema-engine.d.ts +33 -0
- package/types/package-checks/json-schema-validation/schema-policy.d.ts +17 -0
- package/types/package-checks/json-validation/default-check.d.ts +11 -0
- package/types/package-checks/json-validation/final-data.d.ts +10 -0
- package/types/package-checks/json-validation/json-validation.d.ts +28 -0
- package/types/package-checks/json-validation/options-resolution.d.ts +3 -0
- package/types/package-checks/json-validation/options-validation.d.ts +2 -0
- package/types/package-checks/json-validation/options.d.ts +13 -0
- package/types/package-checks/maintenance-reminders/assessment-results.d.ts +10 -0
- package/types/package-checks/maintenance-reminders/final-data.d.ts +47 -0
- package/types/package-checks/maintenance-reminders/maintenance-reminders.d.ts +111 -0
- package/types/package-checks/maintenance-reminders/maintenance-support.d.ts +7 -0
- package/types/package-checks/maintenance-reminders/measurement.d.ts +10 -0
- package/types/package-checks/maintenance-reminders/options-validation.d.ts +3 -0
- package/types/package-checks/markdown-link-validation/default-check.d.ts +27 -0
- package/types/package-checks/markdown-link-validation/execution.d.ts +12 -0
- package/types/package-checks/markdown-link-validation/filesystem-probes.d.ts +10 -0
- package/types/package-checks/markdown-link-validation/final-data.d.ts +10 -0
- package/types/package-checks/markdown-link-validation/local-resolution.d.ts +92 -0
- package/types/package-checks/markdown-link-validation/local-resolver.d.ts +5 -0
- package/types/package-checks/markdown-link-validation/markdown-parser.d.ts +37 -0
- package/types/package-checks/markdown-link-validation/options-resolution.d.ts +3 -0
- package/types/package-checks/markdown-link-validation/options-validation.d.ts +2 -0
- package/types/package-checks/markdown-link-validation/options.d.ts +43 -0
- package/types/package-checks/markdown-link-validation/records.d.ts +37 -0
- package/types/package-checks/markdown-link-validation/resolver-engine.d.ts +15 -0
- package/types/package-checks/markdown-link-validation/target-descriptor.d.ts +5 -0
- package/types/package-checks/markdown-link-validation/traversal-result.d.ts +12 -0
- package/types/package-checks/project-files/collection.d.ts +9 -0
- package/types/package-checks/project-files/config-glob.d.ts +5 -0
- package/types/package-checks/project-files/configuration.d.ts +31 -0
- package/types/package-checks/project-files/exact-input-measurement.d.ts +12 -0
- package/types/package-checks/project-files/file-fingerprint.d.ts +7 -0
- package/types/package-checks/project-files/gitlink-revision.d.ts +9 -0
- package/types/package-checks/project-files/gitlink-worktree.d.ts +26 -0
- package/types/package-checks/project-files/input-eligibility.d.ts +7 -0
- package/types/package-checks/project-files/reported-path.d.ts +1 -0
- package/types/package-checks/project-files/revision-paths.d.ts +12 -0
- package/types/package-checks/project-files/revision-worktree-files.d.ts +5 -0
- package/types/project-definition/check-tree/authoring.d.ts +41 -0
- package/types/project-definition/check-tree/materialization.d.ts +4 -0
- package/types/project-definition/check-tree/resolution.d.ts +25 -0
- package/types/project-definition/output-defaults.d.ts +14 -0
- package/types/project-definition/output-validation.d.ts +3 -0
- package/types/project-definition/project-definition-validation.d.ts +6 -0
- package/types/project-definition/project-definition.d.ts +88 -0
- package/types/project-run/aggregation.d.ts +7 -0
- package/types/project-run/check-execution/callback.d.ts +24 -0
- package/types/project-run/check-execution/dependencies.d.ts +9 -0
- package/types/project-run/check-execution/execution-finalization.d.ts +18 -0
- package/types/project-run/check-execution/execution-settlement.d.ts +41 -0
- package/types/project-run/check-execution/messages.d.ts +3 -0
- package/types/project-run/check-execution/plan.d.ts +10 -0
- package/types/project-run/check-execution/preflight-result.d.ts +23 -0
- package/types/project-run/check-execution/preflight.d.ts +27 -0
- package/types/project-run/check-execution/resolved-checks.d.ts +51 -0
- package/types/project-run/check-execution/terminal-result.d.ts +27 -0
- package/types/project-run/completion.d.ts +14 -0
- package/types/project-run/controls/contract.d.ts +24 -0
- package/types/project-run/controls/outputs-override-validation.d.ts +3 -0
- package/types/project-run/controls/validation-result.d.ts +14 -0
- package/types/project-run/controls/validation.d.ts +3 -0
- package/types/project-run/diagnostic-logging/diagnostic-detail-rendering.d.ts +11 -0
- package/types/project-run/diagnostic-logging/logger.d.ts +33 -0
- package/types/project-run/invocation-creation.d.ts +12 -0
- package/types/project-run/invocation.d.ts +34 -0
- package/types/project-run/machine-publication.d.ts +10 -0
- package/types/project-run/output-configuration.d.ts +3 -0
- package/types/project-run/output-status.d.ts +21 -0
- package/types/project-run/progress-rendering/presentation.d.ts +28 -0
- package/types/project-run/progress-rendering/renderer-formatting.d.ts +23 -0
- package/types/project-run/progress-rendering/renderer-lifecycle.d.ts +24 -0
- package/types/project-run/progress-rendering/renderer.d.ts +44 -0
- package/types/project-run/project-context.d.ts +7 -0
- package/types/project-run/result.d.ts +99 -0
- package/types/project-run/run.d.ts +18 -0
- package/types/project-run/task-scheduler/execution-state.d.ts +67 -0
- package/types/project-run/task-scheduler/graph-validation.d.ts +11 -0
- package/types/project-run/task-scheduler/graph.d.ts +40 -0
- package/types/project-run/task-scheduler/scheduler-admission-decision.d.ts +8 -0
- package/types/project-run/task-scheduler/scheduler-blocker-summary.d.ts +4 -0
- package/types/project-run/task-scheduler/scheduler-decision-inspection.d.ts +24 -0
- package/types/project-run/task-scheduler/scheduler-decision-model.d.ts +94 -0
- package/types/project-run/task-scheduler/scheduler-decision.d.ts +8 -0
- package/types/project-run/task-scheduler/scheduler.d.ts +3 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver-engine.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/resolver-engine.ts"],"names":[],"mappings":"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","sourcesContent":["import { opendir } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { parseMarkdownLinkFacts } from \"./markdown-parser.ts\";\nimport {\n directoryTarget,\n fileTargetDescriptor,\n outsideProjectRootTarget,\n projectTarget\n} from \"./target-descriptor.ts\";\nimport { probeEndpoint, probeRootContainedPath, readRegularFile } from \"./filesystem-probes.ts\";\nimport {\n anchorResolution,\n finding,\n isMarkdownPath,\n isRootRelativePath,\n isWithinRoot,\n parseLocalDestination,\n sameRootRelativePath,\n sourceUnavailable,\n toSlashPath,\n unavailable,\n valid,\n type MarkdownLocalResolution,\n type MarkdownLocalResolutionRequest,\n type MarkdownLocalResolver,\n type MarkdownSafeTargetDescriptor,\n type MarkdownSourceReadResult\n} from \"./local-resolution.ts\";\n\nexport class LinkLocalResolver implements MarkdownLocalResolver {\n #targetReadCount = 0;\n readonly #canonicalProjectRoot: string;\n readonly #maxTargetReads: number;\n\n constructor(canonicalProjectRoot: string, maxTargetReads: number) {\n this.#canonicalProjectRoot = canonicalProjectRoot;\n this.#maxTargetReads = maxTargetReads;\n }\n\n get targetReadCount(): number {\n return this.#targetReadCount;\n }\n\n async readSource(\n rootRelativePath: string,\n maxMarkdownBytes: number\n ): Promise<MarkdownSourceReadResult> {\n if (!isRootRelativePath(this.#canonicalProjectRoot, rootRelativePath)) {\n return sourceUnavailable();\n }\n\n const sourcePath = path.resolve(this.#canonicalProjectRoot, rootRelativePath);\n const rootProbe = await probeRootContainedPath(this.#canonicalProjectRoot, sourcePath);\n if (\n rootProbe.kind === \"outside\" ||\n rootProbe.kind === \"unavailable\" ||\n rootProbe.kind === \"missing\"\n ) {\n return sourceUnavailable();\n }\n\n const sourceBytes = await readRegularFile(rootProbe.absolutePath, maxMarkdownBytes);\n if (!sourceBytes.ok) {\n return sourceBytes.reason === \"too-large\"\n ? Object.freeze({ ok: false as const, reason: \"source-too-large\" as const })\n : sourceUnavailable();\n }\n\n let markdown: string;\n try {\n markdown = new TextDecoder(\"utf-8\", { fatal: true }).decode(sourceBytes.bytes);\n } catch {\n return sourceUnavailable();\n }\n\n const parsed = parseMarkdownLinkFacts(markdown);\n if (!parsed.ok) {\n return Object.freeze({ ok: false as const, reason: \"markdown-parse-failed\" as const });\n }\n\n return Object.freeze({\n ok: true as const,\n source: Object.freeze({\n path: toSlashPath(path.relative(this.#canonicalProjectRoot, sourcePath)),\n facts: parsed.facts\n })\n });\n }\n\n async resolve(request: MarkdownLocalResolutionRequest): Promise<MarkdownLocalResolution> {\n const destination = parseLocalDestination(request.rawDestination);\n if (destination === \"not-local\") {\n return Object.freeze({ kind: \"not-local\" as const });\n }\n if (destination === null) {\n return unavailable(\"invalid-local-destination\");\n }\n\n let targetPath: string;\n if (destination.path === \"\") {\n targetPath = path.resolve(this.#canonicalProjectRoot, request.source.path);\n } else if (destination.isAbsolute) {\n targetPath = path.normalize(destination.path);\n } else {\n targetPath = path.resolve(\n this.#canonicalProjectRoot,\n path.dirname(request.source.path),\n destination.path\n );\n }\n const isSameDocument =\n !destination.isAbsolute &&\n sameRootRelativePath(request.source.path, targetPath, this.#canonicalProjectRoot);\n if (isSameDocument) {\n return this.resolveSameDocument(destination.fragment, request);\n }\n const lexicalTargetIsExternal =\n destination.isAbsolute || !isWithinRoot(this.#canonicalProjectRoot, targetPath);\n\n if (lexicalTargetIsExternal) {\n return this.resolveExternalTarget(targetPath, destination.fragment, request);\n }\n\n return this.resolveRootContainedTarget(targetPath, destination.fragment, request);\n }\n\n async resolveRootContainedTarget(\n targetPath: string,\n fragment: string | null,\n request: MarkdownLocalResolutionRequest\n ): Promise<MarkdownLocalResolution> {\n const rootProbe = await probeRootContainedPath(this.#canonicalProjectRoot, targetPath);\n if (rootProbe.kind === \"outside\") {\n return this.resolveExternalTarget(targetPath, fragment, request);\n }\n if (rootProbe.kind === \"unavailable\") {\n return unavailable(\"target-unavailable\");\n }\n if (rootProbe.kind === \"missing\") {\n if (!this.beginTargetValidation()) {\n return unavailable(\"target-read-limit-exceeded\");\n }\n const target = projectTarget(this.#canonicalProjectRoot, targetPath, fragment);\n return request.requireExistingTargets ? finding(\"missing-target\", target) : valid(target);\n }\n if (!this.beginTargetValidation()) {\n return unavailable(\"target-read-limit-exceeded\");\n }\n return this.resolveEndpoint(\n rootProbe.absolutePath,\n fragment,\n request,\n projectTarget(this.#canonicalProjectRoot, targetPath, fragment)\n );\n }\n\n async resolveExternalTarget(\n targetPath: string,\n fragment: string | null,\n request: MarkdownLocalResolutionRequest\n ): Promise<MarkdownLocalResolution> {\n if (request.rootExternalTargetMode === \"ignore\") {\n return Object.freeze({ kind: \"ignored\" as const });\n }\n if (request.rootExternalTargetMode === \"report\") {\n return finding(\"target-outside-project-root\", outsideProjectRootTarget());\n }\n if (!this.beginTargetValidation()) {\n return unavailable(\"target-read-limit-exceeded\");\n }\n return this.resolveEndpoint(targetPath, fragment, request, outsideProjectRootTarget());\n }\n\n async resolveEndpoint(\n targetPath: string,\n fragment: string | null,\n request: MarkdownLocalResolutionRequest,\n target: MarkdownSafeTargetDescriptor\n ): Promise<MarkdownLocalResolution> {\n const endpoint = await probeEndpoint(targetPath);\n if (endpoint.kind === \"missing\") {\n return request.requireExistingTargets ? finding(\"missing-target\", target) : valid(target);\n }\n if (endpoint.kind === \"unavailable\") {\n return unavailable(\"target-unavailable\");\n }\n if (endpoint.kind === \"directory\") {\n return this.resolveDirectory(targetPath, fragment, request, directoryTarget(target));\n }\n if (endpoint.kind === \"unsupported\") {\n return finding(\"unsupported-target-type\", target);\n }\n\n return this.resolveFile(targetPath, fragment, request, fileTargetDescriptor(target));\n }\n\n async resolveFile(\n targetPath: string,\n fragment: string | null,\n request: MarkdownLocalResolutionRequest,\n target: MarkdownSafeTargetDescriptor\n ): Promise<MarkdownLocalResolution> {\n if (fragment === null || !request.validateCrossDocumentAnchors) {\n return valid(target);\n }\n if (!isMarkdownPath(targetPath)) {\n return finding(\"anchor-target-not-markdown\", target);\n }\n\n const targetMarkdown = await readRegularFile(targetPath, request.maxMarkdownBytes);\n if (!targetMarkdown.ok) {\n return unavailable(\"target-unavailable\");\n }\n let decodedTarget: string;\n try {\n decodedTarget = new TextDecoder(\"utf-8\", { fatal: true }).decode(targetMarkdown.bytes);\n } catch {\n return unavailable(\"target-unavailable\");\n }\n const parsedTarget = parseMarkdownLinkFacts(decodedTarget);\n if (!parsedTarget.ok) {\n return unavailable(\"target-unavailable\");\n }\n return anchorResolution(parsedTarget.facts.headings, fragment, target);\n }\n\n async resolveDirectory(\n targetPath: string,\n fragment: string | null,\n request: MarkdownLocalResolutionRequest,\n target: MarkdownSafeTargetDescriptor\n ): Promise<MarkdownLocalResolution> {\n if (fragment !== null) {\n return finding(\"anchor-on-directory\", target);\n }\n if (!request.requireNonEmptyDirectories) {\n return valid(target);\n }\n try {\n const directory = await opendir(targetPath);\n try {\n return (await directory.read()) === null\n ? finding(\"empty-directory\", target)\n : valid(target);\n } finally {\n await directory.close();\n }\n } catch {\n return unavailable(\"target-unavailable\");\n }\n }\n\n beginTargetValidation(): boolean {\n if (this.#targetReadCount >= this.#maxTargetReads) {\n return false;\n }\n this.#targetReadCount += 1;\n return true;\n }\n\n resolveSameDocument(\n fragment: string | null,\n request: MarkdownLocalResolutionRequest\n ): MarkdownLocalResolution {\n const target = Object.freeze({\n kind: \"same-document\" as const,\n path: request.source.path,\n fragment\n });\n if (fragment === null || !request.validateSameDocumentAnchors) {\n return valid(target);\n }\n return anchorResolution(request.source.facts.headings, fragment, target);\n }\n}\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { toSlashPath } from "./local-resolution.mjs";
|
|
3
|
+
export function projectTarget(canonicalProjectRoot, targetPath, fragment, kind = "project-path") {
|
|
4
|
+
return Object.freeze({
|
|
5
|
+
kind,
|
|
6
|
+
path: toSlashPath(path.relative(canonicalProjectRoot, targetPath)),
|
|
7
|
+
fragment
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
export function outsideProjectRootTarget() {
|
|
11
|
+
return Object.freeze({ kind: "outside-project-root" });
|
|
12
|
+
}
|
|
13
|
+
export function fileTargetDescriptor(target) {
|
|
14
|
+
if (target.kind === "outside-project-root")
|
|
15
|
+
return target;
|
|
16
|
+
return Object.freeze({ ...target, kind: "project-file" });
|
|
17
|
+
}
|
|
18
|
+
export function directoryTarget(target) {
|
|
19
|
+
if (target.kind === "outside-project-root")
|
|
20
|
+
return target;
|
|
21
|
+
return Object.freeze({ ...target, kind: "project-directory" });
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=target-descriptor.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"target-descriptor.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/target-descriptor.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,WAAW,EAAqC,MAAM,uBAAuB,CAAC;AAEvF,MAAM,UAAU,aAAa,CAC3B,oBAA4B,EAC5B,UAAkB,EAClB,QAAuB,EACvB,IAAI,GAA0D,cAAc;IAE5E,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI;QACJ,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAC;QAClE,QAAQ;KACT,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,sBAA+B,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,MAAoC;IAEpC,IAAI,MAAM,CAAC,IAAI,KAAK,sBAAsB;QAAE,OAAO,MAAM,CAAC;IAC1D,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,cAAuB,EAAE,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,MAAoC;IAEpC,IAAI,MAAM,CAAC,IAAI,KAAK,sBAAsB;QAAE,OAAO,MAAM,CAAC;IAC1D,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,mBAA4B,EAAE,CAAC,CAAC;AAC1E,CAAC","sourcesContent":["import path from \"node:path\";\n\nimport { toSlashPath, type MarkdownSafeTargetDescriptor } from \"./local-resolution.ts\";\n\nexport function projectTarget(\n canonicalProjectRoot: string,\n targetPath: string,\n fragment: string | null,\n kind: \"project-directory\" | \"project-file\" | \"project-path\" = \"project-path\"\n): MarkdownSafeTargetDescriptor {\n return Object.freeze({\n kind,\n path: toSlashPath(path.relative(canonicalProjectRoot, targetPath)),\n fragment\n });\n}\n\nexport function outsideProjectRootTarget(): MarkdownSafeTargetDescriptor {\n return Object.freeze({ kind: \"outside-project-root\" as const });\n}\n\nexport function fileTargetDescriptor(\n target: MarkdownSafeTargetDescriptor\n): MarkdownSafeTargetDescriptor {\n if (target.kind === \"outside-project-root\") return target;\n return Object.freeze({ ...target, kind: \"project-file\" as const });\n}\n\nexport function directoryTarget(\n target: MarkdownSafeTargetDescriptor\n): MarkdownSafeTargetDescriptor {\n if (target.kind === \"outside-project-root\") return target;\n return Object.freeze({ ...target, kind: \"project-directory\" as const });\n}\n"]}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/** Materializes one completed source traversal into its Check-owned final result. */
|
|
2
|
+
export function settledMarkdownTraversalResult(input) {
|
|
3
|
+
const data = Object.freeze({
|
|
4
|
+
sourceFileCount: input.sourceFileCount,
|
|
5
|
+
occurrenceCount: input.occurrenceCount,
|
|
6
|
+
targetReadCount: input.targetReadCount,
|
|
7
|
+
findingCount: input.findingCount + input.rejectedInputCount,
|
|
8
|
+
rejectedInputCount: input.rejectedInputCount
|
|
9
|
+
});
|
|
10
|
+
const messages = [];
|
|
11
|
+
if (input.findingCount > 0)
|
|
12
|
+
messages.push(linkFindingMessage(input));
|
|
13
|
+
if (input.rejectedInputCount > 0)
|
|
14
|
+
messages.push(rejectedInputMessage(input.rejectedInputCount));
|
|
15
|
+
if (messages.length === 0)
|
|
16
|
+
return Object.freeze({ data, status: "passed" });
|
|
17
|
+
const isBlocking = input.findingPolicy === "blocking";
|
|
18
|
+
return Object.freeze({
|
|
19
|
+
data,
|
|
20
|
+
messages: Object.freeze(messages),
|
|
21
|
+
status: isBlocking && input.findingCount > 0 ? "failed" : "passed"
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
function linkFindingMessage(input) {
|
|
25
|
+
const isBlocking = input.findingPolicy === "blocking";
|
|
26
|
+
return Object.freeze({
|
|
27
|
+
code: "invalid-local-links",
|
|
28
|
+
level: isBlocking ? "error" : "warning",
|
|
29
|
+
message: isBlocking
|
|
30
|
+
? `${input.findingCount} local Markdown link finding(s) require attention; inspect this Check's Records for source ranges, targets, and reasons.`
|
|
31
|
+
: `${input.findingCount} local Markdown link finding(s) were recorded as non-blocking; inspect this Check's Records for source ranges, targets, and reasons.`
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
function rejectedInputMessage(rejectedInputCount) {
|
|
35
|
+
return Object.freeze({
|
|
36
|
+
code: "input-rejected",
|
|
37
|
+
level: "warning",
|
|
38
|
+
message: `${rejectedInputCount} selected markdownLinkValidation input file(s) were rejected because only .md/.markdown paths are supported; inspect this Check's Records and narrow files.include/exclude.`
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=traversal-result.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traversal-result.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/traversal-result.ts"],"names":[],"mappings":"AAKA,qFAAqF;AACrF,MAAM,UAAU,8BAA8B,CAC5C,KAOE;IAEF,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;QACzB,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,YAAY,EAAE,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,kBAAkB;QAC3D,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;KAC7C,CAAC,CAAC;IACH,MAAM,QAAQ,GAAmB,EAAE,CAAC;IACpC,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC;QAAE,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;IACrE,IAAI,KAAK,CAAC,kBAAkB,GAAG,CAAC;QAAE,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAChG,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC5E,MAAM,UAAU,GAAG,KAAK,CAAC,aAAa,KAAK,UAAU,CAAC;IACtD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI;QACJ,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;QACjC,MAAM,EAAE,UAAU,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;KACnE,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CACzB,KAGE;IAEF,MAAM,UAAU,GAAG,KAAK,CAAC,aAAa,KAAK,UAAU,CAAC;IACtD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,qBAAqB;QAC3B,KAAK,EAAE,UAAU,CAAC,CAAC,CAAE,OAAiB,CAAC,CAAC,CAAE,SAAmB;QAC7D,OAAO,EAAE,UAAU;YACjB,CAAC,CAAC,GAAG,KAAK,CAAC,YAAY,0HAA0H;YACjJ,CAAC,CAAC,GAAG,KAAK,CAAC,YAAY,sIAAsI;KAChK,CAAC,CAAC;AACL,CAAC;AAED,SAAS,oBAAoB,CAAC,kBAA0B;IACtD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,SAAkB;QACzB,OAAO,EAAE,GAAG,kBAAkB,6KAA6K;KAC5M,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { CheckMessage, CheckResult } from \"../../check/check.ts\";\n\nimport type { MarkdownLinkValidationFinalData } from \"./final-data.ts\";\nimport type { ResolvedMarkdownLinkValidationOptions } from \"./options.ts\";\n\n/** Materializes one completed source traversal into its Check-owned final result. */\nexport function settledMarkdownTraversalResult(\n input: Readonly<{\n readonly findingCount: number;\n readonly findingPolicy: ResolvedMarkdownLinkValidationOptions[\"findingPolicy\"];\n readonly occurrenceCount: number;\n readonly rejectedInputCount: number;\n readonly sourceFileCount: number;\n readonly targetReadCount: number;\n }>\n): CheckResult<MarkdownLinkValidationFinalData> {\n const data = Object.freeze({\n sourceFileCount: input.sourceFileCount,\n occurrenceCount: input.occurrenceCount,\n targetReadCount: input.targetReadCount,\n findingCount: input.findingCount + input.rejectedInputCount,\n rejectedInputCount: input.rejectedInputCount\n });\n const messages: CheckMessage[] = [];\n if (input.findingCount > 0) messages.push(linkFindingMessage(input));\n if (input.rejectedInputCount > 0) messages.push(rejectedInputMessage(input.rejectedInputCount));\n if (messages.length === 0) return Object.freeze({ data, status: \"passed\" });\n const isBlocking = input.findingPolicy === \"blocking\";\n return Object.freeze({\n data,\n messages: Object.freeze(messages),\n status: isBlocking && input.findingCount > 0 ? \"failed\" : \"passed\"\n });\n}\n\nfunction linkFindingMessage(\n input: Readonly<{\n readonly findingCount: number;\n readonly findingPolicy: ResolvedMarkdownLinkValidationOptions[\"findingPolicy\"];\n }>\n): CheckMessage {\n const isBlocking = input.findingPolicy === \"blocking\";\n return Object.freeze({\n code: \"invalid-local-links\",\n level: isBlocking ? (\"error\" as const) : (\"warning\" as const),\n message: isBlocking\n ? `${input.findingCount} local Markdown link finding(s) require attention; inspect this Check's Records for source ranges, targets, and reasons.`\n : `${input.findingCount} local Markdown link finding(s) were recorded as non-blocking; inspect this Check's Records for source ranges, targets, and reasons.`\n });\n}\n\nfunction rejectedInputMessage(rejectedInputCount: number): CheckMessage {\n return Object.freeze({\n code: \"input-rejected\",\n level: \"warning\" as const,\n message: `${rejectedInputCount} selected markdownLinkValidation input file(s) were rejected because only .md/.markdown paths are supported; inspect this Check's Records and narrow files.include/exclude.`\n });\n}\n"]}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/** Project-root file discovery and selection helpers. */
|
|
2
|
+
import { lstatSync } from "node:fs";
|
|
3
|
+
import { resolve } from "node:path";
|
|
4
|
+
import { matchesAnyConfigGlob } from "./config-glob.mjs";
|
|
5
|
+
import { collectSubmoduleWorktreeFiles } from "./revision-worktree-files.mjs";
|
|
6
|
+
import { errorMessage } from "../host-environment/error-message.mjs";
|
|
7
|
+
import { processFailed } from "../host-environment/process/command.mjs";
|
|
8
|
+
import { runGit, splitNulDelimitedGitFileList } from "../host-environment/git.mjs";
|
|
9
|
+
import { toSlashPath } from "../host-environment/path.mjs";
|
|
10
|
+
import { walkFiles } from "../host-environment/filesystem.mjs";
|
|
11
|
+
const CONFIG_GLOB_MAGIC = /[\\*?[\]{}()!+@]/u;
|
|
12
|
+
/**
|
|
13
|
+
* Resolves multiple named file sets while enumerating each distinct candidate source once.
|
|
14
|
+
*/
|
|
15
|
+
export function collectProjectFileSets(rootDir, selections) {
|
|
16
|
+
const bySource = groupSelectionsBySource(selections);
|
|
17
|
+
const selectedFiles = new Map();
|
|
18
|
+
for (const [source, sourceSelections] of bySource) {
|
|
19
|
+
const candidates = collectSourceCandidates(rootDir, source, sourceSelections);
|
|
20
|
+
for (const { id, selection } of sourceSelections) {
|
|
21
|
+
selectedFiles.set(id, Object.freeze(filterProjectFiles(candidates, selection)));
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return selectedFiles;
|
|
25
|
+
}
|
|
26
|
+
export function collectProjectFiles(rootDir, selection) {
|
|
27
|
+
return [...requireProjectFileSet(collectProjectFileSets(rootDir, { selection }), "selection")];
|
|
28
|
+
}
|
|
29
|
+
/** 返回已收集的命名文件集合;缺失表示收集完整性失效,不能解释为空集合。 */
|
|
30
|
+
export function requireProjectFileSet(fileSets, selectionId) {
|
|
31
|
+
const selectedFiles = fileSets.get(selectionId);
|
|
32
|
+
if (selectedFiles === undefined) {
|
|
33
|
+
throw new Error(`project file collection did not produce selection ${selectionId}`);
|
|
34
|
+
}
|
|
35
|
+
return selectedFiles;
|
|
36
|
+
}
|
|
37
|
+
function groupSelectionsBySource(selections) {
|
|
38
|
+
const mutableGroups = new Map();
|
|
39
|
+
const entries = Object.entries(selections).sort(([left], [right]) => compareText(left, right));
|
|
40
|
+
for (const [id, selection] of entries) {
|
|
41
|
+
const group = mutableGroups.get(selection.source) ?? [];
|
|
42
|
+
group.push({ id, selection });
|
|
43
|
+
mutableGroups.set(selection.source, group);
|
|
44
|
+
}
|
|
45
|
+
return new Map([...mutableGroups].map(([source, group]) => [source, Object.freeze(group)]));
|
|
46
|
+
}
|
|
47
|
+
function collectSourceCandidates(rootDir, source, selections) {
|
|
48
|
+
switch (source) {
|
|
49
|
+
case "filesystem":
|
|
50
|
+
return uniqueSorted(walkFiles({
|
|
51
|
+
ignoredDirs: commonExcludedDirectoryNames(selections),
|
|
52
|
+
rootDir
|
|
53
|
+
}).map(toSlashPath));
|
|
54
|
+
case "git-worktree":
|
|
55
|
+
return collectGitWorktreeCandidates(rootDir, selections);
|
|
56
|
+
default: {
|
|
57
|
+
const unsupportedSource = source;
|
|
58
|
+
throw new TypeError(`unsupported project file source: ${String(unsupportedSource)}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function collectGitWorktreeCandidates(rootDir, selections) {
|
|
63
|
+
const result = runGit({
|
|
64
|
+
args: ["ls-files", "-z", "--cached", "--others", "--exclude-standard", "--"],
|
|
65
|
+
cwd: rootDir
|
|
66
|
+
});
|
|
67
|
+
if (processFailed(result)) {
|
|
68
|
+
const detail = result.stderr.trim() ||
|
|
69
|
+
result.error?.message ||
|
|
70
|
+
(result.signal === null ? `exit status ${result.status}` : `signal ${result.signal}`);
|
|
71
|
+
throw new Error(`could not enumerate git-worktree files in ${rootDir}: ${detail}`);
|
|
72
|
+
}
|
|
73
|
+
const include = uniqueSorted(selections.flatMap(({ selection }) => [...selection.include]));
|
|
74
|
+
return uniqueSorted([
|
|
75
|
+
...splitNulDelimitedGitFileList(result.stdout),
|
|
76
|
+
...collectSubmoduleWorktreeFiles({ repository: rootDir, scanInputPaths: include })
|
|
77
|
+
]
|
|
78
|
+
.map(toSlashPath)
|
|
79
|
+
.filter((filePath) => isGitWorktreeFile({ filePath, rootDir })));
|
|
80
|
+
}
|
|
81
|
+
function isGitWorktreeFile({ filePath, rootDir }) {
|
|
82
|
+
try {
|
|
83
|
+
const stats = lstatSync(resolve(rootDir, filePath));
|
|
84
|
+
return stats.isFile() || stats.isSymbolicLink();
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
if (missingPath(error))
|
|
88
|
+
return false;
|
|
89
|
+
throw new Error(`could not inspect git-worktree candidate ${filePath} in ${rootDir}: ${errorMessage(error)}`, { cause: error });
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function missingPath(error) {
|
|
93
|
+
const code = error instanceof Error && "code" in error ? error.code : undefined;
|
|
94
|
+
return code === "ENOENT" || code === "ENOTDIR";
|
|
95
|
+
}
|
|
96
|
+
function filterProjectFiles(candidates, selection) {
|
|
97
|
+
return uniqueSorted(candidates.filter((filePath) => isProjectFile(filePath, selection)));
|
|
98
|
+
}
|
|
99
|
+
function isProjectFile(filePath, selection) {
|
|
100
|
+
const normalized = toSlashPath(filePath);
|
|
101
|
+
return (matchesAnyConfigGlob(normalized, selection.include) &&
|
|
102
|
+
!matchesAnyConfigGlob(normalized, selection.exclude));
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Recognizes only whole-directory exclusions with one literal directory segment. The
|
|
106
|
+
* intersection is a traversal optimization; public semantics remain in `isProjectFile`.
|
|
107
|
+
*/
|
|
108
|
+
function commonExcludedDirectoryNames(selections) {
|
|
109
|
+
let common;
|
|
110
|
+
for (const { selection } of selections) {
|
|
111
|
+
const names = new Set(selection.exclude.map(literalExcludedDirectoryName).filter(isString));
|
|
112
|
+
common =
|
|
113
|
+
common === undefined
|
|
114
|
+
? names
|
|
115
|
+
: new Set([...common].filter((directoryName) => names.has(directoryName)));
|
|
116
|
+
}
|
|
117
|
+
return common === undefined ? [] : [...common].sort();
|
|
118
|
+
}
|
|
119
|
+
function literalExcludedDirectoryName(configGlob) {
|
|
120
|
+
const prefix = "**/";
|
|
121
|
+
const suffix = "/**";
|
|
122
|
+
if (!configGlob.startsWith(prefix) || !configGlob.endsWith(suffix))
|
|
123
|
+
return undefined;
|
|
124
|
+
const directoryName = configGlob.slice(prefix.length, -suffix.length);
|
|
125
|
+
if (directoryName.length === 0 || directoryName.includes("/"))
|
|
126
|
+
return undefined;
|
|
127
|
+
return CONFIG_GLOB_MAGIC.test(directoryName) ? undefined : directoryName;
|
|
128
|
+
}
|
|
129
|
+
function isString(value) {
|
|
130
|
+
return value !== undefined;
|
|
131
|
+
}
|
|
132
|
+
function uniqueSorted(files) {
|
|
133
|
+
return [...new Set(files)].sort(compareText);
|
|
134
|
+
}
|
|
135
|
+
function compareText(left, right) {
|
|
136
|
+
if (left < right)
|
|
137
|
+
return -1;
|
|
138
|
+
if (left > right)
|
|
139
|
+
return 1;
|
|
140
|
+
return 0;
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=collection.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collection.mjs","sourceRoot":"","sources":["../../../../src/package-checks/project-files/collection.ts"],"names":[],"mappings":"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","sourcesContent":["/** Project-root file discovery and selection helpers. */\n\nimport { lstatSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\nimport { matchesAnyConfigGlob } from \"./config-glob.ts\";\nimport { collectSubmoduleWorktreeFiles } from \"./revision-worktree-files.ts\";\nimport { errorMessage } from \"../host-environment/error-message.ts\";\nimport { processFailed } from \"../host-environment/process/command.ts\";\nimport { runGit, splitNulDelimitedGitFileList } from \"../host-environment/git.ts\";\nimport { toSlashPath } from \"../host-environment/path.ts\";\nimport { walkFiles } from \"../host-environment/filesystem.ts\";\nimport type { ProjectFileSelection, ProjectFileSource } from \"./configuration.ts\";\n\ntype NamedProjectFileSelection = Readonly<{\n readonly id: string;\n readonly selection: ProjectFileSelection;\n}>;\n\nconst CONFIG_GLOB_MAGIC = /[\\\\*?[\\]{}()!+@]/u;\n\n/**\n * Resolves multiple named file sets while enumerating each distinct candidate source once.\n */\nexport function collectProjectFileSets(\n rootDir: string,\n selections: Readonly<Record<string, ProjectFileSelection>>\n): ReadonlyMap<string, readonly string[]> {\n const bySource = groupSelectionsBySource(selections);\n const selectedFiles = new Map<string, readonly string[]>();\n\n for (const [source, sourceSelections] of bySource) {\n const candidates = collectSourceCandidates(rootDir, source, sourceSelections);\n for (const { id, selection } of sourceSelections) {\n selectedFiles.set(id, Object.freeze(filterProjectFiles(candidates, selection)));\n }\n }\n\n return selectedFiles;\n}\n\nexport function collectProjectFiles(rootDir: string, selection: ProjectFileSelection): string[] {\n return [...requireProjectFileSet(collectProjectFileSets(rootDir, { selection }), \"selection\")];\n}\n\n/** 返回已收集的命名文件集合;缺失表示收集完整性失效,不能解释为空集合。 */\nexport function requireProjectFileSet(\n fileSets: ReadonlyMap<string, readonly string[]>,\n selectionId: string\n): readonly string[] {\n const selectedFiles = fileSets.get(selectionId);\n if (selectedFiles === undefined) {\n throw new Error(`project file collection did not produce selection ${selectionId}`);\n }\n return selectedFiles;\n}\n\nfunction groupSelectionsBySource(\n selections: Readonly<Record<string, ProjectFileSelection>>\n): ReadonlyMap<ProjectFileSource, readonly NamedProjectFileSelection[]> {\n const mutableGroups = new Map<ProjectFileSource, NamedProjectFileSelection[]>();\n const entries = Object.entries(selections).sort(([left], [right]) => compareText(left, right));\n\n for (const [id, selection] of entries) {\n const group = mutableGroups.get(selection.source) ?? [];\n group.push({ id, selection });\n mutableGroups.set(selection.source, group);\n }\n\n return new Map(\n [...mutableGroups].map(([source, group]) => [source, Object.freeze(group)] as const)\n );\n}\n\nfunction collectSourceCandidates(\n rootDir: string,\n source: ProjectFileSource,\n selections: readonly NamedProjectFileSelection[]\n): readonly string[] {\n switch (source) {\n case \"filesystem\":\n return uniqueSorted(\n walkFiles({\n ignoredDirs: commonExcludedDirectoryNames(selections),\n rootDir\n }).map(toSlashPath)\n );\n case \"git-worktree\":\n return collectGitWorktreeCandidates(rootDir, selections);\n default: {\n const unsupportedSource: never = source;\n throw new TypeError(`unsupported project file source: ${String(unsupportedSource)}`);\n }\n }\n}\n\nfunction collectGitWorktreeCandidates(\n rootDir: string,\n selections: readonly NamedProjectFileSelection[]\n): readonly string[] {\n const result = runGit({\n args: [\"ls-files\", \"-z\", \"--cached\", \"--others\", \"--exclude-standard\", \"--\"],\n cwd: rootDir\n });\n if (processFailed(result)) {\n const detail =\n result.stderr.trim() ||\n result.error?.message ||\n (result.signal === null ? `exit status ${result.status}` : `signal ${result.signal}`);\n throw new Error(`could not enumerate git-worktree files in ${rootDir}: ${detail}`);\n }\n\n const include = uniqueSorted(selections.flatMap(({ selection }) => [...selection.include]));\n return uniqueSorted(\n [\n ...splitNulDelimitedGitFileList(result.stdout),\n ...collectSubmoduleWorktreeFiles({ repository: rootDir, scanInputPaths: include })\n ]\n .map(toSlashPath)\n .filter((filePath) => isGitWorktreeFile({ filePath, rootDir }))\n );\n}\n\nfunction isGitWorktreeFile({\n filePath,\n rootDir\n}: Readonly<{ readonly filePath: string; readonly rootDir: string }>): boolean {\n try {\n const stats = lstatSync(resolve(rootDir, filePath));\n return stats.isFile() || stats.isSymbolicLink();\n } catch (error: unknown) {\n if (missingPath(error)) return false;\n throw new Error(\n `could not inspect git-worktree candidate ${filePath} in ${rootDir}: ${errorMessage(error)}`,\n { cause: error }\n );\n }\n}\n\nfunction missingPath(error: unknown): boolean {\n const code = error instanceof Error && \"code\" in error ? error.code : undefined;\n return code === \"ENOENT\" || code === \"ENOTDIR\";\n}\n\nfunction filterProjectFiles(\n candidates: readonly string[],\n selection: ProjectFileSelection\n): string[] {\n return uniqueSorted(candidates.filter((filePath) => isProjectFile(filePath, selection)));\n}\n\nfunction isProjectFile(filePath: string, selection: ProjectFileSelection): boolean {\n const normalized = toSlashPath(filePath);\n return (\n matchesAnyConfigGlob(normalized, selection.include) &&\n !matchesAnyConfigGlob(normalized, selection.exclude)\n );\n}\n\n/**\n * Recognizes only whole-directory exclusions with one literal directory segment. The\n * intersection is a traversal optimization; public semantics remain in `isProjectFile`.\n */\nfunction commonExcludedDirectoryNames(\n selections: readonly NamedProjectFileSelection[]\n): readonly string[] {\n let common: Set<string> | undefined;\n for (const { selection } of selections) {\n const names = new Set(selection.exclude.map(literalExcludedDirectoryName).filter(isString));\n common =\n common === undefined\n ? names\n : new Set([...common].filter((directoryName) => names.has(directoryName)));\n }\n return common === undefined ? [] : [...common].sort();\n}\n\nfunction literalExcludedDirectoryName(configGlob: string): string | undefined {\n const prefix = \"**/\";\n const suffix = \"/**\";\n if (!configGlob.startsWith(prefix) || !configGlob.endsWith(suffix)) return undefined;\n const directoryName = configGlob.slice(prefix.length, -suffix.length);\n if (directoryName.length === 0 || directoryName.includes(\"/\")) return undefined;\n return CONFIG_GLOB_MAGIC.test(directoryName) ? undefined : directoryName;\n}\n\nfunction isString(value: string | undefined): value is string {\n return value !== undefined;\n}\n\nfunction uniqueSorted(files: readonly string[]): string[] {\n return [...new Set(files)].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"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { minimatch } from "minimatch";
|
|
2
|
+
import { toSlashPath } from "../host-environment/path.mjs";
|
|
3
|
+
/**
|
|
4
|
+
* Product config glob 的唯一 matcher boundary。
|
|
5
|
+
* Candidate 使用 slash form;dot path 只由显式 glob 决定,不附加隐式忽略规则。
|
|
6
|
+
*/
|
|
7
|
+
export function matchesAnyConfigGlob(candidatePath, configGlobs) {
|
|
8
|
+
const normalizedCandidatePath = toSlashPath(candidatePath);
|
|
9
|
+
return configGlobs.some((configGlob) => minimatch(normalizedCandidatePath, configGlob, { dot: true }));
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=config-glob.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-glob.mjs","sourceRoot":"","sources":["../../../../src/package-checks/project-files/config-glob.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE1D;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,aAAqB,EACrB,WAA8B;IAE9B,MAAM,uBAAuB,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC;IAC3D,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CACrC,SAAS,CAAC,uBAAuB,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAC9D,CAAC;AACJ,CAAC","sourcesContent":["import { minimatch } from \"minimatch\";\n\nimport { toSlashPath } from \"../host-environment/path.ts\";\n\n/**\n * Product config glob 的唯一 matcher boundary。\n * Candidate 使用 slash form;dot path 只由显式 glob 决定,不附加隐式忽略规则。\n */\nexport function matchesAnyConfigGlob(\n candidatePath: string,\n configGlobs: readonly string[]\n): boolean {\n const normalizedCandidatePath = toSlashPath(candidatePath);\n return configGlobs.some((configGlob) =>\n minimatch(normalizedCandidatePath, configGlob, { dot: true })\n );\n}\n"]}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { hasRequiredAndOptionalRecordKeys, snapshotClosedArray, snapshotClosedRecord } from "../../data-boundary/closed-values.mjs";
|
|
2
|
+
export const PROJECT_FILE_SOURCES = Object.freeze(["filesystem", "git-worktree"]);
|
|
3
|
+
/**
|
|
4
|
+
* Package-provided Checks 共用的通用文件选择基线。
|
|
5
|
+
*
|
|
6
|
+
* 对象与数组均不可变;需要保留默认排除并追加项目规则时,使用对象与数组 spread 建立新值。
|
|
7
|
+
* 个别 Check 会从此 baseline 派生更精准的默认 include;显式组合此 value 仍表示通配全部路径。
|
|
8
|
+
*/
|
|
9
|
+
export const defaultProjectFileSelection = deepFreeze({
|
|
10
|
+
exclude: [
|
|
11
|
+
"**/.cache/**",
|
|
12
|
+
"**/.git",
|
|
13
|
+
"**/.git/**",
|
|
14
|
+
"**/.log/**",
|
|
15
|
+
"**/.pytest_cache/**",
|
|
16
|
+
"**/.tmp/**",
|
|
17
|
+
"**/.venv/**",
|
|
18
|
+
"**/.vibe-check/**",
|
|
19
|
+
"**/__pycache__/**",
|
|
20
|
+
"**/artifacts/**",
|
|
21
|
+
"**/build/**",
|
|
22
|
+
"**/coverage/**",
|
|
23
|
+
"**/dist/**",
|
|
24
|
+
"**/generated/**",
|
|
25
|
+
"**/*.generated.*",
|
|
26
|
+
"**/node_modules/**",
|
|
27
|
+
"**/target/**",
|
|
28
|
+
"**/tmp/**",
|
|
29
|
+
"**/vendor/**",
|
|
30
|
+
"**/venv/**"
|
|
31
|
+
],
|
|
32
|
+
include: ["**/*"],
|
|
33
|
+
source: "filesystem"
|
|
34
|
+
});
|
|
35
|
+
/** 按 owning Check 提供的可信完整 defaults 解析并冻结一份 authoring selection。 */
|
|
36
|
+
export function resolveProjectFileSelection(value, defaults = defaultProjectFileSelection) {
|
|
37
|
+
const selection = snapshotClosedRecord(value);
|
|
38
|
+
if (selection === undefined ||
|
|
39
|
+
!hasRequiredAndOptionalRecordKeys(selection, {
|
|
40
|
+
optional: ["exclude", "include", "source"],
|
|
41
|
+
required: []
|
|
42
|
+
})) {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
const exclude = resolveStringArray(selection.exclude, defaults.exclude);
|
|
46
|
+
const include = resolveStringArray(selection.include, defaults.include);
|
|
47
|
+
const source = selection.source ?? defaults.source;
|
|
48
|
+
if (exclude === undefined || include === undefined || !isProjectFileSource(source)) {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
return Object.freeze({ exclude, include, source });
|
|
52
|
+
}
|
|
53
|
+
export function snapshotDefaultProjectFileSelection() {
|
|
54
|
+
return snapshotProjectFileSelection(defaultProjectFileSelection);
|
|
55
|
+
}
|
|
56
|
+
/** 为 owning Check 对可信的完整 selection 建立 detached、冻结快照。 */
|
|
57
|
+
export function snapshotProjectFileSelection(selection) {
|
|
58
|
+
return Object.freeze({
|
|
59
|
+
exclude: Object.freeze([...selection.exclude]),
|
|
60
|
+
include: Object.freeze([...selection.include]),
|
|
61
|
+
source: selection.source
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
export function validProjectFileSelection(value) {
|
|
65
|
+
const selection = exactRecord(value, ["exclude", "include", "source"]);
|
|
66
|
+
return (selection !== undefined &&
|
|
67
|
+
validStringArray(selection.exclude) &&
|
|
68
|
+
validStringArray(selection.include) &&
|
|
69
|
+
isProjectFileSource(selection.source));
|
|
70
|
+
}
|
|
71
|
+
function isProjectFileSource(value) {
|
|
72
|
+
return PROJECT_FILE_SOURCES.some((source) => source === value);
|
|
73
|
+
}
|
|
74
|
+
function resolveStringArray(value, fallback) {
|
|
75
|
+
if (value === undefined)
|
|
76
|
+
return Object.freeze([...fallback]);
|
|
77
|
+
const items = snapshotClosedArray(value);
|
|
78
|
+
if (items === undefined || !items.every(isString))
|
|
79
|
+
return undefined;
|
|
80
|
+
return Object.freeze([...items]);
|
|
81
|
+
}
|
|
82
|
+
function validStringArray(value) {
|
|
83
|
+
const items = snapshotClosedArray(value);
|
|
84
|
+
return items !== undefined && items.every(isString);
|
|
85
|
+
}
|
|
86
|
+
function isString(value) {
|
|
87
|
+
return typeof value === "string";
|
|
88
|
+
}
|
|
89
|
+
function exactRecord(value, keys) {
|
|
90
|
+
const record = snapshotClosedRecord(value);
|
|
91
|
+
return record !== undefined &&
|
|
92
|
+
Object.keys(record).length === keys.length &&
|
|
93
|
+
keys.every((key) => Object.hasOwn(record, key))
|
|
94
|
+
? record
|
|
95
|
+
: undefined;
|
|
96
|
+
}
|
|
97
|
+
function deepFreeze(value) {
|
|
98
|
+
if (typeof value !== "object" || value === null || Object.isFrozen(value))
|
|
99
|
+
return value;
|
|
100
|
+
for (const nested of Object.values(value))
|
|
101
|
+
deepFreeze(nested);
|
|
102
|
+
return Object.freeze(value);
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=configuration.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configuration.mjs","sourceRoot":"","sources":["../../../../src/package-checks/project-files/configuration.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n hasRequiredAndOptionalRecordKeys,\n snapshotClosedArray,\n snapshotClosedRecord\n} from \"../../data-boundary/closed-values.ts\";\n\nexport const PROJECT_FILE_SOURCES = Object.freeze([\"filesystem\", \"git-worktree\"] as const);\n\n/** 文件选择可使用的显式候选来源。 */\nexport type ProjectFileSource = (typeof PROJECT_FILE_SOURCES)[number];\n\n/** 读取项目文件的 Check 所拥有的文件选择输入。 */\nexport interface ProjectFileSelectionOptions {\n /** 候选文件来源;省略时使用 owning Check 的来源默认值,当前随包 Check 均为 `filesystem`。 */\n readonly source?: ProjectFileSource;\n /** 相对项目根目录且使用 `/` 的 glob;省略时使用 owning Check 的 include 默认值,显式数组完整替换。 */\n readonly include?: readonly string[];\n /** 优先于 `include` 的 glob;省略时使用 owning Check 的 exclude 默认值,显式数组完整替换。 */\n readonly exclude?: readonly string[];\n}\n\n/** Check execution 消费的完整项目文件选择。 */\nexport interface ProjectFileSelection {\n readonly exclude: readonly string[];\n readonly include: readonly string[];\n readonly source: ProjectFileSource;\n}\n\n/**\n * Package-provided Checks 共用的通用文件选择基线。\n *\n * 对象与数组均不可变;需要保留默认排除并追加项目规则时,使用对象与数组 spread 建立新值。\n * 个别 Check 会从此 baseline 派生更精准的默认 include;显式组合此 value 仍表示通配全部路径。\n */\nexport const defaultProjectFileSelection: ProjectFileSelection = deepFreeze({\n exclude: [\n \"**/.cache/**\",\n \"**/.git\",\n \"**/.git/**\",\n \"**/.log/**\",\n \"**/.pytest_cache/**\",\n \"**/.tmp/**\",\n \"**/.venv/**\",\n \"**/.vibe-check/**\",\n \"**/__pycache__/**\",\n \"**/artifacts/**\",\n \"**/build/**\",\n \"**/coverage/**\",\n \"**/dist/**\",\n \"**/generated/**\",\n \"**/*.generated.*\",\n \"**/node_modules/**\",\n \"**/target/**\",\n \"**/tmp/**\",\n \"**/vendor/**\",\n \"**/venv/**\"\n ],\n include: [\"**/*\"],\n source: \"filesystem\"\n});\n\n/** 按 owning Check 提供的可信完整 defaults 解析并冻结一份 authoring selection。 */\nexport function resolveProjectFileSelection(\n value: unknown,\n defaults: ProjectFileSelection = defaultProjectFileSelection\n): ProjectFileSelection | undefined {\n const selection = snapshotClosedRecord(value);\n if (\n selection === undefined ||\n !hasRequiredAndOptionalRecordKeys(selection, {\n optional: [\"exclude\", \"include\", \"source\"],\n required: []\n })\n ) {\n return undefined;\n }\n\n const exclude = resolveStringArray(selection.exclude, defaults.exclude);\n const include = resolveStringArray(selection.include, defaults.include);\n const source = selection.source ?? defaults.source;\n if (exclude === undefined || include === undefined || !isProjectFileSource(source)) {\n return undefined;\n }\n\n return Object.freeze({ exclude, include, source });\n}\n\nexport function snapshotDefaultProjectFileSelection(): ProjectFileSelection {\n return snapshotProjectFileSelection(defaultProjectFileSelection);\n}\n\n/** 为 owning Check 对可信的完整 selection 建立 detached、冻结快照。 */\nexport function snapshotProjectFileSelection(\n selection: ProjectFileSelection\n): ProjectFileSelection {\n return Object.freeze({\n exclude: Object.freeze([...selection.exclude]),\n include: Object.freeze([...selection.include]),\n source: selection.source\n });\n}\n\nexport function validProjectFileSelection(value: unknown): value is ProjectFileSelection {\n const selection = exactRecord(value, [\"exclude\", \"include\", \"source\"]);\n return (\n selection !== undefined &&\n validStringArray(selection.exclude) &&\n validStringArray(selection.include) &&\n isProjectFileSource(selection.source)\n );\n}\n\nfunction isProjectFileSource(value: unknown): value is ProjectFileSource {\n return PROJECT_FILE_SOURCES.some((source) => source === value);\n}\n\nfunction resolveStringArray(\n value: unknown,\n fallback: readonly string[]\n): readonly string[] | undefined {\n if (value === undefined) return Object.freeze([...fallback]);\n const items = snapshotClosedArray(value);\n if (items === undefined || !items.every(isString)) return undefined;\n return Object.freeze([...items]);\n}\n\nfunction validStringArray(value: unknown): boolean {\n const items = snapshotClosedArray(value);\n return items !== undefined && items.every(isString);\n}\n\nfunction isString(value: unknown): value is string {\n return typeof value === \"string\";\n}\n\nfunction exactRecord(\n value: unknown,\n keys: readonly string[]\n): Readonly<Record<string, unknown>> | undefined {\n const record = snapshotClosedRecord(value);\n return record !== undefined &&\n Object.keys(record).length === keys.length &&\n keys.every((key) => Object.hasOwn(record, key))\n ? record\n : undefined;\n}\n\nfunction deepFreeze<T>(value: T): T {\n if (typeof value !== \"object\" || value === null || Object.isFrozen(value)) return value;\n for (const nested of Object.values(value)) deepFreeze(nested);\n return Object.freeze(value);\n}\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export function acceptExactInputMeasurements(measurements, approvedExactPaths) {
|
|
2
|
+
const approvedPathSet = new Set(approvedExactPaths);
|
|
3
|
+
for (const [index, measurement] of measurements.entries()) {
|
|
4
|
+
if (measurement.sourcePaths.length === 0) {
|
|
5
|
+
return {
|
|
6
|
+
error: `scanner measurement #${index + 1} did not declare a source path`,
|
|
7
|
+
ok: false
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
for (const sourcePath of measurement.sourcePaths) {
|
|
11
|
+
if (!approvedPathSet.has(sourcePath)) {
|
|
12
|
+
return {
|
|
13
|
+
error: `scanner measurement #${index + 1} references unapproved input path ${JSON.stringify(sourcePath)}`,
|
|
14
|
+
ok: false
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
ok: true,
|
|
21
|
+
payloads: measurements.map((measurement) => measurement.payload)
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=exact-input-measurement.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exact-input-measurement.mjs","sourceRoot":"","sources":["../../../../src/package-checks/project-files/exact-input-measurement.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,4BAA4B,CAC1C,YAAiD,EACjD,kBAAqC;IAErC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAEpD,KAAK,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;QAC1D,IAAI,WAAW,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzC,OAAO;gBACL,KAAK,EAAE,wBAAwB,KAAK,GAAG,CAAC,gCAAgC;gBACxE,EAAE,EAAE,KAAK;aACV,CAAC;QACJ,CAAC;QAED,KAAK,MAAM,UAAU,IAAI,WAAW,CAAC,WAAW,EAAE,CAAC;YACjD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBACrC,OAAO;oBACL,KAAK,EAAE,wBAAwB,KAAK,GAAG,CAAC,qCAAqC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE;oBACzG,EAAE,EAAE,KAAK;iBACV,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,EAAE,EAAE,IAAI;QACR,QAAQ,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC;KACjE,CAAC;AACJ,CAAC","sourcesContent":["export type ExactInputMeasurement<T> = {\n readonly payload: T;\n readonly sourcePaths: readonly string[];\n};\n\nexport type ExactInputMeasurementAcceptance<T> =\n | { readonly ok: true; readonly payloads: readonly T[] }\n | { readonly error: string; readonly ok: false };\n\nexport function acceptExactInputMeasurements<T>(\n measurements: readonly ExactInputMeasurement<T>[],\n approvedExactPaths: readonly string[]\n): ExactInputMeasurementAcceptance<T> {\n const approvedPathSet = new Set(approvedExactPaths);\n\n for (const [index, measurement] of measurements.entries()) {\n if (measurement.sourcePaths.length === 0) {\n return {\n error: `scanner measurement #${index + 1} did not declare a source path`,\n ok: false\n };\n }\n\n for (const sourcePath of measurement.sourcePaths) {\n if (!approvedPathSet.has(sourcePath)) {\n return {\n error: `scanner measurement #${index + 1} references unapproved input path ${JSON.stringify(sourcePath)}`,\n ok: false\n };\n }\n }\n }\n\n return {\n ok: true,\n payloads: measurements.map((measurement) => measurement.payload)\n };\n}\n"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { resolve } from "node:path";
|
|
4
|
+
/** Fingerprints one exact path set from stable path order and normalized current file content. */
|
|
5
|
+
export function fingerprintProjectFiles(rootDir, paths) {
|
|
6
|
+
const sortedPaths = [...paths].sort(compareText);
|
|
7
|
+
const inputDigest = createHash("sha256");
|
|
8
|
+
for (const path of sortedPaths) {
|
|
9
|
+
inputDigest.update(path, "utf8");
|
|
10
|
+
inputDigest.update("\0");
|
|
11
|
+
inputDigest.update(fileContentFingerprint(rootDir, path), "utf8");
|
|
12
|
+
inputDigest.update("\n");
|
|
13
|
+
}
|
|
14
|
+
return Object.freeze({
|
|
15
|
+
fileCount: sortedPaths.length,
|
|
16
|
+
fileList: Object.freeze(sortedPaths.slice(0, 200)),
|
|
17
|
+
fingerprint: `sha256:${inputDigest.digest("hex")}:${sortedPaths.length}`
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
function fileContentFingerprint(rootDir, path) {
|
|
21
|
+
try {
|
|
22
|
+
const content = readFileSync(resolve(rootDir, path), "utf8").replace(/\r\n?/g, "\n");
|
|
23
|
+
return createHash("sha256").update(content).digest("hex");
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return "file-not-readable";
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function compareText(left, right) {
|
|
30
|
+
if (left < right)
|
|
31
|
+
return -1;
|
|
32
|
+
if (left > right)
|
|
33
|
+
return 1;
|
|
34
|
+
return 0;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=file-fingerprint.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-fingerprint.mjs","sourceRoot":"","sources":["../../../../src/package-checks/project-files/file-fingerprint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,kGAAkG;AAClG,MAAM,UAAU,uBAAuB,CACrC,OAAe,EACf,KAAwB;IAExB,MAAM,WAAW,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAEzC,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACjC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzB,WAAW,CAAC,MAAM,CAAC,sBAAsB,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;QAClE,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,SAAS,EAAE,WAAW,CAAC,MAAM;QAC7B,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAClD,WAAW,EAAE,UAAU,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,MAAM,EAAE;KACzE,CAAC,CAAC;AACL,CAAC;AAED,SAAS,sBAAsB,CAAC,OAAe,EAAE,IAAY;IAC3D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACrF,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,mBAAmB,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,KAAa;IAC9C,IAAI,IAAI,GAAG,KAAK;QAAE,OAAO,CAAC,CAAC,CAAC;IAC5B,IAAI,IAAI,GAAG,KAAK;QAAE,OAAO,CAAC,CAAC;IAC3B,OAAO,CAAC,CAAC;AACX,CAAC","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\nexport interface FileInputFingerprint {\n readonly fileCount: number;\n readonly fileList: readonly string[];\n readonly fingerprint: string;\n}\n\n/** Fingerprints one exact path set from stable path order and normalized current file content. */\nexport function fingerprintProjectFiles(\n rootDir: string,\n paths: readonly string[]\n): FileInputFingerprint {\n const sortedPaths = [...paths].sort(compareText);\n const inputDigest = createHash(\"sha256\");\n\n for (const path of sortedPaths) {\n inputDigest.update(path, \"utf8\");\n inputDigest.update(\"\\0\");\n inputDigest.update(fileContentFingerprint(rootDir, path), \"utf8\");\n inputDigest.update(\"\\n\");\n }\n\n return Object.freeze({\n fileCount: sortedPaths.length,\n fileList: Object.freeze(sortedPaths.slice(0, 200)),\n fingerprint: `sha256:${inputDigest.digest(\"hex\")}:${sortedPaths.length}`\n });\n}\n\nfunction fileContentFingerprint(rootDir: string, path: string): string {\n try {\n const content = readFileSync(resolve(rootDir, path), \"utf8\").replace(/\\r\\n?/g, \"\\n\");\n return createHash(\"sha256\").update(content).digest(\"hex\");\n } catch {\n return \"file-not-readable\";\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,57 @@
|
|
|
1
|
+
/** Reads canonical gitlink entries from a named Git tree revision. */
|
|
2
|
+
import { processFailed } from "../host-environment/process/command.mjs";
|
|
3
|
+
import { runGit } from "../host-environment/git.mjs";
|
|
4
|
+
import { toSlashPath } from "../host-environment/path.mjs";
|
|
5
|
+
export function gitlinksAtRevision({ repository, revision }) {
|
|
6
|
+
const result = runGit({
|
|
7
|
+
args: ["ls-tree", "-r", "-z", revision],
|
|
8
|
+
cwd: repository
|
|
9
|
+
});
|
|
10
|
+
if (processFailed(result)) {
|
|
11
|
+
const detail = result.stderr.trim() ||
|
|
12
|
+
result.error?.message ||
|
|
13
|
+
(result.signal === null ? `exit status ${result.status}` : `signal ${result.signal}`);
|
|
14
|
+
throw new Error(`could not inspect gitlinks at ${revision} in ${repository}: ${detail}`);
|
|
15
|
+
}
|
|
16
|
+
const gitlinks = [];
|
|
17
|
+
for (const entry of result.stdout.split("\0")) {
|
|
18
|
+
if (!entry)
|
|
19
|
+
continue;
|
|
20
|
+
const gitlink = parseGitlinkEntry({ entry, repository, revision });
|
|
21
|
+
if (gitlink !== null)
|
|
22
|
+
gitlinks.push(gitlink);
|
|
23
|
+
}
|
|
24
|
+
return Object.freeze(gitlinks);
|
|
25
|
+
}
|
|
26
|
+
function parseGitlinkEntry({ entry, repository, revision }) {
|
|
27
|
+
const parsed = gitTreeEntryParts(entry);
|
|
28
|
+
if (parsed === undefined)
|
|
29
|
+
throw invalidTreeOutput(revision, repository);
|
|
30
|
+
const [mode, type, sha] = parsed.metadata;
|
|
31
|
+
if (!validGitTreeMetadata(mode, type, sha))
|
|
32
|
+
throw invalidTreeOutput(revision, repository);
|
|
33
|
+
if (mode !== "160000")
|
|
34
|
+
return null;
|
|
35
|
+
if (type !== "commit") {
|
|
36
|
+
throw new Error(`invalid gitlink output at ${revision} in ${repository}`);
|
|
37
|
+
}
|
|
38
|
+
return Object.freeze({ path: toSlashPath(parsed.path), sha });
|
|
39
|
+
}
|
|
40
|
+
function gitTreeEntryParts(entry) {
|
|
41
|
+
const separator = entry.indexOf("\t");
|
|
42
|
+
if (separator < 0)
|
|
43
|
+
return undefined;
|
|
44
|
+
const metadata = entry.slice(0, separator).split(/\s+/u);
|
|
45
|
+
const path = entry.slice(separator + 1);
|
|
46
|
+
return metadata.length === 3 && path.length > 0 ? { metadata, path } : undefined;
|
|
47
|
+
}
|
|
48
|
+
function validGitTreeMetadata(mode, type, sha) {
|
|
49
|
+
return mode !== undefined && type !== undefined && sha !== undefined && isFullGitObjectId(sha);
|
|
50
|
+
}
|
|
51
|
+
function invalidTreeOutput(revision, repository) {
|
|
52
|
+
return new Error(`invalid git tree output at ${revision} in ${repository}`);
|
|
53
|
+
}
|
|
54
|
+
function isFullGitObjectId(value) {
|
|
55
|
+
return /^(?:[0-9a-f]{40}|[0-9a-f]{64})$/u.test(value);
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=gitlink-revision.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitlink-revision.mjs","sourceRoot":"","sources":["../../../../src/package-checks/project-files/gitlink-revision.ts"],"names":[],"mappings":"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","sourcesContent":["/** Reads canonical gitlink entries from a named Git tree revision. */\n\nimport { processFailed } from \"../host-environment/process/command.ts\";\nimport { runGit } from \"../host-environment/git.ts\";\nimport { toSlashPath } from \"../host-environment/path.ts\";\n\nexport type Gitlink = Readonly<{\n readonly path: string;\n readonly sha: string;\n}>;\n\nexport function gitlinksAtRevision({\n repository,\n revision\n}: Readonly<{\n readonly repository: string;\n readonly revision: string;\n}>): readonly Gitlink[] {\n const result = runGit({\n args: [\"ls-tree\", \"-r\", \"-z\", revision],\n cwd: repository\n });\n if (processFailed(result)) {\n const detail =\n result.stderr.trim() ||\n result.error?.message ||\n (result.signal === null ? `exit status ${result.status}` : `signal ${result.signal}`);\n throw new Error(`could not inspect gitlinks at ${revision} in ${repository}: ${detail}`);\n }\n\n const gitlinks: Gitlink[] = [];\n for (const entry of result.stdout.split(\"\\0\")) {\n if (!entry) continue;\n const gitlink = parseGitlinkEntry({ entry, repository, revision });\n if (gitlink !== null) gitlinks.push(gitlink);\n }\n return Object.freeze(gitlinks);\n}\n\nfunction parseGitlinkEntry({\n entry,\n repository,\n revision\n}: Readonly<{\n readonly entry: string;\n readonly repository: string;\n readonly revision: string;\n}>): Gitlink | null {\n const parsed = gitTreeEntryParts(entry);\n if (parsed === undefined) throw invalidTreeOutput(revision, repository);\n const [mode, type, sha] = parsed.metadata;\n if (!validGitTreeMetadata(mode, type, sha)) throw invalidTreeOutput(revision, repository);\n if (mode !== \"160000\") return null;\n if (type !== \"commit\") {\n throw new Error(`invalid gitlink output at ${revision} in ${repository}`);\n }\n return Object.freeze({ path: toSlashPath(parsed.path), sha });\n}\n\nfunction gitTreeEntryParts(entry: string): { metadata: string[]; path: string } | undefined {\n const separator = entry.indexOf(\"\\t\");\n if (separator < 0) return undefined;\n const metadata = entry.slice(0, separator).split(/\\s+/u);\n const path = entry.slice(separator + 1);\n return metadata.length === 3 && path.length > 0 ? { metadata, path } : undefined;\n}\n\nfunction validGitTreeMetadata(\n mode: string | undefined,\n type: string | undefined,\n sha: string | undefined\n): sha is string {\n return mode !== undefined && type !== undefined && sha !== undefined && isFullGitObjectId(sha);\n}\n\nfunction invalidTreeOutput(revision: string, repository: string): Error {\n return new Error(`invalid git tree output at ${revision} in ${repository}`);\n}\n\nfunction isFullGitObjectId(value: string): boolean {\n return /^(?:[0-9a-f]{40}|[0-9a-f]{64})$/u.test(value);\n}\n"]}
|