mandrel 2.59.0 → 2.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (678) hide show
  1. package/.agents/README.md +21 -19
  2. package/.agents/agents/acceptance-critic.md +24 -43
  3. package/.agents/agents/story-worker.md +20 -21
  4. package/.agents/docs/agentrc-reference.json +5 -84
  5. package/.agents/docs/configuration.md +48 -132
  6. package/.agents/docs/workflows.md +2 -2
  7. package/.agents/instructions.md +5 -8
  8. package/.agents/rules/ci-remediation.md +41 -8
  9. package/.agents/rules/gherkin-standards.md +4 -0
  10. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  11. package/.agents/schemas/agentrc.schema.json +16 -496
  12. package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
  13. package/.agents/schemas/validation-evidence.schema.json +2 -1
  14. package/.agents/scripts/README.md +23 -13
  15. package/.agents/scripts/acceptance-eval.js +35 -169
  16. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  17. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  18. package/.agents/scripts/audit-baselines.js +6 -27
  19. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  20. package/.agents/scripts/audit-to-stories.js +91 -361
  21. package/.agents/scripts/boot-sweep.js +19 -72
  22. package/.agents/scripts/bootstrap.js +74 -395
  23. package/.agents/scripts/ceremony-derive.js +10 -41
  24. package/.agents/scripts/check-arch-cycles.js +14 -64
  25. package/.agents/scripts/check-baselines.js +8 -48
  26. package/.agents/scripts/check-context-budget.js +105 -311
  27. package/.agents/scripts/check-cyclomatic.js +12 -44
  28. package/.agents/scripts/check-dead-exports.js +13 -64
  29. package/.agents/scripts/check-doc-links.js +38 -186
  30. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  31. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  32. package/.agents/scripts/coverage-capture.js +34 -98
  33. package/.agents/scripts/deliver-light.js +25 -171
  34. package/.agents/scripts/deliver-recover.js +6 -42
  35. package/.agents/scripts/deliver-run.js +534 -0
  36. package/.agents/scripts/diagnose-friction.js +24 -116
  37. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  38. package/.agents/scripts/evidence-gate.js +23 -85
  39. package/.agents/scripts/file-ci-gap.js +57 -49
  40. package/.agents/scripts/generate-config-docs.js +30 -170
  41. package/.agents/scripts/generate-lens-checklists.js +8 -52
  42. package/.agents/scripts/generate-skills-index.js +14 -112
  43. package/.agents/scripts/generate-workflows-doc.js +10 -70
  44. package/.agents/scripts/git-cleanup.js +2 -34
  45. package/.agents/scripts/lib/Graph.js +24 -81
  46. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  47. package/.agents/scripts/lib/Logger.js +14 -76
  48. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  49. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  50. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  51. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  52. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  53. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  54. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  55. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  56. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  57. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  58. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  59. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  60. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  61. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  62. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  63. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  64. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  65. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  66. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  67. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  68. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  69. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  70. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  71. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  72. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  73. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  74. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  75. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  76. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  77. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  78. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  79. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  80. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  81. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  82. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  83. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  84. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  85. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  86. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  87. package/.agents/scripts/lib/baseline-loader.js +12 -51
  88. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  89. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  90. package/.agents/scripts/lib/baselines/components.js +10 -61
  91. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  92. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +7 -19
  93. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  94. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  95. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  96. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  97. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  98. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  99. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  100. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  101. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  102. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  103. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  104. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  105. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  106. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  107. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  108. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  109. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  110. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  111. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  112. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  113. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  114. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  115. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  116. package/.agents/scripts/lib/baselines/reader.js +14 -107
  117. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  118. package/.agents/scripts/lib/baselines/scope.js +11 -135
  119. package/.agents/scripts/lib/baselines/writer.js +16 -149
  120. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  121. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  122. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  123. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  124. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  125. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  126. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  127. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  128. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  129. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  130. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  131. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  132. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  133. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  134. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  135. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  136. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  137. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  138. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  139. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  140. package/.agents/scripts/lib/changed-files.js +39 -121
  141. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  142. package/.agents/scripts/lib/checks/index.js +18 -101
  143. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  144. package/.agents/scripts/lib/checks/state.js +16 -91
  145. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  146. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  147. package/.agents/scripts/lib/child-exec.js +39 -108
  148. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  149. package/.agents/scripts/lib/cli-args.js +31 -146
  150. package/.agents/scripts/lib/cli-usage.js +5 -27
  151. package/.agents/scripts/lib/cli-utils.js +2 -12
  152. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  153. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  154. package/.agents/scripts/lib/close-validation/process.js +121 -151
  155. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  156. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  157. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  158. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  159. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  160. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  161. package/.agents/scripts/lib/command-header.js +6 -28
  162. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  163. package/.agents/scripts/lib/config/baselines.js +3 -14
  164. package/.agents/scripts/lib/config/ci.js +8 -38
  165. package/.agents/scripts/lib/config/commands.js +1 -15
  166. package/.agents/scripts/lib/config/defaults.js +4 -33
  167. package/.agents/scripts/lib/config/delivery-routing.js +6 -34
  168. package/.agents/scripts/lib/config/explain.js +10 -83
  169. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  170. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
  171. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  172. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  173. package/.agents/scripts/lib/config/gates/index.js +2 -17
  174. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  175. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  176. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  177. package/.agents/scripts/lib/config/github.js +4 -22
  178. package/.agents/scripts/lib/config/limits.js +4 -57
  179. package/.agents/scripts/lib/config/paths.js +2 -21
  180. package/.agents/scripts/lib/config/qa.js +4 -38
  181. package/.agents/scripts/lib/config/quality.js +76 -432
  182. package/.agents/scripts/lib/config/runners.js +12 -56
  183. package/.agents/scripts/lib/config/runtime.js +13 -57
  184. package/.agents/scripts/lib/config/shared.js +2 -16
  185. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  186. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  187. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  188. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  189. package/.agents/scripts/lib/config-resolver.js +11 -52
  190. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  191. package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
  192. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  193. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  194. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  195. package/.agents/scripts/lib/coverage-capture-fullscope.js +18 -35
  196. package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
  197. package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
  198. package/.agents/scripts/lib/coverage-capture.js +99 -224
  199. package/.agents/scripts/lib/coverage-utils.js +14 -79
  200. package/.agents/scripts/lib/cpu-pool.js +17 -123
  201. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  202. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  203. package/.agents/scripts/lib/crap-engine.js +40 -153
  204. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  205. package/.agents/scripts/lib/crap-utils.js +31 -155
  206. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  207. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  208. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  209. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  210. package/.agents/scripts/lib/degraded-mode.js +3 -26
  211. package/.agents/scripts/lib/dependency-parser.js +8 -40
  212. package/.agents/scripts/lib/dependency-version.js +13 -35
  213. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  214. package/.agents/scripts/lib/doc-tiers.js +22 -124
  215. package/.agents/scripts/lib/duplicate-search.js +8 -72
  216. package/.agents/scripts/lib/env-loader.js +5 -27
  217. package/.agents/scripts/lib/error-redactor.js +6 -31
  218. package/.agents/scripts/lib/errors/index.js +2 -22
  219. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  220. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  221. package/.agents/scripts/lib/feedback-loop/graduator-core.js +94 -419
  222. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  223. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
  224. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  225. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  226. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  227. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  228. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  229. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  230. package/.agents/scripts/lib/findings/severity.js +18 -104
  231. package/.agents/scripts/lib/format-generated-json.js +12 -44
  232. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  233. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  234. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  235. package/.agents/scripts/lib/gates/friction.js +1 -3
  236. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  237. package/.agents/scripts/lib/gh-exec.js +123 -191
  238. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  239. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  240. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  241. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  242. package/.agents/scripts/lib/git-utils.js +37 -161
  243. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  244. package/.agents/scripts/lib/github-url.js +2 -17
  245. package/.agents/scripts/lib/import-graph.js +11 -38
  246. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  247. package/.agents/scripts/lib/json-utils.js +3 -18
  248. package/.agents/scripts/lib/label-constants.js +16 -111
  249. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  250. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  251. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  252. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  253. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  254. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  255. package/.agents/scripts/lib/npm-scripts.js +4 -23
  256. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  257. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  258. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  259. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  260. package/.agents/scripts/lib/observability/source-classifier.js +22 -203
  261. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  262. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  263. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  264. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  265. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  266. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  267. package/.agents/scripts/lib/orchestration/ceremony-routing.js +28 -156
  268. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  274. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  275. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  276. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  277. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  278. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  279. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +121 -157
  280. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  281. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  282. package/.agents/scripts/lib/orchestration/complexity-gate.js +118 -462
  283. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  284. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  285. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  286. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  287. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  288. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  289. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  290. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  291. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  292. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  293. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  294. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  295. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  308. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  309. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  310. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  311. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  312. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  313. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  314. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  315. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  316. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  317. package/.agents/scripts/lib/orchestration/light-suitability.js +37 -307
  318. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  319. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  320. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  321. package/.agents/scripts/lib/orchestration/plan-context.js +55 -318
  322. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  323. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  324. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  325. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  326. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  327. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  328. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +16 -78
  329. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  330. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  331. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  332. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  333. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  334. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  335. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +71 -289
  336. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  337. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
  338. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
  339. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
  340. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  341. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  342. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  343. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  344. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  345. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  346. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  347. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  348. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  349. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  350. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  351. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  352. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  353. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  354. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  355. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  356. package/.agents/scripts/lib/orchestration/review-depth.js +12 -91
  357. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  358. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  359. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  360. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  361. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  362. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  363. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  364. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  365. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  366. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  367. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  368. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  369. package/.agents/scripts/lib/orchestration/run-epilogue.js +245 -326
  370. package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
  371. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  372. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  373. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +20 -82
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +96 -0
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  390. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  391. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  392. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  393. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +180 -273
  394. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  395. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  396. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  397. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  398. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  399. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  400. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  401. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  402. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -200
  403. package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
  404. package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
  405. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  406. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  407. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -135
  408. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  409. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  410. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  411. package/.agents/scripts/lib/orchestration/ticket-validator.js +63 -344
  412. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  413. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
  414. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  415. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  416. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  417. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  418. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  419. package/.agents/scripts/lib/path-security.js +3 -6
  420. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  421. package/.agents/scripts/lib/preflight-runner.js +13 -69
  422. package/.agents/scripts/lib/process-group.js +143 -0
  423. package/.agents/scripts/lib/project-root.js +2 -8
  424. package/.agents/scripts/lib/provider-factory.js +2 -25
  425. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  426. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  427. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  428. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  429. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  430. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  431. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  432. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  433. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  434. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  435. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  436. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  437. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  438. package/.agents/scripts/lib/signals/index.js +2 -19
  439. package/.agents/scripts/lib/signals/schema.js +14 -109
  440. package/.agents/scripts/lib/signals/write.js +2 -11
  441. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  442. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  443. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  444. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  445. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  446. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  447. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  448. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  449. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  450. package/.agents/scripts/lib/source-extensions.js +11 -42
  451. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  452. package/.agents/scripts/lib/stdio-flush.js +9 -36
  453. package/.agents/scripts/lib/story-adjacency.js +8 -40
  454. package/.agents/scripts/lib/story-body/body-format-lints.js +51 -66
  455. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  456. package/.agents/scripts/lib/story-body/story-body.js +123 -344
  457. package/.agents/scripts/lib/temp-retention.js +42 -143
  458. package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
  459. package/.agents/scripts/lib/test-env.js +12 -65
  460. package/.agents/scripts/lib/test-run-credit.js +10 -65
  461. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  462. package/.agents/scripts/lib/test-temp.js +38 -184
  463. package/.agents/scripts/lib/test-tiers.js +12 -96
  464. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  465. package/.agents/scripts/lib/transpile.js +15 -74
  466. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  467. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  468. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  469. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  470. package/.agents/scripts/lib/validation-evidence.js +21 -96
  471. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  472. package/.agents/scripts/lib/wave-runner/live-probe.js +67 -209
  473. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  474. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  475. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  476. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  477. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  478. package/.agents/scripts/lib/workflow-closure.js +22 -105
  479. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  480. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  481. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  482. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  483. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  484. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  485. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  486. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  487. package/.agents/scripts/lib/worktree-manager.js +15 -40
  488. package/.agents/scripts/lint-issue-body.js +12 -68
  489. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  490. package/.agents/scripts/merge-baseline.js +30 -105
  491. package/.agents/scripts/nav-registry-diff.js +22 -108
  492. package/.agents/scripts/notify.js +12 -69
  493. package/.agents/scripts/plan-context.js +97 -92
  494. package/.agents/scripts/plan-critics.js +12 -66
  495. package/.agents/scripts/plan-persist.js +71 -137
  496. package/.agents/scripts/plan-run-epilogue.js +20 -43
  497. package/.agents/scripts/pr-watch-with-update.js +79 -263
  498. package/.agents/scripts/providers/github/auth.js +3 -8
  499. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  500. package/.agents/scripts/providers/github/board-add.js +5 -21
  501. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  502. package/.agents/scripts/providers/github/cache.js +2 -14
  503. package/.agents/scripts/providers/github/comments.js +7 -40
  504. package/.agents/scripts/providers/github/compose.js +3 -19
  505. package/.agents/scripts/providers/github/errors.js +22 -125
  506. package/.agents/scripts/providers/github/issues.js +31 -123
  507. package/.agents/scripts/providers/github/labels.js +24 -124
  508. package/.agents/scripts/providers/github/mappers.js +5 -27
  509. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  510. package/.agents/scripts/providers/github/project-board.js +2 -17
  511. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  512. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  513. package/.agents/scripts/providers/github/search-budget.js +9 -39
  514. package/.agents/scripts/providers/github/search-query.js +5 -26
  515. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  516. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  517. package/.agents/scripts/providers/github/tickets.js +32 -134
  518. package/.agents/scripts/providers/github.js +18 -59
  519. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  520. package/.agents/scripts/quality-preview.js +35 -220
  521. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  522. package/.agents/scripts/resolve-stories.js +16 -67
  523. package/.agents/scripts/resync-status-column.js +6 -25
  524. package/.agents/scripts/run-tests.js +29 -104
  525. package/.agents/scripts/single-story-close.js +23 -135
  526. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  527. package/.agents/scripts/single-story-init.js +47 -259
  528. package/.agents/scripts/stories-wave-tick.js +179 -415
  529. package/.agents/scripts/sync-agentrc.js +3 -21
  530. package/.agents/scripts/sync-claude-agents.js +9 -55
  531. package/.agents/scripts/sync-claude-commands.js +20 -110
  532. package/.agents/scripts/test-wrapper.js +6 -43
  533. package/.agents/scripts/update-coverage-baseline.js +5 -22
  534. package/.agents/scripts/update-crap-baseline.js +7 -30
  535. package/.agents/scripts/update-duplication-baseline.js +16 -92
  536. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  537. package/.agents/scripts/update-ticket-state.js +1 -7
  538. package/.agents/scripts/validate-skills.js +6 -26
  539. package/.agents/skills/core/gates-and-baselines/reference.md +0 -1
  540. package/.agents/skills/skills.index.json +2 -2
  541. package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
  542. package/.agents/templates/agent-protocol.md +2 -2
  543. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  544. package/.agents/workflows/audit-accessibility.md +4 -7
  545. package/.agents/workflows/audit-adrs.md +3 -6
  546. package/.agents/workflows/audit-architecture.md +3 -11
  547. package/.agents/workflows/audit-baselines.md +6 -9
  548. package/.agents/workflows/audit-clean-code.md +8 -12
  549. package/.agents/workflows/audit-data-model.md +3 -7
  550. package/.agents/workflows/audit-dependencies.md +4 -7
  551. package/.agents/workflows/audit-devops.md +4 -8
  552. package/.agents/workflows/audit-documentation.md +1 -4
  553. package/.agents/workflows/audit-mobile.md +4 -7
  554. package/.agents/workflows/audit-navigability.md +3 -6
  555. package/.agents/workflows/audit-performance.md +2 -4
  556. package/.agents/workflows/audit-privacy.md +4 -7
  557. package/.agents/workflows/audit-quality.md +4 -7
  558. package/.agents/workflows/audit-security.md +4 -7
  559. package/.agents/workflows/audit-seo.md +4 -7
  560. package/.agents/workflows/audit-sre.md +4 -7
  561. package/.agents/workflows/audit-to-stories.md +17 -30
  562. package/.agents/workflows/audit-ux-ui.md +4 -7
  563. package/.agents/workflows/helpers/acceptance-self-eval.md +84 -157
  564. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  565. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  566. package/.agents/workflows/helpers/code-review.md +4 -2
  567. package/.agents/workflows/helpers/deliver-digest.md +37 -28
  568. package/.agents/workflows/helpers/deliver-light.md +92 -101
  569. package/.agents/workflows/helpers/deliver-reference.md +162 -220
  570. package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
  571. package/.agents/workflows/helpers/deliver-story.md +17 -18
  572. package/.agents/workflows/helpers/plan-reference.md +125 -167
  573. package/.agents/workflows/helpers/qa-core.md +12 -0
  574. package/.agents/workflows/mandrel-deliver.md +47 -31
  575. package/.agents/workflows/mandrel-plan.md +22 -21
  576. package/.agents/workflows/mandrel-update.md +36 -21
  577. package/.agents/workflows/memory-consolidate.md +1 -1
  578. package/.agents/workflows/qa-assist.md +27 -71
  579. package/.agents/workflows/qa-explore.md +19 -59
  580. package/.agents/workflows/qa-run.md +11 -33
  581. package/README.md +1 -1
  582. package/bin/mandrel.js +5 -46
  583. package/bin/postinstall.js +18 -107
  584. package/docs/CHANGELOG.md +60 -0
  585. package/lib/cli/doctor.js +11 -71
  586. package/lib/cli/init.js +26 -165
  587. package/lib/cli/migrate.js +5 -64
  588. package/lib/cli/registry.js +84 -467
  589. package/lib/cli/sync-agents.js +4 -64
  590. package/lib/cli/sync-commands.js +11 -64
  591. package/lib/cli/sync.js +34 -213
  592. package/lib/cli/uninstall.js +40 -219
  593. package/lib/cli/update.js +326 -523
  594. package/lib/cli/version-check.js +8 -72
  595. package/lib/cli/version-helpers.js +14 -87
  596. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  597. package/lib/migrations/index.js +17 -92
  598. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  599. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  600. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  601. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  602. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  603. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  604. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  605. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  606. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +21 -0
  607. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  608. package/package.json +17 -14
  609. package/.agents/docs/SDLC.md +0 -590
  610. package/.agents/docs/quality-gates.md +0 -1179
  611. package/.agents/rules/known-tooling-behavior.md +0 -150
  612. package/.agents/rules/orchestration-error-handling.md +0 -61
  613. package/.agents/rules/test-seams.md +0 -59
  614. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  615. package/.agents/schemas/baselines/lint.schema.json +0 -47
  616. package/.agents/schemas/model-attribution.schema.json +0 -53
  617. package/.agents/scripts/check-action-pinning.js +0 -260
  618. package/.agents/scripts/check-audit-attribution.js +0 -302
  619. package/.agents/scripts/check-baseline-drift.js +0 -211
  620. package/.agents/scripts/check-baseline-scope.js +0 -362
  621. package/.agents/scripts/check-generated-validator.js +0 -202
  622. package/.agents/scripts/check-knip-entries.js +0 -159
  623. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  624. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  625. package/.agents/scripts/check-schema-references.js +0 -366
  626. package/.agents/scripts/check-test-portability.js +0 -512
  627. package/.agents/scripts/check-workflow-citations.js +0 -332
  628. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  629. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  630. package/.agents/scripts/install-matrix-assert.js +0 -326
  631. package/.agents/scripts/lib/audit-advisories.js +0 -195
  632. package/.agents/scripts/lib/audit-attribution.js +0 -134
  633. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  634. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  635. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  636. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  637. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  638. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  639. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  640. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  641. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  642. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  643. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  644. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  645. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  646. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  647. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  648. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  649. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  650. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  651. package/.agents/scripts/lib/fs-walk.js +0 -52
  652. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  653. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  654. package/.agents/scripts/lib/orchestration/model-attribution.js +0 -418
  655. package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
  656. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
  657. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  658. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  659. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  660. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  661. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  662. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  663. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  664. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  665. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  666. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  667. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  668. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  669. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  670. package/.agents/scripts/post-structured-comment.js +0 -127
  671. package/.agents/scripts/provision-git-hooks.js +0 -85
  672. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  673. package/.agents/scripts/run-coverage.js +0 -197
  674. package/.agents/scripts/run-lint.js +0 -133
  675. package/.agents/scripts/run-test-profile.js +0 -129
  676. package/.agents/scripts/run-verify.js +0 -118
  677. package/.agents/scripts/test-isolate.js +0 -55
  678. 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
