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,14 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* Owns the wrappers the branches-phase planner calls to enumerate local
|
|
6
|
-
* + remote branches, walk worktrees, and probe `gh pr list` for merged
|
|
7
|
-
* PRs. Fast-forward / cleanup probes live in `git-probes-ff.js`.
|
|
8
|
-
*
|
|
9
|
-
* Re-exports the FF probes so consumers that previously imported the
|
|
10
|
-
* unified surface (`isWorkingTreeClean`, etc) keep working without
|
|
11
|
-
* touching their import paths.
|
|
2
|
+
* Branch / worktree / PR probes for the git-cleanup branches planner; also
|
|
3
|
+
* re-exports the fast-forward probes from `git-probes-ff.js`.
|
|
12
4
|
*
|
|
13
5
|
* @module lib/orchestration/git-cleanup/phases/git-probes
|
|
14
6
|
*/
|
|
@@ -46,26 +38,11 @@ export function listLocalBranches(cwd) {
|
|
|
46
38
|
}
|
|
47
39
|
|
|
48
40
|
/**
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
* `
|
|
53
|
-
*
|
|
54
|
-
* `%(refname:short)` — what both callers ask for — shortens it to the bare
|
|
55
|
-
* remote name `origin`, because git keeps the remote segment only when the
|
|
56
|
-
* result would otherwise be ambiguous. Missing that second spelling leaked
|
|
57
|
-
* a phantom `origin` candidate into the remote-only sweep, which the reap
|
|
58
|
-
* phase then reported as `already gone`.
|
|
59
|
-
*
|
|
60
|
-
* Both spellings are rejected **before** the prefix strip, because the
|
|
61
|
-
* strip is what makes them ambiguous: a real branch named `origin` lists
|
|
62
|
-
* as `origin/origin` and strips to `origin` too. Discriminating on the raw
|
|
63
|
-
* line keeps that branch reapable while still dropping the symbolic ref.
|
|
64
|
-
*
|
|
65
|
-
* Shared by {@link listRemoteBranches} and {@link listRemoteMergedBranches}
|
|
66
|
-
* so both enumerations speak the same short-name vocabulary the planner's
|
|
67
|
-
* remote-only walk keys on — a divergence there would make the ancestry
|
|
68
|
-
* signal miss every branch by name (Story #5188).
|
|
41
|
+
* Strip the `<remote>/` prefix and drop the symbolic HEAD, which
|
|
42
|
+
* `%(refname:short)` may render as the bare remote name. Both spellings are
|
|
43
|
+
* rejected on the raw line, before the strip, so a real branch named
|
|
44
|
+
* `origin` (`origin/origin`) stays reapable. Shared by both remote listers so
|
|
45
|
+
* their names match.
|
|
69
46
|
*
|
|
70
47
|
* @param {string} stdout
|
|
71
48
|
* @param {string} remoteName
|
|
@@ -95,24 +72,14 @@ export function listRemoteBranches(cwd, remoteName = 'origin') {
|
|
|
95
72
|
}
|
|
96
73
|
|
|
97
74
|
/**
|
|
98
|
-
* The remote-only walk's ancestry source
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
* enumerates **local** heads only and can never contain a remote branch
|
|
102
|
-
* name — feeding it the remote-only walk classified every orphaned remote
|
|
103
|
-
* ref as unmerged no matter how thoroughly it had landed. This is the `-r`
|
|
104
|
-
* twin: `git branch -r --merged <base>`, with the `<remote>/` prefix
|
|
105
|
-
* stripped so its names match the short names {@link listRemoteBranches}
|
|
106
|
-
* enumerates.
|
|
107
|
-
*
|
|
108
|
-
* Answered entirely from the local object database against the
|
|
109
|
-
* already-fetched remote-tracking refs — the sweep stays offline and adds
|
|
110
|
-
* no per-branch network call.
|
|
75
|
+
* The remote-only walk's ancestry source: the `-r` twin of
|
|
76
|
+
* {@link listMergedBranches} (which sees local heads only). Offline — reads
|
|
77
|
+
* the already-fetched remote-tracking refs.
|
|
111
78
|
*
|
|
112
79
|
* @param {string} cwd
|
|
113
|
-
* @param {string} base
|
|
80
|
+
* @param {string} base
|
|
114
81
|
* @param {string} [remoteName]
|
|
115
|
-
* @returns {string[]}
|
|
82
|
+
* @returns {string[]}
|
|
116
83
|
*/
|
|
117
84
|
/* node:coverage ignore next */
|
|
118
85
|
export function listRemoteMergedBranches(cwd, base, remoteName = 'origin') {
|
|
@@ -145,16 +112,9 @@ export function listMergedBranches(cwd, base) {
|
|
|
145
112
|
}
|
|
146
113
|
|
|
147
114
|
/**
|
|
148
|
-
*
|
|
149
|
-
* remote
|
|
150
|
-
*
|
|
151
|
-
* against `<remote>/<base>` whenever that ref exists, so a stale local
|
|
152
|
-
* base cannot hide a branch already merged on the remote.
|
|
153
|
-
*
|
|
154
|
-
* `lister` picks the namespace — {@link listMergedBranches} (local heads)
|
|
155
|
-
* for the local walk, {@link listRemoteMergedBranches} (remote-tracking
|
|
156
|
-
* refs) for the remote-only one. `remoteName` is forwarded as the listers'
|
|
157
|
-
* third argument, which the local lister ignores.
|
|
115
|
+
* Union the merged listing against the local base with the one against
|
|
116
|
+
* `<remote>/<base>` (when it exists), so a stale local base cannot hide a
|
|
117
|
+
* branch already merged on the remote. Shared by both walks.
|
|
158
118
|
*
|
|
159
119
|
* @param {{ lister: Function, cwd: string, baseBranch: string, remoteBaseRef: string, refExistsFn: Function, remoteName?: string }} args
|
|
160
120
|
* @returns {Set<string>}
|
|
@@ -205,25 +165,14 @@ export function worktreesByBranch(cwd) {
|
|
|
205
165
|
}
|
|
206
166
|
|
|
207
167
|
/* node:coverage ignore next */
|
|
208
|
-
//
|
|
209
|
-
// the `lib/gh-exec.js` async facade) because `planCleanup` is a
|
|
210
|
-
// synchronous planner and `prProbe` is invoked inside a sync `for`
|
|
211
|
-
// loop. Converting the planner to async would ripple into every
|
|
212
|
-
// `git-cleanup` caller and is out of scope for the callers-only
|
|
213
|
-
// provider migration.
|
|
168
|
+
// Synchronous on purpose: `planCleanup` is a sync planner.
|
|
214
169
|
export function defaultGhRunner(args, { cwd }) {
|
|
215
170
|
return execFileSync('gh', args, { cwd, encoding: 'utf8' });
|
|
216
171
|
}
|
|
217
172
|
|
|
218
173
|
/**
|
|
219
|
-
*
|
|
220
|
-
*
|
|
221
|
-
* Legacy probe: queries `--state merged` and returns the first merged row's
|
|
222
|
-
* `{ number, mergedAt }`. Kept exported so older call sites and tests that
|
|
223
|
-
* predate the latest-PR-state model continue to work — the planner now
|
|
224
|
-
* defaults to {@link probeLatestPr} for the bug-A correctness fix, but a
|
|
225
|
-
* caller can still inject this as `prProbe` to opt into the historical
|
|
226
|
-
* "any merge on this head" semantics.
|
|
174
|
+
* "Any merged PR on this head" — injectable as `prProbe`; the planner
|
|
175
|
+
* defaults to {@link probeLatestPr}.
|
|
227
176
|
*/
|
|
228
177
|
export function probeMergedPr(branch, cwd, runGh = defaultGhRunner) {
|
|
229
178
|
const out = runGh(
|
|
@@ -258,20 +207,9 @@ export function probeMergedPr(branch, cwd, runGh = defaultGhRunner) {
|
|
|
258
207
|
}
|
|
259
208
|
|
|
260
209
|
/**
|
|
261
|
-
*
|
|
262
|
-
*
|
|
263
|
-
*
|
|
264
|
-
* branches with reused names (release-please, dependabot, renovate, manual
|
|
265
|
-
* reuse) cannot be silently reaped on a stale historical merge. The right
|
|
266
|
-
* question is "is the *latest* PR on this head ref a merge?" — not "did
|
|
267
|
-
* *any* PR ever merge on this head ref?". Returning the full state lets
|
|
268
|
-
* the planner skip OPEN and CLOSED-not-merged refs with operator-visible
|
|
269
|
-
* reasons.
|
|
270
|
-
*
|
|
271
|
-
* `headRefOid` is included so the planner can cross-check the current
|
|
272
|
-
* branch tip against the commit the PR actually merged (or pointed at);
|
|
273
|
-
* post-merge force-pushes flip the tip out from under a historical merge
|
|
274
|
-
* signal and would otherwise still reap.
|
|
210
|
+
* The latest PR on a head ref, any state — so a reused branch name is never
|
|
211
|
+
* reaped on a stale historical merge. `headRefOid` lets the planner catch a
|
|
212
|
+
* post-merge force-push.
|
|
275
213
|
*
|
|
276
214
|
* @param {string} branch
|
|
277
215
|
* @param {string} cwd
|
|
@@ -316,44 +254,17 @@ export function probeLatestPr(branch, cwd, runGh = defaultGhRunner) {
|
|
|
316
254
|
}
|
|
317
255
|
|
|
318
256
|
/**
|
|
319
|
-
*
|
|
320
|
-
* head
|
|
321
|
-
*
|
|
322
|
-
* Replaces the N per-branch {@link probeLatestPr} spawns the planner used
|
|
323
|
-
* to fire inside its branch loops (Story #3333, f-performance). A single
|
|
324
|
-
* `gh pr list --state all` page is parsed into a `Map<headRefName,
|
|
325
|
-
* prInfo>` whose values carry the **same** shape {@link probeLatestPr}
|
|
326
|
-
* returns, so `classifyLatestPr` reads them without translation.
|
|
327
|
-
*
|
|
328
|
-
* When a head ref appears more than once on the page (multiple PRs share a
|
|
329
|
-
* head — reused branch names), the **first** row wins. `gh pr list`
|
|
330
|
-
* returns rows newest-first, so the first row is the latest PR on that
|
|
331
|
-
* head — exactly the "latest PR" signal {@link probeLatestPr} resolves
|
|
332
|
-
* per-branch. The planner keeps {@link probeLatestPr} as a per-branch
|
|
333
|
-
* fallback for head refs absent from this page (a branch whose PR fell
|
|
334
|
-
* outside the `--limit` window).
|
|
335
|
-
*
|
|
336
|
-
* Returns an empty index on any failure (non-array, empty, or malformed
|
|
337
|
-
* JSON) so the caller transparently falls back to per-branch probing.
|
|
257
|
+
* Every PR in one `gh` spawn, indexed by head ref in {@link probeLatestPr}'s
|
|
258
|
+
* shape. Rows are newest-first, so the first row per head wins.
|
|
338
259
|
*
|
|
339
|
-
*
|
|
340
|
-
*
|
|
341
|
-
*
|
|
342
|
-
*
|
|
343
|
-
* `--limit` it was given, which is the only way to know the window did
|
|
344
|
-
* not truncate. On a complete page a head ref's absence is not "the PR
|
|
345
|
-
* fell outside the window" — it is proof that no PR covers that ref at
|
|
346
|
-
* all, so the caller's per-branch fallback can only re-derive the same
|
|
347
|
-
* `null` at the cost of one `gh` spawn per PR-less branch.
|
|
348
|
-
*
|
|
349
|
-
* Every failure mode reports `complete: false`, because an unusable page
|
|
350
|
-
* proves nothing: empty stdout (a degraded `gh`), unparseable JSON, and a
|
|
351
|
-
* non-array payload must all leave the fallback armed. A *parsed* empty
|
|
352
|
-
* array is genuinely complete — a repository with no PRs at all.
|
|
260
|
+
* `complete` is true only when fewer rows than `limit` came back: then a
|
|
261
|
+
* head's absence proves it has no PR and the per-branch fallback can be
|
|
262
|
+
* skipped. Every failure reports `complete: false` so the fallback stays
|
|
263
|
+
* armed; a parsed empty array is genuinely complete.
|
|
353
264
|
*
|
|
354
265
|
* @param {string} cwd
|
|
355
266
|
* @param {(args: string[], opts: { cwd: string }) => string} runGh
|
|
356
|
-
* @param {number} limit
|
|
267
|
+
* @param {number} limit
|
|
357
268
|
* @returns {{ index: Map<string, { number: number, state: string, mergedAt: string|null, closedAt: string|null, headRefOid: string|null }>, complete: boolean }}
|
|
358
269
|
*/
|
|
359
270
|
export function probeAllPrs(cwd, runGh = defaultGhRunner, limit = 1000) {
|
|
@@ -401,10 +312,6 @@ export function probeAllPrs(cwd, runGh = defaultGhRunner, limit = 1000) {
|
|
|
401
312
|
const SHA_RE = /^[0-9a-f]{7,40}$/i;
|
|
402
313
|
|
|
403
314
|
/**
|
|
404
|
-
* Normalise a raw git SHA string: trim it and return it only when it
|
|
405
|
-
* matches the 7–40 hex-char shape, else `null`. Shared by both the local
|
|
406
|
-
* and remote-only resolution paths so the validation lives in one place.
|
|
407
|
-
*
|
|
408
315
|
* @param {string} raw
|
|
409
316
|
* @returns {string | null}
|
|
410
317
|
*/
|
|
@@ -414,10 +321,6 @@ function validSha(raw) {
|
|
|
414
321
|
}
|
|
415
322
|
|
|
416
323
|
/**
|
|
417
|
-
* Extract the leading SHA token from `git ls-remote` stdout. Returns the
|
|
418
|
-
* first non-empty line's first whitespace-delimited field, or `''` when
|
|
419
|
-
* stdout carries no usable line.
|
|
420
|
-
*
|
|
421
324
|
* @param {string} stdout
|
|
422
325
|
* @returns {string}
|
|
423
326
|
*/
|
|
@@ -430,14 +333,8 @@ function firstLsRemoteSha(stdout) {
|
|
|
430
333
|
}
|
|
431
334
|
|
|
432
335
|
/**
|
|
433
|
-
*
|
|
434
|
-
*
|
|
435
|
-
* For branches that exist locally (`localExists: true`), reads
|
|
436
|
-
* `refs/heads/<branch>` via `git rev-parse`. For remote-only branches,
|
|
437
|
-
* reads the SHA from `git ls-remote --heads <remote> <branch>`. Returns
|
|
438
|
-
* `null` when the ref cannot be resolved — callers treat that as "no
|
|
439
|
-
* tip cross-check available" and skip the divergence guard rather than
|
|
440
|
-
* failing the candidate.
|
|
336
|
+
* Local ref via rev-parse, remote-only via ls-remote. `null` means "no tip
|
|
337
|
+
* cross-check available", not a failure.
|
|
441
338
|
*
|
|
442
339
|
* @param {{ cwd: string, branch: string, remoteName?: string, localExists?: boolean }} args
|
|
443
340
|
* @returns {string | null}
|
|
@@ -457,28 +354,18 @@ export function branchTipSha({
|
|
|
457
354
|
}
|
|
458
355
|
|
|
459
356
|
/* node:coverage ignore next */
|
|
460
|
-
//
|
|
461
|
-
// before unioning `git branch --merged origin/<base>` into the ancestry
|
|
462
|
-
// signal so a stale local `<base>` (fast-forward phase skipped or
|
|
463
|
-
// `--branches` run alone) doesn't hide a branch that's already merged on
|
|
464
|
-
// the remote.
|
|
357
|
+
// Guards the `<remote>/<base>` ancestry union.
|
|
465
358
|
export function refExists(cwd, ref) {
|
|
466
359
|
const res = gitSpawn(cwd, 'rev-parse', '--verify', '--quiet', ref);
|
|
467
360
|
return res.status === 0;
|
|
468
361
|
}
|
|
469
362
|
|
|
470
363
|
/**
|
|
471
|
-
*
|
|
472
|
-
*
|
|
473
|
-
*
|
|
474
|
-
* Story #5188 adds the remote-only arm. Remote branches are enumerated
|
|
475
|
-
* with the `<remote>/` prefix stripped, so the short name resolves to no
|
|
476
|
-
* `refs/heads/` ref at all: passing `localExists: false` reads
|
|
477
|
-
* `refs/remotes/<remote>/<branch>` instead, so an orphaned remote ref's
|
|
478
|
-
* skip line carries a real age rather than a silent `unknown`.
|
|
364
|
+
* Last-commit time for the `not-merged` skip line; `localExists: false`
|
|
365
|
+
* reads `refs/remotes/<remote>/<branch>`.
|
|
479
366
|
*
|
|
480
367
|
* @param {string} cwd
|
|
481
|
-
* @param {string} branch
|
|
368
|
+
* @param {string} branch
|
|
482
369
|
* @param {{ localExists?: boolean, remoteName?: string }} [opts]
|
|
483
370
|
* @returns {string | null}
|
|
484
371
|
*/
|
|
@@ -494,9 +381,6 @@ export function branchLastCommitAt(cwd, branch, opts = {}) {
|
|
|
494
381
|
}
|
|
495
382
|
|
|
496
383
|
/**
|
|
497
|
-
* First non-empty trimmed stdout line — the resulting tree OID on a clean
|
|
498
|
-
* `git merge-tree --write-tree` run.
|
|
499
|
-
*
|
|
500
384
|
* @param {string} stdout
|
|
501
385
|
* @returns {string}
|
|
502
386
|
*/
|
|
@@ -509,20 +393,10 @@ function firstStdoutLine(stdout) {
|
|
|
509
393
|
}
|
|
510
394
|
|
|
511
395
|
/**
|
|
512
|
-
*
|
|
513
|
-
*
|
|
514
|
-
*
|
|
515
|
-
*
|
|
516
|
-
* tree OID means applying `branch`'s changes on top of `base` is a no-op —
|
|
517
|
-
* `branch`'s content already lives in `base` by another route (a
|
|
518
|
-
* squash-merged Epic PR, a cherry-pick, a manual `merge --squash`) that
|
|
519
|
-
* neither the PR probe nor the ancestry check can see.
|
|
520
|
-
*
|
|
521
|
-
* Both the "unsupported" case (git < 2.38 rejects `--write-tree`) and the
|
|
522
|
-
* "real conflict" case (branch and base diverge and cannot auto-merge)
|
|
523
|
-
* surface as a non-zero exit. This probe treats them identically — the
|
|
524
|
-
* signal is inconclusive, so the caller keeps the branch's current
|
|
525
|
-
* `not-merged` classification rather than guessing.
|
|
396
|
+
* `branch` is content-equivalent when `git merge-tree --write-tree` (git
|
|
397
|
+
* >= 2.38) merges it cleanly into `base`'s own tree — its content landed by
|
|
398
|
+
* another route (squash, cherry-pick). A non-zero exit (old git or a real
|
|
399
|
+
* conflict) is inconclusive and reported as unsupported.
|
|
526
400
|
*
|
|
527
401
|
* @param {{ cwd: string, base: string, branch: string, spawn?: typeof gitSpawn }} args
|
|
528
402
|
* @returns {{ supported: false } | { supported: true, equivalent: boolean }}
|
|
@@ -558,32 +432,9 @@ export const __testing = {
|
|
|
558
432
|
};
|
|
559
433
|
|
|
560
434
|
/**
|
|
561
|
-
*
|
|
562
|
-
*
|
|
563
|
-
*
|
|
564
|
-
* row is reapable. Pulled out of {@link planCleanup} so the local and
|
|
565
|
-
* remote-only branch walks share one source of truth.
|
|
566
|
-
*
|
|
567
|
-
* Inputs:
|
|
568
|
-
* - `prInfo`: the row from `prProbe` — may be the new latest-PR shape
|
|
569
|
-
* ({@link probeLatestPr}) carrying `state` + `headRefOid`, or the
|
|
570
|
-
* legacy shape ({@link probeMergedPr}) carrying only `number` +
|
|
571
|
-
* `mergedAt`. The absence of `state` is treated as MERGED so legacy
|
|
572
|
-
* callers and historical tests keep working.
|
|
573
|
-
* - `branch`, `localExists`, `remoteName`, `cwd`, `branchTipShaFn`: used
|
|
574
|
-
* to resolve the branch's current tip for the divergence cross-check.
|
|
575
|
-
*
|
|
576
|
-
* Returns either:
|
|
577
|
-
* - `{ kind: 'candidate', prInfo }` — caller appends a candidate.
|
|
578
|
-
* - `{ kind: 'skip', reason: <new-reason>, prNumber? }` — caller pushes
|
|
579
|
-
* into `skipped[]` and continues.
|
|
580
|
-
* - `{ kind: 'no-pr' }` — caller continues without skipping.
|
|
581
|
-
*
|
|
582
|
-
* A MERGED PR whose `headRefOid` differs from the branch tip is handed
|
|
583
|
-
* to {@link resolveMergedTip}, which resolves it by ancestry — see that
|
|
584
|
-
* module for the `tip-behind-merge` / `tip-diverged-from-merge` /
|
|
585
|
-
* `unverifiable` taxonomy and why a bare SHA inequality could not
|
|
586
|
-
* express it.
|
|
435
|
+
* Classify a PR probe row into a planner verdict, shared by the local and
|
|
436
|
+
* remote-only walks. A row without `state` ({@link probeMergedPr}'s shape)
|
|
437
|
+
* counts as MERGED; a MERGED row's tip check is {@link resolveMergedTip}'s.
|
|
587
438
|
*
|
|
588
439
|
* @param {{
|
|
589
440
|
* prInfo: { number?: number, state?: string, mergedAt?: string|null, headRefOid?: string|null } | null,
|
|
@@ -1,11 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* (Story #5086).
|
|
4
|
-
*
|
|
5
|
-
* Owns the ancestry probe and the taxonomy the branches-phase classifier
|
|
6
|
-
* applies when a merged PR's `headRefOid` and the branch tip disagree.
|
|
7
|
-
* Split out of `git-probes.js` so the classifier reads as one call and
|
|
8
|
-
* the taxonomy's own documentation sits next to the code it governs.
|
|
2
|
+
* Resolve a MERGED PR's head against the branch tip by ancestry.
|
|
9
3
|
*
|
|
10
4
|
* @module lib/orchestration/git-cleanup/phases/merged-tip
|
|
11
5
|
*/
|
|
@@ -13,23 +7,9 @@
|
|
|
13
7
|
import { gitSpawn } from '../../../git-utils.js';
|
|
14
8
|
|
|
15
9
|
/**
|
|
16
|
-
* Tri-state
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* Mirrors the contract `checkHeadAncestor` in
|
|
20
|
-
* `lib/worktree/lifecycle/merge-reachability.js` proved out for the
|
|
21
|
-
* worktree-reap gate — the two cannot share an implementation because
|
|
22
|
-
* that one takes a `ctx.git.gitSpawn` / `ctx.repoRoot` bag while
|
|
23
|
-
* git-cleanup's probes take a bare `cwd`.
|
|
24
|
-
*
|
|
25
|
-
* `git merge-base --is-ancestor` exits **0** (ancestor), **1** (not an
|
|
26
|
-
* ancestor) or **128** (a rev it cannot resolve). Folding 128 into
|
|
27
|
-
* "not an ancestor" is the bug this probe exists to prevent: a merged
|
|
28
|
-
* head absent from the local object DB would silently read as a
|
|
29
|
-
* divergence and re-emit the wrong post-merge-force-push diagnosis. Both
|
|
30
|
-
* revs are therefore resolved with `git rev-parse -q --verify` first, and
|
|
31
|
-
* any failure fails closed to the `error` arm — so `merge-base` never
|
|
32
|
-
* runs against a rev git cannot resolve.
|
|
10
|
+
* Tri-state: is `ancestorSha` reachable from `descendantSha`? Both revs are
|
|
11
|
+
* verified first so an unresolvable rev (merge-base exit 128) fails closed to
|
|
12
|
+
* `error` rather than reading as a divergence.
|
|
33
13
|
*
|
|
34
14
|
* @param {{ cwd: string, ancestorSha: string, descendantSha: string, spawn?: typeof gitSpawn }} args
|
|
35
15
|
* @returns {{ outcome: 'ancestor' } | { outcome: 'not-ancestor' } | { outcome: 'error', reason: string }}
|
|
@@ -68,27 +48,11 @@ export function probeAncestry({
|
|
|
68
48
|
}
|
|
69
49
|
|
|
70
50
|
/**
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
* Otherwise the tip is classified by **ancestry**, never by the bare SHA
|
|
78
|
-
* inequality this replaced. That inequality could not tell a branch that
|
|
79
|
-
* is *behind* the merged head from one force-pushed *past* it, and
|
|
80
|
-
* reported both as the latter — advising the operator to push a follow-up
|
|
81
|
-
* commit that, for a stale pre-merge snapshot, does not exist. The three
|
|
82
|
-
* arms:
|
|
83
|
-
*
|
|
84
|
-
* - **ancestor** — 0 commits ahead, every commit landed with the PR:
|
|
85
|
-
* a reap candidate tagged `reason: 'tip-behind-merge'`.
|
|
86
|
-
* - **not-ancestor** — equivalently "≥1 commit ahead", which is why one
|
|
87
|
-
* probe settles the whole taxonomy and no `rev-list` count is needed:
|
|
88
|
-
* the unchanged `tip-diverged-from-merge` force-push skip.
|
|
89
|
-
* - **error** — a rev the local object DB cannot resolve:
|
|
90
|
-
* `reason: 'unverifiable'` carrying the probe's `detail`. Never a
|
|
91
|
-
* silent pass, and never a force-push label.
|
|
51
|
+
* `null` when nothing to resolve (no head, unreadable tip, or tips match).
|
|
52
|
+
* Otherwise by ancestry, since SHA inequality cannot tell "behind" from
|
|
53
|
+
* "force-pushed past": ancestor → `tip-behind-merge` candidate;
|
|
54
|
+
* not-ancestor (≥1 commit ahead) → `tip-diverged-from-merge` skip;
|
|
55
|
+
* error → `unverifiable` skip.
|
|
92
56
|
*
|
|
93
57
|
* @param {object} args
|
|
94
58
|
* @returns {{ kind: 'candidate', prInfo: object, reason: string, tipSha: string, mergedSha: string } | { kind: 'skip', reason: string, prNumber: number|null, tipSha: string, mergedSha: string, detail?: string } | null}
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Extracted verbatim from `git-cleanup.js` so `parseCleanupArgs(argv)`
|
|
5
|
-
* keeps its named-export contract for the existing unit-test surface.
|
|
2
|
+
* Argv parser for the git-cleanup CLI.
|
|
6
3
|
*
|
|
7
4
|
* @module lib/orchestration/git-cleanup/phases/parse-args
|
|
8
5
|
*/
|
|
@@ -1,20 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* prune-remotes, branches, stashes) — wraps the corresponding
|
|
6
|
-
* `plan`/`execute` pair, applies the `--dry-run` / `--yes` semantics,
|
|
7
|
-
* and emits the operator-facing log lines.
|
|
8
|
-
*
|
|
9
|
-
* ## Decide / Execute split (Story #2994)
|
|
10
|
-
*
|
|
11
|
-
* `runBranchPhase`, `runFastForwardPhase`, and `runStashPhase` each
|
|
12
|
-
* delegate to a pure `decideXPhase(state)` that returns a plain action
|
|
13
|
-
* record `{ kind, args }`, and an impure `executeXPhase(action, ctx)`
|
|
14
|
-
* that performs I/O. The `runXPhase` sequencer composes the two,
|
|
15
|
-
* inserting the interactive prompt between them when the action's
|
|
16
|
-
* `kind` is `'prompt-then-execute'`. The split keeps the branching
|
|
17
|
-
* logic unit-testable without spinning up git or stdin.
|
|
2
|
+
* Per-phase drivers for git-cleanup. Each `runXPhase` composes a pure
|
|
3
|
+
* `decideXPhase` (returns an action record) with an impure `executeXPhase`,
|
|
4
|
+
* prompting in between for `prompt-then-execute`.
|
|
18
5
|
*
|
|
19
6
|
* @module lib/orchestration/git-cleanup/phases/phase-drivers
|
|
20
7
|
*/
|
|
@@ -68,19 +55,11 @@ function emitExecutionHuman(result) {
|
|
|
68
55
|
// =====================================================================
|
|
69
56
|
|
|
70
57
|
/**
|
|
71
|
-
* Pure: decide what the fast-forward phase should do given the plan.
|
|
72
|
-
*
|
|
73
|
-
* Returns an action record:
|
|
74
|
-
* - `{ kind: 'skip', result }` — base branch can't FF
|
|
75
|
-
* - `{ kind: 'dry-run', result }` — dry-run mode
|
|
76
|
-
* - `{ kind: 'prompt-then-execute', promptMessage, declinedResult, executeArgs }`
|
|
77
|
-
* - `{ kind: 'execute', executeArgs }` — --yes mode, run immediately
|
|
78
|
-
*
|
|
79
58
|
* @param {object} state
|
|
80
|
-
* @param {object} state.plan
|
|
81
|
-
* @param {object} state.opts
|
|
82
|
-
* @param {string} state.baseBranch
|
|
83
|
-
* @param {string} state.cwd
|
|
59
|
+
* @param {object} state.plan
|
|
60
|
+
* @param {object} state.opts
|
|
61
|
+
* @param {string} state.baseBranch
|
|
62
|
+
* @param {string} state.cwd
|
|
84
63
|
*/
|
|
85
64
|
export function decideFastForwardPhase(state) {
|
|
86
65
|
const { plan, opts, baseBranch, cwd } = state;
|
|
@@ -128,10 +107,6 @@ export function decideFastForwardPhase(state) {
|
|
|
128
107
|
return { kind: 'execute', executeArgs };
|
|
129
108
|
}
|
|
130
109
|
|
|
131
|
-
/**
|
|
132
|
-
* Impure: perform the fast-forward action returned by
|
|
133
|
-
* `decideFastForwardPhase`. Returns the phase result.
|
|
134
|
-
*/
|
|
135
110
|
export async function executeFastForwardPhase(action) {
|
|
136
111
|
if (action.kind === 'skip' || action.kind === 'dry-run') {
|
|
137
112
|
if (action.logMessage) Logger.info(action.logMessage);
|
|
@@ -160,7 +135,7 @@ export async function runFastForwardPhase(opts, cwd, baseBranch) {
|
|
|
160
135
|
}
|
|
161
136
|
|
|
162
137
|
// =====================================================================
|
|
163
|
-
// Prune phase
|
|
138
|
+
// Prune phase
|
|
164
139
|
// =====================================================================
|
|
165
140
|
|
|
166
141
|
/* node:coverage ignore next */
|
|
@@ -192,14 +167,8 @@ export async function runPrunePhase(opts, cwd) {
|
|
|
192
167
|
// =====================================================================
|
|
193
168
|
|
|
194
169
|
/**
|
|
195
|
-
*
|
|
196
|
-
*
|
|
197
|
-
* always enumerates remote-only candidates in `plan.candidates` (so the
|
|
198
|
-
* operator sees them in the dry-run list), but their deletion still
|
|
199
|
-
* requires `--remote`; without it, `executeCleanup` no-ops on every
|
|
200
|
-
* `localExists: false` candidate. Counting only the actionable subset
|
|
201
|
-
* keeps the "no-candidates" short-circuit and the confirmation prompt's
|
|
202
|
-
* "Reap N" count honest about what will actually happen.
|
|
170
|
+
* Remote-only candidates are listed but only deleted under `--remote`, so
|
|
171
|
+
* count just what will actually be reaped.
|
|
203
172
|
*/
|
|
204
173
|
function countActionableCandidates(candidates, remote) {
|
|
205
174
|
return remote
|
|
@@ -208,19 +177,10 @@ function countActionableCandidates(candidates, remote) {
|
|
|
208
177
|
}
|
|
209
178
|
|
|
210
179
|
/**
|
|
211
|
-
* Pure: decide what the branch-reap phase should do given the plan.
|
|
212
|
-
*
|
|
213
|
-
* Returns an action record:
|
|
214
|
-
* - `{ kind: 'no-candidates', result }` — empty plan, nothing to reap
|
|
215
|
-
* - `{ kind: 'dry-run', result }` — dry-run mode (plan only)
|
|
216
|
-
* - `{ kind: 'prompt-then-execute', promptMessage, declinedResult, executeArgs, plan }`
|
|
217
|
-
* - `{ kind: 'execute', executeArgs, plan }` — --yes mode
|
|
218
|
-
*
|
|
219
180
|
* @param {object} state
|
|
220
|
-
* @param {object} state.plan
|
|
221
|
-
* @param {object} state.opts
|
|
222
|
-
*
|
|
223
|
-
* @param {string} state.cwd Working directory.
|
|
181
|
+
* @param {object} state.plan
|
|
182
|
+
* @param {object} state.opts
|
|
183
|
+
* @param {string} state.cwd
|
|
224
184
|
*/
|
|
225
185
|
export function decideBranchPhase(state) {
|
|
226
186
|
const { plan, opts, cwd } = state;
|
|
@@ -255,9 +215,8 @@ export function decideBranchPhase(state) {
|
|
|
255
215
|
executeArgs,
|
|
256
216
|
};
|
|
257
217
|
}
|
|
258
|
-
//
|
|
259
|
-
//
|
|
260
|
-
// unless the operator opted in with `--include-content-merged`.
|
|
218
|
+
// Unattended: nobody saw the weak-signal note, so content-merged remote
|
|
219
|
+
// refs are withheld unless `--include-content-merged`.
|
|
261
220
|
return {
|
|
262
221
|
kind: 'execute',
|
|
263
222
|
plan,
|
|
@@ -268,10 +227,6 @@ export function decideBranchPhase(state) {
|
|
|
268
227
|
};
|
|
269
228
|
}
|
|
270
229
|
|
|
271
|
-
/**
|
|
272
|
-
* Impure: perform the branch-reap action returned by `decideBranchPhase`.
|
|
273
|
-
* Returns the phase result `{ plan, result, declined? }`.
|
|
274
|
-
*/
|
|
275
230
|
export async function executeBranchPhase(action) {
|
|
276
231
|
if (action.kind === 'dry-run' || action.kind === 'no-candidates') {
|
|
277
232
|
return action.result;
|
|
@@ -293,10 +248,7 @@ export async function runBranchPhase(opts, cwd, baseBranch) {
|
|
|
293
248
|
include: opts.include,
|
|
294
249
|
exclude: opts.exclude,
|
|
295
250
|
});
|
|
296
|
-
//
|
|
297
|
-
// dry-run / prompt shows them without requiring `--remote`. Deletion of
|
|
298
|
-
// a remote-only candidate still requires `--remote` — `executeCleanup`
|
|
299
|
-
// no-ops on `localExists: false` candidates otherwise (unchanged).
|
|
251
|
+
// Always list remote-only candidates; deleting them still needs `--remote`.
|
|
300
252
|
const plan = planCleanup({
|
|
301
253
|
cwd,
|
|
302
254
|
baseBranch,
|
|
@@ -320,19 +272,10 @@ export async function runBranchPhase(opts, cwd, baseBranch) {
|
|
|
320
272
|
// =====================================================================
|
|
321
273
|
|
|
322
274
|
/**
|
|
323
|
-
* Pure: decide what the stash-triage phase should do given the plan.
|
|
324
|
-
*
|
|
325
|
-
* Returns an action record:
|
|
326
|
-
* - `{ kind: 'no-stashes', result }` — nothing to triage
|
|
327
|
-
* - `{ kind: 'dry-run', result, stashes }` — dry-run mode
|
|
328
|
-
* - `{ kind: 'execute-allowlist', executeArgs }` — --yes / --json mode
|
|
329
|
-
* - `{ kind: 'execute-interactive', executeArgs }` — interactive prompt
|
|
330
|
-
*
|
|
331
275
|
* @param {object} state
|
|
332
|
-
* @param {Array} state.stashes
|
|
333
|
-
* @param {object} state.opts
|
|
334
|
-
*
|
|
335
|
-
* @param {string} state.cwd Working directory.
|
|
276
|
+
* @param {Array} state.stashes
|
|
277
|
+
* @param {object} state.opts
|
|
278
|
+
* @param {string} state.cwd
|
|
336
279
|
*/
|
|
337
280
|
export function decideStashPhase(state) {
|
|
338
281
|
const { stashes, opts, cwd } = state;
|
|
@@ -365,10 +308,6 @@ export function decideStashPhase(state) {
|
|
|
365
308
|
};
|
|
366
309
|
}
|
|
367
310
|
|
|
368
|
-
/**
|
|
369
|
-
* Impure: perform the stash-triage action returned by `decideStashPhase`.
|
|
370
|
-
* Returns the phase result.
|
|
371
|
-
*/
|
|
372
311
|
export async function executeStashPhase(action) {
|
|
373
312
|
if (action.kind === 'no-stashes' || action.kind === 'dry-run') {
|
|
374
313
|
return action.result;
|
|
@@ -387,11 +326,6 @@ export async function executeStashPhase(action) {
|
|
|
387
326
|
);
|
|
388
327
|
}
|
|
389
328
|
|
|
390
|
-
// Story #4922 — the `node:coverage ignore next` directive that used to sit
|
|
391
|
-
// here is gone. It was never justified: `runStashPhase` is drivable end to
|
|
392
|
-
// end (planStashes degrades to an empty list outside a repo, and the
|
|
393
|
-
// decide/execute pair below is pure given an allowlist), so the directive
|
|
394
|
-
// only hid a sequencer nothing exercised.
|
|
395
329
|
export async function runStashPhase(opts, cwd) {
|
|
396
330
|
Logger.info(`${TAG} ── phase: stashes ──`);
|
|
397
331
|
const { stashes } = planStashes({ cwd });
|
|
@@ -1,17 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* prompts
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* Split out of `cli.js` so each phase file stays under Story #2466's
|
|
6
|
-
* 200-LOC ceiling. Exports two helpers used by the per-phase drivers:
|
|
7
|
-
*
|
|
8
|
-
* - `promptYesNo(question)` — read a single y/N line and resolve true
|
|
9
|
-
* on `y` / `yes` (case-insensitive), false otherwise.
|
|
10
|
-
* - `promptStashDecision(entry)` — per-stash drop/keep/quit prompt
|
|
11
|
-
* used as the `decideFn` argument to `executeStashes`.
|
|
12
|
-
*
|
|
13
|
-
* Both helpers open a fresh readline interface and close it inside a
|
|
14
|
-
* `try`/`finally` so the process can still exit cleanly.
|
|
2
|
+
* Readline prompts for git-cleanup. Each opens a fresh interface and closes
|
|
3
|
+
* it in `finally` so the process can exit cleanly.
|
|
15
4
|
*
|
|
16
5
|
* @module lib/orchestration/git-cleanup/phases/prompts
|
|
17
6
|
*/
|
|
@@ -21,10 +10,7 @@ import readline from 'node:readline';
|
|
|
21
10
|
const TAG = '[git-cleanup]';
|
|
22
11
|
|
|
23
12
|
/**
|
|
24
|
-
*
|
|
25
|
-
* lowercases the input, then classifies it as `drop` / `quit` / `keep`.
|
|
26
|
-
* `drop` covers `d`/`drop`/`y`/`yes`; `quit` covers `q`/`quit`; anything
|
|
27
|
-
* else (including empty) defaults to the safe `keep`.
|
|
13
|
+
* Anything unrecognised, including empty, defaults to the safe `keep`.
|
|
28
14
|
*
|
|
29
15
|
* @param {string} answer
|
|
30
16
|
* @returns {'drop' | 'keep' | 'quit'}
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Owns `executePrune(ctx)` and the pure `parsePrunedRefs(output, remoteName)`
|
|
5
|
-
* helper that consumes `git fetch --prune` stderr. Both exports are
|
|
6
|
-
* preserved byte-identically from `git-cleanup.js`.
|
|
2
|
+
* Prune-remotes phase of git-cleanup.
|
|
7
3
|
*
|
|
8
4
|
* @module lib/orchestration/git-cleanup/phases/prune
|
|
9
5
|
*/
|