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,211 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- // .agents/scripts/check-baseline-drift.js — scheduled full-scope baseline
4
- // drift check (Story #4776).
5
- //
6
- // The three per-PR enforcement sites (close-validation, pre-push, CI) are all
7
- // diff-scoped: they compare the files a branch touched against their committed
8
- // baseline rows. A file nobody touches after its row is written is therefore
9
- // never re-scored, so drift introduced indirectly — a dependency getting more
10
- // complex, coverage moving underneath a method — stays invisible indefinitely.
11
- //
12
- // This CLI is the periodic full-scope counterpart. It re-scores every target
13
- // directory through the same scorer that writes the baseline, prints a per-row
14
- // before/after table for everything that moved beyond the gate's tolerance,
15
- // and exits non-zero when it finds any — so a consumer can wire it as a
16
- // scheduled CI job without wrapping it in verdict-parsing glue. This repo
17
- // schedules the maintainability kind in `.github/workflows/baseline-drift.yml`;
18
- // a consumer materializing `.agents/` still owns its own schedule.
19
- //
20
- // `--require-scored` exists because the default skip-is-green contract below
21
- // is a fail-open trap for exactly that scheduled use. Measured on this repo:
22
- // `check-baseline-drift.js --gate crap` with no `coverage/coverage-final.json`
23
- // present prints "✅ No baseline drift detected" and exits 0 — a nightly job
24
- // wired that way reports green while having measured nothing. The flag turns
25
- // every skip into exit 2, so a job that asked for a kind and did not get it
26
- // reds instead.
27
- //
28
- // Exit codes:
29
- // 0 — no drift (or every kind skipped: disabled gate, no baseline, no scorer)
30
- // 1 — drift detected in at least one kind
31
- // 2 — the check itself could not run (including: a requested kind was
32
- // skipped and `--require-scored` was passed)
33
-
34
- // Fail-fast if the framework's runtime deps are not installed — must be the
35
- // first import so the check runs before any third-party-importing sibling
36
- // module is evaluated (Story #3432).
37
- import './lib/runtime-deps/ensure-installed.js';
38
- import {
39
- DRIFT_KINDS,
40
- detectBaselineDrift,
41
- formatDriftReport,
42
- } from './lib/baselines/drift-detector.js';
43
- import { runAsCli } from './lib/cli-utils.js';
44
-
45
- export const HELP_TEXT = `Usage: node .agents/scripts/check-baseline-drift.js [options]
46
-
47
- Re-score the configured baselines FULL-SCOPE and report every row whose
48
- current score has drifted from its committed baseline by more than the
49
- gate's tolerance — including files untouched by any recent diff, which the
50
- diff-scoped gates structurally cannot see.
51
-
52
- Options:
53
- --gate <kind> Restrict to one kind (repeatable). Default: ${DRIFT_KINDS.join(', ')}.
54
- --tolerance <n> Override the per-gate absolute tolerance.
55
- --require-scored Treat a skipped kind (gate disabled, no baseline, no
56
- scorer, nothing scored) as a failure rather than a pass.
57
- Use this in scheduled jobs: without it a kind that could
58
- not be scored at all reports green.
59
- --json Emit the machine-readable report instead of the table.
60
- -h, --help Show this help.
61
-
62
- Exit codes: 0 no drift · 1 drift detected · 2 the check could not run.
63
-
64
- On drift, refresh with the printed \`*:update -- --full-scope\` command and
65
- commit the result with a \`baseline-refresh:\` tagged subject (non-empty body).`;
66
-
67
- /**
68
- * Parse the CLI surface. Unknown flags are rejected so a typo'd `--gate`
69
- * cannot silently widen a scheduled job's scope.
70
- *
71
- * @param {string[]} argv
72
- * @returns {{ kinds: string[], tolerance: number|null, json: boolean, requireScored: boolean }}
73
- */
74
- export function parseArgs(argv = []) {
75
- const kinds = [];
76
- let tolerance = null;
77
- let json = false;
78
- // Lifted out of the loop rather than added to its else-if chain: the chain
79
- // is the file's most complex method already, and a valueless boolean flag
80
- // needs no positional handling to be recognised.
81
- const requireScored = argv.includes('--require-scored');
82
- const rest = argv.filter((a) => a !== '--require-scored');
83
- for (let i = 0; i < rest.length; i += 1) {
84
- const arg = rest[i];
85
- if (arg === '--gate' && rest[i + 1]) {
86
- const kind = rest[i + 1];
87
- if (!DRIFT_KINDS.includes(kind)) {
88
- throw new Error(
89
- `[drift] unknown --gate "${kind}"; expected one of ${DRIFT_KINDS.join(', ')}`,
90
- );
91
- }
92
- kinds.push(kind);
93
- i += 1;
94
- } else if (arg === '--tolerance' && rest[i + 1]) {
95
- const value = Number(rest[i + 1]);
96
- if (!Number.isFinite(value)) {
97
- throw new Error(
98
- `[drift] --tolerance must be a number (got ${rest[i + 1]})`,
99
- );
100
- }
101
- tolerance = value;
102
- i += 1;
103
- } else if (arg === '--json') {
104
- json = true;
105
- } else {
106
- throw new Error(`[drift] unrecognised argument "${arg}"`);
107
- }
108
- }
109
- return {
110
- kinds: kinds.length > 0 ? kinds : [...DRIFT_KINDS],
111
- tolerance,
112
- json,
113
- requireScored,
114
- };
115
- }
116
-
117
- /**
118
- * Render the `--require-scored` verdict for a completed run.
119
- *
120
- * A skip is the detector's honest answer to "I could not score this kind" —
121
- * `{ ok: true, skipped: '<reason>' }` — and the default contract maps that to
122
- * a pass so an ad-hoc run does not red because coverage happened to be absent.
123
- * Under `--require-scored` the same answer is a failure: the caller named the
124
- * kinds it wanted measured, and a kind that was not measured is a gap, not a
125
- * clean bill of health.
126
- *
127
- * Returns `null` when the flag is off or nothing was skipped, so the caller
128
- * keeps the run's own 0/1 verdict untouched. Both "off" and "nothing skipped"
129
- * are answered here rather than at the call site: the caller is the file's
130
- * ratcheted entry point, and this is the branch's natural home anyway.
131
- *
132
- * @param {{ results?: Array<{ kind: string, skipped?: string }> }} run
133
- * @param {boolean} requireScored Whether `--require-scored` was passed.
134
- * @returns {string|null} the operator-facing failure note, or null.
135
- */
136
- function requireScoredFailure(run, requireScored) {
137
- if (!requireScored) return null;
138
- const skipped = (run?.results ?? []).filter((r) => r?.skipped);
139
- if (skipped.length === 0) return null;
140
- const detail = skipped.map((r) => `${r.kind} (${r.skipped})`).join(', ');
141
- return (
142
- `[drift] ❌ --require-scored: ${skipped.length} requested kind(s) were ` +
143
- `not scored — ${detail}. The verdict above covers only the kinds that ` +
144
- 'DID score, which is why it can read clean. A scheduled run that cannot ' +
145
- 'measure a kind is not a clean run; fix the cause (a missing coverage ' +
146
- 'artifact, a missing baseline, a disabled gate) or drop the kind from ' +
147
- 'the invocation.'
148
- );
149
- }
150
-
151
- /**
152
- * Run the drift check and render it. Returns the process exit code rather
153
- * than exiting, so the whole path is unit-testable.
154
- *
155
- * @param {{ argv?: string[], cwd?: string, detect?: typeof detectBaselineDrift }} opts
156
- * @returns {Promise<{ exitCode: number, output: string }>}
157
- */
158
- export async function runCheckBaselineDrift({
159
- argv = [],
160
- cwd = process.cwd(),
161
- detect = detectBaselineDrift,
162
- } = {}) {
163
- const args = parseArgs(argv);
164
- const run = await detect({
165
- kinds: args.kinds,
166
- cwd,
167
- tolerance: args.tolerance,
168
- });
169
- const base = args.json
170
- ? JSON.stringify({ schemaVersion: '1', ...run }, null, 2)
171
- : formatDriftReport(run);
172
- // The note is appended rather than substituted: the drift table is still the
173
- // useful half of the report for whichever kinds DID score. A note present at
174
- // all means a requested kind went unmeasured, which is exit 2 regardless of
175
- // what the measured kinds reported.
176
- const unscored = requireScoredFailure(run, args.requireScored);
177
- if (unscored) return { exitCode: 2, output: `${base}\n${unscored}` };
178
- return { exitCode: run.ok ? 0 : 1, output: base };
179
- }
180
-
181
- /**
182
- * Run the drift check and *return* its exit code rather than calling
183
- * `process.exit()` — this CLI prints one row per drifted baseline entry
184
- * full-scope, so its report is exactly the kind of payload that outgrows the
185
- * 64 KiB pipe buffer under a `| tee`. `process.exit()` terminates before a
186
- * queued async pipe write drains, silently truncating it (Story #4783, the
187
- * same defect `check-baselines.js` carried). Handing the code back lets
188
- * `runAsCli`'s `propagateExitCode` path settle it through
189
- * `settleCli`/`flushStdio` instead. The 0/1/2 contract documented at the top
190
- * of this file is unchanged — only *when* the process leaves is.
191
- *
192
- * @returns {Promise<number>} 0 no drift, 1 drift detected, 2 could not run.
193
- */
194
- async function main() {
195
- let result;
196
- try {
197
- result = await runCheckBaselineDrift({ argv: process.argv.slice(2) });
198
- } catch (err) {
199
- process.stdout.write(`${err?.message ?? String(err)}\n`);
200
- return 2;
201
- }
202
- process.stdout.write(`${result.output}\n`);
203
- return result.exitCode;
204
- }
205
-
206
- runAsCli(import.meta.url, main, {
207
- source: 'check-baseline-drift',
208
- usage: HELP_TEXT,
209
- exitCode: 2,
210
- propagateExitCode: true,
211
- });
@@ -1,362 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- // .agents/scripts/check-baseline-scope.js — Story #5012.
4
- //
5
- // Assert that every committed baseline's ROW SET still describes the tree.
6
- //
7
- // `check-baselines.js` answers "did a measured value regress?" and answers it
8
- // well. Nothing answered the prior question: does this baseline still measure
9
- // the right files? A row can point at a file deleted months ago, and an
10
- // in-scope file can carry no row at all, while every gate stays green — a
11
- // ratchet is perfectly capable of being green over almost nothing.
12
- //
13
- // This gate is measurement-free by construction. It runs no scorer, needs no
14
- // coverage artifact and no test run: it walks the directories the gate's own
15
- // config names (`lib/baselines/scope-inventory.js`) and compares that set
16
- // against the committed rows in both directions
17
- // (`lib/baselines/scope-assert.js`). That is what makes it cheap enough to be
18
- // a required check, and what makes its companion —
19
- // `prune-baseline-orphans.js` — a one-command remedy rather than a full
20
- // re-score.
21
- //
22
- // Exit codes:
23
- // 0 no fatal divergence (inherited divergence may still be warned about)
24
- // 1 fatal divergence — attributable to this change set, or strict mode
25
- // 2 the check could not run (unreadable config, unusable repository)
26
-
27
- // Fail-fast if the framework's runtime deps are not installed — must be the
28
- // first import so the check runs before any third-party-importing sibling
29
- // module is evaluated (Story #3432).
30
- import './lib/runtime-deps/ensure-installed.js';
31
- import fs from 'node:fs';
32
- import path from 'node:path';
33
- import { _internals as readerInternals } from './lib/baselines/reader.js';
34
- import {
35
- assertScope,
36
- attributeDivergence,
37
- resolveStrictness,
38
- } from './lib/baselines/scope-assert.js';
39
- import {
40
- buildScopeInventory,
41
- SCOPE_KINDS,
42
- } from './lib/baselines/scope-inventory.js';
43
- import { runAsCli } from './lib/cli-utils.js';
44
- import { getQuality } from './lib/config/quality.js';
45
- import { resolveConfig } from './lib/config-resolver.js';
46
- import { gitSpawn } from './lib/git-utils.js';
47
-
48
- const EXIT_PASS = 0;
49
- const EXIT_DIVERGED = 1;
50
- const EXIT_CANNOT_RUN = 2;
51
-
52
- /**
53
- * Files whose edit makes merge-base attribution untrustworthy: once a branch
54
- * has rewritten the scope rules themselves, "which side of the merge-base
55
- * introduced this row" is no longer a question the diff can answer.
56
- */
57
- const SCOPE_CONFIG_PATHS = Object.freeze([
58
- '.c8rc.cjs',
59
- '.agentrc.json',
60
- '.agentrc.local.json',
61
- ]);
62
-
63
- const HELP = {
64
- invocation:
65
- 'node .agents/scripts/check-baseline-scope.js [--kind <kind>] [--base <ref>] [--strict] [--json]',
66
- summary:
67
- "Assert each committed baseline's row set still describes the tree — in-scope files with no row, and rows whose file is gone or out of scope.",
68
- flags: [
69
- ['--kind <kind>', 'Check one kind only (repeatable). Default: all.'],
70
- ['--base <ref>', 'Attribution base ref. Default: origin/<baseBranch>.'],
71
- ['--strict', 'Treat every divergence as fatal, skipping attribution.'],
72
- ['--json', 'Emit the report as JSON instead of text.'],
73
- ['--cwd <dir>', 'Repository root to check. Default: process.cwd().'],
74
- ],
75
- notes: [
76
- 'Exit codes:\n 0 no fatal divergence\n 1 fatal divergence\n 2 the check could not run',
77
- 'Remedy for a stale row: node .agents/scripts/prune-baseline-orphans.js',
78
- ],
79
- };
80
-
81
- /**
82
- * Parse argv into an options bag. Unknown flags are a config error rather than
83
- * a silent no-op — a typo'd `--kinds` must not read as "check everything".
84
- *
85
- * @param {string[]} argv
86
- * @returns {{ kinds: string[], base: string | null, strict: boolean, json: boolean, cwd: string }}
87
- */
88
- export function parseArgs(argv = []) {
89
- const out = { kinds: [], base: null, strict: false, json: false, cwd: null };
90
- let i = 0;
91
- while (i < argv.length) {
92
- const arg = argv[i];
93
- const value = argv[i + 1];
94
- i += 1;
95
- if (arg === '--strict') out.strict = true;
96
- else if (arg === '--json') out.json = true;
97
- else if (arg === '--kind') {
98
- out.kinds.push(value);
99
- i += 1;
100
- } else if (arg === '--base') {
101
- out.base = value;
102
- i += 1;
103
- } else if (arg === '--cwd') {
104
- out.cwd = value;
105
- i += 1;
106
- } else throw new Error(`unknown flag "${arg}" (try --help)`);
107
- }
108
- const unknown = out.kinds.filter((k) => !SCOPE_KINDS.includes(k));
109
- if (unknown.length > 0) {
110
- throw new Error(
111
- `unknown --kind ${unknown.join(', ')}; expected one of ${SCOPE_KINDS.join(', ')}`,
112
- );
113
- }
114
- if (out.kinds.length === 0) out.kinds = [...SCOPE_KINDS];
115
- out.cwd = out.cwd ?? process.cwd();
116
- return out;
117
- }
118
-
119
- /**
120
- * Resolve the merge base between HEAD and the requested base ref, preferring
121
- * the remote-tracking ref so a stale local `main` cannot widen attribution.
122
- *
123
- * Returns `{ base: null }` when no candidate resolves — the strictness
124
- * resolver treats that as a reason to fail towards strict, never as a licence
125
- * to skip.
126
- *
127
- * @param {{ cwd: string, baseRef: string }} params
128
- * @returns {{ base: string | null, aheadOfBase: boolean }}
129
- */
130
- function resolveMergeBase({ cwd, baseRef }) {
131
- for (const candidate of [`origin/${baseRef}`, baseRef]) {
132
- const merged = gitSpawn(cwd, 'merge-base', candidate, 'HEAD');
133
- if (merged.status !== 0 || merged.stdout.length === 0) continue;
134
- const head = gitSpawn(cwd, 'rev-parse', 'HEAD');
135
- return {
136
- base: merged.stdout,
137
- aheadOfBase: head.status === 0 && head.stdout !== merged.stdout,
138
- };
139
- }
140
- return { base: null, aheadOfBase: false };
141
- }
142
-
143
- /**
144
- * Enumerate what `<base>..HEAD` did to the tree, split into the two sets
145
- * attribution needs. A rename contributes its old path to `removed` and its
146
- * new path to `added`, which is exactly how a rename strands a row.
147
- *
148
- * @param {{ cwd: string, base: string | null }} params
149
- * @returns {{ added: string[], removed: string[], changed: string[] }}
150
- */
151
- function readChangeSet({ cwd, base }) {
152
- const empty = { added: [], removed: [], changed: [] };
153
- if (base === null) return empty;
154
- const diff = gitSpawn(cwd, 'diff', '--name-status', '-M', `${base}..HEAD`);
155
- if (diff.status !== 0) return empty;
156
- const added = [];
157
- const removed = [];
158
- const changed = [];
159
- for (const line of diff.stdout.split('\n').filter(Boolean)) {
160
- const [code, first, second] = line.split('\t');
161
- const letter = code[0];
162
- if (letter === 'R' || letter === 'C') {
163
- removed.push(first);
164
- added.push(second);
165
- changed.push(first, second);
166
- continue;
167
- }
168
- if (letter === 'A') added.push(first);
169
- if (letter === 'D') removed.push(first);
170
- changed.push(first);
171
- }
172
- return { added, removed, changed };
173
- }
174
-
175
- /**
176
- * Repo-relative paths of every baseline file in play — the "did this change
177
- * set edit a baseline?" input to the strictness resolver.
178
- *
179
- * @param {{ cwd: string, kinds: string[] }} params
180
- * @returns {string[]}
181
- */
182
- function baselinePathsFor({ cwd, kinds }) {
183
- return kinds.map((kind) =>
184
- path
185
- .relative(cwd, readerInternals.resolveBaselinePath(kind, { cwd }))
186
- .split(path.sep)
187
- .join('/'),
188
- );
189
- }
190
-
191
- /**
192
- * Read a baseline's rows, or `null` when the kind ships no baseline in this
193
- * repository. Deliberately does NOT go through `reader.load`: an envelope too
194
- * stale to satisfy its schema is exactly the state this gate exists to report,
195
- * and refusing to read it would turn the report into a crash.
196
- *
197
- * @param {{ cwd: string, kind: string }} params
198
- * @returns {Array<object> | null}
199
- */
200
- function readRows({ cwd, kind }) {
201
- const abs = readerInternals.resolveBaselinePath(kind, { cwd });
202
- try {
203
- const parsed = JSON.parse(fs.readFileSync(abs, 'utf8'));
204
- return Array.isArray(parsed?.rows) ? parsed.rows : [];
205
- } catch {
206
- return null;
207
- }
208
- }
209
-
210
- /**
211
- * Assess one kind: inventory → both-directions assertion → attribution.
212
- *
213
- * @param {object} params
214
- * @returns {object} One entry of the report's `kinds` array.
215
- */
216
- function assessKind({ kind, cwd, quality, strict, changeSet }) {
217
- const rows = readRows({ cwd, kind });
218
- if (rows === null) {
219
- return { kind, present: false, skipped: true, reason: 'no baseline file' };
220
- }
221
- const inventory = buildScopeInventory({ kind, cwd, quality });
222
- const found = assertScope({
223
- inventory,
224
- rows,
225
- existsOnDisk: (rel) => fs.existsSync(path.resolve(cwd, rel)),
226
- });
227
- if (found.skipped) return { kind, present: true, ...found };
228
- const attributed = attributeDivergence({
229
- missing: found.missing,
230
- extra: found.extra,
231
- added: changeSet.added,
232
- removed: changeSet.removed,
233
- strict,
234
- });
235
- return {
236
- kind,
237
- present: true,
238
- skipped: false,
239
- reason: null,
240
- inScopeCount: inventory.files.length,
241
- rowCount: rows.length,
242
- ...attributed,
243
- };
244
- }
245
-
246
- /**
247
- * Run the whole assessment and return a report plus its exit code.
248
- *
249
- * @param {{ argv?: string[] }} [params]
250
- * @returns {{ report: object, exitCode: number }}
251
- */
252
- export function runScopeCheck({ argv = [] } = {}) {
253
- const opts = parseArgs(argv);
254
- const cwd = opts.cwd;
255
- const config = resolveConfig({ cwd });
256
- const quality = getQuality(config) ?? { gates: {} };
257
- const baseRef = opts.base ?? config?.project?.baseBranch ?? 'main';
258
- const { base, aheadOfBase } = resolveMergeBase({ cwd, baseRef });
259
- const changeSet = readChangeSet({ cwd, base });
260
- const strictness = opts.strict
261
- ? { strict: true, reason: 'operator requested --strict' }
262
- : resolveStrictness({
263
- base,
264
- aheadOfBase,
265
- changedFiles: changeSet.changed,
266
- baselinePaths: baselinePathsFor({ cwd, kinds: opts.kinds }),
267
- scopeConfigPaths: SCOPE_CONFIG_PATHS,
268
- });
269
- const kinds = opts.kinds.map((kind) =>
270
- assessKind({ kind, cwd, quality, strict: strictness.strict, changeSet }),
271
- );
272
- const fatalCount = kinds.reduce((sum, k) => sum + (k.fatalCount ?? 0), 0);
273
- const report = {
274
- schemaVersion: '1',
275
- base,
276
- strict: strictness.strict,
277
- strictReason: strictness.reason,
278
- fatalCount,
279
- warningCount: kinds.reduce((sum, k) => sum + (k.warningCount ?? 0), 0),
280
- kinds,
281
- };
282
- return { report, exitCode: fatalCount > 0 ? EXIT_DIVERGED : EXIT_PASS };
283
- }
284
-
285
- /**
286
- * Render one kind's findings as indented text lines.
287
- *
288
- * @param {object} entry
289
- * @returns {string[]}
290
- */
291
- function renderKind(entry) {
292
- if (entry.skipped) return [` - ${entry.kind}: skipped (${entry.reason})`];
293
- const head =
294
- ` - ${entry.kind}: ${entry.rowCount} row(s) over ${entry.inScopeCount} ` +
295
- `in-scope file(s) — ${entry.fatalCount} fatal, ${entry.warningCount} inherited`;
296
- const lines = [head];
297
- for (const file of entry.fatal.missing) {
298
- lines.push(` ✗ missing row: ${file}`);
299
- }
300
- for (const row of entry.fatal.extra) {
301
- lines.push(` ✗ stale row (${row.reason}): ${row.path}`);
302
- }
303
- return lines;
304
- }
305
-
306
- /**
307
- * Render the whole report as text.
308
- *
309
- * @param {object} report
310
- * @returns {string}
311
- */
312
- export function formatReport(report) {
313
- const mode = report.strict ? 'strict' : 'attributed';
314
- const lines = [
315
- `[check-baseline-scope] ${report.fatalCount} fatal, ${report.warningCount} inherited ` +
316
- `(${mode}: ${report.strictReason})`,
317
- ...report.kinds.flatMap(renderKind),
318
- ];
319
- if (report.fatalCount > 0) {
320
- lines.push(
321
- '',
322
- 'A baseline no longer describes the tree. Prune provably-inert rows with:',
323
- ' node .agents/scripts/prune-baseline-orphans.js',
324
- 'A missing row means a file was added without being measured — run that',
325
- "kind's producer (npm run coverage:update / maintainability:update).",
326
- );
327
- }
328
- return lines.join('\n');
329
- }
330
-
331
- /**
332
- * CLI entry point. Returns its exit code rather than calling `process.exit()`,
333
- * so `runAsCli`'s `propagateExitCode` path settles it through `flushStdio` and
334
- * an unbounded report is not truncated at a pipe boundary (Story #4783).
335
- *
336
- * @returns {Promise<number>}
337
- */
338
- async function main() {
339
- let result;
340
- try {
341
- result = runScopeCheck({ argv: process.argv.slice(2) });
342
- } catch (err) {
343
- const message = err?.message ?? String(err);
344
- process.stdout.write(
345
- `${JSON.stringify({ schemaVersion: '1', error: message }, null, 2)}\n`,
346
- );
347
- return EXIT_CANNOT_RUN;
348
- }
349
- const opts = { json: process.argv.includes('--json') };
350
- process.stdout.write(
351
- opts.json
352
- ? `${JSON.stringify(result.report, null, 2)}\n`
353
- : `${formatReport(result.report)}\n`,
354
- );
355
- return result.exitCode;
356
- }
357
-
358
- runAsCli(import.meta.url, main, {
359
- source: 'check-baseline-scope',
360
- usage: HELP,
361
- propagateExitCode: true,
362
- });