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,52 +1,14 @@
1
1
  /**
2
- * conventional-subject.js — the pure Conventional-Commit rules behind the
3
- * squash-merge subject a standalone Story lands on `main`.
4
- *
5
- * Split out of `normalize-pr-title.js` so the rules that decide
6
- * what the release notes say are testable without a git read. The three rules
7
- * here each closed a defect observed live on `main`:
8
- *
9
- * 1. **Type precedence follows release impact.** A multi-commit Story used
10
- * to resolve its type off a hand-ordered list in which `docs` outranked
11
- * `chore` for no stated reason. Story #5004 (`chore(gates)`, `docs(ci)`,
12
- * `chore(baselines)`) therefore landed as
13
- * `docs: check/CI gate sweep …` — a change that deleted five
14
- * `lib/checks` modules, two CLIs and a dependency, filed under
15
- * documentation. `TYPE_RANK` now mirrors `changelog-sections` in
16
- * `release-please-config.json`: rank IS how visible the type is in the
17
- * release notes. Types that render identically (the six `hidden: true`
18
- * ones) share a rank, because there is no honest ordering between them —
19
- * those ties break on how much of the branch carries the type, then on
20
- * the Story's primary (oldest) commit.
21
- *
22
- * 2. **Casing leaves acronyms alone.** The old synthesizer lowercased the
23
- * first character unconditionally to satisfy commitlint's `subject-case`
24
- * rule, which turned Story #5002's "CRAP surface diet" into
25
- * `refactor: cRAP surface diet`. `shapeDescription` lowercases only when
26
- * the leading word is not an all-caps token, so CRAP / CI / QA / API
27
- * survive. That is a deliberate, narrow trade: commitlint's
28
- * `subject-case` treats ANY leading capital as sentence-case and would
29
- * flag `CRAP surface diet` — but commitlint never runs on a PR title or
30
- * a GitHub squash subject (see `rules/git-conventions.md` §
31
- * Conventional Commits), so the rule it would fail is not a gate this
32
- * subject passes through, while a mangled acronym is permanent in the
33
- * changelog.
34
- *
35
- * 3. **A breaking change survives the squash.** release-please only sees a
36
- * breaking change through a `!` in the subject or a `BREAKING CHANGE:`
37
- * footer. Story #5004 removed `project.commands.lintBaseline` from a
38
- * schema block that is `additionalProperties: false` — a hard consumer
39
- * break — described in prose in the commit body and therefore invisible
40
- * to the parser. `collectBreakingNotes` reads the footer out of any
41
- * constituent commit (or a Story-body declaration) and `markBreaking`
42
- * puts the `!` where the parser looks.
2
+ * conventional-subject.js — pure Conventional-Commit rules for the squash
3
+ * subject a Story lands on `main`: type precedence by release impact,
4
+ * acronym-safe casing (commitlint never sees a squash subject, but a mangled
5
+ * acronym is permanent in the changelog), and a breaking change that
6
+ * survives the squash as a `!`.
43
7
  */
44
8
 
45
9
  /**
46
- * The Conventional-Commit types Mandrel accepts. Mirrors
47
- * `commitlint.config.js` → `type-enum` and `release-please-config.json` →
48
- * `changelog-sections`. Kept in sync by hand (single hard-cutover, no
49
- * shim) — adding a type means touching all three.
10
+ * Mirrors commitlint `type-enum` and release-please `changelog-sections`;
11
+ * kept in sync by hand.
50
12
  */
