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,212 +0,0 @@
1
- /**
2
- * pinned-override-resolve.js — resolve a documented override, and score its note.
3
- *
4
- * The reading half of `pinned-override-notes.js` next door: how an
5
- * `overrides` entry resolves to the range it actually imposes, and which
6
- * findings that range earns against the note describing it. The audit loop
7
- * stays there; everything a single note is judged by lives here.
8
- *
9
- * Pure: no filesystem, no npm, no network. The caller supplies the parsed
10
- * package document.
11
- */
12
-
13
- /**
14
- * npm's own reference syntax inside an `overrides` block: `"js-yaml": "$js-yaml"`
15
- * means "whatever `dependencies.js-yaml` says". It is the sanctioned way to
16
- * express the lockstep coupling these notes describe, so reading it as a
17
- * literal range — which is what a bare string compare does — flagged the fix as
18
- * the defect: `"$js-yaml" !== "^4.3.2"` produced a `lockstep` finding against a
19
- * pair that npm guarantees can never split, and a `stale-note` against a note
20
- * quoting the range actually in force.
21
- */
22
- const OVERRIDE_REFERENCE = /^\$(.*)$/;
23
-
24
- /**
25
- * A semver **range**, not only a caret/tilde one. The old pattern required a
26
- * `^` or `~` prefix, so a note describing an exact pin (`"1.2.3"`) quoted a
27
- * version the matcher could not see: `quoted` came back empty, the staleness
28
- * check short-circuits on an empty list, and the note was silently exempt from
29
- * the guarantee it exists to provide.
30
- */
31
- const SEMVER_RANGE = /(?:[\^~]|>=?|<=?|=)?\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?/g;
32
-
33
- /**
34
- * Extract every semver range that appears literally in a note's prose.
35
- *
36
- * Deliberately permissive about the surrounding words — a note is prose, and
37
- * pinning its phrasing would make it unwritable. What matters is only that
38
- * the range it quotes is the range in force.
39
- *
40
- * Not exported: it is an implementation detail of the audit below, and its
41
- * behaviour is observable through that — a note quoting only bare versions
42
- * yields no `stale-note`, a note quoting a mismatched range yields one.
43
- *
44
- * @param {string} text
45
- * @returns {string[]}
46
- */
47
- function quotedRanges(text) {
48
- if (typeof text !== 'string') return [];
49
- return [...text.matchAll(SEMVER_RANGE)].map((m) => m[0]);
50
- }
51
-
52
- /**
53
- * Look a dotted note key up in the `overrides` tree.
54
- *
55
- * An `overrides` value may be a nested object — `{"foo": {"bar": "1.2.3"}}`
56
- * scopes the `bar` override to `foo`'s subtree — so `overrides.foo.bar` names a
57
- * real pin two levels down. The exact key is tried first at every level,
58
- * because package names legitimately contain dots (`lodash.merge`), and only
59
- * then is the key split.
60
- *
61
- * @param {unknown} node
62
- * @param {string} dottedName
63
- * @returns {{ found: boolean, value?: unknown }}
64
- */
65
- function lookupOverride(node, dottedName) {
66
- if (!node || typeof node !== 'object') return { found: false };
67
- if (Object.hasOwn(node, dottedName)) {
68
- return { found: true, value: node[dottedName] };
69
- }
70
- const parts = dottedName.split('.');
71
- for (let i = 1; i < parts.length; i += 1) {
72
- const child = node[parts.slice(0, i).join('.')];
73
- const hit = lookupOverride(child, parts.slice(i).join('.'));
74
- if (hit.found) return hit;
75
- }
76
- return { found: false };
77
- }
78
-
79
- /**
80
- * Resolve the range a documented override actually imposes.
81
- *
82
- * @param {object} params
83
- * @returns {{ kind: 'missing'|'pinned'|'reference'|'unsupported', range?: string,
84
- * raw?: unknown, referenced?: string, detail?: string }}
85
- */
86
- export function resolvePin({ overrides, dependencies, name }) {
87
- const hit = lookupOverride(overrides, name);
88
- if (!hit.found) return { kind: 'missing' };
89
- if (typeof hit.value !== 'string') {
90
- return {
91
- kind: 'unsupported',
92
- raw: hit.value,
93
- detail:
94
- 'resolves to a nested override object rather than a range. Key the note at the leaf ' +
95
- '(e.g. "overrides.<parent>.<name>") so the range it describes is the one checked.',
96
- };
97
- }
98
- const reference = OVERRIDE_REFERENCE.exec(hit.value);
99
- return reference
100
- ? resolveReference({
101
- raw: hit.value,
102
- target: reference[1] || name,
103
- dependencies,
104
- })
105
- : { kind: 'pinned', range: hit.value };
106
- }
107
-
108
- /**
109
- * Resolve npm's `"$name"` reference to the direct range it points at.
110
- *
111
- * @param {{ raw: string, target: string, dependencies: object }} params
112
- * @returns {{ kind: 'reference'|'unsupported', range?: string, raw?: string,
113
- * referenced: string, detail?: string }}
114
- */
115
- function resolveReference({ raw, target, dependencies }) {
116
- const direct = dependencies[target];
117
- if (typeof direct !== 'string') {
118
- return {
119
- kind: 'unsupported',
120
- raw,
121
- referenced: target,
122
- detail: `references "${raw}", but dependencies.${target} does not exist, so npm has nothing to resolve the override to.`,
123
- };
124
- }
125
- return { kind: 'reference', range: direct, referenced: target };
126
- }
127
-
128
- /**
129
- * Score one documented override against its note. Split out of the loop above
130
- * so each finding's rationale sits next to the condition that raises it.
131
- *
132
- * @param {{ key: string, name: string, text: unknown, resolved: object,
133
- * direct: string|undefined }} params
134
- * @returns {Array<{ kind: string, name: string, detail: string }>}
135
- */
136
- export function scoreNote({ key, name, text, resolved, direct }) {
137
- const refusal = refuseNote({ key, name, resolved });
138
- if (refusal) return [refusal];
139
- return [
140
- ...scoreLockstep({ name, resolved, direct }),
141
- ...scoreStaleness({ key, name, text, range: resolved.range }),
142
- ];
143
- }
144
-
145
- /**
146
- * The two ways a note names nothing checkable: the pin is gone, or the key
147
- * resolves to something that is not a range. They are deliberately different
148
- * findings — telling an author to "delete the note or restore the pin" when the
149
- * pin is right there, one level down, is wrong advice.
150
- *
151
- * @param {{ key: string, name: string, resolved: object }} params
152
- * @returns {{ kind: string, name: string, detail: string }|null}
153
- */
154
- function refuseNote({ key, name, resolved }) {
155
- if (resolved.kind === 'missing') {
156
- return {
157
- kind: 'orphan-note',
158
- name,
159
- detail: `"//"["${key}"] documents an override that no longer exists in the overrides block. Delete the note or restore the pin — a safety note for a pin nobody has is read as though the pin were still there.`,
160
- };
161
- }
162
- if (resolved.kind === 'unsupported') {
163
- return {
164
- kind: 'unsupported-shape',
165
- name,
166
- detail: `"//"["${key}"] ${resolved.detail}`,
167
- };
168
- }
169
- return null;
170
- }
171
-
172
- /**
173
- * Does the override range still agree with the direct one? A `$name` override
174
- * IS `dependencies[name]`, so npm cannot split the pair the note is warning
175
- * about and there is nothing to compare.
176
- *
177
- * @param {{ name: string, resolved: object, direct: string|undefined }} params
178
- * @returns {Array<object>}
179
- */
180
- function scoreLockstep({ name, resolved, direct }) {
181
- const split =
182
- resolved.kind === 'pinned' &&
183
- typeof direct === 'string' &&
184
- direct !== resolved.range;
185
- if (!split) return [];
186
- return [
187
- {
188
- kind: 'lockstep',
189
- name,
190
- detail: `overrides.${name} is "${resolved.range}" but dependencies.${name} is "${direct}". The "//" note declares these move in lockstep; a split gives the direct and transitive resolutions different floors. npm's own "$${name}" reference is the way to make the split impossible.`,
191
- },
192
- ];
193
- }
194
-
195
- /**
196
- * Does the note still state the range in force? A note quoting no range at all
197
- * is not scored: prose that names no version cannot go stale.
198
- *
199
- * @param {{ key: string, name: string, text: unknown, range: string }} params
200
- * @returns {Array<object>}
201
- */
202
- function scoreStaleness({ key, name, text, range }) {
203
- const quoted = quotedRanges(text);
204
- if (quoted.length === 0 || quoted.includes(range)) return [];
205
- return [
206
- {
207
- kind: 'stale-note',
208
- name,
209
- detail: `"//"["${key}"] quotes ${quoted.map((q) => `"${q}"`).join(', ')} but the range in force is "${range}". The note is what tells the next author whether a bump is safe, so it must state the version it is describing.`,
210
- },
211
- ];
212
- }
@@ -1,93 +0,0 @@
1
- /**
2
- * lib/test-isolate/cli-options.js — argv → options for the `test-isolate` CLI.
3
- *
4
- * Story #5316: this lived inside `.agents/scripts/test-isolate.js`, a file no
5
- * test imports, so it scored the CRAP formula's untested maximum (210 at
6
- * cyclomatic 14 and 0% coverage) and carried the tree's `test-isolate.js`
7
- * cyclomatic breach row. It sits here beside `list-files.js`, `parse-tap.js`
8
- * and `runner.js` for the same reason they do: the CLI shell is unreachable
9
- * from a test, and everything reachable belongs under `lib/`.
10
- *
11
- * The long `else if` ladder it replaces was cyclomatic 14, above the repo's
12
- * must-fix ceiling of 12. Dispatching through two flag tables is the same
13
- * parse — same precedence, same tolerance for a value-taking flag that ends
14
- * the argv — at roughly half the branch count.
15
- */
16
-
17
- /**
18
- * Flags that consume the following argv entry as a number, keyed by the
19
- * option each one sets.
20
- */
21
- const NUMERIC_FLAGS = {
22
- '--workers': 'workers',
23
- '--max-bisect-depth': 'maxBisectDepth',
24
- '--max-bisect-targets': 'maxBisectTargets',
25
- '--suite-concurrency': 'suiteConcurrency',
26
- };
27
-
28
- /** Flags that are their own value. */
29
- const BOOLEAN_FLAGS = {
30
- '--json': 'json',
31
- '--quiet': 'quiet',
32
- };
33
-
34
- /**
35
- * Defaults every parse starts from. Deliberately module-private: nothing in
36
- * production reads it, and exporting it so a test could assert against it
37
- * would both make that test tautological and land a test-only export on the
38
- * `dead-exports:production` ratchet.
39
- */
40
- function defaultOptions() {
41
- return {
42
- pattern: undefined,
43
- workers: undefined,
44
- maxBisectDepth: 8,
45
- maxBisectTargets: 5,
46
- suiteConcurrency: 8,
47
- json: false,
48
- quiet: false,
49
- };
50
- }
51
-
52
- /**
53
- * Parse the `test-isolate` CLI's argv.
54
- *
55
- * Precedence, unchanged from the ladder this replaces:
56
- * - a known numeric flag consumes the next entry, but only when there IS a
57
- * next entry — a trailing `--workers` is ignored rather than setting NaN;
58
- * - a known boolean flag sets its option;
59
- * - the FIRST non-flag argument becomes the pattern, and later ones are
60
- * ignored;
61
- * - anything else is ignored, so an unknown `--flag` is never mistaken for
62
- * the pattern.
63
- *
64
- * @param {string[]} [argv]
65
- * @returns {{
66
- * pattern: string|undefined,
67
- * workers: number|undefined,
68
- * maxBisectDepth: number,
69
- * maxBisectTargets: number,
70
- * suiteConcurrency: number,
71
- * json: boolean,
72
- * quiet: boolean,
73
- * }}
74
- */
75
- export function parseIsolateArgv(argv = []) {
76
- const options = defaultOptions();
77
- for (let i = 0; i < argv.length; i += 1) {
78
- const arg = argv[i];
79
- const numericKey = NUMERIC_FLAGS[arg];
80
- if (numericKey && argv[i + 1]) {
81
- options[numericKey] = Number(argv[i + 1]);
82
- i += 1;
83
- continue;
84
- }
85
- const booleanKey = BOOLEAN_FLAGS[arg];
86
- if (booleanKey) {
87
- options[booleanKey] = true;
88
- continue;
89
- }
90
- if (!arg.startsWith('--') && !options.pattern) options.pattern = arg;
91
- }
92
- return options;
93
- }
@@ -1,52 +0,0 @@
1
- /* node:coverage ignore file */
2
- /**
3
- * Preload module for `test-isolate`. Snapshots `process.env` at module load
4
- * time and writes a diff envelope to the file named in
5
- * `TEST_ISOLATE_ENV_OUT` when the process exits. Used to surface env-var
6
- * mutations a test made and failed to restore.
7
- */
8
-
9
- import fs from 'node:fs';
10
-
11
- const OUT_PATH = process.env.TEST_ISOLATE_ENV_OUT;
12
- if (OUT_PATH) {
13
- const beforeSnapshot = { ...process.env };
14
- // NODE_OPTIONS propagates this loader into every node process spawned
15
- // beneath the runner (including node:test's per-file child workers). We
16
- // write to a per-pid sidecar file so the parent runner can pick the
17
- // child's diff and ignore its own empty one.
18
- const pidPath = `${OUT_PATH}.${process.pid}.json`;
19
- process.on('exit', () => {
20
- try {
21
- const after = process.env;
22
- const added = [];
23
- const removed = [];
24
- const changed = [];
25
- const IGNORE = new Set([
26
- 'TEST_ISOLATE_ENV_OUT',
27
- // NODE_OPTIONS is rewritten by the parent's spawn; ignore it so
28
- // the loader doesn't flag itself as a leak.
29
- 'NODE_OPTIONS',
30
- ]);
31
- for (const key of Object.keys(after)) {
32
- if (IGNORE.has(key)) continue;
33
- if (!(key in beforeSnapshot)) added.push(key);
34
- else if (beforeSnapshot[key] !== after[key]) changed.push(key);
35
- }
36
- for (const key of Object.keys(beforeSnapshot)) {
37
- if (IGNORE.has(key)) continue;
38
- if (!(key in after)) removed.push(key);
39
- }
40
- if (added.length === 0 && removed.length === 0 && changed.length === 0) {
41
- return;
42
- }
43
- fs.writeFileSync(
44
- pidPath,
45
- JSON.stringify({ added, removed, changed }),
46
- 'utf8',
47
- );
48
- } catch {
49
- // Best-effort — do not interfere with the host process exit.
50
- }
51
- });
52
- }
@@ -1,90 +0,0 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
- import picomatch from 'picomatch';
4
-
5
- /**
6
- * Walk a directory and return repo-relative `*.test.js` paths (forward
7
- * slashes). Skips `node_modules`, `.worktrees`, and dot-prefixed dirs.
8
- *
9
- * @param {string} root
10
- * @param {typeof fs} [fsLike]
11
- * @returns {string[]}
12
- */
13
- export function walkTestFiles(root, fsLike = fs) {
14
- const out = [];
15
- walk(root, '');
16
- return out.sort();
17
-
18
- function walk(dir, prefix) {
19
- if (!fsLike.existsSync(dir)) return;
20
- for (const ent of fsLike.readdirSync(dir, { withFileTypes: true })) {
21
- const name = ent.name;
22
- if (
23
- name === 'node_modules' ||
24
- name === '.worktrees' ||
25
- name.startsWith('.')
26
- ) {
27
- continue;
28
- }
29
- const abs = path.join(dir, name);
30
- const rel = prefix ? `${prefix}/${name}` : name;
31
- if (ent.isDirectory()) {
32
- walk(abs, rel);
33
- } else if (name.endsWith('.test.js')) {
34
- out.push(rel.replace(/\\/g, '/'));
35
- }
36
- }
37
- }
38
- }
39
-
40
- /**
41
- * Resolve the user's pattern to a sorted list of repo-relative test file
42
- * paths. Patterns may be:
43
- *
44
- * - a glob (`tests/**\/*.test.js`, `tests/lib/foo*.test.js`)
45
- * - an explicit file path (absolute or repo-relative)
46
- * - a directory (walked for `*.test.js` descendants)
47
- * - omitted (defaults to `tests/**\/*.test.js`)
48
- *
49
- * @param {object} opts
50
- * @param {string} [opts.pattern]
51
- * @param {string} opts.repoRoot
52
- * @param {string[]} [opts.allFiles] Override the discovered file list for tests.
53
- * @param {typeof fs} [opts.fsLike]
54
- * @returns {string[]}
55
- */
56
- export function resolveTestFiles({ pattern, repoRoot, allFiles, fsLike = fs }) {
57
- const discoverAll = () => allFiles ?? walkTestFiles(repoRoot, fsLike);
58
-
59
- if (!pattern || pattern === 'tests/**/*.test.js') {
60
- return discoverAll().filter((f) => f.startsWith('tests/'));
61
- }
62
-
63
- // Absolute path → relativize.
64
- let target = pattern.replace(/\\/g, '/');
65
- if (path.isAbsolute(target)) {
66
- target = path.relative(repoRoot, path.resolve(target)).replace(/\\/g, '/');
67
- }
68
-
69
- // Directory → walk it for *.test.js files.
70
- const absTarget = path.resolve(repoRoot, target);
71
- if (fsLike.existsSync(absTarget)) {
72
- const stat = fsLike.statSync(absTarget);
73
- if (stat.isDirectory()) {
74
- return walkTestFiles(absTarget, fsLike)
75
- .map((rel) =>
76
- path
77
- .relative(repoRoot, path.join(absTarget, rel))
78
- .replace(/\\/g, '/'),
79
- )
80
- .filter((f) => f.endsWith('.test.js'));
81
- }
82
- if (stat.isFile() && target.endsWith('.test.js')) {
83
- return [target];
84
- }
85
- }
86
-
87
- // Glob → filter the universe.
88
- const isMatch = picomatch(target, { dot: true });
89
- return discoverAll().filter((f) => isMatch(f));
90
- }
@@ -1,75 +0,0 @@
1
- /**
2
- * Minimal TAP parser specialised for `node --test --test-reporter tap` output.
3
- * Extracts top-level subtests (file-level) pass/fail. The Node test runner
4
- * emits one top-level `# Subtest: <path>` per file followed eventually by
5
- * `ok N - <path>` or `not ok N - <path>` at indent depth 0.
6
- *
7
- * Returns a Map keyed by the subtest name, value `'pass' | 'fail'`. Failures
8
- * collect the failing leaf-test names for diagnostic surfacing.
9
- *
10
- * @typedef {{ status: 'pass' | 'fail', failingTests: string[] }} TopLevelResult
11
- *
12
- * @param {string} tapText
13
- * @returns {Map<string, TopLevelResult>}
14
- */
15
- export function parseSuiteTap(tapText) {
16
- const out = new Map();
17
- const lines = tapText.replace(/\r\n/g, '\n').split('\n');
18
- let currentTop = null;
19
- const failingLeavesByTop = new Map();
20
-
21
- for (const line of lines) {
22
- const subtestMatch = line.match(/^(\s*)# Subtest:\s*(.+)$/);
23
- if (subtestMatch) {
24
- const indent = subtestMatch[1].length;
25
- if (indent === 0) {
26
- currentTop = subtestMatch[2].trim();
27
- if (!failingLeavesByTop.has(currentTop)) {
28
- failingLeavesByTop.set(currentTop, []);
29
- }
30
- }
31
- continue;
32
- }
33
- const resultMatch = line.match(/^(\s*)(ok|not ok)\s+\d+\s+-\s+(.+)$/);
34
- if (!resultMatch) continue;
35
- const indent = resultMatch[1].length;
36
- const verdict = resultMatch[2];
37
- const name = resultMatch[3].trim();
38
-
39
- if (indent === 0) {
40
- const status = verdict === 'ok' ? 'pass' : 'fail';
41
- const failing = failingLeavesByTop.get(name) ?? [];
42
- out.set(name, { status, failingTests: failing });
43
- continue;
44
- }
45
- if (verdict === 'not ok' && currentTop) {
46
- const arr = failingLeavesByTop.get(currentTop);
47
- if (arr) arr.push(name);
48
- }
49
- }
50
- return out;
51
- }
52
-
53
- /**
54
- * Parse a single-file `node --test` TAP run and return whether the file as a
55
- * whole passed plus the list of failing leaf-test names. The single-file run
56
- * has no top-level file subtest wrapper, so we look at the `# tests`/`# pass`
57
- * footer plus the deepest `not ok` entries.
58
- *
59
- * @param {string} tapText
60
- * @param {number} exitCode
61
- * @returns {{ status: 'pass' | 'fail', failingTests: string[] }}
62
- */
63
- export function parseSingleFileTap(tapText, exitCode) {
64
- const lines = tapText.replace(/\r\n/g, '\n').split('\n');
65
- const failing = [];
66
- for (const line of lines) {
67
- const m = line.match(/^(\s*)not ok\s+\d+\s+-\s+(.+)$/);
68
- if (!m) continue;
69
- failing.push(m[2].trim());
70
- }
71
- return {
72
- status: exitCode === 0 ? 'pass' : 'fail',
73
- failingTests: failing,
74
- };
75
- }
@@ -1,45 +0,0 @@
1
- /**
2
- * lib/test-isolate/progress-log.js — the `onProgress` sink for a
3
- * `diagnoseIsolation` run.
4
- *
5
- * Story #5316: this was an anonymous arrow inlined into `runTestIsolate`'s
6
- * argument list, which is exactly why it scored CRAP 72 (cyclomatic 8 at 0%
7
- * coverage) under a name — `<anon runTestIsolate/(stage,payload)#0>` — that no
8
- * test could address. As a named factory it is a plain table lookup.
9
- */
10
-
11
- /** How many bisection suspects are named inline before eliding the rest. */
12
- const SUSPECT_PREVIEW = 3;
13
-
14
- /**
15
- * Per-stage line formatters. A stage with no entry here is ignored, which is
16
- * what the `else if` ladder this replaces did by falling off the end — so a
17
- * new stage emitted by the runner stays silent rather than throwing.
18
- */
19
- const STAGE_LINES = {
20
- 'isolated:start': (p) => `[test-isolate] isolated phase: ${p.count} file(s)`,
21
- 'isolated:done': () => '[test-isolate] isolated phase: done',
22
- 'suite:start': (p) => `[test-isolate] suite phase: ${p.count} file(s)`,
23
- 'suite:done': () => '[test-isolate] suite phase: done',
24
- 'bisect:start': (p) => `[test-isolate] bisecting flipper: ${p.target}`,
25
- 'bisect:done': (p) => {
26
- const list = p.suspects.slice(0, SUSPECT_PREVIEW).join(', ');
27
- const hidden = p.suspects.length - SUSPECT_PREVIEW;
28
- const more = hidden > 0 ? ` (+${hidden} more)` : '';
29
- return `[test-isolate] suspects: ${list}${more}`;
30
- },
31
- };
32
-
33
- /**
34
- * Build the progress callback `diagnoseIsolation` calls as each phase starts
35
- * and finishes.
36
- *
37
- * @param {(line: string) => void} onLog
38
- * @returns {(stage: string, payload: object) => void}
39
- */
40
- export function createProgressLogger(onLog) {
41
- return (stage, payload) => {
42
- const format = STAGE_LINES[stage];
43
- if (format) onLog(format(payload ?? {}));
44
- };
45
- }
@@ -1,97 +0,0 @@
1
- /**
2
- * lib/test-isolate/render-report.js — the human-readable `test-isolate` report.
3
- *
4
- * Story #5316: extracted verbatim from `.agents/scripts/test-isolate.js`,
5
- * where no test could reach it (CRAP 72 at cyclomatic 8, 0% coverage). Pure
6
- * string building — no I/O, no clock — so the whole surface is assertable.
7
- *
8
- * The three sections it renders are split into helpers so each is
9
- * independently readable and none of them alone approaches the cyclomatic
10
- * ceiling; `renderReport` is left as the composition.
11
- */
12
-
13
- /**
14
- * The flipper section: files that passed alone and failed in the suite, plus
15
- * the bisection suspects for each.
16
- *
17
- * @param {string[]} lines Accumulator, appended in place.
18
- * @param {import('./runner.js').IsolateReport} report
19
- */
20
- function pushFlipperSection(lines, report) {
21
- if (report.flippers.length === 0) {
22
- lines.push('✓ No flippers detected — every file that passed alone');
23
- lines.push(' also passed in the full suite run.');
24
- return;
25
- }
26
- lines.push(`✗ ${report.flippers.length} flipper(s) detected:`);
27
- for (const f of report.flippers) lines.push(` - ${f}`);
28
- lines.push('');
29
- if (report.bisections.length === 0) return;
30
- lines.push('Likely polluters (bisection suspects):');
31
- for (const b of report.bisections) {
32
- const tag = b.inconclusive ? ' [inconclusive]' : '';
33
- lines.push(` ${b.file}${tag}`);
34
- for (const s of b.suspects) lines.push(` ← ${s}`);
35
- }
36
- }
37
-
38
- /**
39
- * One env-mutating file's added/removed/changed summary. Empty parts are
40
- * omitted, so a file that only added a var reads as `added=[...]` alone.
41
- *
42
- * @param {{added: string[], removed: string[], changed: string[]}} envDiff
43
- * @returns {string}
44
- */
45
- function formatEnvDiff(envDiff) {
46
- const parts = [];
47
- if (envDiff.added.length > 0)
48
- parts.push(`added=[${envDiff.added.join(', ')}]`);
49
- if (envDiff.removed.length > 0) {
50
- parts.push(`removed=[${envDiff.removed.join(', ')}]`);
51
- }
52
- if (envDiff.changed.length > 0) {
53
- parts.push(`changed=[${envDiff.changed.join(', ')}]`);
54
- }
55
- return parts.join(' ');
56
- }
57
-
58
- /**
59
- * The env-leak section: files whose process exited with `process.env` still
60
- * mutated, called out even when no failure cascade has manifested yet.
61
- *
62
- * @param {string[]} lines Accumulator, appended in place.
63
- * @param {import('./runner.js').IsolateReport} report
64
- */
65
- function pushEnvSection(lines, report) {
66
- if (report.envMutators.length === 0) {
67
- lines.push('✓ No env-var leaks detected across isolated runs.');
68
- return;
69
- }
70
- lines.push(
71
- `⚠ ${report.envMutators.length} file(s) left process.env mutated:`,
72
- );
73
- for (const m of report.envMutators) {
74
- lines.push(` ${m.file}`);
75
- lines.push(` ${formatEnvDiff(m.envDiff)}`);
76
- }
77
- }
78
-
79
- /**
80
- * Render the diagnostic report as text.
81
- *
82
- * @param {import('./runner.js').IsolateReport} report
83
- * @returns {string}
84
- */
85
- export function renderReport(report) {
86
- const lines = [];
87
- lines.push('');
88
- lines.push('=== test-isolate diagnostic report ===');
89
- lines.push(`Files scanned: ${report.files.length}`);
90
- lines.push(`Wall duration: ${(report.durationMs / 1000).toFixed(1)}s`);
91
- lines.push('');
92
- pushFlipperSection(lines, report);
93
- lines.push('');
94
- pushEnvSection(lines, report);
95
- lines.push('');
96
- return lines.join('\n');
97
- }