mandrel 2.60.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 +10 -10
- package/.agents/agents/story-worker.md +1 -1
- package/.agents/docs/agentrc-reference.json +4 -82
- package/.agents/docs/configuration.md +20 -87
- package/.agents/docs/workflows.md +1 -1
- package/.agents/instructions.md +1 -3
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/agentrc.schema.json +11 -486
- package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +14 -14
- package/.agents/scripts/acceptance-eval.js +32 -164
- 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 +9 -45
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +46 -172
- 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 +32 -99
- package/.agents/scripts/deliver-light.js +14 -101
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +36 -133
- 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 +10 -50
- 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 +5 -21
- 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 +31 -143
- 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 -35
- package/.agents/scripts/lib/config/explain.js +9 -80
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
- 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 +10 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
- 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 +12 -37
- package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
- package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
- 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 -126
- 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 +93 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
- 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 +31 -259
- 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 +21 -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 +5 -75
- 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 +42 -189
- 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 +42 -214
- 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 +26 -231
- 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 +52 -303
- 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 +14 -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 +49 -248
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
- 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 -94
- 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 +40 -199
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
- 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 +18 -80
- 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 +9 -50
- 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 +110 -290
- 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 -201
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
- 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 -126
- 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 +39 -181
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
- 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 +22 -83
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +83 -358
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
- 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 +53 -221
- 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 -104
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +27 -111
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +31 -148
- package/.agents/scripts/plan-run-epilogue.js +11 -37
- package/.agents/scripts/pr-watch-with-update.js +76 -267
- 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 -209
- package/.agents/scripts/stories-wave-tick.js +102 -472
- 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/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/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/deliver-digest.md +6 -4
- package/.agents/workflows/helpers/deliver-reference.md +114 -188
- package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
- package/.agents/workflows/helpers/plan-reference.md +86 -139
- package/.agents/workflows/helpers/qa-core.md +12 -0
- 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 +25 -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 +105 -661
- 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 +15 -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 +2 -21
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +16 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1183
- package/.agents/rules/known-tooling-behavior.md +0 -200
- 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/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 -368
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -218
- 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/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 -125
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,58 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `delivery.quality`
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* `
|
|
6
|
-
* maintainability, mutation, lighthouse, bundle-size) shares the same
|
|
7
|
-
* four-field base:
|
|
8
|
-
*
|
|
9
|
-
* - `enabled` — when `false`, the checker exits 0 with a skip line.
|
|
10
|
-
* - `baselinePath` — repo-root-relative path to the gate's baseline file.
|
|
11
|
-
* - `tolerance` — `{ kind: 'absolute' | 'percent', value: number }`.
|
|
12
|
-
* - `floors` — workspace-keyed `{ "*": { ... } }` floor object.
|
|
13
|
-
*
|
|
14
|
-
* Story #1737 changes (vs the Story #1739 mechanical relocation):
|
|
15
|
-
*
|
|
16
|
-
* - `gateScoping` is the single source of truth for diff scope / ref.
|
|
17
|
-
* The duplicate `defaultScope` / `diffRef` keys on crap and
|
|
18
|
-
* maintainability are gone — resolvers carry the scope through from
|
|
19
|
-
* the lifted block.
|
|
20
|
-
* - Scalar `tolerance` values became `{ kind, value }` objects.
|
|
21
|
-
* - `coveragePath` moved from `gates.crap` to `gates.coverage`. CRAP
|
|
22
|
-
* reads from the coverage gate instead of carrying its own.
|
|
23
|
-
* - Flat `qualityFloors.*` shape is gone — every gate carries its own
|
|
24
|
-
* workspace-keyed `floors` object.
|
|
25
|
-
*
|
|
26
|
-
* The resolver returns a flattened bag with the legacy field names
|
|
27
|
-
* (`crap.tolerance` as a number, `crap.targetDirs`, `maintainability.targetDirs`,
|
|
28
|
-
* `crap.coveragePath`, etc.) so existing call sites stay untouched.
|
|
29
|
-
* The translation from gate shape → legacy bag happens here, in one
|
|
30
|
-
* place.
|
|
2
|
+
* `delivery.quality` resolver. Every `gates.<tier>` shares `enabled`,
|
|
3
|
+
* `baselinePath`, `tolerance` (`{ kind, value }`) and workspace-keyed
|
|
4
|
+
* `floors`; the resolver flattens them into the legacy bag callers read
|
|
5
|
+
* (scalar `tolerance`, `crap.coveragePath` cross-read from the coverage gate).
|
|
31
6
|
*/
|
|
32
7
|
|
|
33
8
|
import { Logger } from '../Logger.js';
|
|
34
9
|
import { resolveListValue } from './shared.js';
|
|
35
10
|
|
|
36
|
-
const
|
|
11
|
+
const GATE_SCOPING = Object.freeze({ scope: 'diff', diffRef: 'main' });
|
|
12
|
+
|
|
13
|
+
/** Commit-subject substring acknowledging a deliberate baseline refresh. */
|
|
14
|
+
const BASELINE_REFRESH_TAG = 'baseline-refresh:';
|
|
37
15
|
|
|
38
|
-
/**
|
|
39
|
-
* Default object-shape tolerance for each gate. Values match the historical
|
|
40
|
-
* scalar defaults so a consumer that omits `tolerance` keeps the prior
|
|
41
|
-
* gate behaviour.
|
|
42
|
-
*/
|
|
43
16
|
const DEFAULT_CRAP_TOLERANCE = Object.freeze({ kind: 'absolute', value: 0.05 });
|
|
44
17
|
const DEFAULT_MI_TOLERANCE = Object.freeze({ kind: 'absolute', value: 0.5 });
|
|
45
18
|
|
|
46
|
-
/**
|
|
47
|
-
* Default floors per gate. Workspace-keyed so a single-workspace consumer
|
|
48
|
-
* reads `floors["*"]` and a monorepo consumer can override per-workspace.
|
|
49
|
-
*
|
|
50
|
-
* Story #2125: these defaults are now injected by `resolveQuality` into
|
|
51
|
-
* the resolved `gates.<kind>.floors` block when the consumer omits the
|
|
52
|
-
* `'*'` workspace key, so `.agentrc.json` can carry `floors: {}` (or
|
|
53
|
-
* omit the gate entirely) and still get framework-default enforcement
|
|
54
|
-
* from the unified `check-baselines.js` dispatcher.
|
|
55
|
-
*/
|
|
19
|
+
/** Injected when a declared gate omits a workspace key (usually `'*'`). */
|
|
56
20
|
const DEFAULT_COVERAGE_FLOORS = Object.freeze({
|
|
57
21
|
'*': Object.freeze({ lines: 90, branches: 85, functions: 90 }),
|
|
58
22
|
});
|
|
@@ -60,35 +24,18 @@ const DEFAULT_CRAP_FLOORS = Object.freeze({
|
|
|
60
24
|
'*': Object.freeze({ max: 30, p95: 20, methodsAbove20: 50 }),
|
|
61
25
|
});
|
|
62
26
|
/**
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
* default floor therefore targets `min`, not the row-axis `maintainability`
|
|
66
|
-
* name. The pre-#2193 default keyed on `maintainability` silently no-oped
|
|
67
|
-
* inside `check-baselines.js#compareToFloor` because the rollup never
|
|
68
|
-
* exposed that axis.
|
|
27
|
+
* Keyed on the rollup's `min` axis; a `maintainability` key silently
|
|
28
|
+
* no-ops because the rollup never exposes it.
|
|
69
29
|
*/
|
|
70
30
|
const DEFAULT_MI_FLOORS = Object.freeze({
|
|
71
31
|
'*': Object.freeze({ min: 70 }),
|
|
72
32
|
});
|
|
73
33
|
|
|
74
34
|
/**
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
* default because it is gate-semantics-neutral — the gates score exactly what
|
|
80
|
-
* they scored before, since nothing they score moved.
|
|
81
|
-
*
|
|
82
|
-
* `baselineJoin` lets the CRAP join resolve a method in an untouched file
|
|
83
|
-
* from its committed baseline row instead of requiring fresh coverage for it.
|
|
84
|
-
* That *loosens* the gate, so it stays off by default. Bundling the two under
|
|
85
|
-
* one `enabled` switch is precisely what forced the earlier default flip to
|
|
86
|
-
* be reverted (Story #5173).
|
|
87
|
-
*
|
|
88
|
-
* Neither switch shortens the capture run — a capture that does happen is the
|
|
89
|
-
* ordinary full `npm run test:coverage` (Story #5065). `baseRef: null` means
|
|
90
|
-
* "use the caller's own ref resolution" (the gate's `--ref` flag / `main`)
|
|
91
|
-
* rather than a second, possibly-conflicting default.
|
|
35
|
+
* `skipWhenUnchanged` (on: gate-neutral) skips capture when nothing under
|
|
36
|
+
* `crap.targetDirs` changed vs `baseRef`. `baselineJoin` (off: it loosens the
|
|
37
|
+
* gate) resolves untouched files from committed baseline rows. The two must
|
|
38
|
+
* stay independent. `baseRef: null` defers to the caller's ref resolution.
|
|
92
39
|
*/
|
|
93
40
|
const DEFAULT_INCREMENTAL_COVERAGE = Object.freeze({
|
|
94
41
|
skipWhenUnchanged: true,
|
|
@@ -96,7 +43,6 @@ const DEFAULT_INCREMENTAL_COVERAGE = Object.freeze({
|
|
|
96
43
|
baseRef: null,
|
|
97
44
|
});
|
|
98
45
|
|
|
99
|
-
/** Framework defaults for the CRAP gate (post-1737 uniform shape). */
|
|
100
46
|
export const CRAP_GATE_DEFAULTS = Object.freeze({
|
|
101
47
|
enabled: true,
|
|
102
48
|
baselinePath: 'baselines/crap.json',
|
|
@@ -105,77 +51,37 @@ export const CRAP_GATE_DEFAULTS = Object.freeze({
|
|
|
105
51
|
targetDirs: Object.freeze(['src']),
|
|
106
52
|
newMethodCeiling: 30,
|
|
107
53
|
requireCoverage: true,
|
|
108
|
-
|
|
109
|
-
refreshTag: 'baseline-refresh:',
|
|
110
|
-
// Story #2165 — bounded timeout (ms) for `npm run crap:update` spawned by
|
|
111
|
-
// the baseline-attribution refresh path. Defaults to 60 s; mirrors
|
|
112
|
-
// `gates.coverage.timeoutMs` (Story #2142) for shape and SIGKILL → 124
|
|
113
|
-
// semantics.
|
|
114
|
-
refreshTimeoutMs: 60_000,
|
|
54
|
+
refreshTag: BASELINE_REFRESH_TAG,
|
|
115
55
|
ignoreGlobs: Object.freeze([]),
|
|
116
|
-
//
|
|
117
|
-
//
|
|
118
|
-
//
|
|
119
|
-
// broken join is silent by construction (unresolved methods are simply
|
|
120
|
-
// absent from the baseline), so the updater refuses rather than writing a
|
|
121
|
-
// thin baseline and logging it as success. 0.75 sits far above a healthy
|
|
122
|
-
// run (a repo with fresh coverage resolves ~98%) and far below the 4–6%
|
|
123
|
-
// signature of a coordinate-system mismatch.
|
|
56
|
+
// Fail-closed floor on the coverage join (over files that have coverage):
|
|
57
|
+
// a broken join is silent, so the updater refuses to persist below it.
|
|
58
|
+
// Healthy runs resolve ~98%; a coordinate mismatch resolves 4–6%.
|
|
124
59
|
minMethodResolutionRate: 0.75,
|
|
125
60
|
incrementalCoverage: DEFAULT_INCREMENTAL_COVERAGE,
|
|
126
61
|
});
|
|
127
62
|
|
|
128
|
-
/** Framework defaults for the coverage gate. */
|
|
129
63
|
export const COVERAGE_GATE_DEFAULTS = Object.freeze({
|
|
130
64
|
enabled: true,
|
|
131
65
|
baselinePath: 'baselines/coverage.json',
|
|
132
66
|
tolerance: Object.freeze({ kind: 'absolute', value: 0 }),
|
|
133
67
|
floors: DEFAULT_COVERAGE_FLOORS,
|
|
134
68
|
coveragePath: 'coverage/coverage-final.json',
|
|
135
|
-
//
|
|
136
|
-
// `runCapture` to return exit 124 (GNU `timeout` convention) so the
|
|
137
|
-
// close-validation caller can branch on hang-vs-failure.
|
|
69
|
+
// On expiry `runCapture` exits 124 so callers can tell a hang from a failure.
|
|
138
70
|
timeoutMs: 600_000,
|
|
139
71
|
});
|
|
140
72
|
|
|
141
|
-
/** Framework defaults for the maintainability gate. */
|
|
142
73
|
export const MAINTAINABILITY_GATE_DEFAULTS = Object.freeze({
|
|
143
74
|
enabled: true,
|
|
144
75
|
baselinePath: 'baselines/maintainability.json',
|
|
145
76
|
tolerance: DEFAULT_MI_TOLERANCE,
|
|
146
77
|
floors: DEFAULT_MI_FLOORS,
|
|
147
78
|
targetDirs: Object.freeze([]),
|
|
148
|
-
//
|
|
149
|
-
|
|
150
|
-
// gate's `refreshTag`; the evaluate phase demotes head-vs-base regressions
|
|
151
|
-
// (floors still enforced) when a range commit carrying this tag touches the
|
|
152
|
-
// baseline file. Kept identical to the CRAP default so one refresh commit
|
|
153
|
-
// can acknowledge both gates.
|
|
154
|
-
refreshTag: 'baseline-refresh:',
|
|
155
|
-
// Story #2165 — bounded timeout (ms) for `npm run maintainability:update`
|
|
156
|
-
// spawned by the baseline-attribution refresh path. Defaults to 60 s.
|
|
157
|
-
refreshTimeoutMs: 60_000,
|
|
79
|
+
// Same tag as CRAP so one refresh commit acknowledges both gates.
|
|
80
|
+
refreshTag: BASELINE_REFRESH_TAG,
|
|
158
81
|
ignoreGlobs: Object.freeze([]),
|
|
159
|
-
// Story #4775 — fail-closed floor on the per-method coverage JOIN. The
|
|
160
|
-
// fraction of methods that must resolve a coverage entry, counted only over
|
|
161
|
-
// files that HAVE one, before `update-crap-baseline.js` will persist. A
|
|
162
|
-
// broken join is silent by construction (unresolved methods are simply
|
|
163
|
-
// absent from the baseline), so the updater refuses rather than writing a
|
|
164
|
-
// thin baseline and logging it as success. 0.75 sits far above a healthy
|
|
165
|
-
// run (a repo with fresh coverage resolves ~98%) and far below the 4–6%
|
|
166
|
-
// signature of a coordinate-system mismatch.
|
|
167
82
|
minMethodResolutionRate: 0.75,
|
|
168
83
|
});
|
|
169
84
|
|
|
170
|
-
/**
|
|
171
|
-
* Story #2165 — framework defaults for the close-time `npx biome format
|
|
172
|
-
* --write` autofix spawn. The SIGKILL → exit 124 mapping mirrors
|
|
173
|
-
* `gates.coverage.timeoutMs` (Story #2142).
|
|
174
|
-
*/
|
|
175
|
-
const FORMAT_AUTOFIX_DEFAULTS = Object.freeze({
|
|
176
|
-
timeoutMs: 60_000,
|
|
177
|
-
});
|
|
178
|
-
|
|
179
85
|
const CRAP_GATE_KEYS = new Set([
|
|
180
86
|
'enabled',
|
|
181
87
|
'baselinePath',
|
|
@@ -184,9 +90,6 @@ const CRAP_GATE_KEYS = new Set([
|
|
|
184
90
|
'targetDirs',
|
|
185
91
|
'newMethodCeiling',
|
|
186
92
|
'requireCoverage',
|
|
187
|
-
'friction',
|
|
188
|
-
'refreshTag',
|
|
189
|
-
'refreshTimeoutMs',
|
|
190
93
|
'ignoreGlobs',
|
|
191
94
|
'minMethodResolutionRate',
|
|
192
95
|
'incrementalCoverage',
|
|
@@ -198,7 +101,6 @@ const COVERAGE_GATE_KEYS = new Set([
|
|
|
198
101
|
'tolerance',
|
|
199
102
|
'floors',
|
|
200
103
|
'coveragePath',
|
|
201
|
-
'timeoutMs',
|
|
202
104
|
]);
|
|
203
105
|
|
|
204
106
|
const MI_GATE_KEYS = new Set([
|
|
@@ -207,18 +109,12 @@ const MI_GATE_KEYS = new Set([
|
|
|
207
109
|
'tolerance',
|
|
208
110
|
'floors',
|
|
209
111
|
'targetDirs',
|
|
210
|
-
'refreshTag',
|
|
211
|
-
'refreshTimeoutMs',
|
|
212
112
|
'ignoreGlobs',
|
|
213
113
|
]);
|
|
214
114
|
|
|
215
115
|
/**
|
|
216
|
-
* Pure helper: coerce the object-shape tolerance to its scalar `value`
|
|
217
|
-
* for call sites that still expect a plain number. Returns the default
|
|
218
|
-
* scalar when the tolerance object is malformed.
|
|
219
|
-
*
|
|
220
116
|
* @param {{ kind?: string, value?: number } | undefined} tolerance
|
|
221
|
-
* @param {number} fallback
|
|
117
|
+
* @param {number} fallback
|
|
222
118
|
* @returns {number}
|
|
223
119
|
*/
|
|
224
120
|
function toleranceScalar(tolerance, fallback) {
|
|
@@ -242,20 +138,7 @@ function warnUnknownKeys(userBlock, knownKeys, blockLabel) {
|
|
|
242
138
|
}
|
|
243
139
|
|
|
244
140
|
/**
|
|
245
|
-
*
|
|
246
|
-
* the resolved `coverage` gate (for the `coveragePath` cross-read). The
|
|
247
|
-
* lifted `gateScoping` carries the diff scope and ref.
|
|
248
|
-
*
|
|
249
|
-
* @param {object | undefined} userCrap raw `delivery.quality.gates.crap`
|
|
250
|
-
* @param {{ scope: string, diffRef: string }} gateScoping resolved scoping
|
|
251
|
-
* @param {{ coveragePath: string }} coverageGate resolved coverage gate
|
|
252
|
-
* @returns {object} flattened legacy-bag view that existing callers read
|
|
253
|
-
*/
|
|
254
|
-
/**
|
|
255
|
-
* Clamp a user-supplied method-resolution floor into `[0, 1]`. A
|
|
256
|
-
* non-numeric, non-finite, or out-of-range value falls back to the framework
|
|
257
|
-
* default rather than silently disabling the guard (a floor of `NaN` would
|
|
258
|
-
* compare false against every rate and never fire).
|
|
141
|
+
* Out-of-range or non-finite falls back: a `NaN` floor would never fire.
|
|
259
142
|
*
|
|
260
143
|
* @param {unknown} value
|
|
261
144
|
* @param {number} fallback
|
|
@@ -268,26 +151,14 @@ function resolveResolutionRate(value, fallback) {
|
|
|
268
151
|
}
|
|
269
152
|
|
|
270
153
|
/**
|
|
271
|
-
*
|
|
272
|
-
*
|
|
273
|
-
* Precedence, lowest to highest: the framework defaults
|
|
274
|
-
* (`skipWhenUnchanged: true`, `baselineJoin: false`), then the deprecated
|
|
275
|
-
* `enabled` alias which sets **both** switches to its value, then either
|
|
276
|
-
* explicit switch. A malformed or absent user block resolves to the defaults,
|
|
277
|
-
* so a consumer that never sets the key inherits the saving without the
|
|
278
|
-
* loosening.
|
|
279
|
-
*
|
|
280
|
-
* @param {{ skipWhenUnchanged?: boolean, baselineJoin?: boolean, enabled?: boolean, baseRef?: string } | undefined} user
|
|
154
|
+
* @param {{ skipWhenUnchanged?: boolean, baselineJoin?: boolean, baseRef?: string } | undefined} user
|
|
281
155
|
* @param {{ skipWhenUnchanged: boolean, baselineJoin: boolean, baseRef: string | null }} defaults
|
|
282
156
|
* @returns {{ skipWhenUnchanged: boolean, baselineJoin: boolean, baseRef: string | null }}
|
|
283
157
|
*/
|
|
284
158
|
function resolveIncrementalCoverage(user, defaults) {
|
|
285
159
|
if (user == null || typeof user !== 'object') return { ...defaults };
|
|
286
|
-
const
|
|
287
|
-
|
|
288
|
-
if (typeof explicit === 'boolean') return explicit;
|
|
289
|
-
return alias === null ? fallback : alias;
|
|
290
|
-
};
|
|
160
|
+
const pick = (explicit, fallback) =>
|
|
161
|
+
typeof explicit === 'boolean' ? explicit : fallback;
|
|
291
162
|
return {
|
|
292
163
|
skipWhenUnchanged: pick(user.skipWhenUnchanged, defaults.skipWhenUnchanged),
|
|
293
164
|
baselineJoin: pick(user.baselineJoin, defaults.baselineJoin),
|
|
@@ -298,17 +169,19 @@ function resolveIncrementalCoverage(user, defaults) {
|
|
|
298
169
|
};
|
|
299
170
|
}
|
|
300
171
|
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
172
|
+
/**
|
|
173
|
+
* @param {object | undefined} userCrap
|
|
174
|
+
* @param {{ coveragePath: string }} coverageGate
|
|
175
|
+
* @returns {object}
|
|
176
|
+
*/
|
|
177
|
+
export function resolveMaintainabilityCrap(userCrap, coverageGate) {
|
|
306
178
|
const defaults = CRAP_GATE_DEFAULTS;
|
|
307
|
-
const scoping = {
|
|
308
|
-
defaultScope: gateScoping?.scope ?? DEFAULT_GATE_SCOPING.scope,
|
|
309
|
-
diffRef: gateScoping?.diffRef ?? DEFAULT_GATE_SCOPING.diffRef,
|
|
310
|
-
};
|
|
311
179
|
const coverage = coverageGate ?? COVERAGE_GATE_DEFAULTS;
|
|
180
|
+
const fixed = {
|
|
181
|
+
refreshTag: defaults.refreshTag,
|
|
182
|
+
defaultScope: GATE_SCOPING.scope,
|
|
183
|
+
diffRef: GATE_SCOPING.diffRef,
|
|
184
|
+
};
|
|
312
185
|
if (userCrap == null || typeof userCrap !== 'object') {
|
|
313
186
|
return {
|
|
314
187
|
enabled: defaults.enabled,
|
|
@@ -321,13 +194,9 @@ export function resolveMaintainabilityCrap(
|
|
|
321
194
|
),
|
|
322
195
|
requireCoverage: defaults.requireCoverage,
|
|
323
196
|
minMethodResolutionRate: defaults.minMethodResolutionRate,
|
|
324
|
-
friction: { ...defaults.friction },
|
|
325
|
-
refreshTag: defaults.refreshTag,
|
|
326
|
-
refreshTimeoutMs: defaults.refreshTimeoutMs,
|
|
327
197
|
ignoreGlobs: [...defaults.ignoreGlobs],
|
|
328
198
|
incrementalCoverage: { ...defaults.incrementalCoverage },
|
|
329
|
-
|
|
330
|
-
diffRef: scoping.diffRef,
|
|
199
|
+
...fixed,
|
|
331
200
|
};
|
|
332
201
|
}
|
|
333
202
|
|
|
@@ -347,12 +216,6 @@ export function resolveMaintainabilityCrap(
|
|
|
347
216
|
userCrap.minMethodResolutionRate,
|
|
348
217
|
defaults.minMethodResolutionRate,
|
|
349
218
|
),
|
|
350
|
-
friction: { ...defaults.friction, ...(userCrap.friction ?? {}) },
|
|
351
|
-
refreshTag: userCrap.refreshTag ?? defaults.refreshTag,
|
|
352
|
-
refreshTimeoutMs: resolvePositiveIntegerMs(
|
|
353
|
-
userCrap.refreshTimeoutMs,
|
|
354
|
-
defaults.refreshTimeoutMs,
|
|
355
|
-
),
|
|
356
219
|
ignoreGlobs: Array.isArray(userCrap.ignoreGlobs)
|
|
357
220
|
? userCrap.ignoreGlobs.slice()
|
|
358
221
|
: [...defaults.ignoreGlobs],
|
|
@@ -360,48 +223,31 @@ export function resolveMaintainabilityCrap(
|
|
|
360
223
|
userCrap.incrementalCoverage,
|
|
361
224
|
defaults.incrementalCoverage,
|
|
362
225
|
),
|
|
363
|
-
|
|
364
|
-
diffRef: scoping.diffRef,
|
|
226
|
+
...fixed,
|
|
365
227
|
};
|
|
366
228
|
}
|
|
367
229
|
|
|
368
|
-
|
|
369
|
-
* Resolve the maintainability gate. Returns the legacy-bag shape with
|
|
370
|
-
* `targetDirs` + a scalar `tolerance` (when set) + scoping inherited
|
|
371
|
-
* from `gateScoping`.
|
|
372
|
-
*/
|
|
373
|
-
function resolveMaintainabilityQuality(userBlock, gateScoping) {
|
|
230
|
+
function resolveMaintainabilityQuality(userBlock) {
|
|
374
231
|
const defaults = MAINTAINABILITY_GATE_DEFAULTS;
|
|
375
|
-
const
|
|
376
|
-
|
|
377
|
-
|
|
232
|
+
const fixed = {
|
|
233
|
+
refreshTag: defaults.refreshTag,
|
|
234
|
+
defaultScope: GATE_SCOPING.scope,
|
|
235
|
+
diffRef: GATE_SCOPING.diffRef,
|
|
378
236
|
};
|
|
379
237
|
if (userBlock == null || typeof userBlock !== 'object') {
|
|
380
238
|
return {
|
|
381
239
|
targetDirs: [...defaults.targetDirs],
|
|
382
|
-
refreshTag: defaults.refreshTag,
|
|
383
|
-
refreshTimeoutMs: defaults.refreshTimeoutMs,
|
|
384
240
|
ignoreGlobs: [...defaults.ignoreGlobs],
|
|
385
|
-
|
|
386
|
-
diffRef: scoping.diffRef,
|
|
241
|
+
...fixed,
|
|
387
242
|
};
|
|
388
243
|
}
|
|
389
244
|
warnUnknownKeys(userBlock, MI_GATE_KEYS, 'quality.gates.maintainability');
|
|
390
245
|
const out = {
|
|
391
246
|
targetDirs: resolveListValue(defaults.targetDirs, userBlock.targetDirs),
|
|
392
|
-
refreshTag:
|
|
393
|
-
typeof userBlock.refreshTag === 'string' && userBlock.refreshTag.length
|
|
394
|
-
? userBlock.refreshTag
|
|
395
|
-
: defaults.refreshTag,
|
|
396
|
-
refreshTimeoutMs: resolvePositiveIntegerMs(
|
|
397
|
-
userBlock.refreshTimeoutMs,
|
|
398
|
-
defaults.refreshTimeoutMs,
|
|
399
|
-
),
|
|
400
247
|
ignoreGlobs: Array.isArray(userBlock.ignoreGlobs)
|
|
401
248
|
? userBlock.ignoreGlobs.slice()
|
|
402
249
|
: [...defaults.ignoreGlobs],
|
|
403
|
-
|
|
404
|
-
diffRef: scoping.diffRef,
|
|
250
|
+
...fixed,
|
|
405
251
|
};
|
|
406
252
|
if (userBlock.tolerance !== undefined) {
|
|
407
253
|
out.tolerance = toleranceScalar(
|
|
@@ -412,46 +258,6 @@ function resolveMaintainabilityQuality(userBlock, gateScoping) {
|
|
|
412
258
|
return out;
|
|
413
259
|
}
|
|
414
260
|
|
|
415
|
-
/**
|
|
416
|
-
* Story #2165 — accept a user-supplied positive-integer ms budget, falling
|
|
417
|
-
* back to `defaultMs` when the value is missing, non-integer, or non-positive.
|
|
418
|
-
* Mirrors the inlined guard in `resolveCoverageGate`.
|
|
419
|
-
*
|
|
420
|
-
* @param {*} value
|
|
421
|
-
* @param {number} defaultMs
|
|
422
|
-
* @returns {number}
|
|
423
|
-
*/
|
|
424
|
-
function resolvePositiveIntegerMs(value, defaultMs) {
|
|
425
|
-
if (typeof value === 'number' && Number.isInteger(value) && value > 0) {
|
|
426
|
-
return value;
|
|
427
|
-
}
|
|
428
|
-
return defaultMs;
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
/**
|
|
432
|
-
* Story #2165 — resolve `delivery.quality.formatAutofix`. Owns the bounded
|
|
433
|
-
* timeout for the close-time `npx biome format --write` spawn.
|
|
434
|
-
*
|
|
435
|
-
* @param {object | undefined} userBlock
|
|
436
|
-
* @returns {{ timeoutMs: number }}
|
|
437
|
-
*/
|
|
438
|
-
const FORMAT_AUTOFIX_KEYS = new Set(['timeoutMs']);
|
|
439
|
-
|
|
440
|
-
function resolveFormatAutofix(userBlock) {
|
|
441
|
-
const defaults = FORMAT_AUTOFIX_DEFAULTS;
|
|
442
|
-
if (userBlock == null || typeof userBlock !== 'object') {
|
|
443
|
-
return { timeoutMs: defaults.timeoutMs };
|
|
444
|
-
}
|
|
445
|
-
warnUnknownKeys(userBlock, FORMAT_AUTOFIX_KEYS, 'quality.formatAutofix');
|
|
446
|
-
return {
|
|
447
|
-
timeoutMs: resolvePositiveIntegerMs(
|
|
448
|
-
userBlock.timeoutMs,
|
|
449
|
-
defaults.timeoutMs,
|
|
450
|
-
),
|
|
451
|
-
};
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
/** Resolve the coverage gate. Owns `coveragePath` and `timeoutMs`. */
|
|
455
261
|
function resolveCoverageGate(userBlock) {
|
|
456
262
|
const defaults = COVERAGE_GATE_DEFAULTS;
|
|
457
263
|
if (userBlock == null || typeof userBlock !== 'object') {
|
|
@@ -472,109 +278,39 @@ function resolveCoverageGate(userBlock) {
|
|
|
472
278
|
userBlock.tolerance,
|
|
473
279
|
toleranceScalar(defaults.tolerance, 0),
|
|
474
280
|
),
|
|
475
|
-
timeoutMs:
|
|
476
|
-
typeof userBlock.timeoutMs === 'number' &&
|
|
477
|
-
Number.isInteger(userBlock.timeoutMs) &&
|
|
478
|
-
userBlock.timeoutMs > 0
|
|
479
|
-
? userBlock.timeoutMs
|
|
480
|
-
: defaults.timeoutMs,
|
|
281
|
+
timeoutMs: defaults.timeoutMs,
|
|
481
282
|
};
|
|
482
283
|
}
|
|
483
284
|
|
|
484
285
|
/**
|
|
485
|
-
*
|
|
486
|
-
*
|
|
487
|
-
* `miDropMustRefactor` was retired in Story #4531: schema-validated,
|
|
488
|
-
* defaulted, and resolved, but never consumed — the gate it named
|
|
489
|
-
* (`quality-preview.js`'s `computeExitCode`) short-circuits on `miExit`
|
|
490
|
-
* (derived from the already-consumed `gates.maintainability.tolerance`)
|
|
491
|
-
* before this value is ever read. `maintainability.tolerance` is the one
|
|
492
|
-
* documented MI-drop control now; see `lib/migrations/index.js` for the
|
|
493
|
-
* consumer-config migration that strips a leftover key on upgrade.
|
|
494
|
-
*
|
|
495
|
-
* `cyclomaticMustFix` was retired in Story #5313: the cyclomatic ratchet
|
|
496
|
-
* (`check-cyclomatic.js`) keeps a fixed ceiling of 12
|
|
497
|
-
* (`lib/cyclomatic-ceiling.js#CYCLOMATIC_CEILING`), and `cyclomaticFlag` is
|
|
498
|
-
* the one advisory knob left — `quality-preview.js` reports over-flag
|
|
499
|
-
* methods without failing on them.
|
|
286
|
+
* `cyclomaticFlag` is advisory only (`quality-preview.js`); the ratchet
|
|
287
|
+
* ceiling lives in `lib/cyclomatic-ceiling.js`.
|
|
500
288
|
*/
|
|
501
|
-
export const
|
|
289
|
+
export const CODING_GUARDRAILS = Object.freeze({
|
|
502
290
|
cyclomaticFlag: 8,
|
|
503
291
|
requireSiblingTest: false,
|
|
504
292
|
});
|
|
505
293
|
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
export function resolveCodingGuardrails(userBlock) {
|
|
509
|
-
const defaults = CODING_GUARDRAILS_DEFAULTS;
|
|
510
|
-
if (userBlock == null || typeof userBlock !== 'object') {
|
|
511
|
-
return { ...defaults };
|
|
512
|
-
}
|
|
513
|
-
warnUnknownKeys(
|
|
514
|
-
userBlock,
|
|
515
|
-
CODING_GUARDRAILS_KEYS,
|
|
516
|
-
'quality.codingGuardrails',
|
|
517
|
-
);
|
|
518
|
-
return {
|
|
519
|
-
cyclomaticFlag: userBlock.cyclomaticFlag ?? defaults.cyclomaticFlag,
|
|
520
|
-
requireSiblingTest:
|
|
521
|
-
typeof userBlock.requireSiblingTest === 'boolean'
|
|
522
|
-
? userBlock.requireSiblingTest
|
|
523
|
-
: defaults.requireSiblingTest,
|
|
524
|
-
};
|
|
525
|
-
}
|
|
526
|
-
|
|
527
|
-
// autoRefresh.miDropCap was retired alongside codingGuardrails.
|
|
528
|
-
// miDropMustRefactor in Story #4531 — same unconsumed-knob shape, same fix.
|
|
294
|
+
/** Only `enabled` is an operator switch. */
|
|
529
295
|
const AUTO_REFRESH_DEFAULTS = Object.freeze({
|
|
530
296
|
enabled: true,
|
|
531
297
|
crapJumpCap: 5,
|
|
532
298
|
scope: 'diff',
|
|
533
299
|
});
|
|
534
300
|
|
|
535
|
-
const AUTO_REFRESH_KEYS = new Set(Object.keys(AUTO_REFRESH_DEFAULTS));
|
|
536
|
-
|
|
537
301
|
function resolveAutoRefresh(userBlock) {
|
|
538
|
-
const defaults = AUTO_REFRESH_DEFAULTS;
|
|
539
|
-
if (userBlock == null || typeof userBlock !== 'object') {
|
|
540
|
-
return {
|
|
541
|
-
enabled: defaults.enabled,
|
|
542
|
-
crapJumpCap: defaults.crapJumpCap,
|
|
543
|
-
scope: defaults.scope,
|
|
544
|
-
};
|
|
545
|
-
}
|
|
546
|
-
|
|
547
|
-
warnUnknownKeys(userBlock, AUTO_REFRESH_KEYS, 'quality.autoRefresh');
|
|
548
|
-
|
|
549
302
|
return {
|
|
303
|
+
...AUTO_REFRESH_DEFAULTS,
|
|
550
304
|
enabled:
|
|
551
|
-
typeof userBlock
|
|
305
|
+
typeof userBlock?.enabled === 'boolean'
|
|
552
306
|
? userBlock.enabled
|
|
553
|
-
:
|
|
554
|
-
crapJumpCap:
|
|
555
|
-
typeof userBlock.crapJumpCap === 'number' &&
|
|
556
|
-
Number.isFinite(userBlock.crapJumpCap) &&
|
|
557
|
-
userBlock.crapJumpCap >= 0
|
|
558
|
-
? userBlock.crapJumpCap
|
|
559
|
-
: defaults.crapJumpCap,
|
|
560
|
-
scope:
|
|
561
|
-
userBlock.scope === 'diff' || userBlock.scope === 'full'
|
|
562
|
-
? userBlock.scope
|
|
563
|
-
: defaults.scope,
|
|
307
|
+
: AUTO_REFRESH_DEFAULTS.enabled,
|
|
564
308
|
};
|
|
565
309
|
}
|
|
566
310
|
|
|
567
|
-
/**
|
|
568
|
-
* Resolve the merged baselines block. Baselines now live alongside their
|
|
569
|
-
* gates (`gates.<tier>.baselinePath`); this helper preserves the
|
|
570
|
-
* historical flat `baselines.{lint, crap, maintainability}` shape so
|
|
571
|
-
* existing readers (`getBaselines(config)` in `config-resolver.js`)
|
|
572
|
-
* stay untouched. Each entry is synthesised from the resolved gate's
|
|
573
|
-
* `baselinePath`.
|
|
574
|
-
*/
|
|
311
|
+
/** Flat `baselines.{crap, maintainability}` view over each gate's `baselinePath`. */
|
|
575
312
|
function resolveBaselinesFromGates(gates) {
|
|
576
313
|
return {
|
|
577
|
-
lint: { path: gates?.lint?.baselinePath ?? 'baselines/lint.json' },
|
|
578
314
|
crap: {
|
|
579
315
|
path: gates?.crap?.baselinePath ?? CRAP_GATE_DEFAULTS.baselinePath,
|
|
580
316
|
},
|
|
@@ -587,26 +323,12 @@ function resolveBaselinesFromGates(gates) {
|
|
|
587
323
|
}
|
|
588
324
|
|
|
589
325
|
/**
|
|
590
|
-
*
|
|
591
|
-
*
|
|
592
|
-
* Returns the historical flattened bag (so the existing call sites that
|
|
593
|
-
* read `q.crap.coveragePath`, `q.maintainability.targetDirs`, etc. keep
|
|
594
|
-
* working) plus the new `gates` resolved object and `gateScoping`.
|
|
595
|
-
*
|
|
596
|
-
* @param {object|undefined} userQuality
|
|
597
|
-
*/
|
|
598
|
-
/**
|
|
599
|
-
* Story #2125: merge a consumer-supplied `floors` bag with the framework
|
|
600
|
-
* default for that gate. Defaults supply any workspace key the consumer
|
|
601
|
-
* didn't provide — most commonly the catch-all `'*'`. Consumer entries
|
|
602
|
-
* always win over defaults at the workspace-key level.
|
|
326
|
+
* Consumer entries win per workspace key. Returns a fresh object so callers
|
|
327
|
+
* cannot mutate the frozen defaults.
|
|
603
328
|
*
|
|
604
|
-
*
|
|
605
|
-
*
|
|
606
|
-
*
|
|
607
|
-
* @param {object | undefined | null} userFloors raw `gates.<kind>.floors`
|
|
608
|
-
* @param {object} defaults frozen framework default (e.g. `DEFAULT_COVERAGE_FLOORS`)
|
|
609
|
-
* @returns {object} merged workspace-keyed floors
|
|
329
|
+
* @param {object | undefined | null} userFloors
|
|
330
|
+
* @param {object} defaults
|
|
331
|
+
* @returns {object}
|
|
610
332
|
*/
|
|
611
333
|
function mergeFloorsWithDefaults(userFloors, defaults) {
|
|
612
334
|
const defaultsCopy = {};
|
|
@@ -631,21 +353,8 @@ const FLOOR_DEFAULTS_BY_KIND = Object.freeze({
|
|
|
631
353
|
});
|
|
632
354
|
|
|
633
355
|
/**
|
|
634
|
-
*
|
|
635
|
-
*
|
|
636
|
-
* (coverage, crap, maintainability), the resolved block carries `floors`
|
|
637
|
-
* merged with the kind's default — so `check-baselines.js` sees the
|
|
638
|
-
* framework default at runtime even when `.agentrc.json` omits the
|
|
639
|
-
* `floors` key.
|
|
640
|
-
*
|
|
641
|
-
* Kinds the consumer did NOT declare are passed through untouched —
|
|
642
|
-
* `check-baselines.js` skips kinds whose gate block is absent, and this
|
|
643
|
-
* function preserves that contract (synthesising a default block here
|
|
644
|
-
* would silently enable gates the consumer never asked for).
|
|
645
|
-
*
|
|
646
|
-
* Other keys on a declared gate block (e.g. `enabled`, `targetDirs`,
|
|
647
|
-
* `baselinePath`) are preserved as the consumer supplied them; this
|
|
648
|
-
* function only injects the floors layer.
|
|
356
|
+
* Injects default floors into declared gates only; synthesising a block for
|
|
357
|
+
* an undeclared kind would silently enable a gate the consumer never asked for.
|
|
649
358
|
*/
|
|
650
359
|
function resolveGatesWithFloors(gates) {
|
|
651
360
|
const out = { ...gates };
|
|
@@ -661,118 +370,53 @@ function resolveGatesWithFloors(gates) {
|
|
|
661
370
|
return out;
|
|
662
371
|
}
|
|
663
372
|
|
|
373
|
+
/**
|
|
374
|
+
* @param {object|undefined} userQuality
|
|
375
|
+
*/
|
|
664
376
|
export function resolveQuality(userQuality) {
|
|
665
377
|
const block =
|
|
666
378
|
userQuality && typeof userQuality === 'object' ? userQuality : {};
|
|
667
379
|
const gates =
|
|
668
380
|
block.gates && typeof block.gates === 'object' ? block.gates : {};
|
|
669
|
-
const gateScoping = {
|
|
670
|
-
scope: block.gateScoping?.scope ?? DEFAULT_GATE_SCOPING.scope,
|
|
671
|
-
diffRef: block.gateScoping?.diffRef ?? DEFAULT_GATE_SCOPING.diffRef,
|
|
672
|
-
};
|
|
673
381
|
const coverage = resolveCoverageGate(gates.coverage);
|
|
674
382
|
const resolvedGates = resolveGatesWithFloors(gates);
|
|
675
383
|
return {
|
|
676
|
-
maintainability: resolveMaintainabilityQuality(
|
|
677
|
-
|
|
678
|
-
gateScoping,
|
|
679
|
-
),
|
|
680
|
-
crap: resolveMaintainabilityCrap(gates.crap, gateScoping, coverage),
|
|
384
|
+
maintainability: resolveMaintainabilityQuality(gates.maintainability),
|
|
385
|
+
crap: resolveMaintainabilityCrap(gates.crap, coverage),
|
|
681
386
|
coverage,
|
|
682
387
|
baselines: resolveBaselinesFromGates(gates),
|
|
683
|
-
codingGuardrails:
|
|
388
|
+
codingGuardrails: { ...CODING_GUARDRAILS },
|
|
684
389
|
autoRefresh: resolveAutoRefresh(block.autoRefresh),
|
|
685
|
-
baselineEpsilon:
|
|
686
|
-
// Story #2165 — `delivery.quality.formatAutofix.timeoutMs` for the
|
|
687
|
-
// close-time `npx biome format --write` spawn.
|
|
688
|
-
formatAutofix: resolveFormatAutofix(block.formatAutofix),
|
|
689
|
-
gateScoping,
|
|
390
|
+
baselineEpsilon: { ...BASELINE_EPSILON },
|
|
690
391
|
gates: resolvedGates,
|
|
691
392
|
};
|
|
692
393
|
}
|
|
693
394
|
|
|
694
395
|
/**
|
|
695
|
-
*
|
|
696
|
-
*
|
|
697
|
-
* the prior bytes so env variance never rewrites the on-disk baseline.
|
|
698
|
-
*
|
|
699
|
-
* Defaults match the AC: MI 0.5, CRAP 0.5, coverage 0.1, mutation 0.5,
|
|
700
|
-
* lint 0 (counts are integer), lighthouse 1, bundle-size 1024 (bytes),
|
|
701
|
-
* duplication 0.5 (percentage points, Story #3664).
|
|
396
|
+
* The writer folds sub-epsilon row deltas back to the prior bytes so env
|
|
397
|
+
* variance never rewrites a baseline. bundle-size is bytes.
|
|
702
398
|
*/
|
|
703
|
-
|
|
399
|
+
const BASELINE_EPSILON = Object.freeze({
|
|
704
400
|
maintainability: 0.5,
|
|
705
401
|
crap: 0.5,
|
|
706
402
|
coverage: 0.1,
|
|
707
403
|
mutation: 0.5,
|
|
708
|
-
lint: 0,
|
|
709
|
-
lighthouse: 1,
|
|
710
404
|
'bundle-size': 1024,
|
|
711
405
|
duplication: 0.5,
|
|
712
406
|
});
|
|
713
407
|
|
|
714
|
-
const BASELINE_EPSILON_KINDS = new Set(Object.keys(BASELINE_EPSILON_DEFAULTS));
|
|
715
|
-
|
|
716
408
|
/**
|
|
717
|
-
* Resolve the merged `delivery.quality.baselineEpsilon` block. Returns a
|
|
718
|
-
* frozen per-kind map keyed by the same kind names used by the per-kind
|
|
719
|
-
* modules. Unknown keys raise a warning. Negative or non-numeric overrides
|
|
720
|
-
* throw an `EXIT_CONFIG`-style error so a misconfigured project halts at
|
|
721
|
-
* startup rather than silently dropping the override.
|
|
722
|
-
*
|
|
723
|
-
* @param {object | undefined} userBlock
|
|
724
|
-
* @returns {{ [kind: string]: number }}
|
|
725
|
-
*/
|
|
726
|
-
function assertEpsilonValue(kind, v) {
|
|
727
|
-
if (typeof v !== 'number' || !Number.isFinite(v) || v < 0) {
|
|
728
|
-
const err = new Error(
|
|
729
|
-
`[config] quality.baselineEpsilon.${kind} must be a non-negative finite number (got ${JSON.stringify(v)})`,
|
|
730
|
-
);
|
|
731
|
-
err.code = 'EXIT_CONFIG';
|
|
732
|
-
err.exitCode = 3;
|
|
733
|
-
throw err;
|
|
734
|
-
}
|
|
735
|
-
}
|
|
736
|
-
|
|
737
|
-
export function resolveBaselineEpsilon(userBlock) {
|
|
738
|
-
if (userBlock == null || typeof userBlock !== 'object') {
|
|
739
|
-
return { ...BASELINE_EPSILON_DEFAULTS };
|
|
740
|
-
}
|
|
741
|
-
warnUnknownKeys(userBlock, BASELINE_EPSILON_KINDS, 'quality.baselineEpsilon');
|
|
742
|
-
const out = { ...BASELINE_EPSILON_DEFAULTS };
|
|
743
|
-
for (const kind of BASELINE_EPSILON_KINDS) {
|
|
744
|
-
if (!Object.hasOwn(userBlock, kind)) continue;
|
|
745
|
-
assertEpsilonValue(kind, userBlock[kind]);
|
|
746
|
-
out[kind] = userBlock[kind];
|
|
747
|
-
}
|
|
748
|
-
return out;
|
|
749
|
-
}
|
|
750
|
-
|
|
751
|
-
/**
|
|
752
|
-
* Convenience accessor: resolve a single kind's epsilon from a config
|
|
753
|
-
* (project override or framework default). Returns the framework default
|
|
754
|
-
* when the user block is absent or omits the kind. Throws when the kind
|
|
755
|
-
* is unknown.
|
|
756
|
-
*
|
|
757
409
|
* @param {string} kind
|
|
758
|
-
* @param {object | null | undefined} config full resolved config OR
|
|
759
|
-
* a `{ delivery: { quality: ... } }` / `{ quality: ... }` shape.
|
|
760
410
|
* @returns {number}
|
|
761
411
|
*/
|
|
762
|
-
export function getBaselineEpsilon(kind
|
|
763
|
-
if (!
|
|
412
|
+
export function getBaselineEpsilon(kind) {
|
|
413
|
+
if (!Object.hasOwn(BASELINE_EPSILON, kind)) {
|
|
764
414
|
throw new Error(`[config] getBaselineEpsilon: unknown kind '${kind}'`);
|
|
765
415
|
}
|
|
766
|
-
|
|
767
|
-
const resolved = resolveBaselineEpsilon(userBlock);
|
|
768
|
-
return resolved[kind];
|
|
416
|
+
return BASELINE_EPSILON[kind];
|
|
769
417
|
}
|
|
770
418
|
|
|
771
419
|
/**
|
|
772
|
-
* Read the merged `delivery.quality` block. Accepts the full resolved
|
|
773
|
-
* config — the canonical `delivery.quality` path is the single supported
|
|
774
|
-
* shape.
|
|
775
|
-
*
|
|
776
420
|
* @param {object | null | undefined} config
|
|
777
421
|
* @returns {ReturnType<typeof resolveQuality>}
|
|
778
422
|
*/
|