@zxyycom/vibe-check 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -5
- package/dist/esm/check/check.mjs +4 -0
- package/dist/esm/check/check.mjs.map +1 -1
- package/dist/esm/check/flag-enablement.mjs +32 -0
- package/dist/esm/check/flag-enablement.mjs.map +1 -0
- package/dist/esm/check/handoff-provider-identity.mjs +18 -0
- package/dist/esm/check/handoff-provider-identity.mjs.map +1 -0
- package/dist/esm/check/inherited-collection.mjs +1 -1
- package/dist/esm/check/inherited-collection.mjs.map +1 -1
- package/dist/esm/check/project-changes.mjs +2 -0
- package/dist/esm/check/project-changes.mjs.map +1 -0
- package/dist/esm/check/project-context.mjs +2 -0
- package/dist/esm/check/project-context.mjs.map +1 -0
- package/dist/esm/check-settlement/facts.mjs.map +1 -1
- package/dist/esm/check-settlement/record-store.mjs +1 -1
- package/dist/esm/check-settlement/record-store.mjs.map +1 -1
- package/dist/esm/data-boundary/canonical-data.mjs +36 -7
- package/dist/esm/data-boundary/canonical-data.mjs.map +1 -1
- package/dist/esm/data-boundary/canonical-json.mjs.map +1 -1
- package/dist/esm/data-boundary/closed-values.mjs +28 -4
- package/dist/esm/data-boundary/closed-values.mjs.map +1 -1
- package/dist/esm/{package-checks/project-files → data-boundary}/config-glob.mjs +3 -3
- package/dist/esm/data-boundary/config-glob.mjs.map +1 -0
- package/dist/esm/data-boundary/project-path.mjs +19 -0
- package/dist/esm/data-boundary/project-path.mjs.map +1 -0
- package/dist/esm/index.mjs +12 -5
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/machine-output/v4/atomic-publication.mjs +4 -1
- package/dist/esm/machine-output/v4/atomic-publication.mjs.map +1 -1
- package/dist/esm/package-checks/check-authoring.mjs +69 -0
- package/dist/esm/package-checks/check-authoring.mjs.map +1 -0
- package/dist/esm/package-checks/code-quality-findings/finding-waiver-authoring.mjs.map +1 -1
- package/dist/esm/package-checks/code-quality-findings/finding-waiver-evidence.mjs.map +1 -1
- package/dist/esm/package-checks/command-check/command-check.mjs +55 -0
- package/dist/esm/package-checks/command-check/command-check.mjs.map +1 -0
- package/dist/esm/package-checks/command-check/contract.mjs +2 -0
- package/dist/esm/package-checks/command-check/contract.mjs.map +1 -0
- package/dist/esm/package-checks/command-check/execution.mjs +134 -0
- package/dist/esm/package-checks/command-check/execution.mjs.map +1 -0
- package/dist/esm/package-checks/command-check/options.mjs +284 -0
- package/dist/esm/package-checks/command-check/options.mjs.map +1 -0
- package/dist/esm/package-checks/command-check/transcript.mjs +26 -0
- package/dist/esm/package-checks/command-check/transcript.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/default-check.mjs +9 -11
- package/dist/esm/package-checks/duplicate-detection/default-check.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/execution.mjs +2 -4
- package/dist/esm/package-checks/duplicate-detection/execution.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/finding-messages.mjs +1 -1
- package/dist/esm/package-checks/duplicate-detection/finding-messages.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs +1 -1
- package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/options.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/records.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/constructor.mjs +9 -11
- package/dist/esm/package-checks/file-metrics/constructor.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/execution.mjs +2 -4
- package/dist/esm/package-checks/file-metrics/execution.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/finding-messages.mjs +1 -1
- package/dist/esm/package-checks/file-metrics/finding-messages.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/options.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/records.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/scc/availability.mjs +1 -1
- package/dist/esm/package-checks/file-metrics/scc/availability.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/scc/batch-planner.mjs +38 -0
- package/dist/esm/package-checks/file-metrics/scc/batch-planner.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/scc/logical-scan-resources.mjs +35 -0
- package/dist/esm/package-checks/file-metrics/scc/logical-scan-resources.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/scc/scanner.mjs +102 -29
- package/dist/esm/package-checks/file-metrics/scc/scanner.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analysis.mjs +7 -2
- package/dist/esm/package-checks/function-metrics/analysis.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/analysis-model.mjs +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/analysis-model.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs +1 -3
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/protocol.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/pipeline.mjs +3 -2
- package/dist/esm/package-checks/function-metrics/analyzer/pipeline.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/erlang.mjs +6 -6
- package/dist/esm/package-checks/function-metrics/analyzer/readers/erlang.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/fortran.mjs +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/fortran.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/objc.mjs +9 -3
- package/dist/esm/package-checks/function-metrics/analyzer/readers/objc.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/php-states.mjs +12 -7
- package/dist/esm/package-checks/function-metrics/analyzer/readers/php-states.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/plsql.mjs +6 -6
- package/dist/esm/package-checks/function-metrics/analyzer/readers/plsql.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/python.mjs +5 -3
- package/dist/esm/package-checks/function-metrics/analyzer/readers/python.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/r.mjs +2 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/r.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/ttcn.mjs +9 -3
- package/dist/esm/package-checks/function-metrics/analyzer/readers/ttcn.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/typescript.mjs +9 -3
- package/dist/esm/package-checks/function-metrics/analyzer/readers/typescript.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/zig.mjs +3 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/zig.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/shared/code-reader.mjs +3 -1
- package/dist/esm/package-checks/function-metrics/analyzer/shared/code-reader.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/shared/js-style-regex.mjs +12 -5
- package/dist/esm/package-checks/function-metrics/analyzer/shared/js-style-regex.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer-worker-port.mjs +20 -8
- package/dist/esm/package-checks/function-metrics/analyzer-worker-port.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/constructor.mjs +9 -11
- package/dist/esm/package-checks/function-metrics/constructor.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/execution.mjs +2 -4
- package/dist/esm/package-checks/function-metrics/execution.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/finding-messages.mjs +1 -1
- package/dist/esm/package-checks/function-metrics/finding-messages.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/measurement.mjs +3 -1
- package/dist/esm/package-checks/function-metrics/measurement.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/options.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/records.mjs.map +1 -1
- package/dist/esm/package-checks/host-environment/git.mjs +11 -0
- package/dist/esm/package-checks/host-environment/git.mjs.map +1 -1
- package/dist/esm/package-checks/host-environment/path.mjs +1 -17
- package/dist/esm/package-checks/host-environment/path.mjs.map +1 -1
- package/dist/esm/package-checks/host-environment/process/contract.mjs.map +1 -1
- package/dist/esm/package-checks/host-environment/process/result.mjs +43 -17
- package/dist/esm/package-checks/host-environment/process/result.mjs.map +1 -1
- package/dist/esm/package-checks/host-environment/process/runner.mjs +7 -5
- package/dist/esm/package-checks/host-environment/process/runner.mjs.map +1 -1
- package/dist/esm/package-checks/json-schema-validation/default-check.mjs +9 -11
- package/dist/esm/package-checks/json-schema-validation/default-check.mjs.map +1 -1
- package/dist/esm/package-checks/json-schema-validation/options.mjs.map +1 -1
- package/dist/esm/package-checks/json-schema-validation/reference-resolver.mjs +6 -2
- package/dist/esm/package-checks/json-schema-validation/reference-resolver.mjs.map +1 -1
- package/dist/esm/package-checks/json-schema-validation/schema-policy.mjs +11 -3
- package/dist/esm/package-checks/json-schema-validation/schema-policy.mjs.map +1 -1
- package/dist/esm/package-checks/json-validation/default-check.mjs +9 -11
- package/dist/esm/package-checks/json-validation/default-check.mjs.map +1 -1
- package/dist/esm/package-checks/json-validation/options.mjs.map +1 -1
- package/dist/esm/package-checks/local-cache-options.mjs +28 -0
- package/dist/esm/package-checks/local-cache-options.mjs.map +1 -0
- package/dist/esm/package-checks/maintenance-reminders/maintenance-reminders.mjs +37 -45
- package/dist/esm/package-checks/maintenance-reminders/maintenance-reminders.mjs.map +1 -1
- package/dist/esm/package-checks/maintenance-reminders/maintenance-support.mjs +3 -1
- package/dist/esm/package-checks/maintenance-reminders/maintenance-support.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/default-check.mjs +19 -33
- package/dist/esm/package-checks/markdown-link-validation/default-check.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/execution.mjs +1 -1
- package/dist/esm/package-checks/markdown-link-validation/execution.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/finding-messages.mjs +1 -1
- package/dist/esm/package-checks/markdown-link-validation/finding-messages.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/markdown-parser.mjs +1 -3
- package/dist/esm/package-checks/markdown-link-validation/markdown-parser.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs +3 -18
- package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs +2 -14
- package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/options.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache-payload.mjs +4 -5
- package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache-payload.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-lint/adapter.mjs +125 -0
- package/dist/esm/package-checks/markdown-lint/adapter.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/default-check.mjs +37 -0
- package/dist/esm/package-checks/markdown-lint/default-check.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/execution.mjs +202 -0
- package/dist/esm/package-checks/markdown-lint/execution.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/final-data.mjs +16 -0
- package/dist/esm/package-checks/markdown-lint/final-data.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/finding-messages.mjs +72 -0
- package/dist/esm/package-checks/markdown-lint/finding-messages.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/finding-waiver-identity.mjs +41 -0
- package/dist/esm/package-checks/markdown-lint/finding-waiver-identity.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/findings-cache.mjs +110 -0
- package/dist/esm/package-checks/markdown-lint/findings-cache.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/options-resolution.mjs +74 -0
- package/dist/esm/package-checks/markdown-lint/options-resolution.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/options-validation.mjs +41 -0
- package/dist/esm/package-checks/markdown-lint/options-validation.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/options.mjs +13 -0
- package/dist/esm/package-checks/markdown-lint/options.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/records.mjs +65 -0
- package/dist/esm/package-checks/markdown-lint/records.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/unavailable-reasons.mjs +14 -0
- package/dist/esm/package-checks/markdown-lint/unavailable-reasons.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/collection.mjs +23 -19
- package/dist/esm/package-checks/project-files/collection.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/configuration.mjs +1 -1
- package/dist/esm/package-checks/project-files/configuration.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/gitlink-revision.mjs +2 -5
- package/dist/esm/package-checks/project-files/gitlink-revision.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/gitlink-worktree.mjs +22 -6
- package/dist/esm/package-checks/project-files/gitlink-worktree.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/public-collection.mjs +1 -1
- package/dist/esm/package-checks/project-files/public-collection.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/revision-paths.mjs +3 -3
- package/dist/esm/package-checks/project-files/revision-paths.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/revision-worktree-files.mjs +11 -15
- package/dist/esm/package-checks/project-files/revision-worktree-files.mjs.map +1 -1
- package/dist/esm/package-checks/secret-detection/default-check.mjs +9 -11
- package/dist/esm/package-checks/secret-detection/default-check.mjs.map +1 -1
- package/dist/esm/package-checks/secret-detection/execution.mjs +2 -2
- package/dist/esm/package-checks/secret-detection/execution.mjs.map +1 -1
- package/dist/esm/package-checks/secret-detection/input-preparation.mjs +46 -7
- package/dist/esm/package-checks/secret-detection/input-preparation.mjs.map +1 -1
- package/dist/esm/package-checks/secret-detection/options.mjs.map +1 -1
- package/dist/esm/package-checks/secret-detection/records.mjs.map +1 -1
- package/dist/esm/package-checks/secret-detection/secretlint/adapter.mjs +3 -4
- package/dist/esm/package-checks/secret-detection/secretlint/adapter.mjs.map +1 -1
- package/dist/esm/package-tools/admission-policy/define-admission-policy.mjs +10 -0
- package/dist/esm/package-tools/admission-policy/define-admission-policy.mjs.map +1 -0
- package/dist/esm/{cache → package-tools/cache}/cache-json-by-key.mjs +13 -14
- package/dist/esm/package-tools/cache/cache-json-by-key.mjs.map +1 -0
- package/dist/esm/package-tools/finding-presentation/finding-presentation.mjs.map +1 -0
- package/dist/esm/{finding-waivers → package-tools/finding-waivers}/reconciliation.mjs +14 -5
- package/dist/esm/package-tools/finding-waivers/reconciliation.mjs.map +1 -0
- package/dist/esm/package-tools/learned-critical-path/critical-path-ranking.mjs.map +1 -0
- package/dist/esm/package-tools/learned-critical-path/duration-model/bounded-history.mjs.map +1 -0
- package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/prediction.mjs +2 -2
- package/dist/esm/package-tools/learned-critical-path/duration-model/prediction.mjs.map +1 -0
- package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/preparation.mjs +4 -2
- package/dist/esm/package-tools/learned-critical-path/duration-model/preparation.mjs.map +1 -0
- package/dist/esm/package-tools/learned-critical-path/duration-model/recording.mjs.map +1 -0
- package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/storage.mjs +8 -8
- package/dist/esm/package-tools/learned-critical-path/duration-model/storage.mjs.map +1 -0
- package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/selection-layers.mjs +1 -2
- package/dist/esm/package-tools/learned-critical-path/selection-layers.mjs.map +1 -0
- package/dist/esm/package-tools/learned-critical-path/static-decision.mjs.map +1 -0
- package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/strategy.mjs +3 -3
- package/dist/esm/package-tools/learned-critical-path/strategy.mjs.map +1 -0
- package/dist/esm/project-definition/check-tree/authoring.mjs +8 -5
- package/dist/esm/project-definition/check-tree/authoring.mjs.map +1 -1
- package/dist/esm/project-definition/check-tree/check-fields-authoring.mjs +79 -66
- package/dist/esm/project-definition/check-tree/check-fields-authoring.mjs.map +1 -1
- package/dist/esm/project-definition/check-tree/flag-conditions.mjs +71 -0
- package/dist/esm/project-definition/check-tree/flag-conditions.mjs.map +1 -0
- package/dist/esm/project-definition/check-tree/materialization.mjs +13 -8
- package/dist/esm/project-definition/check-tree/materialization.mjs.map +1 -1
- package/dist/esm/project-definition/check-tree/resolution.mjs +7 -6
- package/dist/esm/project-definition/check-tree/resolution.mjs.map +1 -1
- package/dist/esm/project-definition/declarative-snapshot.mjs +2 -1
- package/dist/esm/project-definition/declarative-snapshot.mjs.map +1 -1
- package/dist/esm/project-definition/project-changes.mjs +70 -0
- package/dist/esm/project-definition/project-changes.mjs.map +1 -0
- package/dist/esm/project-definition/project-definition-validation.mjs +40 -8
- package/dist/esm/project-definition/project-definition-validation.mjs.map +1 -1
- package/dist/esm/project-definition/project-definition.mjs +22 -15
- package/dist/esm/project-definition/project-definition.mjs.map +1 -1
- package/dist/esm/project-definition/scheduler-policy.mjs.map +1 -1
- package/dist/esm/project-run/admission-strategy-provider/custom-strategy-preparation.mjs +9 -6
- package/dist/esm/project-run/admission-strategy-provider/custom-strategy-preparation.mjs.map +1 -1
- package/dist/esm/project-run/admission-strategy-provider/prepared-admission-strategy.mjs.map +1 -1
- package/dist/esm/project-run/aggregation.mjs +42 -59
- package/dist/esm/project-run/aggregation.mjs.map +1 -1
- package/dist/esm/project-run/changes/git.mjs +161 -0
- package/dist/esm/project-run/changes/git.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/admitted-check-execution.mjs +41 -0
- package/dist/esm/project-run/check-execution/admitted-check-execution.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/callback.mjs +3 -2
- package/dist/esm/project-run/check-execution/callback.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/dependencies.mjs +80 -5
- package/dist/esm/project-run/check-execution/dependencies.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/execution-finalization.mjs +5 -3
- package/dist/esm/project-run/check-execution/execution-finalization.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/execution-settlement.mjs +37 -16
- package/dist/esm/project-run/check-execution/execution-settlement.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/flag-controls.mjs +15 -7
- package/dist/esm/project-run/check-execution/flag-controls.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/lifecycle.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/{preflight-result.mjs → preparation-result.mjs} +24 -24
- package/dist/esm/project-run/check-execution/preparation-result.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/{preflight.mjs → preparation.mjs} +52 -52
- package/dist/esm/project-run/check-execution/preparation.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/ready-check-execution.mjs +71 -0
- package/dist/esm/project-run/check-execution/ready-check-execution.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/resolved-checks.mjs +27 -164
- package/dist/esm/project-run/check-execution/resolved-checks.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/scheduled-check-run.mjs +79 -0
- package/dist/esm/project-run/check-execution/scheduled-check-run.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/terminal-result.mjs +70 -25
- package/dist/esm/project-run/check-execution/terminal-result.mjs.map +1 -1
- package/dist/esm/project-run/completion/completion.mjs +18 -1
- package/dist/esm/project-run/completion/completion.mjs.map +1 -1
- package/dist/esm/project-run/controls/contract.mjs.map +1 -1
- package/dist/esm/project-run/controls/validation.mjs +7 -54
- package/dist/esm/project-run/controls/validation.mjs.map +1 -1
- package/dist/esm/project-run/diagnostic-logging/diagnostic-detail-rendering.mjs +3 -3
- package/dist/esm/project-run/diagnostic-logging/diagnostic-detail-rendering.mjs.map +1 -1
- package/dist/esm/project-run/diagnostic-logging/observation-rendering.mjs +1 -1
- package/dist/esm/project-run/diagnostic-logging/observation-rendering.mjs.map +1 -1
- package/dist/esm/project-run/invocation/candidate.mjs +17 -13
- package/dist/esm/project-run/invocation/candidate.mjs.map +1 -1
- package/dist/esm/project-run/invocation/candidates.mjs +26 -0
- package/dist/esm/project-run/invocation/candidates.mjs.map +1 -0
- package/dist/esm/project-run/invocation/creation.mjs +7 -3
- package/dist/esm/project-run/invocation/creation.mjs.map +1 -1
- package/dist/esm/project-run/invocation/execution.mjs +98 -0
- package/dist/esm/project-run/invocation/execution.mjs.map +1 -0
- package/dist/esm/project-run/invocation/run.mjs +13 -112
- package/dist/esm/project-run/invocation/run.mjs.map +1 -1
- package/dist/esm/project-run/invocation/scheduler.mjs +13 -6
- package/dist/esm/project-run/invocation/scheduler.mjs.map +1 -1
- package/dist/esm/project-run/outputs/status.mjs +12 -12
- package/dist/esm/project-run/outputs/status.mjs.map +1 -1
- package/dist/esm/project-run/progress-rendering/presentation.mjs +31 -11
- package/dist/esm/project-run/progress-rendering/presentation.mjs.map +1 -1
- package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs +11 -4
- package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs.map +1 -1
- package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs +20 -6
- package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs.map +1 -1
- package/dist/esm/project-run/progress-rendering/renderer.mjs +6 -2
- package/dist/esm/project-run/progress-rendering/renderer.mjs.map +1 -1
- package/dist/esm/project-run/project-context.mjs +2 -1
- package/dist/esm/project-run/project-context.mjs.map +1 -1
- package/dist/esm/project-run/result.mjs +2 -2
- package/dist/esm/project-run/result.mjs.map +1 -1
- package/dist/esm/project-run/run.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph-lookup.mjs +45 -0
- package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph-lookup.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph.mjs +9 -4
- package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/admission-core/selection-query.mjs +3 -5
- package/dist/esm/project-run/task-scheduler/admission-core/selection-query.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/admission-core/selection-seed.mjs +25 -8
- package/dist/esm/project-run/task-scheduler/admission-core/selection-seed.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/admission-core/selection-transition.mjs +8 -8
- package/dist/esm/project-run/task-scheduler/admission-core/selection-transition.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/execution-state.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/measurement/diagnostics.mjs +8 -4
- package/dist/esm/project-run/task-scheduler/measurement/diagnostics.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/measurement/timing.mjs +12 -6
- package/dist/esm/project-run/task-scheduler/measurement/timing.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/scheduler-observation.mjs +3 -1
- package/dist/esm/project-run/task-scheduler/scheduler-observation.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/scheduler-terminal-measurement.mjs +17 -17
- package/dist/esm/project-run/task-scheduler/scheduler-terminal-measurement.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/scheduler.mjs +18 -6
- package/dist/esm/project-run/task-scheduler/scheduler.mjs.map +1 -1
- package/docs/api-mechanics.md +147 -28
- package/docs/changelog.md +145 -2
- package/docs/checks/duplicate-detection.md +22 -3
- package/docs/checks/file-metrics.md +25 -6
- package/docs/checks/function-metrics.md +21 -2
- package/docs/checks/json-schema-validation.md +25 -4
- package/docs/checks/json-validation.md +24 -5
- package/docs/checks/maintenance-reminders.md +30 -6
- package/docs/checks/markdown-link-validation.md +24 -4
- package/docs/checks/markdown-lint.md +167 -0
- package/docs/checks/secret-detection.md +31 -7
- package/docs/examples/artifacts/mixed-outcomes/definition.ts +10 -10
- package/docs/guides/building-project-gate.md +706 -0
- package/docs/guides/callbacks.md +81 -22
- package/docs/guides/check-dependencies.md +41 -10
- package/docs/guides/collecting-project-files.md +7 -7
- package/docs/guides/command-check.md +155 -0
- package/docs/guides/data-boundaries.md +140 -0
- package/docs/guides/extending-check-lifecycle.md +77 -25
- package/docs/guides/finding-waivers.md +43 -1
- package/docs/guides/learned-scheduling.md +1 -1
- package/docs/guides/run-outputs.md +35 -9
- package/docs/guides/scheduling.md +15 -15
- package/docs/output.md +6 -5
- package/package.json +2 -1
- package/src/check/check.ts +332 -92
- package/src/check/flag-enablement.ts +76 -0
- package/src/check/handoff-provider-identity.ts +34 -0
- package/src/check/inherited-collection.ts +1 -1
- package/src/check/project-changes.ts +14 -0
- package/src/check/project-context.ts +11 -0
- package/src/check-settlement/facts.ts +1 -1
- package/src/check-settlement/record-store.ts +1 -1
- package/src/data-boundary/canonical-data.ts +36 -9
- package/src/data-boundary/canonical-json.ts +18 -1
- package/src/data-boundary/closed-values.ts +26 -6
- package/src/data-boundary/config-glob.ts +17 -0
- package/src/data-boundary/project-path.ts +21 -0
- package/src/index.ts +72 -11
- package/src/machine-output/v4/atomic-publication.ts +3 -1
- package/src/package-checks/check-authoring.ts +136 -0
- package/src/package-checks/code-quality-findings/finding-waiver-authoring.ts +1 -1
- package/src/package-checks/code-quality-findings/finding-waiver-evidence.ts +1 -1
- package/src/package-checks/command-check/command-check.ts +152 -0
- package/src/package-checks/command-check/contract.ts +168 -0
- package/src/package-checks/command-check/execution.ts +211 -0
- package/src/package-checks/command-check/options.ts +331 -0
- package/src/package-checks/command-check/transcript.ts +35 -0
- package/src/package-checks/duplicate-detection/default-check.ts +37 -6
- package/src/package-checks/duplicate-detection/execution.ts +2 -4
- package/src/package-checks/duplicate-detection/finding-messages.ts +2 -2
- package/src/package-checks/duplicate-detection/jscpd/availability.ts +1 -1
- package/src/package-checks/duplicate-detection/options.ts +6 -3
- package/src/package-checks/duplicate-detection/records.ts +1 -1
- package/src/package-checks/file-metrics/constructor.ts +29 -6
- package/src/package-checks/file-metrics/execution.ts +2 -4
- package/src/package-checks/file-metrics/finding-messages.ts +1 -1
- package/src/package-checks/file-metrics/options.ts +6 -3
- package/src/package-checks/file-metrics/records.ts +1 -1
- package/src/package-checks/file-metrics/scc/availability.ts +1 -1
- package/src/package-checks/file-metrics/scc/batch-planner.ts +56 -0
- package/src/package-checks/file-metrics/scc/logical-scan-resources.ts +59 -0
- package/src/package-checks/file-metrics/scc/scanner.ts +134 -32
- package/src/package-checks/function-metrics/analysis.ts +7 -2
- package/src/package-checks/function-metrics/analyzer/analysis-model.ts +1 -1
- package/src/package-checks/function-metrics/analyzer/extension-output.ts +14 -6
- package/src/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.ts +1 -3
- package/src/package-checks/function-metrics/analyzer/extensions/protocol.ts +3 -3
- package/src/package-checks/function-metrics/analyzer/pipeline.ts +4 -2
- package/src/package-checks/function-metrics/analyzer/readers/erlang.ts +6 -6
- package/src/package-checks/function-metrics/analyzer/readers/fortran.ts +1 -1
- package/src/package-checks/function-metrics/analyzer/readers/objc.ts +9 -3
- package/src/package-checks/function-metrics/analyzer/readers/php-states.ts +14 -7
- package/src/package-checks/function-metrics/analyzer/readers/plsql.ts +8 -4
- package/src/package-checks/function-metrics/analyzer/readers/python.ts +4 -3
- package/src/package-checks/function-metrics/analyzer/readers/r.ts +2 -1
- package/src/package-checks/function-metrics/analyzer/readers/ttcn.ts +9 -3
- package/src/package-checks/function-metrics/analyzer/readers/typescript.ts +9 -3
- package/src/package-checks/function-metrics/analyzer/readers/zig.ts +2 -1
- package/src/package-checks/function-metrics/analyzer/shared/code-reader.ts +3 -1
- package/src/package-checks/function-metrics/analyzer/shared/js-style-regex.ts +10 -5
- package/src/package-checks/function-metrics/analyzer-worker-port.ts +20 -6
- package/src/package-checks/function-metrics/constructor.ts +30 -7
- package/src/package-checks/function-metrics/execution.ts +2 -4
- package/src/package-checks/function-metrics/finding-messages.ts +2 -2
- package/src/package-checks/function-metrics/measurement.ts +3 -1
- package/src/package-checks/function-metrics/options.ts +6 -3
- package/src/package-checks/function-metrics/records.ts +1 -1
- package/src/package-checks/host-environment/git.ts +11 -0
- package/src/package-checks/host-environment/path.ts +1 -20
- package/src/package-checks/host-environment/process/contract.ts +17 -9
- package/src/package-checks/host-environment/process/result.ts +48 -20
- package/src/package-checks/host-environment/process/runner.ts +8 -4
- package/src/package-checks/json-schema-validation/default-check.ts +38 -5
- package/src/package-checks/json-schema-validation/options.ts +4 -1
- package/src/package-checks/json-schema-validation/reference-resolver.ts +6 -2
- package/src/package-checks/json-schema-validation/schema-policy.ts +10 -5
- package/src/package-checks/json-validation/default-check.ts +27 -6
- package/src/package-checks/json-validation/options.ts +4 -1
- package/src/package-checks/local-cache-options.ts +40 -0
- package/src/package-checks/maintenance-reminders/maintenance-reminders.ts +89 -9
- package/src/package-checks/maintenance-reminders/maintenance-support.ts +3 -3
- package/src/package-checks/markdown-link-validation/default-check.ts +48 -5
- package/src/package-checks/markdown-link-validation/execution.ts +1 -1
- package/src/package-checks/markdown-link-validation/finding-messages.ts +1 -1
- package/src/package-checks/markdown-link-validation/markdown-parser.ts +1 -5
- package/src/package-checks/markdown-link-validation/options-resolution.ts +2 -19
- package/src/package-checks/markdown-link-validation/options-validation.ts +2 -17
- package/src/package-checks/markdown-link-validation/options.ts +6 -7
- package/src/package-checks/markdown-link-validation/parse-facts-cache-payload.ts +4 -5
- package/src/package-checks/markdown-lint/adapter.ts +167 -0
- package/src/package-checks/markdown-lint/default-check.ts +92 -0
- package/src/package-checks/markdown-lint/execution.ts +266 -0
- package/src/package-checks/markdown-lint/final-data.ts +33 -0
- package/src/package-checks/markdown-lint/finding-messages.ts +87 -0
- package/src/package-checks/markdown-lint/finding-waiver-identity.ts +54 -0
- package/src/package-checks/markdown-lint/findings-cache.ts +141 -0
- package/src/package-checks/markdown-lint/options-resolution.ts +102 -0
- package/src/package-checks/markdown-lint/options-validation.ts +50 -0
- package/src/package-checks/markdown-lint/options.ts +82 -0
- package/src/package-checks/markdown-lint/records.ts +132 -0
- package/src/package-checks/markdown-lint/unavailable-reasons.ts +33 -0
- package/src/package-checks/project-files/collection.ts +38 -22
- package/src/package-checks/project-files/config-glob.ts +1 -17
- package/src/package-checks/project-files/configuration.ts +1 -1
- package/src/package-checks/project-files/gitlink-revision.ts +4 -6
- package/src/package-checks/project-files/gitlink-worktree.ts +35 -7
- package/src/package-checks/project-files/public-collection.ts +1 -1
- package/src/package-checks/project-files/revision-paths.ts +3 -3
- package/src/package-checks/project-files/revision-worktree-files.ts +16 -16
- package/src/package-checks/secret-detection/default-check.ts +29 -6
- package/src/package-checks/secret-detection/execution.ts +2 -2
- package/src/package-checks/secret-detection/input-preparation.ts +64 -7
- package/src/package-checks/secret-detection/options.ts +5 -2
- package/src/package-checks/secret-detection/records.ts +1 -1
- package/src/package-checks/secret-detection/secretlint/adapter.ts +3 -4
- package/src/package-tools/admission-policy/define-admission-policy.ts +54 -0
- package/src/{cache → package-tools/cache}/cache-json-by-key.ts +13 -17
- package/src/{check → package-tools/finding-presentation}/finding-presentation.ts +3 -1
- package/src/{finding-waivers → package-tools/finding-waivers}/reconciliation.ts +16 -8
- package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/prediction.ts +5 -2
- package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/preparation.ts +5 -3
- package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/recording.ts +5 -4
- package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/storage.ts +9 -10
- package/src/{learned-critical-path → package-tools/learned-critical-path}/selection-layers.ts +2 -3
- package/src/{learned-critical-path → package-tools/learned-critical-path}/static-decision.ts +1 -1
- package/src/{learned-critical-path → package-tools/learned-critical-path}/strategy.ts +7 -4
- package/src/project-definition/check-tree/authoring.ts +15 -8
- package/src/project-definition/check-tree/check-fields-authoring.ts +106 -91
- package/src/project-definition/check-tree/flag-conditions.ts +99 -0
- package/src/project-definition/check-tree/materialization.ts +12 -8
- package/src/project-definition/check-tree/resolution.ts +13 -15
- package/src/project-definition/declarative-snapshot.ts +9 -2
- package/src/project-definition/project-changes.ts +112 -0
- package/src/project-definition/project-definition-validation.ts +58 -10
- package/src/project-definition/project-definition.ts +41 -68
- package/src/project-definition/scheduler-policy.ts +6 -3
- package/src/project-run/admission-strategy-provider/custom-strategy-preparation.ts +11 -8
- package/src/project-run/admission-strategy-provider/prepared-admission-strategy.ts +2 -2
- package/src/project-run/aggregation.ts +51 -74
- package/src/project-run/changes/git.ts +206 -0
- package/src/project-run/check-execution/admitted-check-execution.ts +62 -0
- package/src/project-run/check-execution/callback.ts +3 -2
- package/src/project-run/check-execution/dependencies.ts +120 -6
- package/src/project-run/check-execution/execution-finalization.ts +6 -4
- package/src/project-run/check-execution/execution-settlement.ts +88 -29
- package/src/project-run/check-execution/flag-controls.ts +22 -8
- package/src/project-run/check-execution/lifecycle.ts +14 -6
- package/src/project-run/check-execution/{preflight-result.ts → preparation-result.ts} +34 -32
- package/src/project-run/check-execution/{preflight.ts → preparation.ts} +92 -84
- package/src/project-run/check-execution/ready-check-execution.ts +97 -0
- package/src/project-run/check-execution/resolved-checks.ts +40 -219
- package/src/project-run/check-execution/scheduled-check-run.ts +119 -0
- package/src/project-run/check-execution/terminal-result.ts +108 -29
- package/src/project-run/completion/completion.ts +17 -3
- package/src/project-run/controls/contract.ts +6 -16
- package/src/project-run/controls/validation.ts +7 -60
- package/src/project-run/diagnostic-logging/diagnostic-detail-rendering.ts +1 -2
- package/src/project-run/diagnostic-logging/observation-rendering.ts +1 -1
- package/src/project-run/invocation/candidate.ts +28 -15
- package/src/project-run/invocation/candidates.ts +56 -0
- package/src/project-run/invocation/creation.ts +7 -3
- package/src/project-run/invocation/execution.ts +136 -0
- package/src/project-run/invocation/run.ts +15 -179
- package/src/project-run/invocation/scheduler.ts +13 -6
- package/src/project-run/outputs/status.ts +15 -15
- package/src/project-run/progress-rendering/presentation.ts +35 -13
- package/src/project-run/progress-rendering/renderer-formatting.ts +20 -7
- package/src/project-run/progress-rendering/renderer-lifecycle.ts +23 -6
- package/src/project-run/progress-rendering/renderer.ts +10 -4
- package/src/project-run/project-context.ts +8 -4
- package/src/project-run/result.ts +5 -5
- package/src/project-run/run.ts +1 -1
- package/src/project-run/task-scheduler/admission-core/compiled-graph-lookup.ts +71 -0
- package/src/project-run/task-scheduler/admission-core/compiled-graph.ts +9 -4
- package/src/project-run/task-scheduler/admission-core/selection-query.ts +6 -4
- package/src/project-run/task-scheduler/admission-core/selection-seed.ts +36 -6
- package/src/project-run/task-scheduler/admission-core/selection-transition.ts +17 -8
- package/src/project-run/task-scheduler/execution-state.ts +4 -4
- package/src/project-run/task-scheduler/measurement/diagnostics.ts +10 -4
- package/src/project-run/task-scheduler/measurement/timing.ts +13 -5
- package/src/project-run/task-scheduler/scheduler-observation.ts +3 -1
- package/src/project-run/task-scheduler/scheduler-terminal-measurement.ts +24 -22
- package/src/project-run/task-scheduler/scheduler.ts +23 -6
- package/types/check/check.d.ts +178 -67
- package/types/check/flag-enablement.d.ts +42 -0
- package/types/check/handoff-provider-identity.d.ts +12 -0
- package/types/check/project-changes.d.ts +13 -0
- package/types/check/project-context.d.ts +10 -0
- package/types/check-settlement/facts.d.ts +1 -1
- package/types/data-boundary/canonical-data.d.ts +28 -5
- package/types/data-boundary/canonical-json.d.ts +18 -1
- package/types/data-boundary/closed-values.d.ts +17 -1
- package/types/data-boundary/config-glob.d.ts +5 -0
- package/types/data-boundary/project-path.d.ts +4 -0
- package/types/index.d.ts +27 -11
- package/types/package-checks/check-authoring.d.ts +45 -0
- package/types/package-checks/code-quality-findings/finding-waiver-authoring.d.ts +1 -1
- package/types/package-checks/code-quality-findings/finding-waiver-evidence.d.ts +1 -1
- package/types/package-checks/command-check/command-check.d.ts +48 -0
- package/types/package-checks/command-check/contract.d.ts +108 -0
- package/types/package-checks/command-check/execution.d.ts +7 -0
- package/types/package-checks/command-check/options.d.ts +11 -0
- package/types/package-checks/command-check/transcript.d.ts +8 -0
- package/types/package-checks/duplicate-detection/default-check.d.ts +5 -2
- package/types/package-checks/duplicate-detection/finding-messages.d.ts +1 -1
- package/types/package-checks/duplicate-detection/options.d.ts +4 -3
- package/types/package-checks/duplicate-detection/records.d.ts +1 -1
- package/types/package-checks/file-metrics/constructor.d.ts +5 -2
- package/types/package-checks/file-metrics/options.d.ts +4 -3
- package/types/package-checks/file-metrics/records.d.ts +1 -1
- package/types/package-checks/file-metrics/scc/batch-planner.d.ts +18 -0
- package/types/package-checks/file-metrics/scc/logical-scan-resources.d.ts +14 -0
- package/types/package-checks/function-metrics/analyzer/extensions/protocol.d.ts +3 -3
- package/types/package-checks/function-metrics/constructor.d.ts +5 -2
- package/types/package-checks/function-metrics/finding-messages.d.ts +1 -1
- package/types/package-checks/function-metrics/options.d.ts +4 -3
- package/types/package-checks/function-metrics/records.d.ts +1 -1
- package/types/package-checks/host-environment/git.d.ts +2 -0
- package/types/package-checks/host-environment/path.d.ts +1 -3
- package/types/package-checks/host-environment/process/contract.d.ts +17 -9
- package/types/package-checks/json-schema-validation/default-check.d.ts +4 -1
- package/types/package-checks/json-schema-validation/options.d.ts +2 -1
- package/types/package-checks/json-validation/default-check.d.ts +4 -1
- package/types/package-checks/json-validation/options.d.ts +2 -1
- package/types/package-checks/local-cache-options.d.ts +9 -0
- package/types/package-checks/maintenance-reminders/maintenance-reminders.d.ts +11 -2
- package/types/package-checks/markdown-link-validation/default-check.d.ts +4 -1
- package/types/package-checks/markdown-link-validation/options.d.ts +4 -7
- package/types/package-checks/markdown-lint/adapter.d.ts +10 -0
- package/types/package-checks/markdown-lint/default-check.d.ts +37 -0
- package/types/package-checks/markdown-lint/execution.d.ts +24 -0
- package/types/package-checks/markdown-lint/final-data.d.ts +8 -0
- package/types/package-checks/markdown-lint/finding-messages.d.ts +6 -0
- package/types/package-checks/markdown-lint/finding-waiver-identity.d.ts +3 -0
- package/types/package-checks/markdown-lint/findings-cache.d.ts +17 -0
- package/types/package-checks/markdown-lint/options-resolution.d.ts +3 -0
- package/types/package-checks/markdown-lint/options-validation.d.ts +2 -0
- package/types/package-checks/markdown-lint/options.d.ts +65 -0
- package/types/package-checks/markdown-lint/records.d.ts +39 -0
- package/types/package-checks/markdown-lint/unavailable-reasons.d.ts +3 -0
- package/types/package-checks/secret-detection/default-check.d.ts +4 -1
- package/types/package-checks/secret-detection/options.d.ts +3 -2
- package/types/package-tools/admission-policy/define-admission-policy.d.ts +26 -0
- package/types/{check → package-tools/finding-presentation}/finding-presentation.d.ts +3 -1
- package/types/{finding-waivers → package-tools/finding-waivers}/reconciliation.d.ts +3 -3
- package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/prediction.d.ts +2 -2
- package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/preparation.d.ts +1 -1
- package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/recording.d.ts +1 -1
- package/types/{learned-critical-path → package-tools/learned-critical-path}/selection-layers.d.ts +1 -1
- package/types/{learned-critical-path → package-tools/learned-critical-path}/static-decision.d.ts +1 -1
- package/types/{learned-critical-path → package-tools/learned-critical-path}/strategy.d.ts +1 -1
- package/types/project-definition/check-tree/authoring.d.ts +5 -3
- package/types/project-definition/check-tree/check-fields-authoring.d.ts +12 -7
- package/types/project-definition/check-tree/flag-conditions.d.ts +5 -0
- package/types/project-definition/check-tree/resolution.d.ts +6 -4
- package/types/project-definition/declarative-snapshot.d.ts +4 -1
- package/types/project-definition/project-changes.d.ts +30 -0
- package/types/project-definition/project-definition.d.ts +15 -30
- package/types/project-definition/scheduler-policy.d.ts +3 -3
- package/types/project-run/admission-strategy-provider/prepared-admission-strategy.d.ts +2 -2
- package/types/project-run/aggregation.d.ts +8 -6
- package/types/project-run/changes/git.d.ts +14 -0
- package/types/project-run/check-execution/admitted-check-execution.d.ts +18 -0
- package/types/project-run/check-execution/dependencies.d.ts +3 -0
- package/types/project-run/check-execution/execution-finalization.d.ts +1 -1
- package/types/project-run/check-execution/execution-settlement.d.ts +15 -7
- package/types/project-run/check-execution/flag-controls.d.ts +1 -1
- package/types/project-run/check-execution/lifecycle.d.ts +9 -5
- package/types/project-run/check-execution/{preflight-result.d.ts → preparation-result.d.ts} +3 -3
- package/types/project-run/check-execution/{preflight.d.ts → preparation.d.ts} +10 -9
- package/types/project-run/check-execution/ready-check-execution.d.ts +18 -0
- package/types/project-run/check-execution/resolved-checks.d.ts +12 -13
- package/types/project-run/check-execution/scheduled-check-run.d.ts +10 -0
- package/types/project-run/check-execution/terminal-result.d.ts +13 -1
- package/types/project-run/completion/completion.d.ts +3 -1
- package/types/project-run/controls/contract.d.ts +6 -16
- package/types/project-run/invocation/candidates.d.ts +8 -0
- package/types/project-run/invocation/execution.d.ts +5 -0
- package/types/project-run/invocation/run.d.ts +2 -2
- package/types/project-run/outputs/status.d.ts +4 -4
- package/types/project-run/progress-rendering/presentation.d.ts +4 -3
- package/types/project-run/progress-rendering/renderer-formatting.d.ts +5 -2
- package/types/project-run/progress-rendering/renderer-lifecycle.d.ts +2 -0
- package/types/project-run/progress-rendering/renderer.d.ts +4 -2
- package/types/project-run/project-context.d.ts +3 -3
- package/types/project-run/result.d.ts +3 -3
- package/types/project-run/run.d.ts +1 -1
- package/types/project-run/task-scheduler/admission-core/compiled-graph-lookup.d.ts +10 -0
- package/types/project-run/task-scheduler/execution-state.d.ts +4 -4
- package/types/project-run/task-scheduler/measurement/diagnostics.d.ts +2 -2
- package/types/project-run/task-scheduler/scheduler-terminal-measurement.d.ts +1 -1
- package/dist/esm/cache/cache-json-by-key.mjs.map +0 -1
- package/dist/esm/check/finding-presentation.mjs.map +0 -1
- package/dist/esm/finding-waivers/reconciliation.mjs.map +0 -1
- package/dist/esm/learned-critical-path/duration-model/bounded-history.mjs.map +0 -1
- package/dist/esm/learned-critical-path/duration-model/prediction.mjs.map +0 -1
- package/dist/esm/learned-critical-path/duration-model/preparation.mjs.map +0 -1
- package/dist/esm/learned-critical-path/duration-model/recording.mjs.map +0 -1
- package/dist/esm/learned-critical-path/duration-model/storage.mjs.map +0 -1
- package/dist/esm/learned-critical-path/selection-layers.mjs.map +0 -1
- package/dist/esm/learned-critical-path/static-decision.mjs.map +0 -1
- package/dist/esm/learned-critical-path/strategy.mjs.map +0 -1
- package/dist/esm/package-checks/project-files/config-glob.mjs.map +0 -1
- package/dist/esm/project-run/check-execution/preflight-result.mjs.map +0 -1
- package/dist/esm/project-run/check-execution/preflight.mjs.map +0 -1
- package/dist/esm/project-run/task-scheduler/critical-path-ranking.mjs.map +0 -1
- package/types/package-checks/project-files/config-glob.d.ts +0 -5
- /package/dist/esm/{check → package-tools/finding-presentation}/finding-presentation.mjs +0 -0
- /package/dist/esm/{project-run/task-scheduler → package-tools/learned-critical-path}/critical-path-ranking.mjs +0 -0
- /package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/bounded-history.mjs +0 -0
- /package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/recording.mjs +0 -0
- /package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/static-decision.mjs +0 -0
- /package/src/{project-run/task-scheduler → package-tools/learned-critical-path}/critical-path-ranking.ts +0 -0
- /package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/bounded-history.ts +0 -0
- /package/types/{cache → package-tools/cache}/cache-json-by-key.d.ts +0 -0
- /package/types/{project-run/task-scheduler → package-tools/learned-critical-path}/critical-path-ranking.d.ts +0 -0
- /package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/bounded-history.d.ts +0 -0
- /package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/storage.d.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options-resolution.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/options-resolution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"options-resolution.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/options-resolution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EACL,gCAAgC,EAChC,oBAAoB,EACrB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,EAC3B,4BAA4B,EAC7B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAClG,OAAO,EAAE,gCAAgC,EAAE,MAAM,2BAA2B,CAAC;AAE7E,OAAO,EAAE,kCAAkC,EAAE,MAAM,yBAAyB,CAAC;AAE7E,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;IACnC,gBAAgB,EAAE,SAAS;IAC3B,cAAc,EAAE,MAAM;IACtB,cAAc,EAAE,KAAK;CACtB,CAAC,CAAC;AACH,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC;IAClC,OAAO,EAAE,2BAA2B,CAAC,OAAO;IAC5C,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,uCAAuC,CAAC,CAAC;IAClF,MAAM,EAAE,2BAA2B,CAAC,MAAM;CAC3C,CAAC,CAAC;AAEH,6DAA6D;AAC7D,MAAM,UAAU,oCAAoC,CAClD,KAAc;IAEd,MAAM,KAAK,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,CAAC,6BAA6B,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5D,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,aAAa,GAAG,oBAAoB,CAAC,KAAK,CAAC,aAAa,EAAE,sBAAsB,CAAC,CAAC;IACxF,MAAM,KAAK,GAAG,gCAAgC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5D,IACE,MAAM,KAAK,SAAS;QACpB,KAAK,KAAK,SAAS;QACnB,aAAa,KAAK,SAAS;QAC3B,KAAK,KAAK,SAAS;QAEnB,OAAO,SAAS,CAAC;IACnB,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAC/E,OAAO,SAAS,KAAK,SAAS,IAAI,kCAAkC,CAAC,SAAS,CAAC;QAC7E,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB,CACvB,KAAwC,EACxC,KAA2D,EAC3D,aAA0E,EAC1E,MAAyC,EACzC,KAAqD;IAErD,OAAO,sBAAsB,CAAC;QAC5B,KAAK;QACL,aAAa;QACb,sBAAsB,EACpB,KAAK,CAAC,sBAAsB,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,sBAAsB;QAClF,2BAA2B,EACzB,KAAK,CAAC,2BAA2B,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,2BAA2B;QAC5F,4BAA4B,EAC1B,KAAK,CAAC,4BAA4B,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,4BAA4B;QAC9F,sBAAsB,EACpB,KAAK,CAAC,sBAAsB,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,sBAAsB;QACtF,0BAA0B,EACxB,KAAK,CAAC,0BAA0B,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,0BAA0B;QAC3F,KAAK;QACL,MAAM;KACP,CAAC,CAAC;AACL,CAAC;AAED,SAAS,6BAA6B,CACpC,KAAoD;IAEpD,OAAO,CACL,KAAK,KAAK,SAAS;QACnB,gCAAgC,CAAC,KAAK,EAAE;YACtC,QAAQ,EAAE;gBACR,OAAO;gBACP,eAAe;gBACf,wBAAwB;gBACxB,6BAA6B;gBAC7B,8BAA8B;gBAC9B,wBAAwB;gBACxB,4BAA4B;gBAC5B,OAAO;gBACP,QAAQ;aACT;YACD,QAAQ,EAAE,EAAE;SACb,CAAC,CACH,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,KAAK,KAAK,SAAS;QACxB,CAAC,CAAC,4BAA4B,CAAC,aAAa,CAAC;QAC7C,CAAC,CAAC,2BAA2B,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,cAAc,CAAC;IAC/C,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC3C,IACE,MAAM,KAAK,SAAS;QACpB,CAAC,gCAAgC,CAAC,MAAM,EAAE;YACxC,QAAQ,EAAE,CAAC,kBAAkB,EAAE,gBAAgB,EAAE,gBAAgB,CAAC;YAClE,QAAQ,EAAE,EAAE;SACb,CAAC,EACF,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,gBAAgB,EACd,MAAM,CAAC,gBAAgB,KAAK,SAAS;YACnC,CAAC,CAAC,cAAc,CAAC,gBAAgB;YACjC,CAAC,CAAC,MAAM,CAAC,gBAAgB;QAC7B,cAAc,EACZ,MAAM,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc;QAC7F,cAAc,EACZ,MAAM,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc;KAC9F,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { canonicalizeJsonObject } from \"../../data-boundary/canonical-data.ts\";\nimport {\n hasRequiredAndOptionalRecordKeys,\n snapshotClosedRecord\n} from \"../../data-boundary/closed-values.ts\";\nimport {\n defaultProjectFileSelection,\n resolveProjectFileSelection,\n snapshotProjectFileSelection\n} from \"../project-files/configuration.ts\";\nimport { DEFAULT_FINDING_POLICY, resolveFindingPolicy } from \"../code-quality-findings/policy.ts\";\nimport { resolveOptionalLocalCacheOptions } from \"../local-cache-options.ts\";\nimport type { ResolvedMarkdownLinkValidationOptions } from \"./options.ts\";\nimport { validMarkdownLinkValidationOptions } from \"./options-validation.ts\";\n\nconst DEFAULT_LIMITS = Object.freeze({\n maxMarkdownBytes: 1_048_576,\n maxOccurrences: 10_000,\n maxTargetReads: 1_000\n});\nconst DEFAULT_FILES = Object.freeze({\n exclude: defaultProjectFileSelection.exclude,\n include: Object.freeze([\"**/*.[mM][dD]\", \"**/*.[mM][aA][rR][kK][dD][oO][wW][nN]\"]),\n source: defaultProjectFileSelection.source\n});\n\n/** 将可省略 Markdown link policy 物化为完整、冻结的 execution options。 */\nexport function resolveMarkdownLinkValidationOptions(\n value: unknown\n): ResolvedMarkdownLinkValidationOptions | undefined {\n const input = snapshotClosedRecord(value);\n if (!isMarkdownLinkValidationInput(input)) return undefined;\n const limits = resolvedLimits(input.limits);\n const files = resolvedFiles(input.files);\n const findingPolicy = resolveFindingPolicy(input.findingPolicy, DEFAULT_FINDING_POLICY);\n const cache = resolveOptionalLocalCacheOptions(input.cache);\n if (\n limits === undefined ||\n files === undefined ||\n findingPolicy === undefined ||\n cache === undefined\n )\n return undefined;\n const candidate = optionsCandidate(input, files, findingPolicy, limits, cache);\n return candidate !== undefined && validMarkdownLinkValidationOptions(candidate)\n ? candidate\n : undefined;\n}\n\nfunction optionsCandidate(\n input: Readonly<Record<string, unknown>>,\n files: Exclude<ReturnType<typeof resolvedFiles>, undefined>,\n findingPolicy: Exclude<ReturnType<typeof resolveFindingPolicy>, undefined>,\n limits: Readonly<Record<string, unknown>>,\n cache: ResolvedMarkdownLinkValidationOptions[\"cache\"]\n) {\n return canonicalizeJsonObject({\n files,\n findingPolicy,\n requireExistingTargets:\n input.requireExistingTargets === undefined ? true : input.requireExistingTargets,\n validateSameDocumentAnchors:\n input.validateSameDocumentAnchors === undefined ? true : input.validateSameDocumentAnchors,\n validateCrossDocumentAnchors:\n input.validateCrossDocumentAnchors === undefined ? true : input.validateCrossDocumentAnchors,\n rootExternalTargetMode:\n input.rootExternalTargetMode === undefined ? \"report\" : input.rootExternalTargetMode,\n requireNonEmptyDirectories:\n input.requireNonEmptyDirectories === undefined ? false : input.requireNonEmptyDirectories,\n cache,\n limits\n });\n}\n\nfunction isMarkdownLinkValidationInput(\n input: Readonly<Record<string, unknown>> | undefined\n): input is Readonly<Record<string, unknown>> {\n return (\n input !== undefined &&\n hasRequiredAndOptionalRecordKeys(input, {\n optional: [\n \"files\",\n \"findingPolicy\",\n \"requireExistingTargets\",\n \"validateSameDocumentAnchors\",\n \"validateCrossDocumentAnchors\",\n \"rootExternalTargetMode\",\n \"requireNonEmptyDirectories\",\n \"cache\",\n \"limits\"\n ],\n required: []\n })\n );\n}\n\nfunction resolvedFiles(value: unknown) {\n return value === undefined\n ? snapshotProjectFileSelection(DEFAULT_FILES)\n : resolveProjectFileSelection(value, DEFAULT_FILES);\n}\n\nfunction resolvedLimits(value: unknown): Readonly<Record<string, unknown>> | undefined {\n if (value === undefined) return DEFAULT_LIMITS;\n const limits = snapshotClosedRecord(value);\n if (\n limits === undefined ||\n !hasRequiredAndOptionalRecordKeys(limits, {\n optional: [\"maxMarkdownBytes\", \"maxOccurrences\", \"maxTargetReads\"],\n required: []\n })\n ) {\n return undefined;\n }\n return Object.freeze({\n maxMarkdownBytes:\n limits.maxMarkdownBytes === undefined\n ? DEFAULT_LIMITS.maxMarkdownBytes\n : limits.maxMarkdownBytes,\n maxOccurrences:\n limits.maxOccurrences === undefined ? DEFAULT_LIMITS.maxOccurrences : limits.maxOccurrences,\n maxTargetReads:\n limits.maxTargetReads === undefined ? DEFAULT_LIMITS.maxTargetReads : limits.maxTargetReads\n });\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { isAbsolute } from "node:path";
|
|
2
1
|
import { snapshotExactClosedRecord } from "../../data-boundary/closed-values.mjs";
|
|
3
2
|
import { isPositiveSafeInteger } from "../../data-boundary/value-shapes.mjs";
|
|
4
3
|
import { validProjectFileSelection } from "../project-files/configuration.mjs";
|
|
5
4
|
import { validFindingPolicy } from "../code-quality-findings/policy.mjs";
|
|
5
|
+
import { validLocalCacheOptions } from "../local-cache-options.mjs";
|
|
6
6
|
function boundedPositiveSafeInteger(value, maximum) {
|
|
7
7
|
return isPositiveSafeInteger(value) && value <= maximum;
|
|
8
8
|
}
|
|
@@ -24,21 +24,9 @@ function validOptionFields(options) {
|
|
|
24
24
|
return (validProjectFileSelection(options.files) &&
|
|
25
25
|
validFindingPolicy(options.findingPolicy) &&
|
|
26
26
|
validAnchorValidationOptions(options) &&
|
|
27
|
-
|
|
27
|
+
validLocalCacheOptions(options.cache) &&
|
|
28
28
|
validMarkdownLinkLimits(options.limits));
|
|
29
29
|
}
|
|
30
|
-
function validMarkdownLinkCache(value) {
|
|
31
|
-
const disabled = snapshotExactClosedRecord(value, ["enabled"]);
|
|
32
|
-
if (disabled !== undefined && disabled.enabled === false)
|
|
33
|
-
return true;
|
|
34
|
-
const enabled = snapshotExactClosedRecord(value, ["enabled", "directory"]);
|
|
35
|
-
return (enabled !== undefined &&
|
|
36
|
-
enabled.enabled === true &&
|
|
37
|
-
typeof enabled.directory === "string" &&
|
|
38
|
-
enabled.directory.length > 0 &&
|
|
39
|
-
!enabled.directory.includes("\0") &&
|
|
40
|
-
isAbsolute(enabled.directory));
|
|
41
|
-
}
|
|
42
30
|
function validAnchorValidationOptions(options) {
|
|
43
31
|
return (typeof options.requireExistingTargets === "boolean" &&
|
|
44
32
|
typeof options.validateSameDocumentAnchors === "boolean" &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options-validation.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/options-validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"options-validation.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/options-validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAGnE,SAAS,0BAA0B,CAAC,KAAc,EAAE,OAAe;IACjE,OAAO,qBAAqB,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,OAAO,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,kCAAkC,CAChD,KAAc;IAEd,MAAM,OAAO,GAAG,yBAAyB,CAAC,KAAK,EAAE;QAC/C,OAAO;QACP,eAAe;QACf,wBAAwB;QACxB,6BAA6B;QAC7B,8BAA8B;QAC9B,wBAAwB;QACxB,4BAA4B;QAC5B,OAAO;QACP,QAAQ;KACT,CAAC,CAAC;IACH,OAAO,OAAO,KAAK,SAAS,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,iBAAiB,CAAC,OAA0C;IACnE,OAAO,CACL,yBAAyB,CAAC,OAAO,CAAC,KAAK,CAAC;QACxC,kBAAkB,CAAC,OAAO,CAAC,aAAa,CAAC;QACzC,4BAA4B,CAAC,OAAO,CAAC;QACrC,sBAAsB,CAAC,OAAO,CAAC,KAAK,CAAC;QACrC,uBAAuB,CAAC,OAAO,CAAC,MAAM,CAAC,CACxC,CAAC;AACJ,CAAC;AAED,SAAS,4BAA4B,CAAC,OAA0C;IAC9E,OAAO,CACL,OAAO,OAAO,CAAC,sBAAsB,KAAK,SAAS;QACnD,OAAO,OAAO,CAAC,2BAA2B,KAAK,SAAS;QACxD,OAAO,OAAO,CAAC,4BAA4B,KAAK,SAAS;QACzD,2BAA2B,CAAC,OAAO,CAAC,sBAAsB,CAAC;QAC3D,OAAO,OAAO,CAAC,0BAA0B,KAAK,SAAS,CACxD,CAAC;AACJ,CAAC;AAED,SAAS,2BAA2B,CAAC,KAAc;IACjD,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,UAAU,CAAC;AAC1E,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAc;IAC7C,MAAM,MAAM,GAAG,yBAAyB,CAAC,KAAK,EAAE;QAC9C,kBAAkB;QAClB,gBAAgB;QAChB,gBAAgB;KACjB,CAAC,CAAC;IACH,OAAO,CACL,MAAM,KAAK,SAAS;QACpB,0BAA0B,CAAC,MAAM,CAAC,gBAAgB,EAAE,UAAU,CAAC;QAC/D,0BAA0B,CAAC,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC;QAC1D,0BAA0B,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAC1D,CAAC;AACJ,CAAC","sourcesContent":["import { snapshotExactClosedRecord } from \"../../data-boundary/closed-values.ts\";\nimport { isPositiveSafeInteger } from \"../../data-boundary/value-shapes.ts\";\nimport { validProjectFileSelection } from \"../project-files/configuration.ts\";\nimport { validFindingPolicy } from \"../code-quality-findings/policy.ts\";\nimport { validLocalCacheOptions } from \"../local-cache-options.ts\";\nimport type { ResolvedMarkdownLinkValidationOptions } from \"./options.ts\";\n\nfunction boundedPositiveSafeInteger(value: unknown, maximum: number): value is number {\n return isPositiveSafeInteger(value) && value <= maximum;\n}\n\nexport function validMarkdownLinkValidationOptions(\n value: unknown\n): value is ResolvedMarkdownLinkValidationOptions {\n const options = snapshotExactClosedRecord(value, [\n \"files\",\n \"findingPolicy\",\n \"requireExistingTargets\",\n \"validateSameDocumentAnchors\",\n \"validateCrossDocumentAnchors\",\n \"rootExternalTargetMode\",\n \"requireNonEmptyDirectories\",\n \"cache\",\n \"limits\"\n ]);\n return options !== undefined && validOptionFields(options);\n}\n\nfunction validOptionFields(options: Readonly<Record<string, unknown>>): boolean {\n return (\n validProjectFileSelection(options.files) &&\n validFindingPolicy(options.findingPolicy) &&\n validAnchorValidationOptions(options) &&\n validLocalCacheOptions(options.cache) &&\n validMarkdownLinkLimits(options.limits)\n );\n}\n\nfunction validAnchorValidationOptions(options: Readonly<Record<string, unknown>>): boolean {\n return (\n typeof options.requireExistingTargets === \"boolean\" &&\n typeof options.validateSameDocumentAnchors === \"boolean\" &&\n typeof options.validateCrossDocumentAnchors === \"boolean\" &&\n validRootExternalTargetMode(options.rootExternalTargetMode) &&\n typeof options.requireNonEmptyDirectories === \"boolean\"\n );\n}\n\nfunction validRootExternalTargetMode(value: unknown): boolean {\n return value === \"ignore\" || value === \"report\" || value === \"validate\";\n}\n\nfunction validMarkdownLinkLimits(value: unknown): boolean {\n const limits = snapshotExactClosedRecord(value, [\n \"maxMarkdownBytes\",\n \"maxOccurrences\",\n \"maxTargetReads\"\n ]);\n return (\n limits !== undefined &&\n boundedPositiveSafeInteger(limits.maxMarkdownBytes, 16_777_216) &&\n boundedPositiveSafeInteger(limits.maxOccurrences, 100_000) &&\n boundedPositiveSafeInteger(limits.maxTargetReads, 10_000)\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/options.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n ProjectFileSelection,\n ProjectFileSelectionOptions\n} from \"../project-files/configuration.ts\";\nimport type { FindingPolicy } from \"../code-quality-findings/policy.ts\";\n\nexport type MarkdownRootExternalTargetMode = \"ignore\" | \"report\" | \"validate\";\n\n/** 调用方显式拥有的 Link-private parse-facts local cache policy。 */\ntype MarkdownLinkValidationCacheOptions
|
|
1
|
+
{"version":3,"file":"options.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/options.ts"],"names":[],"mappings":"","sourcesContent":["import type { PackageCheckAuthoringOptions } from \"../check-authoring.ts\";\nimport type {\n ProjectFileSelection,\n ProjectFileSelectionOptions\n} from \"../project-files/configuration.ts\";\nimport type { FindingPolicy } from \"../code-quality-findings/policy.ts\";\nimport type { LocalCacheOptions } from \"../local-cache-options.ts\";\n\nexport type MarkdownRootExternalTargetMode = \"ignore\" | \"report\" | \"validate\";\n\n/** 调用方显式拥有的 Link-private parse-facts local cache policy。 */\ntype MarkdownLinkValidationCacheOptions = LocalCacheOptions;\n\n/** 可省略的 Markdown validation work limits。 */\nexport interface MarkdownLinkValidationLimitOptions {\n readonly maxMarkdownBytes?: number;\n readonly maxOccurrences?: number;\n readonly maxTargetReads?: number;\n}\n\n/** `markdownLinkValidation(options?)` 接受的可省略 authoring policy。 */\nexport interface MarkdownLinkValidationOptions<\n Id extends string = string\n> extends PackageCheckAuthoringOptions<Id> {\n /** 参与本 Check 的 Markdown source selection;省略字段使用 package defaults。 */\n readonly files?: ProjectFileSelectionOptions;\n /** local-reference finding 是否使本 Check failed;省略时为 non-blocking。 */\n readonly findingPolicy?: FindingPolicy;\n /** `false` 时缺失的本地文件或目录不构成 finding。 */\n readonly requireExistingTargets?: boolean;\n /** 是否检查 `#anchor` 对当前 Markdown 文档标题的引用。 */\n readonly validateSameDocumentAnchors?: boolean;\n /** 是否检查直接指向的 Markdown 文件中的 `#anchor`。 */\n readonly validateCrossDocumentAnchors?: boolean;\n /** root 外本机目标的授权模式;不授权网络请求。 */\n readonly rootExternalTargetMode?: MarkdownRootExternalTargetMode;\n /** 是否将空目录目标视为 finding。 */\n readonly requireNonEmptyDirectories?: boolean;\n /** 每次运行的 Markdown 内容、occurrence 和 direct target work 上限。 */\n readonly limits?: MarkdownLinkValidationLimitOptions;\n /**\n * 显式启用的、调用方拥有的 Link parse-facts persistent cache。省略时关闭;enabled directory 必须 absolute、可信且可删除。\n * 本 Check 只在其中使用 `markdown-link-parse-facts-v1.jsonl` 保存 source-derived facts;调用方负责容量和删除,且不提供\n * confidentiality、automatic cleanup、concurrency 或 durability guarantees。cache 不可用时 fresh-parse,Check 结果不变。\n */\n readonly cache?: MarkdownLinkValidationCacheOptions;\n}\n\n/** `markdown-link-validation` execution 消费的完整、冻结 options。 */\nexport interface ResolvedMarkdownLinkValidationOptions {\n readonly files: ProjectFileSelection;\n readonly findingPolicy: FindingPolicy;\n readonly requireExistingTargets: boolean;\n readonly validateSameDocumentAnchors: boolean;\n readonly validateCrossDocumentAnchors: boolean;\n readonly rootExternalTargetMode: MarkdownRootExternalTargetMode;\n readonly requireNonEmptyDirectories: boolean;\n readonly cache: MarkdownLinkValidationCacheOptions;\n readonly limits: Readonly<{\n readonly maxMarkdownBytes: number;\n readonly maxOccurrences: number;\n readonly maxTargetReads: number;\n }>;\n}\n"]}
|
|
@@ -70,11 +70,10 @@ export function parseMarkdownLinkParseFactsPayload(value) {
|
|
|
70
70
|
return Object.freeze({ occurrences, headings });
|
|
71
71
|
}
|
|
72
72
|
function isCurrentCacheEnvelope(envelope) {
|
|
73
|
-
return (envelope
|
|
74
|
-
envelope
|
|
75
|
-
|
|
76
|
-
envelope
|
|
77
|
-
envelope.payloadVersion === CACHE_PAYLOAD_VERSION);
|
|
73
|
+
return (envelope?.cacheFormatVersion === CACHE_FORMAT_VERSION &&
|
|
74
|
+
validIdentityDigest(envelope?.identityDigest) &&
|
|
75
|
+
envelope?.parserContractVersion === MARKDOWN_LINK_PARSE_FACTS_PARSER_CONTRACT_VERSION &&
|
|
76
|
+
envelope?.payloadVersion === CACHE_PAYLOAD_VERSION);
|
|
78
77
|
}
|
|
79
78
|
function validIdentityDigest(value) {
|
|
80
79
|
return typeof value === "string" && /^[a-f0-9]{64}$/u.test(value);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-facts-cache-payload.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/parse-facts-cache-payload.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\n\nimport {\n snapshotClosedArray,\n snapshotExactClosedRecord\n} from \"../../data-boundary/closed-values.ts\";\nimport { canonicalJsonText } from \"../../data-boundary/canonical-data.ts\";\nimport { isPositiveSafeInteger } from \"../../data-boundary/value-shapes.ts\";\nimport type {\n MarkdownHeading,\n MarkdownLinkOccurrence,\n MarkdownSourcePosition,\n MarkdownSourceRange,\n ParsedMarkdownLinkFacts\n} from \"./markdown-parser.ts\";\n\nconst CACHE_FORMAT_VERSION = \"markdown-link-parse-facts-jsonl-v1\";\nconst CACHE_PAYLOAD_VERSION = \"1\";\n/** Version the resolver memo and persistent identity share when parser facts change. */\nexport const MARKDOWN_LINK_PARSE_FACTS_PARSER_CONTRACT_VERSION =\n \"mdast-gfm-frontmatter-github-slug-v1\";\nconst MAX_FACTS_PER_DOCUMENT = 100_000;\nconst MAX_FACT_STRING_LENGTH = 16_777_216;\n\ntype MarkdownLinkParseFactsPayload = Readonly<{\n readonly occurrences: readonly MarkdownLinkOccurrence[];\n readonly headings: readonly MarkdownHeading[];\n}>;\n\n/**\n * Serializes one complete Link-private JSONL envelope from immutable parser facts.\n * The session owns when this line is appended; this codec owns its shape and identity.\n */\nexport function cacheEnvelopeLine(identityDigest: string, facts: ParsedMarkdownLinkFacts): string {\n return `${canonicalJsonText({\n cacheFormatVersion: CACHE_FORMAT_VERSION,\n identityDigest,\n parserContractVersion: MARKDOWN_LINK_PARSE_FACTS_PARSER_CONTRACT_VERSION,\n payloadVersion: CACHE_PAYLOAD_VERSION,\n payload: projectMarkdownLinkParseFactsPayload(facts)\n })}\\n`;\n}\n\n/** Restores one complete, current-version JSONL envelope or rejects it as a cache miss. */\nexport function parseCacheEnvelopeLine(\n line: string\n):\n | Readonly<{ readonly identityDigest: string; readonly facts: ParsedMarkdownLinkFacts }>\n | undefined {\n try {\n const envelope = snapshotExactClosedRecord(JSON.parse(line), [\n \"cacheFormatVersion\",\n \"identityDigest\",\n \"parserContractVersion\",\n \"payloadVersion\",\n \"payload\"\n ]);\n if (!isCurrentCacheEnvelope(envelope)) return undefined;\n return Object.freeze({\n identityDigest: envelope.identityDigest,\n facts: parseMarkdownLinkParseFactsPayload(envelope.payload)\n });\n } catch {\n return undefined;\n }\n}\n\n/** SHA-256 identity over the current, exact authorized Markdown bytes. */\nexport function markdownBytesDigest(bytes: Uint8Array): string {\n return createHash(\"sha256\").update(bytes).digest(\"hex\");\n}\n\n/** Converts parser-owned immutable facts to the closed persistent JSON payload. */\nexport function projectMarkdownLinkParseFactsPayload(\n facts: ParsedMarkdownLinkFacts\n): MarkdownLinkParseFactsPayload {\n return Object.freeze({\n occurrences: Object.freeze(\n facts.occurrences.map((occurrence) =>\n Object.freeze({\n kind: occurrence.kind,\n rawDestination: occurrence.rawDestination,\n range: projectSourceRange(occurrence.range)\n })\n )\n ),\n headings: Object.freeze(\n facts.headings.map((heading) =>\n Object.freeze({ slug: heading.slug, range: projectSourceRange(heading.range) })\n )\n )\n });\n}\n\n/** Strictly restores the Link-private persistent JSON payload to immutable parser facts. */\nexport function parseMarkdownLinkParseFactsPayload(value: unknown): ParsedMarkdownLinkFacts {\n const payload = snapshotExactClosedRecord(value, [\"occurrences\", \"headings\"]);\n if (payload === undefined) throw new TypeError(\"Markdown Link cache payload must be closed\");\n const occurrences = parseOccurrences(payload.occurrences);\n const headings = parseHeadings(payload.headings);\n if (occurrences === undefined || headings === undefined) {\n throw new TypeError(\"Markdown Link cache payload contains invalid parse facts\");\n }\n return Object.freeze({ occurrences, headings });\n}\n\nfunction isCurrentCacheEnvelope(\n envelope: Readonly<Record<string, unknown>> | undefined\n): envelope is Readonly<{\n readonly identityDigest: string;\n readonly payload: unknown;\n}> {\n return (\n envelope !== undefined &&\n envelope.cacheFormatVersion === CACHE_FORMAT_VERSION &&\n validIdentityDigest(envelope.identityDigest) &&\n envelope.parserContractVersion === MARKDOWN_LINK_PARSE_FACTS_PARSER_CONTRACT_VERSION &&\n envelope.payloadVersion === CACHE_PAYLOAD_VERSION\n );\n}\n\nfunction validIdentityDigest(value: unknown): value is string {\n return typeof value === \"string\" && /^[a-f0-9]{64}$/u.test(value);\n}\n\nfunction parseOccurrences(value: unknown): readonly MarkdownLinkOccurrence[] | undefined {\n const values = boundedPayloadArray(value);\n if (values === undefined) return undefined;\n const occurrences: MarkdownLinkOccurrence[] = [];\n for (const candidate of values) {\n const occurrence = snapshotExactClosedRecord(candidate, [\"kind\", \"rawDestination\", \"range\"]);\n if (\n occurrence === undefined ||\n (occurrence.kind !== \"image\" && occurrence.kind !== \"link\") ||\n !validFactString(occurrence.rawDestination)\n ) {\n return undefined;\n }\n const range = parseSourceRange(occurrence.range);\n if (range === undefined) return undefined;\n occurrences.push(\n Object.freeze({ kind: occurrence.kind, rawDestination: occurrence.rawDestination, range })\n );\n }\n return Object.freeze(occurrences);\n}\n\nfunction parseHeadings(value: unknown): readonly MarkdownHeading[] | undefined {\n const values = boundedPayloadArray(value);\n if (values === undefined) return undefined;\n const headings: MarkdownHeading[] = [];\n for (const candidate of values) {\n const heading = snapshotExactClosedRecord(candidate, [\"slug\", \"range\"]);\n if (heading === undefined || !validFactString(heading.slug)) return undefined;\n const range = parseSourceRange(heading.range);\n if (range === undefined) return undefined;\n headings.push(Object.freeze({ slug: heading.slug, range }));\n }\n return Object.freeze(headings);\n}\n\nfunction boundedPayloadArray(value: unknown): readonly unknown[] | undefined {\n const values = snapshotClosedArray(value);\n return values !== undefined && values.length <= MAX_FACTS_PER_DOCUMENT ? values : undefined;\n}\n\nfunction validFactString(value: unknown): value is string {\n return (\n typeof value === \"string\" &&\n value.length <= MAX_FACT_STRING_LENGTH &&\n !hasUnpairedSurrogate(value)\n );\n}\n\nfunction parseSourceRange(value: unknown): MarkdownSourceRange | undefined {\n const range = snapshotExactClosedRecord(value, [\"startOffset\", \"endOffset\", \"start\", \"end\"]);\n if (\n range === undefined ||\n !boundedNonNegativeSafeInteger(range.startOffset) ||\n !boundedNonNegativeSafeInteger(range.endOffset) ||\n range.endOffset < range.startOffset\n ) {\n return undefined;\n }\n const start = parseSourcePosition(range.start);\n const end = parseSourcePosition(range.end);\n if (start === undefined || end === undefined || !sourcePositionFollows(end, start)) {\n return undefined;\n }\n return Object.freeze({ startOffset: range.startOffset, endOffset: range.endOffset, start, end });\n}\n\nfunction sourcePositionFollows(\n end: MarkdownSourcePosition,\n start: MarkdownSourcePosition\n): boolean {\n return end.line > start.line || (end.line === start.line && end.column >= start.column);\n}\n\nfunction parseSourcePosition(value: unknown): MarkdownSourcePosition | undefined {\n const position = snapshotExactClosedRecord(value, [\"line\", \"column\"]);\n if (\n position === undefined ||\n !boundedPositiveSafeInteger(position.line) ||\n !boundedPositiveSafeInteger(position.column)\n ) {\n return undefined;\n }\n return Object.freeze({ line: position.line, column: position.column });\n}\n\nfunction projectSourceRange(range: MarkdownSourceRange): MarkdownSourceRange {\n return Object.freeze({\n startOffset: range.startOffset,\n endOffset: range.endOffset,\n start: Object.freeze({ line: range.start.line, column: range.start.column }),\n end: Object.freeze({ line: range.end.line, column: range.end.column })\n });\n}\n\nfunction boundedNonNegativeSafeInteger(value: unknown): value is number {\n return (\n typeof value === \"number\" &&\n Number.isSafeInteger(value) &&\n value >= 0 &&\n value <= MAX_FACT_STRING_LENGTH\n );\n}\n\nfunction boundedPositiveSafeInteger(value: unknown): value is number {\n return isPositiveSafeInteger(value) && value <= MAX_FACT_STRING_LENGTH + 1;\n}\n\nfunction hasUnpairedSurrogate(value: string): boolean {\n for (let index = 0; index < value.length; index += 1) {\n const codeUnit = value.charCodeAt(index);\n if (codeUnit >= 0xd800 && codeUnit <= 0xdbff) {\n const nextCodeUnit = value.charCodeAt(index + 1);\n if (!(nextCodeUnit >= 0xdc00 && nextCodeUnit <= 0xdfff)) return true;\n index += 1;\n continue;\n }\n if (codeUnit >= 0xdc00 && codeUnit <= 0xdfff) return true;\n }\n return false;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"parse-facts-cache-payload.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/parse-facts-cache-payload.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\n\nimport {\n snapshotClosedArray,\n snapshotExactClosedRecord\n} from \"../../data-boundary/closed-values.ts\";\nimport { canonicalJsonText } from \"../../data-boundary/canonical-data.ts\";\nimport { isPositiveSafeInteger } from \"../../data-boundary/value-shapes.ts\";\nimport type {\n MarkdownHeading,\n MarkdownLinkOccurrence,\n MarkdownSourcePosition,\n MarkdownSourceRange,\n ParsedMarkdownLinkFacts\n} from \"./markdown-parser.ts\";\n\nconst CACHE_FORMAT_VERSION = \"markdown-link-parse-facts-jsonl-v1\";\nconst CACHE_PAYLOAD_VERSION = \"1\";\n/** Version the resolver memo and persistent identity share when parser facts change. */\nexport const MARKDOWN_LINK_PARSE_FACTS_PARSER_CONTRACT_VERSION =\n \"mdast-gfm-frontmatter-github-slug-v1\";\nconst MAX_FACTS_PER_DOCUMENT = 100_000;\nconst MAX_FACT_STRING_LENGTH = 16_777_216;\n\ntype MarkdownLinkParseFactsPayload = Readonly<{\n readonly occurrences: readonly MarkdownLinkOccurrence[];\n readonly headings: readonly MarkdownHeading[];\n}>;\n\n/**\n * Serializes one complete Link-private JSONL envelope from immutable parser facts.\n * The session owns when this line is appended; this codec owns its shape and identity.\n */\nexport function cacheEnvelopeLine(identityDigest: string, facts: ParsedMarkdownLinkFacts): string {\n return `${canonicalJsonText({\n cacheFormatVersion: CACHE_FORMAT_VERSION,\n identityDigest,\n parserContractVersion: MARKDOWN_LINK_PARSE_FACTS_PARSER_CONTRACT_VERSION,\n payloadVersion: CACHE_PAYLOAD_VERSION,\n payload: projectMarkdownLinkParseFactsPayload(facts)\n })}\\n`;\n}\n\n/** Restores one complete, current-version JSONL envelope or rejects it as a cache miss. */\nexport function parseCacheEnvelopeLine(\n line: string\n):\n | Readonly<{ readonly identityDigest: string; readonly facts: ParsedMarkdownLinkFacts }>\n | undefined {\n try {\n const envelope = snapshotExactClosedRecord(JSON.parse(line), [\n \"cacheFormatVersion\",\n \"identityDigest\",\n \"parserContractVersion\",\n \"payloadVersion\",\n \"payload\"\n ]);\n if (!isCurrentCacheEnvelope(envelope)) return undefined;\n return Object.freeze({\n identityDigest: envelope.identityDigest,\n facts: parseMarkdownLinkParseFactsPayload(envelope.payload)\n });\n } catch {\n return undefined;\n }\n}\n\n/** SHA-256 identity over the current, exact authorized Markdown bytes. */\nexport function markdownBytesDigest(bytes: Uint8Array): string {\n return createHash(\"sha256\").update(bytes).digest(\"hex\");\n}\n\n/** Converts parser-owned immutable facts to the closed persistent JSON payload. */\nexport function projectMarkdownLinkParseFactsPayload(\n facts: ParsedMarkdownLinkFacts\n): MarkdownLinkParseFactsPayload {\n return Object.freeze({\n occurrences: Object.freeze(\n facts.occurrences.map((occurrence) =>\n Object.freeze({\n kind: occurrence.kind,\n rawDestination: occurrence.rawDestination,\n range: projectSourceRange(occurrence.range)\n })\n )\n ),\n headings: Object.freeze(\n facts.headings.map((heading) =>\n Object.freeze({ slug: heading.slug, range: projectSourceRange(heading.range) })\n )\n )\n });\n}\n\n/** Strictly restores the Link-private persistent JSON payload to immutable parser facts. */\nexport function parseMarkdownLinkParseFactsPayload(value: unknown): ParsedMarkdownLinkFacts {\n const payload = snapshotExactClosedRecord(value, [\"occurrences\", \"headings\"]);\n if (payload === undefined) throw new TypeError(\"Markdown Link cache payload must be closed\");\n const occurrences = parseOccurrences(payload.occurrences);\n const headings = parseHeadings(payload.headings);\n if (occurrences === undefined || headings === undefined) {\n throw new TypeError(\"Markdown Link cache payload contains invalid parse facts\");\n }\n return Object.freeze({ occurrences, headings });\n}\n\nfunction isCurrentCacheEnvelope(\n envelope: Readonly<Record<string, unknown>> | undefined\n): envelope is Readonly<{\n readonly identityDigest: string;\n readonly payload: unknown;\n}> {\n return (\n envelope?.cacheFormatVersion === CACHE_FORMAT_VERSION &&\n validIdentityDigest(envelope?.identityDigest) &&\n envelope?.parserContractVersion === MARKDOWN_LINK_PARSE_FACTS_PARSER_CONTRACT_VERSION &&\n envelope?.payloadVersion === CACHE_PAYLOAD_VERSION\n );\n}\n\nfunction validIdentityDigest(value: unknown): value is string {\n return typeof value === \"string\" && /^[a-f0-9]{64}$/u.test(value);\n}\n\nfunction parseOccurrences(value: unknown): readonly MarkdownLinkOccurrence[] | undefined {\n const values = boundedPayloadArray(value);\n if (values === undefined) return undefined;\n const occurrences: MarkdownLinkOccurrence[] = [];\n for (const candidate of values) {\n const occurrence = snapshotExactClosedRecord(candidate, [\"kind\", \"rawDestination\", \"range\"]);\n if (\n occurrence === undefined ||\n (occurrence.kind !== \"image\" && occurrence.kind !== \"link\") ||\n !validFactString(occurrence.rawDestination)\n ) {\n return undefined;\n }\n const range = parseSourceRange(occurrence.range);\n if (range === undefined) return undefined;\n occurrences.push(\n Object.freeze({ kind: occurrence.kind, rawDestination: occurrence.rawDestination, range })\n );\n }\n return Object.freeze(occurrences);\n}\n\nfunction parseHeadings(value: unknown): readonly MarkdownHeading[] | undefined {\n const values = boundedPayloadArray(value);\n if (values === undefined) return undefined;\n const headings: MarkdownHeading[] = [];\n for (const candidate of values) {\n const heading = snapshotExactClosedRecord(candidate, [\"slug\", \"range\"]);\n if (heading === undefined || !validFactString(heading.slug)) return undefined;\n const range = parseSourceRange(heading.range);\n if (range === undefined) return undefined;\n headings.push(Object.freeze({ slug: heading.slug, range }));\n }\n return Object.freeze(headings);\n}\n\nfunction boundedPayloadArray(value: unknown): readonly unknown[] | undefined {\n const values = snapshotClosedArray(value);\n return values !== undefined && values.length <= MAX_FACTS_PER_DOCUMENT ? values : undefined;\n}\n\nfunction validFactString(value: unknown): value is string {\n return (\n typeof value === \"string\" &&\n value.length <= MAX_FACT_STRING_LENGTH &&\n !hasUnpairedSurrogate(value)\n );\n}\n\nfunction parseSourceRange(value: unknown): MarkdownSourceRange | undefined {\n const range = snapshotExactClosedRecord(value, [\"startOffset\", \"endOffset\", \"start\", \"end\"]);\n if (\n range === undefined ||\n !boundedNonNegativeSafeInteger(range.startOffset) ||\n !boundedNonNegativeSafeInteger(range.endOffset) ||\n range.endOffset < range.startOffset\n ) {\n return undefined;\n }\n const start = parseSourcePosition(range.start);\n const end = parseSourcePosition(range.end);\n if (start === undefined || end === undefined || !sourcePositionFollows(end, start)) {\n return undefined;\n }\n return Object.freeze({ startOffset: range.startOffset, endOffset: range.endOffset, start, end });\n}\n\nfunction sourcePositionFollows(\n end: MarkdownSourcePosition,\n start: MarkdownSourcePosition\n): boolean {\n return end.line > start.line || (end.line === start.line && end.column >= start.column);\n}\n\nfunction parseSourcePosition(value: unknown): MarkdownSourcePosition | undefined {\n const position = snapshotExactClosedRecord(value, [\"line\", \"column\"]);\n if (\n position === undefined ||\n !boundedPositiveSafeInteger(position.line) ||\n !boundedPositiveSafeInteger(position.column)\n ) {\n return undefined;\n }\n return Object.freeze({ line: position.line, column: position.column });\n}\n\nfunction projectSourceRange(range: MarkdownSourceRange): MarkdownSourceRange {\n return Object.freeze({\n startOffset: range.startOffset,\n endOffset: range.endOffset,\n start: Object.freeze({ line: range.start.line, column: range.start.column }),\n end: Object.freeze({ line: range.end.line, column: range.end.column })\n });\n}\n\nfunction boundedNonNegativeSafeInteger(value: unknown): value is number {\n return (\n typeof value === \"number\" &&\n Number.isSafeInteger(value) &&\n value >= 0 &&\n value <= MAX_FACT_STRING_LENGTH\n );\n}\n\nfunction boundedPositiveSafeInteger(value: unknown): value is number {\n return isPositiveSafeInteger(value) && value <= MAX_FACT_STRING_LENGTH + 1;\n}\n\nfunction hasUnpairedSurrogate(value: string): boolean {\n for (let index = 0; index < value.length; index += 1) {\n const codeUnit = value.charCodeAt(index);\n if (codeUnit >= 0xd800 && codeUnit <= 0xdbff) {\n const nextCodeUnit = value.charCodeAt(index + 1);\n if (!(nextCodeUnit >= 0xdc00 && nextCodeUnit <= 0xdfff)) return true;\n index += 1;\n continue;\n }\n if (codeUnit >= 0xdc00 && codeUnit <= 0xdfff) return true;\n }\n return false;\n}\n"]}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { lint } from "markdownlint/promise";
|
|
2
|
+
import { snapshotClosedArray, snapshotClosedRecord } from "../../data-boundary/closed-values.mjs";
|
|
3
|
+
import { MARKDOWN_LINT_RULE_NAMES } from "./options.mjs";
|
|
4
|
+
const FRONT_MATTER = /((^---[^\S\r\n\u2028\u2029]*$[\s\S]+?^---\s*)|(^\+\+\+[^\S\r\n\u2028\u2029]*$[\s\S]+?^(\+\+\+|\.\.\.)\s*)|(^\{[^\S\r\n\u2028\u2029]*$[\s\S]+?^\}\s*))(\r\n|\r|\n|$)/m;
|
|
5
|
+
const BACKEND_BY_RULE = {
|
|
6
|
+
"heading-increment": "MD001",
|
|
7
|
+
"no-reversed-links": "MD011",
|
|
8
|
+
"no-missing-space-atx": "MD018",
|
|
9
|
+
"fenced-code-language": "MD040",
|
|
10
|
+
"no-empty-links": "MD042",
|
|
11
|
+
"no-alt-text": "MD045",
|
|
12
|
+
"link-fragments": "MD051",
|
|
13
|
+
"reference-links-images": "MD052",
|
|
14
|
+
"table-column-count": "MD056"
|
|
15
|
+
};
|
|
16
|
+
/** Runs the fixed markdownlint Promise strings API and validates its raw protocol. */
|
|
17
|
+
export async function lintMarkdownString(sourcePath, sourceText, rules) {
|
|
18
|
+
let raw;
|
|
19
|
+
try {
|
|
20
|
+
raw = await lint({
|
|
21
|
+
config: backendConfiguration(rules),
|
|
22
|
+
frontMatter: FRONT_MATTER,
|
|
23
|
+
noInlineConfig: true,
|
|
24
|
+
strings: { [sourcePath]: sourceText }
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return "backend-failed";
|
|
29
|
+
}
|
|
30
|
+
return parseBackendFindings(raw, sourcePath, sourceText, rules);
|
|
31
|
+
}
|
|
32
|
+
function backendConfiguration(rules) {
|
|
33
|
+
const configuration = { default: false };
|
|
34
|
+
for (const rule of rules)
|
|
35
|
+
configuration[BACKEND_BY_RULE[rule]] = configurationFor(rule);
|
|
36
|
+
if (rules.includes("reference-links-images") && !rules.includes("heading-increment")) {
|
|
37
|
+
configuration.MD001 = configurationFor("heading-increment");
|
|
38
|
+
}
|
|
39
|
+
return configuration;
|
|
40
|
+
}
|
|
41
|
+
function configurationFor(rule) {
|
|
42
|
+
switch (rule) {
|
|
43
|
+
case "heading-increment":
|
|
44
|
+
return { front_matter_title: "^\\s*title\\s*[:=]" };
|
|
45
|
+
case "fenced-code-language":
|
|
46
|
+
return { allowed_languages: [], language_only: false };
|
|
47
|
+
case "link-fragments":
|
|
48
|
+
return { ignore_case: false, ignored_pattern: "" };
|
|
49
|
+
case "reference-links-images":
|
|
50
|
+
return { ignored_labels: ["x"], shortcut_syntax: false };
|
|
51
|
+
case "no-reversed-links":
|
|
52
|
+
case "no-missing-space-atx":
|
|
53
|
+
case "no-empty-links":
|
|
54
|
+
case "no-alt-text":
|
|
55
|
+
case "table-column-count":
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function parseBackendFindings(value, sourcePath, sourceText, selectedRules) {
|
|
60
|
+
const result = snapshotClosedRecord(value);
|
|
61
|
+
if (result === undefined ||
|
|
62
|
+
Object.keys(result).length !== 1 ||
|
|
63
|
+
!Object.hasOwn(result, sourcePath) ||
|
|
64
|
+
!Array.isArray(result[sourcePath]))
|
|
65
|
+
return "backend-protocol-invalid";
|
|
66
|
+
const lines = sourceText.split(/\r\n|\r|\n/u);
|
|
67
|
+
const findings = [];
|
|
68
|
+
for (const rawFinding of result[sourcePath]) {
|
|
69
|
+
const finding = parseBackendFinding(rawFinding, lines);
|
|
70
|
+
if (finding === undefined)
|
|
71
|
+
return "backend-protocol-invalid";
|
|
72
|
+
if (selectedRules.includes(finding.rule))
|
|
73
|
+
findings.push(finding);
|
|
74
|
+
}
|
|
75
|
+
return Object.freeze(findings);
|
|
76
|
+
}
|
|
77
|
+
function parseBackendFinding(value, lines) {
|
|
78
|
+
const fields = validatedBackendFindingFields(value, lines);
|
|
79
|
+
if (fields === undefined)
|
|
80
|
+
return undefined;
|
|
81
|
+
const range = parseMarkdownLintRange(fields.errorRange, fields.line);
|
|
82
|
+
return range === undefined
|
|
83
|
+
? undefined
|
|
84
|
+
: Object.freeze({ lineNumber: fields.lineNumber, range, rule: fields.rule });
|
|
85
|
+
}
|
|
86
|
+
function validatedBackendFindingFields(value, lines) {
|
|
87
|
+
const finding = snapshotClosedRecord(value);
|
|
88
|
+
if (finding === undefined)
|
|
89
|
+
return undefined;
|
|
90
|
+
const ruleNames = finding.ruleNames;
|
|
91
|
+
const lineNumber = finding.lineNumber;
|
|
92
|
+
if (!Array.isArray(ruleNames) ||
|
|
93
|
+
typeof ruleNames[0] !== "string" ||
|
|
94
|
+
typeof lineNumber !== "number")
|
|
95
|
+
return undefined;
|
|
96
|
+
if (!Number.isSafeInteger(lineNumber) || lineNumber < 1 || lineNumber > lines.length)
|
|
97
|
+
return undefined;
|
|
98
|
+
const rule = ruleForBackend(ruleNames[0]);
|
|
99
|
+
const line = lines[lineNumber - 1];
|
|
100
|
+
return rule === undefined || line === undefined
|
|
101
|
+
? undefined
|
|
102
|
+
: Object.freeze({ errorRange: finding.errorRange, line, lineNumber, rule });
|
|
103
|
+
}
|
|
104
|
+
function ruleForBackend(backendRule) {
|
|
105
|
+
return MARKDOWN_LINT_RULE_NAMES.find((rule) => BACKEND_BY_RULE[rule] === backendRule);
|
|
106
|
+
}
|
|
107
|
+
/** Validates one backend or restored-cache range against the current source line. */
|
|
108
|
+
export function parseMarkdownLintRange(value, line) {
|
|
109
|
+
if (value === null)
|
|
110
|
+
return null;
|
|
111
|
+
const range = snapshotClosedArray(value);
|
|
112
|
+
if (range?.length !== 2)
|
|
113
|
+
return undefined;
|
|
114
|
+
const [column, length] = range;
|
|
115
|
+
if (typeof column !== "number" ||
|
|
116
|
+
typeof length !== "number" ||
|
|
117
|
+
!Number.isSafeInteger(column) ||
|
|
118
|
+
!Number.isSafeInteger(length) ||
|
|
119
|
+
column < 1 ||
|
|
120
|
+
length < 1 ||
|
|
121
|
+
column - 1 + length > line.length)
|
|
122
|
+
return undefined;
|
|
123
|
+
return Object.freeze([column, length]);
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=adapter.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-lint/adapter.ts"],"names":[],"mappings":"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","sourcesContent":["import { lint } from \"markdownlint/promise\";\n\nimport { snapshotClosedArray, snapshotClosedRecord } from \"../../data-boundary/closed-values.ts\";\nimport { MARKDOWN_LINT_RULE_NAMES, type MarkdownLintRuleName } from \"./options.ts\";\n\nconst FRONT_MATTER =\n /((^---[^\\S\\r\\n\\u2028\\u2029]*$[\\s\\S]+?^---\\s*)|(^\\+\\+\\+[^\\S\\r\\n\\u2028\\u2029]*$[\\s\\S]+?^(\\+\\+\\+|\\.\\.\\.)\\s*)|(^\\{[^\\S\\r\\n\\u2028\\u2029]*$[\\s\\S]+?^\\}\\s*))(\\r\\n|\\r|\\n|$)/m;\n\nconst BACKEND_BY_RULE: Readonly<Record<MarkdownLintRuleName, string>> = {\n \"heading-increment\": \"MD001\",\n \"no-reversed-links\": \"MD011\",\n \"no-missing-space-atx\": \"MD018\",\n \"fenced-code-language\": \"MD040\",\n \"no-empty-links\": \"MD042\",\n \"no-alt-text\": \"MD045\",\n \"link-fragments\": \"MD051\",\n \"reference-links-images\": \"MD052\",\n \"table-column-count\": \"MD056\"\n};\n\nexport interface MarkdownLintBackendFinding {\n readonly lineNumber: number;\n readonly range: readonly [number, number] | null;\n readonly rule: MarkdownLintRuleName;\n}\n\n/** Runs the fixed markdownlint Promise strings API and validates its raw protocol. */\nexport async function lintMarkdownString(\n sourcePath: string,\n sourceText: string,\n rules: readonly MarkdownLintRuleName[]\n): Promise<readonly MarkdownLintBackendFinding[] | \"backend-failed\" | \"backend-protocol-invalid\"> {\n let raw: unknown;\n try {\n raw = await lint({\n config: backendConfiguration(rules),\n frontMatter: FRONT_MATTER,\n noInlineConfig: true,\n strings: { [sourcePath]: sourceText }\n });\n } catch {\n return \"backend-failed\";\n }\n return parseBackendFindings(raw, sourcePath, sourceText, rules);\n}\n\nfunction backendConfiguration(\n rules: readonly MarkdownLintRuleName[]\n): Readonly<Record<string, unknown>> {\n const configuration: Record<string, unknown> = { default: false };\n for (const rule of rules) configuration[BACKEND_BY_RULE[rule]] = configurationFor(rule);\n if (rules.includes(\"reference-links-images\") && !rules.includes(\"heading-increment\")) {\n configuration.MD001 = configurationFor(\"heading-increment\");\n }\n return configuration;\n}\n\nfunction configurationFor(rule: MarkdownLintRuleName): unknown {\n switch (rule) {\n case \"heading-increment\":\n return { front_matter_title: \"^\\\\s*title\\\\s*[:=]\" };\n case \"fenced-code-language\":\n return { allowed_languages: [], language_only: false };\n case \"link-fragments\":\n return { ignore_case: false, ignored_pattern: \"\" };\n case \"reference-links-images\":\n return { ignored_labels: [\"x\"], shortcut_syntax: false };\n case \"no-reversed-links\":\n case \"no-missing-space-atx\":\n case \"no-empty-links\":\n case \"no-alt-text\":\n case \"table-column-count\":\n return true;\n }\n}\n\nfunction parseBackendFindings(\n value: unknown,\n sourcePath: string,\n sourceText: string,\n selectedRules: readonly MarkdownLintRuleName[]\n): readonly MarkdownLintBackendFinding[] | \"backend-protocol-invalid\" {\n const result = snapshotClosedRecord(value);\n if (\n result === undefined ||\n Object.keys(result).length !== 1 ||\n !Object.hasOwn(result, sourcePath) ||\n !Array.isArray(result[sourcePath])\n )\n return \"backend-protocol-invalid\";\n const lines = sourceText.split(/\\r\\n|\\r|\\n/u);\n const findings: MarkdownLintBackendFinding[] = [];\n for (const rawFinding of result[sourcePath]) {\n const finding = parseBackendFinding(rawFinding, lines);\n if (finding === undefined) return \"backend-protocol-invalid\";\n if (selectedRules.includes(finding.rule)) findings.push(finding);\n }\n return Object.freeze(findings);\n}\n\nfunction parseBackendFinding(\n value: unknown,\n lines: readonly string[]\n): MarkdownLintBackendFinding | undefined {\n const fields = validatedBackendFindingFields(value, lines);\n if (fields === undefined) return undefined;\n const range = parseMarkdownLintRange(fields.errorRange, fields.line);\n return range === undefined\n ? undefined\n : Object.freeze({ lineNumber: fields.lineNumber, range, rule: fields.rule });\n}\n\nfunction validatedBackendFindingFields(\n value: unknown,\n lines: readonly string[]\n):\n | Readonly<{\n readonly errorRange: unknown;\n readonly line: string;\n readonly lineNumber: number;\n readonly rule: MarkdownLintRuleName;\n }>\n | undefined {\n const finding = snapshotClosedRecord(value);\n if (finding === undefined) return undefined;\n const ruleNames = finding.ruleNames;\n const lineNumber = finding.lineNumber;\n if (\n !Array.isArray(ruleNames) ||\n typeof ruleNames[0] !== \"string\" ||\n typeof lineNumber !== \"number\"\n )\n return undefined;\n if (!Number.isSafeInteger(lineNumber) || lineNumber < 1 || lineNumber > lines.length)\n return undefined;\n const rule = ruleForBackend(ruleNames[0]);\n const line = lines[lineNumber - 1];\n return rule === undefined || line === undefined\n ? undefined\n : Object.freeze({ errorRange: finding.errorRange, line, lineNumber, rule });\n}\n\nfunction ruleForBackend(backendRule: string): MarkdownLintRuleName | undefined {\n return MARKDOWN_LINT_RULE_NAMES.find((rule) => BACKEND_BY_RULE[rule] === backendRule);\n}\n\n/** Validates one backend or restored-cache range against the current source line. */\nexport function parseMarkdownLintRange(\n value: unknown,\n line: string\n): readonly [number, number] | null | undefined {\n if (value === null) return null;\n const range = snapshotClosedArray(value);\n if (range?.length !== 2) return undefined;\n const [column, length] = range;\n if (\n typeof column !== \"number\" ||\n typeof length !== \"number\" ||\n !Number.isSafeInteger(column) ||\n !Number.isSafeInteger(length) ||\n column < 1 ||\n length < 1 ||\n column - 1 + length > line.length\n )\n return undefined;\n return Object.freeze([column, length] as const);\n}\n"]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { defineCheck } from "../../check/check.mjs";
|
|
2
|
+
import { resolvePackageCheckAuthoringInput } from "../check-authoring.mjs";
|
|
3
|
+
import { MARKDOWN_LINT_CHECK_DEFINITION, executeMarkdownLint } from "./execution.mjs";
|
|
4
|
+
import { parseMarkdownLintData } from "./final-data.mjs";
|
|
5
|
+
import { resolveMarkdownLintOptions } from "./options-resolution.mjs";
|
|
6
|
+
import { validMarkdownLintOptions } from "./options-validation.mjs";
|
|
7
|
+
export function markdownLint(options = {}) {
|
|
8
|
+
const input = resolvePackageCheckAuthoringInput(options, ["files", "findingPolicy", "findingWaivers", "rules", "limits", "cache"], MARKDOWN_LINT_CHECK_DEFINITION);
|
|
9
|
+
if (input === undefined) {
|
|
10
|
+
throw new TypeError("markdownLint options must match the documented closed policy");
|
|
11
|
+
}
|
|
12
|
+
const resolvedOptions = resolveMarkdownLintOptions(input.domainOptions);
|
|
13
|
+
if (resolvedOptions === undefined) {
|
|
14
|
+
throw new TypeError("markdownLint options must match the documented closed policy");
|
|
15
|
+
}
|
|
16
|
+
return defineCheck({
|
|
17
|
+
...input.definition,
|
|
18
|
+
execute: executeMarkdownLint,
|
|
19
|
+
parseData: parseMarkdownLintData,
|
|
20
|
+
prepare: (preparedOptions) => validMarkdownLintOptions(preparedOptions)
|
|
21
|
+
? { status: "success", preparedOptions }
|
|
22
|
+
: {
|
|
23
|
+
status: "failure",
|
|
24
|
+
action: "block",
|
|
25
|
+
reason: { code: "invalid-options" },
|
|
26
|
+
messages: [
|
|
27
|
+
{
|
|
28
|
+
code: "invalid-options",
|
|
29
|
+
level: "error",
|
|
30
|
+
message: "markdownLint options are invalid; recreate the Check with markdownLint(options) or restore its complete resolved options."
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
options: resolvedOptions
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=default-check.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-check.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-lint/default-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA8B,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EACL,iCAAiC,EAElC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,8BAA8B,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrF,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAExD,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AA6CnE,MAAM,UAAU,YAAY,CAC1B,OAAO,GAAwB,EAAE;IAEjC,MAAM,KAAK,GAAG,iCAAiC,CAC7C,OAAO,EACP,CAAC,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,EACxE,8BAA8B,CAC/B,CAAC;IACF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,SAAS,CAAC,8DAA8D,CAAC,CAAC;IACtF,CAAC;IACD,MAAM,eAAe,GAAG,0BAA0B,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACxE,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,IAAI,SAAS,CAAC,8DAA8D,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,WAAW,CAAC;QACjB,GAAG,KAAK,CAAC,UAAU;QACnB,OAAO,EAAE,mBAAmB;QAC5B,SAAS,EAAE,qBAAqB;QAChC,OAAO,EAAE,CAAC,eAAe,EAAE,EAAE,CAC3B,wBAAwB,CAAC,eAAe,CAAC;YACvC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE;YACxC,CAAC,CAAC;gBACE,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE;gBACnC,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,iBAAiB;wBACvB,KAAK,EAAE,OAAO;wBACd,OAAO,EACL,2HAA2H;qBAC9H;iBACF;aACF;QACP,OAAO,EAAE,eAAe;KACzB,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { defineCheck, type TypedCheckWithOptions } from \"../../check/check.ts\";\nimport {\n resolvePackageCheckAuthoringInput,\n type PackageCheckIdentityInput\n} from \"../check-authoring.ts\";\nimport { MARKDOWN_LINT_CHECK_DEFINITION, executeMarkdownLint } from \"./execution.ts\";\nimport { parseMarkdownLintData } from \"./final-data.ts\";\nimport type { MarkdownLintOptions, ResolvedMarkdownLintOptions } from \"./options.ts\";\nimport { resolveMarkdownLintOptions } from \"./options-resolution.ts\";\nimport { validMarkdownLintOptions } from \"./options-validation.ts\";\n\n/**\n * 构造使用稳定闭合规则与受限输入的 Markdown 结构检查。\n * 精确 findingWaivers 只在完整 traversal 后应用;原 Finding、计数与缓存 facts 保留。\n *\n * @param options - 省略时采用八项 recommended 规则;非空 rules 数组完整替换该集合。\n * @returns 使用默认或指定 checkId 的 typed Check,携带完整冻结 options、parser 与执行逻辑。\n * @throws {TypeError} options 含未知字段、未知/重复规则、非法 limits 或 findingWaivers 时抛出。\n * @example 最小用法\n * ```ts\n * import { defineConfig, markdownLint, run } from \"@zxyycom/vibe-check\";\n *\n * const check = markdownLint({ findingPolicy: \"blocking\" });\n * const definition = defineConfig({\n * checks: [check],\n * outputs: {\n * diagnosticLogging: { enabled: false },\n * machinePublication: { enabled: false },\n * progressRendering: { enabled: false }\n * }\n * });\n *\n * const result = await run(definition);\n * if (result.kind !== \"completed\") throw new Error(`Run did not complete: ${result.kind}`);\n * const outcome = result.snapshot.checks.find(({ checkId }) => checkId === check.checkId)?.outcome;\n * if (outcome?.status !== \"passed\" && outcome?.status !== \"not-applicable\") {\n * throw new Error(`Markdown lint did not pass: ${outcome?.status ?? \"no outcome\"}`);\n * }\n * if (outcome.status === \"not-applicable\") console.warn(\"No Markdown input selected; no lint evidence.\");\n * ```\n */\nexport function markdownLint(\n options?: MarkdownLintOptions<\"markdown-lint\">\n): TypedCheckWithOptions<\n \"markdown-lint\",\n ResolvedMarkdownLintOptions,\n typeof parseMarkdownLintData\n>;\nexport function markdownLint<const Id extends string>(\n options: MarkdownLintOptions<Id> & PackageCheckIdentityInput<Id>\n): TypedCheckWithOptions<Id, ResolvedMarkdownLintOptions, typeof parseMarkdownLintData>;\nexport function markdownLint(\n options: MarkdownLintOptions\n): TypedCheckWithOptions<string, ResolvedMarkdownLintOptions, typeof parseMarkdownLintData>;\nexport function markdownLint(\n options: MarkdownLintOptions = {}\n): TypedCheckWithOptions<string, ResolvedMarkdownLintOptions, typeof parseMarkdownLintData> {\n const input = resolvePackageCheckAuthoringInput(\n options,\n [\"files\", \"findingPolicy\", \"findingWaivers\", \"rules\", \"limits\", \"cache\"],\n MARKDOWN_LINT_CHECK_DEFINITION\n );\n if (input === undefined) {\n throw new TypeError(\"markdownLint options must match the documented closed policy\");\n }\n const resolvedOptions = resolveMarkdownLintOptions(input.domainOptions);\n if (resolvedOptions === undefined) {\n throw new TypeError(\"markdownLint options must match the documented closed policy\");\n }\n return defineCheck({\n ...input.definition,\n execute: executeMarkdownLint,\n parseData: parseMarkdownLintData,\n prepare: (preparedOptions) =>\n validMarkdownLintOptions(preparedOptions)\n ? { status: \"success\", preparedOptions }\n : {\n status: \"failure\",\n action: \"block\",\n reason: { code: \"invalid-options\" },\n messages: [\n {\n code: \"invalid-options\",\n level: \"error\",\n message:\n \"markdownLint options are invalid; recreate the Check with markdownLint(options) or restore its complete resolved options.\"\n }\n ]\n },\n options: resolvedOptions\n });\n}\n"]}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { realpath } from "node:fs/promises";
|
|
3
|
+
import { appendCheckMessages } from "../../package-tools/finding-presentation/finding-presentation.mjs";
|
|
4
|
+
import { reconcileFindingWaivers } from "../../package-tools/finding-waivers/reconciliation.mjs";
|
|
5
|
+
import { reportFindingWaiverAudits } from "../code-quality-findings/finding-waiver-evidence.mjs";
|
|
6
|
+
import { collectProjectFiles } from "../project-files/collection.mjs";
|
|
7
|
+
import { partitionProjectFilesByEligibility } from "../project-files/input-eligibility.mjs";
|
|
8
|
+
import { probeRootContainedPath, readRegularFile } from "../markdown-link-validation/filesystem-probes.mjs";
|
|
9
|
+
import { isRootRelativePath } from "../markdown-link-validation/local-resolution.mjs";
|
|
10
|
+
import { lintMarkdownWithCache } from "./findings-cache.mjs";
|
|
11
|
+
import { markdownLintFindingMessages, markdownLintWaiverMessages } from "./finding-messages.mjs";
|
|
12
|
+
import { validMarkdownLintOptions } from "./options-validation.mjs";
|
|
13
|
+
import { buildMarkdownLintInputRejectedRecord, markdownLintFindingIdentity, markdownLintWaiverAuditRecord, orderedMarkdownLintCandidates } from "./records.mjs";
|
|
14
|
+
import { markdownLintUnavailableMessage } from "./unavailable-reasons.mjs";
|
|
15
|
+
export const MARKDOWN_LINT_CHECK_DEFINITION = {
|
|
16
|
+
checkId: "markdown-lint",
|
|
17
|
+
displayName: "Markdown lint"
|
|
18
|
+
};
|
|
19
|
+
/** Executes one bounded, ordered lint pass over the exact selected Markdown source paths. */
|
|
20
|
+
export async function executeMarkdownLint(context) {
|
|
21
|
+
return validMarkdownLintOptions(context.options)
|
|
22
|
+
? executeResolvedMarkdownLint(context)
|
|
23
|
+
: unavailable("invalid-options");
|
|
24
|
+
}
|
|
25
|
+
async function executeResolvedMarkdownLint(context) {
|
|
26
|
+
if (context.signal.aborted)
|
|
27
|
+
return unavailable("cancelled");
|
|
28
|
+
const discovered = discoverSources(context);
|
|
29
|
+
if (discovered.kind === "unavailable")
|
|
30
|
+
return unavailable(discovered.reason);
|
|
31
|
+
if (discovered.selectedPathCount === 0) {
|
|
32
|
+
return Object.freeze({ status: "not-applicable", reason: { code: "no-eligible-input" } });
|
|
33
|
+
}
|
|
34
|
+
for (const rejectedPath of discovered.rejectedPaths) {
|
|
35
|
+
const record = buildMarkdownLintInputRejectedRecord(rejectedPath);
|
|
36
|
+
context.records.report({ id: record.id }, record.data);
|
|
37
|
+
}
|
|
38
|
+
const root = await canonicalProjectRoot(context.project.root);
|
|
39
|
+
if (root === undefined)
|
|
40
|
+
return unavailable("project-root-unavailable");
|
|
41
|
+
const traversal = await traverseSources(discovered.sourcePaths, root, context.options, context.signal);
|
|
42
|
+
if (traversal.kind === "unavailable")
|
|
43
|
+
return appendRejected(unavailable(traversal.reason), discovered.rejectedPaths.length);
|
|
44
|
+
if (context.signal.aborted)
|
|
45
|
+
return appendRejected(unavailable("cancelled"), discovered.rejectedPaths.length);
|
|
46
|
+
return publishMarkdownLintTraversal(context, traversal, discovered.rejectedPaths);
|
|
47
|
+
}
|
|
48
|
+
/** Reconciles only a complete traversal, then publishes all evidence and the live policy outcome. */
|
|
49
|
+
export function publishMarkdownLintTraversal(context, traversal, rejectedPaths) {
|
|
50
|
+
const reconciliation = reconcileFindingWaivers({
|
|
51
|
+
findings: traversal.candidates,
|
|
52
|
+
identify: markdownLintFindingIdentity,
|
|
53
|
+
waivers: context.options.findingWaivers
|
|
54
|
+
});
|
|
55
|
+
const actionable = [];
|
|
56
|
+
for (const finding of reconciliation.findings) {
|
|
57
|
+
const data = finding.disposition === "waived"
|
|
58
|
+
? Object.freeze({
|
|
59
|
+
...finding.finding.data,
|
|
60
|
+
waiver: Object.freeze({ reason: finding.waiver.reason })
|
|
61
|
+
})
|
|
62
|
+
: finding.finding.data;
|
|
63
|
+
context.records.report({ id: finding.finding.id }, data);
|
|
64
|
+
if (finding.disposition !== "waived")
|
|
65
|
+
actionable.push(finding.finding);
|
|
66
|
+
}
|
|
67
|
+
reportFindingWaiverAudits(context, reconciliation, markdownLintWaiverAuditRecord);
|
|
68
|
+
const findingCount = traversal.candidates.length + rejectedPaths.length;
|
|
69
|
+
const blocking = context.options.findingPolicy === "blocking";
|
|
70
|
+
const result = Object.freeze({
|
|
71
|
+
status: actionable.length > 0 && blocking ? "failed" : "passed",
|
|
72
|
+
data: Object.freeze({
|
|
73
|
+
sourceFileCount: traversal.sourceFileCount,
|
|
74
|
+
findingCount,
|
|
75
|
+
rejectedInputCount: rejectedPaths.length
|
|
76
|
+
})
|
|
77
|
+
});
|
|
78
|
+
return appendCheckMessages(result, [
|
|
79
|
+
...markdownLintFindingMessages(actionable, rejectedPaths,
|
|
80
|
+
// Preserve legacy summaries without waivers; fully waived lint must not make rejected-input summaries errors.
|
|
81
|
+
blocking && (reconciliation.waiverAudits.length === 0 || actionable.length > 0)),
|
|
82
|
+
...markdownLintWaiverMessages(reconciliation)
|
|
83
|
+
]);
|
|
84
|
+
}
|
|
85
|
+
function discoverSources(context) {
|
|
86
|
+
try {
|
|
87
|
+
const selectedPaths = collectProjectFiles(context.project.root, context.options.files);
|
|
88
|
+
const partition = partitionProjectFilesByEligibility(selectedPaths, isMarkdownPath);
|
|
89
|
+
return Object.freeze({
|
|
90
|
+
kind: "complete",
|
|
91
|
+
sourcePaths: partition.acceptedPaths,
|
|
92
|
+
rejectedPaths: partition.rejectedPaths,
|
|
93
|
+
selectedPathCount: selectedPaths.length
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return Object.freeze({ kind: "unavailable", reason: "source-unavailable" });
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
async function canonicalProjectRoot(projectRoot) {
|
|
101
|
+
try {
|
|
102
|
+
return await realpath(projectRoot);
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
async function traverseSources(sourcePaths, rootPath, options, signal) {
|
|
109
|
+
const rawFindings = [];
|
|
110
|
+
let sourceFileCount = 0;
|
|
111
|
+
for (const sourcePath of sourcePaths) {
|
|
112
|
+
if (signal.aborted)
|
|
113
|
+
return unavailableTraversal("cancelled");
|
|
114
|
+
const source = await readMarkdownSource(rootPath, sourcePath, options.limits.maxMarkdownBytes);
|
|
115
|
+
if (!source.ok)
|
|
116
|
+
return unavailableTraversal(source.reason);
|
|
117
|
+
const text = source.text;
|
|
118
|
+
if (signal.aborted)
|
|
119
|
+
return unavailableTraversal("cancelled");
|
|
120
|
+
const linted = await lintMarkdownWithCache({
|
|
121
|
+
sourcePath,
|
|
122
|
+
sourceText: text,
|
|
123
|
+
rules: options.rules,
|
|
124
|
+
cache: options.cache,
|
|
125
|
+
signal
|
|
126
|
+
});
|
|
127
|
+
const findings = typeof linted === "string" ? linted : linted.findings;
|
|
128
|
+
if (typeof findings === "string")
|
|
129
|
+
return unavailableTraversal(findings);
|
|
130
|
+
if (signal.aborted)
|
|
131
|
+
return unavailableTraversal("cancelled");
|
|
132
|
+
sourceFileCount += 1;
|
|
133
|
+
for (const finding of findings)
|
|
134
|
+
rawFindings.push(Object.freeze({ path: sourcePath, finding }));
|
|
135
|
+
if (rawFindings.length > options.limits.maxFindings)
|
|
136
|
+
return unavailableTraversal("finding-limit-exceeded");
|
|
137
|
+
}
|
|
138
|
+
return Object.freeze({
|
|
139
|
+
kind: "complete",
|
|
140
|
+
candidates: orderedMarkdownLintCandidates(rawFindings, options.rules),
|
|
141
|
+
sourceFileCount
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
async function readMarkdownSource(rootPath, rootRelativePath, maxBytes) {
|
|
145
|
+
if (!isRootRelativePath(rootPath, rootRelativePath))
|
|
146
|
+
return Object.freeze({ ok: false, reason: "source-unavailable" });
|
|
147
|
+
const candidatePath = path.resolve(rootPath, rootRelativePath);
|
|
148
|
+
const probe = await probeRootContainedPath(rootPath, candidatePath);
|
|
149
|
+
if (probe.kind !== "contained")
|
|
150
|
+
return Object.freeze({ ok: false, reason: "source-unavailable" });
|
|
151
|
+
const source = await readRegularFile(probe.absolutePath, maxBytes);
|
|
152
|
+
if (!source.ok)
|
|
153
|
+
return Object.freeze({
|
|
154
|
+
ok: false,
|
|
155
|
+
reason: source.reason === "too-large" ? "source-too-large" : "source-unavailable"
|
|
156
|
+
});
|
|
157
|
+
try {
|
|
158
|
+
return Object.freeze({
|
|
159
|
+
ok: true,
|
|
160
|
+
text: new TextDecoder("utf-8", { fatal: true }).decode(source.bytes)
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return Object.freeze({ ok: false, reason: "source-unavailable" });
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
function isMarkdownPath(filePath) {
|
|
168
|
+
const extension = path.extname(filePath).toLowerCase();
|
|
169
|
+
return extension === ".md" || extension === ".markdown";
|
|
170
|
+
}
|
|
171
|
+
function unavailableTraversal(reason) {
|
|
172
|
+
return Object.freeze({ kind: "unavailable", reason });
|
|
173
|
+
}
|
|
174
|
+
function unavailable(reason) {
|
|
175
|
+
return Object.freeze({
|
|
176
|
+
status: "unavailable",
|
|
177
|
+
reason: { code: reason },
|
|
178
|
+
messages: Object.freeze([
|
|
179
|
+
Object.freeze({
|
|
180
|
+
code: reason,
|
|
181
|
+
level: "error",
|
|
182
|
+
message: markdownLintUnavailableMessage(reason)
|
|
183
|
+
})
|
|
184
|
+
])
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
function appendRejected(result, rejectedInputCount) {
|
|
188
|
+
if (rejectedInputCount === 0)
|
|
189
|
+
return result;
|
|
190
|
+
return Object.freeze({
|
|
191
|
+
...result,
|
|
192
|
+
messages: Object.freeze([
|
|
193
|
+
...(result.messages ?? []),
|
|
194
|
+
Object.freeze({
|
|
195
|
+
code: "input-rejected",
|
|
196
|
+
level: "warning",
|
|
197
|
+
message: `${rejectedInputCount} selected markdownLint input file(s) were rejected because only .md/.markdown paths are supported; inspect this Check's Records and narrow files.include/exclude.`
|
|
198
|
+
})
|
|
199
|
+
])
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=execution.mjs.map
|