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,25 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* phases/base-sync.js —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* Defends against the parallel-`/single-story-deliver` race where one
|
|
7
|
-
* Story's auto-merge bumps `main` while sibling Stories are mid-flight —
|
|
8
|
-
* without the sync, the lagging PRs open "behind base" and stall against
|
|
9
|
-
* the `up-to-date branch` protection rule.
|
|
10
|
-
*
|
|
11
|
-
* The sync runs INSIDE the worktree (where the Story branch is checked
|
|
12
|
-
* out); falls back to the main checkout when the worktree is absent.
|
|
13
|
-
* On a merge conflict the Story is transitioned to `agent::blocked` via
|
|
14
|
-
* `handleSyncFailure` and the caller throws — the operator resolves in
|
|
15
|
-
* the worktree and re-runs.
|
|
16
|
-
*
|
|
17
|
-
* Story #5267: a sync that lands tracked content also spends the worker's
|
|
18
|
-
* pre-push credit, because that credit is keyed on the tree. The phase says
|
|
19
|
-
* so out loud — see `buildStampInvalidatedWarning` — instead of leaving
|
|
20
|
-
* close's second full suite looking like a bug. Story #5278 splits the claim
|
|
21
|
-
* in two: gate evidence is spent by any tracked path, the capture stamp only
|
|
22
|
-
* by one under `crap.targetDirs`.
|
|
2
|
+
* phases/base-sync.js — sync the Story branch from `origin/<baseBranch>`
|
|
3
|
+
* before push, so a PR does not open behind a base a sibling's merge just
|
|
4
|
+
* moved. Runs in the worktree (else the main checkout); a failure blocks the
|
|
5
|
+
* Story and throws.
|
|
23
6
|
*/
|
|
24
7
|
|
|
25
8
|
import { getQuality } from '../../../config/quality.js';
|
|
@@ -35,11 +18,7 @@ import {
|
|
|
35
18
|
} from '../../ticketing.js';
|
|
36
19
|
|
|
37
20
|
/**
|
|
38
|
-
*
|
|
39
|
-
* inside the worktree (or main checkout when no worktree exists). On
|
|
40
|
-
* failure, post a friction comment, flip the Story to `agent::blocked`,
|
|
41
|
-
* and throw so the caller fails non-zero. The `--skip-sync` flag is
|
|
42
|
-
* handled by the caller; this function assumes the sync is desired.
|
|
21
|
+
* `--skip-sync` is the caller's concern.
|
|
43
22
|
*
|
|
44
23
|
* @param {{
|
|
45
24
|
* cwd: string,
|
|
@@ -109,10 +88,7 @@ export async function runBaseSyncPhase({
|
|
|
109
88
|
}
|
|
110
89
|
|
|
111
90
|
/**
|
|
112
|
-
* The CRAP scoring scope, or `[]` when
|
|
113
|
-
* the warning below fall back to naming the capture stamp unconditionally —
|
|
114
|
-
* the pre-#5278 wording — because an unresolvable scope is no evidence that
|
|
115
|
-
* the stamp survived.
|
|
91
|
+
* The CRAP scoring scope, or `[]` when unresolvable.
|
|
116
92
|
*
|
|
117
93
|
* @param {typeof resolveConfig} resolveConfigImpl
|
|
118
94
|
* @param {string} cwd
|
|
@@ -126,37 +102,13 @@ function resolveCrapTargetDirs(resolveConfigImpl, cwd) {
|
|
|
126
102
|
}
|
|
127
103
|
}
|
|
128
104
|
|
|
129
|
-
/**
|
|
130
|
-
* How many changed paths the warning names before it stops listing.
|
|
131
|
-
* Enough to recognise the change set; short enough that the warning still
|
|
132
|
-
* reads as a warning rather than as a diff.
|
|
133
|
-
*/
|
|
134
105
|
const WARNED_PATH_LIMIT = 12;
|
|
135
106
|
|
|
136
107
|
/**
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
*
|
|
141
|
-
* on the tree (lint, typecheck) and one full-suite capture stamp keyed on the
|
|
142
|
-
* content of `crap.targetDirs`. This sync runs after that, and the two are
|
|
143
|
-
* spent on different conditions — which is why #5267's single blanket
|
|
144
|
-
* sentence was wrong half the time:
|
|
145
|
-
*
|
|
146
|
-
* - **Gate evidence** is spent by any tracked path at all, because the tree
|
|
147
|
-
* hash it is keyed on moves with the first byte.
|
|
148
|
-
* - **The capture stamp** is spent only when a merged path lands under
|
|
149
|
-
* `crap.targetDirs`. A sync that brings in docs, workflows or CI config
|
|
150
|
-
* leaves it perfectly valid, and announcing it as spent taught operators
|
|
151
|
-
* to expect a second full suite that close was never going to run.
|
|
152
|
-
*
|
|
153
|
-
* Quiet by construction on the outcome that cannot spend either: a
|
|
154
|
-
* `noop-already-current` sync never touched the tree. A content-changing
|
|
155
|
-
* fast-forward DOES warn — it moves the tree exactly as a merge commit does,
|
|
156
|
-
* and staying quiet there would be a lie of omission.
|
|
157
|
-
*
|
|
158
|
-
* Pure. Module-private: the phase is the seam tests drive it through
|
|
159
|
-
* (`injectedSync` + a `progress` spy), so it needs no export of its own.
|
|
108
|
+
* Warn that the sync spent pre-push credit, or `[]` when it changed nothing.
|
|
109
|
+
* Gate evidence is keyed on the tree, so any tracked path spends it; the
|
|
110
|
+
* full-suite capture stamp is spent only by a path under `crap.targetDirs`.
|
|
111
|
+
* A content-changing fast-forward warns just as a merge does.
|
|
160
112
|
*
|
|
161
113
|
* @param {{ baseBranch: string, result: { kind?: string, changedPaths?: string[] }, targetDirs?: string[] }} args
|
|
162
114
|
* @returns {string[]} Progress lines, in order. Empty when nothing changed.
|
|
@@ -167,8 +119,7 @@ function buildStampInvalidatedWarning({ baseBranch, result, targetDirs }) {
|
|
|
167
119
|
: [];
|
|
168
120
|
if (changed.length === 0) return [];
|
|
169
121
|
const dirs = Array.isArray(targetDirs) ? targetDirs : [];
|
|
170
|
-
// An unresolvable scope
|
|
171
|
-
// closed to the unconditional wording.
|
|
122
|
+
// An unresolvable scope cannot prove the stamp survived: fail closed.
|
|
172
123
|
const scored =
|
|
173
124
|
dirs.length === 0 ? changed : filterFilesUnderTargets(changed, dirs);
|
|
174
125
|
const shown = changed.slice(0, WARNED_PATH_LIMIT);
|
|
@@ -191,8 +142,7 @@ function buildStampInvalidatedWarning({ baseBranch, result, targetDirs }) {
|
|
|
191
142
|
}
|
|
192
143
|
|
|
193
144
|
/**
|
|
194
|
-
* Post a `friction`
|
|
195
|
-
* and transition the Story to `agent::blocked`. Exported for testing.
|
|
145
|
+
* Post a `friction` comment and block the Story; both best-effort.
|
|
196
146
|
*
|
|
197
147
|
* @param {{
|
|
198
148
|
* provider: object,
|
|
@@ -224,10 +174,8 @@ export async function handleSyncFailure({
|
|
|
224
174
|
result,
|
|
225
175
|
});
|
|
226
176
|
|
|
227
|
-
//
|
|
228
|
-
//
|
|
229
|
-
// we never want a notification-side failure to mask the real reason
|
|
230
|
-
// close threw.
|
|
177
|
+
// Comment first so the recovery surface lands even if the flip fails; a
|
|
178
|
+
// notification failure must never mask why close threw.
|
|
231
179
|
try {
|
|
232
180
|
await upsertStructuredComment(provider, storyId, 'friction', body);
|
|
233
181
|
progress('SYNC', `📝 Posted friction comment on #${storyId}.`);
|
|
@@ -237,9 +185,7 @@ export async function handleSyncFailure({
|
|
|
237
185
|
);
|
|
238
186
|
}
|
|
239
187
|
|
|
240
|
-
//
|
|
241
|
-
// `provider.updateTicket` skips the Projects v2 column sync (Story
|
|
242
|
-
// #2548) and strands the board on the Story's prior status.
|
|
188
|
+
// The canonical mutator: a bare label write skips the Projects v2 sync.
|
|
243
189
|
try {
|
|
244
190
|
await transitionTicketState(provider, storyId, STATE_LABELS.BLOCKED, {});
|
|
245
191
|
progress('SYNC', `🚧 Flipped Story #${storyId} → ${AGENT_LABELS.BLOCKED}.`);
|
|
@@ -251,17 +197,9 @@ export async function handleSyncFailure({
|
|
|
251
197
|
}
|
|
252
198
|
|
|
253
199
|
/**
|
|
254
|
-
*
|
|
255
|
-
*
|
|
256
|
-
*
|
|
257
|
-
* Story #4891 — `baseConfirmed` gates the merge-the-base recovery block, and
|
|
258
|
-
* defaults to `false` so it fails closed. Telling the operator to run
|
|
259
|
-
* `git merge origin/<baseBranch>` is actively harmful when `<baseBranch>` is
|
|
260
|
-
* not the base the Story was seeded from: it permanently contaminates the
|
|
261
|
-
* branch and its PR diff with an unrelated base. Close confirms the base
|
|
262
|
-
* against the run's init receipt before that advice is emitted; when
|
|
263
|
-
* it could not (receipt absent, unreadable, or unpinned), the operator is
|
|
264
|
-
* told to establish the real base first instead.
|
|
200
|
+
* `baseConfirmed` (default false, fail-closed) gates the merge-the-base
|
|
201
|
+
* advice: merging a base the Story was not seeded from contaminates the
|
|
202
|
+
* branch and PR diff, so an unconfirmed base gets "establish it first".
|
|
265
203
|
*
|
|
266
204
|
* @param {{ storyId: number, storyBranch: string, baseBranch: string, baseConfirmed?: boolean, syncCwd: string, result: { kind: string, conflictFiles?: string[], stderr?: string } }} args
|
|
267
205
|
* @returns {string}
|
|
@@ -1,69 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* phases/close-validation.js —
|
|
3
|
-
* chain for a standalone Story.
|
|
2
|
+
* phases/close-validation.js — the close-validation gate chain for a Story.
|
|
4
3
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* parent Epic, so they cannot scope a `validation-evidence.json` under a
|
|
11
|
-
* `temp/run-<id>/` tree. Rather than feed a null `epicId` into the
|
|
12
|
-
* Epic-keyed path (which structurally disabled the evidence cache and
|
|
13
|
-
* forced every re-run — base-sync conflict, review remediation, baseline
|
|
14
|
-
* absorb — to re-execute ALL gates including the coverage suite), the
|
|
15
|
-
* standalone close now passes `standalone: true`. `runCloseValidation`
|
|
16
|
-
* then anchors the cache on the Story id alone at
|
|
17
|
-
* `temp/standalone/stories/story-<id>/validation-evidence.json`, so a
|
|
18
|
-
* second close at unchanged HEAD short-circuits the already-passed gates.
|
|
19
|
-
*
|
|
20
|
-
* Pre-gate self-heal (Stories #4250, #5224). Two best-effort steps run on the
|
|
21
|
-
* Story branch before the check-only gates score it — the scoped format
|
|
22
|
-
* autofix and the upward maintainability write-back — so whatever they commit
|
|
23
|
-
* is part of what the gates see and part of the branch's own PR. Both live in
|
|
24
|
-
* [`pre-gate-steps.js`](pre-gate-steps.js); neither can fail a close, because
|
|
25
|
-
* an authoritative gate for each runs immediately below.
|
|
26
|
-
*
|
|
27
|
-
* Bounded gate output (Story #4736). Every gate line goes to the run's
|
|
28
|
-
* `gate-log.js` sink — an artifact under the gitignored temp tree — instead
|
|
29
|
-
* of straight to the agent's stdout, where a passing `npm test` alone once
|
|
30
|
-
* pushed a successful close past the host's inline tool-result ceiling. A
|
|
31
|
-
* clean run reports one digest line naming the artifact; a failing gate
|
|
32
|
-
* replays its captured tail inline, because that is exactly when the caller
|
|
33
|
-
* needs the evidence in front of them. `AGENT_LOG_LEVEL=verbose` restores
|
|
34
|
-
* live streaming.
|
|
35
|
-
*
|
|
36
|
-
* Projection advisories (Story #4776). `baseBranch`, `storyBranch` and the
|
|
37
|
-
* resolved `config` are forwarded to `runCloseValidation` so its projection
|
|
38
|
-
* phase can run. They surface, after the gates pass, which committed
|
|
39
|
-
* baseline rows the post-merge tree would breach and the exact
|
|
40
|
-
* `*:update` + `baseline-refresh:` remedy — advisory only, so the close
|
|
41
|
-
* verdict is unchanged.
|
|
42
|
-
*
|
|
43
|
-
* `runCloseValidation`, `buildDefaultGates` and the pre-gate steps (whole, or
|
|
44
|
-
* their two individual collaborators) are accepted as injected dependencies so
|
|
45
|
-
* the parent CLI's cache-busted bindings win in tests that mock the upstream
|
|
46
|
-
* module URLs.
|
|
4
|
+
* Gate output goes to an artifact sink (inline output once overflowed the
|
|
5
|
+
* host's tool-result ceiling): a pass reports one digest line, a failure
|
|
6
|
+
* replays its tail inline. Full-suite lock-wait lines are also teed to
|
|
7
|
+
* `progress()` so a long wait doesn't read as a hang, and an expired wait
|
|
8
|
+
* defers to `pending` rather than failing.
|
|
47
9
|
*/
|
|
48
10
|
|
|
49
11
|
import { buildDefaultGates as defaultBuildDefaultGates } from '../../../close-validation/gates.js';
|
|
50
12
|
import { runCloseValidation as defaultRunCloseValidation } from '../../../close-validation/runner.js';
|
|
13
|
+
import { LOCK_WAIT_EXPIRED_EXIT_CODE } from '../../../full-suite-lock.js';
|
|
14
|
+
import { parseLockWaitOutcome } from '../../../full-suite-queue.js';
|
|
51
15
|
import { createGateLogSink as defaultCreateGateLogSink } from '../gate-log.js';
|
|
52
16
|
import { runPreGateSteps as defaultRunPreGateSteps } from './pre-gate-steps.js';
|
|
53
17
|
|
|
54
18
|
/**
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
* Order: pre-gate self-heal steps → close-validation gates. The steps scope
|
|
58
|
-
* to the `baseBranch...storyBranch` diff, commit inside the Story worktree,
|
|
59
|
-
* and are best-effort — a missing `storyBranch` (resume/legacy callers) skips
|
|
60
|
-
* them with a log line rather than failing.
|
|
61
|
-
*
|
|
62
|
-
* Gates are built from the canonical resolved config (`buildDefaultGates`
|
|
63
|
-
* reads `project.commands` and `delivery.quality.gates.crap.enabled`); the
|
|
64
|
-
* `baseBranch` is forwarded as the gate `baseBranch` so the format gate's
|
|
65
|
-
* changed-file scope anchors on it. `standalone: true` routes the evidence
|
|
66
|
-
* cache to the storyId-anchored keyspace.
|
|
19
|
+
* Pre-gate self-heal steps, then the gates (throws on first failure). The
|
|
20
|
+
* steps commit in the worktree before scoring, so the gates see their output.
|
|
67
21
|
*
|
|
68
22
|
* @param {{
|
|
69
23
|
* cwd: string,
|
|
@@ -81,10 +35,12 @@ import { runPreGateSteps as defaultRunPreGateSteps } from './pre-gate-steps.js';
|
|
|
81
35
|
* runContextBudgetWriteback?: Function,
|
|
82
36
|
* createGateLogSink?: typeof defaultCreateGateLogSink,
|
|
83
37
|
* }} args
|
|
84
|
-
* @returns {Promise<{
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
38
|
+
* @returns {Promise<{
|
|
39
|
+
* gates: Record<string, 'passed'|'skipped'>|null,
|
|
40
|
+
* lockWait: { waitedSeconds: number, expired: boolean }|null,
|
|
41
|
+
* pending: boolean,
|
|
42
|
+
* }>} `pending` (with `gates: null`) when a lock wait expired; any other
|
|
43
|
+
* failure throws with `err.closeGate` naming the gate.
|
|
88
44
|
*/
|
|
89
45
|
export async function runCloseValidationPhase({
|
|
90
46
|
cwd,
|
|
@@ -119,15 +75,15 @@ export async function runCloseValidationPhase({
|
|
|
119
75
|
'VALIDATE',
|
|
120
76
|
`Running close-validation gates against baseline ${baseBranch}${worktreePath ? ` in ${worktreePath}` : ''}...`,
|
|
121
77
|
);
|
|
122
|
-
//
|
|
123
|
-
// execution), so nothing in the chain can route around the artifact.
|
|
78
|
+
// One sink for both `log` seams so nothing routes around the artifact.
|
|
124
79
|
const gateLog = createGateLogSink({ storyId, config });
|
|
80
|
+
const lockWaits = trackLockWaits({ sink: gateLog.log, progress });
|
|
125
81
|
const gateList = buildDefaultGates({
|
|
126
82
|
config,
|
|
127
83
|
baseBranch,
|
|
128
84
|
cwd: worktreePath || cwd,
|
|
129
85
|
log: gateLog.log,
|
|
130
|
-
storyId,
|
|
86
|
+
storyId,
|
|
131
87
|
evidenceCwd: cwd,
|
|
132
88
|
});
|
|
133
89
|
let validation;
|
|
@@ -136,57 +92,107 @@ export async function runCloseValidationPhase({
|
|
|
136
92
|
cwd,
|
|
137
93
|
worktreePath,
|
|
138
94
|
gates: gateList,
|
|
139
|
-
log:
|
|
95
|
+
log: lockWaits.log,
|
|
140
96
|
storyId,
|
|
141
|
-
// Story
|
|
142
|
-
//
|
|
143
|
-
// temp/standalone/stories/story-<id>/validation-evidence.json.
|
|
97
|
+
// Anchors the evidence cache on the Story id, so a re-close at an
|
|
98
|
+
// unchanged HEAD skips already-passed gates.
|
|
144
99
|
standalone: true,
|
|
145
|
-
//
|
|
146
|
-
// projections need. Without them the runner skips the projection
|
|
147
|
-
// phase entirely, which is the correct behaviour for resume/legacy
|
|
148
|
-
// callers that have no story branch to diff.
|
|
100
|
+
// Needed for the advisory baseline projections; absent, they're skipped.
|
|
149
101
|
baseBranch,
|
|
150
102
|
storyBranch,
|
|
151
103
|
config,
|
|
104
|
+
deferOnLockExpiry: true,
|
|
152
105
|
});
|
|
153
106
|
} finally {
|
|
154
|
-
//
|
|
155
|
-
//
|
|
156
|
-
// reads it, replays from it, or reports its path — including on the throw
|
|
157
|
-
// path, where the artifact is the only surviving record.
|
|
107
|
+
// The sink is async-buffered; settle it before anything reads it, on
|
|
108
|
+
// the throw path too.
|
|
158
109
|
await gateLog.flush();
|
|
159
110
|
}
|
|
111
|
+
const lockWait = lockWaits.summary();
|
|
160
112
|
if (!validation.ok) {
|
|
161
|
-
|
|
162
|
-
const { gate, status, cwd: gateCwd } = first;
|
|
163
|
-
// The evidence is the point on this path: replay the captured tail inline
|
|
164
|
-
// rather than making the caller open a file to learn why close stopped.
|
|
165
|
-
gateLog.replay();
|
|
166
|
-
const err = new Error(
|
|
167
|
-
`[single-story-close] Gate failed: ${gate.name} (exit ${status})${gateCwd ? ` in ${gateCwd}` : ''}.` +
|
|
168
|
-
(gate.hint ? ` ${gate.hint}` : ''),
|
|
169
|
-
);
|
|
170
|
-
// Story #5172 — the phase tracker tags `closePhase`; this tags WHICH gate
|
|
171
|
-
// inside the phase died, so the failed terminal can name the split
|
|
172
|
-
// baselines entry rather than reporting a generic validation failure.
|
|
173
|
-
err.closeGate = gate.name;
|
|
174
|
-
throw err;
|
|
113
|
+
return settleFailedValidation({ validation, lockWait, gateLog, progress });
|
|
175
114
|
}
|
|
176
115
|
progress('VALIDATE', `✅ All gates passed. ${gateLog.digest()}`);
|
|
177
|
-
return {
|
|
116
|
+
return {
|
|
117
|
+
gates: gateOutcomes(gateList, validation),
|
|
118
|
+
lockWait,
|
|
119
|
+
pending: false,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Deferred on an expired lock wait → `pending`; otherwise throws.
|
|
125
|
+
*
|
|
126
|
+
* @param {{
|
|
127
|
+
* validation: { failed: Array<{ gate: { name: string, hint?: string }, status: number, cwd?: string }> },
|
|
128
|
+
* lockWait: { waitedSeconds: number, expired: boolean }|null,
|
|
129
|
+
* gateLog: { replay: () => void },
|
|
130
|
+
* progress: (tag: string, msg: string) => void,
|
|
131
|
+
* }} args
|
|
132
|
+
* @returns {{ gates: null, lockWait: object, pending: true }}
|
|
133
|
+
*/
|
|
134
|
+
function settleFailedValidation({ validation, lockWait, gateLog, progress }) {
|
|
135
|
+
const [first] = validation.failed;
|
|
136
|
+
const { gate, status, cwd: gateCwd } = first;
|
|
137
|
+
if (isDeferredLockWait(first, lockWait)) {
|
|
138
|
+
progress(
|
|
139
|
+
'VALIDATE',
|
|
140
|
+
`⏸ ${gate.name} deferred: the full-suite lock wait expired after ${lockWait.waitedSeconds}s. Nothing was spawned; close will report pending.`,
|
|
141
|
+
);
|
|
142
|
+
return { gates: null, lockWait, pending: true };
|
|
143
|
+
}
|
|
144
|
+
gateLog.replay();
|
|
145
|
+
const err = new Error(
|
|
146
|
+
`[single-story-close] Gate failed: ${gate.name} (exit ${status})${gateCwd ? ` in ${gateCwd}` : ''}.` +
|
|
147
|
+
(gate.hint ? ` ${gate.hint}` : ''),
|
|
148
|
+
);
|
|
149
|
+
err.closeGate = gate.name;
|
|
150
|
+
throw err;
|
|
178
151
|
}
|
|
179
152
|
|
|
180
153
|
/**
|
|
181
|
-
*
|
|
154
|
+
* Parsed from the gate log because it is the one place that sees waits both
|
|
155
|
+
* in-process and in gate children.
|
|
182
156
|
*
|
|
183
|
-
*
|
|
184
|
-
*
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
157
|
+
* @param {{ sink: (m: string) => void, progress: (tag: string, msg: string) => void }} args
|
|
158
|
+
* @returns {{ log: (m: string) => void, summary: () => { waitedSeconds: number, expired: boolean }|null }}
|
|
159
|
+
*/
|
|
160
|
+
function trackLockWaits({ sink, progress }) {
|
|
161
|
+
let tally = null;
|
|
162
|
+
return {
|
|
163
|
+
log(line) {
|
|
164
|
+
sink(line);
|
|
165
|
+
if (!String(line).includes('[full-suite-lock]')) return;
|
|
166
|
+
progress('LOCK', line);
|
|
167
|
+
const outcome = parseLockWaitOutcome(line);
|
|
168
|
+
if (!outcome) return;
|
|
169
|
+
tally = {
|
|
170
|
+
waitedSeconds: (tally?.waitedSeconds ?? 0) + outcome.waitedSeconds,
|
|
171
|
+
expired: Boolean(tally?.expired) || outcome.expired,
|
|
172
|
+
};
|
|
173
|
+
},
|
|
174
|
+
summary: () => tally,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Needs both the exit code and a recorded expiry — either alone is ambiguous.
|
|
180
|
+
*
|
|
181
|
+
* @param {{ status: number }|undefined} failure
|
|
182
|
+
* @param {{ expired: boolean }|null} lockWait
|
|
183
|
+
* @returns {boolean}
|
|
184
|
+
*/
|
|
185
|
+
function isDeferredLockWait(failure, lockWait) {
|
|
186
|
+
return (
|
|
187
|
+
failure?.status === LOCK_WAIT_EXPIRED_EXIT_CODE &&
|
|
188
|
+
lockWait?.expired === true
|
|
189
|
+
);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* A gate that did not run this invocation reports `skipped`, never `passed`.
|
|
188
194
|
*
|
|
189
|
-
* @param {Array<{ name: string }>} gateList
|
|
195
|
+
* @param {Array<{ name: string }>} gateList
|
|
190
196
|
* @param {{ skipped?: Array<{ gate: { name: string } }> }} validation
|
|
191
197
|
* @returns {Record<string, 'passed'|'skipped'>}
|
|
192
198
|
*/
|
|
@@ -1,38 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* phases/code-review.js — Story-scope code review
|
|
3
|
-
*
|
|
2
|
+
* phases/code-review.js — Story-scope code review: findings post to the PR,
|
|
3
|
+
* with a cross-reference on the Story issue. Critical findings return
|
|
4
|
+
* `halted: true` so the caller never arms auto-merge.
|
|
4
5
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* review comment. The render header still labels the comment "Story #N"
|
|
9
|
-
* even though the post target is the PR — the PR is the comment surface,
|
|
10
|
-
* the Story is the ticket the findings *describe*.
|
|
11
|
-
*
|
|
12
|
-
* Cross-reference URL shape: GitHub serves issue comments at
|
|
13
|
-
* `<prUrl>#issuecomment-<commentId>` — the same URL pattern for PR
|
|
14
|
-
* conversation comments and issue comments, because PRs are issues at
|
|
15
|
-
* the API level.
|
|
16
|
-
*
|
|
17
|
-
* Re-exports `parsePrNumber` (delegates to `lib/github-url.js`) so
|
|
18
|
-
* existing call sites need not change. Story #3649.
|
|
19
|
-
*
|
|
20
|
-
* Critical findings cause `runStoryScopeReview` to return `halted: true`;
|
|
21
|
-
* the caller raises that to a thrown error so auto-merge is not enabled.
|
|
22
|
-
*
|
|
23
|
-
* Delegates the `runCodeReview` invocation to `runStoryReviewCore`
|
|
24
|
-
* (exported from `story-close/phases/review-core.js`) so the close path
|
|
25
|
-
* shares a single invocation pattern (Story #3653). Review depth needs no
|
|
26
|
-
* input here: it is derived from this Story's own diff inside `runCodeReview`
|
|
27
|
-
* (Story #4542).
|
|
28
|
-
*
|
|
29
|
-
* Story #5325 — this phase boundary is where the base ref is resolved, once.
|
|
30
|
-
* The resolved ref threads into `runStoryReviewCore`, which hands it to both
|
|
31
|
-
* the change-set enumeration (and through it the provider review) and the
|
|
32
|
-
* local lens pass, so one resolution corrects both arms. It resolves to
|
|
33
|
-
* `origin/<baseBranch>` — the ref base-sync merged from — rather than the bare
|
|
34
|
-
* branch name git would resolve to the local `refs/heads/<baseBranch>`, whose
|
|
35
|
-
* drift would otherwise be scored as this Story's own change.
|
|
6
|
+
* The base ref is resolved once, here, to `origin/<baseBranch>` (what
|
|
7
|
+
* base-sync merged from) — the local branch's drift would otherwise be
|
|
8
|
+
* scored as this Story's change.
|
|
36
9
|
*/
|
|
37
10
|
|
|
38
11
|
import { parsePrNumberFromUrl } from '../../../github-url.js';
|
|
@@ -49,23 +22,12 @@ import {
|
|
|
49
22
|
} from './review-outcome.js';
|
|
50
23
|
|
|
51
24
|
/**
|
|
52
|
-
* Extract the numeric PR ID from a `gh pr create` URL. The CLI returns a
|
|
53
|
-
* URL like `https://github.com/<owner>/<repo>/pull/<n>`; we want `<n>`.
|
|
54
|
-
* Returns `null` when the URL doesn't match. Exported for testing.
|
|
55
|
-
*
|
|
56
|
-
* Delegates to `parsePrNumberFromUrl` in `lib/github-url.js`.
|
|
57
|
-
* Re-exported under the original name so existing call sites and tests
|
|
58
|
-
* do not need to change. Story #3649.
|
|
59
|
-
*
|
|
60
25
|
* @param {string|null|undefined} prUrl
|
|
61
26
|
* @returns {number|null}
|
|
62
27
|
*/
|
|
63
28
|
export const parsePrNumber = parsePrNumberFromUrl;
|
|
64
29
|
|
|
65
30
|
/**
|
|
66
|
-
* Build the cross-reference comment body posted on the Story issue when
|
|
67
|
-
* the PR-side review comment lands. Pure; exported for testing.
|
|
68
|
-
*
|
|
69
31
|
* @param {{
|
|
70
32
|
* prUrl: string,
|
|
71
33
|
* prNumber: number,
|
|
@@ -109,9 +71,6 @@ async function invokeStoryReviewCore({
|
|
|
109
71
|
progressTag: 'REVIEW',
|
|
110
72
|
runCodeReviewFn,
|
|
111
73
|
gitSpawnFn,
|
|
112
|
-
// Forward the seams only when the caller injects them; otherwise
|
|
113
|
-
// `runStoryReviewCore` uses its defaults. `undefined` deep-merges to
|
|
114
|
-
// the default via the destructuring default there.
|
|
115
74
|
...(runLocalLensReviewFn ? { runLocalLensReviewFn } : {}),
|
|
116
75
|
...(appendFindingsYieldFn ? { appendFindingsYieldFn } : {}),
|
|
117
76
|
});
|
|
@@ -160,21 +119,8 @@ async function postStoryReviewCrossRef({
|
|
|
160
119
|
}
|
|
161
120
|
|
|
162
121
|
/**
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
* on the Story issue linking back to the PR review comment.
|
|
166
|
-
*
|
|
167
|
-
* Failure modes:
|
|
168
|
-
* - When `prNumber` is null (couldn't parse), the review is skipped
|
|
169
|
-
* and the function returns `{ halted: false, skipped: true }`.
|
|
170
|
-
* - When `origin/<baseBranch>` cannot be resolved, the review is skipped,
|
|
171
|
-
* a `base-ref-resolution` degradation is recorded on the returned
|
|
172
|
-
* envelope, and no findings are raised (Story #5325).
|
|
173
|
-
* - When the runner throws, the close fails non-zero (the throw
|
|
174
|
-
* propagates) — a Story-scope review failure is not silently
|
|
175
|
-
* ignored.
|
|
176
|
-
*
|
|
177
|
-
* Exported for testing.
|
|
122
|
+
* Skips on an unparseable PR number or an unresolvable base (recording a
|
|
123
|
+
* degradation); a runner throw propagates and fails the close.
|
|
178
124
|
*
|
|
179
125
|
* @param {{
|
|
180
126
|
* cwd: string,
|
|
@@ -224,8 +170,6 @@ export async function runStoryScopeReview({
|
|
|
224
170
|
return { halted: false, skipped: true };
|
|
225
171
|
}
|
|
226
172
|
|
|
227
|
-
// One resolution per close, at the phase boundary: `baseRef` threads from
|
|
228
|
-
// here into the change set, the provider review and the local lens pass.
|
|
229
173
|
const base = resolveSharedBaseRef({ baseBranch, cwd, gitSpawnFn });
|
|
230
174
|
if (!base.resolved) {
|
|
231
175
|
return unresolvedBaseReviewOutcome({
|