mandrel 2.60.0 → 2.62.0

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