@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-lint/execution.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"node:path\";\nimport { realpath } from \"node:fs/promises\";\n\nimport type { CheckExecutionContext, CheckResult } from \"../../check/check.ts\";\nimport { appendCheckMessages } from \"../../package-tools/finding-presentation/finding-presentation.ts\";\nimport { reconcileFindingWaivers } from \"../../package-tools/finding-waivers/reconciliation.ts\";\nimport { reportFindingWaiverAudits } from \"../code-quality-findings/finding-waiver-evidence.ts\";\nimport { collectProjectFiles } from \"../project-files/collection.ts\";\nimport { partitionProjectFilesByEligibility } from \"../project-files/input-eligibility.ts\";\nimport {\n probeRootContainedPath,\n readRegularFile\n} from \"../markdown-link-validation/filesystem-probes.ts\";\nimport { isRootRelativePath } from \"../markdown-link-validation/local-resolution.ts\";\nimport type { MarkdownLintBackendFinding } from \"./adapter.ts\";\nimport type { MarkdownLintFinalData } from \"./final-data.ts\";\nimport { lintMarkdownWithCache } from \"./findings-cache.ts\";\nimport { markdownLintFindingMessages, markdownLintWaiverMessages } from \"./finding-messages.ts\";\nimport type { ResolvedMarkdownLintOptions } from \"./options.ts\";\nimport { validMarkdownLintOptions } from \"./options-validation.ts\";\nimport {\n buildMarkdownLintInputRejectedRecord,\n markdownLintFindingIdentity,\n markdownLintWaiverAuditRecord,\n orderedMarkdownLintCandidates,\n type MarkdownLintRecordCandidate\n} from \"./records.ts\";\nimport {\n markdownLintUnavailableMessage,\n type MarkdownLintUnavailableReason\n} from \"./unavailable-reasons.ts\";\n\nexport type { MarkdownLintUnavailableReason } from \"./unavailable-reasons.ts\";\n\nexport const MARKDOWN_LINT_CHECK_DEFINITION = {\n checkId: \"markdown-lint\",\n displayName: \"Markdown lint\"\n} as const;\n\ntype Traversal =\n | Readonly<{\n readonly kind: \"complete\";\n readonly candidates: readonly MarkdownLintRecordCandidate[];\n readonly sourceFileCount: number;\n }>\n | Readonly<{ readonly kind: \"unavailable\"; readonly reason: MarkdownLintUnavailableReason }>;\n\n/** Executes one bounded, ordered lint pass over the exact selected Markdown source paths. */\nexport async function executeMarkdownLint(\n context: CheckExecutionContext<ResolvedMarkdownLintOptions>\n): Promise<CheckResult<MarkdownLintFinalData>> {\n return validMarkdownLintOptions(context.options)\n ? executeResolvedMarkdownLint(context)\n : unavailable(\"invalid-options\");\n}\n\nasync function executeResolvedMarkdownLint(\n context: CheckExecutionContext<ResolvedMarkdownLintOptions>\n): Promise<CheckResult<MarkdownLintFinalData>> {\n if (context.signal.aborted) return unavailable(\"cancelled\");\n const discovered = discoverSources(context);\n if (discovered.kind === \"unavailable\") return unavailable(discovered.reason);\n if (discovered.selectedPathCount === 0) {\n return Object.freeze({ status: \"not-applicable\", reason: { code: \"no-eligible-input\" } });\n }\n for (const rejectedPath of discovered.rejectedPaths) {\n const record = buildMarkdownLintInputRejectedRecord(rejectedPath);\n context.records.report({ id: record.id }, record.data);\n }\n const root = await canonicalProjectRoot(context.project.root);\n if (root === undefined) return unavailable(\"project-root-unavailable\");\n const traversal = await traverseSources(\n discovered.sourcePaths,\n root,\n context.options,\n context.signal\n );\n if (traversal.kind === \"unavailable\")\n return appendRejected(unavailable(traversal.reason), discovered.rejectedPaths.length);\n if (context.signal.aborted)\n return appendRejected(unavailable(\"cancelled\"), discovered.rejectedPaths.length);\n return publishMarkdownLintTraversal(context, traversal, discovered.rejectedPaths);\n}\n\n/** Reconciles only a complete traversal, then publishes all evidence and the live policy outcome. */\nexport function publishMarkdownLintTraversal(\n context: CheckExecutionContext<ResolvedMarkdownLintOptions>,\n traversal: Extract<Traversal, { readonly kind: \"complete\" }>,\n rejectedPaths: readonly string[]\n): CheckResult<MarkdownLintFinalData> {\n const reconciliation = reconcileFindingWaivers({\n findings: traversal.candidates,\n identify: markdownLintFindingIdentity,\n waivers: context.options.findingWaivers\n });\n const actionable: MarkdownLintRecordCandidate[] = [];\n for (const finding of reconciliation.findings) {\n const data =\n finding.disposition === \"waived\"\n ? Object.freeze({\n ...finding.finding.data,\n waiver: Object.freeze({ reason: finding.waiver.reason })\n })\n : finding.finding.data;\n context.records.report({ id: finding.finding.id }, data);\n if (finding.disposition !== \"waived\") actionable.push(finding.finding);\n }\n reportFindingWaiverAudits(context, reconciliation, markdownLintWaiverAuditRecord);\n const findingCount = traversal.candidates.length + rejectedPaths.length;\n const blocking = context.options.findingPolicy === \"blocking\";\n const result: CheckResult<MarkdownLintFinalData> = Object.freeze({\n status: actionable.length > 0 && blocking ? \"failed\" : \"passed\",\n data: Object.freeze({\n sourceFileCount: traversal.sourceFileCount,\n findingCount,\n rejectedInputCount: rejectedPaths.length\n })\n });\n return appendCheckMessages(result, [\n ...markdownLintFindingMessages(\n actionable,\n rejectedPaths,\n // Preserve legacy summaries without waivers; fully waived lint must not make rejected-input summaries errors.\n blocking && (reconciliation.waiverAudits.length === 0 || actionable.length > 0)\n ),\n ...markdownLintWaiverMessages(reconciliation)\n ]);\n}\n\nfunction discoverSources(context: CheckExecutionContext<ResolvedMarkdownLintOptions>):\n | Readonly<{\n readonly kind: \"complete\";\n readonly sourcePaths: readonly string[];\n readonly rejectedPaths: readonly string[];\n readonly selectedPathCount: number;\n }>\n | Readonly<{ readonly kind: \"unavailable\"; readonly reason: \"source-unavailable\" }> {\n try {\n const selectedPaths = collectProjectFiles(context.project.root, context.options.files);\n const partition = partitionProjectFilesByEligibility(selectedPaths, isMarkdownPath);\n return Object.freeze({\n kind: \"complete\" as const,\n sourcePaths: partition.acceptedPaths,\n rejectedPaths: partition.rejectedPaths,\n selectedPathCount: selectedPaths.length\n });\n } catch {\n return Object.freeze({ kind: \"unavailable\" as const, reason: \"source-unavailable\" as const });\n }\n}\n\nasync function canonicalProjectRoot(projectRoot: string): Promise<string | undefined> {\n try {\n return await realpath(projectRoot);\n } catch {\n return undefined;\n }\n}\n\nasync function traverseSources(\n sourcePaths: readonly string[],\n rootPath: string,\n options: ResolvedMarkdownLintOptions,\n signal: AbortSignal\n): Promise<Traversal> {\n const rawFindings: Array<\n Readonly<{ readonly path: string; readonly finding: MarkdownLintBackendFinding }>\n > = [];\n let sourceFileCount = 0;\n for (const sourcePath of sourcePaths) {\n if (signal.aborted) return unavailableTraversal(\"cancelled\");\n const source = await readMarkdownSource(rootPath, sourcePath, options.limits.maxMarkdownBytes);\n if (!source.ok) return unavailableTraversal(source.reason);\n const text = source.text;\n if (signal.aborted) return unavailableTraversal(\"cancelled\");\n const linted = await lintMarkdownWithCache({\n sourcePath,\n sourceText: text,\n rules: options.rules,\n cache: options.cache,\n signal\n });\n const findings = typeof linted === \"string\" ? linted : linted.findings;\n if (typeof findings === \"string\") return unavailableTraversal(findings);\n if (signal.aborted) return unavailableTraversal(\"cancelled\");\n sourceFileCount += 1;\n for (const finding of findings) rawFindings.push(Object.freeze({ path: sourcePath, finding }));\n if (rawFindings.length > options.limits.maxFindings)\n return unavailableTraversal(\"finding-limit-exceeded\");\n }\n return Object.freeze({\n kind: \"complete\" as const,\n candidates: orderedMarkdownLintCandidates(rawFindings, options.rules),\n sourceFileCount\n });\n}\n\nasync function readMarkdownSource(\n rootPath: string,\n rootRelativePath: string,\n maxBytes: number\n): Promise<\n | Readonly<{ readonly ok: true; readonly text: string }>\n | Readonly<{ readonly ok: false; readonly reason: \"source-too-large\" | \"source-unavailable\" }>\n> {\n if (!isRootRelativePath(rootPath, rootRelativePath))\n return Object.freeze({ ok: false, reason: \"source-unavailable\" });\n const candidatePath = path.resolve(rootPath, rootRelativePath);\n const probe = await probeRootContainedPath(rootPath, candidatePath);\n if (probe.kind !== \"contained\") return Object.freeze({ ok: false, reason: \"source-unavailable\" });\n const source = await readRegularFile(probe.absolutePath, maxBytes);\n if (!source.ok)\n return Object.freeze({\n ok: false,\n reason: source.reason === \"too-large\" ? \"source-too-large\" : \"source-unavailable\"\n });\n try {\n return Object.freeze({\n ok: true as const,\n text: new TextDecoder(\"utf-8\", { fatal: true }).decode(source.bytes)\n });\n } catch {\n return Object.freeze({ ok: false, reason: \"source-unavailable\" });\n }\n}\n\nfunction isMarkdownPath(filePath: string): boolean {\n const extension = path.extname(filePath).toLowerCase();\n return extension === \".md\" || extension === \".markdown\";\n}\n\nfunction unavailableTraversal(reason: MarkdownLintUnavailableReason): Traversal {\n return Object.freeze({ kind: \"unavailable\" as const, reason });\n}\n\nfunction unavailable(reason: MarkdownLintUnavailableReason): CheckResult<MarkdownLintFinalData> {\n return Object.freeze({\n status: \"unavailable\",\n reason: { code: reason },\n messages: Object.freeze([\n Object.freeze({\n code: reason,\n level: \"error\" as const,\n message: markdownLintUnavailableMessage(reason)\n })\n ])\n });\n}\n\nfunction appendRejected(\n result: CheckResult<MarkdownLintFinalData>,\n rejectedInputCount: number\n): CheckResult<MarkdownLintFinalData> {\n if (rejectedInputCount === 0) return result;\n return Object.freeze({\n ...result,\n messages: Object.freeze([\n ...(result.messages ?? []),\n Object.freeze({\n code: \"input-rejected\",\n level: \"warning\" as const,\n 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.`\n })\n ])\n });\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { exactFinalDataRecord, invalidFinalData, nonNegativeSafeInteger } from "../final-data-parsing.mjs";
|
|
2
|
+
/** 解析并验证 `markdownLint` 完成结果中的 canonical final data。 */
|
|
3
|
+
export function parseMarkdownLintData(data) {
|
|
4
|
+
const value = exactFinalDataRecord(data, ["sourceFileCount", "findingCount", "rejectedInputCount"], "markdownLint");
|
|
5
|
+
const sourceFileCount = nonNegativeSafeInteger(value.sourceFileCount);
|
|
6
|
+
const findingCount = nonNegativeSafeInteger(value.findingCount);
|
|
7
|
+
const rejectedInputCount = nonNegativeSafeInteger(value.rejectedInputCount);
|
|
8
|
+
if (sourceFileCount === undefined ||
|
|
9
|
+
findingCount === undefined ||
|
|
10
|
+
rejectedInputCount === undefined ||
|
|
11
|
+
findingCount < rejectedInputCount) {
|
|
12
|
+
throw invalidFinalData("markdownLint");
|
|
13
|
+
}
|
|
14
|
+
return Object.freeze({ sourceFileCount, findingCount, rejectedInputCount });
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=final-data.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"final-data.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-lint/final-data.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,0BAA0B,CAAC;AASlC,wDAAwD;AACxD,MAAM,UAAU,qBAAqB,CAAC,IAAa;IACjD,MAAM,KAAK,GAAG,oBAAoB,CAChC,IAAI,EACJ,CAAC,iBAAiB,EAAE,cAAc,EAAE,oBAAoB,CAAC,EACzD,cAAc,CACf,CAAC;IACF,MAAM,eAAe,GAAG,sBAAsB,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IACtE,MAAM,YAAY,GAAG,sBAAsB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAChE,MAAM,kBAAkB,GAAG,sBAAsB,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAC5E,IACE,eAAe,KAAK,SAAS;QAC7B,YAAY,KAAK,SAAS;QAC1B,kBAAkB,KAAK,SAAS;QAChC,YAAY,GAAG,kBAAkB,EACjC,CAAC;QACD,MAAM,gBAAgB,CAAC,cAAc,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,eAAe,EAAE,YAAY,EAAE,kBAAkB,EAAE,CAAC,CAAC;AAC9E,CAAC","sourcesContent":["import {\n exactFinalDataRecord,\n invalidFinalData,\n nonNegativeSafeInteger\n} from \"../final-data-parsing.ts\";\n\n/** 已完成 `markdownLint` execution 的 canonical final data。 */\nexport interface MarkdownLintFinalData {\n readonly sourceFileCount: number;\n readonly findingCount: number;\n readonly rejectedInputCount: number;\n}\n\n/** 解析并验证 `markdownLint` 完成结果中的 canonical final data。 */\nexport function parseMarkdownLintData(data: unknown): MarkdownLintFinalData {\n const value = exactFinalDataRecord(\n data,\n [\"sourceFileCount\", \"findingCount\", \"rejectedInputCount\"],\n \"markdownLint\"\n );\n const sourceFileCount = nonNegativeSafeInteger(value.sourceFileCount);\n const findingCount = nonNegativeSafeInteger(value.findingCount);\n const rejectedInputCount = nonNegativeSafeInteger(value.rejectedInputCount);\n if (\n sourceFileCount === undefined ||\n findingCount === undefined ||\n rejectedInputCount === undefined ||\n findingCount < rejectedInputCount\n ) {\n throw invalidFinalData(\"markdownLint\");\n }\n return Object.freeze({ sourceFileCount, findingCount, rejectedInputCount });\n}\n"]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { presentCheckFindings } from "../../package-tools/finding-presentation/finding-presentation.mjs";
|
|
2
|
+
import { markdownLintWaiverIdentity } from "./records.mjs";
|
|
3
|
+
const SUMMARY = {
|
|
4
|
+
"heading-increment": "heading levels may increase by only one level",
|
|
5
|
+
"no-reversed-links": "reversed link syntax is not supported",
|
|
6
|
+
"no-missing-space-atx": "ATX heading markers require a following space",
|
|
7
|
+
"fenced-code-language": "fenced code blocks require a language",
|
|
8
|
+
"no-empty-links": "links require a non-empty destination",
|
|
9
|
+
"no-alt-text": "images require alternative text",
|
|
10
|
+
"link-fragments": "same-document fragments must match a heading",
|
|
11
|
+
"reference-links-images": "reference links and images require a definition",
|
|
12
|
+
"table-column-count": "pipe table rows must have a consistent column count"
|
|
13
|
+
};
|
|
14
|
+
export function markdownLintFindingMessages(candidates, rejectedPaths, blocking) {
|
|
15
|
+
const findings = [
|
|
16
|
+
...candidates.map((candidate) => Object.freeze({ kind: "lint", candidate })),
|
|
17
|
+
...rejectedPaths.map((path) => Object.freeze({ kind: "rejected", path }))
|
|
18
|
+
];
|
|
19
|
+
return presentCheckFindings({
|
|
20
|
+
findings,
|
|
21
|
+
limit: 10,
|
|
22
|
+
message: (finding) => {
|
|
23
|
+
if (finding.kind === "rejected") {
|
|
24
|
+
return Object.freeze({
|
|
25
|
+
code: "finding-detail",
|
|
26
|
+
level: "warning",
|
|
27
|
+
message: `${finding.path}: selected input is not a supported Markdown source.`
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
const { path, range, rule } = finding.candidate.data;
|
|
31
|
+
return Object.freeze({
|
|
32
|
+
code: "finding-detail",
|
|
33
|
+
level: blocking ? "error" : "warning",
|
|
34
|
+
message: `${path}:${range.start.line}:${range.start.column} ${rule}: ${SUMMARY[rule]}.`
|
|
35
|
+
});
|
|
36
|
+
},
|
|
37
|
+
omittedMessage: ({ omittedCount }) => Object.freeze({
|
|
38
|
+
code: "findings-omitted",
|
|
39
|
+
level: blocking ? "error" : "warning",
|
|
40
|
+
message: `${omittedCount} additional Markdown lint finding(s) were not shown; inspect this Check's Records for the complete set.`
|
|
41
|
+
})
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/** Explains every configured waiver without turning accepted findings into error messages. */
|
|
45
|
+
export function markdownLintWaiverMessages(reconciliation) {
|
|
46
|
+
return Object.freeze(reconciliation.waiverAudits.map(markdownLintWaiverMessage));
|
|
47
|
+
}
|
|
48
|
+
function markdownLintWaiverMessage(audit) {
|
|
49
|
+
const { path, rule, range } = markdownLintWaiverIdentity(audit.waiver);
|
|
50
|
+
const subject = `${path}:${range.start.line}:${range.start.column}-${range.end.column} ${rule}`;
|
|
51
|
+
switch (audit.status) {
|
|
52
|
+
case "applied":
|
|
53
|
+
return Object.freeze({
|
|
54
|
+
code: "finding-waived",
|
|
55
|
+
level: "info",
|
|
56
|
+
message: `Markdown lint finding for ${subject} was waived: ${audit.waiver.reason}`
|
|
57
|
+
});
|
|
58
|
+
case "unused":
|
|
59
|
+
return Object.freeze({
|
|
60
|
+
code: "unused-finding-waiver",
|
|
61
|
+
level: "warning",
|
|
62
|
+
message: `Configured markdown-lint finding waiver for ${subject} matched no finding; remove it or update its identity. Reason: ${audit.waiver.reason}`
|
|
63
|
+
});
|
|
64
|
+
case "overmatched":
|
|
65
|
+
return Object.freeze({
|
|
66
|
+
code: "overmatched-finding-waiver",
|
|
67
|
+
level: "warning",
|
|
68
|
+
message: `Configured markdown-lint finding waiver for ${subject} matched ${audit.matchCount} findings and was not applied; inspect the duplicate identities. Reason: ${audit.waiver.reason}`
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=finding-messages.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-messages.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-lint/finding-messages.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CheckMessage } from \"../../check/check.ts\";\nimport { presentCheckFindings } from \"../../package-tools/finding-presentation/finding-presentation.ts\";\nimport type {\n FindingWaiverAudit,\n FindingWaiverReconciliation\n} from \"../../package-tools/finding-waivers/reconciliation.ts\";\nimport { markdownLintWaiverIdentity, type MarkdownLintRecordCandidate } from \"./records.ts\";\n\nconst SUMMARY: Readonly<Record<MarkdownLintRecordCandidate[\"data\"][\"rule\"], string>> = {\n \"heading-increment\": \"heading levels may increase by only one level\",\n \"no-reversed-links\": \"reversed link syntax is not supported\",\n \"no-missing-space-atx\": \"ATX heading markers require a following space\",\n \"fenced-code-language\": \"fenced code blocks require a language\",\n \"no-empty-links\": \"links require a non-empty destination\",\n \"no-alt-text\": \"images require alternative text\",\n \"link-fragments\": \"same-document fragments must match a heading\",\n \"reference-links-images\": \"reference links and images require a definition\",\n \"table-column-count\": \"pipe table rows must have a consistent column count\"\n};\n\nexport function markdownLintFindingMessages(\n candidates: readonly MarkdownLintRecordCandidate[],\n rejectedPaths: readonly string[],\n blocking: boolean\n): readonly CheckMessage[] {\n const findings = [\n ...candidates.map((candidate) => Object.freeze({ kind: \"lint\" as const, candidate })),\n ...rejectedPaths.map((path) => Object.freeze({ kind: \"rejected\" as const, path }))\n ];\n return presentCheckFindings({\n findings,\n limit: 10,\n message: (finding) => {\n if (finding.kind === \"rejected\") {\n return Object.freeze({\n code: \"finding-detail\",\n level: \"warning\" as const,\n message: `${finding.path}: selected input is not a supported Markdown source.`\n });\n }\n const { path, range, rule } = finding.candidate.data;\n return Object.freeze({\n code: \"finding-detail\",\n level: blocking ? (\"error\" as const) : (\"warning\" as const),\n message: `${path}:${range.start.line}:${range.start.column} ${rule}: ${SUMMARY[rule]}.`\n });\n },\n omittedMessage: ({ omittedCount }) =>\n Object.freeze({\n code: \"findings-omitted\",\n level: blocking ? (\"error\" as const) : (\"warning\" as const),\n message: `${omittedCount} additional Markdown lint finding(s) were not shown; inspect this Check's Records for the complete set.`\n })\n });\n}\n\n/** Explains every configured waiver without turning accepted findings into error messages. */\nexport function markdownLintWaiverMessages(\n reconciliation: FindingWaiverReconciliation<MarkdownLintRecordCandidate>\n): readonly CheckMessage[] {\n return Object.freeze(reconciliation.waiverAudits.map(markdownLintWaiverMessage));\n}\n\nfunction markdownLintWaiverMessage(audit: FindingWaiverAudit): CheckMessage {\n const { path, rule, range } = markdownLintWaiverIdentity(audit.waiver);\n const subject = `${path}:${range.start.line}:${range.start.column}-${range.end.column} ${rule}`;\n switch (audit.status) {\n case \"applied\":\n return Object.freeze({\n code: \"finding-waived\",\n level: \"info\",\n message: `Markdown lint finding for ${subject} was waived: ${audit.waiver.reason}`\n });\n case \"unused\":\n return Object.freeze({\n code: \"unused-finding-waiver\",\n level: \"warning\",\n message: `Configured markdown-lint finding waiver for ${subject} matched no finding; remove it or update its identity. Reason: ${audit.waiver.reason}`\n });\n case \"overmatched\":\n return Object.freeze({\n code: \"overmatched-finding-waiver\",\n level: \"warning\",\n message: `Configured markdown-lint finding waiver for ${subject} matched ${audit.matchCount} findings and was not applied; inspect the duplicate identities. Reason: ${audit.waiver.reason}`\n });\n }\n}\n"]}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { snapshotExactClosedRecord } from "../../data-boundary/closed-values.mjs";
|
|
2
|
+
import { isPositiveSafeInteger } from "../../data-boundary/value-shapes.mjs";
|
|
3
|
+
import { isNormalizedProjectRelativePath } from "../host-environment/path.mjs";
|
|
4
|
+
import { MARKDOWN_LINT_RULE_NAMES } from "./options.mjs";
|
|
5
|
+
/** Validates and detaches the complete public location used for exact waiver matching. */
|
|
6
|
+
export function resolveMarkdownLintFindingIdentity(value) {
|
|
7
|
+
const identity = snapshotExactClosedRecord(value, ["path", "rule", "range"]);
|
|
8
|
+
if (identity === undefined ||
|
|
9
|
+
!isNormalizedProjectRelativePath(identity.path) ||
|
|
10
|
+
!isMarkdownLintRuleName(identity.rule)) {
|
|
11
|
+
return undefined;
|
|
12
|
+
}
|
|
13
|
+
const range = snapshotExactClosedRecord(identity.range, ["start", "end"]);
|
|
14
|
+
if (range === undefined)
|
|
15
|
+
return undefined;
|
|
16
|
+
const start = resolvePosition(range.start);
|
|
17
|
+
const end = resolvePosition(range.end);
|
|
18
|
+
if (start === undefined ||
|
|
19
|
+
end === undefined ||
|
|
20
|
+
start.line !== end.line ||
|
|
21
|
+
end.column < start.column) {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
return Object.freeze({
|
|
25
|
+
path: identity.path,
|
|
26
|
+
rule: identity.rule,
|
|
27
|
+
range: Object.freeze({ start, end })
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
function resolvePosition(value) {
|
|
31
|
+
const position = snapshotExactClosedRecord(value, ["line", "column"]);
|
|
32
|
+
return position !== undefined &&
|
|
33
|
+
isPositiveSafeInteger(position.line) &&
|
|
34
|
+
isPositiveSafeInteger(position.column)
|
|
35
|
+
? Object.freeze({ line: position.line, column: position.column })
|
|
36
|
+
: undefined;
|
|
37
|
+
}
|
|
38
|
+
function isMarkdownLintRuleName(value) {
|
|
39
|
+
return typeof value === "string" && MARKDOWN_LINT_RULE_NAMES.some((rule) => rule === value);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=finding-waiver-identity.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-waiver-identity.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-lint/finding-waiver-identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,+BAA+B,EAAE,MAAM,6BAA6B,CAAC;AAC9E,OAAO,EACL,wBAAwB,EAGzB,MAAM,cAAc,CAAC;AAEtB,0FAA0F;AAC1F,MAAM,UAAU,kCAAkC,CAChD,KAAc;IAEd,MAAM,QAAQ,GAAG,yBAAyB,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7E,IACE,QAAQ,KAAK,SAAS;QACtB,CAAC,+BAA+B,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC/C,CAAC,sBAAsB,CAAC,QAAQ,CAAC,IAAI,CAAC,EACtC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,KAAK,GAAG,yBAAyB,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAC1E,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvC,IACE,KAAK,KAAK,SAAS;QACnB,GAAG,KAAK,SAAS;QACjB,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI;QACvB,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,EACzB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;KACrC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CACtB,KAAc;IAEd,MAAM,QAAQ,GAAG,yBAAyB,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IACtE,OAAO,QAAQ,KAAK,SAAS;QAC3B,qBAAqB,CAAC,QAAQ,CAAC,IAAI,CAAC;QACpC,qBAAqB,CAAC,QAAQ,CAAC,MAAM,CAAC;QACtC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;QACjE,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAc;IAC5C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,wBAAwB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;AAC9F,CAAC","sourcesContent":["import { snapshotExactClosedRecord } from \"../../data-boundary/closed-values.ts\";\nimport { isPositiveSafeInteger } from \"../../data-boundary/value-shapes.ts\";\nimport { isNormalizedProjectRelativePath } from \"../host-environment/path.ts\";\nimport {\n MARKDOWN_LINT_RULE_NAMES,\n type MarkdownLintFindingIdentity,\n type MarkdownLintRuleName\n} from \"./options.ts\";\n\n/** Validates and detaches the complete public location used for exact waiver matching. */\nexport function resolveMarkdownLintFindingIdentity(\n value: unknown\n): MarkdownLintFindingIdentity | undefined {\n const identity = snapshotExactClosedRecord(value, [\"path\", \"rule\", \"range\"]);\n if (\n identity === undefined ||\n !isNormalizedProjectRelativePath(identity.path) ||\n !isMarkdownLintRuleName(identity.rule)\n ) {\n return undefined;\n }\n const range = snapshotExactClosedRecord(identity.range, [\"start\", \"end\"]);\n if (range === undefined) return undefined;\n const start = resolvePosition(range.start);\n const end = resolvePosition(range.end);\n if (\n start === undefined ||\n end === undefined ||\n start.line !== end.line ||\n end.column < start.column\n ) {\n return undefined;\n }\n return Object.freeze({\n path: identity.path,\n rule: identity.rule,\n range: Object.freeze({ start, end })\n });\n}\n\nfunction resolvePosition(\n value: unknown\n): MarkdownLintFindingIdentity[\"range\"][\"start\"] | undefined {\n const position = snapshotExactClosedRecord(value, [\"line\", \"column\"]);\n return position !== undefined &&\n isPositiveSafeInteger(position.line) &&\n isPositiveSafeInteger(position.column)\n ? Object.freeze({ line: position.line, column: position.column })\n : undefined;\n}\n\nfunction isMarkdownLintRuleName(value: unknown): value is MarkdownLintRuleName {\n return typeof value === \"string\" && MARKDOWN_LINT_RULE_NAMES.some((rule) => rule === value);\n}\n"]}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
import { snapshotClosedRecord, snapshotExactClosedRecord } from "../../data-boundary/closed-values.mjs";
|
|
4
|
+
import { cacheJsonByKey } from "../../package-tools/cache/cache-json-by-key.mjs";
|
|
5
|
+
import { lintMarkdownString, parseMarkdownLintRange } from "./adapter.mjs";
|
|
6
|
+
import { MARKDOWN_LINT_RULE_NAMES } from "./options.mjs";
|
|
7
|
+
/** Bump when adapter configuration or finding interpretation changes without a backend version change. */
|
|
8
|
+
const CACHE_FORMAT_VERSION = "markdown-lint-findings-v1";
|
|
9
|
+
const backendVersion = installedMarkdownlintVersion();
|
|
10
|
+
class LintComputationUnavailable extends Error {
|
|
11
|
+
reason;
|
|
12
|
+
constructor(reason) {
|
|
13
|
+
super(`Markdown lint unavailable: ${reason}`);
|
|
14
|
+
this.reason = reason;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/** Reuses only validated per-source findings; all source reads and Check settlement remain live. */
|
|
18
|
+
export async function lintMarkdownWithCache(input) {
|
|
19
|
+
const { sourcePath, sourceText, rules, cache, signal } = input;
|
|
20
|
+
if (signal.aborted)
|
|
21
|
+
return "cancelled";
|
|
22
|
+
if (!cache.enabled || backendVersion === undefined)
|
|
23
|
+
return lintFresh(input);
|
|
24
|
+
try {
|
|
25
|
+
const result = await cacheJsonByKey({
|
|
26
|
+
directory: cache.directory,
|
|
27
|
+
key: JSON.stringify({
|
|
28
|
+
path: sourcePath,
|
|
29
|
+
sourceDigest: createHash("sha256").update(sourceText, "utf8").digest("hex"),
|
|
30
|
+
rules
|
|
31
|
+
}),
|
|
32
|
+
namespace: "markdown-lint-findings",
|
|
33
|
+
version: `${CACHE_FORMAT_VERSION}:${backendVersion}`,
|
|
34
|
+
compute: async () => {
|
|
35
|
+
if (signal.aborted)
|
|
36
|
+
throw new LintComputationUnavailable("cancelled");
|
|
37
|
+
const findings = await lintMarkdownString(sourcePath, sourceText, rules);
|
|
38
|
+
if (typeof findings === "string")
|
|
39
|
+
throw new LintComputationUnavailable(findings);
|
|
40
|
+
if (signal.aborted)
|
|
41
|
+
throw new LintComputationUnavailable("cancelled");
|
|
42
|
+
return { findings };
|
|
43
|
+
},
|
|
44
|
+
parse: (value) => parseLintFacts(value, sourceText, rules)
|
|
45
|
+
});
|
|
46
|
+
if (signal.aborted)
|
|
47
|
+
return "cancelled";
|
|
48
|
+
return Object.freeze({ findings: result.value.findings, source: result.source });
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
if (signal.aborted)
|
|
52
|
+
return "cancelled";
|
|
53
|
+
if (error instanceof LintComputationUnavailable)
|
|
54
|
+
return error.reason;
|
|
55
|
+
throw error;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async function lintFresh(input) {
|
|
59
|
+
const findings = await lintMarkdownString(input.sourcePath, input.sourceText, input.rules);
|
|
60
|
+
if (input.signal.aborted)
|
|
61
|
+
return "cancelled";
|
|
62
|
+
return typeof findings === "string"
|
|
63
|
+
? findings
|
|
64
|
+
: Object.freeze({ findings, source: "uncached" });
|
|
65
|
+
}
|
|
66
|
+
function parseLintFacts(value, sourceText, rules) {
|
|
67
|
+
const payload = snapshotExactClosedRecord(value, ["findings"]);
|
|
68
|
+
if (payload === undefined || !Array.isArray(payload.findings))
|
|
69
|
+
throw new TypeError("Invalid Markdown lint cache payload");
|
|
70
|
+
const lines = sourceText.split(/\r\n|\r|\n/u);
|
|
71
|
+
const findings = payload.findings.map((rawFinding) => {
|
|
72
|
+
const finding = snapshotExactClosedRecord(rawFinding, ["lineNumber", "range", "rule"]);
|
|
73
|
+
if (finding === undefined ||
|
|
74
|
+
!isMarkdownLintRuleName(finding.rule) ||
|
|
75
|
+
!rules.includes(finding.rule) ||
|
|
76
|
+
typeof finding.lineNumber !== "number" ||
|
|
77
|
+
!Number.isSafeInteger(finding.lineNumber) ||
|
|
78
|
+
finding.lineNumber < 1 ||
|
|
79
|
+
finding.lineNumber > lines.length)
|
|
80
|
+
throw new TypeError("Invalid Markdown lint cached finding");
|
|
81
|
+
const line = lines[finding.lineNumber - 1];
|
|
82
|
+
if (line === undefined)
|
|
83
|
+
throw new TypeError("Invalid Markdown lint cached line");
|
|
84
|
+
const range = parseMarkdownLintRange(finding.range, line);
|
|
85
|
+
if (range === undefined)
|
|
86
|
+
throw new TypeError("Invalid Markdown lint cached range");
|
|
87
|
+
return Object.freeze({
|
|
88
|
+
lineNumber: finding.lineNumber,
|
|
89
|
+
range,
|
|
90
|
+
rule: finding.rule
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
return Object.freeze({ findings: Object.freeze(findings) });
|
|
94
|
+
}
|
|
95
|
+
function isMarkdownLintRuleName(value) {
|
|
96
|
+
return typeof value === "string" && MARKDOWN_LINT_RULE_NAMES.some((rule) => rule === value);
|
|
97
|
+
}
|
|
98
|
+
function installedMarkdownlintVersion() {
|
|
99
|
+
try {
|
|
100
|
+
const packageJson = createRequire(import.meta.url)("markdownlint/package.json");
|
|
101
|
+
const metadata = snapshotClosedRecord(packageJson);
|
|
102
|
+
return typeof metadata?.version === "string" && metadata.version.length > 0
|
|
103
|
+
? metadata.version
|
|
104
|
+
: undefined;
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=findings-cache.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findings-cache.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-lint/findings-cache.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { createRequire } from \"node:module\";\n\nimport {\n snapshotClosedRecord,\n snapshotExactClosedRecord\n} from \"../../data-boundary/closed-values.ts\";\nimport { cacheJsonByKey } from \"../../package-tools/cache/cache-json-by-key.ts\";\nimport {\n lintMarkdownString,\n parseMarkdownLintRange,\n type MarkdownLintBackendFinding\n} from \"./adapter.ts\";\nimport {\n MARKDOWN_LINT_RULE_NAMES,\n type MarkdownLintCacheOptions,\n type MarkdownLintRuleName\n} from \"./options.ts\";\nimport type { MarkdownLintUnavailableReason } from \"./unavailable-reasons.ts\";\n\ntype LintFacts = Readonly<{ readonly findings: readonly MarkdownLintBackendFinding[] }>;\ntype MarkdownLintCacheInput = Readonly<{\n readonly sourcePath: string;\n readonly sourceText: string;\n readonly rules: readonly MarkdownLintRuleName[];\n readonly cache: MarkdownLintCacheOptions;\n readonly signal: AbortSignal;\n}>;\nexport type MarkdownLintFactsResult =\n | Readonly<{\n readonly findings: readonly MarkdownLintBackendFinding[];\n readonly source: \"cache\" | \"computed\" | \"uncached\";\n }>\n | MarkdownLintUnavailableReason;\n\n/** Bump when adapter configuration or finding interpretation changes without a backend version change. */\nconst CACHE_FORMAT_VERSION = \"markdown-lint-findings-v1\";\nconst backendVersion = installedMarkdownlintVersion();\n\nclass LintComputationUnavailable extends Error {\n readonly reason: MarkdownLintUnavailableReason;\n\n constructor(reason: MarkdownLintUnavailableReason) {\n super(`Markdown lint unavailable: ${reason}`);\n this.reason = reason;\n }\n}\n\n/** Reuses only validated per-source findings; all source reads and Check settlement remain live. */\nexport async function lintMarkdownWithCache(\n input: MarkdownLintCacheInput\n): Promise<MarkdownLintFactsResult> {\n const { sourcePath, sourceText, rules, cache, signal } = input;\n if (signal.aborted) return \"cancelled\";\n if (!cache.enabled || backendVersion === undefined) return lintFresh(input);\n\n try {\n const result = await cacheJsonByKey({\n directory: cache.directory,\n key: JSON.stringify({\n path: sourcePath,\n sourceDigest: createHash(\"sha256\").update(sourceText, \"utf8\").digest(\"hex\"),\n rules\n }),\n namespace: \"markdown-lint-findings\",\n version: `${CACHE_FORMAT_VERSION}:${backendVersion}`,\n compute: async () => {\n if (signal.aborted) throw new LintComputationUnavailable(\"cancelled\");\n const findings = await lintMarkdownString(sourcePath, sourceText, rules);\n if (typeof findings === \"string\") throw new LintComputationUnavailable(findings);\n if (signal.aborted) throw new LintComputationUnavailable(\"cancelled\");\n return { findings };\n },\n parse: (value) => parseLintFacts(value, sourceText, rules)\n });\n if (signal.aborted) return \"cancelled\";\n return Object.freeze({ findings: result.value.findings, source: result.source });\n } catch (error: unknown) {\n if (signal.aborted) return \"cancelled\";\n if (error instanceof LintComputationUnavailable) return error.reason;\n throw error;\n }\n}\n\nasync function lintFresh(input: MarkdownLintCacheInput): Promise<MarkdownLintFactsResult> {\n const findings = await lintMarkdownString(input.sourcePath, input.sourceText, input.rules);\n if (input.signal.aborted) return \"cancelled\";\n return typeof findings === \"string\"\n ? findings\n : Object.freeze({ findings, source: \"uncached\" as const });\n}\n\nfunction parseLintFacts(\n value: unknown,\n sourceText: string,\n rules: readonly MarkdownLintRuleName[]\n): LintFacts {\n const payload = snapshotExactClosedRecord(value, [\"findings\"]);\n if (payload === undefined || !Array.isArray(payload.findings))\n throw new TypeError(\"Invalid Markdown lint cache payload\");\n const lines = sourceText.split(/\\r\\n|\\r|\\n/u);\n const findings = payload.findings.map((rawFinding: unknown) => {\n const finding = snapshotExactClosedRecord(rawFinding, [\"lineNumber\", \"range\", \"rule\"]);\n if (\n finding === undefined ||\n !isMarkdownLintRuleName(finding.rule) ||\n !rules.includes(finding.rule) ||\n typeof finding.lineNumber !== \"number\" ||\n !Number.isSafeInteger(finding.lineNumber) ||\n finding.lineNumber < 1 ||\n finding.lineNumber > lines.length\n )\n throw new TypeError(\"Invalid Markdown lint cached finding\");\n const line = lines[finding.lineNumber - 1];\n if (line === undefined) throw new TypeError(\"Invalid Markdown lint cached line\");\n const range = parseMarkdownLintRange(finding.range, line);\n if (range === undefined) throw new TypeError(\"Invalid Markdown lint cached range\");\n return Object.freeze({\n lineNumber: finding.lineNumber,\n range,\n rule: finding.rule\n });\n });\n return Object.freeze({ findings: Object.freeze(findings) });\n}\n\nfunction isMarkdownLintRuleName(value: unknown): value is MarkdownLintRuleName {\n return typeof value === \"string\" && MARKDOWN_LINT_RULE_NAMES.some((rule) => rule === value);\n}\n\nfunction installedMarkdownlintVersion(): string | undefined {\n try {\n const packageJson: unknown = createRequire(import.meta.url)(\"markdownlint/package.json\");\n const metadata = snapshotClosedRecord(packageJson);\n return typeof metadata?.version === \"string\" && metadata.version.length > 0\n ? metadata.version\n : undefined;\n } catch {\n return undefined;\n }\n}\n"]}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { hasRequiredAndOptionalRecordKeys, snapshotClosedArray, snapshotClosedRecord } from "../../data-boundary/closed-values.mjs";
|
|
2
|
+
import { defaultProjectFileSelection, resolveProjectFileSelection, snapshotProjectFileSelection } from "../project-files/configuration.mjs";
|
|
3
|
+
import { DEFAULT_FINDING_POLICY, resolveFindingPolicy } from "../code-quality-findings/policy.mjs";
|
|
4
|
+
import { resolveFindingWaiverAuthoring } from "../code-quality-findings/finding-waiver-authoring.mjs";
|
|
5
|
+
import { resolveOptionalLocalCacheOptions } from "../local-cache-options.mjs";
|
|
6
|
+
import { resolveMarkdownLintFindingIdentity } from "./finding-waiver-identity.mjs";
|
|
7
|
+
import { MARKDOWN_LINT_RULE_NAMES } from "./options.mjs";
|
|
8
|
+
import { validMarkdownLintOptions } from "./options-validation.mjs";
|
|
9
|
+
const DEFAULT_FILES = Object.freeze({
|
|
10
|
+
exclude: defaultProjectFileSelection.exclude,
|
|
11
|
+
include: Object.freeze(["**/*.[mM][dD]", "**/*.[mM][aA][rR][kK][dD][oO][wW][nN]"]),
|
|
12
|
+
source: defaultProjectFileSelection.source
|
|
13
|
+
});
|
|
14
|
+
const DEFAULT_LIMITS = Object.freeze({ maxMarkdownBytes: 1_048_576, maxFindings: 10_000 });
|
|
15
|
+
const DEFAULT_RULES = Object.freeze(MARKDOWN_LINT_RULE_NAMES.filter((rule) => rule !== "link-fragments"));
|
|
16
|
+
const KNOWN_RULES = new Set(MARKDOWN_LINT_RULE_NAMES);
|
|
17
|
+
/** Resolves closed partial authoring options into an immutable complete policy. */
|
|
18
|
+
export function resolveMarkdownLintOptions(value) {
|
|
19
|
+
const input = snapshotClosedRecord(value);
|
|
20
|
+
if (input === undefined ||
|
|
21
|
+
!hasRequiredAndOptionalRecordKeys(input, {
|
|
22
|
+
optional: ["files", "findingPolicy", "findingWaivers", "rules", "limits", "cache"],
|
|
23
|
+
required: []
|
|
24
|
+
})) {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
const files = input.files === undefined
|
|
28
|
+
? snapshotProjectFileSelection(DEFAULT_FILES)
|
|
29
|
+
: resolveProjectFileSelection(input.files, DEFAULT_FILES);
|
|
30
|
+
const findingPolicy = resolveFindingPolicy(input.findingPolicy, DEFAULT_FINDING_POLICY);
|
|
31
|
+
const findingWaivers = resolveFindingWaiverAuthoring(input.findingWaivers, resolveMarkdownLintFindingIdentity);
|
|
32
|
+
const rules = resolveRules(input.rules);
|
|
33
|
+
const limits = resolveLimits(input.limits);
|
|
34
|
+
const cache = resolveOptionalLocalCacheOptions(input.cache);
|
|
35
|
+
const candidate = Object.freeze({
|
|
36
|
+
files,
|
|
37
|
+
findingPolicy,
|
|
38
|
+
findingWaivers,
|
|
39
|
+
rules,
|
|
40
|
+
limits,
|
|
41
|
+
cache
|
|
42
|
+
});
|
|
43
|
+
return validMarkdownLintOptions(candidate) ? candidate : undefined;
|
|
44
|
+
}
|
|
45
|
+
function resolveRules(value) {
|
|
46
|
+
if (value === undefined)
|
|
47
|
+
return DEFAULT_RULES;
|
|
48
|
+
const rules = snapshotClosedArray(value);
|
|
49
|
+
if (rules === undefined ||
|
|
50
|
+
rules.length === 0 ||
|
|
51
|
+
!rules.every((rule) => typeof rule === "string" && KNOWN_RULES.has(rule)) ||
|
|
52
|
+
new Set(rules).size !== rules.length) {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
return Object.freeze(MARKDOWN_LINT_RULE_NAMES.filter((catalogRule) => rules.includes(catalogRule)));
|
|
56
|
+
}
|
|
57
|
+
function resolveLimits(value) {
|
|
58
|
+
if (value === undefined)
|
|
59
|
+
return DEFAULT_LIMITS;
|
|
60
|
+
const limits = snapshotClosedRecord(value);
|
|
61
|
+
if (limits === undefined ||
|
|
62
|
+
!hasRequiredAndOptionalRecordKeys(limits, {
|
|
63
|
+
optional: ["maxMarkdownBytes", "maxFindings"],
|
|
64
|
+
required: []
|
|
65
|
+
})) {
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
const maxMarkdownBytes = limits.maxMarkdownBytes ?? DEFAULT_LIMITS.maxMarkdownBytes;
|
|
69
|
+
const maxFindings = limits.maxFindings ?? DEFAULT_LIMITS.maxFindings;
|
|
70
|
+
if (typeof maxMarkdownBytes !== "number" || typeof maxFindings !== "number")
|
|
71
|
+
return undefined;
|
|
72
|
+
return Object.freeze({ maxMarkdownBytes, maxFindings });
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=options-resolution.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options-resolution.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-lint/options-resolution.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n hasRequiredAndOptionalRecordKeys,\n snapshotClosedArray,\n snapshotClosedRecord\n} from \"../../data-boundary/closed-values.ts\";\nimport {\n defaultProjectFileSelection,\n resolveProjectFileSelection,\n snapshotProjectFileSelection\n} from \"../project-files/configuration.ts\";\nimport { DEFAULT_FINDING_POLICY, resolveFindingPolicy } from \"../code-quality-findings/policy.ts\";\nimport { resolveFindingWaiverAuthoring } from \"../code-quality-findings/finding-waiver-authoring.ts\";\nimport { resolveOptionalLocalCacheOptions } from \"../local-cache-options.ts\";\nimport { resolveMarkdownLintFindingIdentity } from \"./finding-waiver-identity.ts\";\nimport {\n MARKDOWN_LINT_RULE_NAMES,\n type MarkdownLintRuleName,\n type ResolvedMarkdownLintOptions\n} from \"./options.ts\";\nimport { validMarkdownLintOptions } from \"./options-validation.ts\";\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});\nconst DEFAULT_LIMITS = Object.freeze({ maxMarkdownBytes: 1_048_576, maxFindings: 10_000 });\nconst DEFAULT_RULES = Object.freeze(\n MARKDOWN_LINT_RULE_NAMES.filter((rule) => rule !== \"link-fragments\")\n);\nconst KNOWN_RULES = new Set<string>(MARKDOWN_LINT_RULE_NAMES);\n\n/** Resolves closed partial authoring options into an immutable complete policy. */\nexport function resolveMarkdownLintOptions(\n value: unknown\n): ResolvedMarkdownLintOptions | undefined {\n const input = snapshotClosedRecord(value);\n if (\n input === undefined ||\n !hasRequiredAndOptionalRecordKeys(input, {\n optional: [\"files\", \"findingPolicy\", \"findingWaivers\", \"rules\", \"limits\", \"cache\"],\n required: []\n })\n ) {\n return undefined;\n }\n const files =\n input.files === undefined\n ? snapshotProjectFileSelection(DEFAULT_FILES)\n : resolveProjectFileSelection(input.files, DEFAULT_FILES);\n const findingPolicy = resolveFindingPolicy(input.findingPolicy, DEFAULT_FINDING_POLICY);\n const findingWaivers = resolveFindingWaiverAuthoring(\n input.findingWaivers,\n resolveMarkdownLintFindingIdentity\n );\n const rules = resolveRules(input.rules);\n const limits = resolveLimits(input.limits);\n const cache = resolveOptionalLocalCacheOptions(input.cache);\n const candidate = Object.freeze({\n files,\n findingPolicy,\n findingWaivers,\n rules,\n limits,\n cache\n });\n return validMarkdownLintOptions(candidate) ? candidate : undefined;\n}\n\nfunction resolveRules(value: unknown): readonly MarkdownLintRuleName[] | undefined {\n if (value === undefined) return DEFAULT_RULES;\n const rules = snapshotClosedArray(value);\n if (\n rules === undefined ||\n rules.length === 0 ||\n !rules.every((rule) => typeof rule === \"string\" && KNOWN_RULES.has(rule)) ||\n new Set(rules).size !== rules.length\n ) {\n return undefined;\n }\n return Object.freeze(\n MARKDOWN_LINT_RULE_NAMES.filter((catalogRule) => rules.includes(catalogRule))\n );\n}\n\nfunction resolveLimits(value: unknown): ResolvedMarkdownLintOptions[\"limits\"] | undefined {\n if (value === undefined) return DEFAULT_LIMITS;\n const limits = snapshotClosedRecord(value);\n if (\n limits === undefined ||\n !hasRequiredAndOptionalRecordKeys(limits, {\n optional: [\"maxMarkdownBytes\", \"maxFindings\"],\n required: []\n })\n ) {\n return undefined;\n }\n const maxMarkdownBytes = limits.maxMarkdownBytes ?? DEFAULT_LIMITS.maxMarkdownBytes;\n const maxFindings = limits.maxFindings ?? DEFAULT_LIMITS.maxFindings;\n if (typeof maxMarkdownBytes !== \"number\" || typeof maxFindings !== \"number\") return undefined;\n return Object.freeze({ maxMarkdownBytes, maxFindings });\n}\n"]}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { snapshotExactClosedRecord } from "../../data-boundary/closed-values.mjs";
|
|
2
|
+
import { isPositiveSafeInteger } from "../../data-boundary/value-shapes.mjs";
|
|
3
|
+
import { validFindingPolicy } from "../code-quality-findings/policy.mjs";
|
|
4
|
+
import { validResolvedFindingWaivers } from "../code-quality-findings/finding-waiver-authoring.mjs";
|
|
5
|
+
import { validLocalCacheOptions } from "../local-cache-options.mjs";
|
|
6
|
+
import { validProjectFileSelection } from "../project-files/configuration.mjs";
|
|
7
|
+
import { MARKDOWN_LINT_RULE_NAMES } from "./options.mjs";
|
|
8
|
+
import { resolveMarkdownLintFindingIdentity } from "./finding-waiver-identity.mjs";
|
|
9
|
+
const KNOWN_RULES = new Set(MARKDOWN_LINT_RULE_NAMES);
|
|
10
|
+
export function validMarkdownLintOptions(value) {
|
|
11
|
+
const options = snapshotExactClosedRecord(value, [
|
|
12
|
+
"files",
|
|
13
|
+
"findingPolicy",
|
|
14
|
+
"findingWaivers",
|
|
15
|
+
"rules",
|
|
16
|
+
"limits",
|
|
17
|
+
"cache"
|
|
18
|
+
]);
|
|
19
|
+
if (options === undefined ||
|
|
20
|
+
!validProjectFileSelection(options.files) ||
|
|
21
|
+
!validFindingPolicy(options.findingPolicy) ||
|
|
22
|
+
!validResolvedFindingWaivers(options.findingWaivers, resolveMarkdownLintFindingIdentity) ||
|
|
23
|
+
!validRules(options.rules) ||
|
|
24
|
+
!validLocalCacheOptions(options.cache)) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
const limits = snapshotExactClosedRecord(options.limits, ["maxMarkdownBytes", "maxFindings"]);
|
|
28
|
+
return (limits !== undefined &&
|
|
29
|
+
isBoundedPositiveInteger(limits.maxMarkdownBytes, 16_777_216) &&
|
|
30
|
+
isBoundedPositiveInteger(limits.maxFindings, 100_000));
|
|
31
|
+
}
|
|
32
|
+
function validRules(value) {
|
|
33
|
+
return (Array.isArray(value) &&
|
|
34
|
+
value.length > 0 &&
|
|
35
|
+
value.every((rule) => typeof rule === "string" && KNOWN_RULES.has(rule)) &&
|
|
36
|
+
new Set(value).size === value.length);
|
|
37
|
+
}
|
|
38
|
+
function isBoundedPositiveInteger(value, maximum) {
|
|
39
|
+
return isPositiveSafeInteger(value) && value <= maximum;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=options-validation.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options-validation.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-lint/options-validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,2BAA2B,EAAE,MAAM,sDAAsD,CAAC;AACnG,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,wBAAwB,EAAoC,MAAM,cAAc,CAAC;AAC1F,OAAO,EAAE,kCAAkC,EAAE,MAAM,8BAA8B,CAAC;AAElF,MAAM,WAAW,GAAG,IAAI,GAAG,CAAS,wBAAwB,CAAC,CAAC;AAE9D,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACrD,MAAM,OAAO,GAAG,yBAAyB,CAAC,KAAK,EAAE;QAC/C,OAAO;QACP,eAAe;QACf,gBAAgB;QAChB,OAAO;QACP,QAAQ;QACR,OAAO;KACR,CAAC,CAAC;IACH,IACE,OAAO,KAAK,SAAS;QACrB,CAAC,yBAAyB,CAAC,OAAO,CAAC,KAAK,CAAC;QACzC,CAAC,kBAAkB,CAAC,OAAO,CAAC,aAAa,CAAC;QAC1C,CAAC,2BAA2B,CAAC,OAAO,CAAC,cAAc,EAAE,kCAAkC,CAAC;QACxF,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC;QAC1B,CAAC,sBAAsB,CAAC,OAAO,CAAC,KAAK,CAAC,EACtC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,MAAM,GAAG,yBAAyB,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,kBAAkB,EAAE,aAAa,CAAC,CAAC,CAAC;IAC9F,OAAO,CACL,MAAM,KAAK,SAAS;QACpB,wBAAwB,CAAC,MAAM,CAAC,gBAAgB,EAAE,UAAU,CAAC;QAC7D,wBAAwB,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CACtD,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,CACL,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACpB,KAAK,CAAC,MAAM,GAAG,CAAC;QAChB,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxE,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,CACrC,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAc,EAAE,OAAe;IAC/D,OAAO,qBAAqB,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,OAAO,CAAC;AAC1D,CAAC","sourcesContent":["import { snapshotExactClosedRecord } from \"../../data-boundary/closed-values.ts\";\nimport { isPositiveSafeInteger } from \"../../data-boundary/value-shapes.ts\";\nimport { validFindingPolicy } from \"../code-quality-findings/policy.ts\";\nimport { validResolvedFindingWaivers } from \"../code-quality-findings/finding-waiver-authoring.ts\";\nimport { validLocalCacheOptions } from \"../local-cache-options.ts\";\nimport { validProjectFileSelection } from \"../project-files/configuration.ts\";\nimport { MARKDOWN_LINT_RULE_NAMES, type ResolvedMarkdownLintOptions } from \"./options.ts\";\nimport { resolveMarkdownLintFindingIdentity } from \"./finding-waiver-identity.ts\";\n\nconst KNOWN_RULES = new Set<string>(MARKDOWN_LINT_RULE_NAMES);\n\nexport function validMarkdownLintOptions(value: unknown): value is ResolvedMarkdownLintOptions {\n const options = snapshotExactClosedRecord(value, [\n \"files\",\n \"findingPolicy\",\n \"findingWaivers\",\n \"rules\",\n \"limits\",\n \"cache\"\n ]);\n if (\n options === undefined ||\n !validProjectFileSelection(options.files) ||\n !validFindingPolicy(options.findingPolicy) ||\n !validResolvedFindingWaivers(options.findingWaivers, resolveMarkdownLintFindingIdentity) ||\n !validRules(options.rules) ||\n !validLocalCacheOptions(options.cache)\n ) {\n return false;\n }\n const limits = snapshotExactClosedRecord(options.limits, [\"maxMarkdownBytes\", \"maxFindings\"]);\n return (\n limits !== undefined &&\n isBoundedPositiveInteger(limits.maxMarkdownBytes, 16_777_216) &&\n isBoundedPositiveInteger(limits.maxFindings, 100_000)\n );\n}\n\nfunction validRules(value: unknown): value is readonly string[] {\n return (\n Array.isArray(value) &&\n value.length > 0 &&\n value.every((rule) => typeof rule === \"string\" && KNOWN_RULES.has(rule)) &&\n new Set(value).size === value.length\n );\n}\n\nfunction isBoundedPositiveInteger(value: unknown, maximum: number): value is number {\n return isPositiveSafeInteger(value) && value <= maximum;\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** 由 Product 拥有且独立于 backend 名称的闭合 Markdown lint 规则目录。 */
|
|
2
|
+
export const MARKDOWN_LINT_RULE_NAMES = Object.freeze([
|
|
3
|
+
"heading-increment",
|
|
4
|
+
"no-reversed-links",
|
|
5
|
+
"no-missing-space-atx",
|
|
6
|
+
"fenced-code-language",
|
|
7
|
+
"no-empty-links",
|
|
8
|
+
"no-alt-text",
|
|
9
|
+
"link-fragments",
|
|
10
|
+
"reference-links-images",
|
|
11
|
+
"table-column-count"
|
|
12
|
+
]);
|
|
13
|
+
//# sourceMappingURL=options.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-lint/options.ts"],"names":[],"mappings":"AASA,yDAAyD;AACzD,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC,MAAM,CAAC;IACpD,mBAAmB;IACnB,mBAAmB;IACnB,sBAAsB;IACtB,sBAAsB;IACtB,gBAAgB;IAChB,aAAa;IACb,gBAAgB;IAChB,wBAAwB;IACxB,oBAAoB;CACZ,CAAC,CAAC","sourcesContent":["import type { PackageCheckAuthoringOptions } from \"../check-authoring.ts\";\nimport type { LocalCacheOptions } from \"../local-cache-options.ts\";\nimport type { FindingPolicy } from \"../code-quality-findings/policy.ts\";\nimport type { FindingWaiver } from \"../../package-tools/finding-waivers/reconciliation.ts\";\nimport type {\n ProjectFileSelection,\n ProjectFileSelectionOptions\n} from \"../project-files/configuration.ts\";\n\n/** 由 Product 拥有且独立于 backend 名称的闭合 Markdown lint 规则目录。 */\nexport const MARKDOWN_LINT_RULE_NAMES = Object.freeze([\n \"heading-increment\",\n \"no-reversed-links\",\n \"no-missing-space-atx\",\n \"fenced-code-language\",\n \"no-empty-links\",\n \"no-alt-text\",\n \"link-fragments\",\n \"reference-links-images\",\n \"table-column-count\"\n] as const);\n\n/** `markdownLint` 支持的稳定 Product-owned 规则名称。 */\nexport type MarkdownLintRuleName = (typeof MARKDOWN_LINT_RULE_NAMES)[number];\n\n/** 可直接从 lint Record 复制的精确身份;完整 range 相同的多个 Finding 不可唯一豁免。 */\nexport interface MarkdownLintFindingIdentity {\n /** 规范化的 project-root-relative `/` 路径。 */\n readonly path: string;\n /** 闭合 Product catalog 中的规则名称。 */\n readonly rule: MarkdownLintRuleName;\n /** 一基 UTF-16 正安全整数位置;必须同行,end-exclusive column 不小于 start column。 */\n readonly range: Readonly<{\n readonly start: Readonly<{ readonly line: number; readonly column: number }>;\n readonly end: Readonly<{ readonly line: number; readonly column: number }>;\n }>;\n}\n\n/** 完整 traversal 后唯一匹配才应用的精确豁免;reason 会公开发布,不得包含秘密。 */\nexport type MarkdownLintFindingWaiver = FindingWaiver<MarkdownLintFindingIdentity>;\n\n/** `markdownLint(options?)` 可接受的可省略 work limits。 */\nexport interface MarkdownLintLimitOptions {\n /** 单个 accepted Markdown source 的 UTF-8 字节上限。 */\n readonly maxMarkdownBytes?: number;\n /** 一次完整 traversal 中可积累的 lint finding 上限。 */\n readonly maxFindings?: number;\n}\n\n/** 调用方拥有的逐文件 lint findings 本地缓存;省略时关闭。 */\nexport type MarkdownLintCacheOptions = LocalCacheOptions;\n\n/** `markdownLint(options?)` 可接受的闭合 authoring policy。 */\nexport interface MarkdownLintOptions<\n Id extends string = string\n> extends PackageCheckAuthoringOptions<Id> {\n /** 参与本 Check 的 source selection;省略时使用 package defaults。 */\n readonly files?: ProjectFileSelectionOptions;\n /** 未豁免 lint finding 是否使本 Check failed;省略时为 non-blocking。 */\n readonly findingPolicy?: FindingPolicy;\n /** 闭合的精确 Finding 豁免;保留原始证据,不改变输入、limits 或缓存 facts。 */\n readonly findingWaivers?: readonly MarkdownLintFindingWaiver[];\n /** 非空数组完整替换 recommended rule set。 */\n readonly rules?: readonly MarkdownLintRuleName[];\n /** 每次 execution 的 Markdown 内容与 finding work 上限。 */\n readonly limits?: MarkdownLintLimitOptions;\n /** 可删除、可信 absolute directory;只缓存由当前 bytes 和规则计算的逐文件 findings。 */\n readonly cache?: MarkdownLintCacheOptions;\n}\n\n/** `markdown-lint` execution 消费的完整冻结 policy。 */\nexport interface ResolvedMarkdownLintOptions {\n readonly files: ProjectFileSelection;\n readonly findingPolicy: FindingPolicy;\n readonly findingWaivers: readonly MarkdownLintFindingWaiver[];\n readonly rules: readonly MarkdownLintRuleName[];\n readonly cache: MarkdownLintCacheOptions;\n readonly limits: Readonly<{\n readonly maxMarkdownBytes: number;\n readonly maxFindings: number;\n }>;\n}\n"]}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { buildHashedFindingWaiverAuditRecord } from "../code-quality-findings/finding-waiver-evidence.mjs";
|
|
2
|
+
import { resolveMarkdownLintFindingIdentity } from "./finding-waiver-identity.mjs";
|
|
3
|
+
export function markdownLintFindingIdentity(candidate) {
|
|
4
|
+
const { path, rule, range } = candidate.data;
|
|
5
|
+
return Object.freeze({ path, rule, range });
|
|
6
|
+
}
|
|
7
|
+
export function markdownLintWaiverIdentity(waiver) {
|
|
8
|
+
const identity = resolveMarkdownLintFindingIdentity(waiver.identity);
|
|
9
|
+
if (identity === undefined) {
|
|
10
|
+
throw new TypeError("markdownLint waiver identity must retain a valid public finding location");
|
|
11
|
+
}
|
|
12
|
+
return identity;
|
|
13
|
+
}
|
|
14
|
+
export function markdownLintWaiverAuditRecord(audit) {
|
|
15
|
+
return buildHashedFindingWaiverAuditRecord(markdownLintWaiverIdentity(audit.waiver), audit);
|
|
16
|
+
}
|
|
17
|
+
export function orderedMarkdownLintCandidates(values, catalog) {
|
|
18
|
+
const rank = new Map(catalog.map((rule, index) => [rule, index]));
|
|
19
|
+
const sorted = [...values].sort((left, right) => compareFindings(left, right, rank));
|
|
20
|
+
const occurrences = new Map();
|
|
21
|
+
return Object.freeze(sorted.map(({ path, finding }) => {
|
|
22
|
+
const range = publicRange(finding);
|
|
23
|
+
const key = `${path}\u0000${finding.rule}\u0000${range.start.line}\u0000${range.start.column}`;
|
|
24
|
+
const ordinal = (occurrences.get(key) ?? 0) + 1;
|
|
25
|
+
occurrences.set(key, ordinal);
|
|
26
|
+
const data = Object.freeze({
|
|
27
|
+
kind: "lint-finding",
|
|
28
|
+
path,
|
|
29
|
+
rule: finding.rule,
|
|
30
|
+
range
|
|
31
|
+
});
|
|
32
|
+
return Object.freeze({
|
|
33
|
+
id: `path:${encodeURIComponent(path)}:rule:${finding.rule}:line:${range.start.line}:column:${range.start.column}:ordinal:${ordinal}`,
|
|
34
|
+
data
|
|
35
|
+
});
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
export function buildMarkdownLintInputRejectedRecord(path) {
|
|
39
|
+
return Object.freeze({
|
|
40
|
+
id: `/input-rejected/${path}`,
|
|
41
|
+
data: Object.freeze({
|
|
42
|
+
kind: "input-rejected",
|
|
43
|
+
blocking: false,
|
|
44
|
+
path,
|
|
45
|
+
reason: "unsupported-file-type"
|
|
46
|
+
})
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
function compareFindings(left, right, rank) {
|
|
50
|
+
const leftRange = publicRange(left.finding);
|
|
51
|
+
const rightRange = publicRange(right.finding);
|
|
52
|
+
return (left.path.localeCompare(right.path) ||
|
|
53
|
+
leftRange.start.line - rightRange.start.line ||
|
|
54
|
+
leftRange.start.column - rightRange.start.column ||
|
|
55
|
+
(rank.get(left.finding.rule) ?? 0) - (rank.get(right.finding.rule) ?? 0));
|
|
56
|
+
}
|
|
57
|
+
function publicRange(finding) {
|
|
58
|
+
const column = finding.range?.[0] ?? 1;
|
|
59
|
+
const endColumn = finding.range === null ? column : column + finding.range[1];
|
|
60
|
+
return Object.freeze({
|
|
61
|
+
start: Object.freeze({ line: finding.lineNumber, column }),
|
|
62
|
+
end: Object.freeze({ line: finding.lineNumber, column: endColumn })
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=records.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"records.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-lint/records.ts"],"names":[],"mappings":"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","sourcesContent":["import type { MaterializedFindingWaiver } from \"../../package-tools/finding-waivers/reconciliation.ts\";\nimport {\n buildHashedFindingWaiverAuditRecord,\n type FindingWaiverAuditRecordData,\n type FindingWaiverRecordAudit\n} from \"../code-quality-findings/finding-waiver-evidence.ts\";\nimport type { MarkdownLintBackendFinding } from \"./adapter.ts\";\nimport { resolveMarkdownLintFindingIdentity } from \"./finding-waiver-identity.ts\";\nimport type { MarkdownLintFindingIdentity, MarkdownLintRuleName } from \"./options.ts\";\n\n/** 一条保留原位置的 lint Finding;唯一命中 waiver 时仅附加公开理由。 */\nexport type MarkdownLintFindingRecordData = Readonly<\n MarkdownLintFindingIdentity & {\n readonly kind: \"lint-finding\";\n readonly waiver?: Readonly<{ readonly reason: string }>;\n }\n>;\n\n/** 未使用或匹配多个 Markdown lint Findings 的精确 waiver audit Record data。 */\nexport type MarkdownLintFindingWaiverAuditRecordData =\n FindingWaiverAuditRecordData<MarkdownLintFindingIdentity>;\n\nexport type MarkdownLintInputRejectedRecordData = Readonly<{\n readonly kind: \"input-rejected\";\n readonly blocking: false;\n readonly path: string;\n readonly reason: \"unsupported-file-type\";\n}>;\n\n/** Markdown lint 发布的 Finding、input-rejection 或 finding-waiver audit Record data。 */\nexport type MarkdownLintRecordData =\n | MarkdownLintFindingRecordData\n | MarkdownLintInputRejectedRecordData\n | MarkdownLintFindingWaiverAuditRecordData;\n\nexport interface MarkdownLintRecordCandidate {\n readonly id: string;\n readonly data: MarkdownLintFindingRecordData;\n}\n\nexport function markdownLintFindingIdentity(\n candidate: MarkdownLintRecordCandidate\n): MarkdownLintFindingIdentity {\n const { path, rule, range } = candidate.data;\n return Object.freeze({ path, rule, range });\n}\n\nexport function markdownLintWaiverIdentity(\n waiver: MaterializedFindingWaiver\n): MarkdownLintFindingIdentity {\n const identity = resolveMarkdownLintFindingIdentity(waiver.identity);\n if (identity === undefined) {\n throw new TypeError(\"markdownLint waiver identity must retain a valid public finding location\");\n }\n return identity;\n}\n\nexport function markdownLintWaiverAuditRecord(audit: FindingWaiverRecordAudit): Readonly<{\n readonly id: string;\n readonly data: MarkdownLintFindingWaiverAuditRecordData;\n}> {\n return buildHashedFindingWaiverAuditRecord(markdownLintWaiverIdentity(audit.waiver), audit);\n}\n\nexport function orderedMarkdownLintCandidates(\n values: readonly Readonly<{\n readonly path: string;\n readonly finding: MarkdownLintBackendFinding;\n }>[],\n catalog: readonly MarkdownLintRuleName[]\n): readonly MarkdownLintRecordCandidate[] {\n const rank = new Map(catalog.map((rule, index) => [rule, index]));\n const sorted = [...values].sort((left, right) => compareFindings(left, right, rank));\n const occurrences = new Map<string, number>();\n return Object.freeze(\n sorted.map(({ path, finding }) => {\n const range = publicRange(finding);\n const key = `${path}\\u0000${finding.rule}\\u0000${range.start.line}\\u0000${range.start.column}`;\n const ordinal = (occurrences.get(key) ?? 0) + 1;\n occurrences.set(key, ordinal);\n const data = Object.freeze({\n kind: \"lint-finding\" as const,\n path,\n rule: finding.rule,\n range\n });\n return Object.freeze({\n id: `path:${encodeURIComponent(path)}:rule:${finding.rule}:line:${range.start.line}:column:${range.start.column}:ordinal:${ordinal}`,\n data\n });\n })\n );\n}\n\nexport function buildMarkdownLintInputRejectedRecord(path: string): Readonly<{\n readonly id: string;\n readonly data: MarkdownLintInputRejectedRecordData;\n}> {\n return Object.freeze({\n id: `/input-rejected/${path}`,\n data: Object.freeze({\n kind: \"input-rejected\",\n blocking: false,\n path,\n reason: \"unsupported-file-type\"\n })\n });\n}\n\nfunction compareFindings(\n left: Readonly<{ readonly path: string; readonly finding: MarkdownLintBackendFinding }>,\n right: Readonly<{ readonly path: string; readonly finding: MarkdownLintBackendFinding }>,\n rank: ReadonlyMap<MarkdownLintRuleName, number>\n): number {\n const leftRange = publicRange(left.finding);\n const rightRange = publicRange(right.finding);\n return (\n left.path.localeCompare(right.path) ||\n leftRange.start.line - rightRange.start.line ||\n leftRange.start.column - rightRange.start.column ||\n (rank.get(left.finding.rule) ?? 0) - (rank.get(right.finding.rule) ?? 0)\n );\n}\n\nfunction publicRange(finding: MarkdownLintBackendFinding): MarkdownLintFindingRecordData[\"range\"] {\n const column = finding.range?.[0] ?? 1;\n const endColumn = finding.range === null ? column : column + finding.range[1];\n return Object.freeze({\n start: Object.freeze({ line: finding.lineNumber, column }),\n end: Object.freeze({ line: finding.lineNumber, column: endColumn })\n });\n}\n"]}
|