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,332 +0,0 @@
1
- /**
2
- * CLI: ratchet-down gate on provenance citations in workflow prose.
3
- *
4
- * Workflow documents ride resident in an executing agent's context. A
5
- * `(Story #1234)` aside costs the same tokens as instruction and teaches
6
- * the model Mandrel's own history instead of the task in front of it. The
7
- * citations that survive are the ones a reader must follow to act; the
8
- * rest belong in the commit trail and `docs/decisions.md`.
9
- *
10
- * Nothing stops the tax re-accumulating one well-meaning aside at a time,
11
- * so this gate holds the line: count every issue-shaped reference across
12
- * `.agents/workflows/**\/*.md` and fail when the total rises above the
13
- * committed baseline at `baselines/workflow-citations.json`.
14
- *
15
- * The counted token is the bare `#NNNN` form rather than the
16
- * `(Story|Epic|issue|refs) #NNNN` phrasing, because the same citation is
17
- * written both ways — `(Story #4593)` and a bare `(#4593)` — and a gate
18
- * that only saw the prefixed form would wave the other one through.
19
- *
20
- * Ratchet semantics mirror `check-arch-cycles.js`:
21
- * - Total above the baseline → exit 1, with the files that grew.
22
- * - Total below the baseline → printed as shrinkage, exit 0. Refresh the
23
- * baseline with `--update` to lock the reduction in.
24
- * - Equal → exit 0.
25
- *
26
- * Flags:
27
- * --baseline <path> override the baseline path (default
28
- * `baselines/workflow-citations.json`, resolved from cwd)
29
- * --root <path> scan a different workflow root (default
30
- * `.agents/workflows`)
31
- * --update rewrite the baseline from the live count
32
- * --json write the structured envelope to stdout
33
- */
34
-
35
- import fs from 'node:fs';
36
- import path from 'node:path';
37
- import process from 'node:process';
38
- import { runAsCli } from './lib/cli-utils.js';
39
-
40
- /** Default workflow root, relative to the repository root. */
41
- const DEFAULT_ROOT = path.join('.agents', 'workflows');
42
-
43
- /** Default baseline path, relative to the repository root. */
44
- const DEFAULT_BASELINE = path.join('baselines', 'workflow-citations.json');
45
-
46
- /**
47
- * Issue-shaped reference: a `#` followed by 3–5 digits. Narrow enough to
48
- * skip markdown headings and anchor links, wide enough to catch both the
49
- * `(Story #1234)` and bare `(#1234)` spellings of one citation.
50
- */
51
- const CITATION_RE = /#\d{3,5}\b/g;
52
-
53
- /**
54
- * Parse argv. Exported so unit tests can pin the parser.
55
- *
56
- * @param {string[]} argv
57
- * @returns {{ baselinePath: string | null, rootPath: string | null, update: boolean, json: boolean }}
58
- */
59
- export function parseArgv(argv = []) {
60
- const out = {
61
- baselinePath: null,
62
- rootPath: null,
63
- update: false,
64
- json: false,
65
- };
66
- for (let i = 0; i < argv.length; i += 1) {
67
- const flag = argv[i];
68
- const next = argv[i + 1];
69
- const takesValue = next && !next.startsWith('--');
70
- if (flag === '--baseline' && takesValue) {
71
- out.baselinePath = next;
72
- i += 1;
73
- } else if (flag === '--root' && takesValue) {
74
- out.rootPath = next;
75
- i += 1;
76
- } else if (flag === '--update') {
77
- out.update = true;
78
- } else if (flag === '--json') {
79
- out.json = true;
80
- }
81
- }
82
- return out;
83
- }
84
-
85
- /**
86
- * Recursively collect `.md` files under `rootDir`. Returns absolute paths,
87
- * sorted for determinism.
88
- *
89
- * @param {string} rootDir
90
- * @returns {string[]}
91
- */
92
- export function collectMarkdownFiles(rootDir) {
93
- const out = [];
94
- const walk = (dir) => {
95
- let entries;
96
- try {
97
- entries = fs.readdirSync(dir, { withFileTypes: true });
98
- } catch {
99
- return;
100
- }
101
- for (const entry of entries) {
102
- const full = path.join(dir, entry.name);
103
- if (entry.isDirectory()) walk(full);
104
- else if (entry.isFile() && entry.name.endsWith('.md')) out.push(full);
105
- }
106
- };
107
- walk(rootDir);
108
- return out.sort();
109
- }
110
-
111
- /**
112
- * Pure helper: count citations in source text.
113
- *
114
- * @param {string} source
115
- * @returns {number}
116
- */
117
- export function countCitations(source) {
118
- return (String(source ?? '').match(CITATION_RE) ?? []).length;
119
- }
120
-
121
- /**
122
- * Count citations across a file set, relativizing paths against `cwd` so
123
- * the report serializes identically on every platform. Files with zero
124
- * citations are omitted — the baseline records where the tax lives.
125
- *
126
- * @param {string[]} files absolute paths
127
- * @param {string} cwd
128
- * @param {{ readFile?: (p: string) => string }} [opts]
129
- * @returns {{ total: number, files: Array<{ path: string, count: number }> }}
130
- */
131
- export function tallyCitations(files, cwd, { readFile } = {}) {
132
- const read = readFile ?? ((p) => fs.readFileSync(p, 'utf-8'));
133
- const rows = [];
134
- let total = 0;
135
- for (const file of files) {
136
- let count;
137
- try {
138
- count = countCitations(read(file));
139
- } catch {
140
- continue;
141
- }
142
- if (count === 0) continue;
143
- total += count;
144
- rows.push({
145
- path: path.relative(cwd, file).split(path.sep).join('/'),
146
- count,
147
- });
148
- }
149
- return { total, files: rows.sort((a, b) => a.path.localeCompare(b.path)) };
150
- }
151
-
152
- /**
153
- * Pure helper: read the baseline envelope. Returns `null` when the file is
154
- * missing or unparseable — the baseline is not distributed to consumers, so
155
- * its absence degrades to "no ceiling" rather than a false failure.
156
- *
157
- * @param {string} baselinePath
158
- * @returns {{ total?: number, files?: Array<{ path: string, count: number }> } | null}
159
- */
160
- export function loadBaseline(baselinePath) {
161
- try {
162
- const parsed = JSON.parse(fs.readFileSync(baselinePath, 'utf-8'));
163
- return parsed && typeof parsed === 'object' ? parsed : null;
164
- } catch {
165
- return null;
166
- }
167
- }
168
-
169
- /**
170
- * Pure helper: diff the live tally against the baseline. `grew` names the
171
- * files whose per-file count rose, so a failure points at the edit rather
172
- * than only at the total.
173
- *
174
- * @param {{ total?: number, files?: Array<{ path: string, count: number }> } | null} baseline
175
- * @param {{ total: number, files: Array<{ path: string, count: number }> }} tally
176
- * @returns {{ baselineTotal: number | null, delta: number | null, grew: Array<{ path: string, from: number, to: number }> }}
177
- */
178
- export function diffTally(baseline, tally) {
179
- const baselineTotal =
180
- typeof baseline?.total === 'number' ? baseline.total : null;
181
- const prior = new Map(
182
- (baseline?.files ?? []).map((row) => [row.path, row.count]),
183
- );
184
- const grew = tally.files
185
- .map((row) => ({
186
- path: row.path,
187
- from: prior.get(row.path) ?? 0,
188
- to: row.count,
189
- }))
190
- .filter((row) => row.to > row.from);
191
- return {
192
- baselineTotal,
193
- delta: baselineTotal === null ? null : tally.total - baselineTotal,
194
- grew,
195
- };
196
- }
197
-
198
- /**
199
- * Pure helper: render the human-readable diff, mirroring the `+` / `-`
200
- * vocabulary of the sibling ratchets.
201
- *
202
- * @param {{ baselineTotal: number | null, delta: number | null, grew: Array<{ path: string, from: number, to: number }> }} diff
203
- * @param {{ total: number }} tally
204
- * @returns {string}
205
- */
206
- export function renderDiff(diff, tally) {
207
- const lines = [];
208
- for (const row of diff.grew) {
209
- lines.push(`+ ${row.path}: ${row.from} -> ${row.to}`);
210
- }
211
- if (diff.delta !== null && diff.delta < 0) {
212
- lines.push(
213
- `[workflow-citations] ⚠ ${-diff.delta} citation(s) below baseline — refresh with --update to lock the reduction in`,
214
- );
215
- }
216
- const tag = diff.delta !== null && diff.delta > 0 ? '(gate fail)' : '(ok)';
217
- lines.push(
218
- `[workflow-citations] total=${tally.total} baseline=${diff.baselineTotal ?? 'none'} ${tag}`,
219
- );
220
- return lines.join('\n');
221
- }
222
-
223
- /**
224
- * Top-level CLI entry. Exported so tests can drive the pipeline against a
225
- * tmpdir fixture corpus.
226
- *
227
- * @param {{
228
- * argv?: string[],
229
- * cwd?: string,
230
- * stdout?: { write: (s: string) => void },
231
- * stderr?: { write: (s: string) => void },
232
- * }} [opts]
233
- * @returns {Promise<number>} 0 = at or below baseline; 1 = regression
234
- */
235
- export async function runCli({
236
- argv = process.argv.slice(2),
237
- cwd = process.cwd(),
238
- stdout = process.stdout,
239
- stderr = process.stderr,
240
- } = {}) {
241
- const { baselinePath, rootPath, update, json } = parseArgv(argv);
242
- const root = path.resolve(cwd, rootPath ?? DEFAULT_ROOT);
243
- const resolvedBaselinePath = path.resolve(
244
- cwd,
245
- baselinePath ?? DEFAULT_BASELINE,
246
- );
247
- if (!fs.existsSync(root)) {
248
- throw new Error(`[workflow-citations] workflow root not found: ${root}`);
249
- }
250
-
251
- const tally = tallyCitations(collectMarkdownFiles(root), cwd);
252
-
253
- if (update) {
254
- const envelope = {
255
- $schema: 'https://mandrel.dev/baselines/workflow-citations.schema.json',
256
- generatedAt: new Date().toISOString(),
257
- total: tally.total,
258
- files: tally.files,
259
- };
260
- fs.mkdirSync(path.dirname(resolvedBaselinePath), { recursive: true });
261
- fs.writeFileSync(
262
- resolvedBaselinePath,
263
- `${JSON.stringify(envelope, null, 2)}\n`,
264
- );
265
- stdout.write(
266
- `[workflow-citations] baseline written: ${resolvedBaselinePath} (total=${tally.total})\n`,
267
- );
268
- return 0;
269
- }
270
-
271
- const baseline = loadBaseline(resolvedBaselinePath);
272
- const diff = diffTally(baseline, tally);
273
- const exitCode = diff.delta !== null && diff.delta > 0 ? 1 : 0;
274
-
275
- if (json) {
276
- stdout.write(
277
- `${JSON.stringify(
278
- {
279
- kind: 'workflow-citations-report',
280
- root,
281
- baselinePath: resolvedBaselinePath,
282
- total: tally.total,
283
- baselineTotal: diff.baselineTotal,
284
- delta: diff.delta,
285
- files: tally.files,
286
- grew: diff.grew,
287
- exitCode,
288
- },
289
- null,
290
- 2,
291
- )}\n`,
292
- );
293
- return exitCode;
294
- }
295
-
296
- if (!baseline) {
297
- stderr.write(
298
- `[workflow-citations] ⚠ baseline not found at ${resolvedBaselinePath} — no ceiling enforced\n`,
299
- );
300
- }
301
- stdout.write(`\n--- workflow-citations preview ---\n`);
302
- stdout.write(`${renderDiff(diff, tally)}\n`);
303
- return exitCode;
304
- }
305
-
306
- async function main() {
307
- return runCli();
308
- }
309
-
310
- runAsCli(import.meta.url, main, {
311
- source: 'workflow-citations',
312
- propagateExitCode: true,
313
- errorPrefix: '[workflow-citations] ❌ Fatal error',
314
- usage: {
315
- invocation:
316
- 'node .agents/scripts/check-workflow-citations.js [--baseline <path>] [--root <dir>] [--update] [--json]',
317
- summary:
318
- 'Ratchet on provenance citations in workflow prose: count issue-shaped references across .agents/workflows/** and fail when the total rises above the recorded baseline.',
319
- flags: [
320
- [
321
- '--baseline <path>',
322
- 'Baseline file (default: baselines/workflow-citations.json).',
323
- ],
324
- ['--root <dir>', 'Workflow root to scan (default: .agents/workflows).'],
325
- ['--update', 'Rewrite the baseline from the live count.'],
326
- ['--json', 'Emit the comparison envelope as JSON.'],
327
- ],
328
- notes: [
329
- 'Exit codes:\n 0 at or below the baseline\n 1 the citation total regressed above the baseline',
330
- ],
331
- },
332
- });
@@ -1,299 +0,0 @@
1
- #!/usr/bin/env node
2
- /* node:coverage ignore file */
3
-
4
- /**
5
- * check-workflow-cli-lint.js — enforce the "no workflow instructs a
6
- * no-CLI library call" rule (Epic #4474 PR5; sibling of
7
- * check-lifecycle-lint.js).
8
- *
9
- * The measured failure mode this rule kills: workflow prose that tells the
10
- * host LLM to "Call `someExportedFunction({...})` exported from
11
- * `lib/whatever.js`". There is no runnable form of that instruction, so the
12
- * model greps the framework source and writes throwaway `.mjs` shims to
13
- * invoke the export — the mandrel-bench N=2 cohort measured ~12–15 turns of
14
- * shim-writing per plan for exactly this pattern. Workflows must instruct
15
- * `node .agents/scripts/<cli>.js …` commands instead.
16
- *
17
- * Scope: every `*.md` under `.agents/workflows/`.
18
- *
19
- * Heuristic (tuned to zero false positives on the surviving corpus —
20
- * descriptive mentions like "the automatic paths call `foo()`" are prose
21
- * about script internals, not instructions, and are NOT flagged):
22
- *
23
- * Rule 1 — imperative library call. A paragraph (fenced code blocks
24
- * stripped; lines joined) matching /\b(Call|Invoke)\s+`ident\s*\(/ —
25
- * a capitalized imperative directly instructing a function call.
26
- *
27
- * Rule 2 — "exported from" instruction. A paragraph containing both a
28
- * backticked call token (`ident(`) and the phrase "exported from" —
29
- * the canonical shape of the retired Phase 2/3/4 prose.
30
- *
31
- * Rule 3 — prose-level lib import. `import(` / `require(` naming a
32
- * `scripts/lib/` path OUTSIDE a fenced code block. (A complete,
33
- * runnable `node -e` one-liner inside a fenced block is exempt: it
34
- * costs zero shim-writing turns because it is executable as written.)
35
- *
36
- * Exit codes:
37
- * 0 — clean.
38
- * 1 — at least one violation; offending file + paragraph line printed
39
- * to stderr.
40
- *
41
- * Ships as part of `npm run lint` (run-lint.js task list), alongside the
42
- * lifecycle lint and the label-vocabulary lint.
43
- */
44
-
45
- import { readdirSync, readFileSync, statSync } from 'node:fs';
46
- import path from 'node:path';
47
- import { fileURLToPath } from 'node:url';
48
-
49
- import { runAsCli } from './lib/cli-utils.js';
50
-
51
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
52
- const REPO_ROOT = path.resolve(__dirname, '..', '..');
53
- export const DEFAULT_WORKFLOWS_DIR = path.join(
54
- REPO_ROOT,
55
- '.agents',
56
- 'workflows',
57
- );
58
-
59
- const IMPERATIVE_CALL_RE = /\b(?:Call|Invoke)\s+`[A-Za-z_$][\w$]*\s*\(/;
60
- const BACKTICK_CALL_RE = /`[A-Za-z_$][\w$]*\s*\(/;
61
- const EXPORTED_FROM_RE = /\bexported from\b/;
62
- const LIB_IMPORT_RE = /\b(?:import|require)\(\s*['"`][^'"`]*scripts\/lib\//;
63
-
64
- /** A markdown table row (leading pipe, optionally indented). */
65
- const TABLE_ROW_RE = /^\s*\|/;
66
- /** A markdown heading of any level — the lookback boundary for Rule 4. */
67
- const HEADING_RE = /^\s*#{1,6}\s/;
68
- /** A backticked `--flag` occupying a table row's first cell. */
69
- const FLAG_CELL_RE = /^\s*\|\s*`?--[\w-]+/;
70
- /** A `.js` script filename — bare or path-qualified. */
71
- const SCRIPT_NAME_RE = /([\w./-]*[\w-]+\.js)\b/;
72
- /** A markdown table's delimiter row (`| --- | --- |`). */
73
- const TABLE_DELIMITER_RE = /^\s*\|[\s|:-]+\|?\s*$/;
74
- /** Minimum `--flag` rows before a table counts as a flag *table*. */
75
- export const MIN_FLAG_ROWS = 2;
76
-
77
- /**
78
- * Strip fenced code blocks (``` / ~~~), replacing their lines with empty
79
- * strings so line numbers stay stable. Complete runnable commands live in
80
- * fences and are exempt by design (see header).
81
- *
82
- * @param {string} source
83
- * @returns {string[]} lines with fenced content blanked.
84
- */
85
- export function stripFences(source) {
86
- const lines = source.split('\n');
87
- let inFence = false;
88
- return lines.map((line) => {
89
- const fence = /^\s*(```|~~~)/.test(line);
90
- if (fence) {
91
- inFence = !inFence;
92
- return '';
93
- }
94
- return inFence ? '' : line;
95
- });
96
- }
97
-
98
- /**
99
- * Split blanked lines into paragraphs — runs of consecutive non-empty
100
- * lines — keeping the 1-based line number of each paragraph's first line.
101
- *
102
- * @param {string[]} lines
103
- * @returns {Array<{ text: string, line: number }>}
104
- */
105
- export function toParagraphs(lines) {
106
- const paragraphs = [];
107
- let buf = [];
108
- let start = 0;
109
- for (let i = 0; i < lines.length; i++) {
110
- if (lines[i].trim().length > 0) {
111
- if (buf.length === 0) start = i + 1;
112
- buf.push(lines[i]);
113
- } else if (buf.length > 0) {
114
- paragraphs.push({ text: buf.join(' '), line: start });
115
- buf = [];
116
- }
117
- }
118
- if (buf.length > 0) paragraphs.push({ text: buf.join(' '), line: start });
119
- return paragraphs;
120
- }
121
-
122
- /**
123
- * Rule 4 — CLI flag table. Find markdown tables that enumerate the `--flags`
124
- * of a script the repo already owns, and flag them as duplicated surface.
125
- *
126
- * The script's own argument parser is the source of truth for its flags, and
127
- * it prints them itself; a copy in prose is drift waiting to happen (the very
128
- * drift Story #4546 removed). Prose must point at the command instead.
129
- *
130
- * The signal is deliberately narrow, to stay at zero false positives:
131
- *
132
- * 1. The table has at least `MIN_FLAG_ROWS` data rows whose **first cell**
133
- * is a `--flag`. One flag row among prose rows is a contract/behaviour
134
- * table (e.g. "Default | …", "`--dry-run` | …"), not a flag enumeration.
135
- * 2. A `.js` script is named between the table and the nearest preceding
136
- * heading (inclusive) — i.e. the section is *about* that script, so the
137
- * table is restating its surface.
138
- *
139
- * A slash command's own argument table (`/mandrel-plan`, `/mandrel-deliver`) has no script
140
- * behind it — nothing owns those flags but the workflow prose itself — so
141
- * condition 2 leaves it alone by design.
142
- *
143
- * @param {string[]} rawLines unstripped source lines (fenced commands are the
144
- * usual place a script is named, so this rule reads the original text).
145
- * @returns {Array<{ rule: string, line: number, hint: string }>}
146
- */
147
- export function lintFlagTables(rawLines) {
148
- const violations = [];
149
- let inFence = false;
150
-
151
- for (let i = 0; i < rawLines.length; i++) {
152
- if (/^\s*(```|~~~)/.test(rawLines[i])) {
153
- inFence = !inFence;
154
- continue;
155
- }
156
- if (inFence || !TABLE_ROW_RE.test(rawLines[i])) continue;
157
-
158
- // Collect the contiguous table block starting here.
159
- const start = i;
160
- let end = i;
161
- while (end + 1 < rawLines.length && TABLE_ROW_RE.test(rawLines[end + 1])) {
162
- end += 1;
163
- }
164
- i = end; // continue scanning after this table
165
-
166
- const flagRows = rawLines
167
- .slice(start, end + 1)
168
- .filter((l) => !TABLE_DELIMITER_RE.test(l) && FLAG_CELL_RE.test(l));
169
- if (flagRows.length < MIN_FLAG_ROWS) continue;
170
-
171
- // Look back to the nearest heading (inclusive) for a named script.
172
- let script = null;
173
- for (let j = start - 1; j >= 0; j--) {
174
- const m = SCRIPT_NAME_RE.exec(rawLines[j]);
175
- if (m) {
176
- script = m[1];
177
- break;
178
- }
179
- if (HEADING_RE.test(rawLines[j])) break;
180
- }
181
- if (!script) continue;
182
-
183
- const base = script.split('/').pop();
184
- violations.push({
185
- rule: 'no-cli-flag-table',
186
- line: start + 1,
187
- hint:
188
- `Workflow prose restates the flag surface of \`${base}\` as a table (${flagRows.length} flag rows). ` +
189
- "The script's argument parser owns those flags, so a prose copy is drift waiting to happen. " +
190
- `Delete the table and point at the command (\`node .agents/scripts/${base} …\`), keeping only the ` +
191
- 'judgement a reader cannot get from the command itself. If the script has no help output to point ' +
192
- 'at, add one — do not re-inline the table.',
193
- });
194
- }
195
- return violations;
196
- }
197
-
198
- /**
199
- * Lint one markdown source. Returns violations
200
- * `{ rule, line, hint }[]` (empty when clean).
201
- *
202
- * @param {string} source markdown content.
203
- * @returns {Array<{ rule: string, line: number, hint: string }>}
204
- */
205
- export function lintWorkflowSource(source) {
206
- const violations = [];
207
- const rawLines = source.split('\n');
208
- const lines = stripFences(source);
209
- violations.push(...lintFlagTables(rawLines));
210
- for (const para of toParagraphs(lines)) {
211
- if (IMPERATIVE_CALL_RE.test(para.text)) {
212
- violations.push({
213
- rule: 'no-cli-library-call',
214
- line: para.line,
215
- hint:
216
- 'Workflow prose instructs calling a function directly ("Call/Invoke `fn(...)`"). ' +
217
- 'There is no runnable form of that instruction — the model must write a throwaway shim. ' +
218
- 'Instruct a `node .agents/scripts/<cli>.js …` command instead (add a CLI if none exists).',
219
- });
220
- continue;
221
- }
222
- if (EXPORTED_FROM_RE.test(para.text) && BACKTICK_CALL_RE.test(para.text)) {
223
- violations.push({
224
- rule: 'no-cli-library-call',
225
- line: para.line,
226
- hint:
227
- 'Workflow prose points at an exported library function ("`fn(...)` exported from …") ' +
228
- 'with no CLI entrypoint. Instruct a `node .agents/scripts/<cli>.js …` command instead.',
229
- });
230
- continue;
231
- }
232
- if (LIB_IMPORT_RE.test(para.text)) {
233
- violations.push({
234
- rule: 'no-prose-lib-import',
235
- line: para.line,
236
- hint:
237
- 'Workflow prose (outside a fenced code block) instructs importing a scripts/lib module. ' +
238
- 'Give a complete runnable command in a fenced block, or add a CLI entrypoint.',
239
- });
240
- }
241
- }
242
- return violations;
243
- }
244
-
245
- /**
246
- * Recursively collect `*.md` files under a directory.
247
- *
248
- * @param {string} dir
249
- * @returns {string[]} absolute paths.
250
- */
251
- export function collectMarkdown(dir) {
252
- const out = [];
253
- for (const entry of readdirSync(dir)) {
254
- const abs = path.join(dir, entry);
255
- const st = statSync(abs);
256
- if (st.isDirectory()) out.push(...collectMarkdown(abs));
257
- else if (entry.endsWith('.md')) out.push(abs);
258
- }
259
- return out;
260
- }
261
-
262
- /**
263
- * Run the check over a workflows directory. Exported for tests (pass a
264
- * fixture directory).
265
- *
266
- * @param {string} [workflowsDir]
267
- * @returns {Array<{ file: string, rule: string, line: number, hint: string }>}
268
- */
269
- export function runCheck(workflowsDir = DEFAULT_WORKFLOWS_DIR) {
270
- const violations = [];
271
- for (const file of collectMarkdown(workflowsDir)) {
272
- const source = readFileSync(file, 'utf8');
273
- for (const v of lintWorkflowSource(source)) {
274
- violations.push({ file: path.relative(REPO_ROOT, file), ...v });
275
- }
276
- }
277
- return violations;
278
- }
279
-
280
- async function main() {
281
- const violations = runCheck();
282
- if (violations.length === 0) {
283
- process.stdout.write(
284
- '[workflow-cli-lint] clean: no workflow instructs a no-CLI library call.\n',
285
- );
286
- return 0;
287
- }
288
- for (const v of violations) {
289
- process.stderr.write(
290
- `[workflow-cli-lint][${v.rule}] ${v.file}:${v.line}\n ${v.hint}\n`,
291
- );
292
- }
293
- return 1;
294
- }
295
-
296
- await runAsCli(import.meta.url, main, {
297
- source: 'check-workflow-cli-lint',
298
- propagateExitCode: true,
299
- });