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,68 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* format-autofix.js — self-healing biome-format step for story-close
|
|
2
|
+
* format-autofix.js — self-healing biome-format step for story-close, plus
|
|
3
|
+
* the git plumbing it shares with `baseline-upward-writeback.js`.
|
|
3
4
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* commit subject, and log level; the git/formatter plumbing is shared
|
|
8
|
-
* below.
|
|
9
|
-
*
|
|
10
|
-
* Background. The pre-merge `biome format` gate is check-only — it fails
|
|
11
|
-
* the close when the working tree has any format drift. In practice
|
|
12
|
-
* upstream waves frequently leave drift in files that lint-staged does
|
|
13
|
-
* not glob (JSON/JSON5/YAML), so the *next* wave's close hits the gate,
|
|
14
|
-
* fails, and forces an operator-driven `npx biome format --write` plus a
|
|
15
|
-
* `style:` commit before the close can resume. That manual loop is
|
|
16
|
-
* trivially automatable.
|
|
17
|
-
*
|
|
18
|
-
* Entry points:
|
|
19
|
-
*
|
|
20
|
-
* - {@link runFormatAutofix} — whole-tree heal (`biome format --write .`)
|
|
21
|
-
* before the pre-merge gate chain, for resume/legacy callers that have
|
|
22
|
-
* no Epic→Story diff anchor. Bounded by a wall-clock timeout
|
|
23
|
-
* (Story #2165).
|
|
24
|
-
* - {@link runScopedFormatAutofix} — Story #2533: scopes the formatter to
|
|
25
|
-
* the changed-file set between the Epic branch and the Story branch and
|
|
26
|
-
* folds auto-fixed paths into a dedicated `fix(story-close):` commit,
|
|
27
|
-
* emitting `Logger.warn` naming the files. Carries the worktree-cwd fix
|
|
28
|
-
* and branch assert from Story #3907.
|
|
29
|
-
*
|
|
30
|
-
* Dependencies are injected so unit tests pin behaviour without spawning
|
|
31
|
-
* git or biome.
|
|
5
|
+
* The pre-merge format gate is check-only, and drift in files lint-staged
|
|
6
|
+
* doesn't glob (JSON/YAML) would otherwise fail the next close; this step
|
|
7
|
+
* formats the changed files and commits the result instead.
|
|
32
8
|
*/
|
|
33
9
|
|
|
34
10
|
import { execFileSync } from 'node:child_process';
|
|
35
11
|
|
|
36
12
|
import { diffNameOnly } from '../../changed-files.js';
|
|
37
13
|
import { resolveFormatWriteCommand } from '../../close-validation/commands.js';
|
|
38
|
-
import { getQuality } from '../../config-resolver.js';
|
|
39
14
|
import { Logger as DefaultLogger } from '../../Logger.js';
|
|
40
15
|
|
|
41
|
-
const TAG = '[format-autofix]';
|
|
42
16
|
const SCOPED_TAG = '[format-autofix-scoped]';
|
|
43
17
|
|
|
44
18
|
/**
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
* `timeout(1)` convention so the close orchestrator can branch on "hang"
|
|
48
|
-
* (124) vs. "formatter exited non-zero" (any other status) without
|
|
49
|
-
* inspecting signal names. Mirrors `COVERAGE_TIMEOUT_EXIT_CODE` from
|
|
50
|
-
* `coverage-capture.js` (Story #2142).
|
|
51
|
-
*/
|
|
52
|
-
export const FORMAT_AUTOFIX_TIMEOUT_EXIT_CODE = 124;
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Run `git status --porcelain` and return the list of changed paths.
|
|
56
|
-
*
|
|
57
|
-
* Porcelain lines are `XY <path>` — exactly two status chars, one space,
|
|
58
|
-
* then the path. Leading whitespace inside the status pair is significant
|
|
59
|
-
* (e.g. ` M file` for unstaged-modified) so we slice a fixed 3 chars off
|
|
60
|
-
* the front rather than trimming.
|
|
61
|
-
*
|
|
62
|
-
* Exported since Story #5277: `baseline-upward-writeback.js` needs the same
|
|
63
|
-
* "is this path already dirty?" test before it rewrites a baseline row, and a
|
|
64
|
-
* second porcelain parser is exactly the near-duplicate the duplication gate
|
|
65
|
-
* exists to refuse.
|
|
19
|
+
* Paths from `git status --porcelain`. Lines are `XY <path>` and the status
|
|
20
|
+
* pair's leading space is significant, so slice 3 chars rather than trim.
|
|
66
21
|
*
|
|
67
22
|
* @param {string} cwd
|
|
68
23
|
* @param {(args: string[], opts: object) => string} git
|
|
@@ -81,38 +36,23 @@ export function listDirtyPaths(cwd, git) {
|
|
|
81
36
|
}
|
|
82
37
|
|
|
83
38
|
/**
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
* it into an executable + argv pair ready for `execFileSync`.
|
|
39
|
+
* Split the configured format-write command into executable + argv, dropping
|
|
40
|
+
* a trailing whole-tree `.` so a file list can be appended.
|
|
87
41
|
*
|
|
88
|
-
*
|
|
89
|
-
* trailing `.` so biome formats the entire tree). The scoped entry point
|
|
90
|
-
* appends an explicit changed-file set, so it passes
|
|
91
|
-
* `dropTrailingDot: true` to strip the `.` before its file list.
|
|
92
|
-
*
|
|
93
|
-
* @param {{
|
|
94
|
-
* commands?: object,
|
|
95
|
-
* dropTrailingDot?: boolean,
|
|
96
|
-
* }} [opts]
|
|
42
|
+
* @param {{ commands?: object }} [opts]
|
|
97
43
|
* @returns {{ writeCmdString: string, writeCmd: string, writeArgs: string[] }}
|
|
98
44
|
*/
|
|
99
|
-
function resolveFormatterCmd({ commands
|
|
100
|
-
// `resolveFormatWriteCommand` reads `config.project.commands`; wrap the
|
|
101
|
-
// caller-supplied `commands` map into that canonical shape.
|
|
45
|
+
function resolveFormatterCmd({ commands } = {}) {
|
|
102
46
|
const writeCmdString = resolveFormatWriteCommand({ project: { commands } });
|
|
103
47
|
const parts = writeCmdString.split(/\s+/).filter(Boolean);
|
|
104
|
-
if (
|
|
48
|
+
if (parts[parts.length - 1] === '.') parts.pop();
|
|
105
49
|
const [writeCmd, ...writeArgs] = parts;
|
|
106
50
|
return { writeCmdString, writeCmd, writeArgs };
|
|
107
51
|
}
|
|
108
52
|
|
|
109
53
|
/**
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
* `null` when the call fails or the tree is in a detached-HEAD state
|
|
113
|
-
* (`HEAD`). Used as the commit-target guard before
|
|
114
|
-
* {@link commitDirtyPaths} writes a scoped-autofix commit, so the commit
|
|
115
|
-
* can never land on the wrong branch (e.g. the main checkout's `main`).
|
|
54
|
+
* Checked-out branch at `cwd`, or `null` on failure or detached HEAD. Guards
|
|
55
|
+
* commits against landing on the wrong branch.
|
|
116
56
|
*
|
|
117
57
|
* @param {string} cwd
|
|
118
58
|
* @param {(args: string[], opts: object) => string} git
|
|
@@ -134,9 +74,7 @@ export function currentBranch(cwd, git) {
|
|
|
134
74
|
}
|
|
135
75
|
|
|
136
76
|
/**
|
|
137
|
-
*
|
|
138
|
-
* `subject`, and return the short HEAD SHA. Hooks must run; we never pass
|
|
139
|
-
* `--no-verify` (project policy: never skip git hooks).
|
|
77
|
+
* `git add -u` + commit with hooks enabled (never `--no-verify`).
|
|
140
78
|
*
|
|
141
79
|
* @param {{
|
|
142
80
|
* cwd: string,
|
|
@@ -159,195 +97,13 @@ export function commitDirtyPaths({ cwd, git, subject }) {
|
|
|
159
97
|
}
|
|
160
98
|
|
|
161
99
|
/**
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
-
* `delivery.quality.formatAutofix.timeoutMs` and the framework default
|
|
165
|
-
* (60 s). Any resolver failure surfaces as `null`; the caller treats that
|
|
166
|
-
* as "no timeout" and the spawn runs unbounded — same fail-open contract
|
|
167
|
-
* coverage-capture uses.
|
|
168
|
-
*/
|
|
169
|
-
function resolveFormatTimeoutMs({ timeoutMs, config }) {
|
|
170
|
-
if (
|
|
171
|
-
typeof timeoutMs === 'number' &&
|
|
172
|
-
Number.isInteger(timeoutMs) &&
|
|
173
|
-
timeoutMs > 0
|
|
174
|
-
) {
|
|
175
|
-
return timeoutMs;
|
|
176
|
-
}
|
|
177
|
-
try {
|
|
178
|
-
const resolved = getQuality(config)?.formatAutofix?.timeoutMs;
|
|
179
|
-
if (
|
|
180
|
-
typeof resolved === 'number' &&
|
|
181
|
-
Number.isInteger(resolved) &&
|
|
182
|
-
resolved > 0
|
|
183
|
-
) {
|
|
184
|
-
return resolved;
|
|
185
|
-
}
|
|
186
|
-
} catch {
|
|
187
|
-
// resolver failure → fall through to "no timeout"
|
|
188
|
-
}
|
|
189
|
-
return null;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
/**
|
|
193
|
-
* Run `npx biome format --write .` then, if anything changed, commit
|
|
194
|
-
* the result on the Story branch with a `style:` subject. Returns a
|
|
195
|
-
* structured envelope so callers can log a single line.
|
|
196
|
-
*
|
|
197
|
-
* Story #2165: the formatter spawn is bounded by a wall-clock timeout
|
|
198
|
-
* (resolved from `delivery.quality.formatAutofix.timeoutMs`, default
|
|
199
|
-
* 60 s). A SIGKILL fired at the budget boundary is translated to the
|
|
200
|
-
* `timedOut: true` envelope below so the close orchestrator can flip the
|
|
201
|
-
* Story to `agent::blocked` with a friction comment naming the spawn,
|
|
202
|
-
* mirroring the coverage-capture pattern from Story #2142.
|
|
203
|
-
*
|
|
204
|
-
* The step is a no-op when:
|
|
205
|
-
* - biome rewrites nothing (clean tree),
|
|
206
|
-
* - the working tree is dirty for unrelated reasons (we refuse to
|
|
207
|
-
* opportunistically commit those — operator intent is unclear), or
|
|
208
|
-
* - `npx biome format --write` exits non-zero (we surface the error
|
|
209
|
-
* and let the existing format gate report it with the canonical
|
|
210
|
-
* hint).
|
|
211
|
-
*
|
|
212
|
-
* @param {{
|
|
213
|
-
* cwd: string,
|
|
214
|
-
* storyId: number|string,
|
|
215
|
-
* config?: object,
|
|
216
|
-
* timeoutMs?: number,
|
|
217
|
-
* logger?: object,
|
|
218
|
-
* spawnSync?: typeof execFileSync,
|
|
219
|
-
* gitSync?: (args: string[], opts: object) => string,
|
|
220
|
-
* }} opts
|
|
221
|
-
* @returns {{
|
|
222
|
-
* ran: boolean,
|
|
223
|
-
* committed: boolean,
|
|
224
|
-
* sha?: string,
|
|
225
|
-
* dirtyPathsBefore?: string[],
|
|
226
|
-
* timedOut?: boolean,
|
|
227
|
-
* timeoutMs?: number,
|
|
228
|
-
* exitCode?: number,
|
|
229
|
-
* writeCmdString?: string,
|
|
230
|
-
* }}
|
|
231
|
-
*/
|
|
232
|
-
export function runFormatAutofix({
|
|
233
|
-
cwd,
|
|
234
|
-
storyId,
|
|
235
|
-
config,
|
|
236
|
-
timeoutMs,
|
|
237
|
-
logger = DefaultLogger,
|
|
238
|
-
spawnSync = execFileSync,
|
|
239
|
-
gitSync,
|
|
240
|
-
} = {}) {
|
|
241
|
-
if (!cwd) throw new Error('runFormatAutofix: cwd is required');
|
|
242
|
-
|
|
243
|
-
const git = gitSync ?? ((args, opts) => spawnSync('git', args, opts));
|
|
244
|
-
// Resolve the formatter command from `project.commands.formatWrite` so
|
|
245
|
-
// Prettier / dprint repos use their own formatter. Falls back to the
|
|
246
|
-
// historical `npx biome format --write .` for repos that haven't opted in.
|
|
247
|
-
// The whole-tree entry point keeps the trailing `.` (formats the tree).
|
|
248
|
-
const { writeCmdString, writeCmd, writeArgs } = resolveFormatterCmd({
|
|
249
|
-
commands: config?.project?.commands,
|
|
250
|
-
});
|
|
251
|
-
|
|
252
|
-
// Refuse to act when the tree is already dirty for unrelated reasons —
|
|
253
|
-
// we don't want to absorb stray edits into a `style:` commit.
|
|
254
|
-
const dirtyBefore = listDirtyPaths(cwd, git);
|
|
255
|
-
if (dirtyBefore.length) {
|
|
256
|
-
logger.info?.(
|
|
257
|
-
`${TAG} skipped — working tree dirty before autofix (${dirtyBefore.length} paths). ` +
|
|
258
|
-
'The format check gate will report any drift with the canonical hint.',
|
|
259
|
-
);
|
|
260
|
-
return { ran: false, committed: false, dirtyPathsBefore: dirtyBefore };
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
// Story #2165 — bounded wall-clock for the formatter spawn.
|
|
264
|
-
// execFileSync's contract: on a SIGKILL trip the thrown error carries
|
|
265
|
-
// `err.signal === 'SIGKILL'` and `err.status === null`, so we branch on
|
|
266
|
-
// that to surface the 124 envelope below — same shape coverage-capture
|
|
267
|
-
// returns to its caller (Story #2142).
|
|
268
|
-
const resolvedTimeoutMs = resolveFormatTimeoutMs({
|
|
269
|
-
timeoutMs,
|
|
270
|
-
config,
|
|
271
|
-
});
|
|
272
|
-
const spawnOpts = {
|
|
273
|
-
cwd,
|
|
274
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
275
|
-
encoding: 'utf8',
|
|
276
|
-
killSignal: 'SIGKILL',
|
|
277
|
-
};
|
|
278
|
-
if (Number.isInteger(resolvedTimeoutMs) && resolvedTimeoutMs > 0) {
|
|
279
|
-
spawnOpts.timeout = resolvedTimeoutMs;
|
|
280
|
-
}
|
|
281
|
-
// Run the configured formatter in write mode. We tolerate a non-zero exit
|
|
282
|
-
// because the existing format gate downstream is the source of truth for
|
|
283
|
-
// "did formatting succeed" — our job is only to opportunistically heal
|
|
284
|
-
// drift that *would* have failed the gate.
|
|
285
|
-
let writeFailed = false;
|
|
286
|
-
try {
|
|
287
|
-
spawnSync(writeCmd, writeArgs, spawnOpts);
|
|
288
|
-
} catch (err) {
|
|
289
|
-
if (err?.signal === 'SIGKILL') {
|
|
290
|
-
logger.warn?.(
|
|
291
|
-
`${TAG} ⏱ \`${writeCmdString}\` exceeded ${resolvedTimeoutMs}ms — killed (SIGKILL). ` +
|
|
292
|
-
`Returning exit ${FORMAT_AUTOFIX_TIMEOUT_EXIT_CODE}; story-close will flip Story #${storyId} to agent::blocked.`,
|
|
293
|
-
);
|
|
294
|
-
return {
|
|
295
|
-
ran: true,
|
|
296
|
-
committed: false,
|
|
297
|
-
timedOut: true,
|
|
298
|
-
timeoutMs: resolvedTimeoutMs,
|
|
299
|
-
exitCode: FORMAT_AUTOFIX_TIMEOUT_EXIT_CODE,
|
|
300
|
-
writeCmdString,
|
|
301
|
-
};
|
|
302
|
-
}
|
|
303
|
-
writeFailed = true;
|
|
304
|
-
logger.warn?.(
|
|
305
|
-
`${TAG} \`${writeCmdString}\` exited non-zero (${err?.status ?? 'unknown'}); ` +
|
|
306
|
-
'falling through to the format check gate to report drift.',
|
|
307
|
-
);
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
const dirtyAfter = listDirtyPaths(cwd, git);
|
|
311
|
-
if (!dirtyAfter.length) {
|
|
312
|
-
logger.info?.(
|
|
313
|
-
writeFailed
|
|
314
|
-
? `${TAG} no autofix changes produced (formatter write failed).`
|
|
315
|
-
: `${TAG} no format drift — tree clean after \`${writeCmdString}\`.`,
|
|
316
|
-
);
|
|
317
|
-
return { ran: true, committed: false };
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
// Stage every modified path and commit. Hooks must run; do not pass
|
|
321
|
-
// --no-verify (project policy: never skip git hooks).
|
|
322
|
-
const subject = `style: biome format autofix on story-close (story #${storyId})`;
|
|
323
|
-
const sha = commitDirtyPaths({ cwd, git, subject });
|
|
324
|
-
|
|
325
|
-
logger.info?.(
|
|
326
|
-
`${TAG} healed ${dirtyAfter.length} path(s) with \`${writeCmdString}\`; ` +
|
|
327
|
-
`committed as ${sha} on story branch.`,
|
|
328
|
-
);
|
|
329
|
-
return { ran: true, committed: true, sha };
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
/**
|
|
333
|
-
* List the files changed between `baseBranch` and `storyBranch` using the
|
|
334
|
-
* three-dot merge-base diff. Delegates parsing to `diffNameOnly` from
|
|
335
|
-
* `changed-files.js` so the stdout → path-list conversion lives in one place.
|
|
336
|
-
*
|
|
337
|
-
* The `git` parameter uses the caller's local interface:
|
|
338
|
-
* `(args: string[], opts: object) => string`. A bridge adapter wraps it into
|
|
339
|
-
* the `gitSpawn(cwd, ...args)` shape that `diffNameOnly` expects.
|
|
340
|
-
*
|
|
341
|
-
* Exported since Story #5224: the sibling `baseline-upward-writeback.js` step
|
|
342
|
-
* scopes to the same branch changed-file set, and a second copy of this
|
|
343
|
-
* `(args, opts)` → `gitSpawn` bridge is exactly the kind of near-duplicate the
|
|
344
|
-
* duplication gate exists to refuse.
|
|
100
|
+
* Files changed in `baseBranch...storyBranch`, bridging the local
|
|
101
|
+
* `(args, opts)` git interface to the `gitSpawn` shape `diffNameOnly` takes.
|
|
345
102
|
*
|
|
346
103
|
* @param {{ cwd: string, baseBranch: string, storyBranch: string, git: Function }} opts
|
|
347
104
|
* @returns {string[]}
|
|
348
105
|
*/
|
|
349
106
|
export function listChangedFiles({ cwd, baseBranch, storyBranch, git }) {
|
|
350
|
-
// Bridge the (args, opts) → string interface into gitSpawn(cwd, ...args).
|
|
351
107
|
const gitSpawn = (_cwd, ...args) => {
|
|
352
108
|
try {
|
|
353
109
|
const stdout = git(args, {
|
|
@@ -372,37 +128,11 @@ export function listChangedFiles({ cwd, baseBranch, storyBranch, git }) {
|
|
|
372
128
|
}
|
|
373
129
|
|
|
374
130
|
/**
|
|
375
|
-
*
|
|
376
|
-
*
|
|
377
|
-
*
|
|
378
|
-
*
|
|
379
|
-
*
|
|
380
|
-
*
|
|
381
|
-
* Why scoped + warn-level. The Tech Spec (Epic #2527, Story 5) calls out
|
|
382
|
-
* that format diffs introduced by Story commits should never surface to
|
|
383
|
-
* Phase 3 close-validation. The whole-tree autofix already covers that,
|
|
384
|
-
* but emits `info` so operators routinely miss it. This entry point emits
|
|
385
|
-
* `Logger.warn` naming the auto-fixed files so the signal is visible in
|
|
386
|
-
* the close transcript and downstream ledger.
|
|
387
|
-
*
|
|
388
|
-
* No-op envelopes:
|
|
389
|
-
* - `{ ran: false, reason: 'no-changed-files' }` — empty diff.
|
|
390
|
-
* - `{ ran: false, reason: 'dirty-tree' }` — refused to
|
|
391
|
-
* absorb pre-existing edits.
|
|
392
|
-
* - `{ ran: true, committed: false }` — formatter
|
|
393
|
-
* was clean.
|
|
394
|
-
*
|
|
395
|
-
* **Worktree scope (Story #3907).** All git + formatter operations run in
|
|
396
|
-
* `worktreePath` (the Story worktree where `story-<id>` is checked out), not
|
|
397
|
-
* `cwd` (the main checkout). The earlier implementation ran every step
|
|
398
|
-
* against `cwd`, so the `git add -u` + `git commit` could land an unreviewed
|
|
399
|
-
* `fix(story-close):` commit on whatever branch the main checkout happened to
|
|
400
|
-
* have out — including `main`. Before committing, the worktree's checked-out
|
|
401
|
-
* branch is asserted to equal `storyBranch`; a mismatch refuses to commit and
|
|
402
|
-
* returns `{ ran: true, committed: false, reason: 'wrong-branch' }` so a
|
|
403
|
-
* stale-state checkout can never absorb the autofix into the wrong history.
|
|
404
|
-
* `worktreePath` defaults to `cwd` for the resume/legacy callers that have no
|
|
405
|
-
* separate worktree.
|
|
131
|
+
* Format the branch's changed files and fold any drift into one
|
|
132
|
+
* `fix(story-close):` commit, logged at warn so it is visible in the close
|
|
133
|
+
* transcript. Everything runs in `worktreePath` (default `cwd`), and the
|
|
134
|
+
* commit is refused unless that tree is on `storyBranch` — otherwise a
|
|
135
|
+
* mis-wired cwd could commit onto `main`. Refuses to absorb a dirty tree.
|
|
406
136
|
*
|
|
407
137
|
* @param {{
|
|
408
138
|
* cwd: string,
|
|
@@ -440,18 +170,12 @@ export function runScopedFormatAutofix({
|
|
|
440
170
|
if (!storyBranch)
|
|
441
171
|
throw new Error('runScopedFormatAutofix: storyBranch is required');
|
|
442
172
|
|
|
443
|
-
// Story #3907 — the formatter writes + the commit must land in the Story
|
|
444
|
-
// worktree, never the main checkout. Fall back to `cwd` only for callers
|
|
445
|
-
// that do not run under worktree isolation.
|
|
446
173
|
const workTree = worktreePath || cwd;
|
|
447
174
|
|
|
448
175
|
const git = gitSync ?? ((args, opts) => spawnSync('git', args, opts));
|
|
449
176
|
|
|
450
|
-
// Resolve the formatter base command (e.g. `npx biome format --write`).
|
|
451
|
-
// We drop a trailing `.` so we can append the changed-file set explicitly.
|
|
452
177
|
const { writeCmdString, writeCmd, writeArgs } = resolveFormatterCmd({
|
|
453
178
|
commands: config?.project?.commands,
|
|
454
|
-
dropTrailingDot: true,
|
|
455
179
|
});
|
|
456
180
|
|
|
457
181
|
const changed = listChangedFiles({
|
|
@@ -475,9 +199,7 @@ export function runScopedFormatAutofix({
|
|
|
475
199
|
return { ran: false, committed: false, reason: 'dirty-tree' };
|
|
476
200
|
}
|
|
477
201
|
|
|
478
|
-
//
|
|
479
|
-
// exit because the downstream check gate is the source of truth for
|
|
480
|
-
// "did formatting succeed".
|
|
202
|
+
// A non-zero exit is tolerated: the downstream check gate is authoritative.
|
|
481
203
|
try {
|
|
482
204
|
spawnSync(writeCmd, [...writeArgs, ...changed], {
|
|
483
205
|
cwd: workTree,
|
|
@@ -498,11 +220,6 @@ export function runScopedFormatAutofix({
|
|
|
498
220
|
return { ran: true, committed: false };
|
|
499
221
|
}
|
|
500
222
|
|
|
501
|
-
// Story #3907 — assert the worktree is actually on `storyBranch` before we
|
|
502
|
-
// stage + commit. Without this guard a stale-state checkout (or a
|
|
503
|
-
// mis-wired `cwd`) could absorb the autofix onto the wrong branch (incl.
|
|
504
|
-
// `main`). A mismatch refuses to commit and leaves the format drift for the
|
|
505
|
-
// downstream check gate to surface.
|
|
506
223
|
const onBranch = currentBranch(workTree, git);
|
|
507
224
|
if (onBranch !== storyBranch) {
|
|
508
225
|
logger.warn?.(
|
|
@@ -512,14 +229,9 @@ export function runScopedFormatAutofix({
|
|
|
512
229
|
return { ran: true, committed: false, reason: 'wrong-branch' };
|
|
513
230
|
}
|
|
514
231
|
|
|
515
|
-
// Stage every modified path and commit. Hooks must run; do not pass
|
|
516
|
-
// --no-verify (project policy: never skip git hooks).
|
|
517
232
|
const subject = `fix(story-close): auto-apply biome format in scoped lint (story #${storyId})`;
|
|
518
233
|
const sha = commitDirtyPaths({ cwd: workTree, git, subject });
|
|
519
234
|
|
|
520
|
-
// The warn-level emission is the Tech Spec contract — operators read
|
|
521
|
-
// this line in the close transcript to know auto-fix landed in the
|
|
522
|
-
// close commit, and downstream ledger inspectors filter on it.
|
|
523
235
|
logger.warn?.(
|
|
524
236
|
`${SCOPED_TAG} auto-applied biome format to ${dirtyAfter.length} path(s) on story #${storyId}: ${dirtyAfter.join(', ')}; committed as ${sha}.`,
|
|
525
237
|
);
|