mandrel 2.60.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 +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/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 +83 -239
- 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 +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 +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 +25 -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,12 +1,7 @@
|
|
|
1
1
|
import { parseArgs } from 'node:util';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
* coerces to a positive integer, and returns `null` for anything invalid.
|
|
6
|
-
*
|
|
7
|
-
* Shared by every CLI that accepts `--epic`, `--story`, `--task`, `--recut-of`,
|
|
8
|
-
* or a ticket positional, so the `Number.parseInt(..., 10)` + `# ` prefix dance lives
|
|
9
|
-
* in exactly one place.
|
|
4
|
+
* Positive integer with an optional leading `#`; `null` when invalid.
|
|
10
5
|
*
|
|
11
6
|
* @param {string|number|null|undefined} value
|
|
12
7
|
* @returns {number|null}
|
|
@@ -21,10 +16,7 @@ export function parseTicketId(value) {
|
|
|
21
16
|
}
|
|
22
17
|
|
|
23
18
|
/**
|
|
24
|
-
*
|
|
25
|
-
* a real boolean. Under `strict: false`, `--flag=true` / `--flag=false` arrive
|
|
26
|
-
* here as the literal strings `'true'` / `'false'`, while bare `--flag` lands
|
|
27
|
-
* as `true`. Absence yields `undefined`, which collapses to `false`.
|
|
19
|
+
* Under `strict: false`, `--flag=false` arrives as the string `'false'`.
|
|
28
20
|
*
|
|
29
21
|
* @param {boolean|string|null|undefined} value
|
|
30
22
|
* @returns {boolean}
|
|
@@ -47,11 +39,8 @@ function optionalBooleanFlag(value) {
|
|
|
47
39
|
}
|
|
48
40
|
|
|
49
41
|
/**
|
|
50
|
-
*
|
|
51
|
-
* absent
|
|
52
|
-
* from an explicit value. A non-numeric or non-positive value is treated as
|
|
53
|
-
* absent rather than coerced to 0 — a `--max-wait-seconds=abc` typo must not
|
|
54
|
-
* silently become a zero-second wait.
|
|
42
|
+
* `undefined` when absent (caller falls back to config). Junk is treated as
|
|
43
|
+
* absent, never coerced to 0.
|
|
55
44
|
*
|
|
56
45
|
* @param {unknown} value
|
|
57
46
|
* @returns {number|undefined}
|
|
@@ -63,11 +52,7 @@ function parsePositiveInt(value) {
|
|
|
63
52
|
}
|
|
64
53
|
|
|
65
54
|
/**
|
|
66
|
-
*
|
|
67
|
-
* `--rerun-advisory 0` is an explicit "spend nothing", not an absent flag.
|
|
68
|
-
* A negative or non-numeric value is still treated as absent rather than
|
|
69
|
-
* coerced, so a typo falls back to the config default instead of inventing an
|
|
70
|
-
* allowance that spends the consumer's CI minutes.
|
|
55
|
+
* As {@link parsePositiveInt}, for a flag whose zero is meaningful.
|
|
71
56
|
*
|
|
72
57
|
* @param {unknown} value
|
|
73
58
|
* @returns {number|undefined}
|
|
@@ -78,22 +63,11 @@ function parseNonNegativeInt(value) {
|
|
|
78
63
|
return Number.isInteger(parsed) && parsed >= 0 ? parsed : undefined;
|
|
79
64
|
}
|
|
80
65
|
|
|
81
|
-
/** The only two merge-watch postures `--merge-watch-mode` accepts. */
|
|
82
66
|
const MERGE_WATCH_MODES = ['sync', 'async'];
|
|
83
67
|
|
|
84
68
|
/**
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
* caller can distinguish "not supplied" (fall back to config) from an explicit
|
|
88
|
-
* posture — the same contract {@link parsePositiveInt} gives
|
|
89
|
-
* `--max-wait-seconds`.
|
|
90
|
-
*
|
|
91
|
-
* Unlike that sibling, an unrecognized value **throws** rather than degrading
|
|
92
|
-
* to absent. A `--max-wait-seconds` typo falls back to a sane bound; a
|
|
93
|
-
* `--merge-watch-mode` typo would fall back to `sync` and silently return a
|
|
94
|
-
* multi-Story run to a serialized foreground wait per close, with the wall
|
|
95
|
-
* clock as the only evidence. Parsing runs before the first close phase, so
|
|
96
|
-
* failing here costs no mutation.
|
|
69
|
+
* `undefined` when absent. An unrecognized value throws: degrading to `sync`
|
|
70
|
+
* would silently serialize a multi-Story run. Runs before any mutation.
|
|
97
71
|
*
|
|
98
72
|
* @param {unknown} value
|
|
99
73
|
* @returns {'sync'|'async'|undefined}
|
|
@@ -108,11 +82,7 @@ export function parseMergeWatchMode(value) {
|
|
|
108
82
|
}
|
|
109
83
|
|
|
110
84
|
/**
|
|
111
|
-
*
|
|
112
|
-
* throwing — how the tolerant parse below treats a flag that failed
|
|
113
|
-
* validation. Reporting `undefined` is safe there and only there, because a
|
|
114
|
-
* tolerant parse never drives a pipeline: its caller surfaces the rejection
|
|
115
|
-
* as the run's failure and runs no phase at all.
|
|
85
|
+
* Non-throwing variant; safe only because a tolerant parse runs no phase.
|
|
116
86
|
*
|
|
117
87
|
* @param {unknown} value
|
|
118
88
|
* @returns {'sync'|'async'|undefined}
|
|
@@ -125,25 +95,13 @@ function tolerantMergeWatchMode(value) {
|
|
|
125
95
|
}
|
|
126
96
|
}
|
|
127
97
|
|
|
128
|
-
/**
|
|
129
|
-
* Shortest override reason that can plausibly name a rejected finding. Below
|
|
130
|
-
* this, the flag is being used to silence the gate rather than to record a
|
|
131
|
-
* judgement, which is the failure mode the reason requirement exists to stop.
|
|
132
|
-
*/
|
|
98
|
+
/** Shorter than this, the reason silences the gate rather than records why. */
|
|
133
99
|
const MIN_OVERRIDE_REASON_LENGTH = 12;
|
|
134
100
|
|
|
135
101
|
/**
|
|
136
|
-
*
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
* The reason is **mandatory and validated**, because the alternative it
|
|
140
|
-
* replaces is not "no override" but `gh pr merge` run by hand: before this
|
|
141
|
-
* flag, a review blocker the operator had reviewed and rejected left bypassing
|
|
142
|
-
* the gate entirely as the only way to land, and that bypass wrote nothing
|
|
143
|
-
* down anywhere. An override that records why is strictly more auditable than
|
|
144
|
-
* the hand-merge it displaces; an override that records nothing is not, so a
|
|
145
|
-
* bare or blank `--override-review-block` fails closed here — before any phase
|
|
146
|
-
* runs, at no mutation cost — rather than arming a silent one.
|
|
102
|
+
* The logged override of a code-review critical blocker. The reason is
|
|
103
|
+
* mandatory: a bare flag throws before any phase rather than arming a silent
|
|
104
|
+
* override.
|
|
147
105
|
*
|
|
148
106
|
* @param {unknown} value
|
|
149
107
|
* @returns {string|undefined} the trimmed reason, or `undefined` when absent.
|
|
@@ -162,10 +120,7 @@ export function parseOverrideReviewBlock(value) {
|
|
|
162
120
|
}
|
|
163
121
|
|
|
164
122
|
/**
|
|
165
|
-
* {@link
|
|
166
|
-
* the tolerant reporting parse. Same contract as
|
|
167
|
-
* {@link tolerantMergeWatchMode}: safe only because a tolerant parse runs no
|
|
168
|
-
* phase.
|
|
123
|
+
* Non-throwing variant, as {@link tolerantMergeWatchMode}.
|
|
169
124
|
*
|
|
170
125
|
* @param {unknown} value
|
|
171
126
|
* @returns {string|undefined}
|
|
@@ -179,13 +134,8 @@ function tolerantOverrideReviewBlock(value) {
|
|
|
179
134
|
}
|
|
180
135
|
|
|
181
136
|
/**
|
|
182
|
-
*
|
|
183
|
-
*
|
|
184
|
-
*
|
|
185
|
-
* Throws when a *validating* parser rejects a flag value (currently only
|
|
186
|
-
* `--merge-watch-mode`). Callers that must not throw — an error handler
|
|
187
|
-
* needing `storyId` to report an envelope — use {@link parseSprintArgsTolerant}
|
|
188
|
-
* rather than calling this a second time inside their own catch.
|
|
137
|
+
* Throws when a validating flag parser rejects a value; error handlers use
|
|
138
|
+
* {@link parseSprintArgsTolerant} instead of re-calling this.
|
|
189
139
|
*
|
|
190
140
|
* @param {string[]} args Array of arguments (defaults to process.argv)
|
|
191
141
|
* @param {{ tolerant?: boolean }} [options] `tolerant` degrades a rejected
|
|
@@ -209,21 +159,10 @@ export function parseSprintArgs(
|
|
|
209
159
|
// No default — absent means "use delivery.routing.closeAndLand".
|
|
210
160
|
'wait-merge': { type: 'boolean' },
|
|
211
161
|
'no-wait-merge': { type: 'boolean', default: false },
|
|
212
|
-
//
|
|
213
|
-
// (the merge wait's per-invocation bound). Absent means "use the config".
|
|
162
|
+
// The next three override `delivery.*` config when present.
|
|
214
163
|
'max-wait-seconds': { type: 'string' },
|
|
215
|
-
// Story #4949 — per-invocation override of `delivery.mergeWatch.mode`.
|
|
216
|
-
// Absent means "use the config"; see `parseMergeWatchMode` for why an
|
|
217
|
-
// unrecognized value fails closed instead of degrading to absent.
|
|
218
164
|
'merge-watch-mode': { type: 'string' },
|
|
219
|
-
// Story #5266 — per-invocation override of `delivery.ci.rerunAdvisory`.
|
|
220
|
-
// Absent means "use the config", whose default is 0: close re-runs
|
|
221
|
-
// nothing and mutates no GitHub state on an advisory red unless asked.
|
|
222
165
|
'rerun-advisory': { type: 'string' },
|
|
223
|
-
// Sanctioned override of a code-review critical blocker.
|
|
224
|
-
// Absent means "the blocker blocks"; see `parseOverrideReviewBlock` for
|
|
225
|
-
// why a bare or too-short reason fails closed instead of arming a silent
|
|
226
|
-
// override.
|
|
227
166
|
'override-review-block': { type: 'string' },
|
|
228
167
|
executor: { type: 'string' },
|
|
229
168
|
cwd: { type: 'string' },
|
|
@@ -244,45 +183,23 @@ export function parseSprintArgs(
|
|
|
244
183
|
skipValidation: coerceBooleanFlag(values['skip-validation']),
|
|
245
184
|
skipSync: coerceBooleanFlag(values['skip-sync']),
|
|
246
185
|
noAutoMerge: coerceBooleanFlag(values['no-auto-merge']),
|
|
247
|
-
//
|
|
248
|
-
// opts out. When neither flag is present (`undefined`),
|
|
249
|
-
// `parseCloseOptions` applies `delivery.routing.closeAndLand` (default
|
|
250
|
-
// true) so attended and headless delivers share the same happy path.
|
|
186
|
+
// `undefined` when neither flag is present: config `closeAndLand` decides.
|
|
251
187
|
waitForMerge: optionalBooleanFlag(values['wait-merge']),
|
|
252
188
|
noWaitForMerge: coerceBooleanFlag(values['no-wait-merge']),
|
|
253
|
-
// Story #4543 — raise the merge wait's per-invocation bound for a
|
|
254
|
-
// headless caller with no host tool-invocation ceiling, so it lands in
|
|
255
|
-
// one block instead of returning `pending` at the default 300s.
|
|
256
189
|
maxWaitSeconds: parsePositiveInt(values['max-wait-seconds']),
|
|
257
|
-
// Story #4949 — per-invocation override of `delivery.mergeWatch.mode`.
|
|
258
|
-
// `undefined` when the flag is absent, which is what lets the merge wait
|
|
259
|
-
// fall back to the config; anything unrecognized throws here.
|
|
260
190
|
mergeWatchMode: tolerant
|
|
261
191
|
? tolerantMergeWatchMode(values['merge-watch-mode'])
|
|
262
192
|
: parseMergeWatchMode(values['merge-watch-mode']),
|
|
263
|
-
// Story #5266 — how many times close may re-run a failed ADVISORY run
|
|
264
|
-
// before blocking on it. `undefined` when absent, which is what lets the
|
|
265
|
-
// merge wait fall back to `delivery.ci.rerunAdvisory` (default 0).
|
|
266
|
-
// `parseNonNegativeInt` degrades a junk value to undefined rather than
|
|
267
|
-
// guessing an allowance that would spend the consumer's CI minutes.
|
|
268
193
|
rerunAdvisory: parseNonNegativeInt(values['rerun-advisory']),
|
|
269
|
-
// The operator's recorded reason for overriding a review
|
|
270
|
-
// blocker. `undefined` when the flag is absent, which is what keeps the
|
|
271
|
-
// blocker blocking by default.
|
|
272
194
|
overrideReviewBlock: tolerant
|
|
273
195
|
? tolerantOverrideReviewBlock(values['override-review-block'])
|
|
274
196
|
: parseOverrideReviewBlock(values['override-review-block']),
|
|
275
197
|
executor: values.executor ?? null,
|
|
276
|
-
// Resolve worktree cwd from flag or env. Empty string/whitespace → null.
|
|
277
198
|
cwd:
|
|
278
199
|
(typeof values.cwd === 'string' && values.cwd.trim()) ||
|
|
279
200
|
process.env.AGENT_WORKTREE_ROOT ||
|
|
280
201
|
null,
|
|
281
202
|
recutOf: parseTicketId(values['recut-of']),
|
|
282
|
-
// Story #4253: pre-resolved Epic linkage threaded by the /mandrel-deliver
|
|
283
|
-
// fan-out so `single-story-init.js` can skip redundant Epic lookups when
|
|
284
|
-
// the parent already threaded Epic context (pre-v2; field retained for
|
|
285
|
-
// CLI compatibility).
|
|
286
203
|
resume: values.resume ?? false,
|
|
287
204
|
restart: values.restart ?? false,
|
|
288
205
|
};
|
|
@@ -294,9 +211,6 @@ export function parseSprintArgs(
|
|
|
294
211
|
}
|
|
295
212
|
|
|
296
213
|
/**
|
|
297
|
-
* Last-resort tolerant parse: the fields, or an empty bag if even the
|
|
298
|
-
* tolerant pass cannot produce one.
|
|
299
|
-
*
|
|
300
214
|
* @param {string[]} args
|
|
301
215
|
* @returns {object}
|
|
302
216
|
*/
|
|
@@ -309,24 +223,9 @@ function parseSprintArgsOrEmpty(args) {
|
|
|
309
223
|
}
|
|
310
224
|
|
|
311
225
|
/**
|
|
312
|
-
*
|
|
313
|
-
*
|
|
314
|
-
*
|
|
315
|
-
* `parseSprintArgs` gained its first *validating* parser in
|
|
316
|
-
* {@link parseMergeWatchMode} (Story #4949), which made a latent shape in the
|
|
317
|
-
* CLI entries fatal: their catch blocks called
|
|
318
|
-
* `failedTerminalFor(err, parseSprintArgs())` — re-invoking the very parser
|
|
319
|
-
* that had just thrown. The second throw escaped the catch, so an
|
|
320
|
-
* unparseable argv produced a bare stack trace with **no terminal envelope
|
|
321
|
-
* and no friction signal**, on the two surfaces whose whole contract is that
|
|
322
|
-
* they always emit one. An error handler must not depend on an operation
|
|
323
|
-
* already known to fail.
|
|
324
|
-
*
|
|
325
|
-
* So the entries parse **once**, up front, through this wrapper: `args`
|
|
326
|
-
* carries the `storyId` and skip flags the envelope is built from, and
|
|
327
|
-
* `error` is the failure to report. The tolerant re-parse degrades **only**
|
|
328
|
-
* the flag that failed validation; every other field parses normally. Use
|
|
329
|
-
* the result to *report*, never to run a pipeline.
|
|
226
|
+
* Never throws: returns the fields alongside the rejection, so an entry's
|
|
227
|
+
* error handler can still build its terminal envelope. Only the failing flag
|
|
228
|
+
* degrades. Use the result to report, never to run a pipeline.
|
|
330
229
|
*
|
|
331
230
|
* @param {string[]} [args] Array of arguments (defaults to `process.argv`)
|
|
332
231
|
* @returns {{ args: object, error: Error|null }}
|
|
@@ -365,31 +264,6 @@ function coerceValue(type, raw) {
|
|
|
365
264
|
return raw;
|
|
366
265
|
}
|
|
367
266
|
|
|
368
|
-
/**
|
|
369
|
-
* Declarative argv parser used by every top-level script under
|
|
370
|
-
* `.agents/scripts/`. Replaces the hand-rolled `parseCliArgs` walkers that
|
|
371
|
-
* the `tests/enforcement/parse-cli-args.test.js` enforcement gate forbids.
|
|
372
|
-
*
|
|
373
|
-
* Spec entry shape:
|
|
374
|
-
* { type, alias?, default?, envKey?, optionalValue?, short? }
|
|
375
|
-
*
|
|
376
|
-
* - `type`: 'boolean' | 'ticket' | 'integer' | 'string' | 'string-multi'.
|
|
377
|
-
* 'ticket' coerces via `parseTicketId` (positive int, leading `#` stripped,
|
|
378
|
-
* `null` for invalid). 'integer' coerces via `Number()` (NaN on garbage).
|
|
379
|
-
* - `alias`: output key on `values`. Defaults to camel-cased flag name.
|
|
380
|
-
* - `default`: applied when no value was provided AND no envKey produced
|
|
381
|
-
* one. For 'ticket' the default fires when the parsed value is null.
|
|
382
|
-
* - `envKey`: env-var fallback, used only when the flag is absent and the
|
|
383
|
-
* env value is a non-empty string.
|
|
384
|
-
* - `optionalValue`: value to assign when the flag is present without a
|
|
385
|
-
* value (i.e. EOF or the next token is another `--flag`).
|
|
386
|
-
* - `short`: single-char short flag (e.g. `-h`).
|
|
387
|
-
*
|
|
388
|
-
* @param {Record<string, object>} spec
|
|
389
|
-
* @param {string[]} args argv slice (no `process` / script entries)
|
|
390
|
-
* @param {{ env?: NodeJS.ProcessEnv }} [opts]
|
|
391
|
-
* @returns {{ values: Record<string, any>, positionals: string[] }}
|
|
392
|
-
*/
|
|
393
267
|
function validateSpec(spec) {
|
|
394
268
|
for (const [name, def] of Object.entries(spec)) {
|
|
395
269
|
if (!SUPPORTED_FLAG_TYPES.has(def.type)) {
|
|
@@ -517,6 +391,17 @@ function applyDefaults(spec, state) {
|
|
|
517
391
|
}
|
|
518
392
|
}
|
|
519
393
|
|
|
394
|
+
/**
|
|
395
|
+
* Declarative argv parser for every top-level script. Spec entry:
|
|
396
|
+
* `{ type, alias?, default?, envKey?, optionalValue?, short? }` — `alias`
|
|
397
|
+
* defaults to the camel-cased flag; `envKey` applies only when the flag is
|
|
398
|
+
* absent; `default` after that; `optionalValue` when the flag has no value.
|
|
399
|
+
*
|
|
400
|
+
* @param {Record<string, object>} spec
|
|
401
|
+
* @param {string[]} args argv slice (no `process` / script entries)
|
|
402
|
+
* @param {{ env?: NodeJS.ProcessEnv }} [opts]
|
|
403
|
+
* @returns {{ values: Record<string, any>, positionals: string[] }}
|
|
404
|
+
*/
|
|
520
405
|
export function defineFlags(spec, args = [], opts = {}) {
|
|
521
406
|
validateSpec(spec);
|
|
522
407
|
const env = opts.env ?? process.env;
|
|
@@ -1,32 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* The one `--help` implementation for top-level scripts, so a flag contract
|
|
3
|
+
* lives with its code, not in workflow prose.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* (`deliver-story.md` Step 0 restating `single-story-init.js`'s `--dry-run` /
|
|
9
|
-
* `--steal`, and so on). Two homes for one contract is a drift class: the
|
|
10
|
-
* script changes, the prose does not, and the next agent runs a flag that no
|
|
11
|
-
* longer exists. Moving the enumeration into the script's own `--help` gives
|
|
12
|
-
* the contract a single home that ships with the code that implements it.
|
|
13
|
-
*
|
|
14
|
-
* ## Contract
|
|
15
|
-
*
|
|
16
|
-
* `--help` (or `-h`) is a **query**, never an error path:
|
|
17
|
-
*
|
|
18
|
-
* - writes non-empty text to **stdout** and exits **0**;
|
|
19
|
-
* - performs no GitHub write, acquires no lease, mutates no working tree.
|
|
20
|
-
*
|
|
21
|
-
* stdout — not `Logger.info` — because help output must survive
|
|
22
|
-
* `AGENT_LOG_LEVEL=silent` and carry no `[Orchestrator]` decoration; this is
|
|
23
|
-
* the same `process.stdout.write` carve-out that machine-parsable envelopes
|
|
24
|
-
* use (see `tests/enforcement/no-console.test.js`).
|
|
25
|
-
*
|
|
26
|
-
* The short-circuit itself lives in `runAsCli` (`lib/cli-utils.js`), which
|
|
27
|
-
* fires this module **before** the script's `main` runs — so the "no side
|
|
28
|
-
* effects" half of the contract holds structurally rather than by each
|
|
29
|
-
* script remembering to check first.
|
|
5
|
+
* `--help`/`-h` is a query: non-empty stdout, exit 0, no side effects.
|
|
6
|
+
* stdout (not `Logger`) so it survives `AGENT_LOG_LEVEL=silent`. `runAsCli`
|
|
7
|
+
* short-circuits before `main`, so "no side effects" holds structurally.
|
|
30
8
|
*
|
|
31
9
|
* ## Usage
|
|
32
10
|
*
|
|
@@ -34,18 +34,8 @@ export function isDirectInvocation(importMetaUrl) {
|
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
/**
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* **The exit is never eager** (Story #4783). This helper assigns
|
|
41
|
-
* `process.exitCode` and returns, letting Node terminate once the event loop
|
|
42
|
-
* is empty — which is *after* the pending stdout writes drain. The previous
|
|
43
|
-
* `process.exit()` call terminated first, discarding anything still queued
|
|
44
|
-
* behind a full pipe buffer, so any CLI emitting more than 64 KiB into a pipe
|
|
45
|
-
* truncated silently while still reporting success. The resulting exit code is
|
|
46
|
-
* identical for every caller: `code ?? 0` on the `propagateExitCode` path,
|
|
47
|
-
* `options.exitCode` (default 1) on the fatal-error path, and an untouched 0
|
|
48
|
-
* everywhere else.
|
|
37
|
+
* Await `main` and set `process.exitCode` — never `process.exit()`, which
|
|
38
|
+
* truncates stdout still queued behind a full pipe buffer.
|
|
49
39
|
*
|
|
50
40
|
* @param {() => Promise<unknown>} main
|
|
51
41
|
* @param {{ source: string, exitCode: number, onError?: (err: Error) => void,
|
|
@@ -1,41 +1,23 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* close-validation/commands.js — Command resolution + formatter file policy.
|
|
3
|
-
*
|
|
4
|
-
* Owns the `project.commands.*` resolution helpers used by the close-
|
|
5
|
-
* validation gates (typecheck / lint / formatCheck / formatWrite), the Story-diff
|
|
6
|
-
* changed-file listing for the format gate, and the formatter
|
|
7
|
-
* file-eligibility policy (Story #3410).
|
|
8
|
-
*/
|
|
1
|
+
/** Close-validation `project.commands.*` resolution and formatter file policy. */
|
|
9
2
|
|
|
10
3
|
import { execFileSync } from 'node:child_process';
|
|
11
4
|
import { diffNameOnly } from '../changed-files.js';
|
|
12
5
|
import { getCommands } from '../config/commands.js';
|
|
13
6
|
|
|
14
|
-
/**
|
|
15
|
-
* Fallback typecheck command — the gate is mandatory by design (Epic-branch
|
|
16
|
-
* type regressions surface in the next Story's pre-push otherwise).
|
|
17
|
-
*/
|
|
7
|
+
/** The typecheck and lint gates are mandatory, so they carry their own fallbacks. */
|
|
18
8
|
const TYPECHECK_FALLBACK = 'npm run typecheck';
|
|
19
9
|
|
|
20
10
|
/**
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* unconfigured consumer must keep getting byte-identical argv, because the
|
|
24
|
-
* gate's `commandConfigHash` is computed over it and any drift would silently
|
|
25
|
-
* invalidate every previously recorded lint evidence record.
|
|
11
|
+
* Must stay byte-identical: `commandConfigHash` covers it, and drift would
|
|
12
|
+
* invalidate every recorded lint evidence record.
|
|
26
13
|
*/
|
|
27
14
|
const LINT_FALLBACK = 'npm run lint';
|
|
28
15
|
|
|
29
|
-
/** Default formatter command when `project.commands.formatCheck` is unset. */
|
|
30
16
|
export const FORMAT_CHECK_FALLBACK = 'npx biome format .';
|
|
31
17
|
|
|
32
|
-
/** Default formatter command in write mode. */
|
|
33
18
|
const FORMAT_WRITE_FALLBACK = 'npx biome format --write .';
|
|
34
19
|
|
|
35
|
-
/**
|
|
36
|
-
* Build the format-gate hint dynamically from the resolved write command so
|
|
37
|
-
* a Prettier-only repo gets `prettier --write` in its hint, not biome.
|
|
38
|
-
*/
|
|
20
|
+
/** Derived from the write command so a Prettier repo is not told to run biome. */
|
|
39
21
|
export function buildFormatHint(writeCmd) {
|
|
40
22
|
const cmd =
|
|
41
23
|
writeCmd && writeCmd.trim().length > 0 ? writeCmd : FORMAT_WRITE_FALLBACK;
|
|
@@ -43,37 +25,27 @@ export function buildFormatHint(writeCmd) {
|
|
|
43
25
|
}
|
|
44
26
|
|
|
45
27
|
/**
|
|
46
|
-
*
|
|
47
|
-
* value is missing, empty, or the resolver throws on malformed config.
|
|
48
|
-
* Shared engine behind the three resolveX command helpers.
|
|
28
|
+
* Falls back on a missing/empty value or malformed config.
|
|
49
29
|
*
|
|
50
30
|
* @param {{ project?: { commands?: object } } | null | undefined} config
|
|
51
|
-
* Canonical resolved config (or a bare `{ project: { commands } }` bag).
|
|
52
31
|
* @param {string} key
|
|
53
32
|
* @param {string} fallback
|
|
54
33
|
* @returns {string}
|
|
55
34
|
*/
|
|
56
35
|
function resolveCommandWithFallback(config, key, fallback) {
|
|
57
36
|
try {
|
|
58
|
-
// `getCommands` reads `config.project.commands` from the canonical
|
|
59
|
-
// resolved config.
|
|
60
37
|
const cmds = getCommands(config);
|
|
61
38
|
const value = cmds[key];
|
|
62
39
|
if (typeof value === 'string' && value.trim().length > 0) {
|
|
63
40
|
return value.trim();
|
|
64
41
|
}
|
|
65
42
|
} catch {
|
|
66
|
-
// Malformed config —
|
|
43
|
+
// Malformed config — use the fallback.
|
|
67
44
|
}
|
|
68
45
|
return fallback;
|
|
69
46
|
}
|
|
70
47
|
|
|
71
48
|
/**
|
|
72
|
-
* Resolve the typecheck command. Reads `project.commands.typecheck`;
|
|
73
|
-
* falls back to `npm run typecheck`. The framework-wide
|
|
74
|
-
* `COMMANDS_DEFAULTS.typecheck` is `null` but this gate is mandatory, so
|
|
75
|
-
* we apply the fallback here. Exported for testing.
|
|
76
|
-
*
|
|
77
49
|
* @param {{ project?: { commands?: object } } | null | undefined} config
|
|
78
50
|
* @returns {string}
|
|
79
51
|
*/
|
|
@@ -82,14 +54,7 @@ export function resolveTypecheckCommand(config) {
|
|
|
82
54
|
}
|
|
83
55
|
|
|
84
56
|
/**
|
|
85
|
-
*
|
|
86
|
-
* `npm run lint`. The framework-wide `COMMANDS_DEFAULTS.lint` is `null` — as
|
|
87
|
-
* for typecheck — because the fallback belongs to this mandatory gate rather
|
|
88
|
-
* than to the shared accessor.
|
|
89
|
-
*
|
|
90
|
-
* A consumer sets this to point the gate at the scoped pair its hooks already
|
|
91
|
-
* run: the close-time gate stays real (the diff is still linted) while CI
|
|
92
|
-
* keeps owning whole-repo drift. Exported for testing.
|
|
57
|
+
* A consumer may point this at its hooks' scoped lint; CI keeps whole-repo drift.
|
|
93
58
|
*
|
|
94
59
|
* @param {{ project?: { commands?: object } } | null | undefined} config
|
|
95
60
|
* @returns {string}
|
|
@@ -99,10 +64,6 @@ export function resolveLintCommand(config) {
|
|
|
99
64
|
}
|
|
100
65
|
|
|
101
66
|
/**
|
|
102
|
-
* Resolve the format-check command. Reads `project.commands.formatCheck`;
|
|
103
|
-
* falls back to `npx biome format .` so existing repos keep working byte-
|
|
104
|
-
* for-byte. Exported for testing.
|
|
105
|
-
*
|
|
106
67
|
* @param {{ project?: { commands?: object } } | null | undefined} config
|
|
107
68
|
* @returns {string}
|
|
108
69
|
*/
|
|
@@ -115,10 +76,6 @@ export function resolveFormatCheckCommand(config) {
|
|
|
115
76
|
}
|
|
116
77
|
|
|
117
78
|
/**
|
|
118
|
-
* Resolve the format-write command used by story-close format-autofix (and
|
|
119
|
-
* surfaced in the format-gate hint). Reads `project.commands.formatWrite`;
|
|
120
|
-
* falls back to `npx biome format --write .`. Exported for testing.
|
|
121
|
-
*
|
|
122
79
|
* @param {{ project?: { commands?: object } } | null | undefined} config
|
|
123
80
|
* @returns {string}
|
|
124
81
|
*/
|
|
@@ -131,11 +88,8 @@ export function resolveFormatWriteCommand(config) {
|
|
|
131
88
|
}
|
|
132
89
|
|
|
133
90
|
/**
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
* lets consumer ignore globs that exclude `.worktrees` self-exclude the whole
|
|
137
|
-
* run. Scoping to changed paths keeps verification real without depending on
|
|
138
|
-
* how consumers spell root ignore patterns.
|
|
91
|
+
* Story-diff scope for the format gate: run against `.` inside
|
|
92
|
+
* `.worktrees/story-*`, a consumer's `.worktrees` ignore glob excludes everything.
|
|
139
93
|
*
|
|
140
94
|
* @param {{ cwd: string, baseRef: string }} opts
|
|
141
95
|
* @returns {string[]}
|
|
@@ -144,8 +98,6 @@ export function listChangedFilesForFormatGate({ cwd, baseRef }) {
|
|
|
144
98
|
if (!cwd) throw new Error('listChangedFilesForFormatGate: cwd is required');
|
|
145
99
|
if (!baseRef)
|
|
146
100
|
throw new Error('listChangedFilesForFormatGate: baseRef is required');
|
|
147
|
-
// Bridge execFileSync into the gitSpawn(cwd, ...args) contract so
|
|
148
|
-
// diffNameOnly owns the stdout → path-list conversion.
|
|
149
101
|
const gitSpawn = (_cwd, ...args) => {
|
|
150
102
|
try {
|
|
151
103
|
const stdout = execFileSync('git', args, {
|
|
@@ -166,18 +118,8 @@ export function listChangedFilesForFormatGate({ cwd, baseRef }) {
|
|
|
166
118
|
}
|
|
167
119
|
|
|
168
120
|
/**
|
|
169
|
-
*
|
|
170
|
-
*
|
|
171
|
-
* passing only ineligible paths (e.g. a docs-only Story whose diff is all
|
|
172
|
-
* markdown) makes `biome format <files>` report "No files were processed"
|
|
173
|
-
* and exit 1, failing the gate for a Story that has nothing to format.
|
|
174
|
-
*
|
|
175
|
-
* The set mirrors Biome's handled languages (JS/TS family + JSON + CSS).
|
|
176
|
-
* Markdown, YAML, and other unhandled types are intentionally absent — the
|
|
177
|
-
* default formatter is biome, so the scope is keyed to what biome formats.
|
|
178
|
-
* Consumers who swap the formatter via `project.commands.formatCheck`
|
|
179
|
-
* do not get `changedFileScope` at all (see `buildDefaultGates`), so this
|
|
180
|
-
* filter only ever runs against the default biome command.
|
|
121
|
+
* What biome formats. Handing biome only ineligible paths exits 1 ("No files
|
|
122
|
+
* were processed"). Only the default biome command gets a changed-file scope.
|
|
181
123
|
*/
|
|
182
124
|
const FORMATTER_ELIGIBLE_EXTENSIONS = new Set([
|
|
183
125
|
'ts',
|
|
@@ -192,11 +134,7 @@ const FORMATTER_ELIGIBLE_EXTENSIONS = new Set([
|
|
|
192
134
|
]);
|
|
193
135
|
|
|
194
136
|
/**
|
|
195
|
-
*
|
|
196
|
-
* decided purely by file extension. Pure function — no I/O. Exported for
|
|
197
|
-
* unit coverage (Story #3410).
|
|
198
|
-
*
|
|
199
|
-
* @param {string} filePath - A repo-relative path (forward-slash normalized).
|
|
137
|
+
* @param {string} filePath - Repo-relative.
|
|
200
138
|
* @returns {boolean}
|
|
201
139
|
*/
|
|
202
140
|
export function isFormatterEligible(filePath) {
|
|
@@ -207,7 +145,6 @@ export function isFormatterEligible(filePath) {
|
|
|
207
145
|
);
|
|
208
146
|
const base = filePath.slice(lastSlash + 1);
|
|
209
147
|
const dot = base.lastIndexOf('.');
|
|
210
|
-
// No extension (dotfile-only or extensionless) → not formatter-eligible.
|
|
211
148
|
if (dot <= 0) return false;
|
|
212
149
|
const ext = base.slice(dot + 1).toLowerCase();
|
|
213
150
|
return FORMATTER_ELIGIBLE_EXTENSIONS.has(ext);
|