mandrel 2.60.0 → 2.62.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +10 -10
- package/.agents/agents/story-worker.md +1 -1
- package/.agents/docs/agentrc-reference.json +4 -82
- package/.agents/docs/configuration.md +20 -87
- package/.agents/docs/workflows.md +1 -1
- package/.agents/instructions.md +1 -3
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/agentrc.schema.json +11 -486
- package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +14 -14
- package/.agents/scripts/acceptance-eval.js +32 -164
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +9 -45
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +46 -172
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +32 -99
- package/.agents/scripts/deliver-light.js +14 -101
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +36 -133
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +10 -50
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +31 -143
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -35
- package/.agents/scripts/lib/config/explain.js +9 -80
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +10 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
- package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
- package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -126
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +31 -259
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +21 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/merge-queue.js +158 -0
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +190 -280
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +183 -485
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +83 -358
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -104
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +27 -111
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +31 -148
- package/.agents/scripts/plan-run-epilogue.js +11 -37
- package/.agents/scripts/pr-watch-with-update.js +76 -267
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -209
- package/.agents/scripts/stories-wave-tick.js +102 -472
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/deliver-digest.md +6 -4
- package/.agents/workflows/helpers/deliver-reference.md +114 -188
- package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
- package/.agents/workflows/helpers/plan-reference.md +86 -139
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +32 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +105 -661
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +15 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +16 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1183
- package/.agents/rules/known-tooling-behavior.md +0 -200
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -368
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -218
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -125
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,66 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* sync-from-base.js —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* sync-from-base.js — merge `origin/<baseBranch>` into a worktree's branch
|
|
3
|
+
* before the PR opens. Merge, not rebase (settled): a rebase force-pushes
|
|
4
|
+
* away review state and spends the capture stamp just the same.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* Whichever PR auto-merges first bumps `main`; the lagging PRs are then
|
|
9
|
-
* "behind base" and (with branch-protection's `up-to-date branch` rule)
|
|
10
|
-
* stall at the merge gate. Pulling the latest base commits into the
|
|
11
|
-
* Story branch before push makes the initial CI run reflect a fresh
|
|
12
|
-
* merge and reduces (does not eliminate) the residual race-with-merge
|
|
13
|
-
* window. The merge queue is the proper fix for the residual race.
|
|
14
|
-
*
|
|
15
|
-
* Why merge, not rebase (Story #5267 — settled, do not re-open):
|
|
16
|
-
*
|
|
17
|
-
* 1. Mandrel states no rebase rule anywhere. `git-conventions.md`
|
|
18
|
-
* mandates branch shapes and commit subjects and is silent on how a
|
|
19
|
-
* branch takes on base commits, so there is no convention to honour
|
|
20
|
-
* here — only a trade-off to pick.
|
|
21
|
-
* 2. Story branches are pushed and reviewed across iterations of the
|
|
22
|
-
* watch + fix loop. A rebase force-pushes, discarding in-flight
|
|
23
|
-
* reviewer context and any review state pinned to the old SHAs.
|
|
24
|
-
* 3. A rebase would NOT save the pre-push capture stamp people reach
|
|
25
|
-
* for it to save. The stamp is keyed on the tree, and rebasing onto
|
|
26
|
-
* a moved base changes the tree exactly as merging it does — both
|
|
27
|
-
* invalidate the stamp, so the credit argument is a wash. The real
|
|
28
|
-
* remedy is the `changedPaths` reporting below: say out loud when
|
|
29
|
-
* the sync spent the stamp, rather than change how it is spent.
|
|
30
|
-
*
|
|
31
|
-
* The merge commit is squashed away when the PR lands, so the cosmetic
|
|
32
|
-
* cost is zero.
|
|
33
|
-
*
|
|
34
|
-
* Outcomes (`{ synced, kind, ... }`):
|
|
35
|
-
*
|
|
36
|
-
* - `{ synced: true, kind: 'noop-already-current', changedPaths: [] }`
|
|
37
|
-
* — `origin/<base>` is already an ancestor of HEAD; nothing to do.
|
|
38
|
-
* - `{ synced: true, kind: 'fast-forward', changedPaths }` — merge
|
|
39
|
-
* fast-forwarded.
|
|
40
|
-
* - `{ synced: true, kind: 'merge-commit', changedPaths }` — non-trivial
|
|
41
|
-
* merge succeeded; a merge commit landed on the active branch.
|
|
42
|
-
*
|
|
43
|
-
* `changedPaths` is the tracked paths the sync brought into the branch —
|
|
44
|
-
* `git diff --name-only <pre-merge HEAD> HEAD` — and is what lets a caller
|
|
45
|
-
* tell a sync that spent a pre-push capture stamp from one that did not.
|
|
46
|
-
* It is `[]` for every non-mutating and every failing outcome.
|
|
47
|
-
* - `{ synced: false, kind: 'fetch-failed', stderr }` — `git fetch`
|
|
48
|
-
* could not retrieve `origin/<base>`. No mutation occurred.
|
|
49
|
-
* - `{ synced: false, kind: 'conflict', conflictFiles }` — merge
|
|
50
|
-
* conflicted and was aborted; caller must surface a recoverable
|
|
51
|
-
* surface (structured comment + `agent::blocked`) and stop.
|
|
52
|
-
* - `{ synced: false, kind: 'merge-failed', stderr }` — merge exited
|
|
53
|
-
* non-zero for a reason other than a parseable conflict (rare; treat
|
|
54
|
-
* as a hard blocker on the caller's side).
|
|
55
|
-
* - `{ synced: false, kind: 'merge-driver-missing', stderr }` — the
|
|
56
|
-
* worktree's `.gitattributes` routes `baselines/*.json` through the
|
|
57
|
-
* `mandrel-baseline` merge driver and this clone has no
|
|
58
|
-
* `merge.mandrel-baseline.driver` config, so git would text-merge
|
|
59
|
-
* generated baselines. Nothing was fetched or merged (Story #5277).
|
|
60
|
-
*
|
|
61
|
-
* The helper does not mutate any ticket state, post comments, or write
|
|
62
|
-
* to anything other than the worktree's git refs / index. Callers own
|
|
63
|
-
* the recovery surface.
|
|
6
|
+
* Mutates only git refs/index. `changedPaths` tells the caller whether the
|
|
7
|
+
* sync spent a capture stamp; `[]` on every non-mutating or failing outcome.
|
|
64
8
|
*/
|
|
65
9
|
|
|
66
10
|
import {
|
|
@@ -74,15 +18,8 @@ import {
|
|
|
74
18
|
} from '../git-utils.js';
|
|
75
19
|
|
|
76
20
|
/**
|
|
77
|
-
* Refuse
|
|
78
|
-
*
|
|
79
|
-
* each half matters; this is where the answer becomes a refusal.
|
|
80
|
-
*
|
|
81
|
-
* Base-sync is the one place the failure is catchable before it happens: it is
|
|
82
|
-
* the merge that runs unattended, immediately before the push, on exactly the
|
|
83
|
-
* files a concurrent sibling Story most often also refreshed. Refusing costs
|
|
84
|
-
* one operator command; proceeding costs a silently wrong baseline on `main`
|
|
85
|
-
* that nothing downstream re-derives.
|
|
21
|
+
* Refuse when the declared baseline merge driver is unregistered: git would
|
|
22
|
+
* text-merge generated baselines and silently land a wrong one on `main`.
|
|
86
23
|
*
|
|
87
24
|
* @param {string} cwd
|
|
88
25
|
* @param {typeof defaultGitSpawn} gitSpawn
|
|
@@ -109,8 +46,6 @@ function refuseWithoutMergeDriver(cwd, gitSpawn) {
|
|
|
109
46
|
}
|
|
110
47
|
|
|
111
48
|
/**
|
|
112
|
-
* Resolve the current HEAD SHA, or `null` when git cannot answer.
|
|
113
|
-
*
|
|
114
49
|
* @param {typeof defaultGitSpawn} gitSpawn
|
|
115
50
|
* @param {string} cwd
|
|
116
51
|
* @returns {string|null}
|
|
@@ -123,14 +58,7 @@ function readHead(gitSpawn, cwd) {
|
|
|
123
58
|
}
|
|
124
59
|
|
|
125
60
|
/**
|
|
126
|
-
*
|
|
127
|
-
*
|
|
128
|
-
* Returns `[]` when the pre-merge SHA could not be read or the diff itself
|
|
129
|
-
* failed. That is deliberately the quiet answer: the only consumer is the
|
|
130
|
-
* caller's "your capture stamp may be dead" warning, and manufacturing that
|
|
131
|
-
* warning out of a failed probe would cry wolf on every sync in a repo where
|
|
132
|
-
* `rev-parse` is broken — a condition the merge one line earlier would
|
|
133
|
-
* already have failed on.
|
|
61
|
+
* A failed probe answers `[]` so the stamp warning never cries wolf.
|
|
134
62
|
*
|
|
135
63
|
* @param {typeof defaultGitSpawn} gitSpawn
|
|
136
64
|
* @param {string} cwd
|
|
@@ -149,24 +77,14 @@ function diffPaths(gitSpawn, cwd, fromSha) {
|
|
|
149
77
|
}
|
|
150
78
|
|
|
151
79
|
/**
|
|
152
|
-
*
|
|
153
|
-
* the module docstring for the full outcome envelope.
|
|
80
|
+
* A conflict is aborted before returning; the caller surfaces it.
|
|
154
81
|
*
|
|
155
82
|
* @param {object} opts
|
|
156
|
-
* @param {string} opts.cwd
|
|
157
|
-
*
|
|
158
|
-
*
|
|
159
|
-
* not switch branches.
|
|
160
|
-
* @param {string} opts.baseBranch Name of the base branch on `origin`
|
|
161
|
-
* (e.g. `'main'` or `'epic/123'`). The helper fetches and merges
|
|
162
|
-
* `origin/<baseBranch>`.
|
|
163
|
-
* @param {(tag: string, msg: string) => void} [opts.log] Progress sink.
|
|
164
|
-
* Receives `(tag, message)` for each non-trivial step. Defaults to a
|
|
165
|
-
* no-op so the helper is silent when called from a test.
|
|
83
|
+
* @param {string} opts.cwd Branch must already be checked out.
|
|
84
|
+
* @param {string} opts.baseBranch
|
|
85
|
+
* @param {(tag: string, msg: string) => void} [opts.log]
|
|
166
86
|
* @param {typeof defaultGitFetchWithRetry} [opts.gitFetchWithRetry]
|
|
167
|
-
*
|
|
168
|
-
* @param {typeof defaultGitSpawn} [opts.gitSpawn] Override for unit
|
|
169
|
-
* tests.
|
|
87
|
+
* @param {typeof defaultGitSpawn} [opts.gitSpawn]
|
|
170
88
|
*
|
|
171
89
|
* @returns {Promise<
|
|
172
90
|
* | { synced: true, kind: 'noop-already-current', changedPaths: string[] }
|
|
@@ -209,10 +127,6 @@ export async function syncBranchFromBase({
|
|
|
209
127
|
};
|
|
210
128
|
}
|
|
211
129
|
|
|
212
|
-
// Probe whether the merge would be a no-op (origin already an ancestor
|
|
213
|
-
// of HEAD) or a fast-forward (HEAD an ancestor of origin). The two
|
|
214
|
-
// probes are cheap and let us avoid invoking `git merge` when nothing
|
|
215
|
-
// needs to change.
|
|
216
130
|
const originAlreadyMerged = gitSpawn(
|
|
217
131
|
cwd,
|
|
218
132
|
'merge-base',
|
|
@@ -225,9 +139,7 @@ export async function syncBranchFromBase({
|
|
|
225
139
|
return { synced: true, kind: 'noop-already-current', changedPaths: [] };
|
|
226
140
|
}
|
|
227
141
|
|
|
228
|
-
//
|
|
229
|
-
// in. Read BEFORE the merge, because afterwards the only handle on the
|
|
230
|
-
// old tree is this SHA.
|
|
142
|
+
// Must be read before the merge.
|
|
231
143
|
const preMergeHead = readHead(gitSpawn, cwd);
|
|
232
144
|
|
|
233
145
|
const headBehindOrigin = gitSpawn(
|
|
@@ -254,8 +166,6 @@ export async function syncBranchFromBase({
|
|
|
254
166
|
};
|
|
255
167
|
}
|
|
256
168
|
|
|
257
|
-
// Non-zero merge exit — collect the conflicting file list before
|
|
258
|
-
// aborting so the caller can present a recoverable surface.
|
|
259
169
|
const unmerged = gitSpawn(cwd, 'diff', '--name-only', '--diff-filter=U');
|
|
260
170
|
const conflictFiles = (unmerged.stdout ?? '')
|
|
261
171
|
.toString()
|
|
@@ -263,9 +173,7 @@ export async function syncBranchFromBase({
|
|
|
263
173
|
.map((s) => s.trim())
|
|
264
174
|
.filter((s) => s.length > 0);
|
|
265
175
|
|
|
266
|
-
// Always abort
|
|
267
|
-
// worktree in a half-merged state would block the operator's recovery
|
|
268
|
-
// loop on the next iteration.
|
|
176
|
+
// Always abort: a half-merged worktree blocks the next recovery.
|
|
269
177
|
gitSpawn(cwd, 'merge', '--abort');
|
|
270
178
|
|
|
271
179
|
if (conflictFiles.length > 0) {
|
|
@@ -1,20 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* git-branch-cleanup.js —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* carved out when more than one caller re-implemented the same idempotency
|
|
7
|
-
* rules with subtle drift.
|
|
8
|
-
*
|
|
9
|
-
* All helpers:
|
|
10
|
-
* - Take an explicit `cwd` (worktree-isolation friendly).
|
|
11
|
-
* - Validate branch names via the canonical `assertBranchSafe` guard
|
|
12
|
-
* in protected mode (rejects `main`, `master`, `HEAD`, and `refs/*`
|
|
13
|
-
* before any destructive `git` invocation).
|
|
14
|
-
* - Treat "branch not found" / "remote ref does not exist" as success
|
|
15
|
-
* (idempotent), distinguishing it via `reason: 'not-found'`.
|
|
16
|
-
* - Return `{ deleted: bool, reason: string, stderr?: string }` and
|
|
17
|
-
* never throw on git's normal failure modes (caller inspects the result).
|
|
2
|
+
* git-branch-cleanup.js — local/remote branch deletion. Names pass the
|
|
3
|
+
* protected `assertBranchSafe` guard (no `main`/`master`/`HEAD`/`refs/*`)
|
|
4
|
+
* before any destructive call; "not found" counts as deleted (idempotent);
|
|
5
|
+
* git's normal failures are returned, never thrown.
|
|
18
6
|
*/
|
|
19
7
|
|
|
20
8
|
import { assertBranchSafe, isSafeBranchName } from './branch-name-guard.js';
|
|
@@ -24,15 +12,9 @@ const NOT_FOUND_LOCAL = /not found|no such branch|did not match any/i;
|
|
|
24
12
|
const NOT_FOUND_REMOTE = /remote ref does not exist|does not exist/i;
|
|
25
13
|
|
|
26
14
|
/**
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* @param {string} name - Branch name.
|
|
30
|
-
* @param {{ force?: boolean, cwd?: string }} [opts]
|
|
31
|
-
* - `force`: use `branch -D` (default true). When false, uses `branch -d`,
|
|
32
|
-
* which refuses to delete unmerged branches.
|
|
33
|
-
* - `cwd`: working directory (defaults to `process.cwd()`).
|
|
15
|
+
* @param {string} name
|
|
16
|
+
* @param {{ force?: boolean, cwd?: string }} [opts] `force` (default) = `-D`.
|
|
34
17
|
* @returns {{ deleted: boolean, reason: string, stderr?: string }}
|
|
35
|
-
* `reason` is one of: `'deleted'`, `'not-found'`, `'unmerged'`, `'error'`.
|
|
36
18
|
*/
|
|
37
19
|
export function deleteBranchLocal(name, opts = {}) {
|
|
38
20
|
assertBranchSafe(name, { protected: true });
|
|
@@ -55,22 +37,14 @@ export function deleteBranchLocal(name, opts = {}) {
|
|
|
55
37
|
}
|
|
56
38
|
|
|
57
39
|
/**
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
* @param {string} name - Branch name (no `refs/heads/` prefix).
|
|
40
|
+
* @param {string} name
|
|
61
41
|
* @param {{ remote?: string, cwd?: string, noVerify?: boolean }} [opts]
|
|
62
|
-
*
|
|
63
|
-
* block a delete-only push (the hook would still fire even though no
|
|
64
|
-
* commits are being uploaded). Default `false`.
|
|
42
|
+
* `noVerify` skips a heavy `pre-push` hook on a delete-only push.
|
|
65
43
|
* @returns {{ deleted: boolean, reason: string, stderr?: string }}
|
|
66
|
-
* `reason` is one of: `'deleted'`, `'not-found'`, `'error'`.
|
|
67
44
|
*/
|
|
68
45
|
export function deleteBranchRemote(name, opts = {}) {
|
|
69
46
|
assertBranchSafe(name, { protected: true });
|
|
70
47
|
const remote = opts.remote ?? 'origin';
|
|
71
|
-
// Remote name (e.g. "origin") is a non-branch identifier; reuse the
|
|
72
|
-
// shared character-set predicate but raise a remote-scoped error so
|
|
73
|
-
// the failure message stays accurate.
|
|
74
48
|
if (!isSafeBranchName(remote)) {
|
|
75
49
|
throw new Error(`[git-branch-cleanup] Unsafe remote name: "${remote}".`);
|
|
76
50
|
}
|
|
@@ -91,8 +65,7 @@ export function deleteBranchRemote(name, opts = {}) {
|
|
|
91
65
|
}
|
|
92
66
|
|
|
93
67
|
/**
|
|
94
|
-
*
|
|
95
|
-
* failure does not skip the remote attempt.
|
|
68
|
+
* Always attempts both sides — a local failure does not skip the remote.
|
|
96
69
|
*
|
|
97
70
|
* @param {string} name
|
|
98
71
|
* @param {{ force?: boolean, remote?: string, cwd?: string, noVerify?: boolean }} [opts]
|
|
@@ -102,9 +75,6 @@ export function deleteBranchRemote(name, opts = {}) {
|
|
|
102
75
|
* local: ReturnType<typeof deleteBranchLocal>,
|
|
103
76
|
* remote: ReturnType<typeof deleteBranchRemote>,
|
|
104
77
|
* }}
|
|
105
|
-
* Top-level `deleted` is true iff both sides succeeded (including
|
|
106
|
-
* idempotent not-found). `reason` is `'deleted'`, `'partial'`, or
|
|
107
|
-
* `'error'`.
|
|
108
78
|
*/
|
|
109
79
|
export function deleteBranchEverywhere(name, opts = {}) {
|
|
110
80
|
const local = deleteBranchLocal(name, opts);
|
|
@@ -118,26 +88,13 @@ export function deleteBranchEverywhere(name, opts = {}) {
|
|
|
118
88
|
}
|
|
119
89
|
|
|
120
90
|
/**
|
|
121
|
-
* Delete N branches in
|
|
122
|
-
*
|
|
123
|
-
*
|
|
124
|
-
* The fallback is what makes idempotency contract-correct: a batched call
|
|
125
|
-
* fails as a unit if even one ref does not exist, but the per-ref retry
|
|
126
|
-
* resolves each ref's outcome independently — `not-found` is reported as
|
|
127
|
-
* deleted, real failures are surfaced.
|
|
91
|
+
* Delete N branches in one git call, falling back to per-ref deletes when it
|
|
92
|
+
* fails — a batch fails as a unit on one missing ref, so the fallback is what
|
|
93
|
+
* keeps not-found idempotent.
|
|
128
94
|
*
|
|
129
|
-
* @param {string[]} names - Branch names
|
|
130
|
-
* filtered out before any git work.
|
|
95
|
+
* @param {string[]} names - Branch names; falsy entries are dropped.
|
|
131
96
|
* @param {{ scope: 'local'|'remote', cwd?: string, force?: boolean, remote?: string, noVerify?: boolean }} opts
|
|
132
|
-
* - `scope`: required. `'local'` runs `git branch -D|-d`; `'remote'`
|
|
133
|
-
* runs `git push <remote> --delete`.
|
|
134
|
-
* - `force`, `remote`, `noVerify`: forwarded to the per-ref helper on
|
|
135
|
-
* the fallback path; `force` and `noVerify` are also honoured on the
|
|
136
|
-
* batched call.
|
|
137
97
|
* @returns {{ deleted: string[], failed: Array<{ name: string, reason: string, stderr?: string }> }}
|
|
138
|
-
* `deleted` lists names that were successfully deleted (or were
|
|
139
|
-
* already gone). `failed` lists names whose per-ref retry returned a
|
|
140
|
-
* non-deleted result, with the lib's `reason` propagated.
|
|
141
98
|
*/
|
|
142
99
|
function assertBatchedScope(scope) {
|
|
143
100
|
if (scope !== 'local' && scope !== 'remote') {
|
|
@@ -183,8 +140,7 @@ export function deleteBranchesBatched(names, opts = {}) {
|
|
|
183
140
|
|
|
184
141
|
const scope = opts.scope;
|
|
185
142
|
assertBatchedScope(scope);
|
|
186
|
-
// Validate
|
|
187
|
-
// entry can never leak into a batched git invocation.
|
|
143
|
+
// Validate all names first so a bad entry never reaches a batched call.
|
|
188
144
|
for (const n of list) assertBranchSafe(n, { protected: true });
|
|
189
145
|
|
|
190
146
|
const cwd = opts.cwd ?? process.cwd();
|
|
@@ -197,8 +153,5 @@ export function deleteBranchesBatched(names, opts = {}) {
|
|
|
197
153
|
return { deleted: [...list], failed: [] };
|
|
198
154
|
}
|
|
199
155
|
|
|
200
|
-
// Per-ref fallback. Each call independently classifies its outcome —
|
|
201
|
-
// already-gone refs are reported as `not-found` (counted as deleted),
|
|
202
|
-
// real failures surface in `failed[]`.
|
|
203
156
|
return perRefFallback(list, scope, opts);
|
|
204
157
|
}
|
|
@@ -1,26 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* git-branch-lifecycle.js —
|
|
3
|
-
*
|
|
4
|
-
* Consolidates the "does this branch exist locally / remotely?" and
|
|
5
|
-
* "ensure this branch exists and is checked out" logic that
|
|
6
|
-
* `single-story-init.js` centralizes (formerly duplicated across the deleted
|
|
7
|
-
* `story-init.js` and `dispatch-engine.js` entry seams).
|
|
8
|
-
*
|
|
9
|
-
* All helpers take an explicit `cwd`. Callers with worktree isolation
|
|
10
|
-
* enabled pass the worktree path; single-tree callers pass `PROJECT_ROOT`.
|
|
11
|
-
*
|
|
12
|
-
* No helper here reads config, spawns its own logger, or knows about
|
|
13
|
-
* GitHub. They are pure git-subprocess wrappers with validation on the
|
|
14
|
-
* branch names they forward to git.
|
|
2
|
+
* git-branch-lifecycle.js — branch existence and seed/checkout helpers;
|
|
3
|
+
* names are validated before they reach git.
|
|
15
4
|
*/
|
|
16
5
|
|
|
17
6
|
import { assertBranchSafe } from './branch-name-guard.js';
|
|
18
7
|
import { gitPullWithRetry, gitSpawn, gitSync } from './git-utils.js';
|
|
19
8
|
|
|
20
9
|
/**
|
|
21
|
-
* Return the current branch name, or null if in detached HEAD state.
|
|
22
10
|
* @param {string} cwd
|
|
23
|
-
* @returns {string|null}
|
|
11
|
+
* @returns {string|null} null in detached HEAD state
|
|
24
12
|
*/
|
|
25
13
|
export function currentBranch(cwd) {
|
|
26
14
|
const result = gitSpawn(cwd, 'branch', '--show-current');
|
|
@@ -29,8 +17,6 @@ export function currentBranch(cwd) {
|
|
|
29
17
|
}
|
|
30
18
|
|
|
31
19
|
/**
|
|
32
|
-
* Return true iff the given branch exists as a local ref in `cwd`'s repo.
|
|
33
|
-
*
|
|
34
20
|
* @param {string} branch
|
|
35
21
|
* @param {string} cwd
|
|
36
22
|
* @returns {boolean}
|
|
@@ -44,10 +30,7 @@ export function branchExistsLocally(branch, cwd) {
|
|
|
44
30
|
}
|
|
45
31
|
|
|
46
32
|
/**
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
* Issues a network `ls-remote` call. Prefer `branchExistsViaTrackingRef`
|
|
50
|
-
* after a `git fetch` has already populated the remote-tracking refs.
|
|
33
|
+
* Network call; prefer `branchExistsViaTrackingRef` after a fetch.
|
|
51
34
|
*
|
|
52
35
|
* @param {string} branch
|
|
53
36
|
* @param {string} cwd
|
|
@@ -60,14 +43,7 @@ export function branchExistsRemotely(branch, cwd) {
|
|
|
60
43
|
}
|
|
61
44
|
|
|
62
45
|
/**
|
|
63
|
-
*
|
|
64
|
-
* local remote-tracking ref (`refs/remotes/origin/<branch>`).
|
|
65
|
-
*
|
|
66
|
-
* This is a purely-local check (no network) that is authoritative whenever
|
|
67
|
-
* a `git fetch origin` has already been run — e.g. inside `bootstrapWorktree`
|
|
68
|
-
* and `bootstrapBranch` which always call `cachedGitFetch` first. Use this
|
|
69
|
-
* instead of `branchExistsRemotely` in those paths to avoid a redundant
|
|
70
|
-
* network round-trip.
|
|
46
|
+
* Local-only; authoritative once `git fetch origin` has run.
|
|
71
47
|
*
|
|
72
48
|
* @param {string} branch
|
|
73
49
|
* @param {string} cwd
|
|
@@ -87,25 +63,10 @@ export function branchExistsViaTrackingRef(branch, cwd) {
|
|
|
87
63
|
}
|
|
88
64
|
|
|
89
65
|
/**
|
|
90
|
-
*
|
|
91
|
-
* remote) ref-presence matrix. This is the single source of truth for
|
|
92
|
-
* `single-story-init.js#decideStoryBranchSeed` (v2 `/mandrel-deliver` path).
|
|
93
|
-
*
|
|
94
|
-
* The init path previously re-implemented the same `local → no-op, remote →
|
|
95
|
-
* fetch, else create` decision tree; it now delegates here so the branching
|
|
96
|
-
* logic lives in exactly one place. The caller keeps its own keyword for
|
|
97
|
-
* the "local ref already exists" outcome (`reuse` vs `none`) — synonyms for
|
|
98
|
-
* "do not re-create / do not re-seed" preserved for its existing public/test
|
|
99
|
-
* contract — so this classifier returns the neutral `'local'` keyword and
|
|
100
|
-
* the caller maps it onto its own vocabulary.
|
|
66
|
+
* On `local`, do not `git branch` (it throws on an existing ref) or fetch.
|
|
101
67
|
*
|
|
102
68
|
* @param {{ localHas: boolean, remoteHas: boolean }} presence
|
|
103
69
|
* @returns {'local'|'fetch'|'create'}
|
|
104
|
-
* - `local` — a local ref already exists; the caller must not run
|
|
105
|
-
* `git branch` (which throws on the existing ref) and must not
|
|
106
|
-
* fetch.
|
|
107
|
-
* - `fetch` — only the remote ref exists; materialise the local ref.
|
|
108
|
-
* - `create` — neither exists; branch from the base/Epic branch.
|
|
109
70
|
*/
|
|
110
71
|
export function classifyBranchSeed({ localHas, remoteHas }) {
|
|
111
72
|
if (localHas) return 'local';
|
|
@@ -114,39 +75,13 @@ export function classifyBranchSeed({ localHas, remoteHas }) {
|
|
|
114
75
|
}
|
|
115
76
|
|
|
116
77
|
/**
|
|
117
|
-
*
|
|
118
|
-
* `single-story-init.js#seedStoryBranch` owns (Story #4255). The deleted
|
|
119
|
-
* Epic `story-init/branch-initializer.js` path had duplicated the same
|
|
120
|
-
* shell before v2 cutover.
|
|
121
|
-
*
|
|
122
|
-
* The two callers differ in exactly two behavioural axes, both of which are
|
|
123
|
-
* parameters here — no other conditional branching is introduced:
|
|
124
|
-
* - **`baseRef`** — the ref to branch from on `create` (`main` for v2
|
|
125
|
-
* `/mandrel-deliver`; pre-v2 Epic close used the Epic branch).
|
|
126
|
-
* - **`swallowCreateRace`** — when `true`, a `git branch` that exits
|
|
127
|
-
* non-zero with an "already exists" stderr is treated as reuse rather
|
|
128
|
-
* than a fatal error (pre-v2 concurrent wave dispatch). When `false`, any create failure
|
|
129
|
-
* throws (the v2 standalone path has no concurrent creator to race).
|
|
130
|
-
*
|
|
131
|
-
* The asymmetric surrounding wrappers (merged-sweep, fast-forward,
|
|
132
|
-
* donor-prime, workspace-verify) are deliberately NOT folded in — they stay
|
|
133
|
-
* in their respective callers.
|
|
134
|
-
*
|
|
135
|
-
* Caller-specific log lines and error text are passed in as the `messages`
|
|
136
|
-
* data bag so behaviour stays byte-identical to the pre-extraction switches.
|
|
137
|
-
* The git seams (`spawn`, `existsLocally`, `existsRemotely`) are injectable so
|
|
138
|
-
* each caller can bind its own cwd (and tests can substitute stubs through the
|
|
139
|
-
* parameter rather than by module mocking). Per
|
|
140
|
-
* `.agents/rules/test-seams.md` rule 1 each seam **defaults to the real
|
|
141
|
-
* implementation** bound to `cwd`, so a caller that only knows its checkout
|
|
142
|
-
* passes `cwd` and nothing else; `single-story-init.js` keeps passing its own
|
|
143
|
-
* pre-bound seams and is unaffected.
|
|
78
|
+
* Git seams default to the real implementation bound to `cwd`.
|
|
144
79
|
*
|
|
145
80
|
* @param {object} opts
|
|
146
81
|
* @param {string} opts.storyBranch
|
|
147
|
-
* @param {string} opts.baseRef
|
|
148
|
-
* @param {string} [opts.cwd]
|
|
149
|
-
* @param {boolean} [opts.swallowCreateRace=false]
|
|
82
|
+
* @param {string} opts.baseRef
|
|
83
|
+
* @param {string} [opts.cwd]
|
|
84
|
+
* @param {boolean} [opts.swallowCreateRace=false] "already exists" = reuse.
|
|
150
85
|
* @param {(args: string[]) => { status: number, stdout?: string, stderr?: string }} [opts.spawn]
|
|
151
86
|
* @param {(branch: string) => boolean} [opts.existsLocally]
|
|
152
87
|
* @param {(branch: string) => boolean} [opts.existsRemotely]
|
|
@@ -155,11 +90,10 @@ export function classifyBranchSeed({ localHas, remoteHas }) {
|
|
|
155
90
|
* @param {(b: string) => string} opts.messages.reuse
|
|
156
91
|
* @param {(b: string) => string} opts.messages.fetch
|
|
157
92
|
* @param {(b: string, ref: string) => string} opts.messages.create
|
|
158
|
-
* @param {(b: string) => string} [opts.messages.createRace]
|
|
93
|
+
* @param {(b: string) => string} [opts.messages.createRace]
|
|
159
94
|
* @param {(b: string, ref: string, stderr: string) => string} opts.messages.createError
|
|
160
95
|
* @param {(b: string, stderr: string) => string} [opts.messages.fetchError]
|
|
161
|
-
* When
|
|
162
|
-
* omitted, the fetch exit status is not inspected.
|
|
96
|
+
* When absent, the fetch exit status is not inspected.
|
|
163
97
|
*/
|
|
164
98
|
export function seedStoryBranchRef({
|
|
165
99
|
storyBranch,
|
|
@@ -193,7 +127,6 @@ export function seedStoryBranchRef({
|
|
|
193
127
|
return;
|
|
194
128
|
}
|
|
195
129
|
|
|
196
|
-
// action === 'create'
|
|
197
130
|
progress('GIT', messages.create(storyBranch, baseRef));
|
|
198
131
|
const r = spawn(['branch', storyBranch, baseRef]);
|
|
199
132
|
if (r.status !== 0) {
|
|
@@ -207,9 +140,8 @@ export function seedStoryBranchRef({
|
|
|
207
140
|
}
|
|
208
141
|
|
|
209
142
|
/**
|
|
210
|
-
* Check out a Story branch, creating it from `epicBranch`
|
|
211
|
-
*
|
|
212
|
-
* plain-`checkout`s it rather than `-B`-resetting.
|
|
143
|
+
* Check out a Story branch, creating it from `epicBranch` when absent.
|
|
144
|
+
* Non-destructive: an existing branch is plain-checked-out, never `-B`-reset.
|
|
213
145
|
*
|
|
214
146
|
* @param {string} storyBranch
|
|
215
147
|
* @param {string} epicBranch
|
|
@@ -225,7 +157,6 @@ export async function checkoutStoryBranch(
|
|
|
225
157
|
assertBranchSafe(storyBranch, epicBranch);
|
|
226
158
|
const progress = opts.progress ?? (() => {});
|
|
227
159
|
|
|
228
|
-
// Short-circuit: already on the story branch — just sync.
|
|
229
160
|
if (currentBranch(cwd) === storyBranch) {
|
|
230
161
|
const remote = branchExistsRemotely(storyBranch, cwd);
|
|
231
162
|
if (remote) {
|
|
@@ -261,10 +192,8 @@ export async function checkoutStoryBranch(
|
|
|
261
192
|
}
|
|
262
193
|
|
|
263
194
|
/**
|
|
264
|
-
* Ensure
|
|
265
|
-
*
|
|
266
|
-
* side-effect is "branch ref exists"; the caller does not want HEAD to
|
|
267
|
-
* move. After creation, HEAD is restored to `baseBranch`.
|
|
195
|
+
* Ensure a branch ref exists, creating it from `baseBranch`; HEAD is left on
|
|
196
|
+
* `baseBranch`.
|
|
268
197
|
*
|
|
269
198
|
* @param {string} branchName
|
|
270
199
|
* @param {string} baseBranch
|