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,10 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* close-validation/gates.js — Gate construction and partitioning.
|
|
3
|
-
*
|
|
4
|
-
* Owns the canonical close-validation gate list (`buildDefaultGates` /
|
|
5
|
-
* `DEFAULT_GATES`) and the parallel-vs-serial partitioning used by the
|
|
6
|
-
* runner (`INDEPENDENT_GATE_NAMES` / `partitionGates`).
|
|
7
|
-
*/
|
|
1
|
+
/** Close-validation gate list construction and parallel/serial partitioning. */
|
|
8
2
|
|
|
9
3
|
import { existsSync } from 'node:fs';
|
|
10
4
|
|
|
@@ -26,26 +20,15 @@ import {
|
|
|
26
20
|
|
|
27
21
|
/**
|
|
28
22
|
* @typedef {Object} Gate
|
|
29
|
-
* @property {string} name
|
|
30
|
-
* @property {string} cmd
|
|
31
|
-
* @property {string[]} args
|
|
23
|
+
* @property {string} name
|
|
24
|
+
* @property {string} cmd
|
|
25
|
+
* @property {string[]} args
|
|
32
26
|
* @property {string} [hint] - Remediation hint shown on failure.
|
|
33
|
-
* @property {{ baseRef: string }} [changedFileScope]
|
|
34
|
-
* @property {{ reason: string }} [skip] - Pre-decided skip
|
|
35
|
-
*
|
|
36
|
-
* Used for the `coverage-capture` gate when the incremental-coverage skip
|
|
37
|
-
* is already known to fire, so the gate list can register a real `npm test`
|
|
38
|
-
* gate in its place instead of the close silently running no test gate.
|
|
39
|
-
* @property {Record<string, string>} [env] - Optional per-gate environment
|
|
40
|
-
* overlay. Merged over `process.env` for this gate's spawned child only.
|
|
41
|
-
* Used to thread the epic baseRef into the `check-baselines` gate via
|
|
42
|
-
* `BASELINE_REF` (Story #3890) so baseline regressions compare against the
|
|
43
|
-
* epic integration branch rather than `origin/main`.
|
|
27
|
+
* @property {{ baseRef: string }} [changedFileScope]
|
|
28
|
+
* @property {{ reason: string }} [skip] - Pre-decided skip: recorded, never spawned.
|
|
29
|
+
* @property {Record<string, string>} [env] - Overlay merged over `process.env` for this gate's child only.
|
|
44
30
|
* @property {(cmd: string, args: string[], opts: { cwd: string, gateName?: string, log?: (m: string) => void, signal?: AbortSignal, env?: Record<string, string> }) => Promise<{ status: number }> | { status: number }} [run]
|
|
45
|
-
* -
|
|
46
|
-
* executes via this callable instead of spawning `cmd`/`args` through
|
|
47
|
-
* the default runner — used for per-kind baseline gates that import
|
|
48
|
-
* `compare(head, base)` directly.
|
|
31
|
+
* - In-process runner used instead of spawning `cmd`/`args`.
|
|
49
32
|
*/
|
|
50
33
|
|
|
51
34
|
const TYPECHECK_HINT =
|
|
@@ -57,21 +40,10 @@ function buildChangedFileScope(baseRef) {
|
|
|
57
40
|
}
|
|
58
41
|
|
|
59
42
|
/**
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
* The baselines gate resolves its compare ref through `resolveScope`,
|
|
65
|
-
* whose environment layer reads `BASELINE_REF`. Threading
|
|
66
|
-
* `origin/<baseBranch>` here makes the gate diff head against the epic
|
|
67
|
-
* integration branch instead of the framework-default `origin/main`, so
|
|
68
|
-
* drift that already landed on `main` but is outside the Story's own diff
|
|
69
|
-
* does not surface as a phantom regression. The same convention
|
|
70
|
-
* (`origin/<baseBranch>`) is used by the baseline-attribution and
|
|
71
|
-
* auto-refresh paths, keeping read/compare bases aligned.
|
|
72
|
-
*
|
|
73
|
-
* Returns `null` when no integration branch is supplied (the gate then
|
|
74
|
-
* keeps its existing default-ref / consumer-config behaviour untouched).
|
|
43
|
+
* Pin the `check-baselines` compare base to `origin/<baseBranch>` via
|
|
44
|
+
* `BASELINE_REF`, so drift outside the Story's diff is not a phantom
|
|
45
|
+
* regression; matches the attribution and auto-refresh bases. `null` keeps
|
|
46
|
+
* the gate's default ref.
|
|
75
47
|
*
|
|
76
48
|
* @param {string|undefined|null} baseBranch
|
|
77
49
|
* @returns {{ BASELINE_REF: string } | null}
|
|
@@ -82,15 +54,8 @@ function buildBaselinesGateEnv(baseBranch) {
|
|
|
82
54
|
}
|
|
83
55
|
|
|
84
56
|
/**
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
* capture already runs the suite under c8 instrumentation (Story #1798).
|
|
88
|
-
*
|
|
89
|
-
* Reads the single canonical shape `delivery.quality.gates.crap.enabled`
|
|
90
|
-
* from the resolved config. Defaults to `true` so an omitted setting
|
|
91
|
-
* matches `CRAP_GATE_DEFAULTS.enabled`. We deliberately do NOT round-trip
|
|
92
|
-
* through `getQuality()` here because that resolver expects the unresolved
|
|
93
|
-
* `gates.crap.*` shape.
|
|
57
|
+
* Defaults to `true` (matches `CRAP_GATE_DEFAULTS.enabled`). Not routed
|
|
58
|
+
* through `getQuality()`, which expects the unresolved `gates.crap.*` shape.
|
|
94
59
|
*
|
|
95
60
|
* @param {object|undefined|null} config - Canonical resolved config.
|
|
96
61
|
* @returns {boolean}
|
|
@@ -102,41 +67,16 @@ function isCrapGateEnabled(config) {
|
|
|
102
67
|
}
|
|
103
68
|
|
|
104
69
|
/**
|
|
105
|
-
* The
|
|
106
|
-
*
|
|
107
|
-
* committed fact, so probing at the gate cwd is authoritative. See
|
|
108
|
-
* `lib/npm-scripts.js` for the shared reader.
|
|
109
|
-
*/
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* Conditionally produce the standalone `test` gate entry.
|
|
113
|
-
*
|
|
114
|
-
* The plain `test` gate is the canonical test runner UNLESS the
|
|
115
|
-
* coverage-capture gate is taking that role — which happens only when the
|
|
116
|
-
* CRAP gate is enabled (Story #1798) AND the consumer actually ships a
|
|
117
|
-
* `test:coverage` script for coverage-capture to run (#4473). When CRAP is
|
|
118
|
-
* enabled but `test:coverage` is absent, coverage-capture is dropped from
|
|
119
|
-
* the gate list, so the `test` gate MUST come back — otherwise the consumer
|
|
120
|
-
* has NO working test gate at all. Splitting this out keeps
|
|
121
|
-
* `buildDefaultGates` flat for the CRAP-cyclomatic gate.
|
|
70
|
+
* The plain `test` gate, unless coverage-capture will run the suite — every
|
|
71
|
+
* close must keep exactly one working test gate.
|
|
122
72
|
*
|
|
123
|
-
*
|
|
124
|
-
* runner: it is registered, but its own incremental-coverage skip is already
|
|
125
|
-
* known to fire (nothing changed under `crap.targetDirs`), so it will exit 0
|
|
126
|
-
* without running anything. A tests-only Story hits that on every close, and
|
|
127
|
-
* before #5278 the close then recorded a suite it never ran as `passed`.
|
|
128
|
-
*
|
|
129
|
-
* @param {boolean} coverageCaptureRunsSuite - Whether the coverage-capture
|
|
130
|
-
* gate will actually run the suite for this build.
|
|
73
|
+
* @param {boolean} coverageCaptureRunsSuite
|
|
131
74
|
* @returns {Gate[]}
|
|
132
75
|
*/
|
|
133
76
|
function buildTestGateEntry(coverageCaptureRunsSuite) {
|
|
134
77
|
if (coverageCaptureRunsSuite) return [];
|
|
135
|
-
//
|
|
136
|
-
//
|
|
137
|
-
// set on this entry alone precisely because the two full-suite gates are
|
|
138
|
-
// mutually exclusive: when `coverage-capture` is registered instead, the
|
|
139
|
-
// lock is taken one level down, inside `runCapture`.
|
|
78
|
+
// `fullSuiteLock` serializes this suite behind the host lock; when
|
|
79
|
+
// coverage-capture runs instead, `runCapture` takes the lock itself.
|
|
140
80
|
return [{ name: 'test', cmd: 'npm', args: ['test'], fullSuiteLock: true }];
|
|
141
81
|
}
|
|
142
82
|
|
|
@@ -144,19 +84,10 @@ const CHECK_BASELINES_HINT =
|
|
|
144
84
|
'Unified baselines gate breached. Inspect the JSON report (`node .agents/scripts/check-baselines.js`) to see which kind/component/axis fell below floor; remediate the underlying file(s) or — when the regression is intentional — refresh the relevant baseline through its per-kind update script and commit with a `baseline-refresh:` tagged subject.';
|
|
145
85
|
|
|
146
86
|
/**
|
|
147
|
-
*
|
|
148
|
-
*
|
|
149
|
-
*
|
|
150
|
-
*
|
|
151
|
-
* buckets. `independent` and `coverage` are the split pair: the first reads no
|
|
152
|
-
* coverage artifact and therefore fails alongside `lint` / `format` /
|
|
153
|
-
* `typecheck` in the parallel partition, the second consumes the artifact
|
|
154
|
-
* `coverage-capture` writes and therefore stays serial behind it.
|
|
155
|
-
*
|
|
156
|
-
* Every name here MUST also be a member of the `gateName` enum in
|
|
157
|
-
* `.agents/schemas/validation-evidence.schema.json` — the close pipeline keys
|
|
158
|
-
* per-gate evidence on it. `tests/close-validation-gates-enum.test.js` pins
|
|
159
|
-
* that ⊆ invariant.
|
|
87
|
+
* Baselines gate names. `single` is the unsplit fail-closed fallback;
|
|
88
|
+
* `independent` runs in the parallel partition, `coverage` stays serial
|
|
89
|
+
* behind coverage-capture. Every name MUST be in the `gateName` enum of
|
|
90
|
+
* `validation-evidence.schema.json`.
|
|
160
91
|
*/
|
|
161
92
|
export const BASELINES_GATE_NAMES = Object.freeze({
|
|
162
93
|
single: 'check-baselines',
|
|
@@ -164,28 +95,12 @@ export const BASELINES_GATE_NAMES = Object.freeze({
|
|
|
164
95
|
coverage: 'check-baselines-coverage',
|
|
165
96
|
});
|
|
166
97
|
|
|
167
|
-
/**
|
|
168
|
-
* The baseline kinds whose evaluation reads the coverage artifact written by
|
|
169
|
-
* the `coverage-capture` gate (`coverage` scores it directly; `crap` divides
|
|
170
|
-
* complexity by it). They are the only kinds that have to wait for the
|
|
171
|
-
* capture — every other kind scores the source tree and can run as early as
|
|
172
|
-
* the cheapest gates do.
|
|
173
|
-
*/
|
|
98
|
+
/** Kinds that read the coverage-capture artifact and so must wait for it. */
|
|
174
99
|
const COVERAGE_CONSUMING_KINDS = new Set(['coverage', 'crap']);
|
|
175
100
|
|
|
176
101
|
/**
|
|
177
|
-
*
|
|
178
|
-
* `
|
|
179
|
-
* pipeline (a kind runs when its `gates.<kind>` block is present and not
|
|
180
|
-
* explicitly disabled) so the registration probe's view of "what will run"
|
|
181
|
-
* matches the gate's own view exactly — and so the Story #5172 partition is
|
|
182
|
-
* derived from the pipeline's own view of what runs rather than a hardcoded
|
|
183
|
-
* kind list that a consumer's config could silently contradict.
|
|
184
|
-
*
|
|
185
|
-
* Returns `null` when that view cannot be resolved at all (a config object
|
|
186
|
-
* whose `delivery.quality` access throws). Callers MUST read `null` as
|
|
187
|
-
* "unknown" and fall back to the single unsplit gate: a partition that cannot
|
|
188
|
-
* be computed must never silently drop enforcement.
|
|
102
|
+
* Enabled baseline kinds, mirroring `selectEnabledGates` in check-baselines.
|
|
103
|
+
* `null` means unresolvable; callers MUST fall back to the single unsplit gate.
|
|
189
104
|
*
|
|
190
105
|
* @param {object|undefined|null} config canonical resolved config
|
|
191
106
|
* @returns {string[]|null}
|
|
@@ -203,11 +118,7 @@ function enabledBaselineKinds(config) {
|
|
|
203
118
|
}
|
|
204
119
|
|
|
205
120
|
/**
|
|
206
|
-
*
|
|
207
|
-
* `delivery.quality.requireBaselines: true`. Default false — a consumer that
|
|
208
|
-
* enables baseline gates but has not committed baseline artifacts gets a
|
|
209
|
-
* clean skip (see `probeBaselinesGate`) rather than a deterministic first-try
|
|
210
|
-
* close failure. Fail-closed baseline posture (#4495).
|
|
121
|
+
* `delivery.quality.requireBaselines: true` opts into fail-closed enforcement.
|
|
211
122
|
*
|
|
212
123
|
* @param {object|undefined|null} config
|
|
213
124
|
* @returns {boolean}
|
|
@@ -223,33 +134,14 @@ function toKindSet(presentBaselines) {
|
|
|
223
134
|
}
|
|
224
135
|
|
|
225
136
|
/**
|
|
226
|
-
*
|
|
227
|
-
*
|
|
228
|
-
*
|
|
229
|
-
*
|
|
230
|
-
*
|
|
231
|
-
* Decision shape:
|
|
232
|
-
* - `{ register: false, reason }` — skip (caller logs the reason). Baseline
|
|
233
|
-
* gates ARE enabled but none of the enabled kinds carry a committed
|
|
234
|
-
* baseline artifact and the consumer has not set `requireBaselines`. This
|
|
235
|
-
* is the bench/greenfield case: the gate would otherwise fail
|
|
236
|
-
* deterministically on first try reading a non-existent
|
|
237
|
-
* `baselines/<kind>.json`.
|
|
238
|
-
* - `{ register: true }` — at least one committed baseline artifact is
|
|
239
|
-
* present, OR no baseline kinds are enabled at all (the gate then self-
|
|
240
|
-
* skips every kind and exits a clean empty PASS — no failure to avoid, so
|
|
241
|
-
* the gate stays registered exactly as pre-#4495); run the gate.
|
|
242
|
-
* - `{ register: true, hint }` — baselines are required-by-config
|
|
243
|
-
* (`requireBaselines: true`) but absent; keep the gate registered so it
|
|
244
|
-
* fails, with a preflight hint naming the fix.
|
|
137
|
+
* Decide whether to register `check-baselines`. Skip (with `reason`) only when
|
|
138
|
+
* kinds are enabled, none has a committed `baselines/<kind>.json`, and
|
|
139
|
+
* baselines are not required — the gate would otherwise fail deterministically.
|
|
140
|
+
* Required-but-absent stays registered with a fix `hint`; no enabled kinds
|
|
141
|
+
* registers (the gate exits a clean empty PASS).
|
|
245
142
|
*
|
|
246
143
|
* @param {{ config?: object, cwd?: string, enabledKinds?: string[]|null, presentBaselines?: string[]|Set<string> }} opts
|
|
247
|
-
* `enabledKinds`
|
|
248
|
-
* caller (so the probe and the partition below read the same view).
|
|
249
|
-
* A `null` — the unresolvable set — reads as "no enabled kinds", which is
|
|
250
|
-
* the fail-closed path: the gate stays registered under its single
|
|
251
|
-
* historical name. `presentBaselines` injects the set of kinds whose
|
|
252
|
-
* baseline artifact exists (tests), short-circuiting the on-disk probe.
|
|
144
|
+
* `enabledKinds: null` (unresolvable) reads as none — the fail-closed path.
|
|
253
145
|
* @returns {{ register: boolean, reason?: string, hint?: string }}
|
|
254
146
|
*/
|
|
255
147
|
function probeBaselinesGate({
|
|
@@ -260,10 +152,6 @@ function probeBaselinesGate({
|
|
|
260
152
|
} = {}) {
|
|
261
153
|
const enabled = enabledKinds ?? [];
|
|
262
154
|
if (enabled.length === 0) {
|
|
263
|
-
// No enabled baseline kinds → `check-baselines.js` self-skips every kind
|
|
264
|
-
// and exits clean (an empty PASS). There is no deterministic-failure risk
|
|
265
|
-
// to avoid, so keep the gate registered exactly as it was pre-#4495; the
|
|
266
|
-
// #4495 skip is confined strictly to the read-miss-would-fail case below.
|
|
267
155
|
return { register: true };
|
|
268
156
|
}
|
|
269
157
|
const injected =
|
|
@@ -291,30 +179,10 @@ function probeBaselinesGate({
|
|
|
291
179
|
}
|
|
292
180
|
|
|
293
181
|
/**
|
|
294
|
-
*
|
|
295
|
-
*
|
|
296
|
-
*
|
|
297
|
-
*
|
|
298
|
-
* into. Keeping the fan-out here is what makes the #3890 (`BASELINE_REF`)
|
|
299
|
-
* and #4495 (`probeBaselinesGate`) invariants structurally impossible to
|
|
300
|
-
* apply to one entry and forget on the other.
|
|
301
|
-
*
|
|
302
|
-
* Three shapes:
|
|
303
|
-
* - decision says skip → no entries at all (#4495's greenfield skip).
|
|
304
|
-
* - `kinds` is null (unresolvable) or empty → ONE entry under the single
|
|
305
|
-
* historical name with no `--gate` filter, in its historical serial
|
|
306
|
-
* position. Fail closed: a partition that cannot be computed must never
|
|
307
|
-
* silently drop enforcement, and an empty set means the gate self-skips
|
|
308
|
-
* every kind and exits a clean empty PASS exactly as it did pre-split.
|
|
309
|
-
* - otherwise → the split pair, each pinned to its own `--gate` list.
|
|
310
|
-
* Neither bucket is ever registered with an empty kind set, so a consumer
|
|
311
|
-
* running only coverage-consuming kinds gets no parallel entry and one
|
|
312
|
-
* running none of them gets no serial entry.
|
|
313
|
-
*
|
|
314
|
-
* The independent entry is emitted first so a reader of the gate list sees
|
|
315
|
-
* the order the runner actually walks; `partitionGates` is what routes it
|
|
316
|
-
* into the parallel phase, and the coverage entry keeps its declared
|
|
317
|
-
* position after `coverage-capture`.
|
|
182
|
+
* Fan one registration decision, `BASELINE_REF` overlay and hint out across
|
|
183
|
+
* the baselines entries, so no entry can miss one. Null/empty `kinds` yields
|
|
184
|
+
* ONE unfiltered `single` entry (fail closed); otherwise the non-empty
|
|
185
|
+
* buckets of the split pair, each pinned to its own `--gate` list.
|
|
318
186
|
*
|
|
319
187
|
* @param {{ decision: { register: boolean, hint?: string }, kinds: string[]|null, env: { BASELINE_REF: string }|null }} args
|
|
320
188
|
* @returns {Gate[]}
|
|
@@ -351,10 +219,7 @@ function buildBaselinesGateEntries({ decision, kinds, env }) {
|
|
|
351
219
|
}
|
|
352
220
|
|
|
353
221
|
/**
|
|
354
|
-
*
|
|
355
|
-
* carries. Whitespace-separated, so `npm run lint` yields the argv the gate
|
|
356
|
-
* spawned before any of these commands were configurable — which is what
|
|
357
|
-
* keeps an unconfigured consumer's `commandConfigHash` unchanged.
|
|
222
|
+
* Whitespace split; keeps an unconfigured consumer's `commandConfigHash` stable.
|
|
358
223
|
*
|
|
359
224
|
* @param {string} commandString
|
|
360
225
|
* @returns {{ cmd: string, args: string[] }}
|
|
@@ -365,23 +230,10 @@ function splitCommand(commandString) {
|
|
|
365
230
|
}
|
|
366
231
|
|
|
367
232
|
/**
|
|
368
|
-
* Will
|
|
369
|
-
*
|
|
370
|
-
*
|
|
371
|
-
*
|
|
372
|
-
* file lives under `crap.targetDirs` — the saving that makes incremental mode
|
|
373
|
-
* worth having. The gate list has to know that in advance, because the
|
|
374
|
-
* consequence is not "coverage-capture is cheap today" but "there is no test
|
|
375
|
-
* gate in this close at all": the plain `test` gate is dropped precisely
|
|
376
|
-
* because coverage-capture was going to carry test-failure signalling. A
|
|
377
|
-
* tests-only Story therefore closed green over a red suite.
|
|
378
|
-
*
|
|
379
|
-
* Predicting the skip is safe in one direction only, so every uncertainty
|
|
380
|
-
* resolves to `false` (coverage-capture runs, no extra `test` gate — the
|
|
381
|
-
* pre-#5278 shape): an unresolvable ref, a missing cwd, a git error, or the
|
|
382
|
-
* mode being off. A wrong `false` costs one redundant capture; a wrong `true`
|
|
383
|
-
* would register a `test` gate beside a coverage-capture that also runs the
|
|
384
|
-
* suite, which is the double-spend the credit economy exists to prevent.
|
|
233
|
+
* Will coverage-capture take its incremental skip (no changed file under
|
|
234
|
+
* `crap.targetDirs`)? If so the close would otherwise have no test gate at all.
|
|
235
|
+
* Every uncertainty resolves to `false`: a wrong `false` costs one redundant
|
|
236
|
+
* capture, a wrong `true` runs the suite twice.
|
|
385
237
|
*
|
|
386
238
|
* @param {{
|
|
387
239
|
* config?: object,
|
|
@@ -397,8 +249,7 @@ function predictsIncrementalCaptureSkip({
|
|
|
397
249
|
baseBranch,
|
|
398
250
|
getChangedFilesImpl = getChangedFiles,
|
|
399
251
|
}) {
|
|
400
|
-
// No cwd is the module-load `DEFAULT_GATES` case: never spawn git at import
|
|
401
|
-
// time just to answer a question that caller cannot act on.
|
|
252
|
+
// No cwd is the module-load `DEFAULT_GATES` case: never spawn git at import.
|
|
402
253
|
if (typeof cwd !== 'string' || cwd.length === 0) return false;
|
|
403
254
|
const { crap } = getQuality(config);
|
|
404
255
|
if (crap?.incrementalCoverage?.skipWhenUnchanged !== true) return false;
|
|
@@ -406,9 +257,8 @@ function predictsIncrementalCaptureSkip({
|
|
|
406
257
|
if (typeof ref !== 'string' || ref.length === 0) return false;
|
|
407
258
|
try {
|
|
408
259
|
const changed = getChangedFilesImpl({ ref, cwd });
|
|
409
|
-
//
|
|
410
|
-
//
|
|
411
|
-
// shape has to be checked here or an unknown diff reads as a skip.
|
|
260
|
+
// Non-array is "unknown", which `filterFilesUnderTargets` would flatten to
|
|
261
|
+
// `[]` and misread as a skip.
|
|
412
262
|
if (!Array.isArray(changed)) return false;
|
|
413
263
|
return filterFilesUnderTargets(changed, crap.targetDirs).length === 0;
|
|
414
264
|
} catch {
|
|
@@ -417,9 +267,7 @@ function predictsIncrementalCaptureSkip({
|
|
|
417
267
|
}
|
|
418
268
|
|
|
419
269
|
/**
|
|
420
|
-
* Is the `test` gate already credited
|
|
421
|
-
* coverage-capture is the active runner; a consumer without one gets the
|
|
422
|
-
* plain `test` gate regardless (Story #5313).
|
|
270
|
+
* Is the `test` gate already credited? Only consulted when coverage-capture is active.
|
|
423
271
|
*
|
|
424
272
|
* @param {{ coverageCaptureActive: boolean } & Parameters<typeof predictsTestEvidenceCredit>[0]} opts
|
|
425
273
|
* @returns {boolean}
|
|
@@ -429,10 +277,7 @@ function resolveTestCredited({ coverageCaptureActive, ...probe }) {
|
|
|
429
277
|
}
|
|
430
278
|
|
|
431
279
|
/**
|
|
432
|
-
*
|
|
433
|
-
* build — so the plain `test` gate is dropped? It is not when it is inactive,
|
|
434
|
-
* when its incremental skip is pre-decided (Story #5278), or when a green
|
|
435
|
-
* bare `npm test` already deposited the test credit (Story #5313).
|
|
280
|
+
* Does coverage-capture run the suite (so the plain `test` gate is dropped)?
|
|
436
281
|
*
|
|
437
282
|
* @param {{ coverageCaptureActive: boolean, captureSkipPredicted: boolean, testCredited: boolean }} opts
|
|
438
283
|
* @returns {boolean}
|
|
@@ -445,91 +290,47 @@ function coverageCaptureRunsSuite({
|
|
|
445
290
|
return coverageCaptureActive && !captureSkipPredicted && !testCredited;
|
|
446
291
|
}
|
|
447
292
|
|
|
293
|
+
const COVERAGE_CAPTURE_ARGS = Object.freeze([
|
|
294
|
+
'.agents/scripts/coverage-capture.js',
|
|
295
|
+
]);
|
|
296
|
+
|
|
297
|
+
/** The close gate that replays the `pre-push` hook's CRAP-scope preview. */
|
|
298
|
+
const QUALITY_PREVIEW_GATE_NAME = 'quality-preview';
|
|
299
|
+
|
|
300
|
+
const QUALITY_PREVIEW_HINT =
|
|
301
|
+
"Quality preview failed — the same per-file maintainability / CRAP check the `pre-push` hook runs, scored against the base branch. Reduce the flagged methods' complexity or cover them, then re-run close; a close that skipped this gate would have died at push instead.";
|
|
302
|
+
|
|
448
303
|
/**
|
|
449
|
-
*
|
|
450
|
-
*
|
|
451
|
-
*
|
|
452
|
-
* consumer has set `delivery.execution.requireCreditedCapture`. The CLI no
|
|
453
|
-
* longer reads that key, so the worker's pre-push deposit invocation always
|
|
454
|
-
* runs while the close gate refuses to pay for a suite the worker should
|
|
455
|
-
* already have banked.
|
|
304
|
+
* Replays the `pre-push` CRAP-scope preview so its breach fails close, not
|
|
305
|
+
* the push. Registered exactly when coverage-capture is, and after it, so it
|
|
306
|
+
* scores a fresh artifact.
|
|
456
307
|
*
|
|
457
|
-
* @param {
|
|
458
|
-
* @returns {
|
|
308
|
+
* @param {{ coverageCaptureActive: boolean, baseBranch?: string }} opts
|
|
309
|
+
* @returns {Gate[]}
|
|
459
310
|
*/
|
|
460
|
-
function
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
311
|
+
function buildQualityPreviewGateEntry({ coverageCaptureActive, baseBranch }) {
|
|
312
|
+
if (!coverageCaptureActive) return [];
|
|
313
|
+
const ref = `origin/${baseBranch || 'main'}`;
|
|
314
|
+
return [
|
|
315
|
+
{
|
|
316
|
+
name: QUALITY_PREVIEW_GATE_NAME,
|
|
317
|
+
cmd: 'node',
|
|
318
|
+
args: ['.agents/scripts/quality-preview.js', '--changed-since', ref],
|
|
319
|
+
hint: QUALITY_PREVIEW_HINT,
|
|
320
|
+
},
|
|
321
|
+
];
|
|
466
322
|
}
|
|
467
323
|
|
|
468
324
|
/**
|
|
469
|
-
* Build the
|
|
470
|
-
*
|
|
471
|
-
*
|
|
472
|
-
*
|
|
473
|
-
* gate is dropped
|
|
474
|
-
* `crap.enabled === true` (Story #1798) AND a `test:coverage` script
|
|
475
|
-
* exists (Story #4473) — because coverage-capture then carries
|
|
476
|
-
* test-failure signalling under c8. When CRAP is on but `test:coverage` is
|
|
477
|
-
* absent, coverage-capture is dropped and the `test` gate is restored so
|
|
478
|
-
* there is always a working test gate.
|
|
479
|
-
*
|
|
480
|
-
* `typecheck` and `lint` are mandatory; consumers may customise either
|
|
481
|
-
* command via `project.commands.typecheck` / `project.commands.lint`
|
|
482
|
-
* (defaults `npm run typecheck` / `npm run lint`). Customising `lint` is how
|
|
483
|
-
* a consumer whose hooks and CI already lint the diff stops paying for a
|
|
484
|
-
* third whole-repo pass at close: `lint` runs in the parallel partition, so
|
|
485
|
-
* a slow whole-repo lint sets the floor for that whole phase.
|
|
486
|
-
*
|
|
487
|
-
* Story #2210 retired the legacy per-kind in-process regression gates
|
|
488
|
-
* (`check-maintainability`, `check-crap`, `check-mutation`) and their
|
|
489
|
-
* shared in-process runner. The unified `check-baselines` gate is now the
|
|
490
|
-
* single source of truth for per-kind regression enforcement
|
|
491
|
-
* (attribution-wired floor + tolerance + schema).
|
|
492
|
-
* The `baseBranch` parameter threads the close run's integration branch
|
|
493
|
-
* into two gates: the `format` gate's `changedFileScope` (existing) and —
|
|
494
|
-
* since Story #3890 — the `check-baselines` gate's `BASELINE_REF` env, so
|
|
495
|
-
* the baselines regression compare diffs head against the epic integration
|
|
496
|
-
* branch (`origin/<baseBranch>`) rather than the framework-default
|
|
497
|
-
* `origin/main`. Without this, every child Story on an `epic/<id>` branch
|
|
498
|
-
* re-discovered inherited main-vs-epic drift in untouched files as phantom
|
|
499
|
-
* regressions and worked around it by hand-setting `BASELINE_REF`.
|
|
500
|
-
*
|
|
501
|
-
* Story #4473 — the coverage-capture gate spawns `npm run test:coverage`,
|
|
502
|
-
* so it is registered ONLY when the consumer actually ships that script.
|
|
503
|
-
* When CRAP is enabled but `test:coverage` is absent, coverage-capture is
|
|
504
|
-
* dropped and the plain `test` gate is restored (see `buildTestGateEntry`),
|
|
505
|
-
* so a consumer without a coverage script gets a working degraded test gate
|
|
506
|
-
* instead of a deterministic close failure with no test gate at all. The
|
|
507
|
-
* probe reads `package.json` at `cwd` (the gate execution directory).
|
|
508
|
-
*
|
|
509
|
-
* Story #4495 — the unified `check-baselines` gate reads a committed
|
|
510
|
-
* `baselines/<kind>.json` for each enabled kind; a consumer that enables
|
|
511
|
-
* baseline gates but ships no `baselines/` tree (every bench sandbox, any
|
|
512
|
-
* greenfield consumer) failed the gate deterministically on first try. The
|
|
513
|
-
* gate is now registered only when its consumer contract is satisfied
|
|
514
|
-
* (`probeBaselinesGate`): at least one enabled kind carries a committed
|
|
515
|
-
* baseline, OR the consumer opted into fail-closed enforcement via
|
|
516
|
-
* `delivery.quality.requireBaselines`. When no baselines are committed and
|
|
517
|
-
* none are required, the gate is skipped with a logged reason (via `log`)
|
|
518
|
-
* instead of a blocking failure.
|
|
325
|
+
* Build the close-validation gate list, cheapest fast-fail first: typecheck →
|
|
326
|
+
* lint → [test] → format → [coverage-capture → quality-preview] →
|
|
327
|
+
* check-baselines. Coverage-capture registers only when CRAP is enabled AND a
|
|
328
|
+
* `test:coverage` script exists; it then carries test-failure signalling and
|
|
329
|
+
* the plain `test` gate is dropped, so there is always exactly one test gate.
|
|
519
330
|
*
|
|
520
331
|
* @param {{ config?: object, baseBranch?: string, cwd?: string, packageScripts?: Record<string, string>, presentBaselines?: string[]|Set<string>, log?: (message: string) => void, getChangedFilesImpl?: typeof getChangedFiles }} [opts]
|
|
521
|
-
* `
|
|
522
|
-
*
|
|
523
|
-
* `delivery.quality.gates.crap.enabled`. `baseBranch` is the close run's
|
|
524
|
-
* integration branch (`epic/<id>` for Epic-attached Stories, the base
|
|
525
|
-
* branch for standalone Stories). `cwd` is where the `package.json`
|
|
526
|
-
* coverage-script probe and the `baselines/<kind>.json` presence probe
|
|
527
|
-
* read from (defaults to `process.cwd()`); `packageScripts` injects the
|
|
528
|
-
* scripts map directly (tests) and short-circuits the coverage-script disk
|
|
529
|
-
* read; `presentBaselines` injects the set of kinds whose baseline artifact
|
|
530
|
-
* exists (tests) and short-circuits the baseline-presence disk read; `log`
|
|
531
|
-
* receives the skip reason when the `check-baselines` gate is not
|
|
532
|
-
* registered.
|
|
332
|
+
* `cwd` is where the `package.json` and baseline-presence probes read;
|
|
333
|
+
* `packageScripts` / `presentBaselines` inject those probes (tests).
|
|
533
334
|
* @returns {Gate[]}
|
|
534
335
|
*/
|
|
535
336
|
export function buildDefaultGates({
|
|
@@ -548,8 +349,8 @@ export function buildDefaultGates({
|
|
|
548
349
|
const scripts = packageScripts ?? readPackageScripts(cwd);
|
|
549
350
|
const coverageCaptureActive =
|
|
550
351
|
isCrapGateEnabled(config) && hasNpmScript(scripts, 'test:coverage');
|
|
551
|
-
//
|
|
552
|
-
//
|
|
352
|
+
// A credited bare `npm test` registers the plain `test` gate beside the
|
|
353
|
+
// capture so the credit is reported, never re-spent.
|
|
553
354
|
const testCredited = resolveTestCredited({
|
|
554
355
|
coverageCaptureActive,
|
|
555
356
|
storyId,
|
|
@@ -559,10 +360,8 @@ export function buildDefaultGates({
|
|
|
559
360
|
shouldSkipImpl,
|
|
560
361
|
log,
|
|
561
362
|
});
|
|
562
|
-
//
|
|
563
|
-
//
|
|
564
|
-
// plain `test` gate comes back beside it and the capture gate registers as
|
|
565
|
-
// a pre-decided skip rather than as a suite that silently did not run.
|
|
363
|
+
// A predicted incremental skip registers the capture as a pre-decided skip
|
|
364
|
+
// and brings the plain `test` gate back.
|
|
566
365
|
const captureSkipPredicted =
|
|
567
366
|
coverageCaptureActive &&
|
|
568
367
|
predictsIncrementalCaptureSkip({
|
|
@@ -603,10 +402,8 @@ export function buildDefaultGates({
|
|
|
603
402
|
args: typecheck.args,
|
|
604
403
|
hint: TYPECHECK_HINT,
|
|
605
404
|
},
|
|
606
|
-
// Gate
|
|
607
|
-
//
|
|
608
|
-
// scoped pair does not shift the close-orchestrator log line, the
|
|
609
|
-
// evidence keyspace, or the parallel-partition membership below.
|
|
405
|
+
// Gate names stay generic though commands resolve from config, so the
|
|
406
|
+
// log line, evidence keyspace and partition membership never shift.
|
|
610
407
|
{ name: 'lint', cmd: lint.cmd, args: lint.args },
|
|
611
408
|
...buildTestGateEntry(
|
|
612
409
|
coverageCaptureRunsSuite({
|
|
@@ -616,10 +413,6 @@ export function buildDefaultGates({
|
|
|
616
413
|
}),
|
|
617
414
|
),
|
|
618
415
|
{
|
|
619
|
-
// Gate name kept generic ("format") so the close-orchestrator log line
|
|
620
|
-
// doesn't shift when a repo swaps biome for Prettier / dprint via
|
|
621
|
-
// `project.commands.formatCheck`. The
|
|
622
|
-
// actual command and the remediation hint resolve from config.
|
|
623
416
|
name: 'format',
|
|
624
417
|
cmd: format.cmd,
|
|
625
418
|
args: format.args,
|
|
@@ -633,7 +426,7 @@ export function buildDefaultGates({
|
|
|
633
426
|
{
|
|
634
427
|
name: 'coverage-capture',
|
|
635
428
|
cmd: 'node',
|
|
636
|
-
args:
|
|
429
|
+
args: [...COVERAGE_CAPTURE_ARGS],
|
|
637
430
|
hint: 'Coverage capture failed — `npm run test:coverage` exited non-zero. Fix failing tests or coverage-threshold breaches, then re-run close.',
|
|
638
431
|
...(captureSkipPredicted
|
|
639
432
|
? { skip: { reason: 'incremental-no-crap-changes' } }
|
|
@@ -641,28 +434,7 @@ export function buildDefaultGates({
|
|
|
641
434
|
},
|
|
642
435
|
]
|
|
643
436
|
: []),
|
|
644
|
-
|
|
645
|
-
// per-kind regression enforcement. The legacy per-kind in-process gates
|
|
646
|
-
// were retired because their regression-compare semantics are fully
|
|
647
|
-
// subsumed by this gate's attribution-wired floor + tolerance + schema
|
|
648
|
-
// enforcement, and running both paths in series was redundant and
|
|
649
|
-
// conflict-prone.
|
|
650
|
-
//
|
|
651
|
-
// `check-baselines.js` self-skips per-kind gates whose `enabled === false`
|
|
652
|
-
// is configured. Story #4495: it is now also skipped entirely when the
|
|
653
|
-
// consumer enables baseline gates but ships no committed baseline artifact
|
|
654
|
-
// (and has not set `delivery.quality.requireBaselines`) — otherwise the
|
|
655
|
-
// gate fails deterministically on first try reading a non-existent
|
|
656
|
-
// `baselines/<kind>.json` (`probeBaselinesGate`). When required-by-config
|
|
657
|
-
// but absent, it stays registered with a preflight hint naming the fix.
|
|
658
|
-
//
|
|
659
|
-
// Story #5172: the gate registers as up to TWO entries. The kinds that
|
|
660
|
-
// read no coverage artifact run in the parallel independent partition so
|
|
661
|
-
// a baseline breach fails beside `lint` / `format` / `typecheck` instead
|
|
662
|
-
// of minutes later behind `coverage-capture`; the coverage-consuming
|
|
663
|
-
// kinds keep the serial slot after it. `buildBaselinesGateEntries` owns
|
|
664
|
-
// that fan-out so both entries inherit ONE registration decision, ONE
|
|
665
|
-
// `BASELINE_REF` overlay and ONE hint.
|
|
437
|
+
...buildQualityPreviewGateEntry({ coverageCaptureActive, baseBranch }),
|
|
666
438
|
...buildBaselinesGateEntries({
|
|
667
439
|
decision: baselinesDecision,
|
|
668
440
|
kinds: baselineKinds,
|
|
@@ -672,36 +444,25 @@ export function buildDefaultGates({
|
|
|
672
444
|
}
|
|
673
445
|
|
|
674
446
|
/**
|
|
675
|
-
*
|
|
676
|
-
* `npm run typecheck` fallback for the typecheck gate. Call sites that have a
|
|
677
|
-
* resolved config object in scope (e.g. `single-story-close.js`) should
|
|
678
|
-
* prefer `buildDefaultGates({ config })` so a configured
|
|
679
|
-
* `project.commands.typecheck` is honoured.
|
|
447
|
+
* Config-less gate list; callers holding a config should use `buildDefaultGates({ config })`.
|
|
680
448
|
*
|
|
681
449
|
* @type {Gate[]}
|
|
682
450
|
*/
|
|
683
451
|
export const DEFAULT_GATES = buildDefaultGates();
|
|
684
452
|
|
|
685
453
|
/**
|
|
686
|
-
* Gates
|
|
687
|
-
*
|
|
688
|
-
* `runCloseValidation` for the Promise.all + AbortController plumbing.
|
|
454
|
+
* Gates that are read-only against the working tree and share no ports, so
|
|
455
|
+
* they may run concurrently.
|
|
689
456
|
*/
|
|
690
457
|
const INDEPENDENT_GATE_NAMES = new Set([
|
|
691
458
|
'lint',
|
|
692
459
|
'format',
|
|
693
460
|
'typecheck',
|
|
694
|
-
// Story #5172 — the coverage-independent half of the baselines gate. It
|
|
695
|
-
// reads the committed `baselines/<kind>.json` files and scores the source
|
|
696
|
-
// tree in-process; it writes nothing and shares no port, so it satisfies
|
|
697
|
-
// the same read-only contract as the three gates above.
|
|
698
461
|
BASELINES_GATE_NAMES.independent,
|
|
699
462
|
]);
|
|
700
463
|
|
|
701
464
|
/**
|
|
702
|
-
*
|
|
703
|
-
* remainder. Order is preserved within each bucket so the serial walk stays
|
|
704
|
-
* cheapest-fast-fail-first (test → coverage-capture → check-baselines).
|
|
465
|
+
* Order is preserved within each bucket.
|
|
705
466
|
*
|
|
706
467
|
* @param {Gate[]} gates
|
|
707
468
|
* @returns {{ independent: Gate[], serial: Gate[] }}
|