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,84 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* pr-watch-with-update.js — the single CI-watch
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* pr-watch-with-update.js — the single CI-watch CLI for Story delivery.
|
|
4
|
+
* Polls the PR's required checks to a terminal state via `watchPrToTerminal`,
|
|
5
|
+
* recovering from `BEHIND` with bounded `gh pr update-branch` calls.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* it); this CLI is now its only caller. Story #5024 retired the bus
|
|
13
|
-
* outright, so there is no bus to create — this is a direct, synchronous
|
|
14
|
-
* watch with a real exit code.
|
|
15
|
-
*
|
|
16
|
-
* Slow-vs-failed semantics (Story #4358):
|
|
17
|
-
* - GREEN — every required check terminal + green → exit 0, unless the
|
|
18
|
-
* no-rerun guard says otherwise (below).
|
|
19
|
-
* - RED — one or more required checks genuinely failed → exit 1
|
|
20
|
-
* IMMEDIATELY, consuming no resume budget. On red the CLI
|
|
21
|
-
* disarms native auto-merge and writes
|
|
22
|
-
* `temp/story-<id>-ci-digest.{json,md}` (failing check name,
|
|
23
|
-
* head SHA, run id + run link, a `gh run view --log-failed`
|
|
24
|
-
* tail, and a coarse classification). The digest is scoped by
|
|
25
|
-
* filename, so it requires `--story` (Story #4539: the digest
|
|
26
|
-
* was Epic-scoped and therefore never written on the only
|
|
27
|
-
* delivery path v2 has).
|
|
28
|
-
* - STILL-RUNNING — the poll cap fired with checks still pending and
|
|
29
|
-
* none failed; the watcher re-armed up to
|
|
30
|
-
* `delivery.ci.watch.maxResumes` times, then returned a
|
|
31
|
-
* `still-running` verdict → exit 2 (NEVER 1, NEVER
|
|
32
|
-
* `timed_out`). The CLI prints the `gh pr checks --watch`
|
|
33
|
-
* handoff so the host can keep polling on its own cadence.
|
|
34
|
-
* - UNRESOLVED — every observed required check is green but the observed
|
|
35
|
-
* set does not reconcile with the repository's own verdict
|
|
36
|
-
* (Story #4873) → exit 2, same "keep watching" semantics as
|
|
37
|
-
* still-running. Withholding is the point: this watcher has
|
|
38
|
-
* reported green on a PR GitHub was reporting as BLOCKED.
|
|
39
|
-
* - NOT-YET-STARTED — the attach window was spent and NO required context
|
|
40
|
-
* ever attached, while the pull request itself kept reading back
|
|
41
|
-
* fine (Story #4890) → exit 2, the same "keep watching"
|
|
42
|
-
* semantics. This used to map onto the red exit code, which
|
|
43
|
-
* misroutes the caller twice over: the module reserves exit 1 for
|
|
44
|
-
* a required check that GENUINELY FAILED, and the red path writes
|
|
45
|
-
* a CI digest naming the failing check — so a caller routed onto
|
|
46
|
-
* it by a set that was merely empty found nothing to read. A
|
|
47
|
-
* still-empty required set is a slow condition, and the module
|
|
48
|
-
* already models slow as exit 2. A `gh` fault the PR probe cannot
|
|
49
|
-
* see past is still exit 1.
|
|
50
|
-
*
|
|
51
|
-
* Two GitHub oracles are deliberately not trusted on a single reading
|
|
52
|
-
* (Story #4873). An EMPTY `gh pr checks --required` probe is re-resolved
|
|
53
|
-
* within {@link REQUIRED_CONTEXT_ATTACH_WINDOW_MS} before it is believed —
|
|
54
|
-
* a ruleset attaches its required contexts asynchronously, and a required
|
|
55
|
-
* context that is an aggregator job gated on every other tier is by
|
|
56
|
-
* construction the LAST to appear (#4890 measured 16m52s), so a watch launched
|
|
57
|
-
* right after `gh pr create` used to fail a delivery whose CI had not been
|
|
58
|
-
* asked to start yet. And a GREEN verdict is issued only after
|
|
59
|
-
* {@link reconcileGreenVerdict} confirms the repository agrees; an
|
|
60
|
-
* unreconcilable set reports unresolved instead of green.
|
|
61
|
-
*
|
|
62
|
-
* No-rerun enforcement (Story #4865). `rules/ci-remediation.md` § Verifier
|
|
63
|
-
* forbids re-running a failed job to reach green; this CLI is the point
|
|
64
|
-
* that enforces it. Enforcement acts on the **first red** — GitHub's native
|
|
65
|
-
* auto-merge fires server-side and races any post-green detection, so a
|
|
66
|
-
* green can already have merged by the time it is observed. On red the
|
|
67
|
-
* watcher disarms auto-merge and records the head SHA; on green it reads
|
|
68
|
-
* the digest and adjudicates: a green on the SAME head SHA is a forbidden
|
|
69
|
-
* re-run (exit 1, `agent::blocked`, a `file-ci-gap.js` intake filing
|
|
70
|
-
* required), while
|
|
71
|
-
* a green on a NEW head SHA is a fix at source — the digest is retired,
|
|
72
|
-
* auto-merge is re-armed, and the delivery proceeds. A delivery that never
|
|
73
|
-
* went red has no digest and is untouched. Mechanism:
|
|
74
|
-
* `lib/orchestration/ci-rerun-guard.js`.
|
|
75
|
-
*
|
|
76
|
-
* Config (Story #4356 namespace, read via `getCiDelivery`):
|
|
77
|
-
* - `delivery.ci.watch.pollIntervalMs`
|
|
78
|
-
* - `delivery.ci.watch.maxPolls`
|
|
79
|
-
* - `delivery.ci.watch.maxResumes`
|
|
80
|
-
* - `delivery.ci.watch.attachWindowMs` (Story #4890)
|
|
81
|
-
* CLI flags override config; config overrides the framework fallback.
|
|
7
|
+
* No-rerun enforcement (`rules/ci-remediation.md` § Verifier) acts on the
|
|
8
|
+
* FIRST red, because native auto-merge fires server-side and races any
|
|
9
|
+
* post-green detection: red disarms auto-merge and records the head SHA in a
|
|
10
|
+
* digest; a later green on the SAME SHA is a forbidden re-run, on a NEW SHA a
|
|
11
|
+
* fix at source (digest retired, auto-merge re-armed).
|
|
82
12
|
*
|
|
83
13
|
* Usage:
|
|
84
14
|
* node .agents/scripts/pr-watch-with-update.js --pr <n> --story <id>
|
|
@@ -87,7 +17,6 @@
|
|
|
87
17
|
*/
|
|
88
18
|
import { parseArgs } from 'node:util';
|
|
89
19
|
import { runAsCli } from './lib/cli-utils.js';
|
|
90
|
-
import { getCiDelivery } from './lib/config/ci.js';
|
|
91
20
|
import { resolveConfig } from './lib/config-resolver.js';
|
|
92
21
|
import { gh as defaultGh } from './lib/gh-exec.js';
|
|
93
22
|
import { Logger } from './lib/Logger.js';
|
|
@@ -95,7 +24,6 @@ import {
|
|
|
95
24
|
blockStoryDelivery,
|
|
96
25
|
classifyFailure,
|
|
97
26
|
classifyGreenVerdict,
|
|
98
|
-
disarmAutoMerge,
|
|
99
27
|
formatRerunViolation,
|
|
100
28
|
readCiDigest,
|
|
101
29
|
resolveDigestScope,
|
|
@@ -104,34 +32,24 @@ import {
|
|
|
104
32
|
writeCiDigest,
|
|
105
33
|
} from './lib/orchestration/ci-rerun-guard.js';
|
|
106
34
|
import { watchPrToTerminal } from './lib/orchestration/pr-watch.js';
|
|
107
|
-
import {
|
|
35
|
+
import {
|
|
36
|
+
disarmAutoMerge,
|
|
37
|
+
enableAutoMergeWith,
|
|
38
|
+
} from './lib/orchestration/single-story-close/phases/auto-merge.js';
|
|
108
39
|
import { sleep as defaultSleep } from './lib/util/poll-loop.js';
|
|
109
40
|
|
|
110
41
|
/** Exit code reserved for the slow-but-not-red `still-running` verdict. */
|
|
111
42
|
export const STILL_RUNNING_EXIT_CODE = 2;
|
|
112
43
|
|
|
113
44
|
/**
|
|
114
|
-
* How long
|
|
115
|
-
*
|
|
116
|
-
*
|
|
117
|
-
*
|
|
118
|
-
* asynchronously, and the arrival latency is set by the SLOWEST context in the
|
|
119
|
-
* set. Story #4873 measured tens of seconds on a cold repo and calibrated the
|
|
120
|
-
* window at 90s; #4890 measured **16m52s** on this repository, because its
|
|
121
|
-
* required context is an aggregator job gated on every other tier and is
|
|
122
|
-
* therefore, by construction, the last check to appear. A 90s window still
|
|
123
|
-
* exhausted, so the watch still aborted on a PR whose CI was working exactly
|
|
124
|
-
* as designed.
|
|
125
|
-
*
|
|
126
|
-
* The default therefore covers a late aggregator with margin rather than a
|
|
127
|
-
* fast ruleset, and it is operator-tunable on the `delivery.ci.watch.*` ladder
|
|
128
|
-
* (`attachWindowMs`) for a repository whose contexts arrive on a different
|
|
129
|
-
* cadence. Spending the window costs nothing but wall-clock on a PR nobody
|
|
130
|
-
* could merge yet; exhausting it too early costs the whole delivery.
|
|
45
|
+
* How long an EMPTY required-context probe keeps being retried. Rulesets
|
|
46
|
+
* attach contexts asynchronously and an aggregator context gated on every
|
|
47
|
+
* other tier arrives last (~17 min measured), so the default covers that with
|
|
48
|
+
* margin: waiting costs wall-clock, giving up early costs the delivery.
|
|
131
49
|
*/
|
|
132
50
|
export const REQUIRED_CONTEXT_ATTACH_WINDOW_MS = 1_200_000;
|
|
133
51
|
|
|
134
|
-
/** Framework fallbacks when
|
|
52
|
+
/** Framework fallbacks when no CLI flag supplies a value. */
|
|
135
53
|
export const WATCH_DEFAULTS = Object.freeze({
|
|
136
54
|
pollIntervalMs: 10_000,
|
|
137
55
|
maxPolls: 180,
|
|
@@ -141,25 +59,15 @@ export const WATCH_DEFAULTS = Object.freeze({
|
|
|
141
59
|
});
|
|
142
60
|
|
|
143
61
|
/**
|
|
144
|
-
* Merge
|
|
145
|
-
*
|
|
146
|
-
*
|
|
147
|
-
* `BLOCKED` is the measured false-green: the watcher's `gh pr checks
|
|
148
|
-
* --required` set came back SMALLER than branch protection's — a context
|
|
149
|
-
* attached after the first probe, so it was never in `requiredChecks` — every
|
|
150
|
-
* check the watcher knew about was green, and it reported green while GitHub
|
|
151
|
-
* still refused the merge. `UNKNOWN` / an unreadable probe is not a
|
|
152
|
-
* reconciliation either: it is the absence of the second opinion, and a green
|
|
153
|
-
* verdict is exactly the verdict that must not be issued on absent evidence.
|
|
62
|
+
* Merge states that confirm an observed all-green required set. `BLOCKED`
|
|
63
|
+
* means branch protection enforces a context the watch never observed (it
|
|
64
|
+
* attached after the first probe); `UNKNOWN`/unreadable is absent evidence.
|
|
154
65
|
*/
|
|
155
66
|
const RECONCILED_MERGE_STATES = Object.freeze(
|
|
156
67
|
new Set(['CLEAN', 'UNSTABLE', 'HAS_HOOKS', 'BEHIND', 'DRAFT']),
|
|
157
68
|
);
|
|
158
69
|
|
|
159
70
|
/**
|
|
160
|
-
* Does an observed-green required set reconcile with the repository's own
|
|
161
|
-
* verdict on the PR? Pure — exported so the rule is reviewable as code.
|
|
162
|
-
*
|
|
163
71
|
* @param {{ observedRequired?: string[], mergeStateStatus?: string|null }} args
|
|
164
72
|
* @returns {{ reconciled: boolean, mergeStateStatus: string|null, reason: string }}
|
|
165
73
|
*/
|
|
@@ -208,12 +116,7 @@ async function defaultMergeStateProbe({ prRef }) {
|
|
|
208
116
|
}
|
|
209
117
|
}
|
|
210
118
|
|
|
211
|
-
/**
|
|
212
|
-
* Adapt the watch loop's own `ghPrViewFn` port — which already spawns
|
|
213
|
-
* `gh pr view --json mergeStateStatus` for BEHIND recovery — into the
|
|
214
|
-
* reconciliation probe, so a caller that injected one port does not have to
|
|
215
|
-
* inject a second for the same `gh` call.
|
|
216
|
-
*/
|
|
119
|
+
/** Reuse an injected `ghPrViewFn` port as the merge-state probe. */
|
|
217
120
|
function mergeStateProbeFromView(ghPrViewFn) {
|
|
218
121
|
return async ({ prUrl, repo, cwd }) => {
|
|
219
122
|
try {
|
|
@@ -230,22 +133,11 @@ function mergeStateProbeFromView(ghPrViewFn) {
|
|
|
230
133
|
}
|
|
231
134
|
|
|
232
135
|
/**
|
|
233
|
-
* Run the watch, re-
|
|
234
|
-
*
|
|
235
|
-
*
|
|
236
|
-
*
|
|
237
|
-
*
|
|
238
|
-
* Re-arming the whole call is what makes convergence possible: the required
|
|
239
|
-
* check NAMES are resolved once per `watchPrToTerminal` call, so a context that
|
|
240
|
-
* attaches minutes later is only ever seen by a fresh call.
|
|
241
|
-
*
|
|
242
|
-
* `probePrResolvable` is the **structural** classifier, re-read every round: a
|
|
243
|
-
* required set that is empty while the pull request itself reads back fine is
|
|
244
|
-
* CI that has not started, so the window is worth spending; a pull request that
|
|
245
|
-
* does not read back at all is a `gh` fault, so the window is not spent on it
|
|
246
|
-
* and the caller reports the failure immediately. `gh` overloads its exit code
|
|
247
|
-
* across both conditions, and this deliberately does not fall back to matching
|
|
248
|
-
* its stderr prose — a human-readable string is not a classification contract.
|
|
136
|
+
* Run the watch, re-running the whole call while the required set is EMPTY
|
|
137
|
+
* (names resolve once per call, so a late context needs a fresh call) until
|
|
138
|
+
* the attach window is spent. `probePrResolvable` separates CI-not-started
|
|
139
|
+
* (PR reads back) from a `gh` fault (it does not) structurally — never from
|
|
140
|
+
* stderr prose.
|
|
249
141
|
*
|
|
250
142
|
* @returns {Promise<object>} the watch result plus `attachRetries`, and
|
|
251
143
|
* `prResolvable` whenever the required set stayed empty.
|
|
@@ -260,11 +152,8 @@ async function watchWithAttachWindow({
|
|
|
260
152
|
logger,
|
|
261
153
|
}) {
|
|
262
154
|
const deadline = nowMsFn() + attachWindowMs;
|
|
263
|
-
//
|
|
264
|
-
//
|
|
265
|
-
// sets one) would otherwise spin the window out as a tight loop. Flooring
|
|
266
|
-
// the assumed cadence at 5s bounds the attempts without changing the
|
|
267
|
-
// wall-clock bound that governs a real watch.
|
|
155
|
+
// Cap retries too (cadence floored at 5s) so a zero poll interval cannot
|
|
156
|
+
// spin the wall-clock window as a tight loop.
|
|
268
157
|
const maxRetries = Math.ceil(
|
|
269
158
|
attachWindowMs / Math.max(retryIntervalMs, 5000),
|
|
270
159
|
);
|
|
@@ -300,40 +189,19 @@ function parsePositiveInt(raw, fallback) {
|
|
|
300
189
|
}
|
|
301
190
|
|
|
302
191
|
/**
|
|
303
|
-
* Resolve
|
|
304
|
-
*
|
|
305
|
-
* the precedence ladder is reviewable. `flags` are the raw string values
|
|
306
|
-
* from `parseArgs` (or numbers, in tests); a nullish flag falls through
|
|
307
|
-
* to config, and a nullish config field falls through to the default.
|
|
192
|
+
* Resolve poll knobs: a nullish or malformed flag falls back to
|
|
193
|
+
* {@link WATCH_DEFAULTS}.
|
|
308
194
|
*
|
|
309
195
|
* @param {object} opts
|
|
310
|
-
* @param {object
|
|
311
|
-
* @param {object} [opts.flags] `{ pollIntervalMs, maxPolls, maxResumes, maxUpdates, attachWindowMs }`.
|
|
196
|
+
* @param {object} [opts.flags]
|
|
312
197
|
* @returns {{ pollIntervalMs: number, maxPolls: number, maxResumes: number, maxUpdates: number, attachWindowMs: number }}
|
|
313
198
|
*/
|
|
314
|
-
export function resolveWatchKnobs({
|
|
315
|
-
const
|
|
316
|
-
const
|
|
317
|
-
parsePositiveInt(
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
flags.pollIntervalMs,
|
|
321
|
-
watch.pollIntervalMs,
|
|
322
|
-
WATCH_DEFAULTS.pollIntervalMs,
|
|
323
|
-
),
|
|
324
|
-
maxPolls: pick(flags.maxPolls, watch.maxPolls, WATCH_DEFAULTS.maxPolls),
|
|
325
|
-
maxResumes: pick(
|
|
326
|
-
flags.maxResumes,
|
|
327
|
-
watch.maxResumes,
|
|
328
|
-
WATCH_DEFAULTS.maxResumes,
|
|
329
|
-
),
|
|
330
|
-
maxUpdates: pick(flags.maxUpdates, undefined, WATCH_DEFAULTS.maxUpdates),
|
|
331
|
-
attachWindowMs: pick(
|
|
332
|
-
flags.attachWindowMs,
|
|
333
|
-
watch.attachWindowMs,
|
|
334
|
-
WATCH_DEFAULTS.attachWindowMs,
|
|
335
|
-
),
|
|
336
|
-
};
|
|
199
|
+
export function resolveWatchKnobs({ flags = {} } = {}) {
|
|
200
|
+
const knobs = {};
|
|
201
|
+
for (const [key, fallback] of Object.entries(WATCH_DEFAULTS)) {
|
|
202
|
+
knobs[key] = parsePositiveInt(flags[key], fallback);
|
|
203
|
+
}
|
|
204
|
+
return knobs;
|
|
337
205
|
}
|
|
338
206
|
|
|
339
207
|
/** Default re-arm: the sanctioned auto-merge enablement path. */
|
|
@@ -342,13 +210,9 @@ function defaultReArm({ cwd, prNumber }) {
|
|
|
342
210
|
}
|
|
343
211
|
|
|
344
212
|
/**
|
|
345
|
-
* Red path
|
|
346
|
-
*
|
|
347
|
-
*
|
|
348
|
-
*
|
|
349
|
-
* A disarm failure is a **blocker**, not a warning: an armed PR whose
|
|
350
|
-
* required check went red can still be merged by GitHub the instant a
|
|
351
|
-
* re-run turns it green, which is precisely what this guard exists to stop.
|
|
213
|
+
* Red path: disarm auto-merge FIRST (the race-free moment), then record the
|
|
214
|
+
* digest keyed to the red head SHA. A disarm failure blocks — an armed PR
|
|
215
|
+
* merges the instant a re-run turns it green.
|
|
352
216
|
*
|
|
353
217
|
* @returns {Promise<{ headSha: string|null, disarm: object, digestPaths: object|null, blocked: boolean }>}
|
|
354
218
|
*/
|
|
@@ -365,7 +229,7 @@ async function handleRedWatch({
|
|
|
365
229
|
blockFn,
|
|
366
230
|
logger,
|
|
367
231
|
}) {
|
|
368
|
-
const disarm = disarmFn({ prRef
|
|
232
|
+
const disarm = await disarmFn({ prRef });
|
|
369
233
|
const scope = resolveDigestScope({ storyId });
|
|
370
234
|
const headSha = scope ? headShaFn({ prRef, cwd }) : null;
|
|
371
235
|
let digestPaths = null;
|
|
@@ -419,9 +283,7 @@ async function handleRedWatch({
|
|
|
419
283
|
}
|
|
420
284
|
|
|
421
285
|
/**
|
|
422
|
-
* Green path
|
|
423
|
-
* scope recorded, and return the exit code with the report the caller
|
|
424
|
-
* prints.
|
|
286
|
+
* Green path: adjudicate the green against any recorded red digest.
|
|
425
287
|
*
|
|
426
288
|
* @returns {Promise<{ verdict: string, reason: string, exitCode: number, headSha: string|null, reArmed?: boolean, blocked?: boolean }>}
|
|
427
289
|
*/
|
|
@@ -458,12 +320,15 @@ async function evaluateGreenWatch({
|
|
|
458
320
|
}
|
|
459
321
|
const headSha = headShaFn({ prRef, cwd });
|
|
460
322
|
const { verdict, reason } = classifyGreenVerdict({ digest, headSha });
|
|
461
|
-
if (verdict === 'fix-at-source') {
|
|
323
|
+
if (verdict === 'fix-at-source' || verdict === 'rerun-permitted') {
|
|
324
|
+
// `rerun-permitted`: `file-ci-gap.js` proved a capacity/unreproducible
|
|
325
|
+
// verdict for THIS head. Retiring the digest spends the one allowance.
|
|
462
326
|
retireDigestFn({ storyId, tempRoot, cwd });
|
|
463
327
|
const reArm = await reArmFn({ cwd, prNumber });
|
|
464
328
|
const reArmed = Boolean(reArm?.enabled);
|
|
465
329
|
logger.info?.(
|
|
466
|
-
`[pr-watch] green on
|
|
330
|
+
`[pr-watch] ${verdict === 'rerun-permitted' ? 'green admitted on the SAME head SHA' : 'green on a NEW head SHA'} ` +
|
|
331
|
+
`(${reason}) — digest retired, ` +
|
|
467
332
|
`auto-merge ${reArmed ? 're-armed' : `NOT re-armed (${reArm?.reason ?? 'unknown'})`}.`,
|
|
468
333
|
);
|
|
469
334
|
return { verdict, reason, exitCode: 0, headSha, reArmed };
|
|
@@ -489,11 +354,7 @@ async function evaluateGreenWatch({
|
|
|
489
354
|
}
|
|
490
355
|
|
|
491
356
|
/**
|
|
492
|
-
*
|
|
493
|
-
*
|
|
494
|
-
* Split out of `runPrWatch` because config resolution must not abort the
|
|
495
|
-
* watch: a broken `.agentrc` should degrade to defaults, not turn a CI probe
|
|
496
|
-
* into a crash.
|
|
357
|
+
* A broken `.agentrc` degrades to defaults rather than aborting the watch.
|
|
497
358
|
*
|
|
498
359
|
* @param {{ config?: object, tempRoot?: string, logger: object, flags: object }} params
|
|
499
360
|
* @returns {{ knobs: object, effectiveTempRoot: string, cwd: string }}
|
|
@@ -501,18 +362,14 @@ async function evaluateGreenWatch({
|
|
|
501
362
|
function resolveWatchContext({ config, tempRoot, logger, flags }) {
|
|
502
363
|
const resolvedConfig =
|
|
503
364
|
config !== undefined ? config : safeResolveConfig(logger);
|
|
504
|
-
const knobs = resolveWatchKnobs({
|
|
365
|
+
const knobs = resolveWatchKnobs({ flags });
|
|
505
366
|
const effectiveTempRoot =
|
|
506
367
|
tempRoot ?? resolvedConfig?.project?.paths?.tempRoot ?? 'temp';
|
|
507
368
|
return { knobs, effectiveTempRoot, cwd: process.cwd() };
|
|
508
369
|
}
|
|
509
370
|
|
|
510
371
|
/**
|
|
511
|
-
*
|
|
512
|
-
*
|
|
513
|
-
* Each injectable port is spread in only when supplied so the port keeps its
|
|
514
|
-
* own default — passing `undefined` explicitly would override a default with
|
|
515
|
-
* nothing and break every caller that relies on it.
|
|
372
|
+
* Ports are spread in only when supplied so the watch keeps its own defaults.
|
|
516
373
|
*
|
|
517
374
|
* @param {object} params
|
|
518
375
|
* @returns {object}
|
|
@@ -545,13 +402,8 @@ function buildWatchArgs({
|
|
|
545
402
|
}
|
|
546
403
|
|
|
547
404
|
/**
|
|
548
|
-
*
|
|
549
|
-
*
|
|
550
|
-
*
|
|
551
|
-
* The two are distinguished structurally — never against `gh`'s stderr prose
|
|
552
|
-
* (Story #4890) — because they route oppositely: CI that has not started is
|
|
553
|
-
* slow (exit 2, keep watching), while an unreadable PR is a `gh` / access
|
|
554
|
-
* fault (exit 1).
|
|
405
|
+
* No required check attached (slow, exit 2) vs. unreadable PR (`gh` fault,
|
|
406
|
+
* exit 1).
|
|
555
407
|
*
|
|
556
408
|
* @param {object} params
|
|
557
409
|
* @returns {number} exit code
|
|
@@ -592,13 +444,8 @@ function reportUnattachedOrError({
|
|
|
592
444
|
}
|
|
593
445
|
|
|
594
446
|
/**
|
|
595
|
-
* Settle
|
|
596
|
-
*
|
|
597
|
-
* Never green on an undercount (Story #4873): the observed set is whatever
|
|
598
|
-
* `gh pr checks --required` returned on the FIRST probe, so a context a
|
|
599
|
-
* ruleset attached later can leave every check we knew about green while
|
|
600
|
-
* GitHub still refuses the merge. An unreconcilable set reports unresolved
|
|
601
|
-
* (exit 2, keep watching) rather than a false green or a false red.
|
|
447
|
+
* Settle an all-green watch. The observed set is from the FIRST probe and may
|
|
448
|
+
* undercount, so an unreconcilable set exits 2 rather than a false green.
|
|
602
449
|
*
|
|
603
450
|
* @param {object} params
|
|
604
451
|
* @returns {Promise<number>} exit code
|
|
@@ -653,9 +500,7 @@ async function settleGreenWatch({
|
|
|
653
500
|
}
|
|
654
501
|
|
|
655
502
|
/**
|
|
656
|
-
*
|
|
657
|
-
* checks still pending and none failed. Never exit 1, never `timed_out` —
|
|
658
|
-
* hand off to the host's interval loop and exit 2.
|
|
503
|
+
* Poll cap and resume budget exhausted, none red: hand off, exit 2.
|
|
659
504
|
*
|
|
660
505
|
* @param {object} params
|
|
661
506
|
* @returns {number} exit code
|
|
@@ -674,11 +519,8 @@ function reportStillRunning({ result, envelope, logger, print }) {
|
|
|
674
519
|
}
|
|
675
520
|
|
|
676
521
|
/**
|
|
677
|
-
*
|
|
678
|
-
*
|
|
679
|
-
* `promotePendingToStillRunning` has rewritten the pending entries, and a
|
|
680
|
-
* still-running check is slow, not red — including it here would let it become
|
|
681
|
-
* the digest's "primary" failing check and mispoint the diagnosis.
|
|
522
|
+
* Failing checks. `still-running` is excluded: it is slow, not red, and would
|
|
523
|
+
* otherwise become the digest's primary failing check.
|
|
682
524
|
*
|
|
683
525
|
* @param {Record<string, string>} outcomes
|
|
684
526
|
* @returns {Array<{ name: string, outcome: string }>}
|
|
@@ -696,9 +538,6 @@ function collectFailures(outcomes) {
|
|
|
696
538
|
}
|
|
697
539
|
|
|
698
540
|
/**
|
|
699
|
-
* Genuine red check — exit 1 immediately, disarm auto-merge, write the digest,
|
|
700
|
-
* and surface the fix-loop handoff.
|
|
701
|
-
*
|
|
702
541
|
* @param {object} params
|
|
703
542
|
* @returns {Promise<number>} exit code
|
|
704
543
|
*/
|
|
@@ -755,44 +594,34 @@ async function settleRedWatch({
|
|
|
755
594
|
}
|
|
756
595
|
|
|
757
596
|
/**
|
|
758
|
-
* Run the watch
|
|
759
|
-
*
|
|
760
|
-
*
|
|
761
|
-
*
|
|
762
|
-
* 0 → all required checks green (and the no-rerun guard cleared them).
|
|
763
|
-
* 1 → a required check genuinely failed (red), OR the green was reached
|
|
764
|
-
* by a forbidden re-run of the same commit, OR the pull request itself
|
|
765
|
-
* could not be read (a `gh` / access fault).
|
|
766
|
-
* 2 → slow-but-not-red: still-running (cap + resume budget exhausted, none
|
|
767
|
-
* red), an unreconcilable green, or no required context attached within
|
|
768
|
-
* the attach window while the PR kept reading back fine (#4890).
|
|
597
|
+
* Run the watch and resolve to the exit code: 0 green (guard cleared);
|
|
598
|
+
* 1 red, forbidden same-SHA re-run, or unreadable PR; 2 slow-but-not-red
|
|
599
|
+
* (still running, unreconcilable green, or no context attached in the window).
|
|
769
600
|
*
|
|
770
601
|
* @param {object} opts
|
|
771
602
|
* @param {number} opts.prNumber
|
|
772
|
-
* @param {string|null} [opts.repo]
|
|
603
|
+
* @param {string|null} [opts.repo]
|
|
773
604
|
* @param {number|string} [opts.maxUpdates]
|
|
774
605
|
* @param {number|string} [opts.pollIntervalMs]
|
|
775
606
|
* @param {number|string} [opts.maxPolls]
|
|
776
607
|
* @param {number|string} [opts.maxResumes]
|
|
777
|
-
* @param {number|string} [opts.attachWindowMs]
|
|
778
|
-
*
|
|
779
|
-
*
|
|
780
|
-
* @param {
|
|
781
|
-
* @param {
|
|
782
|
-
* @param {Function} [opts.
|
|
783
|
-
* @param {Function} [opts.
|
|
784
|
-
* @param {Function} [opts.
|
|
785
|
-
* @param {Function} [opts.
|
|
786
|
-
* @param {Function} [opts.
|
|
787
|
-
* @param {Function} [opts.
|
|
788
|
-
* @param {Function} [opts.
|
|
789
|
-
* @param {Function} [opts.
|
|
790
|
-
* @param {Function} [opts.
|
|
791
|
-
* @param {Function} [opts.reArmAutoMergeFn] inject for tests (default enableAutoMergeWith)
|
|
792
|
-
* @param {Function} [opts.blockDeliveryFn] inject for tests (default blockStoryDelivery)
|
|
608
|
+
* @param {number|string} [opts.attachWindowMs]
|
|
609
|
+
* @param {object|null} [opts.config]
|
|
610
|
+
* @param {string} [opts.tempRoot]
|
|
611
|
+
* @param {Function} [opts.ghPrChecksFn]
|
|
612
|
+
* @param {Function} [opts.ghPrViewFn]
|
|
613
|
+
* @param {Function} [opts.ghPrUpdateBranchFn]
|
|
614
|
+
* @param {Function} [opts.sleepFn]
|
|
615
|
+
* @param {Function} [opts.writeDigestFn]
|
|
616
|
+
* @param {Function} [opts.readDigestFn]
|
|
617
|
+
* @param {Function} [opts.retireDigestFn]
|
|
618
|
+
* @param {Function} [opts.headShaFn]
|
|
619
|
+
* @param {Function} [opts.disarmAutoMergeFn]
|
|
620
|
+
* @param {Function} [opts.reArmAutoMergeFn]
|
|
621
|
+
* @param {Function} [opts.blockDeliveryFn]
|
|
793
622
|
* @param {object} [opts.logger]
|
|
794
|
-
* @param {(line: string) => void} [opts.print]
|
|
795
|
-
* @returns {Promise<number>}
|
|
623
|
+
* @param {(line: string) => void} [opts.print]
|
|
624
|
+
* @returns {Promise<number>}
|
|
796
625
|
*/
|
|
797
626
|
export async function runPrWatch({
|
|
798
627
|
prNumber,
|
|
@@ -831,22 +660,13 @@ export async function runPrWatch({
|
|
|
831
660
|
flags: { pollIntervalMs, maxPolls, maxResumes, maxUpdates, attachWindowMs },
|
|
832
661
|
});
|
|
833
662
|
|
|
834
|
-
// `gh`
|
|
835
|
-
//
|
|
836
|
-
// the first probe with a misleading `gh-checks-failed:status=1` (#4890). The
|
|
837
|
-
// repository therefore travels two sanctioned ways, never as a composed ref:
|
|
838
|
-
// - a real `--repo` flag on the watch ports, which build their own argv;
|
|
839
|
-
// - a canonical PR URL for the no-rerun-guard helpers, which take a bare
|
|
840
|
-
// ref and no repository of their own.
|
|
841
|
-
// With `--repo` omitted, `gh` infers the repository from the cwd's remote.
|
|
663
|
+
// `gh` parses `<owner/repo>#<n>` as a branch name, so the repo travels as a
|
|
664
|
+
// `--repo` flag on watch ports and as a PR URL for the guard helpers.
|
|
842
665
|
const prRef = String(prNumber);
|
|
843
666
|
const guardPrRef = repo
|
|
844
667
|
? `https://github.com/${repo}/pull/${prNumber}`
|
|
845
668
|
: prRef;
|
|
846
669
|
|
|
847
|
-
// One merge-state probe, resolved once and used for both readings that need
|
|
848
|
-
// the repository's own view of the PR: the empty-required-set classification
|
|
849
|
-
// below, and the green-verdict reconciliation further down.
|
|
850
670
|
const probeMergeState =
|
|
851
671
|
mergeStateProbeFn ??
|
|
852
672
|
(ghPrViewFn ? mergeStateProbeFromView(ghPrViewFn) : defaultMergeStateProbe);
|
|
@@ -869,14 +689,10 @@ export async function runPrWatch({
|
|
|
869
689
|
retryIntervalMs: knobs.pollIntervalMs,
|
|
870
690
|
sleepFn: sleepFn ?? defaultSleep,
|
|
871
691
|
nowMsFn,
|
|
872
|
-
// Structural, not prose: the PR reads back ⇒ `gh` works and the empty
|
|
873
|
-
// required set is CI that has not started yet.
|
|
874
692
|
probePrResolvable: async () => (await readMergeState()) !== null,
|
|
875
693
|
logger,
|
|
876
694
|
});
|
|
877
695
|
|
|
878
|
-
// Always print the final outcomes map so the operator (and the
|
|
879
|
-
// workflow log) can see exactly which check blocked.
|
|
880
696
|
const envelope = {
|
|
881
697
|
prNumber,
|
|
882
698
|
checkOutcomes: result.outcomes,
|
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* GitHub Provider — token resolution
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* → throws with an instructive error. `execSync` is indirected through a
|
|
6
|
-
* holder so tests can swap it.
|
|
7
|
-
*
|
|
8
|
-
* Extracted from `../github.js` in Story #1846 / Task #1855 — see that
|
|
9
|
-
* Story for the broader split rationale.
|
|
2
|
+
* GitHub Provider — token resolution: GITHUB_TOKEN / GH_TOKEN env →
|
|
3
|
+
* `gh auth token` → instructive throw. `execSync` sits behind a holder so
|
|
4
|
+
* tests can swap it.
|
|
10
5
|
*/
|
|
11
6
|
|
|
12
7
|
import { execSync as defaultExecSync } from 'node:child_process';
|