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,36 +1,23 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* close-validation/process.js — Child-process lifecycle plumbing for gates.
|
|
3
|
-
*
|
|
4
|
-
* Owns the default async gate runner (spawn + line-prefixed stdio piping)
|
|
5
|
-
* and the AbortSignal / exit-code helpers it composes.
|
|
6
|
-
*/
|
|
1
|
+
/** Default async gate runner: spawn, line-prefixed stdio, abort and exit codes. */
|
|
7
2
|
|
|
8
3
|
import { spawn } from 'node:child_process';
|
|
9
4
|
|
|
10
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
LOCK_WAIT_EXPIRED_EXIT_CODE,
|
|
7
|
+
withFullSuiteLockAsync,
|
|
8
|
+
} from '../full-suite-lock.js';
|
|
9
|
+
import {
|
|
10
|
+
groupSpawnOptions,
|
|
11
|
+
superviseGroup,
|
|
12
|
+
TIMEOUT_EXIT_CODE,
|
|
13
|
+
} from '../process-group.js';
|
|
11
14
|
|
|
12
15
|
/**
|
|
13
|
-
*
|
|
14
|
-
* `prefix` to each line. Tail bytes without a trailing newline flush on
|
|
15
|
-
* `end` so the operator never loses the last line of a gate's output.
|
|
16
|
-
*
|
|
17
|
-
* ## The drain must stay cheap (Story #4766)
|
|
16
|
+
* Emit each line with `prefix`; the unterminated tail flushes on `end`.
|
|
18
17
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* non-blocking pipe, fails outright with `EAGAIN`. A gate child is not
|
|
23
|
-
* obliged to survive that: Biome's `biome_console` `.unwrap()`s the error and
|
|
24
|
-
* aborts the process with exit 101, so a green lint verdict presents as a
|
|
25
|
-
* failed close. Two consequences bind everything on this path:
|
|
26
|
-
*
|
|
27
|
-
* 1. Splitting is O(chunk), not O(chunk × lines) — the scan advances a
|
|
28
|
-
* `start` index instead of re-slicing the buffer once per line, so a
|
|
29
|
-
* 64KB chunk carrying 500 lines does not copy 16MB.
|
|
30
|
-
* 2. **`emit` MUST NOT block.** A synchronous per-line file write is
|
|
31
|
-
* exactly the stall this path cannot afford; the close path's capture
|
|
32
|
-
* sink (`single-story-close/gate-log.js`) buffers to an async stream for
|
|
33
|
-
* that reason.
|
|
18
|
+
* The drain must stay cheap: a slow reader fills the pipe and the child's
|
|
19
|
+
* write fails with `EAGAIN` (Biome then aborts with exit 101, a false red).
|
|
20
|
+
* So splitting advances an index (O(chunk)), and `emit` MUST NOT block.
|
|
34
21
|
*/
|
|
35
22
|
function pipePrefixed(stream, prefix, emit) {
|
|
36
23
|
let buf = '';
|
|
@@ -57,24 +44,6 @@ function pipePrefixed(stream, prefix, emit) {
|
|
|
57
44
|
stream.on('error', () => {});
|
|
58
45
|
}
|
|
59
46
|
|
|
60
|
-
/** Wire the AbortSignal so an abort kills the child. Returns the cleanup fn. */
|
|
61
|
-
export function attachGateAbortHandler(child, signal) {
|
|
62
|
-
if (!signal) return () => {};
|
|
63
|
-
const killChild = () => {
|
|
64
|
-
try {
|
|
65
|
-
child.kill('SIGTERM');
|
|
66
|
-
} catch {
|
|
67
|
-
/* race: already exited */
|
|
68
|
-
}
|
|
69
|
-
};
|
|
70
|
-
if (signal.aborted) {
|
|
71
|
-
killChild();
|
|
72
|
-
return () => {};
|
|
73
|
-
}
|
|
74
|
-
signal.addEventListener('abort', killChild, { once: true });
|
|
75
|
-
return () => signal.removeEventListener('abort', killChild);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
47
|
/** SIGTERM (no exit code) on abort → non-zero so the gate counts as failed. */
|
|
79
48
|
export function gateExitCode(code, sig) {
|
|
80
49
|
if (typeof code === 'number') return code;
|
|
@@ -82,37 +51,20 @@ export function gateExitCode(code, sig) {
|
|
|
82
51
|
}
|
|
83
52
|
|
|
84
53
|
/**
|
|
85
|
-
* Biome
|
|
86
|
-
*
|
|
87
|
-
* `overrides`), so I processed nothing" — biome exits 1 in that case.
|
|
88
|
-
*
|
|
89
|
-
* The format gate scopes biome to the changed-file subset (Story #3410). When
|
|
90
|
-
* that subset is non-empty by extension but every path is biome-config-ignored,
|
|
91
|
-
* the scoped invocation reports this message and exits 1 even though
|
|
92
|
-
* `biome format .` over the whole tree is clean — a false negative for the
|
|
93
|
-
* gate (Story #4292). Detecting the marker lets the runner treat that exit as
|
|
94
|
-
* a clean skip rather than a formatting failure.
|
|
54
|
+
* Biome exits 1 with this when every path handed to it is config-ignored — a
|
|
55
|
+
* false negative for the changed-file-scoped format gate, treated as a skip.
|
|
95
56
|
*/
|
|
96
57
|
const BIOME_NO_FILES_PROCESSED =
|
|
97
58
|
'No files were processed in the specified paths';
|
|
98
59
|
|
|
99
60
|
/**
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
* The marker only ever appears when biome processed nothing, and in that case
|
|
103
|
-
* its whole output is a handful of lines — so a bounded tail always contains
|
|
104
|
-
* it when it is there at all. Retaining a tail rather than the full transcript
|
|
105
|
-
* keeps the drain path's per-line work O(1) in the volume of gate output
|
|
106
|
-
* (Story #4766): the previous `captured += line` grew a string without limit,
|
|
107
|
-
* on the one gate (biome/format) whose output is the loudest.
|
|
61
|
+
* The marker only appears in a few-line output, so a bounded tail always
|
|
62
|
+
* holds it and keeps per-line drain work O(1).
|
|
108
63
|
*/
|
|
109
64
|
const MARKER_PROBE_TAIL_LINES = 32;
|
|
110
65
|
|
|
111
66
|
/**
|
|
112
|
-
*
|
|
113
|
-
* marker. Pure function — no I/O. Exported for unit coverage (Story #4292).
|
|
114
|
-
*
|
|
115
|
-
* @param {string} output - Combined stdout/stderr captured from the gate child.
|
|
67
|
+
* @param {string} output - Combined stdout/stderr.
|
|
116
68
|
* @returns {boolean}
|
|
117
69
|
*/
|
|
118
70
|
function isBiomeNoFilesProcessed(output) {
|
|
@@ -122,115 +74,133 @@ function isBiomeNoFilesProcessed(output) {
|
|
|
122
74
|
}
|
|
123
75
|
|
|
124
76
|
/**
|
|
125
|
-
*
|
|
126
|
-
*
|
|
127
|
-
*
|
|
128
|
-
* into each other in the operator's terminal), and resolves only once the
|
|
129
|
-
* child has exited and both stdio pipes are drained.
|
|
130
|
-
*
|
|
131
|
-
* `opts.log` is the drain sink and **must not block** — see `pipePrefixed`
|
|
132
|
-
* above for what a synchronous per-line write costs the child (Story #4766).
|
|
133
|
-
*
|
|
134
|
-
* Honours `opts.signal`: a TERM is delivered to the child the moment the
|
|
135
|
-
* signal fires, so a sibling gate's failure aborts the rest of the wave
|
|
136
|
-
* promptly. The promise still resolves (rather than rejecting) on abort —
|
|
137
|
-
* `runCloseValidation` sees a non-zero status and folds it into the
|
|
138
|
-
* already-recorded first-failure.
|
|
139
|
-
*
|
|
140
|
-
* When `opts.tolerateNoFilesProcessed` is set (the biome-scoped format gate —
|
|
141
|
-
* Story #4292), a non-zero exit whose combined output carries biome's
|
|
142
|
-
* "No files were processed" marker is downgraded to a clean `status: 0`,
|
|
143
|
-
* because that exit means every config-included path was already excluded,
|
|
144
|
-
* not that formatting drifted.
|
|
77
|
+
* Spawn a gate with `[gate-name] `-prefixed output; resolves (never rejects)
|
|
78
|
+
* once the child exits and both pipes drain. `opts.log` must not block.
|
|
79
|
+
* An abort signal TERMs the child so a sibling failure stops the wave.
|
|
145
80
|
*
|
|
146
|
-
*
|
|
147
|
-
*
|
|
148
|
-
*
|
|
149
|
-
*
|
|
150
|
-
*
|
|
151
|
-
* precisely because this runner drives sibling gates on the same event loop,
|
|
152
|
-
* which a blocking wait would stall.
|
|
81
|
+
* `fullSuiteLock` serializes the spawn behind the host lock (async, so
|
|
82
|
+
* sibling gates on this event loop are not stalled). An expired wait spawns
|
|
83
|
+
* anyway unless `deferOnLockExpiry`, which returns
|
|
84
|
+
* `LOCK_WAIT_EXPIRED_EXIT_CODE` so close ends `pending`. Each child leads its
|
|
85
|
+
* own process group so a timeout, abort or parent signal kills its workers too.
|
|
153
86
|
*
|
|
154
87
|
* @param {string} cmd
|
|
155
88
|
* @param {string[]} args
|
|
156
|
-
* @param {{ cwd: string, signal?: AbortSignal, gateName?: string, log?: (m: string) => void, env?: Record<string, string>, tolerateNoFilesProcessed?: boolean, fullSuiteLock?: boolean, skipIfSatisfied?: () => {status: number}|undefined }} opts
|
|
89
|
+
* @param {{ cwd: string, signal?: AbortSignal, gateName?: string, log?: (m: string) => void, env?: Record<string, string>, tolerateNoFilesProcessed?: boolean, fullSuiteLock?: boolean, deferOnLockExpiry?: boolean, timeoutMs?: number, lockOptions?: object, skipIfSatisfied?: () => {status: number}|undefined }} opts
|
|
157
90
|
* @returns {Promise<{ status: number }>}
|
|
158
91
|
*/
|
|
159
92
|
export function defaultGateRunner(cmd, args, opts = {}) {
|
|
160
93
|
if (!opts.fullSuiteLock) return spawnGate(cmd, args, opts);
|
|
161
|
-
// `
|
|
162
|
-
//
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
// has since been deposited and returns that verdict instead of spawning.
|
|
166
|
-
return withFullSuiteLockAsync(
|
|
167
|
-
{ cwd: opts.cwd, log: opts.log, skipIfSatisfied: opts.skipIfSatisfied },
|
|
168
|
-
() => spawnGate(cmd, args, opts),
|
|
94
|
+
// `skipIfSatisfied` re-probes after the wait: evidence another suite
|
|
95
|
+
// deposited meanwhile is returned instead of spawning.
|
|
96
|
+
return withFullSuiteLockAsync(gateLockOptions(opts), () =>
|
|
97
|
+
spawnGate(cmd, args, opts),
|
|
169
98
|
);
|
|
170
99
|
}
|
|
171
100
|
|
|
101
|
+
function gateLockOptions(opts) {
|
|
102
|
+
return {
|
|
103
|
+
cwd: opts.cwd,
|
|
104
|
+
log: opts.log,
|
|
105
|
+
skipIfSatisfied: opts.skipIfSatisfied,
|
|
106
|
+
onWaitExpired: opts.deferOnLockExpiry ? deferredGateStatus : undefined,
|
|
107
|
+
...opts.lockOptions, // test seam only
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function deferredGateStatus() {
|
|
112
|
+
return { status: LOCK_WAIT_EXPIRED_EXIT_CODE };
|
|
113
|
+
}
|
|
114
|
+
|
|
172
115
|
/**
|
|
173
|
-
* The bare gate spawn — child process, prefixed drain, abort wiring, exit-code
|
|
174
|
-
* normalisation. Split from {@link defaultGateRunner} so the full-suite lock
|
|
175
|
-
* composes over one named unit.
|
|
176
|
-
*
|
|
177
116
|
* @param {string} cmd
|
|
178
117
|
* @param {string[]} args
|
|
179
118
|
* @param {Parameters<typeof defaultGateRunner>[2]} opts
|
|
180
119
|
* @returns {Promise<{ status: number }>}
|
|
181
120
|
*/
|
|
182
121
|
function spawnGate(cmd, args, opts) {
|
|
183
|
-
const
|
|
184
|
-
const
|
|
122
|
+
const child = spawnGateChild(cmd, args, opts);
|
|
123
|
+
const output = gateOutput(opts);
|
|
124
|
+
pipePrefixed(child.stdout, output.prefix, output.tap);
|
|
125
|
+
pipePrefixed(child.stderr, output.prefix, output.tap);
|
|
126
|
+
// A bare suite has nothing to clean up, so it gets SIGKILL; other gates
|
|
127
|
+
// (a capture holding the lock) get SIGTERM to release and kill their suite.
|
|
128
|
+
const supervisor = superviseGroup(child, {
|
|
129
|
+
timeoutMs: opts.timeoutMs,
|
|
130
|
+
abortSignal: opts.signal,
|
|
131
|
+
signalOnParentSignal: opts.fullSuiteLock ? 'SIGKILL' : 'SIGTERM',
|
|
132
|
+
});
|
|
133
|
+
return new Promise((resolve) => {
|
|
134
|
+
// 'close', not 'exit': only 'close' waits for both pipes to drain.
|
|
135
|
+
child.on('close', (code, sig) => {
|
|
136
|
+
supervisor.release();
|
|
137
|
+
resolve({
|
|
138
|
+
status: settledGateStatus({ code, sig, supervisor, opts, output }),
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
child.on('error', () => {
|
|
142
|
+
supervisor.release();
|
|
143
|
+
resolve({ status: 1 });
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* @param {string} cmd
|
|
150
|
+
* @param {string[]} args
|
|
151
|
+
* @param {{ cwd: string, env?: Record<string, string> }} opts
|
|
152
|
+
*/
|
|
153
|
+
function spawnGateChild(cmd, args, { cwd, env }) {
|
|
154
|
+
return spawn(cmd, args, {
|
|
185
155
|
cwd,
|
|
186
156
|
shell: process.platform === 'win32',
|
|
187
157
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
188
|
-
|
|
189
|
-
// environment so a gate-scoped `BASELINE_REF` reaches the spawned
|
|
190
|
-
// `check-baselines` child without mutating the parent process env.
|
|
158
|
+
...groupSpawnOptions(),
|
|
191
159
|
...(env ? { env: { ...process.env, ...env } } : {}),
|
|
192
160
|
});
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Retains a bounded tail only when the biome marker may need inspecting.
|
|
165
|
+
*
|
|
166
|
+
* @param {{ gateName?: string, log?: (m: string) => void, tolerateNoFilesProcessed?: boolean }} opts
|
|
167
|
+
*/
|
|
168
|
+
function gateOutput({ gateName, log, tolerateNoFilesProcessed }) {
|
|
193
169
|
const prefix = gateName ? `[${gateName}] ` : '';
|
|
194
170
|
const emit =
|
|
195
171
|
typeof log === 'function' ? log : (m) => process.stdout.write(`${m}\n`);
|
|
196
|
-
// Retain a bounded tail only when we may need to inspect it for the biome
|
|
197
|
-
// "No files were processed" marker — otherwise the stream is purely piped
|
|
198
|
-
// through to the operator (no retained buffer).
|
|
199
172
|
const recent = [];
|
|
200
|
-
const tap = tolerateNoFilesProcessed
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
});
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
resolve({ status: 1 });
|
|
234
|
-
});
|
|
235
|
-
});
|
|
173
|
+
const tap = tolerateNoFilesProcessed ? retainTail(recent, emit) : emit;
|
|
174
|
+
return { prefix, emit, tap, recent };
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function retainTail(recent, emit) {
|
|
178
|
+
return (line) => {
|
|
179
|
+
recent.push(line);
|
|
180
|
+
if (recent.length > MARKER_PROBE_TAIL_LINES) recent.shift();
|
|
181
|
+
emit(line);
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function settledGateStatus(settled) {
|
|
186
|
+
return settled.supervisor.timedOut
|
|
187
|
+
? timedOutStatus(settled)
|
|
188
|
+
: exitedStatus(settled);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
function timedOutStatus({ opts, output }) {
|
|
192
|
+
output.emit(
|
|
193
|
+
`${output.prefix}⏱ exceeded ${opts.timeoutMs}ms — killed the gate's process group. Returning exit ${TIMEOUT_EXIT_CODE}.`,
|
|
194
|
+
);
|
|
195
|
+
return TIMEOUT_EXIT_CODE;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
function exitedStatus({ code, sig, opts, output }) {
|
|
199
|
+
const status = gateExitCode(code, sig);
|
|
200
|
+
if (status === 0 || !opts.tolerateNoFilesProcessed) return status;
|
|
201
|
+
if (!isBiomeNoFilesProcessed(output.recent.join('\n'))) return status;
|
|
202
|
+
output.emit(
|
|
203
|
+
`${output.prefix}↳ biome processed zero files (all changed paths are config-ignored); treating as a clean skip`,
|
|
204
|
+
);
|
|
205
|
+
return 0;
|
|
236
206
|
}
|
|
@@ -1,24 +1,8 @@
|
|
|
1
1
|
// .agents/scripts/lib/close-validation/projections/advisories.js
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* `
|
|
6
|
-
* and imported by nothing: the v2 Epic-tier collapse removed its caller and
|
|
7
|
-
* left the module behind. The practical consequence was that the advisory
|
|
8
|
-
* telling an operator to run `npm run maintainability:update` and commit a
|
|
9
|
-
* `baseline-refresh:` subject had never fired in v2 — consumers refreshed
|
|
10
|
-
* their baselines by hand or not at all.
|
|
11
|
-
*
|
|
12
|
-
* This module is that caller, for both projections. It is deliberately the
|
|
13
|
-
* only door: `close-validation/runner.js` invokes `runProjectionAdvisories`
|
|
14
|
-
* once, after the gate chain has passed, and every per-kind concern (gate
|
|
15
|
-
* enablement, baseline path resolution, scorer construction, formatting)
|
|
16
|
-
* lives here rather than being re-derived at the runner boundary.
|
|
17
|
-
*
|
|
18
|
-
* **Advisory, always.** Nothing in here can fail a close. `check-baselines`
|
|
19
|
-
* already fails closed on a real regression; the projections add the refresh
|
|
20
|
-
* half of the loop, not a second gate. Every projection is wrapped so a
|
|
21
|
-
* throw becomes a logged skip.
|
|
3
|
+
* The projection layer's single call site, run once after the gate chain
|
|
4
|
+
* passes; owns every per-kind concern. Advisory only — nothing here can fail
|
|
5
|
+
* a close (`check-baselines` is the gate); a throw becomes a logged skip.
|
|
22
6
|
*/
|
|
23
7
|
|
|
24
8
|
import path from 'node:path';
|
|
@@ -33,15 +17,12 @@ import {
|
|
|
33
17
|
projectMaintainabilityRegressions,
|
|
34
18
|
} from './maintainability.js';
|
|
35
19
|
|
|
36
|
-
/** Default on-disk baseline locations, mirroring the per-gate defaults. */
|
|
37
20
|
const DEFAULT_BASELINE_PATHS = Object.freeze({
|
|
38
21
|
maintainability: 'baselines/maintainability.json',
|
|
39
22
|
crap: 'baselines/crap.json',
|
|
40
23
|
});
|
|
41
24
|
|
|
42
25
|
/**
|
|
43
|
-
* Resolve a gate's baseline file to an absolute path.
|
|
44
|
-
*
|
|
45
26
|
* @param {string} kind
|
|
46
27
|
* @param {object} gate resolved `delivery.quality.gates.<kind>` block
|
|
47
28
|
* @param {string} cwd
|
|
@@ -56,9 +37,7 @@ function resolveBaselinePath(kind, gate, cwd) {
|
|
|
56
37
|
}
|
|
57
38
|
|
|
58
39
|
/**
|
|
59
|
-
*
|
|
60
|
-
* block means "framework defaults", which enable it — the same reading
|
|
61
|
-
* `buildDefaultGates` applies.
|
|
40
|
+
* An absent gate block means defaults, which enable it.
|
|
62
41
|
*
|
|
63
42
|
* @param {object|undefined} gate
|
|
64
43
|
* @returns {boolean}
|
|
@@ -68,9 +47,7 @@ function isEnabled(gate) {
|
|
|
68
47
|
}
|
|
69
48
|
|
|
70
49
|
/**
|
|
71
|
-
*
|
|
72
|
-
* logged skip. Returns the projection result (or `null` when it threw) so
|
|
73
|
-
* callers and tests can inspect what happened without parsing log lines.
|
|
50
|
+
* `null` when the projection threw.
|
|
74
51
|
*
|
|
75
52
|
* @param {{ kind: string, log: (m: string) => void, run: () => Promise<object>|object, format: (r: object) => string|null }} opts
|
|
76
53
|
* @returns {Promise<object|null>}
|
|
@@ -99,9 +76,6 @@ async function runOne({ kind, log, run, format }) {
|
|
|
99
76
|
}
|
|
100
77
|
|
|
101
78
|
/**
|
|
102
|
-
* Run the maintainability and CRAP pre-merge projections and log their
|
|
103
|
-
* advisories. Never throws; never affects the close verdict.
|
|
104
|
-
*
|
|
105
79
|
* @param {{
|
|
106
80
|
* cwd: string,
|
|
107
81
|
* baseBranch: string,
|
|
@@ -1,28 +1,11 @@
|
|
|
1
1
|
// .agents/scripts/lib/close-validation/projections/crap.js
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* Advisory only. `check-baselines` already fails close-validation closed on
|
|
11
|
-
* a real regression; duplicating that here would double-gate the same
|
|
12
|
-
* defect. What this projection adds is the **refresh** half of the loop —
|
|
13
|
-
* naming the breaching methods and the `npm run crap:update` +
|
|
14
|
-
* `baseline-refresh:` remedy while the operator still has the branch in
|
|
15
|
-
* hand, so a corrected baseline does not rot back into staleness.
|
|
16
|
-
*
|
|
17
|
-
* The helper never throws and never mutates anything. Every failure path
|
|
18
|
-
* resolves to `{ ok: true, breaches: [], skipped: '<reason>' }` so the
|
|
19
|
-
* caller can treat the advisory as best-effort.
|
|
20
|
-
*
|
|
21
|
-
* Post-merge approximation: CRAP needs a coverage join, so — unlike the MI
|
|
22
|
-
* projection, which scores a `git show` blob — the scorer reads the working
|
|
23
|
-
* tree. Close-validation runs inside the Story worktree at the branch tip,
|
|
24
|
-
* which is exactly the content a squash-merge lands, so the approximation is
|
|
25
|
-
* exact whenever the merge applies cleanly.
|
|
3
|
+
* Advisory pre-merge CRAP projection: names the methods the post-merge tree
|
|
4
|
+
* would breach and the `crap:update` + `baseline-refresh:` remedy
|
|
5
|
+
* (`check-baselines` already gates the real regression). Never throws;
|
|
6
|
+
* failures resolve to `{ ok: true, breaches: [], skipped }`. Scores the
|
|
7
|
+
* worktree (CRAP needs a coverage join), which at the branch tip is exactly
|
|
8
|
+
* what a clean squash-merge lands.
|
|
26
9
|
*/
|
|
27
10
|
|
|
28
11
|
import path from 'node:path';
|
|
@@ -39,20 +22,13 @@ import { gitSpawn as defaultGitSpawn } from '../../git-utils.js';
|
|
|
39
22
|
import { SCORABLE_SOURCE_EXT_RE } from '../../source-extensions.js';
|
|
40
23
|
import { MISSING_ARG_REASONS, validateProjectionInputs } from './inputs.js';
|
|
41
24
|
|
|
42
|
-
/**
|
|
43
|
-
* Default absolute tolerance on a projected CRAP score, shared with
|
|
44
|
-
* `check-crap`'s regression arm: floating-point noise must not register as
|
|
45
|
-
* a breach.
|
|
46
|
-
*/
|
|
25
|
+
/** Absorbs floating-point noise. */
|
|
47
26
|
export const DEFAULT_CRAP_TOLERANCE = 0.001;
|
|
48
27
|
|
|
49
|
-
/** Framework default for the new-method ceiling (`gates.crap.newMethodCeiling`). */
|
|
50
28
|
export const DEFAULT_NEW_METHOD_CEILING = 30;
|
|
51
29
|
|
|
52
30
|
/**
|
|
53
|
-
*
|
|
54
|
-
* `missing-args` skipped-reason the sibling MI projection reports, so both
|
|
55
|
-
* projections speak one vocabulary at the advisory boundary.
|
|
31
|
+
* Collapse `missing-*` to `missing-args`, matching the MI projection.
|
|
56
32
|
*
|
|
57
33
|
* @param {string} reason
|
|
58
34
|
* @returns {string}
|
|
@@ -62,17 +38,10 @@ function normaliseSkipReason(reason) {
|
|
|
62
38
|
}
|
|
63
39
|
|
|
64
40
|
/**
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
* Returns `[]` when the baseline is absent or unreadable — the caller maps
|
|
68
|
-
* that to the `no-baseline` skip.
|
|
69
|
-
*
|
|
70
|
-
* Deliberately module-local: `projectCrapBreaches`'s `loadBaseline` default
|
|
71
|
-
* is the single production door to it, and tests inject their own loader.
|
|
72
|
-
* Exporting it would add a second entry point nothing in production reaches
|
|
73
|
-
* — which is precisely the orphaning this Story exists to stop.
|
|
41
|
+
* Re-keys on-disk `path` to the `file` field `compareCrap` matches on;
|
|
42
|
+
* `[]` when absent or unreadable.
|
|
74
43
|
*
|
|
75
|
-
* @param {string} baselinePath
|
|
44
|
+
* @param {string} baselinePath
|
|
76
45
|
* @returns {Array<{file: string, method: string, startLine: number, crap: number}>}
|
|
77
46
|
*/
|
|
78
47
|
function loadCrapBaselineRows(baselinePath) {
|
|
@@ -92,10 +61,8 @@ function loadCrapBaselineRows(baselinePath) {
|
|
|
92
61
|
}
|
|
93
62
|
|
|
94
63
|
/**
|
|
95
|
-
*
|
|
96
|
-
* `(
|
|
97
|
-
* `requireCoverage`", which the projection reports as the `no-coverage`
|
|
98
|
-
* skip rather than as a clean run.
|
|
64
|
+
* The scorer resolves `null` when coverage is missing under
|
|
65
|
+
* `requireCoverage` (a `no-coverage` skip, not a clean run).
|
|
99
66
|
*
|
|
100
67
|
* @param {{
|
|
101
68
|
* cwd: string,
|
|
@@ -132,9 +99,8 @@ export function createCrapScorer({
|
|
|
132
99
|
}
|
|
133
100
|
|
|
134
101
|
/**
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
* cache so a story-init fetch in the same run satisfies it for free.
|
|
102
|
+
* Close may not have base-synced yet; the fetch cache makes this free when
|
|
103
|
+
* story-init already fetched.
|
|
138
104
|
*
|
|
139
105
|
* @param {string} cwd
|
|
140
106
|
* @param {string} baseBranch
|
|
@@ -153,10 +119,6 @@ function refreshBaseRef(cwd, baseBranch, git) {
|
|
|
153
119
|
}
|
|
154
120
|
|
|
155
121
|
/**
|
|
156
|
-
* Enumerate the Story branch's changed files, narrowed by the shared
|
|
157
|
-
* scorable-source extension set (`source-extensions.js`) so the projection
|
|
158
|
-
* selects exactly the files the CRAP scanner walks.
|
|
159
|
-
*
|
|
160
122
|
* @param {{ cwd: string, baseBranch: string, storyBranch: string, git: { gitSpawn: typeof defaultGitSpawn } }} opts
|
|
161
123
|
* @returns {{ ok: true, files: string[] } | { ok: false, detail: string }}
|
|
162
124
|
*/
|
|
@@ -177,13 +139,9 @@ function diffScorableFiles({ cwd, baseBranch, storyBranch, git }) {
|
|
|
177
139
|
}
|
|
178
140
|
|
|
179
141
|
/**
|
|
180
|
-
*
|
|
181
|
-
*
|
|
182
|
-
*
|
|
183
|
-
* configured `newMethodCeiling`.
|
|
184
|
-
*
|
|
185
|
-
* Baseline rows are narrowed to the changed-file set before the compare so
|
|
186
|
-
* every untouched file's rows are not spuriously reported as removed.
|
|
142
|
+
* Breaches are vs the baseline row, or `newMethodCeiling` for new methods.
|
|
143
|
+
* Baseline rows are narrowed to changed files so untouched rows do not read
|
|
144
|
+
* as removed.
|
|
187
145
|
*
|
|
188
146
|
* @param {{
|
|
189
147
|
* cwd: string,
|
|
@@ -266,9 +224,6 @@ export async function projectCrapBreaches({
|
|
|
266
224
|
}
|
|
267
225
|
|
|
268
226
|
/**
|
|
269
|
-
* Render one breach as an advisory bullet. New-method breaches name the
|
|
270
|
-
* ceiling they cleared; regressions name the baseline row they exceeded.
|
|
271
|
-
*
|
|
272
227
|
* @param {object} b
|
|
273
228
|
* @returns {string}
|
|
274
229
|
*/
|
|
@@ -283,10 +238,7 @@ function formatBreach(b) {
|
|
|
283
238
|
}
|
|
284
239
|
|
|
285
240
|
/**
|
|
286
|
-
*
|
|
287
|
-
* block, naming every breaching method and the exact refresh remedy.
|
|
288
|
-
* Returns `null` when there is nothing to surface so callers can `if` past
|
|
289
|
-
* the log call without a string-empty check.
|
|
241
|
+
* `null` when there is nothing to surface.
|
|
290
242
|
*
|
|
291
243
|
* @param {Awaited<ReturnType<typeof projectCrapBreaches>>} result
|
|
292
244
|
* @returns {string | null}
|
|
@@ -1,21 +1,7 @@
|
|
|
1
1
|
// .agents/scripts/lib/close-validation/projections/head-sha.js
|
|
2
|
-
/**
|
|
3
|
-
* head-sha.js — resolves the current working tree's HEAD commit SHA.
|
|
4
|
-
*
|
|
5
|
-
* Extracted from close-validation.js (Story #1850) to keep the parent
|
|
6
|
-
* module below the 700-LOC target and to land the helper below CRAP 12
|
|
7
|
-
* in `baselines/crap.json`. The implementation is unchanged — it shells
|
|
8
|
-
* out via the injected git interface, returns `null` on any failure,
|
|
9
|
-
* and never throws.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
2
|
import { gitSpawn as defaultGitSpawn } from '../../git-utils.js';
|
|
13
3
|
|
|
14
4
|
/**
|
|
15
|
-
* Normalise a `git rev-parse HEAD` stdout buffer to the trimmed SHA string,
|
|
16
|
-
* or `null` when the output is empty. Split out of `defaultGetHeadSha` so
|
|
17
|
-
* the success-path is a single straight-line statement.
|
|
18
|
-
*
|
|
19
5
|
* @param {string|undefined|null} stdout
|
|
20
6
|
* @returns {string|null}
|
|
21
7
|
*/
|
|
@@ -25,9 +11,7 @@ function parseHeadSha(stdout) {
|
|
|
25
11
|
}
|
|
26
12
|
|
|
27
13
|
/**
|
|
28
|
-
*
|
|
29
|
-
* when git is unavailable or the call fails — callers treat that as
|
|
30
|
-
* "evidence skip disabled" so the gate runs as before.
|
|
14
|
+
* Never throws; `null` disables the evidence skip so the gate runs.
|
|
31
15
|
*
|
|
32
16
|
* @param {string} cwd
|
|
33
17
|
* @param {typeof defaultGitSpawn} [gitSpawn]
|
|
@@ -1,17 +1,5 @@
|
|
|
1
1
|
// .agents/scripts/lib/close-validation/projections/inputs.js
|
|
2
|
-
/**
|
|
3
|
-
* inputs.js — shared input validator for close-validation projection helpers.
|
|
4
|
-
*
|
|
5
|
-
* Used by `projections/maintainability.js` (and any future projection that
|
|
6
|
-
* shares the same `{ cwd, baseBranch, storyBranch, baselinePath }` argument
|
|
7
|
-
* shape) to collapse the inline guard cascade into a single predicate that
|
|
8
|
-
* returns a typed `reason` on failure.
|
|
9
|
-
*
|
|
10
|
-
* Pure function — no I/O, no side effects. Callers inject `loadBaseline`
|
|
11
|
-
* when they need the predicate to also confirm the baseline file is non-
|
|
12
|
-
* empty; omitting `loadBaseline` skips the baseline check (the predicate
|
|
13
|
-
* still verifies the `baselinePath` argument is present).
|
|
14
|
-
*/
|
|
2
|
+
/** Shared argument validator for the close-validation projections. */
|
|
15
3
|
|
|
16
4
|
/**
|
|
17
5
|
* @typedef {Object} ProjectionInputs
|
|
@@ -24,9 +12,7 @@
|
|
|
24
12
|
/**
|
|
25
13
|
* @typedef {Object} ValidationOk
|
|
26
14
|
* @property {true} ok
|
|
27
|
-
* @property {Record<string, number>} [baseline] -
|
|
28
|
-
* supplied, the parsed baseline map is forwarded so callers don't have to
|
|
29
|
-
* re-read the file.
|
|
15
|
+
* @property {Record<string, number>} [baseline] - present when `loadBaseline` was supplied.
|
|
30
16
|
*/
|
|
31
17
|
|
|
32
18
|
/**
|
|
@@ -36,18 +22,7 @@
|
|
|
36
22
|
*/
|
|
37
23
|
|
|
38
24
|
/**
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
* Reason branches (in order):
|
|
42
|
-
* - `missing-cwd` — cwd is falsy
|
|
43
|
-
* - `missing-base-branch` — baseBranch is falsy
|
|
44
|
-
* - `missing-story-branch` — storyBranch is falsy
|
|
45
|
-
* - `missing-baseline-path` — baselinePath is falsy
|
|
46
|
-
* - `no-baseline` — loadBaseline returned null/undefined/empty
|
|
47
|
-
*
|
|
48
|
-
* The fine-grained `missing-*` variants are normalised to the historical
|
|
49
|
-
* `missing-args` reason by `maintainability.js` so the existing public
|
|
50
|
-
* contract of `projectMaintainabilityRegressions` is preserved byte-for-byte.
|
|
25
|
+
* Pure. Without `loadBaseline` the baseline file itself is not checked.
|
|
51
26
|
*
|
|
52
27
|
* @param {ProjectionInputs} inputs
|
|
53
28
|
* @param {{ loadBaseline?: (path: string) => Record<string, number>|null|undefined }} [opts]
|
|
@@ -72,12 +47,7 @@ export function validateProjectionInputs(inputs, opts = {}) {
|
|
|
72
47
|
return { ok: true };
|
|
73
48
|
}
|
|
74
49
|
|
|
75
|
-
/**
|
|
76
|
-
* The set of reason values returned by `validateProjectionInputs` that
|
|
77
|
-
* represent "one of the required arguments was missing". Used by
|
|
78
|
-
* projection helpers to normalise to the historical `missing-args`
|
|
79
|
-
* skipped-reason without enumerating each variant at the call site.
|
|
80
|
-
*/
|
|
50
|
+
/** Reasons the projections collapse to `missing-args`. */
|
|
81
51
|
export const MISSING_ARG_REASONS = new Set([
|
|
82
52
|
'missing-cwd',
|
|
83
53
|
'missing-base-branch',
|