mandrel 2.60.0 → 2.62.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 (662) hide show
  1. package/.agents/README.md +10 -10
  2. package/.agents/agents/story-worker.md +1 -1
  3. package/.agents/docs/agentrc-reference.json +4 -82
  4. package/.agents/docs/configuration.md +20 -87
  5. package/.agents/docs/workflows.md +1 -1
  6. package/.agents/instructions.md +1 -3
  7. package/.agents/rules/gherkin-standards.md +4 -0
  8. package/.agents/schemas/agentrc.schema.json +11 -486
  9. package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
  10. package/.agents/schemas/validation-evidence.schema.json +2 -1
  11. package/.agents/scripts/README.md +14 -14
  12. package/.agents/scripts/acceptance-eval.js +32 -164
  13. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  14. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  15. package/.agents/scripts/audit-baselines.js +6 -27
  16. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  17. package/.agents/scripts/audit-to-stories.js +91 -361
  18. package/.agents/scripts/boot-sweep.js +19 -72
  19. package/.agents/scripts/bootstrap.js +74 -395
  20. package/.agents/scripts/ceremony-derive.js +9 -45
  21. package/.agents/scripts/check-arch-cycles.js +14 -64
  22. package/.agents/scripts/check-baselines.js +8 -48
  23. package/.agents/scripts/check-context-budget.js +46 -172
  24. package/.agents/scripts/check-cyclomatic.js +12 -44
  25. package/.agents/scripts/check-dead-exports.js +13 -64
  26. package/.agents/scripts/check-doc-links.js +38 -186
  27. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  28. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  29. package/.agents/scripts/coverage-capture.js +32 -99
  30. package/.agents/scripts/deliver-light.js +14 -101
  31. package/.agents/scripts/deliver-recover.js +6 -42
  32. package/.agents/scripts/deliver-run.js +36 -133
  33. package/.agents/scripts/diagnose-friction.js +24 -116
  34. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  35. package/.agents/scripts/evidence-gate.js +23 -85
  36. package/.agents/scripts/file-ci-gap.js +10 -50
  37. package/.agents/scripts/generate-config-docs.js +30 -170
  38. package/.agents/scripts/generate-lens-checklists.js +8 -52
  39. package/.agents/scripts/generate-skills-index.js +14 -112
  40. package/.agents/scripts/generate-workflows-doc.js +10 -70
  41. package/.agents/scripts/git-cleanup.js +2 -34
  42. package/.agents/scripts/lib/Graph.js +24 -81
  43. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  44. package/.agents/scripts/lib/Logger.js +14 -76
  45. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  46. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  47. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  48. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  49. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  50. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  51. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  52. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  53. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  54. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  55. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  56. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  57. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  58. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  59. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  60. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  61. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  62. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  63. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  64. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  65. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  66. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  67. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  68. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  69. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  70. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  71. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  72. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  73. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  74. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  75. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  76. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  77. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  78. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  79. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  80. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  81. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  82. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  83. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  84. package/.agents/scripts/lib/baseline-loader.js +12 -51
  85. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  86. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  87. package/.agents/scripts/lib/baselines/components.js +10 -61
  88. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  89. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
  90. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  91. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  92. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  93. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  94. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  95. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  96. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  97. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  98. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  99. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  100. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  101. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  102. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  103. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  104. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  105. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  106. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  107. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  108. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  109. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  110. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  111. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  112. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  113. package/.agents/scripts/lib/baselines/reader.js +14 -107
  114. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  115. package/.agents/scripts/lib/baselines/scope.js +11 -135
  116. package/.agents/scripts/lib/baselines/writer.js +16 -149
  117. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  118. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  119. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  120. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  121. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  122. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  123. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  124. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  125. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  126. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  127. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  128. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  129. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  130. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  131. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  132. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  133. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  134. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  135. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  136. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  137. package/.agents/scripts/lib/changed-files.js +31 -143
  138. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  139. package/.agents/scripts/lib/checks/index.js +18 -101
  140. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  141. package/.agents/scripts/lib/checks/state.js +16 -91
  142. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  143. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  144. package/.agents/scripts/lib/child-exec.js +39 -108
  145. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  146. package/.agents/scripts/lib/cli-args.js +31 -146
  147. package/.agents/scripts/lib/cli-usage.js +5 -27
  148. package/.agents/scripts/lib/cli-utils.js +2 -12
  149. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  150. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  151. package/.agents/scripts/lib/close-validation/process.js +121 -151
  152. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  153. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  154. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  155. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  156. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  157. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  158. package/.agents/scripts/lib/command-header.js +6 -28
  159. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  160. package/.agents/scripts/lib/config/baselines.js +3 -14
  161. package/.agents/scripts/lib/config/ci.js +8 -38
  162. package/.agents/scripts/lib/config/commands.js +1 -15
  163. package/.agents/scripts/lib/config/defaults.js +4 -33
  164. package/.agents/scripts/lib/config/delivery-routing.js +6 -35
  165. package/.agents/scripts/lib/config/explain.js +9 -80
  166. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  167. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
  168. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  169. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  170. package/.agents/scripts/lib/config/gates/index.js +2 -17
  171. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  172. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  173. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  174. package/.agents/scripts/lib/config/github.js +4 -22
  175. package/.agents/scripts/lib/config/limits.js +4 -57
  176. package/.agents/scripts/lib/config/paths.js +2 -21
  177. package/.agents/scripts/lib/config/qa.js +4 -38
  178. package/.agents/scripts/lib/config/quality.js +76 -432
  179. package/.agents/scripts/lib/config/runners.js +12 -56
  180. package/.agents/scripts/lib/config/runtime.js +13 -57
  181. package/.agents/scripts/lib/config/shared.js +2 -16
  182. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  183. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  184. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  185. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  186. package/.agents/scripts/lib/config-resolver.js +10 -52
  187. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  188. package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
  189. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  190. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  191. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  192. package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
  193. package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
  194. package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
  195. package/.agents/scripts/lib/coverage-capture.js +99 -224
  196. package/.agents/scripts/lib/coverage-utils.js +14 -79
  197. package/.agents/scripts/lib/cpu-pool.js +17 -123
  198. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  199. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  200. package/.agents/scripts/lib/crap-engine.js +40 -153
  201. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  202. package/.agents/scripts/lib/crap-utils.js +31 -155
  203. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  204. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  205. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  206. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  207. package/.agents/scripts/lib/degraded-mode.js +3 -26
  208. package/.agents/scripts/lib/dependency-parser.js +8 -40
  209. package/.agents/scripts/lib/dependency-version.js +13 -35
  210. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  211. package/.agents/scripts/lib/doc-tiers.js +22 -126
  212. package/.agents/scripts/lib/duplicate-search.js +8 -72
  213. package/.agents/scripts/lib/env-loader.js +5 -27
  214. package/.agents/scripts/lib/error-redactor.js +6 -31
  215. package/.agents/scripts/lib/errors/index.js +2 -22
  216. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  217. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  218. package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
  219. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  220. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
  221. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  222. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  223. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  224. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  225. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  226. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  227. package/.agents/scripts/lib/findings/severity.js +18 -104
  228. package/.agents/scripts/lib/format-generated-json.js +12 -44
  229. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  230. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  231. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  232. package/.agents/scripts/lib/gates/friction.js +1 -3
  233. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  234. package/.agents/scripts/lib/gh-exec.js +31 -259
  235. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  236. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  237. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  238. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  239. package/.agents/scripts/lib/git-utils.js +37 -161
  240. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  241. package/.agents/scripts/lib/github-url.js +2 -17
  242. package/.agents/scripts/lib/import-graph.js +11 -38
  243. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  244. package/.agents/scripts/lib/json-utils.js +3 -18
  245. package/.agents/scripts/lib/label-constants.js +16 -111
  246. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  247. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  248. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  249. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  250. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  251. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  252. package/.agents/scripts/lib/npm-scripts.js +4 -23
  253. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  254. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  255. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  256. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  257. package/.agents/scripts/lib/observability/source-classifier.js +21 -203
  258. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  259. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  260. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  261. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  262. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  263. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  264. package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
  265. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  266. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  267. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  268. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  274. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  275. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  276. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
  277. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  278. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  279. package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
  280. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  281. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  282. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  283. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  284. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  285. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  286. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  287. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  288. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  289. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  290. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  291. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  292. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  293. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  294. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  295. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  308. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  309. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  310. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  311. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  312. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  313. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  314. package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
  315. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  316. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  317. package/.agents/scripts/lib/orchestration/merge-queue.js +158 -0
  318. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  319. package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
  320. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  321. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  322. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  323. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  324. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  325. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  326. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
  327. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  328. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  329. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  330. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  331. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  332. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  333. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
  334. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  335. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
  336. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
  337. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
  338. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  339. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  340. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  341. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  342. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  343. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  344. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  345. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  346. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  347. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  348. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  349. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  350. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  351. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  352. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  353. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  354. package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
  355. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  356. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  357. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  358. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  359. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  360. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  361. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  362. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  363. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  364. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  365. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  366. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  367. package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
  368. package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
  369. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  370. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  371. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  372. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +190 -280
  373. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +183 -485
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  390. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  391. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
  392. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  393. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  394. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  395. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  396. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  397. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  398. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  399. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  400. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
  401. package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
  402. package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
  403. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  404. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  405. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
  406. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  407. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  408. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  409. package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
  410. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  411. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
  412. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  413. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  414. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  415. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  416. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  417. package/.agents/scripts/lib/path-security.js +3 -6
  418. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  419. package/.agents/scripts/lib/preflight-runner.js +13 -69
  420. package/.agents/scripts/lib/process-group.js +143 -0
  421. package/.agents/scripts/lib/project-root.js +2 -8
  422. package/.agents/scripts/lib/provider-factory.js +2 -25
  423. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  424. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  425. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  426. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  427. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  428. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  429. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  430. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  431. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  432. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  433. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  434. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  435. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  436. package/.agents/scripts/lib/signals/index.js +2 -19
  437. package/.agents/scripts/lib/signals/schema.js +14 -109
  438. package/.agents/scripts/lib/signals/write.js +2 -11
  439. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  440. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  441. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  442. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  443. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  444. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  445. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  446. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  447. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  448. package/.agents/scripts/lib/source-extensions.js +11 -42
  449. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  450. package/.agents/scripts/lib/stdio-flush.js +9 -36
  451. package/.agents/scripts/lib/story-adjacency.js +8 -40
  452. package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
  453. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  454. package/.agents/scripts/lib/story-body/story-body.js +83 -358
  455. package/.agents/scripts/lib/temp-retention.js +42 -143
  456. package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
  457. package/.agents/scripts/lib/test-env.js +12 -65
  458. package/.agents/scripts/lib/test-run-credit.js +10 -65
  459. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  460. package/.agents/scripts/lib/test-temp.js +38 -184
  461. package/.agents/scripts/lib/test-tiers.js +12 -96
  462. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  463. package/.agents/scripts/lib/transpile.js +15 -74
  464. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  465. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  466. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  467. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  468. package/.agents/scripts/lib/validation-evidence.js +21 -96
  469. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  470. package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
  471. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  472. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  473. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  474. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  475. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  476. package/.agents/scripts/lib/workflow-closure.js +22 -105
  477. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  478. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  479. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  480. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  481. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  482. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  483. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  484. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  485. package/.agents/scripts/lib/worktree-manager.js +15 -40
  486. package/.agents/scripts/lint-issue-body.js +12 -68
  487. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  488. package/.agents/scripts/merge-baseline.js +30 -104
  489. package/.agents/scripts/nav-registry-diff.js +22 -108
  490. package/.agents/scripts/notify.js +12 -69
  491. package/.agents/scripts/plan-context.js +27 -111
  492. package/.agents/scripts/plan-critics.js +12 -66
  493. package/.agents/scripts/plan-persist.js +31 -148
  494. package/.agents/scripts/plan-run-epilogue.js +11 -37
  495. package/.agents/scripts/pr-watch-with-update.js +76 -267
  496. package/.agents/scripts/providers/github/auth.js +3 -8
  497. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  498. package/.agents/scripts/providers/github/board-add.js +5 -21
  499. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  500. package/.agents/scripts/providers/github/cache.js +2 -14
  501. package/.agents/scripts/providers/github/comments.js +7 -40
  502. package/.agents/scripts/providers/github/compose.js +3 -19
  503. package/.agents/scripts/providers/github/errors.js +22 -125
  504. package/.agents/scripts/providers/github/issues.js +31 -123
  505. package/.agents/scripts/providers/github/labels.js +24 -124
  506. package/.agents/scripts/providers/github/mappers.js +5 -27
  507. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  508. package/.agents/scripts/providers/github/project-board.js +2 -17
  509. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  510. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  511. package/.agents/scripts/providers/github/search-budget.js +9 -39
  512. package/.agents/scripts/providers/github/search-query.js +5 -26
  513. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  514. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  515. package/.agents/scripts/providers/github/tickets.js +32 -134
  516. package/.agents/scripts/providers/github.js +18 -59
  517. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  518. package/.agents/scripts/quality-preview.js +35 -220
  519. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  520. package/.agents/scripts/resolve-stories.js +16 -67
  521. package/.agents/scripts/resync-status-column.js +6 -25
  522. package/.agents/scripts/run-tests.js +29 -104
  523. package/.agents/scripts/single-story-close.js +23 -135
  524. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  525. package/.agents/scripts/single-story-init.js +47 -209
  526. package/.agents/scripts/stories-wave-tick.js +102 -472
  527. package/.agents/scripts/sync-agentrc.js +3 -21
  528. package/.agents/scripts/sync-claude-agents.js +9 -55
  529. package/.agents/scripts/sync-claude-commands.js +20 -110
  530. package/.agents/scripts/test-wrapper.js +6 -43
  531. package/.agents/scripts/update-coverage-baseline.js +5 -22
  532. package/.agents/scripts/update-crap-baseline.js +7 -30
  533. package/.agents/scripts/update-duplication-baseline.js +16 -92
  534. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  535. package/.agents/scripts/update-ticket-state.js +1 -7
  536. package/.agents/scripts/validate-skills.js +6 -26
  537. package/.agents/templates/agent-protocol.md +2 -2
  538. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  539. package/.agents/workflows/audit-accessibility.md +4 -7
  540. package/.agents/workflows/audit-adrs.md +3 -6
  541. package/.agents/workflows/audit-architecture.md +3 -11
  542. package/.agents/workflows/audit-baselines.md +6 -9
  543. package/.agents/workflows/audit-clean-code.md +8 -12
  544. package/.agents/workflows/audit-data-model.md +3 -7
  545. package/.agents/workflows/audit-dependencies.md +4 -7
  546. package/.agents/workflows/audit-devops.md +4 -8
  547. package/.agents/workflows/audit-documentation.md +1 -4
  548. package/.agents/workflows/audit-mobile.md +4 -7
  549. package/.agents/workflows/audit-navigability.md +3 -6
  550. package/.agents/workflows/audit-performance.md +2 -4
  551. package/.agents/workflows/audit-privacy.md +4 -7
  552. package/.agents/workflows/audit-quality.md +4 -7
  553. package/.agents/workflows/audit-security.md +4 -7
  554. package/.agents/workflows/audit-seo.md +4 -7
  555. package/.agents/workflows/audit-sre.md +4 -7
  556. package/.agents/workflows/audit-to-stories.md +17 -30
  557. package/.agents/workflows/audit-ux-ui.md +4 -7
  558. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  559. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  560. package/.agents/workflows/helpers/deliver-digest.md +6 -4
  561. package/.agents/workflows/helpers/deliver-reference.md +114 -188
  562. package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
  563. package/.agents/workflows/helpers/plan-reference.md +86 -139
  564. package/.agents/workflows/helpers/qa-core.md +12 -0
  565. package/.agents/workflows/memory-consolidate.md +1 -1
  566. package/.agents/workflows/qa-assist.md +27 -71
  567. package/.agents/workflows/qa-explore.md +19 -59
  568. package/.agents/workflows/qa-run.md +11 -33
  569. package/README.md +1 -1
  570. package/bin/mandrel.js +5 -46
  571. package/bin/postinstall.js +18 -107
  572. package/docs/CHANGELOG.md +32 -0
  573. package/lib/cli/doctor.js +11 -71
  574. package/lib/cli/init.js +26 -165
  575. package/lib/cli/migrate.js +5 -64
  576. package/lib/cli/registry.js +84 -467
  577. package/lib/cli/sync-agents.js +4 -64
  578. package/lib/cli/sync-commands.js +11 -64
  579. package/lib/cli/sync.js +34 -213
  580. package/lib/cli/uninstall.js +40 -219
  581. package/lib/cli/update.js +105 -661
  582. package/lib/cli/version-check.js +8 -72
  583. package/lib/cli/version-helpers.js +14 -87
  584. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  585. package/lib/migrations/index.js +15 -92
  586. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  587. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  588. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  589. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  590. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  591. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  592. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  593. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  594. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
  595. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  596. package/package.json +16 -14
  597. package/.agents/docs/SDLC.md +0 -590
  598. package/.agents/docs/quality-gates.md +0 -1183
  599. package/.agents/rules/known-tooling-behavior.md +0 -200
  600. package/.agents/rules/orchestration-error-handling.md +0 -61
  601. package/.agents/rules/test-seams.md +0 -59
  602. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  603. package/.agents/schemas/baselines/lint.schema.json +0 -47
  604. package/.agents/scripts/check-action-pinning.js +0 -260
  605. package/.agents/scripts/check-audit-attribution.js +0 -302
  606. package/.agents/scripts/check-baseline-drift.js +0 -211
  607. package/.agents/scripts/check-baseline-scope.js +0 -362
  608. package/.agents/scripts/check-generated-validator.js +0 -202
  609. package/.agents/scripts/check-knip-entries.js +0 -159
  610. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  611. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  612. package/.agents/scripts/check-schema-references.js +0 -368
  613. package/.agents/scripts/check-test-portability.js +0 -512
  614. package/.agents/scripts/check-workflow-citations.js +0 -218
  615. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  616. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  617. package/.agents/scripts/install-matrix-assert.js +0 -326
  618. package/.agents/scripts/lib/audit-advisories.js +0 -195
  619. package/.agents/scripts/lib/audit-attribution.js +0 -134
  620. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  621. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  622. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  623. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  624. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  625. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  626. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  627. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  628. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  629. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  630. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  631. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  632. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  633. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  634. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  635. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  636. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  637. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  638. package/.agents/scripts/lib/fs-walk.js +0 -52
  639. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  640. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  641. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  642. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  643. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  644. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  645. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  646. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  647. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  648. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  649. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  650. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  651. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  652. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  653. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  654. package/.agents/scripts/post-structured-comment.js +0 -127
  655. package/.agents/scripts/provision-git-hooks.js +0 -85
  656. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  657. package/.agents/scripts/run-coverage.js +0 -197
  658. package/.agents/scripts/run-lint.js +0 -133
  659. package/.agents/scripts/run-test-profile.js +0 -129
  660. package/.agents/scripts/run-verify.js +0 -125
  661. package/.agents/scripts/test-isolate.js +0 -55
  662. 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
- });