mandrel 2.59.0 → 2.61.0
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/.agents/README.md +21 -19
- package/.agents/agents/acceptance-critic.md +24 -43
- package/.agents/agents/story-worker.md +20 -21
- package/.agents/docs/agentrc-reference.json +5 -84
- package/.agents/docs/configuration.md +48 -132
- package/.agents/docs/workflows.md +2 -2
- package/.agents/instructions.md +5 -8
- package/.agents/rules/ci-remediation.md +41 -8
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +16 -496
- package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +23 -13
- package/.agents/scripts/acceptance-eval.js +35 -169
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +10 -41
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +105 -311
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +34 -98
- package/.agents/scripts/deliver-light.js +25 -171
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +534 -0
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +57 -49
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +7 -19
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +39 -121
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -34
- package/.agents/scripts/lib/config/explain.js +10 -83
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +11 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +18 -35
- package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
- package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -124
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +94 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +123 -191
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +22 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +28 -156
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +121 -157
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +118 -462
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +37 -307
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +55 -318
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +16 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +71 -289
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -91
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +245 -326
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +20 -82
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +96 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +180 -273
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -200
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -135
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +63 -344
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +51 -66
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +123 -344
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +67 -209
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -105
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +97 -92
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +71 -137
- package/.agents/scripts/plan-run-epilogue.js +20 -43
- package/.agents/scripts/pr-watch-with-update.js +79 -263
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -259
- package/.agents/scripts/stories-wave-tick.js +179 -415
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/skills/core/gates-and-baselines/reference.md +0 -1
- package/.agents/skills/skills.index.json +2 -2
- package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/acceptance-self-eval.md +84 -157
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/code-review.md +4 -2
- package/.agents/workflows/helpers/deliver-digest.md +37 -28
- package/.agents/workflows/helpers/deliver-light.md +92 -101
- package/.agents/workflows/helpers/deliver-reference.md +162 -220
- package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
- package/.agents/workflows/helpers/deliver-story.md +17 -18
- package/.agents/workflows/helpers/plan-reference.md +125 -167
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/mandrel-deliver.md +47 -31
- package/.agents/workflows/mandrel-plan.md +22 -21
- package/.agents/workflows/mandrel-update.md +36 -21
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +60 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +326 -523
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +17 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +21 -0
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +17 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1179
- package/.agents/rules/known-tooling-behavior.md +0 -150
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/schemas/model-attribution.schema.json +0 -53
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -366
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -332
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/orchestration/model-attribution.js +0 -418
- package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -118
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,82 +1,23 @@
|
|
|
1
|
-
//
|
|
1
|
+
// The one loader for base-ref baseline reads: `git show <ref>:<file>` via
|
|
2
|
+
// argv tokens (no shell), with a `(ref, file)` LRU that also caches `null`.
|
|
2
3
|
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
// `origin/main`) and diff it against the head's working-tree baseline.
|
|
7
|
-
// Routing every read through `readBaseFromGit(ref, file)` guarantees:
|
|
8
|
-
//
|
|
9
|
-
// - One implementation of "spawn `git show <ref>:<file>`", with
|
|
10
|
-
// identical argv shape, identical env scrubbing, and identical
|
|
11
|
-
// error semantics. Per-kind CLIs do not get to invent their own
|
|
12
|
-
// git invocations and drift apart.
|
|
13
|
-
// - One LRU cache keyed by `(ref, file)`. Within a single dispatcher
|
|
14
|
-
// run, the same `(ref, file)` tuple is read at most once even when
|
|
15
|
-
// multiple gates need it (e.g. when scope resolution and the
|
|
16
|
-
// regression compare both touch the same baseline file). The cache
|
|
17
|
-
// stores the full result — including `null` for "no such file at
|
|
18
|
-
// ref" — so a missing baseline does not re-spawn git on every
|
|
19
|
-
// subsequent lookup.
|
|
20
|
-
// - `child_process.spawn`-based execution (no shell), which is the
|
|
21
|
-
// security baseline (`security-baseline.md` § Output & Rendering):
|
|
22
|
-
// `ref` and `file` are passed as separate argv tokens, never
|
|
23
|
-
// interpolated into a shell command.
|
|
24
|
-
//
|
|
25
|
-
// Story #5009 moved the spawn itself, the stdout ceiling and the
|
|
26
|
-
// failure-message shape out to `lib/child-exec.js` — the one child-process
|
|
27
|
-
// surface — so this module now owns only what is genuinely its own: the
|
|
28
|
-
// `(ref, file)` LRU, the exit-code semantics below, and the test seam. The
|
|
29
|
-
// `__setSpawnRunner` seam still injects a mock runner; it is threaded through
|
|
30
|
-
// the shared wrapper as `run` rather than calling `spawnSync` directly.
|
|
31
|
-
//
|
|
32
|
-
// Exit semantics are intentionally narrow:
|
|
33
|
-
//
|
|
34
|
-
// - Exit 0: stdout is the file contents, returned as a UTF-8 string.
|
|
35
|
-
// - Exit 128: git's "path does not exist in this revision" — the
|
|
36
|
-
// loader treats this as a normal "no baseline at base ref" case
|
|
37
|
-
// and returns `null`. Callers branch on `result === null` rather
|
|
38
|
-
// than catching an error.
|
|
39
|
-
// - Any other outcome (bad ref, corrupted repo, git binary missing, or
|
|
40
|
-
// the child killed by signal so `status` is `null`): thrown so the
|
|
41
|
-
// dispatcher can surface a config-error exit code rather than
|
|
42
|
-
// silently treating the failure as "no baseline". A bad ref is a
|
|
43
|
-
// config bug, not a missing file.
|
|
44
|
-
//
|
|
45
|
-
// That two-way split is load-bearing (Story #4914): `null` means and only
|
|
46
|
-
// means "path absent at ref". Callers may therefore treat a throw as a
|
|
47
|
-
// hard failure without having to re-diagnose it.
|
|
4
|
+
// Exit semantics: 0 → contents; 128 → `null` ("path absent at ref", and only
|
|
5
|
+
// that); anything else (bad ref, signal-killed child) throws, so callers may
|
|
6
|
+
// treat a throw as a hard config failure, never as "no baseline".
|
|
48
7
|
|
|
49
8
|
import { formatChildFailure, spawnChild } from '../child-exec.js';
|
|
50
9
|
|
|
51
|
-
//
|
|
52
|
-
//
|
|
53
|
-
// kinds against two refs (head + base) is 14 entries. Capping at 64 keeps
|
|
54
|
-
// long-lived dispatcher runs (e.g. orchestrators that loop across
|
|
55
|
-
// multiple stories) bounded without ever evicting a hot entry in normal
|
|
56
|
-
// use. The cache stores `null` as a real value so missing-file lookups
|
|
57
|
-
// also hit on the second call.
|
|
58
|
-
// ---------------------------------------------------------------------------
|
|
59
|
-
|
|
10
|
+
// Seven kinds × two refs is 14 entries; 64 bounds long-lived runs without
|
|
11
|
+
// evicting hot entries.
|
|
60
12
|
const DEFAULT_MAX_ENTRIES = 64;
|
|
61
13
|
|
|
62
|
-
/**
|
|
63
|
-
* Injected spawn runner, or `undefined` to use the shared surface's real one.
|
|
64
|
-
* Story #4914's explicit 64 MB ceiling still applies to both git reads below —
|
|
65
|
-
* it is now `child-exec.js`'s `MAX_BUFFER_BYTES`, applied by `spawnChild`.
|
|
66
|
-
*
|
|
67
|
-
* @type {Function | undefined}
|
|
68
|
-
*/
|
|
14
|
+
/** @type {Function | undefined} */
|
|
69
15
|
let _spawnRunner;
|
|
70
16
|
let _cache = new Map();
|
|
71
17
|
let _maxEntries = DEFAULT_MAX_ENTRIES;
|
|
72
18
|
|
|
73
19
|
/**
|
|
74
|
-
* Test-only
|
|
75
|
-
* count invocations and assert "spawn, not exec") and a fresh cache (so
|
|
76
|
-
* test order does not leak through the module-global LRU).
|
|
77
|
-
*
|
|
78
|
-
* Production code MUST NOT call this. The double-underscore prefix is
|
|
79
|
-
* the contract.
|
|
20
|
+
* Test-only.
|
|
80
21
|
*
|
|
81
22
|
* @param {object} [opts]
|
|
82
23
|
* @param {Function} [opts.spawn] - Mock spawnSync.
|
|
@@ -92,10 +33,6 @@ export function __setSpawnRunner(opts = {}) {
|
|
|
92
33
|
_cache = new Map();
|
|
93
34
|
}
|
|
94
35
|
|
|
95
|
-
/**
|
|
96
|
-
* Reset the loader to factory defaults. Tests call this in `afterEach`
|
|
97
|
-
* to keep state from leaking across files.
|
|
98
|
-
*/
|
|
99
36
|
export function __resetForTests() {
|
|
100
37
|
_spawnRunner = undefined;
|
|
101
38
|
_maxEntries = DEFAULT_MAX_ENTRIES;
|
|
@@ -103,8 +40,7 @@ export function __resetForTests() {
|
|
|
103
40
|
}
|
|
104
41
|
|
|
105
42
|
/**
|
|
106
|
-
*
|
|
107
|
-
* collision-free — neither git refs nor POSIX paths may contain NUL.
|
|
43
|
+
* NUL-joined: neither refs nor paths may contain NUL.
|
|
108
44
|
*
|
|
109
45
|
* @param {string} ref
|
|
110
46
|
* @param {string} file
|
|
@@ -115,9 +51,7 @@ function cacheKey(ref, file) {
|
|
|
115
51
|
}
|
|
116
52
|
|
|
117
53
|
/**
|
|
118
|
-
*
|
|
119
|
-
* iteration order is insertion order, so deleting and re-setting moves
|
|
120
|
-
* the entry to the back.
|
|
54
|
+
* Move to the MRU end (Map iteration is insertion order) and evict the LRU.
|
|
121
55
|
*
|
|
122
56
|
* @param {string} key
|
|
123
57
|
* @param {string | null} value
|
|
@@ -126,18 +60,14 @@ function touch(key, value) {
|
|
|
126
60
|
_cache.delete(key);
|
|
127
61
|
_cache.set(key, value);
|
|
128
62
|
while (_cache.size > _maxEntries) {
|
|
129
|
-
// Evict the least-recently-used entry (first key in iteration).
|
|
130
63
|
const oldest = _cache.keys().next().value;
|
|
131
64
|
_cache.delete(oldest);
|
|
132
65
|
}
|
|
133
66
|
}
|
|
134
67
|
|
|
135
68
|
/**
|
|
136
|
-
*
|
|
137
|
-
*
|
|
138
|
-
* the long-form explanation. Without this, husky-driven invocations
|
|
139
|
-
* inherit the parent's `GIT_DIR` / `GIT_WORK_TREE` and end up reading
|
|
140
|
-
* from the wrong worktree.
|
|
69
|
+
* Drop inherited `GIT_*` vars: under husky, `GIT_DIR`/`GIT_WORK_TREE` would
|
|
70
|
+
* point git at the wrong worktree.
|
|
141
71
|
*/
|
|
142
72
|
function cleanGitEnv() {
|
|
143
73
|
return Object.fromEntries(
|
|
@@ -145,21 +75,15 @@ function cleanGitEnv() {
|
|
|
145
75
|
);
|
|
146
76
|
}
|
|
147
77
|
|
|
148
|
-
/** Both reads reject the same way on a missing or non-string argument. */
|
|
149
78
|
function isNonEmptyString(value) {
|
|
150
79
|
return typeof value === 'string' && value.length > 0;
|
|
151
80
|
}
|
|
152
81
|
|
|
153
|
-
/** Both reads coerce a missing stdout to the empty string rather than throwing. */
|
|
154
82
|
function stdoutOf(result) {
|
|
155
83
|
return typeof result?.stdout === 'string' ? result.stdout : '';
|
|
156
84
|
}
|
|
157
85
|
|
|
158
86
|
/**
|
|
159
|
-
* Run a git subprocess through the shared child surface. Both reads below need
|
|
160
|
-
* the identical shape — injected runner, resolved cwd, `GIT_*`-scrubbed env,
|
|
161
|
-
* argv tokens rather than a shell string — so it lives here once.
|
|
162
|
-
*
|
|
163
87
|
* @param {string[]} args
|
|
164
88
|
* @param {{ cwd?: string }} opts
|
|
165
89
|
*/
|
|
@@ -172,18 +96,9 @@ function runGit(args, opts) {
|
|
|
172
96
|
}
|
|
173
97
|
|
|
174
98
|
/**
|
|
175
|
-
*
|
|
176
|
-
*
|
|
177
|
-
*
|
|
178
|
-
*
|
|
179
|
-
* Cached: subsequent calls with the same `(ref, file)` skip the
|
|
180
|
-
* subprocess and return the cached value (including a cached `null`).
|
|
181
|
-
*
|
|
182
|
-
* @param {string} ref - Any ref git understands (`HEAD`, `epic/1943`,
|
|
183
|
-
* `origin/main`, a SHA, …).
|
|
184
|
-
* @param {string} file - Repo-relative path to the file.
|
|
185
|
-
* @param {{ cwd?: string }} [opts] - Optional cwd override; defaults to
|
|
186
|
-
* `process.cwd()`.
|
|
99
|
+
* @param {string} ref
|
|
100
|
+
* @param {string} file - Repo-relative path.
|
|
101
|
+
* @param {{ cwd?: string }} [opts]
|
|
187
102
|
* @returns {string | null}
|
|
188
103
|
*/
|
|
189
104
|
export function readBaseFromGit(ref, file, opts = {}) {
|
|
@@ -196,7 +111,6 @@ export function readBaseFromGit(ref, file, opts = {}) {
|
|
|
196
111
|
|
|
197
112
|
const key = cacheKey(ref, file);
|
|
198
113
|
if (_cache.has(key)) {
|
|
199
|
-
// Hot path — re-touch to refresh LRU position, but no spawn.
|
|
200
114
|
const cached = _cache.get(key);
|
|
201
115
|
touch(key, cached);
|
|
202
116
|
return cached;
|
|
@@ -205,8 +119,7 @@ export function readBaseFromGit(ref, file, opts = {}) {
|
|
|
205
119
|
const spec = `${ref}:${file}`;
|
|
206
120
|
const result = runGit(['show', spec], opts);
|
|
207
121
|
|
|
208
|
-
// `
|
|
209
|
-
// by signal. Treat that as a hard failure rather than "no file".
|
|
122
|
+
// `status: null` (signal-killed) falls through to the throw.
|
|
210
123
|
const status = result.status;
|
|
211
124
|
if (status === 0) {
|
|
212
125
|
const out = stdoutOf(result);
|
|
@@ -214,10 +127,7 @@ export function readBaseFromGit(ref, file, opts = {}) {
|
|
|
214
127
|
return out;
|
|
215
128
|
}
|
|
216
129
|
|
|
217
|
-
//
|
|
218
|
-
// handful of other "ref/path not found" cases. The stderr message
|
|
219
|
-
// varies across git versions; matching on the exit code keeps us
|
|
220
|
-
// version-independent and i18n-safe.
|
|
130
|
+
// Match the exit code, not stderr: stable across git versions and locales.
|
|
221
131
|
if (status === 128) {
|
|
222
132
|
touch(key, null);
|
|
223
133
|
return null;
|
|
@@ -233,39 +143,11 @@ export function readBaseFromGit(ref, file, opts = {}) {
|
|
|
233
143
|
}
|
|
234
144
|
|
|
235
145
|
/**
|
|
236
|
-
*
|
|
237
|
-
*
|
|
238
|
-
*
|
|
239
|
-
* compared range that touches a kind's baseline acknowledges that run's
|
|
240
|
-
* head-vs-base regressions.
|
|
241
|
-
*
|
|
242
|
-
* Story #5179 — this returned SUBJECTS ONLY, and that omission was load-bearing
|
|
243
|
-
* in the wrong direction. With no commit handle, the acknowledgment could not
|
|
244
|
-
* ask what the tagged commit actually rewrote, so it could only be a whole-run
|
|
245
|
-
* blanket: every regression in the range demoted, including rows that commit
|
|
246
|
-
* never touched and drift that landed after it. Carrying `sha` alongside
|
|
247
|
-
* `subject` is what lets the caller read the baseline blob AT the refresh
|
|
248
|
-
* commit and scope the acknowledgment to it.
|
|
249
|
-
*
|
|
250
|
-
* Restricting the log to `-- <file>` means the returned commits already satisfy
|
|
251
|
-
* the "commit whose diff touches the baseline file" half of the predicate; the
|
|
252
|
-
* caller only has to match the tag substring against each subject. Runs through
|
|
253
|
-
* the same shared `spawnChild` surface and injected runner as
|
|
254
|
-
* `readBaseFromGit`, so it inherits the identical env scrubbing (drop inherited
|
|
255
|
-
* `GIT_*`), the same stdout ceiling, and the spawn-not-exec security posture
|
|
256
|
-
* (argv tokens, `shell: false`).
|
|
257
|
-
*
|
|
258
|
-
* A NUL separator between the two fields is what makes this parse safely: a
|
|
259
|
-
* commit subject may contain anything except a newline, so any printable
|
|
260
|
-
* delimiter could appear inside one, but neither field may contain NUL.
|
|
261
|
-
*
|
|
262
|
-
* Returns an empty array whenever the range cannot be walked (missing base ref,
|
|
263
|
-
* git failure, empty range) — the acknowledgment path treats "no matching
|
|
264
|
-
* commit" and "could not determine" identically: the ratchet stays at full
|
|
265
|
-
* strength. Not cached: the range result depends on live HEAD, which the
|
|
266
|
-
* `(ref, file)` LRU key does not capture.
|
|
146
|
+
* Commits in `<baseRef>..HEAD` touching `<file>`; `sha` lets the refresh
|
|
147
|
+
* acknowledgment scope to what that commit rewrote. `[]` on failure keeps the
|
|
148
|
+
* ratchet strict. Uncached: depends on live HEAD.
|
|
267
149
|
*
|
|
268
|
-
* @param {string} baseRef
|
|
150
|
+
* @param {string} baseRef
|
|
269
151
|
* @param {string} file - Repo-relative path to the baseline file.
|
|
270
152
|
* @param {{ cwd?: string }} [opts]
|
|
271
153
|
* @returns {{ sha: string, subject: string }[]} newest first; `[]` on any failure.
|
|
@@ -298,8 +180,7 @@ export function readRangeCommitsTouchingFile(baseRef, file, opts = {}) {
|
|
|
298
180
|
}
|
|
299
181
|
|
|
300
182
|
/**
|
|
301
|
-
*
|
|
302
|
-
* not reason about cache state.
|
|
183
|
+
* Test-only.
|
|
303
184
|
*
|
|
304
185
|
* @returns {number}
|
|
305
186
|
*/
|
|
@@ -1,27 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* envelope. The version tracks the in-repo (or upstream) kernel that
|
|
6
|
-
* produced the rows — a bump invalidates every committed baseline of
|
|
7
|
-
* that kind, signalling consumers to regenerate. The version source is
|
|
8
|
-
* **per-kind**:
|
|
9
|
-
*
|
|
10
|
-
* - CRAP and Maintainability share the `typhonjs-escomplex` upstream
|
|
11
|
-
* package version; both modules' `kernelVersion()` read it from the
|
|
12
|
-
* nearest `node_modules/typhonjs-escomplex/package.json`.
|
|
13
|
-
* - Lint, Coverage, Mutation, Lighthouse, Bundle-Size carry a static
|
|
14
|
-
* in-repo semver bumped by hand whenever the scoring/rollup math
|
|
15
|
-
* changes. Their `kernelVersion()` just returns the constant.
|
|
16
|
-
*
|
|
17
|
-
* This module is the public surface: callers ask
|
|
18
|
-
* `currentKernelVersion(kind)` and get a single string back, no matter
|
|
19
|
-
* which strategy the kind uses internally.
|
|
20
|
-
*
|
|
21
|
-
* `checkKernelVersion(kind, baselineVersion)` is the drift-detection
|
|
22
|
-
* helper. It returns `{ match, current }` so a CI gate can compare the
|
|
23
|
-
* baseline's stamp against the running kernel and decide whether to
|
|
24
|
-
* regenerate or fail.
|
|
2
|
+
* Kind-module registry and kernel-version resolution. CRAP and MI stamp the
|
|
3
|
+
* installed scorer package version; the other kinds stamp a static semver
|
|
4
|
+
* bumped by hand when their scoring or rollup math changes.
|
|
25
5
|
*
|
|
26
6
|
* @module lib/baselines/kernel
|
|
27
7
|
*/
|
|
@@ -76,30 +56,6 @@ import {
|
|
|
76
56
|
rowIdentity as duplicationRowIdentity,
|
|
77
57
|
sortRows as duplicationSortRows,
|
|
78
58
|
} from './kinds/duplication.js';
|
|
79
|
-
import {
|
|
80
|
-
applyEpsilon as lighthouseApplyEpsilon,
|
|
81
|
-
compare as lighthouseCompare,
|
|
82
|
-
kernelVersion as lighthouseKernelVersion,
|
|
83
|
-
keyField as lighthouseKeyField,
|
|
84
|
-
mergeRows as lighthouseMergeRows,
|
|
85
|
-
name as lighthouseName,
|
|
86
|
-
projectRow as lighthouseProjectRow,
|
|
87
|
-
rollup as lighthouseRollup,
|
|
88
|
-
rowIdentity as lighthouseRowIdentity,
|
|
89
|
-
sortRows as lighthouseSortRows,
|
|
90
|
-
} from './kinds/lighthouse.js';
|
|
91
|
-
import {
|
|
92
|
-
applyEpsilon as lintApplyEpsilon,
|
|
93
|
-
compare as lintCompare,
|
|
94
|
-
kernelVersion as lintKernelVersion,
|
|
95
|
-
keyField as lintKeyField,
|
|
96
|
-
mergeRows as lintMergeRows,
|
|
97
|
-
name as lintName,
|
|
98
|
-
projectRow as lintProjectRow,
|
|
99
|
-
rollup as lintRollup,
|
|
100
|
-
rowIdentity as lintRowIdentity,
|
|
101
|
-
sortRows as lintSortRows,
|
|
102
|
-
} from './kinds/lint.js';
|
|
103
59
|
import {
|
|
104
60
|
applyEpsilon as maintainabilityApplyEpsilon,
|
|
105
61
|
compare as maintainabilityCompare,
|
|
@@ -127,14 +83,8 @@ import {
|
|
|
127
83
|
} from './kinds/mutation.js';
|
|
128
84
|
|
|
129
85
|
/**
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
* Prefer named imports over `import * as kind` here: knip (and the
|
|
133
|
-
* dead-exports ratchet) cannot see members reached only through
|
|
134
|
-
* `getKindModule(kind).projectRow(...)` after a namespace import, so
|
|
135
|
-
* star-imports of `kinds/*.js` produced systematic false-positive dead
|
|
136
|
-
* exports for the protocol surface (`name`, `keyField`, `kernelVersion`,
|
|
137
|
-
* `projectRow`, `sortRows`, `rollup`, …).
|
|
86
|
+
* Named imports, not `import * as`: knip cannot see members reached through
|
|
87
|
+
* a namespace, which reports the protocol surface as dead exports.
|
|
138
88
|
*
|
|
139
89
|
* @param {object} members
|
|
140
90
|
* @returns {object}
|
|
@@ -143,8 +93,7 @@ function bindKindModule(members) {
|
|
|
143
93
|
return Object.freeze({
|
|
144
94
|
name: members.name,
|
|
145
95
|
keyField: members.keyField,
|
|
146
|
-
//
|
|
147
|
-
// grouping key above — CRAP groups by file and identifies by method.
|
|
96
|
+
// Merge identity; distinct from the `keyField` grouping key.
|
|
148
97
|
rowIdentity: members.rowIdentity,
|
|
149
98
|
kernelVersion: members.kernelVersion,
|
|
150
99
|
projectRow: members.projectRow,
|
|
@@ -153,32 +102,14 @@ function bindKindModule(members) {
|
|
|
153
102
|
compare: members.compare,
|
|
154
103
|
applyEpsilon: members.applyEpsilon,
|
|
155
104
|
mergeRows: members.mergeRows,
|
|
156
|
-
// Optional
|
|
157
|
-
// envelope-level stamps the shared writer would not otherwise know about;
|
|
158
|
-
// `assertBaselineCompatible` lets a kind refuse a loaded baseline whose
|
|
159
|
-
// scoring semantics predate the running scorer.
|
|
105
|
+
// Optional hooks: extra envelope stamps; refusal of an incompatible baseline.
|
|
160
106
|
envelopeExtras: members.envelopeExtras,
|
|
161
107
|
assertBaselineCompatible: members.assertBaselineCompatible,
|
|
162
108
|
});
|
|
163
109
|
}
|
|
164
110
|
|
|
165
|
-
/**
|
|
166
|
-
* Registry of every shipped kind module. Keys mirror the per-kind schema
|
|
167
|
-
* filenames so a future "list all kinds" iterator can stay declarative.
|
|
168
|
-
*/
|
|
111
|
+
/** Keys mirror the per-kind schema filenames. */
|
|
169
112
|
const KIND_MODULES = Object.freeze({
|
|
170
|
-
lint: bindKindModule({
|
|
171
|
-
name: lintName,
|
|
172
|
-
keyField: lintKeyField,
|
|
173
|
-
rowIdentity: lintRowIdentity,
|
|
174
|
-
kernelVersion: lintKernelVersion,
|
|
175
|
-
projectRow: lintProjectRow,
|
|
176
|
-
sortRows: lintSortRows,
|
|
177
|
-
rollup: lintRollup,
|
|
178
|
-
compare: lintCompare,
|
|
179
|
-
applyEpsilon: lintApplyEpsilon,
|
|
180
|
-
mergeRows: lintMergeRows,
|
|
181
|
-
}),
|
|
182
113
|
coverage: bindKindModule({
|
|
183
114
|
name: coverageName,
|
|
184
115
|
keyField: coverageKeyField,
|
|
@@ -230,18 +161,6 @@ const KIND_MODULES = Object.freeze({
|
|
|
230
161
|
mergeRows: mutationMergeRows,
|
|
231
162
|
assertBaselineCompatible: mutationAssertBaselineCompatible,
|
|
232
163
|
}),
|
|
233
|
-
lighthouse: bindKindModule({
|
|
234
|
-
name: lighthouseName,
|
|
235
|
-
keyField: lighthouseKeyField,
|
|
236
|
-
rowIdentity: lighthouseRowIdentity,
|
|
237
|
-
kernelVersion: lighthouseKernelVersion,
|
|
238
|
-
projectRow: lighthouseProjectRow,
|
|
239
|
-
sortRows: lighthouseSortRows,
|
|
240
|
-
rollup: lighthouseRollup,
|
|
241
|
-
compare: lighthouseCompare,
|
|
242
|
-
applyEpsilon: lighthouseApplyEpsilon,
|
|
243
|
-
mergeRows: lighthouseMergeRows,
|
|
244
|
-
}),
|
|
245
164
|
'bundle-size': bindKindModule({
|
|
246
165
|
name: bundleSizeName,
|
|
247
166
|
keyField: bundleSizeKeyField,
|
|
@@ -269,8 +188,7 @@ const KIND_MODULES = Object.freeze({
|
|
|
269
188
|
});
|
|
270
189
|
|
|
271
190
|
/**
|
|
272
|
-
*
|
|
273
|
-
* callers can't silently fall through to undefined behaviour.
|
|
191
|
+
* Throws on an unregistered kind.
|
|
274
192
|
*
|
|
275
193
|
* @param {string} kind
|
|
276
194
|
* @returns {{ name: string, keyField: string, kernelVersion: () => string,
|
|
@@ -290,10 +208,6 @@ export function getKindModule(kind) {
|
|
|
290
208
|
}
|
|
291
209
|
|
|
292
210
|
/**
|
|
293
|
-
* Resolve the running kernel version for `kind`. Delegates to the per-kind
|
|
294
|
-
* module's `kernelVersion()` — see the module preamble for which strategy
|
|
295
|
-
* each kind uses.
|
|
296
|
-
*
|
|
297
211
|
* @param {string} kind
|
|
298
212
|
* @returns {string}
|
|
299
213
|
*/
|
|
@@ -302,10 +216,6 @@ export function currentKernelVersion(kind) {
|
|
|
302
216
|
}
|
|
303
217
|
|
|
304
218
|
/**
|
|
305
|
-
* Resolve a kind module, or null when the kind is not registered. Lets the
|
|
306
|
-
* optional-hook callers below stay expression-shaped instead of threading a
|
|
307
|
-
* mutable binding through a try/catch.
|
|
308
|
-
*
|
|
309
219
|
* @param {string} kind
|
|
310
220
|
* @returns {object|null}
|
|
311
221
|
*/
|
|
@@ -318,10 +228,8 @@ function tryGetKindModule(kind) {
|
|
|
318
228
|
}
|
|
319
229
|
|
|
320
230
|
/**
|
|
321
|
-
*
|
|
322
|
-
*
|
|
323
|
-
* kind's scoring can change while the upstream package it stamps does not
|
|
324
|
-
* (Story #4775). Kinds without the hook always answer "compatible".
|
|
231
|
+
* Semantic compatibility, which `kernelVersion` cannot express: scoring can
|
|
232
|
+
* change while the stamped package does not. Kinds without the hook pass.
|
|
325
233
|
*
|
|
326
234
|
* @param {string} kind
|
|
327
235
|
* @param {object|null} baseline
|
|
@@ -334,10 +242,6 @@ export function checkBaselineSemantics(kind, baseline) {
|
|
|
334
242
|
}
|
|
335
243
|
|
|
336
244
|
/**
|
|
337
|
-
* Compare a baseline's stamped version against the currently running
|
|
338
|
-
* kernel for the same kind. Returns `{ match, current }` so callers can
|
|
339
|
-
* format a drift signal or trigger a regenerate.
|
|
340
|
-
*
|
|
341
245
|
* @param {string} kind
|
|
342
246
|
* @param {string} baselineVersion
|
|
343
247
|
* @returns {{ match: boolean, current: string }}
|
|
@@ -351,10 +255,6 @@ export function checkKernelVersion(kind, baselineVersion) {
|
|
|
351
255
|
}
|
|
352
256
|
|
|
353
257
|
/**
|
|
354
|
-
* List every kind registered with the kernel. Useful for the writer's
|
|
355
|
-
* envelope sanity check and for tests that want to iterate all shipped
|
|
356
|
-
* kinds.
|
|
357
|
-
*
|
|
358
258
|
* @returns {string[]}
|
|
359
259
|
*/
|
|
360
260
|
export function listKinds() {
|
|
@@ -1,26 +1,8 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* _crap-new-method-gate.js — the policy `kinds/crap.js#compareCrap` applies to
|
|
3
|
-
* a method that has no baseline row (Story #5002).
|
|
4
|
-
*
|
|
5
|
-
* Underscore-prefixed like `_shared-metric.js`: this is a helper for the
|
|
6
|
-
* per-kind modules in this directory, not a kind of its own.
|
|
7
|
-
*
|
|
8
|
-
* A leaf — it imports nothing, so `kinds/crap.js` can consume it without
|
|
9
|
-
* adding an edge to anything the comparator does not already reach.
|
|
10
|
-
*/
|
|
1
|
+
/** The gate `compareCrap` applies to a method with no baseline row. A leaf. */
|
|
11
2
|
|
|
12
3
|
/**
|
|
13
|
-
*
|
|
14
|
-
* coverage
|
|
15
|
-
*
|
|
16
|
-
* Deliberately derived from the scan rows rather than plumbed down from the
|
|
17
|
-
* coverage artifact: the rows are the only thing both the preview gate and the
|
|
18
|
-
* close-validation projection hand the comparator, and "the whole file is at
|
|
19
|
-
* zero" is exactly what an all-zero istanbul entry produces here.
|
|
20
|
-
*
|
|
21
|
-
* A row carrying `coverage: null` is skipped, not counted as a zero — an
|
|
22
|
-
* absent observation is not a measured one, and letting it vote would hand the
|
|
23
|
-
* relief below to a file nothing measured at all.
|
|
4
|
+
* Files whose every measured method is at 0% coverage (no test loads them).
|
|
5
|
+
* `coverage: null` rows do not vote: unmeasured is not zero.
|
|
24
6
|
*
|
|
25
7
|
* @param {Array<{file: string, coverage?: number|null}>} currentRows
|
|
26
8
|
* @returns {Set<string>}
|
|
@@ -40,24 +22,10 @@ export function deriveUncoveredFiles(currentRows) {
|
|
|
40
22
|
}
|
|
41
23
|
|
|
42
24
|
/**
|
|
43
|
-
* The score a
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
* **Why.** `crap = c²·(1 − cov)³ + c` collapses to `c² + c` at zero coverage,
|
|
49
|
-
* so the default ceiling of 30 caps a *brand-new* method in an untested file
|
|
50
|
-
* at `c ≈ 5`. For the code that is untestable by construction — argv parsing,
|
|
51
|
-
* `spawn` wiring, a CLI's top-level `main()` — that is not a quality signal
|
|
52
|
-
* but a fragmentation tax: the only way past it is to shatter cohesive wiring
|
|
53
|
-
* into sub-five-branch fragments, which raises the file's method count and its
|
|
54
|
-
* reader's cost while measuring nothing. The coverage term still governs every
|
|
55
|
-
* method in a file the tests *do* reach, and a genuinely sprawling function is
|
|
56
|
-
* still refused — `c` alone must clear the ceiling.
|
|
57
|
-
*
|
|
58
|
-
* This is a **gate** decision, not a scoring one: the persisted baseline row
|
|
59
|
-
* keeps its measured `c² + c`, so the regression arm on the next run compares
|
|
60
|
-
* like with like.
|
|
25
|
+
* The score a new method meets the ceiling with: measured CRAP, or complexity
|
|
26
|
+
* `c` alone in a wholly uncovered file. At zero coverage CRAP is `c² + c`,
|
|
27
|
+
* which caps untestable wiring (argv, spawn, `main()`) at `c ≈ 5` and forces
|
|
28
|
+
* fragmentation. Gate-only: the persisted row keeps the measured CRAP.
|
|
61
29
|
*
|
|
62
30
|
* @param {{file: string, crap: number, cyclomatic?: number}} row
|
|
63
31
|
* @param {Set<string>} uncoveredFiles
|
|
@@ -69,12 +37,8 @@ export function newMethodGateScore(row, uncoveredFiles) {
|
|
|
69
37
|
}
|
|
70
38
|
|
|
71
39
|
/**
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
* `gateScore` is written **only** when the ceiling was judged against
|
|
75
|
-
* something other than the measured `crap` — the same write-only-when-
|
|
76
|
-
* non-default idiom `projectRow` uses for its row markers — so the printer can
|
|
77
|
-
* name the number that actually failed instead of one nothing tested.
|
|
40
|
+
* `gateScore` is set only when it differs from `crap`, so the printer names
|
|
41
|
+
* the number that actually failed.
|
|
78
42
|
*
|
|
79
43
|
* @param {object} row
|
|
80
44
|
* @param {number} ceiling
|
|
@@ -92,8 +56,6 @@ export function buildNewViolation(row, ceiling, gateScore) {
|
|
|
92
56
|
}
|
|
93
57
|
|
|
94
58
|
/**
|
|
95
|
-
* Render the measured-vs-gated half of a new-method violation line.
|
|
96
|
-
*
|
|
97
59
|
* @param {{crap: number, gateScore?: number}} v
|
|
98
60
|
* @returns {string}
|
|
99
61
|
*/
|
|
@@ -1,23 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Underscore-prefixed like `_shared-metric.js`: a helper for the per-kind
|
|
5
|
-
* modules in this directory, not a kind of its own. `kinds/crap.js` re-exports
|
|
6
|
-
* `loadCrapBaseline` so existing importers keep one door.
|
|
7
|
-
*
|
|
8
|
-
* **This module is the whole read path, and there is only one.** `crap-utils.js`
|
|
9
|
-
* used to carry a second one — `projectCrapEnvelopeToLegacy` plus its
|
|
10
|
-
* `COMPAT_STAMP_*` allow-lists — so `check-baselines` (through
|
|
11
|
-
* `baselines/reader.js`) and the `quality-preview` pre-commit arm (through that
|
|
12
|
-
* projection) fed the same compat axes from two hand-maintained field lists. A
|
|
13
|
-
* stamp added to one and not the other yielded two opposite verdicts on one
|
|
14
|
-
* envelope, three times over: Story #4866 (`scoringSemantics`,
|
|
15
|
-
* `tsTranspilerVersion`), #4969 (`rows[].anonymous`), #4986
|
|
16
|
-
* (`provenanceStamped`). Every one of those axes keys on a POSITIVE marker, so
|
|
17
|
-
* a dropped field read `undefined` and failed the baseline closed with a remedy
|
|
18
|
-
* that could not work — re-deriving it wrote the stamp the read path then
|
|
19
|
-
* discarded. With one reader that drift class is structurally impossible, so no
|
|
20
|
-
* allow-list needs maintaining.
|
|
2
|
+
* The single CRAP baseline read path, built on `baselines/reader.js` so every
|
|
3
|
+
* gate feeds the compat axes the same stamps. Re-exported by `kinds/crap.js`.
|
|
21
4
|
*/
|
|
22
5
|
|
|
23
6
|
import path from 'node:path';
|
|
@@ -29,19 +12,8 @@ import {
|
|
|
29
12
|
} from '../reader.js';
|
|
30
13
|
|
|
31
14
|
/**
|
|
32
|
-
* Read the
|
|
33
|
-
*
|
|
34
|
-
* comparator and the compat axes consume.
|
|
35
|
-
*
|
|
36
|
-
* `baselinePath` selects the explicit-path reader variant (the worktree /
|
|
37
|
-
* epic-ref callers always know their own path); without one the reader
|
|
38
|
-
* resolves the configured location for the `crap` kind itself.
|
|
39
|
-
*
|
|
40
|
-
* Returns `null` on any read/parse/schema failure; the preview gate maps that
|
|
41
|
-
* to "no baseline" and fails open, as it always did.
|
|
42
|
-
*
|
|
43
|
-
* Deliberately module-local: `loadCrapBaseline`'s `readFromTree` default is the
|
|
44
|
-
* single production door to it, and tests inject their own loader.
|
|
15
|
+
* Read the working-tree baseline, projected onto the `file`-keyed comparator
|
|
16
|
+
* shape. `null` on any failure; the preview gate then fails open.
|
|
45
17
|
*
|
|
46
18
|
* @param {{baselinePath?: string, projectRoot?: string}} [opts]
|
|
47
19
|
* @returns {object|null}
|
|
@@ -74,14 +46,8 @@ function readCrapBaselineFromTree({ baselinePath, projectRoot } = {}) {
|
|
|
74
46
|
}
|
|
75
47
|
|
|
76
48
|
/**
|
|
77
|
-
* Re-key
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
* Both markers are BASELINE facts. Dropping `anonymous` would leave every
|
|
81
|
-
* re-keyed row looking like an unmarked anonymous one — precisely the shape the
|
|
82
|
-
* `anon-identity-unstamped` axis fails closed (Story #4969) — and dropping
|
|
83
|
-
* `coordinateSystem` would let the comparator drift-resolve across two
|
|
84
|
-
* coordinate systems (Story #4866).
|
|
49
|
+
* Re-key `path` to `file`, carrying `coordinateSystem` and `anonymous`
|
|
50
|
+
* verbatim: dropping either breaks a compat axis or the comparator.
|
|
85
51
|
*
|
|
86
52
|
* @param {{path: string, method: string, startLine: number, crap: number,
|
|
87
53
|
* coordinateSystem?: string, anonymous?: boolean}} row
|
|
@@ -101,14 +67,8 @@ function projectBaselineRow(row) {
|
|
|
101
67
|
}
|
|
102
68
|
|
|
103
69
|
/**
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
* `git show <epicRef>:<baselinePath>` via `readBaselineAtRef`.
|
|
107
|
-
*
|
|
108
|
-
* Story #1120 threads `epic/<id>` into close-validation so the comparison runs
|
|
109
|
-
* against the Epic-branch HEAD's committed baseline. This helper delegates the
|
|
110
|
-
* read to baseline-store and applies the CRAP shape-check +
|
|
111
|
-
* `tsTranspilerVersion` back-fill on top.
|
|
70
|
+
* From the working tree, or from `<epicRef>:<baselinePath>` when `epicRef` is
|
|
71
|
+
* set; only the ref path needs the shape-check and transpiler back-fill.
|
|
112
72
|
*/
|
|
113
73
|
export function loadCrapBaseline({
|
|
114
74
|
baselinePath,
|
|
@@ -125,9 +85,6 @@ export function loadCrapBaseline({
|
|
|
125
85
|
logger,
|
|
126
86
|
label: 'CRAP',
|
|
127
87
|
});
|
|
128
|
-
// No-epicRef path delegates to readFromTree which already applies the
|
|
129
|
-
// shape-check + tsTranspilerVersion back-fill, so a tree read returns either
|
|
130
|
-
// a valid envelope or null. Epic-ref path bypasses that helper — shape-check
|
|
131
88
|
if (!epicRef) return parsed;
|
|
132
89
|
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
133
90
|
return null;
|