51
13
  const CONVENTIONAL_TYPES = Object.freeze([
52
14
  'feat',
@@ -63,11 +25,8 @@ const CONVENTIONAL_TYPES = Object.freeze([
63
25
  ]);
64
26
 
65
27
  /**
66
- * Release-impact rank per type — LOWER wins. Derived from
67
- * `changelog-sections` in `release-please-config.json`: the five types that
68
- * render a visible section are ordered by how much a reader needs to see
69
- * them, and the six `hidden: true` types share the bottom rank because the
70
- * release notes draw no distinction between them.
28
+ * Release-impact rank, LOWER wins, from `changelog-sections`; the hidden
29
+ * types tie because the release notes don't distinguish them.
71
30
  *
72
31
  * @type {Readonly<Record<string, number>>}
73
32
  */
@@ -85,48 +44,28 @@ const TYPE_RANK = Object.freeze({
85
44
  ci: 5, // hidden
86
45
  });
87
46
 
88
- /** Rank for a type absent from `TYPE_RANK` — always loses. */
89
47
  const UNRANKED = Number.MAX_SAFE_INTEGER;
90
48
 
91
49
  const TYPE_GROUP = CONVENTIONAL_TYPES.join('|');
92
50
 
93
- // Anchored Conventional-Commit header matcher:
94
- // <type>(<optional scope>)<optional !>: <non-empty description>
95
- // Mirrors the shape `@commitlint/config-conventional` enforces (a known
96
- // type, an optional parenthesised scope, an optional breaking `!`, a
97
- // colon-space separator, and a non-empty subject). Used for the pure
98
- // "is this already conventional?" check and to pull the type off a branch
99
- // commit subject without spawning commitlint per call.
51
+ // <type>(<scope>)?!?: <description> — the shape config-conventional enforces.
100
52
  const CONVENTIONAL_HEADER_RE = new RegExp(
101
53
  `^(?:${TYPE_GROUP})(?:\\([^()\\r\\n]+\\))?!?: \\S.*$`,
102
54
  );
103
55
  const LEADING_TYPE_RE = new RegExp(
104
56
  `^(${TYPE_GROUP})(?:\\([^()\\r\\n]+\\))?(!?):`,
105
57
  );
106
- // Splits a conventional header into `<type><scope?>`, `<!?>`, `<description>`
107
- // so the breaking marker can be inserted at the one position the parser reads.
108
58
  const HEADER_PARTS_RE = new RegExp(
109
59
  `^((?:${TYPE_GROUP})(?:\\([^()\\r\\n]+\\))?)(!?): (.*)$`,
110
60
  );
111
61
 
112
- /**
113
- * The Conventional-Commits breaking footer, in both spellings the spec
114
- * defines (`BREAKING CHANGE:` and the hyphenated `BREAKING-CHANGE:`). Case is
115
- * significant — the spec requires uppercase, and so does
116
- * `conventional-commits-parser`'s default `noteKeywords`, so matching
117
- * case-insensitively here would announce breaks release-please will not.
118
- */
62
+ /** Case-sensitive, as the parser's `noteKeywords` are. */
119
63
  const BREAKING_FOOTER_RE = /^BREAKING[ -]CHANGE:[ \t]*(.*)$/;
120
64
 
121
- /** A git-trailer-shaped line (`Some-Token: value`) — ends a footer's text. */
122
65
  const TRAILER_RE = /^[A-Za-z][A-Za-z-]*:[ \t]/;
123
- /** An opening or closing markdown code fence: ``` or ~~~, optionally indented. */
124
66
  const FENCE_RE = /^\s{0,3}(`{3,}|~{3,})/;
125
67
 
126
68
  /**
127
- * True iff `subject` is a parseable Conventional Commit subject under the
128
- * repo's type vocabulary. Pure.
129
- *
130
69
  * @param {string} subject
131
70
  * @returns {boolean}
132
71
  */
@@ -136,9 +75,6 @@ export function isConventionalSubject(subject) {
136
75
  }
137
76
 
138
77
  /**
139
- * Extract the Conventional-Commit `type` from a single commit subject, or
140
- * `null` when the subject is not conventional. Pure.
141
- *
142
78
  * @param {string} subject
143
79
  * @returns {string|null}
144
80
  */
@@ -149,10 +85,8 @@ function parseConventionalType(subject) {
149
85
  }
150
86
 
151
87
  /**
152
- * Order two type candidates: release impact first, then how much of the
153
- * branch carries the type, then the earliest commit that used it. The second
154
- * and third keys only ever decide a tie inside the hidden tier — every
155
- * visible type holds its rank alone.
88
+ * Rank, then commit count, then earliest use (the tie-breaks only matter in
89
+ * the hidden tier).
156
90
  *
157
91
  * @param {{rank: number, count: number, firstIndex: number}} a
158
92
  * @param {{rank: number, count: number, firstIndex: number}} b
@@ -165,12 +99,8 @@ function compareTypeCandidates(a, b) {
165
99
  }
166
100
 
167
101
  /**
168
- * Pick the type the squash subject should carry from the branch's own commit
169
- * subjects. Returns `null` when no subject is conventional.
170
- *
171
- * `subjects` MUST be oldest-first: the final tie-break reads index 0 as the
172
- * Story's primary commit, the one whose type the operator chose before any
173
- * fixup or baseline-refresh commit piled on.
102
+ * `subjects` MUST be oldest-first: the last tie-break treats index 0 as the
103
+ * Story's primary commit.
174
104
  *
175
105
  * @param {string[]} subjects Commit subjects, oldest first.
176
106
  * @returns {string|null}
@@ -199,11 +129,8 @@ export function pickDominantType(subjects) {
199
129
  }
200
130
 
201
131
  /**
202
- * True when the leading word of `text` is an all-caps token — an acronym the
203
- * synthesizer must not touch. Requires two or more letters so a stray leading
204
- * "A" or "I" still lowercases; punctuation and digits are ignored so
205
- * `CRAP:`, `CI/CD` and `API-surface` all read as acronyms while `A11y` does
206
- * not.
132
+ * Leading all-caps word of 2+ letters (non-letters ignored), so `CI/CD` is an
133
+ * acronym but a lone "A" or `A11y` is not.
207
134
  *
208
135
  * @param {string} text
209
136
  * @returns {boolean}
@@ -215,10 +142,7 @@ function leadsWithAcronym(text) {
215
142
  }
216
143
 
217
144
  /**
218
- * Shape a human Story title into the description half of a synthesized
219
- * Conventional-Commit subject: lowercase the first character so the subject
220
- * reads as a sentence fragment, EXCEPT when the leading word is an acronym.
221
- * Pure.
145
+ * Lowercase the first character unless the leading word is an acronym.
222
146
  *
223
147
  * @param {string} text
224
148
  * @returns {string}
@@ -231,10 +155,7 @@ export function shapeDescription(text) {
231
155
  }
232
156
 
233
157
  /**
234
- * Insert the breaking-change `!` into a conventional subject, at the one
235
- * position `conventional-commits-parser` reads it: immediately before the
236
- * colon, after any scope. A subject that already carries `!`, or that is not
237
- * conventional, is returned unchanged. Pure.
158
+ * Insert `!` before the colon (after any scope); otherwise unchanged.
238
159
  *
239
160
  * @param {string} subject
240
161
  * @returns {string}
@@ -248,9 +169,7 @@ export function markBreaking(subject) {
248
169
  }
249
170
 
250
171
  /**
251
- * Pull the text of one `BREAKING CHANGE:` footer out of `lines`, starting at
252
- * the footer line itself. The note runs to the end of its paragraph: a blank
253
- * line, another trailer, or the end of the message closes it.
172
+ * A footer note runs until a blank line, another trailer, or the end.
254
173
  *
255
174
  * @param {string[]} lines
256
175
  * @param {number} start Index of the matched footer line.
@@ -271,22 +190,8 @@ function readFooterNote(lines, start, head) {
271
190
  }
272
191
 
273
192
  /**
274
- * Scan one commit message (or the Story body) for breaking-change evidence.
275
- *
276
- * @param {string} text
277
- * @param {boolean} readHeaderBang Whether line 0 is a commit header whose `!`
278
- * counts. False for the Story body, which has no header.
279
- * @returns {{ breaking: boolean, notes: string[], subject: string|null }}
280
- */
281
- /**
282
- * Blank every line inside a markdown code fence, keeping line indices intact.
283
- *
284
- * A Story `## Spec` that documents this very contract quotes the footer in a
285
- * fence; reading that as a declaration ships a `<type>!:` subject and a release
286
- * note for a break nobody made. Fenced spans are the only place the anchored
287
- * footer regex can fire on non-footer text — an indented block or a blockquote
288
- * already fails the `^` anchor. Blanking rather than dropping means a fence
289
- * also closes an open footer note, which is what a paragraph break would do.
193
+ * Blank lines inside code fences, so a quoted footer is not a declaration;
194
+ * blanking (not dropping) keeps indices and closes an open note.
290
195
  *
291
196
  * @param {string[]} lines
292
197
  * @returns {string[]}
@@ -302,6 +207,11 @@ function blankFencedLines(lines) {
302
207
  });
303
208
  }
304
209
 
210
+ /**
211
+ * @param {string} text
212
+ * @param {boolean} readHeaderBang False for the Story body, which has no header.
213
+ * @returns {{ breaking: boolean, notes: string[], subject: string|null }}
214
+ */
305
215
  function scanForBreaking(text, readHeaderBang) {
306
216
  const lines = blankFencedLines(String(text ?? '').split('\n'));
307
217
  const notes = [];
@@ -334,23 +244,9 @@ function scanForBreaking(text, readHeaderBang) {
334
244
  }
335
245
 
336
246
  /**
337
- * Collect the branch's breaking-change declarations.
338
- *
339
- * Two sources, both honoured:
340
- *
341
- * - **Any constituent commit** — a `BREAKING CHANGE:` / `BREAKING-CHANGE:`
342
- * footer, or a `!` in the header. This is the path a maker takes while
343
- * writing the commit that does the breaking.
344
- * - **The Story body** — the same footer, written as its own line anywhere
345
- * in the Story issue (the `## Spec` block is the natural home). This is
346
- * the declarative path: `/mandrel-plan` can state the break up front and close
347
- * propagates it even when no individual commit remembered the footer.
348
- * Only the footer form counts; prose describing a break does not, because
349
- * a keyword-free sentence is exactly what release-please cannot parse.
350
- *
351
- * When something is breaking but no footer supplied text, the `!` commit's
352
- * own description becomes the note — the fallback Conventional Commits
353
- * itself prescribes for a `!` header with no footer.
247
+ * Breaking declarations from any commit (footer or header `!`) or a footer
248
+ * line in the Story body; prose never counts. With no footer text, the `!`
249
+ * commit's description is the note, per the spec.
354
250
  *
355
251
  * @param {{ commitMessages?: string[], storyBody?: string }} args
356
252
  * @returns {{ breaking: boolean, notes: string[] }}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * phases/graphql-preflight.js — refuse the close during `init` when GitHub
3
+ * GraphQL (which all of `gh pr` needs) is unreachable, before any gate runs
4
+ * or anything is pushed. It must never fail a healthy close: ambiguous or
5
+ * throwing probes are fail-open.
6
+ */
7
+
8
+ import {
9
+ describeGraphqlPreflight,
10
+ probeGraphqlAvailability,
11
+ } from '../../../gh-exec.js';
12
+ import { Logger } from '../../../Logger.js';
13
+ import {
14
+ STATE_LABELS,
15
+ transitionTicketState,
16
+ upsertStructuredComment,
17
+ } from '../../ticketing.js';
18
+
19
+ /**
20
+ * Best-effort: a notification failure must not replace the real blocker.
21
+ * Canonical mutators only, so the Projects v2 column syncs.
22
+ *
23
+ * @param {{ provider: object, storyId: number, reason: string,
24
+ * progress: (tag: string, msg: string) => void }} args
25
+ * @returns {Promise<void>}
26
+ */
27
+ async function announcePreflightBlock({ provider, storyId, reason, progress }) {
28
+ const body = [
29
+ '### Close refused during `init`: GitHub GraphQL preflight',
30
+ '',
31
+ reason,
32
+ '',
33
+ 'Nothing was validated, committed, or pushed — the preflight runs before the',
34
+ 'gate chain, so re-running close from a session that can reach GraphQL starts',
35
+ 'from exactly where this Story stands now:',
36
+ '',
37
+ '```bash',
38
+ `node .agents/scripts/single-story-close.js --story ${storyId}`,
39
+ '```',
40
+ ].join('\n');
41
+ try {
42
+ await upsertStructuredComment(provider, storyId, 'friction', body);
43
+ progress('PREFLIGHT', `📝 Posted friction comment on #${storyId}.`);
44
+ } catch (err) {
45
+ Logger.warn?.(
46
+ `[single-story-close] ⚠️ Failed to post preflight friction comment on #${storyId}: ${err?.message ?? err}`,
47
+ );
48
+ }
49
+ try {
50
+ await transitionTicketState(provider, storyId, STATE_LABELS.BLOCKED, {});
51
+ progress('PREFLIGHT', `🚧 Flipped Story #${storyId} → agent::blocked.`);
52
+ } catch (err) {
53
+ Logger.warn?.(
54
+ `[single-story-close] ⚠️ Failed to flip Story #${storyId} to agent::blocked: ${err?.message ?? err}`,
55
+ );
56
+ }
57
+ }
58
+
59
+ /**
60
+ * A throwing (injected) probe is treated as available.
61
+ *
62
+ * @param {{
63
+ * storyId: number,
64
+ * provider: object,
65
+ * progress: (tag: string, msg: string) => void,
66
+ * ghFacade?: { api: Function },
67
+ * probe?: typeof probeGraphqlAvailability,
68
+ * }} args `ghFacade` is the run's own, so it asks the same boundary the PR phase will.
69
+ * @returns {Promise<{ verdict: string, reason: string }|null>} null to proceed.
70
+ */
71
+ export async function runGraphqlPreflight({
72
+ storyId,
73
+ provider,
74
+ progress,
75
+ ghFacade,
76
+ probe = probeGraphqlAvailability,
77
+ }) {
78
+ let verdict;
79
+ try {
80
+ verdict = await probe(ghFacade ? { ghFacade } : undefined);
81
+ } catch (err) {
82
+ progress(
83
+ 'PREFLIGHT',
84
+ `⚠️ GraphQL preflight could not run (close continues): ${err?.message ?? err}`,
85
+ );
86
+ return null;
87
+ }
88
+ if (verdict?.available !== false) {
89
+ progress('PREFLIGHT', `✅ GitHub GraphQL reachable (${verdict?.reason}).`);
90
+ return null;
91
+ }
92
+ const reason = describeGraphqlPreflight(verdict);
93
+ progress('PREFLIGHT', `🛑 ${reason}`);
94
+ await announcePreflightBlock({ provider, storyId, reason, progress });
95
+ return { verdict: verdict.verdict, reason };
96
+ }
@@ -0,0 +1,49 @@
1
+ /**
2
+ * phases/lock-wait-pending.js — a close whose full-suite lock wait expired
3
+ * ends `pending`, not `failed`: nothing was spawned, pushed or labelled, so
4
+ * the next command is the same close.
5
+ */
6
+ import {
7
+ buildTerminalEnvelope,
8
+ NEXT_COMMANDS,
9
+ } from '../../story-deliver-terminal.js';
10
+
11
+ /**
12
+ * @param {{
13
+ * storyId: number,
14
+ * storyBranch: string,
15
+ * baseBranch: string,
16
+ * lockWait: { waitedSeconds: number, expired: boolean }|null,
17
+ * elapsedSeconds: number,
18
+ * }} args
19
+ * @returns {{ result: object, terminal: object, note: string }} The close
20
+ * result, the validated `pending` envelope, and the operator line.
21
+ */
22
+ export function lockWaitPending({
23
+ storyId,
24
+ storyBranch,
25
+ baseBranch,
26
+ lockWait,
27
+ elapsedSeconds,
28
+ }) {
29
+ const nextCommand = NEXT_COMMANDS.close(storyId);
30
+ return {
31
+ result: {
32
+ storyId,
33
+ standalone: true,
34
+ action: 'deferred',
35
+ reason: 'full-suite-lock-wait-expired',
36
+ },
37
+ terminal: buildTerminalEnvelope({
38
+ storyId,
39
+ status: 'pending',
40
+ phase: 'close-validation',
41
+ storyBranch,
42
+ baseBranch,
43
+ lockWait,
44
+ nextCommand,
45
+ elapsedSeconds,
46
+ }),
47
+ note: `⏸ Story #${storyId}: another full suite held the host lock past the wait budget — resume with: ${nextCommand}`,
48
+ };
49
+ }
@@ -1,41 +1,8 @@
1
1
  /**
2
- * normalize-pr-title.js — guarantee the standalone-Story PR title is a
3
- * valid Conventional Commit subject so the squash-merge subject on `main`
4
- * parses for release-please.
5
- *
6
- * Story #3969 (framework gap). The repo squash-merges, and GitHub uses the
7
- * PR title as the squash-commit subject. `buildPullRequest` previously
8
- * emitted the raw human issue title (`<storyTitle> (#<id>)`), which is a
9
- * plain description ("Rename the published npm package…") that
10
- * release-please's Conventional-Commit parser rejects:
11
- *
12
- * ❯ commit could not be parsed: … Rename the published npm package …
13
- * ❯ error: unexpected token ' ' at 1:7, valid tokens [(, !, :]
14
- * ❯ commits: 0 → no release cut
15
- *
16
- * The `commit-msg` commitlint Husky hook only validates *local* commits and
17
- * never runs on a GitHub-UI squash-merge title, so nothing mechanized the
18
- * documented "author the PR title in conventional form" contract. This
19
- * module mechanizes it.
20
- *
21
- * Contract (pure where possible — the only side effect is an injectable
22
- * `git log` read):
23
- *
24
- * - If `storyTitle` is **already** a parseable Conventional Commit
25
- * subject, it is preserved verbatim and suffixed with `(#<storyId>)`.
26
- * No re-prefixing, no double type.
27
- * - Otherwise the title is **synthesized** into conventional form:
28
- * `<type>: <descriptive text> (#<storyId>)`. The `type` is derived
29
- * from the branch's own (already-conventional) commit subjects when
30
- * available, falling back to a safe configured default (`chore`).
31
- * - Either way, a branch (or Story) that declares a breaking change gets
32
- * the `!` marker and a `BREAKING CHANGE:` footer on the PR body.
33
- *
34
- * The rules that decide *what* the subject says now live in
35
- * `conventional-subject.js` — type precedence, acronym-safe casing, and
36
- * breaking-change collection are pure and unit-tested there. What is left
37
- * here is the git read those rules consume and the assembly of the two
38
- * strings `gh pr create` needs.
2
+ * normalize-pr-title.js — make the PR title (GitHub's squash subject) a
3
+ * Conventional Commit so release-please can parse it; commitlint never sees
4
+ * a squash title. The subject rules live in `conventional-subject.js`; this
5
+ * module does the git read and assembles the `gh pr create` strings.
39
6
  */
40
7
 
41
8
  import { gitSpawn as defaultGitSpawn } from '../../../git-utils.js';
@@ -48,28 +15,14 @@ import {
48
15
  shapeDescription,
49
16
  } from './conventional-subject.js';
50
17
 
51
- /** Safe default Conventional-Commit type when none can be derived. */
52
18
  const DEFAULT_CONVENTIONAL_TYPE = 'chore';
53
19
 
54
- /**
55
- * Record separator between whole commit messages in the `git log` read. A NUL
56
- * cannot occur inside a commit message, so splitting on it is unambiguous —
57
- * unlike a blank-line or subject-prefix heuristic, which a commit body can
58
- * forge.
59
- */
20
+ /** NUL cannot occur in a commit message, so a body cannot forge a split. */
60
21
  const RECORD_SEP = '\u0000';
61
22
 
62
23
  /**
63
- * Read the branch's own commits (those unique to the Story branch relative to
64
- * the base branch) as whole messages — subject AND body, because the body is
65
- * where a `BREAKING CHANGE:` footer lives.
66
- *
67
- * Returns `[]` when the read fails, which degrades every downstream rule to
68
- * its safe default (type `chore`, no breaking marker) rather than throwing a
69
- * close that is otherwise healthy.
70
- *
71
- * Oldest-first (`--reverse`) is load-bearing: `pickDominantType` breaks a tie
72
- * on the Story's primary commit, which is the first one authored.
24
+ * Whole messages (bodies carry the breaking footer), oldest-first for the
25
+ * type tie-break. A failed read returns `[]`, degrading to safe defaults.
73
26
  *
74
27
  * @param {{
75
28
  * storyBranch: string,
@@ -119,16 +72,8 @@ function readBranchCommits({
119
72
  }
120
73
 
121
74
  /**
122
- * Produce the PR title and the breaking-change notes that belong with it.
123
- *
124
- * - Already-conventional `storyTitle` → preserved verbatim + `(#<id>)`.
125
- * - Otherwise → `<derivedType>: <shaped storyTitle> (#<id>)`.
126
- * - Empty / missing `storyTitle` → `<derivedType>: story #<id>`.
127
- * - Breaking → `!` inserted before the colon in either shape.
128
- *
129
- * `commitMessages` is the branch read (`readBranchCommits`); passing `[]`
130
- * yields the safe default type and no breaking marker. `storyBody` is the
131
- * Story issue's body, scanned for a declared `BREAKING CHANGE:` footer.
75
+ * A conventional title is kept verbatim; prose is synthesized as
76
+ * `<derivedType>: <shaped title>`. Either gets `(#<id>)` and, if breaking, `!`.
132
77
  *
133
78
  * @param {{
134
79
  * storyTitle: string,
@@ -151,9 +96,6 @@ function normalizePrTitle({
151
96
  storyBody,
152
97
  });
153
98
 
154
- // Already conventional → preserve verbatim (the maker's own casing and
155
- // scope survive), append the id reference. Only the breaking marker may be
156
- // added, and only when it is not already there.
157
99
  const subject = isConventionalSubject(trimmed)
158
100
  ? trimmed
159
101
  : synthesizeSubject({ description: trimmed, storyId, commitMessages });
@@ -163,8 +105,6 @@ function normalizePrTitle({
163
105
  }
164
106
 
165
107
  /**
166
- * Build a conventional subject for a Story whose title is plain prose.
167
- *
168
108
  * @param {{ description: string, storyId: number|string, commitMessages: string[] }} args
169
109
  * @returns {string}
170
110
  */
@@ -176,16 +116,8 @@ function synthesizeSubject({ description, storyId, commitMessages }) {
176
116
  }
177
117
 
178
118
  /**
179
- * Build the PR body.
180
- *
181
- * The `Closes #<id>` footer is what auto-closes the Story on merge. A
182
- * `BREAKING CHANGE:` footer goes LAST, as the spec requires, so that a repo
183
- * configured to use the PR body as the squash-commit message hands
184
- * release-please a parseable note rather than prose. When the squash body is
185
- * built from the constituent commit messages instead (GitHub's default, and
186
- * this repo's setting), the note still reaches `main` through whichever
187
- * commit carried the footer — and the `!` in the subject carries the signal
188
- * either way.
119
+ * `Closes #<id>` auto-closes the Story; a breaking footer goes LAST, per the
120
+ * spec, for repos that squash with the PR body.
189
121
  *
190
122
  * @param {{ storyId: number|string, breakingNotes?: string[] }} args
191
123
  * @returns {string}
@@ -203,13 +135,8 @@ function buildPrBody({ storyId, breakingNotes }) {
203
135
  }
204
136
 
205
137
  /**
206
- * Derive the two strings `gh pr create` needs. One `git log` read serves both
207
- * halves: the commit SUBJECTS decide the type, and the commit BODIES — plus
208
- * the Story body — decide whether this is a breaking change.
209
- *
210
- * A declared break is announced on the progress channel, because a `!` the
211
- * operator did not expect in the squash subject should be visible while the
212
- * close is running rather than discovered in the release notes.
138
+ * A declared break is announced on progress so an unexpected `!` is seen
139
+ * during the close, not in the release notes.
213
140
  *
214
141
  * @param {{ storyTitle: string, storyId: number|string, storyBody?: string,
215
142
  * storyBranch: string, baseBranch: string, cwd?: string,