mandrel 2.59.0 → 2.61.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +21 -19
- package/.agents/agents/acceptance-critic.md +24 -43
- package/.agents/agents/story-worker.md +20 -21
- package/.agents/docs/agentrc-reference.json +5 -84
- package/.agents/docs/configuration.md +48 -132
- package/.agents/docs/workflows.md +2 -2
- package/.agents/instructions.md +5 -8
- package/.agents/rules/ci-remediation.md +41 -8
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +16 -496
- package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +23 -13
- package/.agents/scripts/acceptance-eval.js +35 -169
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +10 -41
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +105 -311
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +34 -98
- package/.agents/scripts/deliver-light.js +25 -171
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +534 -0
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +57 -49
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +7 -19
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +39 -121
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -34
- package/.agents/scripts/lib/config/explain.js +10 -83
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +11 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +18 -35
- package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
- package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -124
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +94 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +123 -191
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +22 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +28 -156
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +121 -157
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +118 -462
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +37 -307
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +55 -318
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +16 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +71 -289
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -91
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +245 -326
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +20 -82
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +96 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +180 -273
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -200
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -135
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +63 -344
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +51 -66
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +123 -344
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +67 -209
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -105
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +97 -92
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +71 -137
- package/.agents/scripts/plan-run-epilogue.js +20 -43
- package/.agents/scripts/pr-watch-with-update.js +79 -263
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -259
- package/.agents/scripts/stories-wave-tick.js +179 -415
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/skills/core/gates-and-baselines/reference.md +0 -1
- package/.agents/skills/skills.index.json +2 -2
- package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/acceptance-self-eval.md +84 -157
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/code-review.md +4 -2
- package/.agents/workflows/helpers/deliver-digest.md +37 -28
- package/.agents/workflows/helpers/deliver-light.md +92 -101
- package/.agents/workflows/helpers/deliver-reference.md +162 -220
- package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
- package/.agents/workflows/helpers/deliver-story.md +17 -18
- package/.agents/workflows/helpers/plan-reference.md +125 -167
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/mandrel-deliver.md +47 -31
- package/.agents/workflows/mandrel-plan.md +22 -21
- package/.agents/workflows/mandrel-update.md +36 -21
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +60 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +326 -523
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +17 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +21 -0
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +17 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1179
- package/.agents/rules/known-tooling-behavior.md +0 -150
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/schemas/model-attribution.schema.json +0 -53
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -366
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -332
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/orchestration/model-attribution.js +0 -418
- package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -118
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,116 +1,18 @@
|
|
|
1
1
|
// .agents/scripts/lib/orchestration/pr-watch.js
|
|
2
2
|
/**
|
|
3
|
-
* pr-watch.js — the required-check poll loop for an open PR.
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* **Not a listener, and no longer shelved among them.** This shipped as the
|
|
7
|
-
* `Watcher` lifecycle listener subscribing to `pr.created`. Story #5006
|
|
8
|
-
* deleted the class but left the plain primitive at
|
|
9
|
-
* `lifecycle/listeners/watcher.js` so its CLI consumer's import stayed
|
|
10
|
-
* stable. Story #5024 then retired the bus itself, which took the listener
|
|
11
|
-
* concept — and the `listeners/` directory — with it, so the primitive moved
|
|
12
|
-
* here beside [`merge-poll.js`](./merge-poll.js), the home Story #4545 chose
|
|
13
|
-
* for `MergeWatcher`'s surviving parts. The only production consumer,
|
|
14
|
-
* `pr-watch-with-update.js`, has always driven {@link watchPrToTerminal}
|
|
15
|
-
* directly, with no bus.
|
|
16
|
-
*
|
|
17
|
-
* Critical contract:
|
|
18
|
-
* - Required-check **names** are resolved from `gh pr checks` at
|
|
19
|
-
* runtime, NOT from `.agentrc.json.branchProtection.requiredChecks`.
|
|
20
|
-
* The static config remains for local-validation hints only; the
|
|
21
|
-
* branch-protection ruleset on GitHub is the source of truth at
|
|
22
|
-
* watch time. This guards against config drift (a config file that
|
|
23
|
-
* hasn't been updated after a protection rule changed on GitHub
|
|
24
|
-
* would otherwise cause the watch to either skip a required check
|
|
25
|
-
* or wait for a removed one indefinitely).
|
|
26
|
-
*
|
|
27
|
-
* Side-effect firewall: the loop shells out to `gh` through injectable
|
|
28
|
-
* ports and returns a verdict. It does NOT mutate ticket labels, post
|
|
29
|
-
* comments, call `notify`, or write any ledger.
|
|
3
|
+
* pr-watch.js — the required-check poll loop for an open PR. Check names come
|
|
4
|
+
* from `gh pr checks --required` at runtime, never config, so drift cannot
|
|
5
|
+
* skip or wait forever on a check. Returns a verdict; no side effects.
|
|
30
6
|
*/
|
|
31
7
|
|
|
32
8
|
import { spawnSync } from 'node:child_process';
|
|
33
9
|
|
|
34
|
-
import { parsePrNumberFromUrl } from '../github-url.js';
|
|
35
10
|
import { applyBehindUpdate } from './behind-recovery.js';
|
|
11
|
+
import { checkVerdict, classifyRequiredCheck } from './check-state.js';
|
|
36
12
|
|
|
37
13
|
/**
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* fourth `'pending'` sentinel for in-flight checks. Pure — exported for
|
|
41
|
-
* tests so the pin is explicit and reviewable.
|
|
42
|
-
*
|
|
43
|
-
* `gh` returns capitalized SCREAMING_SNAKE values (`SUCCESS`,
|
|
44
|
-
* `FAILURE`, `TIMED_OUT`, etc.). An empty / queued / in_progress state
|
|
45
|
-
* collapses to `'pending'` so the poll loop can distinguish "still
|
|
46
|
-
* running" from terminal outcomes. `'pending'` is intentionally NOT a
|
|
47
|
-
* terminal outcome — `reduceOutcomes` is called only on the live state,
|
|
48
|
-
* and the final outcome map gates on `allTerminal()` so no `'pending'`
|
|
49
|
-
* ever leaks into a finished watch. Unknown / non-pending unrecognized
|
|
50
|
-
* values collapse to `'skipped'` so any future GitHub state we haven't
|
|
51
|
-
* enumerated still maps into the vocabulary.
|
|
52
|
-
*/
|
|
53
|
-
export function normalizeCheckState(raw) {
|
|
54
|
-
const v = String(raw ?? '')
|
|
55
|
-
.trim()
|
|
56
|
-
.toLowerCase();
|
|
57
|
-
switch (v) {
|
|
58
|
-
case '':
|
|
59
|
-
case 'pending':
|
|
60
|
-
case 'queued':
|
|
61
|
-
case 'in_progress':
|
|
62
|
-
case 'requested':
|
|
63
|
-
case 'waiting':
|
|
64
|
-
return 'pending';
|
|
65
|
-
case 'success':
|
|
66
|
-
case 'completed':
|
|
67
|
-
return 'success';
|
|
68
|
-
case 'failure':
|
|
69
|
-
case 'startup_failure':
|
|
70
|
-
return 'failure';
|
|
71
|
-
case 'neutral':
|
|
72
|
-
return 'neutral';
|
|
73
|
-
case 'cancelled':
|
|
74
|
-
return 'cancelled';
|
|
75
|
-
case 'timed_out':
|
|
76
|
-
return 'timed_out';
|
|
77
|
-
case 'action_required':
|
|
78
|
-
return 'action_required';
|
|
79
|
-
case 'stale':
|
|
80
|
-
return 'stale';
|
|
81
|
-
case 'skipped':
|
|
82
|
-
return 'skipped';
|
|
83
|
-
default:
|
|
84
|
-
return 'skipped';
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Parse a PR number out of a PR URL. Callers hand in the URL `gh pr
|
|
90
|
-
* create` returned; `gh pr checks` accepts either the URL or the
|
|
91
|
-
* number — we pass the URL through verbatim, but the helper still
|
|
92
|
-
* exists for tests asserting we never silently coerce a malformed URL.
|
|
93
|
-
*
|
|
94
|
-
* Delegates to `parsePrNumberFromUrl` in `lib/github-url.js`.
|
|
95
|
-
* Re-exported under the original name so existing call sites and tests
|
|
96
|
-
* do not need to change. Story #3649.
|
|
97
|
-
*/
|
|
98
|
-
export const extractPrNumber = parsePrNumberFromUrl;
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* The `gh --repo` flag pair for an optional `owner/repo` target, or an empty
|
|
102
|
-
* argv fragment when the repository is inferred from the cwd's remote.
|
|
103
|
-
*
|
|
104
|
-
* `gh` resolves a *cross-repository* PR reference only through this flag — it
|
|
105
|
-
* has no `<owner/repo>#<number>` argument form, and a caller that builds one
|
|
106
|
-
* gets it parsed as a **branch name** instead (every `--repo` invocation of the
|
|
107
|
-
* watch CLI failed on that, reported as a misleading `gh-checks-failed`). Pure
|
|
108
|
-
* — one place builds the fragment so no port can forget it.
|
|
109
|
-
*
|
|
110
|
-
* Module-private on purpose: the three ports below are the only callers, and
|
|
111
|
-
* the flag is asserted through them (a real-spawn argv probe), never by
|
|
112
|
-
* importing this helper — an export existing solely for a test is dead in the
|
|
113
|
-
* `--production` reachability ratchet.
|
|
14
|
+
* `gh` has no `<owner/repo>#<number>` form (it parses one as a branch), so
|
|
15
|
+
* every port builds `--repo` here.
|
|
114
16
|
*
|
|
115
17
|
* @param {string|null|undefined} repo `owner/repo`, or nullish to infer.
|
|
116
18
|
* @returns {string[]}
|
|
@@ -120,13 +22,7 @@ function ghRepoFlag(repo) {
|
|
|
120
22
|
return trimmed.length > 0 ? ['--repo', trimmed] : [];
|
|
121
23
|
}
|
|
122
24
|
|
|
123
|
-
/**
|
|
124
|
-
* Default `gh pr checks` spawn. Always invokes with `--required` so the
|
|
125
|
-
* returned set is authoritative for branch-protection gating. The
|
|
126
|
-
* `--json name,state,bucket` projection is stable across `gh` >= 2.30.
|
|
127
|
-
*
|
|
128
|
-
* Exported so tests can stub.
|
|
129
|
-
*/
|
|
25
|
+
/** `--required` makes the returned set authoritative for protection gating. */
|
|
130
26
|
function ghPrChecks({ prUrl, cwd, repo, spawnFn = spawnSync }) {
|
|
131
27
|
const result = spawnFn(
|
|
132
28
|
'gh',
|
|
@@ -148,11 +44,6 @@ function ghPrChecks({ prUrl, cwd, repo, spawnFn = spawnSync }) {
|
|
|
148
44
|
};
|
|
149
45
|
}
|
|
150
46
|
|
|
151
|
-
/**
|
|
152
|
-
* Default `gh pr view` spawn — probes `mergeStateStatus` so the watch loop
|
|
153
|
-
* can detect the BEHIND condition (PR head is behind its base branch)
|
|
154
|
-
* AFTER every required check is green. Injectable so tests can stub.
|
|
155
|
-
*/
|
|
156
47
|
function ghPrView({ prUrl, cwd, repo, spawnFn = spawnSync }) {
|
|
157
48
|
const result = spawnFn(
|
|
158
49
|
'gh',
|
|
@@ -166,13 +57,7 @@ function ghPrView({ prUrl, cwd, repo, spawnFn = spawnSync }) {
|
|
|
166
57
|
};
|
|
167
58
|
}
|
|
168
59
|
|
|
169
|
-
/**
|
|
170
|
-
* Parse the `mergeStateStatus` field out of a `gh pr view --json
|
|
171
|
-
* mergeStateStatus` payload. Returns the empty string for malformed
|
|
172
|
-
* input so callers can treat unknown / unparseable states as "not
|
|
173
|
-
* BEHIND" (the conservative recovery branch). Pure — exported for
|
|
174
|
-
* tests.
|
|
175
|
-
*/
|
|
60
|
+
/** Malformed input → `''`, which callers treat as "not BEHIND". */
|
|
176
61
|
function parseMergeStateStatus(stdout) {
|
|
177
62
|
const trimmed = String(stdout ?? '').trim();
|
|
178
63
|
if (trimmed.length === 0) return '';
|
|
@@ -186,11 +71,6 @@ function parseMergeStateStatus(stdout) {
|
|
|
186
71
|
}
|
|
187
72
|
}
|
|
188
73
|
|
|
189
|
-
/**
|
|
190
|
-
* Default `gh pr update-branch` spawn — invoked by the BEHIND recovery
|
|
191
|
-
* loop to fast-forward the PR head with its base branch. Exported so
|
|
192
|
-
* tests can stub and assert call counts.
|
|
193
|
-
*/
|
|
194
74
|
function ghPrUpdateBranch({ prUrl, cwd, repo, spawnFn = spawnSync }) {
|
|
195
75
|
const result = spawnFn(
|
|
196
76
|
'gh',
|
|
@@ -208,41 +88,14 @@ function ghPrUpdateBranch({ prUrl, cwd, repo, spawnFn = spawnSync }) {
|
|
|
208
88
|
};
|
|
209
89
|
}
|
|
210
90
|
|
|
211
|
-
/**
|
|
212
|
-
* Outcomes that count as "this required check did not block the
|
|
213
|
-
* merge". Mirrors `automerge-predicate.NON_FAILING_CHECK_OUTCOMES` so
|
|
214
|
-
* the BEHIND-recovery gate ("are all required checks passing?") uses
|
|
215
|
-
* the same definition as the downstream predicate. Pure — exported
|
|
216
|
-
* for tests.
|
|
217
|
-
*/
|
|
218
|
-
const GREEN_CHECK_OUTCOMES = Object.freeze(
|
|
219
|
-
new Set(['success', 'neutral', 'skipped']),
|
|
220
|
-
);
|
|
221
|
-
|
|
222
|
-
/**
|
|
223
|
-
* All outcomes are non-failing. Used as the gate before issuing a
|
|
224
|
-
* `gh pr update-branch` recovery call — a red check is a hard block
|
|
225
|
-
* regardless of mergeStateStatus, so we never auto-recover into a
|
|
226
|
-
* failing PR.
|
|
227
|
-
*/
|
|
91
|
+
/** Gate for BEHIND recovery: never auto-update into a failing PR. */
|
|
228
92
|
function allGreen(outcomes) {
|
|
229
93
|
const values = Object.values(outcomes);
|
|
230
94
|
if (values.length === 0) return false;
|
|
231
|
-
|
|
232
|
-
if (!GREEN_CHECK_OUTCOMES.has(v)) return false;
|
|
233
|
-
}
|
|
234
|
-
return true;
|
|
95
|
+
return values.every((v) => checkVerdict(v) === 'pass');
|
|
235
96
|
}
|
|
236
97
|
|
|
237
|
-
/**
|
|
238
|
-
* Parse the JSON array produced by `gh pr checks --json name,state,…`.
|
|
239
|
-
* Returns `[]` for any malformed input. Pure — exported for tests.
|
|
240
|
-
*
|
|
241
|
-
* Each entry shape: `{ name, state, bucket, workflow }`. The
|
|
242
|
-
* `bucket` field is `gh`'s terminal classification (`pass`, `fail`,
|
|
243
|
-
* `pending`, `skipping`); we prefer `state` when populated and fall
|
|
244
|
-
* back to `bucket` when not.
|
|
245
|
-
*/
|
|
98
|
+
/** Entries with a string `name`; `[]` for malformed input. */
|
|
246
99
|
export function parseGhPrChecks(stdout) {
|
|
247
100
|
const trimmed = String(stdout ?? '').trim();
|
|
248
101
|
if (trimmed.length === 0) return [];
|
|
@@ -257,30 +110,16 @@ export function parseGhPrChecks(stdout) {
|
|
|
257
110
|
}
|
|
258
111
|
}
|
|
259
112
|
|
|
260
|
-
/**
|
|
261
|
-
* Reduce a list of check entries to the canonical `{ checkName: outcome }`
|
|
262
|
-
* map. Pure — exported for tests.
|
|
263
|
-
*
|
|
264
|
-
* When `gh` returns the same `name` more than once (parallel matrix
|
|
265
|
-
* builds, retries), the LAST entry wins. The poll loop calls this on
|
|
266
|
-
* every tick so the final emit reflects the most recent state.
|
|
267
|
-
*/
|
|
113
|
+
/** `{ checkName: outcome }`; a repeated name (matrix, retry) — last wins. */
|
|
268
114
|
export function reduceOutcomes(entries) {
|
|
269
115
|
const out = {};
|
|
270
116
|
for (const e of entries) {
|
|
271
|
-
|
|
272
|
-
out[e.name] = normalizeCheckState(raw);
|
|
117
|
+
out[e.name] = classifyRequiredCheck(e);
|
|
273
118
|
}
|
|
274
119
|
return out;
|
|
275
120
|
}
|
|
276
121
|
|
|
277
|
-
/**
|
|
278
|
-
* Terminal-state predicate. Pure — exported for tests so the
|
|
279
|
-
* pending-state list is reviewable as code, not as prose.
|
|
280
|
-
*
|
|
281
|
-
* Only `'pending'` is non-terminal — `normalizeCheckState` already
|
|
282
|
-
* collapses every "still running" GitHub state into that sentinel.
|
|
283
|
-
*/
|
|
122
|
+
/** Only `'pending'` is non-terminal (the classifier collapses running states). */
|
|
284
123
|
export function allTerminal(outcomes) {
|
|
285
124
|
for (const v of Object.values(outcomes)) {
|
|
286
125
|
if (v === 'pending') return false;
|
|
@@ -288,23 +127,10 @@ export function allTerminal(outcomes) {
|
|
|
288
127
|
return true;
|
|
289
128
|
}
|
|
290
129
|
|
|
291
|
-
/**
|
|
292
|
-
* Sentinel outcome for a required check that never went terminal within
|
|
293
|
-
* the poll cap AND the resume budget — the CI job is genuinely slow, not
|
|
294
|
-
* red. Story #4358 made this a first-class outcome distinct from
|
|
295
|
-
* `'timed_out'` (a GitHub-reported terminal timeout) and `'failure'` (a
|
|
296
|
-
* red check): a `'still-running'` map means "re-arm the watch / hand off
|
|
297
|
-
* to `/loop`," never "the change is broken."
|
|
298
|
-
*/
|
|
130
|
+
/** Slow CI, not red: "re-arm the watch", never "the change is broken". */
|
|
299
131
|
const STILL_RUNNING = 'still-running';
|
|
300
132
|
|
|
301
|
-
/**
|
|
302
|
-
* Promote any leftover `'pending'` outcomes to the schema-valid
|
|
303
|
-
* `'still-running'` sentinel before emit. Pure — exported for tests so
|
|
304
|
-
* the cap-fire behaviour is reviewable. Called only when the poll loop
|
|
305
|
-
* (and its resume budget) exits with checks still pending and none
|
|
306
|
-
* failed — the slow-but-not-red terminal state.
|
|
307
|
-
*/
|
|
133
|
+
/** Leftover `'pending'` → `'still-running'` (the schema forbids pending). */
|
|
308
134
|
export function promotePendingToStillRunning(outcomes) {
|
|
309
135
|
const out = {};
|
|
310
136
|
for (const [k, v] of Object.entries(outcomes)) {
|
|
@@ -313,44 +139,24 @@ export function promotePendingToStillRunning(outcomes) {
|
|
|
313
139
|
return out;
|
|
314
140
|
}
|
|
315
141
|
|
|
316
|
-
/**
|
|
317
|
-
* True when at least one required check has genuinely failed — the hard
|
|
318
|
-
* stop that consumes NO resume budget and exits 1 immediately. A
|
|
319
|
-
* `'pending'` check is not a failure (it is still running); anything
|
|
320
|
-
* outside the non-failing set AND outside `'pending'` is a red block.
|
|
321
|
-
* Pure — exported for tests.
|
|
322
|
-
*/
|
|
142
|
+
/** A genuinely red check: the hard stop that consumes no resume budget. */
|
|
323
143
|
export function hasFailingCheck(outcomes) {
|
|
324
|
-
|
|
325
|
-
if (v === 'pending') continue;
|
|
326
|
-
if (!GREEN_CHECK_OUTCOMES.has(v)) return true;
|
|
327
|
-
}
|
|
328
|
-
return false;
|
|
144
|
+
return Object.values(outcomes).some((v) => checkVerdict(v) === 'fail');
|
|
329
145
|
}
|
|
330
146
|
|
|
331
|
-
/**
|
|
332
|
-
* Default sleeper. Hoisted so tests can stub without faking timers.
|
|
333
|
-
*/
|
|
334
147
|
function defaultSleep(ms) {
|
|
335
148
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
336
149
|
}
|
|
337
150
|
|
|
338
151
|
/**
|
|
339
|
-
*
|
|
340
|
-
* every required check reaches a terminal state or the iteration cap
|
|
341
|
-
* (`maxPolls`) fires. Transient `gh` failures (exit status != 0/8 with
|
|
342
|
-
* an empty stdout) are logged and skipped — the outer cap eventually
|
|
343
|
-
* short-circuits if `gh` is unrecoverably broken.
|
|
344
|
-
*
|
|
345
|
-
* Exported so {@link watchPrToTerminal}'s BEHIND-recovery outer loop can
|
|
346
|
-
* call it once per CI cycle without duplicating the inner logic.
|
|
152
|
+
* A transient `gh` failure is skipped; `maxPolls` bounds a broken `gh`.
|
|
347
153
|
*
|
|
348
154
|
* @param {object} opts
|
|
349
155
|
* @param {string} opts.prUrl
|
|
350
156
|
* @param {string} opts.cwd
|
|
351
157
|
* @param {string|null} [opts.repo] `owner/repo` passed to `gh` as `--repo`.
|
|
352
158
|
* @param {object} opts.outcomes Initial `{ checkName: outcome }` map.
|
|
353
|
-
* @param {number} opts.polls Current poll counter
|
|
159
|
+
* @param {number} opts.polls Current poll counter.
|
|
354
160
|
* @param {number} opts.maxPolls Hard cap on total poll iterations.
|
|
355
161
|
* @param {Function} opts.ghPrChecksFn
|
|
356
162
|
* @param {number} opts.pollIntervalMs
|
|
@@ -378,9 +184,6 @@ export async function pollUntilTerminal({
|
|
|
378
184
|
const probe = ghPrChecksFn({ prUrl, cwd, repo });
|
|
379
185
|
const entries = parseGhPrChecks(probe.stdout);
|
|
380
186
|
if (entries.length === 0 && probe.status !== 0 && probe.status !== 8) {
|
|
381
|
-
// Transient `gh` failure — log and continue. The outer
|
|
382
|
-
// iteration cap eventually short-circuits if `gh` is
|
|
383
|
-
// unrecoverably broken.
|
|
384
187
|
logger.warn?.(
|
|
385
188
|
`[Watcher] gh pr checks transient failure (status=${probe.status}): ${probe.stderr}`,
|
|
386
189
|
);
|
|
@@ -392,47 +195,27 @@ export async function pollUntilTerminal({
|
|
|
392
195
|
}
|
|
393
196
|
|
|
394
197
|
/**
|
|
395
|
-
*
|
|
396
|
-
*
|
|
397
|
-
* AND the PR is `mergeStateStatus: BEHIND` — issue a bounded number of
|
|
398
|
-
* `gh pr update-branch` fast-forwards, re-polling the freshly-rebased
|
|
399
|
-
* commit after each. Plain async function with NO bus coupling: it
|
|
400
|
-
* shells out to `gh` (via injectable spawns) and returns the verdict.
|
|
401
|
-
*
|
|
402
|
-
* The load-bearing primitive the `pr-watch-with-update.js` CLI drives.
|
|
403
|
-
* Story #3902 introduced it so the (since-retired) `Watcher` listener and
|
|
404
|
-
* the CLI could not drift apart on polling or BEHIND-recovery; the CLI is
|
|
405
|
-
* now its only caller.
|
|
198
|
+
* Watch required checks to terminal; when green and BEHIND, update the
|
|
199
|
+
* branch (≤ `maxUpdates`) and re-poll the new head.
|
|
406
200
|
*
|
|
407
201
|
* @param {object} opts
|
|
408
202
|
* @param {string} opts.prUrl PR URL or number (passed to `gh` verbatim).
|
|
409
203
|
* @param {string} opts.cwd
|
|
410
|
-
* @param {string|null} [opts.repo] `owner/repo
|
|
411
|
-
*
|
|
412
|
-
* repository from the cwd's remote — the behaviour every in-repo caller wants.
|
|
204
|
+
* @param {string|null} [opts.repo] `owner/repo`, threaded to every port
|
|
205
|
+
* as `--repo`; nullish infers from the cwd's remote.
|
|
413
206
|
* @param {number} opts.maxPolls Hard cap on total poll iterations per arm.
|
|
414
207
|
* @param {number} opts.maxUpdates Cap on `gh pr update-branch` recovery calls.
|
|
415
|
-
* @param {number} [opts.maxResumes]
|
|
416
|
-
*
|
|
417
|
-
* loop up to this many times before giving up with a `still-running` verdict.
|
|
418
|
-
* A genuinely red check short-circuits immediately and consumes no resume
|
|
419
|
-
* budget. Defaults to 0 (no resume) so existing callers are unchanged.
|
|
208
|
+
* @param {number} [opts.maxResumes] Re-arms after the poll cap fires with
|
|
209
|
+
* checks pending and none failed, before a `still-running` verdict.
|
|
420
210
|
* @param {number} opts.pollIntervalMs Delay between poll ticks.
|
|
421
|
-
* @param {Function} [opts.ghPrChecksFn]
|
|
422
|
-
*
|
|
423
|
-
*
|
|
424
|
-
* @param {Function} [opts.
|
|
425
|
-
* to the real spawn; tests override.
|
|
426
|
-
* @param {Function} [opts.ghPrUpdateBranchFn] `gh pr update-branch`
|
|
427
|
-
* invoker. Defaults to the real spawn; tests override.
|
|
428
|
-
* @param {Function} [opts.sleepFn] Poll-tick delay. Defaults to a
|
|
429
|
-
* real `setTimeout`-backed sleep; tests override with a no-op.
|
|
211
|
+
* @param {Function} [opts.ghPrChecksFn]
|
|
212
|
+
* @param {Function} [opts.ghPrViewFn]
|
|
213
|
+
* @param {Function} [opts.ghPrUpdateBranchFn]
|
|
214
|
+
* @param {Function} [opts.sleepFn]
|
|
430
215
|
* @param {{ info?: Function, warn?: Function, debug?: Function }} opts.logger
|
|
431
216
|
* @param {{status:number,stdout:string,stderr:string}} [opts.firstProbe]
|
|
432
|
-
*
|
|
433
|
-
*
|
|
434
|
-
* here so the loop does not double-spend the first `gh pr checks` call.
|
|
435
|
-
* Omit it (the CLI path) and the loop issues the first probe itself.
|
|
217
|
+
* An already-issued `gh pr checks` result, so the first call is not
|
|
218
|
+
* double-spent.
|
|
436
219
|
* @returns {Promise<{
|
|
437
220
|
* outcomes: object,
|
|
438
221
|
* requiredChecks: string[],
|
|
@@ -445,11 +228,8 @@ export async function pollUntilTerminal({
|
|
|
445
228
|
* requiredChecksEmpty?: boolean,
|
|
446
229
|
* error?: string,
|
|
447
230
|
* }>}
|
|
448
|
-
* `outcomes`
|
|
449
|
-
*
|
|
450
|
-
* exhausted with no failed check). `stillRunning` is true in exactly
|
|
451
|
-
* that case (slow CI, not red). `requiredChecksEmpty` / `error` are set
|
|
452
|
-
* only when the first probe resolved NO required-check names.
|
|
231
|
+
* `outcomes` never contains `'pending'`. `requiredChecksEmpty` / `error`
|
|
232
|
+
* are set only when the first probe resolved no required-check names.
|
|
453
233
|
*/
|
|
454
234
|
export async function watchPrToTerminal({
|
|
455
235
|
prUrl,
|
|
@@ -466,22 +246,13 @@ export async function watchPrToTerminal({
|
|
|
466
246
|
logger,
|
|
467
247
|
firstProbe,
|
|
468
248
|
}) {
|
|
469
|
-
// First probe: resolve the required-check name set at runtime. Reuse a
|
|
470
|
-
// caller-supplied probe (issued to resolve the required-check names) so
|
|
471
|
-
// we never double-spend the first `gh` call.
|
|
472
249
|
const first = firstProbe ?? ghPrChecksFn({ prUrl, cwd, repo });
|
|
473
|
-
// `gh` exits 8
|
|
474
|
-
// does not indicate failure. Any other non-zero status with no
|
|
475
|
-
// parseable JSON body is a genuine failure.
|
|
250
|
+
// `gh` exits 8 while checks are pending — expected, not a failure.
|
|
476
251
|
const firstEntries = parseGhPrChecks(first.stdout);
|
|
477
252
|
if (firstEntries.length === 0) {
|
|
478
|
-
//
|
|
479
|
-
//
|
|
480
|
-
//
|
|
481
|
-
// verdict with no failing check in it (Story #4890). The name set is
|
|
482
|
-
// resolved exactly once per call, so converging on a context that
|
|
483
|
-
// attaches later means calling this function again; return the
|
|
484
|
-
// empty-set signal and let the caller's attach window re-resolve it.
|
|
253
|
+
// Never poll an empty name set: `allTerminal({})` is vacuously true and
|
|
254
|
+
// would report a red verdict with no failing check. Names resolve once
|
|
255
|
+
// per call, so the caller's attach window re-resolves by calling again.
|
|
485
256
|
const ghFaulted = first.status !== 0 && first.status !== 8;
|
|
486
257
|
if (ghFaulted) {
|
|
487
258
|
logger.warn?.(
|
|
@@ -498,30 +269,19 @@ export async function watchPrToTerminal({
|
|
|
498
269
|
green: false,
|
|
499
270
|
stillRunning: false,
|
|
500
271
|
requiredChecksEmpty: true,
|
|
501
|
-
// `gh` overloads
|
|
502
|
-
//
|
|
503
|
-
// contract — so the status is reported and the *classification* is the
|
|
504
|
-
// caller's, made against a structural probe of the PR itself.
|
|
272
|
+
// `gh` overloads non-zero for "none attached yet" and a real fault, and
|
|
273
|
+
// stderr is not a contract, so classification is left to the caller.
|
|
505
274
|
error: `gh-checks-${ghFaulted ? 'failed' : 'empty'}:status=${first.status}`,
|
|
506
275
|
};
|
|
507
276
|
}
|
|
508
277
|
|
|
509
278
|
const requiredChecks = firstEntries.map((e) => e.name);
|
|
510
279
|
|
|
511
|
-
// Poll loop. The first probe already produced entries; reduce them
|
|
512
|
-
// for the initial outcome map, then iterate until every required
|
|
513
|
-
// check is terminal or the iteration cap fires. After the checks
|
|
514
|
-
// converge, the BEHIND-recovery loop may re-enter the poll loop AFTER
|
|
515
|
-
// issuing `gh pr update-branch`.
|
|
516
280
|
let outcomes = reduceOutcomes(firstEntries);
|
|
517
281
|
let polls = 0;
|
|
518
282
|
let updatesApplied = 0;
|
|
519
283
|
let resumesApplied = 0;
|
|
520
|
-
//
|
|
521
|
-
// poll-to-cap + BEHIND-recovery arm. When the arm ends with checks
|
|
522
|
-
// still pending but NONE failed, we re-arm (reset the poll counter)
|
|
523
|
-
// up to `maxResumes` times before declaring `still-running`. A red
|
|
524
|
-
// check breaks out immediately without consuming resume budget.
|
|
284
|
+
// Each outer iteration is one poll-to-cap + BEHIND-recovery arm.
|
|
525
285
|
for (;;) {
|
|
526
286
|
while (polls < maxPolls) {
|
|
527
287
|
({ outcomes, polls } = await pollUntilTerminal({
|
|
@@ -536,17 +296,10 @@ export async function watchPrToTerminal({
|
|
|
536
296
|
sleepFn,
|
|
537
297
|
logger,
|
|
538
298
|
}));
|
|
539
|
-
//
|
|
540
|
-
//
|
|
541
|
-
// AND the PR is BEHIND its base, issue ONE `gh pr update-branch`
|
|
542
|
-
// call and re-poll the checks against the freshly-rebased commit. A
|
|
543
|
-
// red check is a hard block — stop here regardless of merge state.
|
|
544
|
-
// Bounded by `maxUpdates` so a racing base branch can't ping-pong
|
|
545
|
-
// indefinitely.
|
|
299
|
+
// BEHIND recovery only when all green; `maxUpdates` stops a racing
|
|
300
|
+
// base from ping-ponging forever.
|
|
546
301
|
if (!allTerminal(outcomes) || !allGreen(outcomes)) break;
|
|
547
|
-
//
|
|
548
|
-
// costs no extra round-trip; the shared helper re-checks it as a
|
|
549
|
-
// fail-safe, and its callback therefore never fires on this path.
|
|
302
|
+
// Checked before the `gh pr view` spawn to save the round-trip.
|
|
550
303
|
if (updatesApplied >= maxUpdates) break;
|
|
551
304
|
const view = ghPrViewFn({ prUrl, cwd, repo });
|
|
552
305
|
if (view.status !== 0) {
|
|
@@ -571,26 +324,19 @@ export async function watchPrToTerminal({
|
|
|
571
324
|
onUpdateFailed: (detail) =>
|
|
572
325
|
logger.warn?.(`[Watcher] gh pr update-branch failed (${detail})`),
|
|
573
326
|
});
|
|
574
|
-
//
|
|
575
|
-
// there is nothing to recover, and a failed update must not silently
|
|
576
|
-
// re-poll as though the head moved.
|
|
327
|
+
// A failed update must not re-poll as though the head moved.
|
|
577
328
|
if (!recovery.updated) break;
|
|
578
329
|
updatesApplied += 1;
|
|
579
330
|
logger.info?.(
|
|
580
331
|
`[Watcher] PR BEHIND base — issued gh pr update-branch (#${updatesApplied}/${maxUpdates}); re-polling required checks.`,
|
|
581
332
|
);
|
|
582
333
|
await sleepFn(pollIntervalMs);
|
|
583
|
-
//
|
|
584
|
-
// previous terminal outcomes. Reset to force the inner poll loop to
|
|
585
|
-
// re-evaluate the new CI cycle.
|
|
334
|
+
// The new head invalidates the previous terminal outcomes.
|
|
586
335
|
outcomes = {};
|
|
587
336
|
for (const name of requiredChecks) outcomes[name] = 'pending';
|
|
588
337
|
}
|
|
589
338
|
|
|
590
|
-
//
|
|
591
|
-
// hard stop that consumes NO resume budget — the change is broken,
|
|
592
|
-
// resuming would only burn wall-clock. Only re-arm when the arm timed
|
|
593
|
-
// out with pending-but-not-failed checks and resume budget remains.
|
|
339
|
+
// Re-arm only when pending-but-not-failed with resume budget left.
|
|
594
340
|
if (allTerminal(outcomes) || hasFailingCheck(outcomes)) break;
|
|
595
341
|
if (resumesApplied >= maxResumes) break;
|
|
596
342
|
resumesApplied += 1;
|
|
@@ -602,11 +348,7 @@ export async function watchPrToTerminal({
|
|
|
602
348
|
|
|
603
349
|
const terminal = allTerminal(outcomes);
|
|
604
350
|
const failing = hasFailingCheck(outcomes);
|
|
605
|
-
//
|
|
606
|
-
// one or more checks still pending and NONE failed. The schema enum
|
|
607
|
-
// forbids `'pending'`; promote leftover pending entries to the
|
|
608
|
-
// `'still-running'` sentinel (never `'timed_out'` — that would read as
|
|
609
|
-
// a genuine terminal failure to the auto-merge predicate).
|
|
351
|
+
// Never `'timed_out'` — the auto-merge predicate would read it as failure.
|
|
610
352
|
const stillRunning = !terminal && !failing;
|
|
611
353
|
const finalOutcomes = terminal
|
|
612
354
|
? outcomes
|