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,197 +0,0 @@
1
- #!/usr/bin/env node
2
- // cli-opt-out: top-level CLI driver invoked via npm run test:coverage; spawns child processes rather than parsing argv, so runAsCli() does not apply.
3
- /**
4
- * Cross-platform driver for `npm run test:coverage`.
5
- *
6
- * Why this exists: setting `NODE_V8_COVERAGE` directly in a package.json
7
- * script string (`NODE_V8_COVERAGE=... node ...`) is bash-only — Windows
8
- * cmd.exe (npm's default script-shell on Windows) treats it as a literal
9
- * argument and node never sees the env var. Wrapping the run in this
10
- * Node script keeps the env injection portable.
11
- *
12
- * Pipeline:
13
- * 0. Run the full tier's preflight (`runTierPreflight`). Story #4936: this
14
- * used to be a `pretest:coverage` npm script that CI had to name
15
- * explicitly, because `.npmrc`'s `ignore-scripts=true` (CWE-1357
16
- * defence, which stays) suppresses every `pre*` hook. The runner
17
- * invokes it now, so it executes however the coverage run is started.
18
- * 1. Run the test suite under `NODE_V8_COVERAGE` so each worker writes
19
- * raw V8 dumps under `coverage/tmp/`. The suite targets are the
20
- * shared `FULL_TIER_GLOBS` from `lib/test-tiers.js` — the same set
21
- * `run-tests.js` walks — so the measured surface and `npm test`'s
22
- * surface are the same set by construction.
23
- * 2. `c8 report` post-processes the dumps into `coverage/coverage-final.json`
24
- * plus the printed text table. Include/exclude scope from `.c8rc.cjs`
25
- * is passed explicitly because `c8 report` does not auto-load the
26
- * config file.
27
- * 3. `check-baselines.js --gate coverage` compares the per-file
28
- * lines/branches/functions percentages in `coverage-final.json`
29
- * against the recorded floors in `baselines/coverage.json` and
30
- * fails on any regression. Update the baseline with
31
- * `npm run coverage:update` when you intentionally change scope.
32
- *
33
- * The previous shape of this script wrapped tests in `c8 <cmd>`. A
34
- * one-off A/B benchmark (now retired) showed the NODE_V8_COVERAGE +
35
- * `c8 report` path is ~19% faster end-to-end on a Windows dev host
36
- * while producing an identical `coverage-final.json` artifact for the
37
- * CRAP gate.
38
- *
39
- * Test-runner flags: the suite spawn reuses `TEST_RUNNER_FLAGS` from
40
- * `lib/test-runner-contract.js` — the single source of truth for the
41
- * `node --test` flag set, including the host-derived
42
- * `--test-concurrency` value clamped to `[TEST_CONCURRENCY_MIN,
43
- * TEST_CONCURRENCY_MAX]`. Story #4936: sharing the whole flag set (not
44
- * just the concurrency number) is what stops this runner and
45
- * `run-tests.js` disagreeing about whether a test can execute at all —
46
- * `--experimental-test-module-mocks` decides whether `t.mock.module`
47
- * works, and this is the *required* CI job.
48
- */
49
-
50
- import { spawnSync } from 'node:child_process';
51
- import { mkdirSync, rmSync } from 'node:fs';
52
- import { createRequire } from 'node:module';
53
- import path from 'node:path';
54
- import { fileURLToPath } from 'node:url';
55
-
56
- import { cleanupRepoTestTempArtifacts } from './cleanup-repo-test-temp.js';
57
- import { C8_CLI } from './lib/c8-cli-path.js';
58
- import { buildWebhookSafeTestEnv } from './lib/test-env.js';
59
- import {
60
- runTierPreflight,
61
- TEST_RUNNER_FLAGS,
62
- } from './lib/test-runner-contract.js';
63
- import { FULL_TIER_GLOBS } from './lib/test-tiers.js';
64
-
65
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
66
- const ROOT = path.resolve(__dirname, '..', '..');
67
- const require = createRequire(import.meta.url);
68
- const C8_CONFIG = require('../../.c8rc.cjs');
69
-
70
- /**
71
- * Build the `node --test` argv for the coverage suite spawn.
72
- *
73
- * Reuses two shared constants so the coverage path cannot drift from
74
- * `run-tests.js`:
75
- *
76
- * - `TEST_RUNNER_FLAGS` — the single source of truth for the host-aware,
77
- * clamped `--test-concurrency` value.
78
- * - `FULL_TIER_GLOBS` — the single source of truth for *which files the
79
- * full tier runs*. Story #4922: this script used to restate
80
- * `tests/**\/*.test.js` on its own, so the 47 colocated `__tests__`
81
- * suites under `lib/` and `.agents/scripts/` executed under `npm test`
82
- * but never under the measuring run — the coverage and CRAP numbers
83
- * were computed over code the coverage run had not executed.
84
- *
85
- * Both parameters are injected in tests so the argv can be asserted without
86
- * touching the OS.
87
- *
88
- * @param {object} [opts]
89
- * @param {readonly string[]} [opts.runnerFlags]
90
- * @param {readonly string[]} [opts.testGlobs]
91
- * @returns {string[]}
92
- */
93
- export function buildCoverageTestArgs({
94
- runnerFlags = TEST_RUNNER_FLAGS,
95
- testGlobs = FULL_TIER_GLOBS,
96
- } = {}) {
97
- return [...runnerFlags, ...testGlobs];
98
- }
99
-
100
- /**
101
- * Execute the coverage pipeline: run the full tier's preflight, run the
102
- * suite under `NODE_V8_COVERAGE`, post-process the dumps with `c8 report`,
103
- * then gate on the coverage baseline. Returns the first non-zero exit code
104
- * across the stages (or the baseline check's status when the prior stages
105
- * pass); a refused preflight short-circuits before anything is spawned or
106
- * removed.
107
- *
108
- * Every collaborator is injected so the pipeline's wiring — above all
109
- * *that the preflight actually runs, and runs first* — is assertable
110
- * without spawning the real suite.
111
- *
112
- * @param {object} [opts]
113
- * @param {typeof spawnSync} [opts.spawn]
114
- * @param {(opts: { tier: string, repoRoot: string }) => number} [opts.preflight]
115
- * @param {(opts: { repoRoot: string }) => unknown} [opts.cleanup]
116
- * @param {string} [opts.repoRoot]
117
- * @returns {number}
118
- */
119
- export function runCoveragePipeline({
120
- spawn = spawnSync,
121
- preflight = runTierPreflight,
122
- cleanup = cleanupRepoTestTempArtifacts,
123
- repoRoot = ROOT,
124
- } = {}) {
125
- const coverageDir = path.join(repoRoot, 'coverage');
126
- const v8Tmp = path.join(coverageDir, 'tmp');
127
-
128
- const preflightStatus = preflight({ tier: 'full', repoRoot });
129
- if (preflightStatus !== 0) return preflightStatus;
130
-
131
- rmSync(coverageDir, { recursive: true, force: true });
132
- mkdirSync(v8Tmp, { recursive: true });
133
-
134
- const testRun = spawn(process.execPath, buildCoverageTestArgs(), {
135
- cwd: repoRoot,
136
- stdio: 'inherit',
137
- // GIT_*-scrubbed: under a husky pre-push from a linked worktree the
138
- // inherited GIT_DIR poisons fixture `git init` runs (#4580).
139
- env: { ...buildWebhookSafeTestEnv(process.env), NODE_V8_COVERAGE: v8Tmp },
140
- });
141
-
142
- cleanup({ repoRoot });
143
-
144
- const includeArgs = (C8_CONFIG.include ?? []).flatMap((p) => [
145
- '--include',
146
- p,
147
- ]);
148
- const excludeArgs = (C8_CONFIG.exclude ?? []).flatMap((p) => [
149
- '--exclude',
150
- p,
151
- ]);
152
-
153
- // `c8 report` does not auto-load `.c8rc.cjs`, so every scope knob it needs
154
- // is forwarded explicitly from the config object — including `all`, which
155
- // is what puts a 0 % row on a source file no test ever loaded (Story
156
- // #4922). Reading it off the config keeps `.c8rc.cjs` the one declaration.
157
- const allArgs = C8_CONFIG.all ? ['--all'] : [];
158
-
159
- const reportRun = spawn(
160
- process.execPath,
161
- [
162
- C8_CLI,
163
- 'report',
164
- '--reporter=json',
165
- '--reporter=text',
166
- ...allArgs,
167
- '--temp-directory',
168
- v8Tmp,
169
- ...includeArgs,
170
- ...excludeArgs,
171
- ],
172
- { cwd: repoRoot, stdio: 'inherit', shell: false },
173
- );
174
-
175
- const checkRun = spawn(
176
- process.execPath,
177
- [
178
- path.join(repoRoot, '.agents', 'scripts', 'check-baselines.js'),
179
- '--gate',
180
- 'coverage',
181
- ],
182
- { cwd: repoRoot, stdio: 'inherit' },
183
- );
184
-
185
- return testRun.status !== 0
186
- ? (testRun.status ?? 1)
187
- : reportRun.status !== 0
188
- ? (reportRun.status ?? 1)
189
- : (checkRun.status ?? 1);
190
- }
191
-
192
- // Run the pipeline only when invoked directly as a CLI; importing the
193
- // module (e.g. from a test asserting the spawn argv) must not spawn the
194
- // real suite.
195
- if (fileURLToPath(import.meta.url) === path.resolve(process.argv[1] ?? '')) {
196
- process.exit(runCoveragePipeline());
197
- }
@@ -1,133 +0,0 @@
1
- #!/usr/bin/env node
2
- // cli-opt-out: top-level-await driver with no main() function — runAsCli wraps an async main, which doesn't apply here.
3
- /* node:coverage ignore file */
4
-
5
- /**
6
- * Cross-platform parallel driver for `npm run lint`.
7
- *
8
- * Spawns `biome ci .` and `markdownlint-cli2` concurrently. They share
9
- * no state, so running them in series (the prior `&&` form) wasted
10
- * wall-clock time on every developer save and pre-push. Stdout/stderr
11
- * stream through unchanged so error context survives. Exit code is
12
- * non-zero if either tool fails.
13
- */
14
-
15
- import { spawn } from 'node:child_process';
16
- import process from 'node:process';
17
-
18
- // On Windows, npm/npx shims are `.cmd` batch files. Since Node 20,
19
- // these can only be spawned through a shell (CWE-78 mitigation closing
20
- // CVE-2024-27980), so `shell: true` is mandatory there. POSIX hosts
21
- // can spawn directly.
22
- const useShell = process.platform === 'win32';
23
-
24
- /**
25
- * A Node gate spelled `node .agents/scripts/<script>` — the shape six of the
26
- * eight tasks share. Spelling it once keeps this list readable as what it
27
- * actually is (a fan-out roster) instead of a wall of spawn tuples, and keeps
28
- * adding a gate from costing the module a maintainability regression for the
29
- * boilerplate rather than the behaviour. Mirrors `run-verify.js`'s `gate()`.
30
- *
31
- * Use bare `node` (PATH-resolved) rather than `process.execPath`:
32
- * `process.execPath` on Windows often expands to `C:\Program
33
- * Files\nodejs\node.exe`, and spawn(..., { shell: true }) does not quote the
34
- * executable, so the space breaks invocation.
35
- *
36
- * The path is passed WHOLE rather than assembled from a basename. Composing
37
- * it (`` `.agents/scripts/${script}` ``) reads better and is wrong:
38
- * `check-knip-entries.js` derives which CLIs something actually invokes by
39
- * scanning this file's source text for literal script paths, and four of the
40
- * gates below are invoked from nowhere else. Interpolating the path made them
41
- * invisible to that derivation, so knip called them dead and the ratchet
42
- * offered to record live gates as expected-dead — the Story #5012 trap.
43
- *
44
- * @param {string} name reported in this driver's own error prefix
45
- * @param {string} script repo-relative path, spelled as one literal
46
- * @returns {{ name: string, cmd: string, args: string[] }}
47
- */
48
- const nodeGate = (name, script) => ({ name, cmd: 'node', args: [script] });
49
-
50
- const tasks = [
51
- {
52
- name: 'biome',
53
- cmd: 'npx',
54
- args: ['biome', 'ci', '.'],
55
- },
56
- {
57
- // `docs/**/*.md` sat outside these globs until PR #4970's follow-up,
58
- // so `npm run lint` reported "0 error(s)" while the close-time
59
- // code-review lens — which lints the whole changed surface, not just
60
- // what this driver globs — raised pre-existing `docs/` violations
61
- // against whichever Story happened to touch the file. Keep `docs/`
62
- // here so the two surfaces agree. `docs/CHANGELOG.md` is linted too;
63
- // the generator-owned rules it can never satisfy are exempted by a
64
- // `markdownlint-disable-file` directive in its own header.
65
- name: 'markdownlint',
66
- cmd: 'npx',
67
- args: [
68
- 'markdownlint-cli2',
69
- '.agents/**/*.md',
70
- 'docs/**/*.md',
71
- '*.md',
72
- '!node_modules/**',
73
- '!.worktrees/**',
74
- ],
75
- },
76
- // Lifecycle surface (Story #2227). Enforces (1) no `Promise.all` under
77
- // `.agents/scripts/lib/orchestration/lifecycle/**` — the ledger is
78
- // append-only and a parallel write interleaves records; and (2) the
79
- // auto-merge lockout: the `gh pr merge` literal appears only in
80
- // `single-story-close/phases/auto-merge.js`. Neither has a biome
81
- // equivalent. Story #5024 dropped the third rule (the wildcard-observer
82
- // firewall) with the bus and the `listeners/` directory its predicate
83
- // required.
84
- nodeGate('lifecycle-lint', '.agents/scripts/check-lifecycle-lint.js'),
85
- // Workflow prose surface (Epic #4474 PR5). No workflow may instruct calling
86
- // an exported library function that has no CLI entrypoint — the measured
87
- // shim-writing failure mode the /mandrel-plan collapse killed. See
88
- // check-workflow-cli-lint.js for the paragraph-level heuristic.
89
- nodeGate('workflow-cli-lint', '.agents/scripts/check-workflow-cli-lint.js'),
90
- // Label-vocabulary citations in `.agents/docs/SDLC.md` and
91
- // `.agents/workflows/**/*.md` (Story #2892). Greps inline backtick code
92
- // spans for axis-shaped tokens (`type/epic`, etc.) and asserts only the
93
- // canonical `<axis>::<value>` separator from `lib/label-constants.js`
94
- // appears. Closes the drift gap that let the original `type/epic` typo land.
95
- nodeGate('label-vocabulary', '.agents/scripts/lint-label-vocabulary.js'),
96
- // GitHub Actions job-timeout gate (Story #4936). Fails a `jobs.<id>` that
97
- // sets no `timeout-minutes` (inheriting GitHub's 360-minute default) or sets
98
- // one above the ceiling. A deadlocked Windows job burned 44 minutes of a
99
- // runner and withheld the failing required check's logs for the whole time.
100
- nodeGate('workflow-timeouts', '.agents/scripts/check-workflow-timeouts.js'),
101
- // Architecture cycle ratchet (Story #3991). Detects directed import cycles
102
- // under `.agents/scripts/` and fails on any cycle not in the committed
103
- // allowlist (`baselines/arch-cycles.json`).
104
- nodeGate('arch-cycles', '.agents/scripts/check-arch-cycles.js'),
105
- // Static Gherkin corpus gate (Story #5013): must-compile with the real
106
- // parser, then must-bind scoped per step root. Opt-in behind
107
- // `qa.gherkinLint`, so it exits 0 as "not configured" in this repo. Here
108
- // rather than in run-verify.js so it reaches CI through the same `lint`
109
- // required check as arch-cycles; listing it in both would double-pay it.
110
- nodeGate('gherkin-corpus', '.agents/scripts/check-gherkin-corpus.js'),
111
- ];
112
-
113
- function runTask({ name, cmd, args }) {
114
- return new Promise((resolve) => {
115
- const child = spawn(cmd, args, { stdio: 'inherit', shell: useShell });
116
- child.on('error', (err) => {
117
- process.stderr.write(`[run-lint:${name}] spawn error: ${err.message}\n`);
118
- resolve(1);
119
- });
120
- child.on('exit', (code, signal) => {
121
- if (signal) {
122
- process.stderr.write(`[run-lint:${name}] killed by ${signal}\n`);
123
- resolve(1);
124
- return;
125
- }
126
- resolve(code ?? 1);
127
- });
128
- });
129
- }
130
-
131
- const results = await Promise.all(tasks.map(runTask));
132
- const failed = results.findIndex((code) => code !== 0);
133
- process.exit(failed === -1 ? 0 : results[failed]);
@@ -1,129 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /* node:coverage ignore file */
4
-
5
- /**
6
- * Capture TAP timing from the full test suite and write a human summary under
7
- * `temp/` (gitignored). Skips npm-test preflight so timings reflect the
8
- * runner only — set SKIP_PREFLIGHT=0 to include preflight if desired.
9
- */
10
-
11
- import fs from 'node:fs';
12
- import path from 'node:path';
13
- import { fileURLToPath } from 'node:url';
14
- import { spawnChild } from './lib/child-exec.js';
15
- import { runAsCli } from './lib/cli-utils.js';
16
- import { buildWebhookSafeTestEnv } from './lib/test-env.js';
17
- import { parseTapOutput } from './lib/test-profile/parse-tap.js';
18
- import { renderProfileReport } from './lib/test-profile/render-report.js';
19
- import { buildNodeTestArgs } from './run-tests.js';
20
-
21
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
22
- const ROOT = path.resolve(__dirname, '..', '..');
23
- const DEFAULT_OUT_DIR = path.join(ROOT, 'temp');
24
- const TAP_FILE = 'test-profile.tap';
25
- const SUMMARY_FILE = 'test-profile.summary.txt';
26
-
27
- /**
28
- * @param {string[]} argv
29
- * @returns {{ outDir: string, topN: number, testArgv: string[] }}
30
- */
31
- export function parseProfileArgv(argv) {
32
- let outDir = DEFAULT_OUT_DIR;
33
- let topN = 20;
34
- const testArgv = [];
35
- for (let i = 0; i < argv.length; i += 1) {
36
- const arg = argv[i];
37
- if (arg === '--out-dir' && argv[i + 1]) {
38
- outDir = path.resolve(argv[i + 1]);
39
- i += 1;
40
- continue;
41
- }
42
- if (arg === '--top' && argv[i + 1]) {
43
- topN = Number(argv[i + 1]);
44
- i += 1;
45
- continue;
46
- }
47
- testArgv.push(arg);
48
- }
49
- if (!Number.isFinite(topN) || topN < 1) {
50
- throw new Error('[test-profile] --top must be a positive number');
51
- }
52
- return { outDir, topN, testArgv };
53
- }
54
-
55
- /**
56
- * @param {object} [opts]
57
- * @param {string[]} [opts.argv]
58
- * @param {string} [opts.cwd]
59
- * @param {Function} [opts.spawn] - Injected child runner; defaults to the
60
- * shared surface's real `spawnSync`.
61
- * @param {typeof fs} [opts.fs]
62
- */
63
- export function runTestProfile({
64
- argv = process.argv.slice(2),
65
- cwd = ROOT,
66
- spawn,
67
- fs: fsLike = fs,
68
- } = {}) {
69
- const { outDir, topN, testArgv } = parseProfileArgv(argv);
70
- fsLike.mkdirSync(outDir, { recursive: true });
71
-
72
- // The reporter is a *builder option*, not a suffix. Appended after the
73
- // file targets it was two more positionals to Node, the default reporter
74
- // ran, and every profile parsed `Timed entries parsed: 0` off a full
75
- // suite run. `buildNodeTestArgs` places it in flag position.
76
- const nodeArgs = buildNodeTestArgs({
77
- extraArgs: testArgv,
78
- reporter: 'tap',
79
- });
80
-
81
- const started = Date.now();
82
- const result = spawnChild(process.execPath, nodeArgs, {
83
- run: spawn,
84
- cwd,
85
- encoding: 'utf8',
86
- env: {
87
- ...buildWebhookSafeTestEnv(process.env),
88
- SKIP_PREFLIGHT: process.env.SKIP_PREFLIGHT ?? '1',
89
- FORCE_COLOR: '0',
90
- NO_COLOR: '1',
91
- },
92
- });
93
- const wallDurationMs = Date.now() - started;
94
-
95
- if (result.error) {
96
- throw result.error;
97
- }
98
-
99
- const tapText = `${result.stdout ?? ''}${result.stderr ?? ''}`;
100
- const tapPath = path.join(outDir, TAP_FILE);
101
- const summaryPath = path.join(outDir, SUMMARY_FILE);
102
- fsLike.writeFileSync(tapPath, tapText, { encoding: 'utf8' });
103
-
104
- const profile = parseTapOutput(tapText);
105
- const summary = renderProfileReport(profile, { topN, wallDurationMs });
106
- fsLike.writeFileSync(summaryPath, summary, { encoding: 'utf8' });
107
-
108
- process.stdout.write(summary);
109
- process.stdout.write(`\nWrote ${tapPath}\nWrote ${summaryPath}\n`);
110
-
111
- return {
112
- exitCode: result.status ?? 1,
113
- tapPath,
114
- summaryPath,
115
- profile,
116
- wallDurationMs,
117
- };
118
- }
119
-
120
- runAsCli(
121
- import.meta.url,
122
- async () => {
123
- const outcome = runTestProfile();
124
- if (outcome.exitCode !== 0) {
125
- process.exit(outcome.exitCode);
126
- }
127
- },
128
- { source: 'run-test-profile' },
129
- );
@@ -1,118 +0,0 @@
1
- #!/usr/bin/env node
2
- /* node:coverage ignore file */
3
-
4
- /**
5
- * Local full verification — a true CI mirror for the gates that CAN be proven
6
- * locally, without epic-scoped MI projection or push semantics.
7
- *
8
- * Order: audit (SCA) → lint (includes docs:check + the arch-cycles ratchet) →
9
- * full test suite → unified baselines → the standalone ratchets
10
- * (dead-exports ×2, context-budget, cyclomatic, schema-references).
11
- *
12
- * The `audit` step runs `npm audit --audit-level=high`, matching CI's
13
- * "Dependency Vulnerability Audit (SCA)" gate so a local green no longer hides
14
- * a high-severity advisory that CI would fail on. It is independent of the
15
- * pre-push `PREPUSH_AUDIT` opt-in, which stays unchanged.
16
- *
17
- * The trailing ratchets complete the mirror of CI's "Architecture Cycle Check"
18
- * step in the `baselines` job (Story #4549). That step runs three checks;
19
- * `check-arch-cycles.js` is deliberately absent from STEPS because the `lint`
20
- * step above already runs it (see run-lint.js) — re-running it here would
21
- * double-pay a gate verify already covers. `check-dead-exports.js` and
22
- * `check-context-budget.js` had no such cover: they were reachable locally only
23
- * via the diff-scoped `npm run quality:preview` or a direct invocation, so a
24
- * clean `verify` could still hide a CI-red — the failure Story #4531 / PR #4548
25
- * paid for with a full push → CI → fix → push round-trip. Both are pure-Node
26
- * and baseline-aware, adding ~15s on a cold cache (dominated by knip's
27
- * full-tree scan in check-dead-exports.js) to a command that already carries
28
- * the full test suite.
29
- *
30
- * Story #5004 closed the last two mirror gaps that were pure omission.
31
- * `check-cyclomatic.js` (#4923) and `check-schema-references.js` (#4938) were
32
- * each added to the `baselines` job's standalone-ratchet slot without ever
33
- * being added here, so a green `verify` still hid both. Like their neighbours
34
- * they are pure-Node and cost milliseconds.
35
- *
36
- * Still NOT mirrored: `check-workflow-citations.js` and
37
- * `check-baseline-scope.js` run in CI's `baselines` job only —
38
- * `.agents/rules/known-tooling-behavior.md` entry 2 carries the current
39
- * coverage table. (`prune-baseline-orphans.js --check` used to sit in that
40
- * list; it no longer runs in CI at all — the un-attributed duplicate of the
41
- * scope gate's `extra` direction reds every open PR on inherited rows.) Nor are the CI gates this command structurally cannot
42
- * reproduce (action pinning, TruffleHog secret scan) — those are catalogued
43
- * in docs/ci-contract.md. The nightly full-scope re-score
44
- * (.github/workflows/baseline-drift.yml) is deliberately outside this
45
- * mirror too: it re-scores the whole tree, which is the cost `verify` exists
46
- * to avoid paying on every run.
47
- */
48
-
49
- import { spawnSync } from 'node:child_process';
50
- import { runAsCli } from './lib/cli-utils.js';
51
-
52
- /**
53
- * A gate step: `node .agents/scripts/<script>` plus any extra args. Seven of
54
- * the ten steps share exactly that shape, so spelling it once leaves the list
55
- * below readable as what it actually is — a gate *order* — instead of a wall
56
- * of spawn tuples.
57
- *
58
- * @param {string} label reported as `failedStep` when the gate exits non-zero
59
- * @param {string} script basename under `.agents/scripts/`
60
- * @param {...string} args extra CLI args
61
- * @returns {{ label: string, cmd: string, args: string[] }}
62
- */
63
- const gate = (label, script, ...args) => ({
64
- label,
65
- cmd: 'node',
66
- args: [`.agents/scripts/${script}`, ...args],
67
- });
68
-
69
- const STEPS = [
70
- { label: 'audit', cmd: 'npm', args: ['audit', '--audit-level=high'] },
71
- { label: 'lint', cmd: 'npm', args: ['run', 'lint'] },
72
- { label: 'test', cmd: 'npm', args: ['test'] },
73
- gate('baselines', 'check-baselines.js'),
74
- // Ordered ahead of the dead-exports pair deliberately. When a new CLI is
75
- // missing from knip.json's entry list, both gates fail — but only this one
76
- // names the cause. Seeing the ratchet's whole-file diff first is what made
77
- // "accept the diff" look like the fix during Story #5012.
78
- gate('knip-entries', 'check-knip-entries.js'),
79
- gate('dead-exports', 'check-dead-exports.js'),
80
- gate('dead-exports-production', 'check-dead-exports.js', '--production'),
81
- gate('context-budget', 'check-context-budget.js'),
82
- gate('cyclomatic', 'check-cyclomatic.js'),
83
- gate('schema-references', 'check-schema-references.js'),
84
- ];
85
-
86
- export function runVerifySteps({
87
- spawn = spawnSync,
88
- shell = process.platform === 'win32',
89
- } = {}) {
90
- for (const step of STEPS) {
91
- const result = spawn(step.cmd, step.args, {
92
- stdio: 'inherit',
93
- shell,
94
- });
95
- if (result.error) {
96
- throw result.error;
97
- }
98
- if ((result.status ?? 1) !== 0) {
99
- return {
100
- ok: false,
101
- failedStep: step.label,
102
- exitCode: result.status ?? 1,
103
- };
104
- }
105
- }
106
- return { ok: true };
107
- }
108
-
109
- runAsCli(
110
- import.meta.url,
111
- async () => {
112
- const outcome = runVerifySteps();
113
- if (!outcome.ok) {
114
- process.exit(outcome.exitCode);
115
- }
116
- },
117
- { source: 'run-verify' },
118
- );
@@ -1,55 +0,0 @@
1
- #!/usr/bin/env node
2
- /* node:coverage ignore file */
3
-
4
- /**
5
- * test-isolate — diagnose test-pollution cascades.
6
- *
7
- * Runs the matching test files individually (`--test-concurrency=1`,
8
- * one process per file), then again as a single suite under default
9
- * concurrency. Files that pass alone but fail in the suite are
10
- * **flippers**. For each flipper the script binary-bisects the
11
- * remaining files to surface the smallest reproducing subset (the
12
- * polluter suspect set).
13
- *
14
- * Files whose process exited with leftover `process.env` mutations are
15
- * called out so an operator can spot global-state leaks at a glance —
16
- * even when the failure cascade hasn't yet manifested. See
17
- * `lib/test-isolate/env-snapshot-loader.js`.
18
- *
19
- * Usage:
20
- *
21
- * node .agents/scripts/test-isolate.js # all tests
22
- * node .agents/scripts/test-isolate.js 'tests/lib/**' # glob subset
23
- * node .agents/scripts/test-isolate.js tests/foo.test.js # single file
24
- *
25
- * Output: human-readable text by default; pass `--json` for the raw
26
- * report envelope.
27
- *
28
- * **Shell only (Story #5316).** Nothing imports this file, so nothing here is
29
- * reachable from a test — which is why every function it used to hold scored
30
- * the CRAP formula's untested maximum. Argv parsing, report rendering,
31
- * progress logging and the run orchestration now live under
32
- * `lib/test-isolate/`, beside the `list-files` / `parse-tap` / `runner`
33
- * modules that were always there. Keep this file a shell: anything with a
34
- * branch in it belongs next door, where a test can reach it.
35
- */
36
-
37
- import path from 'node:path';
38
- import { fileURLToPath } from 'node:url';
39
- import { runAsCli } from './lib/cli-utils.js';
40
- import { runTestIsolate } from './lib/test-isolate/run-isolate.js';
41
-
42
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
43
- const ROOT = path.resolve(__dirname, '..', '..');
44
-
45
- runAsCli(
46
- import.meta.url,
47
- async () => {
48
- const { exitCode } = await runTestIsolate({
49
- argv: process.argv.slice(2),
50
- repoRoot: ROOT,
51
- });
52
- if (exitCode !== 0) process.exit(exitCode);
53
- },
54
- { source: 'test-isolate' },
55
- );