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,45 +0,0 @@
1
- import { selectSlowestEntries } from './parse-tap.js';
2
-
3
- /**
4
- * @param {import('./parse-tap.js').TapProfile} profile
5
- * @param {{ topN?: number, wallDurationMs?: number | null }} [opts]
6
- * @returns {string}
7
- */
8
- export function renderProfileReport(profile, opts = {}) {
9
- const topN = opts.topN ?? 20;
10
- const slowest = selectSlowestEntries(profile.entries, topN);
11
- const totalSec = (opts.wallDurationMs ?? profile.totalDurationMs ?? 0) / 1000;
12
- const lines = [
13
- 'Mandrel test profile summary',
14
- '===========================',
15
- '',
16
- `Total duration: ${totalSec.toFixed(3)}s`,
17
- `Tests: ${profile.testCount ?? '—'}`,
18
- `Suites: ${profile.suiteCount ?? '—'}`,
19
- `Timed entries parsed: ${profile.entries.length}`,
20
- '',
21
- `Top ${topN} slowest (tests and suites):`,
22
- '',
23
- ];
24
-
25
- if (slowest.length === 0) {
26
- lines.push(' (no timed entries found in TAP output)');
27
- } else {
28
- for (const [idx, row] of slowest.entries()) {
29
- const kindLabel = row.kind === 'suite' ? 'suite' : 'test';
30
- const seconds = (row.durationMs / 1000).toFixed(3);
31
- lines.push(
32
- `${String(idx + 1).padStart(2)}. [${kindLabel.padEnd(5)}] ${seconds}s ${row.path}`,
33
- );
34
- }
35
- }
36
-
37
- lines.push('');
38
- lines.push(
39
- 'Notes: suite rows are parent describe blocks; test rows are leaf cases.',
40
- );
41
- lines.push(
42
- 'Compare before/after optimizations using the same command on the same machine.',
43
- );
44
- return `${lines.join('\n')}\n`;
45
- }
@@ -1,214 +0,0 @@
1
- #!/usr/bin/env node
2
- /* node:coverage ignore file */
3
-
4
- /**
5
- * lint-label-vocabulary.js — enforce that GitHub label tokens cited in
6
- * `.agents/docs/SDLC.md` and every `*.md` under `.agents/workflows/` use the
7
- * canonical
8
- * `<axis>::<value>` separator established by
9
- * `.agents/scripts/lib/label-constants.js`.
10
- *
11
- * Why this exists (Tech Spec F9, Epic #2880): the framework's label
12
- * vocabulary is the contract between docs and the runtime. A typo such
13
- * as `type/epic` (the original F9 finding at epic-plan.md:49) drifts
14
- * silently because nothing reads doc prose against the constants file.
15
- * This lint closes that gap by failing CI on any inline code span that
16
- * cites a known axis with the wrong separator.
17
- *
18
- * Scope:
19
- * - Files scanned: `.agents/docs/SDLC.md` plus every `*.md` under
20
- * `.agents/workflows/`.
21
- * - Tokens scanned: inline backtick code spans only (e.g. `type/epic`).
22
- * Prose mentions like "planning/audit metadata" are intentionally
23
- * ignored — only fenced citations are treated as label references.
24
- * - Axes recognized: the union of namespaces exported from
25
- * `lib/label-constants.js` (`agent`, `type`, `status`, `context`,
26
- * `acceptance`, `meta`, `planning`) plus the persona prefix.
27
- * - Violation shape: any axis token using a separator other than `::`
28
- * (e.g. `/`, `:`, `-`). False-positive risk is low because the axes
29
- * are project-specific identifiers, not common English words.
30
- *
31
- * Exit codes:
32
- * 0 — clean.
33
- * 1 — at least one violation; offending file + line printed to stderr.
34
- *
35
- * Ships as part of `npm run lint` via `.agents/scripts/run-lint.js`.
36
- */
37
-
38
- import { readdirSync, readFileSync } from 'node:fs';
39
- import path from 'node:path';
40
- import { fileURLToPath } from 'node:url';
41
- import { runAsCli } from './lib/cli-utils.js';
42
- import { walkFilesByExtension } from './lib/fs-walk.js';
43
-
44
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
45
- const REPO_ROOT = path.resolve(__dirname, '..', '..');
46
-
47
- const DEFAULT_SCAN_TARGETS = Object.freeze([
48
- path.join(REPO_ROOT, '.agents', 'docs', 'SDLC.md'),
49
- path.join(REPO_ROOT, '.agents', 'workflows'),
50
- ]);
51
-
52
- /**
53
- * Known label-axis prefixes. Each entry corresponds to a namespace
54
- * exported from `.agents/scripts/lib/label-constants.js`. The list is
55
- * hard-coded rather than introspected so the lint stays a pure file
56
- * walk with no module import side effects.
57
- *
58
- * Maintainers: when a new label axis lands in `label-constants.js`, add
59
- * its prefix here (without trailing colons). Forgetting to add an axis
60
- * makes the lint silently lenient for that namespace — the tests in
61
- * `tests/contract/lint/label-vocabulary.test.js` lock the canonical
62
- * set against drift.
63
- */
64
- export const KNOWN_AXES = Object.freeze([
65
- 'agent',
66
- 'type',
67
- 'status',
68
- 'persona',
69
- 'acceptance',
70
- 'meta',
71
- 'planning',
72
- ]);
73
-
74
- /**
75
- * Resolve a mixed list of file/directory paths into the flat set of
76
- * markdown files to scan. Missing paths are silently skipped (the
77
- * walker handles ENOENT) so the lint is robust under partial trees.
78
- */
79
- function* resolveTargets(targets) {
80
- for (const target of targets) {
81
- let stat;
82
- try {
83
- stat = readdirSync(target, { withFileTypes: true });
84
- } catch (err) {
85
- if (err.code === 'ENOTDIR') {
86
- // it's a file path — yield directly if it's .md
87
- if (target.endsWith('.md')) yield target;
88
- continue;
89
- }
90
- if (err.code === 'ENOENT') continue;
91
- throw err;
92
- }
93
- // directory — walk it
94
- for (const entry of stat) {
95
- const p = path.join(target, entry.name);
96
- if (entry.isDirectory()) {
97
- yield* walkFilesByExtension(p, '.md');
98
- } else if (entry.isFile() && entry.name.endsWith('.md')) {
99
- yield p;
100
- }
101
- }
102
- }
103
- }
104
-
105
- /**
106
- * Scan a single source string for inline backtick code spans containing
107
- * a label-shaped token that uses a non-`::` separator after a known
108
- * axis. Returns an array of `{ line, token, axis, separator }`.
109
- *
110
- * The matcher operates on inline code spans only (single backtick
111
- * delimited). Fenced code blocks (```…```) are not stripped because
112
- * label citations inside them are still drift signals worth flagging.
113
- *
114
- * @param {string} src
115
- * @param {readonly string[]} [axes]
116
- * @returns {Array<{ line: number, token: string, axis: string, separator: string }>}
117
- */
118
- export function findVocabularyViolations(src, axes = KNOWN_AXES) {
119
- const violations = [];
120
- const lines = src.split('\n');
121
- // Match inline code spans: `…` where the content does not include a
122
- // newline or another backtick. Greedy enough for label citations,
123
- // strict enough to avoid swallowing prose.
124
- const codeSpanRe = /`([^`\n]+)`/g;
125
- const axisSet = new Set(axes);
126
- // Anchored axis-drift check. We only flag a code span when its body,
127
- // taken as a whole, has the shape `<axis><sep><value>` where:
128
- // - axis is a known label axis (case-insensitive)
129
- // - sep is one of the non-canonical separators we treat as drift:
130
- // `/` (the original F9 finding) or a single `:` (also wrong).
131
- // Hyphens (`agent-protocol`) are intentionally NOT flagged —
132
- // they collide with legitimate concept slugs and filenames.
133
- // - value is a lowercase identifier (`[a-z][a-z0-9-]*`)
134
- //
135
- // The whole-body anchor avoids false positives on:
136
- // - `acceptance::n-a` — canonical label, value contains a
137
- // hyphen but is not at axis position.
138
- // - `<type>/<slug>` — template placeholders.
139
- // - `delivery.maxTokenBudget` — config-key paths with `.`.
140
- // - `delivery.{maxTickets}` — JS destructure shapes.
141
- // - `agent-protocol.md` — filenames / concept slugs.
142
- //
143
- // Real drift like `type/epic` matches because the WHOLE body is
144
- // `type/epic` (axis 'type', single '/', value 'epic').
145
- const driftRe = new RegExp(
146
- `^(${axes.join('|')})([/:])([a-z][a-z0-9-]*)$`,
147
- 'i',
148
- );
149
- for (let i = 0; i < lines.length; i += 1) {
150
- const line = lines[i];
151
- codeSpanRe.lastIndex = 0;
152
- let span = codeSpanRe.exec(line);
153
- while (span !== null) {
154
- const body = span[1];
155
- const m = driftRe.exec(body);
156
- if (m) {
157
- const axis = m[1].toLowerCase();
158
- const separator = m[2];
159
- if (separator !== '::' && axisSet.has(axis)) {
160
- violations.push({
161
- line: i + 1,
162
- token: body,
163
- axis,
164
- separator,
165
- });
166
- }
167
- }
168
- span = codeSpanRe.exec(line);
169
- }
170
- }
171
- return violations;
172
- }
173
-
174
- /**
175
- * Aggregate violations across all target files.
176
- *
177
- * @param {readonly string[]} targets
178
- * @param {{ read?: typeof readFileSync }} [opts]
179
- * @returns {Array<{ file: string, line: number, token: string, axis: string, separator: string }>}
180
- */
181
- export function lintLabelVocabulary(
182
- targets = DEFAULT_SCAN_TARGETS,
183
- { read = readFileSync } = {},
184
- ) {
185
- const out = [];
186
- for (const file of resolveTargets(targets)) {
187
- const src = read(file, 'utf8');
188
- for (const v of findVocabularyViolations(src)) {
189
- out.push({ file, ...v });
190
- }
191
- }
192
- return out;
193
- }
194
-
195
- async function main() {
196
- const violations = lintLabelVocabulary();
197
- if (violations.length === 0) {
198
- process.stdout.write(
199
- '[label-vocabulary] clean: no drift from canonical `<axis>::<value>` separator in scanned docs.\n',
200
- );
201
- return 0;
202
- }
203
- for (const v of violations) {
204
- process.stderr.write(
205
- `[label-vocabulary] ${v.file}:${v.line}\n token \`${v.token}\` uses '${v.separator}' but axis '${v.axis}' requires canonical '::' separator (see .agents/scripts/lib/label-constants.js).\n`,
206
- );
207
- }
208
- return 1;
209
- }
210
-
211
- await runAsCli(import.meta.url, main, {
212
- source: 'lint-label-vocabulary',
213
- propagateExitCode: true,
214
- });
@@ -1,127 +0,0 @@
1
- #!/usr/bin/env node
2
- /* node:coverage ignore file */
3
-
4
- /**
5
- * post-structured-comment.js — CLI wrapper for structured comment upsert.
6
- *
7
- * Successor to the retired mandrel MCP tools. See ADR 20260424-702a in docs/decisions.md for the migration table.
8
- *
9
- * Delegates to `upsertStructuredComment` from `lib/orchestration/ticketing.js`
10
- * and emits the `{ success, ticketId, type }` JSON envelope on stdout.
11
- *
12
- * Usage:
13
- * node .agents/scripts/post-structured-comment.js \
14
- * --ticket <id> --marker <type> --body-file <path> [--provider github]
15
- *
16
- * Exit codes:
17
- * 0 — upsert succeeded
18
- * non-zero — validation or provider failure (error on stderr)
19
- */
20
-
21
- import fs from 'node:fs/promises';
22
- import { parseArgs } from 'node:util';
23
- import { runAsCli } from './lib/cli-utils.js';
24
- import { resolveConfig } from './lib/config-resolver.js';
25
- import {
26
- assertValidStructuredCommentType,
27
- upsertStructuredComment,
28
- } from './lib/orchestration/ticketing.js';
29
- import { createProvider } from './lib/provider-factory.js';
30
-
31
- const HELP = `Usage: node .agents/scripts/post-structured-comment.js \\
32
- --ticket <id> --marker <type> --body-file <path> [--provider github]
33
-
34
- Flags:
35
- --ticket GitHub issue number to comment on (required).
36
- --marker Structured-comment type (e.g. progress, friction,
37
- retro, epic-run-state, wave-0-start) (required).
38
- --body-file Path to a file containing the markdown body (required).
39
- --provider Provider name (default: inferred from .agentrc.json github block).
40
- --help Show this message.
41
- `;
42
-
43
- /**
44
- * Core: idempotently upsert the structured comment and return the envelope.
45
- * Exported so tests can pin input/output parity against direct SDK use
46
- * without spawning a subprocess.
47
- */
48
- export async function runPostStructuredComment({
49
- ticketId,
50
- type,
51
- body,
52
- provider,
53
- }) {
54
- assertValidStructuredCommentType(type);
55
- await upsertStructuredComment(provider, ticketId, type, body);
56
- return { success: true, ticketId, type };
57
- }
58
-
59
- export function parseArgv(argv) {
60
- const { values } = parseArgs({
61
- args: argv,
62
- options: {
63
- ticket: { type: 'string' },
64
- marker: { type: 'string' },
65
- 'body-file': { type: 'string' },
66
- provider: { type: 'string' },
67
- help: { type: 'boolean' },
68
- },
69
- strict: false,
70
- });
71
- return values;
72
- }
73
-
74
- /**
75
- * Pure: validate the required CLI inputs for `post-structured-comment`. The
76
- * orchestrator is otherwise too dense to score under the CRAP cap, and these
77
- * rules deserve their own targeted tests.
78
- *
79
- * @param {Record<string, unknown>} values parsed CLI values
80
- * @returns {{ ticketId: number, errors: string[] }} `errors` is empty on success.
81
- */
82
- export function validateRequiredArgs(values) {
83
- const ticketId = Number.parseInt(values.ticket ?? '', 10);
84
- const errors = [];
85
- if (!Number.isFinite(ticketId) || ticketId <= 0) {
86
- errors.push('--ticket <id> is required.');
87
- }
88
- if (!values.marker) errors.push('--marker <type> is required.');
89
- if (!values['body-file']) errors.push('--body-file <path> is required.');
90
- return { ticketId, errors };
91
- }
92
-
93
- export async function main(argv = process.argv.slice(2)) {
94
- const values = parseArgv(argv);
95
-
96
- if (values.help) {
97
- process.stdout.write(HELP);
98
- return;
99
- }
100
-
101
- const { ticketId, errors } = validateRequiredArgs(values);
102
- if (errors.length) {
103
- for (const e of errors) {
104
- process.stderr.write(`[post-structured-comment] ${e}\n`);
105
- }
106
- process.stderr.write(HELP);
107
- process.exit(2);
108
- }
109
-
110
- const body = await fs.readFile(values['body-file'], 'utf8');
111
-
112
- const config = resolveConfig();
113
- const effectiveConfig = values.provider
114
- ? { ...config, provider: values.provider }
115
- : config;
116
- const provider = createProvider(effectiveConfig);
117
-
118
- const envelope = await runPostStructuredComment({
119
- ticketId,
120
- type: values.marker,
121
- body,
122
- provider,
123
- });
124
- process.stdout.write(`${JSON.stringify(envelope)}\n`);
125
- }
126
-
127
- runAsCli(import.meta.url, main, { source: 'post-structured-comment' });
@@ -1,85 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * provision-git-hooks.js
5
- *
6
- * Materialize the repository's git hooks into a linked worktree, so commits
7
- * made there are subject to the same `commit-msg` / `pre-commit` / `pre-push`
8
- * gates as commits made in the main checkout.
9
- *
10
- * Worktrees created by `single-story-init.js` are provisioned automatically as
11
- * part of `worktree.bootstrap`. This entry point exists for the worktrees the
12
- * orchestrator never creates — a harness or hand-made `git worktree add` —
13
- * which are otherwise unreachable. Run it from inside such a worktree with no
14
- * arguments.
15
- */
16
-
17
- import path from 'node:path';
18
- import { runAsCli } from './lib/cli-utils.js';
19
- import {
20
- materializeGitHooks,
21
- resolveCommonCheckout,
22
- } from './lib/worktree/git-hooks.js';
23
-
24
- /**
25
- * @param {object} [opts]
26
- * @param {string[]} [opts.argv]
27
- * @param {string} [opts.cwd]
28
- * @returns {{ action: string, reason?: string, hooksPath: string|null,
29
- * target: string|null, hooks: string[], worktree: string, repoRoot: string }}
30
- */
31
- export function runProvisionGitHooks({
32
- argv = process.argv.slice(2),
33
- cwd = process.cwd(),
34
- } = {}) {
35
- const positional = [];
36
- let repoRootFlag = null;
37
- for (let i = 0; i < argv.length; i += 1) {
38
- if (argv[i] === '--repo-root') {
39
- repoRootFlag = argv[i + 1];
40
- if (!repoRootFlag) {
41
- throw new Error('--repo-root requires a path');
42
- }
43
- i += 1;
44
- continue;
45
- }
46
- positional.push(argv[i]);
47
- }
48
-
49
- const worktree = path.resolve(cwd, positional[0] ?? '.');
50
- const repoRoot = repoRootFlag
51
- ? path.resolve(cwd, repoRootFlag)
52
- : resolveCommonCheckout(worktree);
53
-
54
- const result = materializeGitHooks({ repoRoot, worktree });
55
- return { ...result, worktree, repoRoot };
56
- }
57
-
58
- runAsCli(
59
- import.meta.url,
60
- async () => {
61
- const result = runProvisionGitHooks();
62
- // Compact single-line digest: this is the machine contract, and the
63
- // hook file list is bounded by the hooks directory itself.
64
- process.stdout.write(`${JSON.stringify(result)}\n`);
65
- },
66
- {
67
- source: 'provision-git-hooks',
68
- usage: {
69
- invocation:
70
- 'node .agents/scripts/provision-git-hooks.js [<worktree-path>] [--repo-root <path>]',
71
- summary:
72
- "Materialize the repository's git hooks into a linked worktree so its commits are gated.",
73
- flags: [
74
- [
75
- '<worktree-path>',
76
- 'Worktree to provision (default: the current directory).',
77
- ],
78
- [
79
- '--repo-root <path>',
80
- 'Checkout that owns the hooks (default: derived from --git-common-dir).',
81
- ],
82
- ],
83
- },
84
- },
85
- );
@@ -1,181 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- // .agents/scripts/prune-baseline-orphans.js — Story #5012.
4
- //
5
- // Delete the baseline rows that are provably inert, and nothing else.
6
- //
7
- // This is the cheap remedy that makes `check-baseline-scope.js` fair. A gate
8
- // that hard-fails on a stale row is only defensible while clearing one costs a
9
- // command rather than a full re-score: the honest alternative — re-derive the
10
- // whole baseline — spends a coverage run or a full-tree MI pass to express a
11
- // deletion, which is why stale rows accumulate instead.
12
- //
13
- // Two row classes qualify, both decidable without measuring anything:
14
- //
15
- // - `absent` — the row's file is gone from disk.
16
- // - `out-of-scope` — the file is still there, but the gate's own
17
- // `targetDirs` / `ignoreGlobs` no longer match it.
18
- //
19
- // The pruner never adds a row, never restamps `generatedAt` (a fresh stamp
20
- // over unmeasured rows is the exact failure an age check exists to catch), and
21
- // recomputes `rollup` through the kind's own arithmetic so the pruned envelope
22
- // still validates against its schema. An unreadable scope config degrades to
23
- // orphan-only pruning rather than treating unknown scope as empty scope.
24
- //
25
- // Exit codes:
26
- // 0 nothing to prune (or, without `--check`, the prune was written)
27
- // 1 `--check` found rows that would be pruned
28
- // 2 the pruner could not run
29
-
30
- // Fail-fast if the framework's runtime deps are not installed — must be the
31
- // first import so the check runs before any third-party-importing sibling
32
- // module is evaluated (Story #3432).
33
- import './lib/runtime-deps/ensure-installed.js';
34
- import { PRUNABLE_KINDS, runPrune } from './lib/baselines/orphan-pruner.js';
35
- import { runAsCli } from './lib/cli-utils.js';
36
- import { getQuality } from './lib/config/quality.js';
37
- import { resolveConfig } from './lib/config-resolver.js';
38
-
39
- const EXIT_CLEAN = 0;
40
- const EXIT_WOULD_PRUNE = 1;
41
- const EXIT_CANNOT_RUN = 2;
42
-
43
- const HELP = {
44
- invocation:
45
- 'node .agents/scripts/prune-baseline-orphans.js [--check] [--kind <kind>] [--json]',
46
- summary:
47
- "Remove baseline rows whose file is gone from disk or has left the gate's scope. Never adds a row, never restamps generatedAt, never re-scores.",
48
- flags: [
49
- ['--check', 'Report what would be pruned, write nothing, exit 1 if any.'],
50
- ['--kind <kind>', 'Prune one kind only (repeatable). Default: all.'],
51
- ['--json', 'Emit the report as JSON instead of text.'],
52
- ['--cwd <dir>', 'Repository root to prune. Default: process.cwd().'],
53
- ],
54
- notes: [
55
- 'Exit codes:\n 0 clean, or pruned\n 1 --check found prunable rows\n 2 the pruner could not run',
56
- ],
57
- };
58
-
59
- /**
60
- * Parse argv into an options bag. An unknown flag is an error, never a silent
61
- * no-op — a typo'd `--dry-run` must not read as "write the files".
62
- *
63
- * @param {string[]} argv
64
- * @returns {{ kinds: string[], check: boolean, json: boolean, cwd: string }}
65
- */
66
- export function parseArgs(argv = []) {
67
- const out = { kinds: [], check: false, json: false, cwd: null };
68
- let i = 0;
69
- while (i < argv.length) {
70
- const arg = argv[i];
71
- const value = argv[i + 1];
72
- i += 1;
73
- if (arg === '--check') out.check = true;
74
- else if (arg === '--json') out.json = true;
75
- else if (arg === '--kind') {
76
- out.kinds.push(value);
77
- i += 1;
78
- } else if (arg === '--cwd') {
79
- out.cwd = value;
80
- i += 1;
81
- } else throw new Error(`unknown flag "${arg}" (try --help)`);
82
- }
83
- const unknown = out.kinds.filter((k) => !PRUNABLE_KINDS.includes(k));
84
- if (unknown.length > 0) {
85
- throw new Error(
86
- `unknown --kind ${unknown.join(', ')}; expected one of ${PRUNABLE_KINDS.join(', ')}`,
87
- );
88
- }
89
- if (out.kinds.length === 0) out.kinds = [...PRUNABLE_KINDS];
90
- out.cwd = out.cwd ?? process.cwd();
91
- return out;
92
- }
93
-
94
- /**
95
- * Render one kind's outcome as indented text lines.
96
- *
97
- * @param {object} entry
98
- * @param {boolean} check
99
- * @returns {string[]}
100
- */
101
- function renderKind(entry, check) {
102
- if (!entry.present) return [];
103
- if (entry.skipped)
104
- return [` - ${entry.kind}: skipped (${entry.skipReason})`];
105
- const suffix = entry.degraded
106
- ? ` [orphan-only: ${entry.degradedReason}]`
107
- : '';
108
- if (entry.removed.length === 0) {
109
- return [` - ${entry.kind}: clean${suffix}`];
110
- }
111
- const verb = check ? 'would prune' : 'pruned';
112
- return [
113
- ` - ${entry.kind}: ${verb} ${entry.removed.length} row(s)${suffix}`,
114
- ...entry.removed.map((row) => ` · ${row.reason}: ${row.path}`),
115
- ];
116
- }
117
-
118
- /**
119
- * Render the whole report as text.
120
- *
121
- * @param {object} report
122
- * @returns {string}
123
- */
124
- export function formatReport(report) {
125
- const verb = report.check ? 'would prune' : 'pruned';
126
- const lines = [
127
- `[prune-baseline-orphans] ${verb} ${report.removedCount} row(s) across ` +
128
- `${report.writtenCount} file(s)`,
129
- ...report.kinds.flatMap((entry) => renderKind(entry, report.check)),
130
- ];
131
- if (report.check && report.removedCount > 0) {
132
- lines.push(
133
- '',
134
- 'Run without --check to write the prune:',
135
- ' node .agents/scripts/prune-baseline-orphans.js',
136
- );
137
- }
138
- return lines.join('\n');
139
- }
140
-
141
- /**
142
- * CLI entry point. Returns its exit code rather than calling `process.exit()`,
143
- * so `runAsCli`'s `propagateExitCode` path settles it through `flushStdio` and
144
- * an unbounded report is not truncated at a pipe boundary (Story #4783).
145
- *
146
- * @returns {Promise<number>}
147
- */
148
- async function main() {
149
- let opts;
150
- let report;
151
- try {
152
- opts = parseArgs(process.argv.slice(2));
153
- const config = resolveConfig({ cwd: opts.cwd });
154
- report = runPrune({
155
- cwd: opts.cwd,
156
- kinds: opts.kinds,
157
- check: opts.check,
158
- quality: getQuality(config) ?? { gates: {} },
159
- });
160
- } catch (err) {
161
- const message = err?.message ?? String(err);
162
- process.stdout.write(
163
- `${JSON.stringify({ schemaVersion: '1', error: message }, null, 2)}\n`,
164
- );
165
- return EXIT_CANNOT_RUN;
166
- }
167
- process.stdout.write(
168
- opts.json
169
- ? `${JSON.stringify(report, null, 2)}\n`
170
- : `${formatReport(report)}\n`,
171
- );
172
- return report.check && report.removedCount > 0
173
- ? EXIT_WOULD_PRUNE
174
- : EXIT_CLEAN;
175
- }
176
-
177
- runAsCli(import.meta.url, main, {
178
- source: 'prune-baseline-orphans',
179
- usage: HELP,
180
- propagateExitCode: true,
181
- });