- * Parse a single ticket-ID-style value. Strips an optional leading `#`,
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
- * Coerce a value returned by `node:util`'s `parseArgs` for a boolean flag into
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
- * Parse a positive-integer flag, preserving `undefined` when the flag is
51
- * absent so a caller can distinguish "not supplied" (fall back to config)
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
- * The same contract for a flag whose ZERO is meaningful (Story #5266):
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
- * Parse `--merge-watch-mode` (Story #4949), the per-invocation override of
86
- * `delivery.mergeWatch.mode`. Absence is preserved as `undefined` so the
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
- * {@link parseMergeWatchMode} degraded to the "absent" value instead of
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
- * Parse `--override-review-block <reason>` — the sanctioned,
137
- * logged override of a Story-scope code-review critical blocker.
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 parseOverrideReviewBlock} degraded to absent instead of throwing, for
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
- * Standardized CLI argument parser for sprint scripts.
183
- * Supports options like --epic, --story, --dry-run, --skip-dashboard.
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
- // Story #4543 — per-run override of `delivery.mergeWatch.maxWaitSeconds`
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
- // Close-and-land: `--wait-merge` forces land-in-close; `--no-wait-merge`
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
- * Parse argv **without ever throwing**, returning the fields alongside the
313
- * rejection rather than in place of it.
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
- * `.agents/scripts/lib/cli-usage.js` — the one implementation of `--help` for
3
- * every top-level script under `.agents/scripts/`.
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
- * ## Why
6
- *
7
- * A script's flag contract used to live in the workflow prose that invoked it
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
- * Settle one CLI run: await `main`, translate its outcome into an exit code,
38
- * then flush stdio.
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
- * Fallback lint command. The gate is mandatory, and this string is the exact
22
- * command the gate spawned before `project.commands.lint` existed — an
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
- * Resolve a string `project.commands.<key>` with a fallback when the
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 — fall through to the framework default.
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
- * Resolve the lint command. Reads `project.commands.lint`; falls back to
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
- * Compute the Story-diff file scope for formatter gates. The default Biome
135
- * formatter used to run against `.` from inside `.worktrees/story-*`, which
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
- * File extensions Biome's formatter can process. Used to filter the
170
- * changed-file scope down to the formatter-eligible subset (Story #3410):
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
- * Whether a changed path is eligible for the default (biome) formatter,
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);