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,54 +1,8 @@
1
1
  /**
2
- * single-story-sweep.js — the scope-agnostic merged-branch sweep engine
3
- * plus the `story-*` boot-sweep preset.
4
- *
5
- * `sweepMergedBranches` is the single reap engine every boot cleanup
6
- * path routes through. It sits directly over the `git-cleanup` phase
7
- * library (`planCleanup` / `executeCleanup` / `executeFastForward` /
8
- * `buildGlobFilter`) and the shared `evaluateProtection` guard set, so
9
- * no reap path re-implements the `git branch -D` / `git merge --ff-only`
10
- * primitives:
11
- *
12
- * - Scope: caller-supplied `include` / `exclude` globs (via
13
- * `buildGlobFilter`). The story preset pins `story-*`.
14
- * - Reap: merged local branches whose PR HEAD SHA equals the merged
15
- * `headRefOid`, deleted local + origin with tracking-ref
16
- * prune (`executeCleanup` in `--remote` mode).
17
- * - Protection (Story #2011): each candidate is filtered through
18
- * `evaluateProtection` before reaching `executeCleanup`. A
19
- * candidate is protected (not reaped) when its branch HEAD
20
- * differs from the PR's `headRefOid` (unpushed work), when
21
- * its worktree has uncommitted edits, or when the parent
22
- * Story ticket is not in a terminal state. Protected
23
- * candidates surface under `protected`.
24
- * - Fast-forward (opt-in via `fastForward: true`): fast-forward the
25
- * base branch through `executeFastForward` after the reap.
26
- * Best-effort — a failed fast-forward never fails the sweep.
27
- * - Concurrency (Story #2011): the sweep acquires a process-scoped
28
- * lockfile around plan + execute. On lock contention the
29
- * sweep is skipped (the host continues — same contract as a
30
- * plan failure).
31
- * - Content-merged (Story #4396, report-only): a plan candidate the
32
- * `git-cleanup` planner classified `detectedBy: 'content-merged'`
33
- * (Story #4395's `git merge-tree --write-tree` content-equivalence
34
- * probe) is a **weaker** signal than a merged PR or git ancestry —
35
- * no CI/GitHub merge check ever validated its exact diff. This
36
- * engine never reaps on that signal alone: content-merged
37
- * candidates are pulled out of the plan before protection +
38
- * execute and surfaced under `contentMerged` in the envelope so
39
- * the operator can route them to `/git-cleanup` for a confirmed,
40
- * eyeballed reap.
41
- * - Never touches the stash stack.
42
- * - Errors are caught and surfaced in the envelope. Callers MUST NOT
43
- * propagate sweep failures — the host proceeds either way.
44
- *
45
- * `sweepMergedStoryBranches` is a thin preset over the engine tuned for
46
- * the boot path (`include: story-*`, `exclude: <current story branch>`,
47
- * `fastForward: false`). Its exported name, signature, and result
48
- * envelope are unchanged from the pre-engine implementation.
49
- *
50
- * Re-exports the same `planCleanup` / `executeCleanup` injection seams so
51
- * tests can stub git/`gh` without touching the CLI.
2
+ * Merged-branch sweep over the `git-cleanup` phases, plus the `story-*` boot
3
+ * preset. A candidate is protected when its HEAD differs from the PR's, its
4
+ * worktree is dirty, or its Story is not terminal. Lock contention skips.
5
+ * Errors land in the envelope; callers MUST NOT propagate them.
52
6
  */
53
7
 
54
8
  import {
@@ -64,8 +18,6 @@ import { acquireSweepLock as defaultAcquireSweepLock } from './single-story-swee
64
18
  const STORY_BRANCH_INCLUDE = 'story-*';
65
19
 
66
20
  /**
67
- * Scope-agnostic merged-branch sweep engine.
68
- *
69
21
  * @param {{
70
22
  * cwd: string,
71
23
  * baseBranch: string,
@@ -129,9 +81,7 @@ export async function sweepMergedBranches({
129
81
  return zeroResult({ error: 'baseBranch is required' });
130
82
  }
131
83
 
132
- // Optional lock acquisition. Skip silently when no lockPath is
133
- // supplied (e.g. unit tests, callers that opt out). Contention is
134
- // non-fatal — return a skipped result and let the host continue.
84
+ // No lockPath → no lock. Contention returns a skipped result.
135
85
  let releaseLock = () => {};
136
86
  if (lockPath) {
137
87
  const lockResult = acquireLockFn({ lockPath, timeoutMs: lockTimeoutMs });
@@ -190,12 +140,8 @@ export async function sweepMergedBranches({
190
140
  }
191
141
 
192
142
  /**
193
- * Sweep merged `story-*` branches in `cwd`. Preset over
194
- * {@link sweepMergedBranches} for the boot path: it pins the `story-*`
195
- * include glob, excludes the current run's `currentStoryBranch`, and
196
- * keeps `fastForward` off (the boot caller fast-forwards the base branch
197
- * separately). Exported name, signature, and result-envelope shape are
198
- * unchanged from the pre-engine implementation.
143
+ * Boot preset: `story-*` only, current Story branch excluded, no
144
+ * fast-forward (the boot caller does that separately).
199
145
  *
200
146
  * @param {{
201
147
  * cwd: string,
@@ -228,13 +174,9 @@ export function sweepMergedStoryBranches(args = {}) {
228
174
  }
229
175
 
230
176
  /**
231
- * Split a plan's candidates into the reapable set and the report-only
232
- * `content-merged` set (Story #4396). A candidate the `git-cleanup`
233
- * planner classified `detectedBy: 'content-merged'` (Story #4395's
234
- * `git merge-tree --write-tree` probe) never reaches protection or
235
- * `executeCleanup` — it is a weaker signal than a merged PR or git
236
- * ancestry, so the engine only reports it for the operator to route to
237
- * `/git-cleanup`.
177
+ * Content-merged candidates are report-only: content equivalence is weaker
178
+ * than a merged PR or ancestry, so only an operator-confirmed `/git-cleanup`
179
+ * may reap them.
238
180
  */
239
181
  function partitionContentMerged(candidates) {
240
182
  const contentMerged = [];
@@ -252,10 +194,6 @@ function partitionContentMerged(candidates) {
252
194
  return { contentMerged, reapCandidates };
253
195
  }
254
196
 
255
- /**
256
- * Inner: the plan + protect + execute pipeline. Kept separate so the
257
- * outer engine can stay focused on the lock and fast-forward wrappers.
258
- */
259
197
  async function runSweepUnderLock({
260
198
  cwd,
261
199
  baseBranch,
@@ -342,11 +280,6 @@ async function runSweepUnderLock({
342
280
  });
343
281
  }
344
282
 
345
- /**
346
- * Execute the reap plan for the reapable candidates and shape the result
347
- * envelope. Split out of {@link runSweepUnderLock} so each function keeps
348
- * a single responsibility.
349
- */
350
283
  function executeReap({
351
284
  reapable,
352
285
  protectedList,
@@ -403,10 +336,7 @@ function executeReap({
403
336
  candidates: candidateCount,
404
337
  localDeleted,
405
338
  remoteDeleted,
406
- // Story #4794 — the branch names, not just the count. Each one is a merge
407
- // this sweep CONFIRMED (merged PR + matching headRefOid), which is exactly
408
- // the evidence the temp-retention catch-up needs to purge that Story's
409
- // spent artifacts. Previously these existed only inside a log string.
339
+ // Confirmed merges: temp-retention's catch-up purges on these names.
410
340
  reaped: reapable.map((c) => c.branch),
411
341
  protected: protectedList,
412
342
  contentMerged,
@@ -414,11 +344,7 @@ function executeReap({
414
344
  };
415
345
  }
416
346
 
417
- /**
418
- * Best-effort fast-forward of the base branch through the git-cleanup
419
- * fast-forward phase. Never throws — a failed fast-forward is logged and
420
- * returned as `{ ok: false, error }` but must never fail the sweep.
421
- */
347
+ /** Best-effort base fast-forward; never throws, never fails the sweep. */
422
348
  function runFastForwardStep({
423
349
  cwd,
424
350
  baseBranch,
@@ -453,17 +379,8 @@ function runFastForwardStep({
453
379
  }
454
380
 
455
381
  /**
456
- * Iterate plan candidates and split them into `reapable` (safe to pass
457
- * to executeCleanup) and `protectedList` (skipped, with a reason).
458
- *
459
- * Protection failures are treated as protected — never reap a candidate
460
- * whose state we cannot verify. The reason string travels into the
461
- * result envelope and the log line for postmortem clarity.
462
- *
463
- * When no `protectionCtx` is supplied (legacy callers, unit tests),
464
- * the protection check is bypassed entirely and every candidate is
465
- * reapable. The boot-path CLI surfaces always supply a ctx, so this
466
- * fallback never fires in production.
382
+ * A protection-eval error counts as protected: never reap what cannot be
383
+ * verified. No `protectionCtx` (tests only) bypasses protection.
467
384
  */
468
385
  async function partitionCandidates({
469
386
  candidates,
@@ -1,26 +1,8 @@
1
1
  // .agents/scripts/lib/skills/parse-skill.js
2
2
  //
3
- // Shared SKILL.md parser used by the skills index generator and the skills
4
- // validator. Pure I/O on top of a single fs.readFileSync — no network, no
5
- // child processes, no env reads. Tolerant of CRLF and LF line endings.
6
- //
7
- // Public API:
8
- //
9
- // parseSkill(absolutePath, options?) -> {
10
- // path, // repo-relative POSIX path (string)
11
- // tier, // 'core' | 'stack'
12
- // category, // bucket directly under the tier (string)
13
- // name, // parent directory name of SKILL.md (string)
14
- // frontmatter, // YAML-parsed object from between the leading '---' markers
15
- // policyCapsule: {
16
- // found, // boolean — true iff a '## Policy Capsule' heading exists
17
- // bulletCount, // integer — count of contiguous top-level '- ' bullets
18
- // sectionStart, // 1-based line number of the heading (null when absent)
19
- // },
20
- // }
21
- //
22
- // The parser asserts that frontmatter.name equals the parent directory name
23
- // and throws a descriptive Error when the two diverge.
3
+ // Shared SKILL.md parser (CRLF/LF tolerant) returning
4
+ // { path, tier, category, name, frontmatter, policyCapsule }. Throws when
5
+ // frontmatter.name differs from the parent directory name.
24
6
 
25
7
  import fs from 'node:fs';
26
8
  import path from 'node:path';
@@ -30,14 +12,11 @@ const FRONTMATTER_DELIMITER = '---';
30
12
  const POLICY_HEADING_RE = /^## Policy Capsule\s*$/;
31
13
  const ANY_H2_RE = /^## /;
32
14
  const BULLET_RE = /^- /;
33
- /** An indented (wrapped) continuation of the bullet above it. */
34
15
  const CONTINUATION_RE = /^\s+\S/;
35
16
 
36
17
  /**
37
- * Repo root resolver. Walks up from the SKILL.md path until we find a
38
- * directory that contains an `.agents/skills` folder — that's the canonical
39
- * marker. Falls back to the file's grandparent's grandparent if no marker
40
- * is found, which is good enough for tests using temp fixtures.
18
+ * Nearest ancestor holding `.agents/skills`; fixture trees fall back to four
19
+ * levels up.
41
20
  */
42
21
  function resolveRepoRoot(absoluteSkillPath) {
43
22
  let dir = path.dirname(absoluteSkillPath);
@@ -47,7 +26,6 @@ function resolveRepoRoot(absoluteSkillPath) {
47
26
  }
48
27
  dir = path.dirname(dir);
49
28
  }
50
- // Fallback for fixture trees rooted outside a real .agents layout.
51
29
  return path.resolve(path.dirname(absoluteSkillPath), '..', '..', '..', '..');
52
30
  }
53
31
 
@@ -55,19 +33,11 @@ function toPosix(p) {
55
33
  return p.split(path.sep).join('/');
56
34
  }
57
35
 
58
- /**
59
- * Split the source on either CRLF or LF without normalizing line endings.
60
- * The returned array's length and indices match the original file's line
61
- * count, which lets callers report 1-based line numbers verbatim.
62
- */
36
+ /** Indices match the file's lines, so 1-based line numbers report verbatim. */
63
37
  function splitLines(src) {
64
38
  return src.split(/\r\n|\n/);
65
39
  }
66
40
 
67
- /**
68
- * Extract the YAML frontmatter block sitting between the first two '---'
69
- * lines. Throws when the file lacks a leading delimiter or never closes it.
70
- */
71
41
  function extractFrontmatterBlock(lines, skillPath) {
72
42
  if (lines[0] !== FRONTMATTER_DELIMITER) {
73
43
  throw new Error(
@@ -85,16 +55,10 @@ function extractFrontmatterBlock(lines, skillPath) {
85
55
  }
86
56
 
87
57
  /**
88
- * Scan the body for the '## Policy Capsule' heading and count contiguous
89
- * top-level '- ' bullets that follow it, stopping at the next '## ' heading
90
- * or end-of-file. Blank lines inside the bullet run do not reset the count.
91
- *
92
- * An **indented** continuation line belongs to the bullet above it — capsule
93
- * bullets routinely wrap at the document's prose width — so it neither counts
94
- * as a new bullet nor terminates the run. Only a **flush-left**, non-blank,
95
- * non-bullet line after the run terminates it (Story #4546: treating any
96
- * non-bullet line as a terminator counted a wrapped 5-bullet capsule as 1 and
97
- * tripped the floor in validate-skills.js).
58
+ * Count top-level `- ` bullets under `## Policy Capsule` up to the next H2.
59
+ * Blank lines and indented (wrapped) continuations stay inside the run; only
60
+ * a flush-left non-bullet line after it terminates — otherwise a wrapped
61
+ * capsule would count as one bullet and trip the validator's floor.
98
62
  */
99
63
  function findPolicyCapsule(lines, bodyStart) {
100
64
  let headingIndex = -1;
@@ -119,19 +83,15 @@ function findPolicyCapsule(lines, bodyStart) {
119
83
  continue;
120
84
  }
121
85
  if (line.trim() === '') {
122
- // Blank lines inside or before the bullet run are tolerated.
123
86
  continue;
124
87
  }
125
88
  if (sawBulletRun && CONTINUATION_RE.test(line)) {
126
- // Indented continuation of the bullet above — same bullet, not a
127
- // terminator. Wrapped capsule bullets are the norm, not an error.
128
89
  continue;
129
90
  }
130
91
  if (sawBulletRun) {
131
- // Flush-left, non-blank, non-bullet line after the run terminates it.
132
92
  break;
133
93
  }
134
- // Leading prose between heading and the first bullet is allowed.
94
+ // Leading prose before the first bullet is allowed.
135
95
  }
136
96
 
137
97
  return {
@@ -141,9 +101,6 @@ function findPolicyCapsule(lines, bodyStart) {
141
101
  };
142
102
  }
143
103
 
144
- /**
145
- * Parse a SKILL.md file. See module-level docstring for the return shape.
146
- */
147
104
  export function parseSkill(absolutePath, options = {}) {
148
105
  if (typeof absolutePath !== 'string' || absolutePath.length === 0) {
149
106
  throw new TypeError('parseSkill: absolutePath must be a non-empty string');
@@ -187,11 +144,8 @@ export function parseSkill(absolutePath, options = {}) {
187
144
  );
188
145
  }
189
146
 
190
- // Derive tier / category from the path. Layout is:
191
- // <repo>/.agents/skills/<tier>/<...buckets>/<name>/SKILL.md
192
- // For core skills the bucket is the literal 'core' (one level deep);
193
- // for stack skills the bucket is the first segment under 'stack'
194
- // (e.g. 'backend', 'frontend', 'qa').
147
+ // <repo>/.agents/skills/<tier>/<...buckets>/<name>/SKILL.md — core's
148
+ // category is 'core'; stack's is the first bucket under 'stack'.
195
149
  const relPath = toPosix(path.relative(repoRoot, absolutePath));
196
150
  const parts = relPath.split('/');
197
151
  const skillsIdx = parts.indexOf('skills');
@@ -1,25 +1,15 @@
1
1
  // .agents/scripts/lib/skills/skills-index.js
2
2
  //
3
- // Shared I/O for the two skills manifests (Story #5135).
4
- //
5
- // Each skills root carries its own `skills.index.json`: the package payload's
6
- // at `.agents/skills/`, and the consumer-writable zone's at
7
- // `.agents/local/skills/`. The shipped one is a committed payload file that
8
- // `mandrel doctor` / `mandrel sync-agents` compare byte-for-byte against the
9
- // installed package, so the two manifests must never be merged — but they are
10
- // read, compared and reported identically, and both CLIs need that logic.
11
- // Before this module `generate-skills-index.js` and `validate-skills.js`
12
- // each carried their own near-identical reader.
3
+ // Shared I/O for the two skills manifests (payload and local zone). They are
4
+ // read, compared and audited identically but never merged: the shipped one is
5
+ // compared byte-for-byte against the installed package.
13
6
 
14
7
  import fs from 'node:fs';
15
8
  import path from 'node:path';
16
9
 
17
- /** Manifest filename, shared by both roots. */
18
10
  export const INDEX_FILENAME = 'skills.index.json';
19
11
 
20
12
  /**
21
- * Absolute path of the manifest for one skills root.
22
- *
23
13
  * @param {string} repoRoot
24
14
  * @param {readonly string[]} rootSegments From `walk-skill-files.js`.
25
15
  * @returns {string}
@@ -29,9 +19,7 @@ export function indexPathFor(repoRoot, rootSegments) {
29
19
  }
30
20
 
31
21
  /**
32
- * Read a manifest from disk. Distinguishes "missing" from "unparseable" via
33
- * the `reason` channel so callers can report which drift they hit rather than
34
- * collapsing both into "not fresh".
22
+ * `reason` separates "missing" from "unparseable" so callers can say which.
35
23
  *
36
24
  * @param {string} indexPath
37
25
  * @returns {{ manifest: object | null, reason: string | null }}
@@ -54,9 +42,6 @@ export function readManifest(indexPath) {
54
42
  }
55
43
 
56
44
  /**
57
- * Read a manifest and project its entry paths into a Set, the shape the
58
- * validator's membership check consumes.
59
- *
60
45
  * @param {string} indexPath
61
46
  * @returns {{ exists: boolean, paths: Set<string> | null, manifest: object | null, indexPath: string, parseError?: string }}
62
47
  */
@@ -83,9 +68,7 @@ export function readIndexPaths(indexPath) {
83
68
  }
84
69
 
85
70
  /**
86
- * Compare two manifests ignoring `generatedAt` — the one volatile field, which
87
- * changes on every write and is not content. Returns null when they match, or
88
- * a diff-style message naming the entry counts.
71
+ * Ignores the volatile `generatedAt`; `null` when the manifests match.
89
72
  *
90
73
  * @param {object | null} diskManifest
91
74
  * @param {object} freshManifest
@@ -111,12 +94,10 @@ export function diffManifests(diskManifest, freshManifest, label) {
111
94
  }
112
95
 
113
96
  /**
114
- * Render a manifest's schema violations as field-named findings. The compiled
115
- * AJV validator is passed in so this module stays free of the schema-loading
116
- * side effects the validator CLI owns.
97
+ * The validator is injected so this module avoids schema-loading side effects.
117
98
  *
118
99
  * @param {object} manifest
119
- * @param {string} indexRelPath Repo-relative manifest path, for the message.
100
+ * @param {string} indexRelPath
120
101
  * @param {(m: object) => boolean} validateManifest Compiled AJV validator.
121
102
  * @returns {string[]}
122
103
  */
@@ -133,9 +114,7 @@ function validateManifestSchema(manifest, indexRelPath, validateManifest) {
133
114
  }
134
115
 
135
116
  /**
136
- * Audit one root's manifest: present, parseable, and schema-valid. Shared by
137
- * both skills roots so a consumer-authored index is held to the same bar as
138
- * the shipped one.
117
+ * Present, parseable and schema-valid — the same bar for both roots.
139
118
  *
140
119
  * @param {{ exists: boolean, paths: Set<string> | null, manifest: object | null, parseError?: string }} indexInfo
141
120
  * @param {string} indexRelPath
@@ -1,37 +1,20 @@
1
1
  // .agents/scripts/lib/skills/walk-skill-files.js
2
2
  //
3
- // Shared traversal for SKILL.md files across the two skills roots:
4
- // the package payload (`.agents/skills/{core,stack}/`) and the
5
- // consumer-writable local zone (`.agents/local/skills/{core,stack}/`).
6
- // Used by validate-skills.js and generate-skills-index.js so both CLIs
7
- // enumerate the same paths in the same deterministic order.
8
- //
9
- // The two roots stay **separately enumerable** on purpose (Story #5135).
10
- // `.agents/skills/skills.index.json` is a committed payload file that
11
- // `mandrel doctor` / `mandrel sync-agents` compare byte-for-byte against
12
- // the installed package; folding a consumer's local skills into it would
13
- // make every consumer's regenerated index read as payload drift and cause
14
- // those commands to refuse. The local zone therefore carries its own
15
- // index artifact, and the two roots are unified only at *lookup* time, by
16
- // `resolveSkillFile` — never for the shipped manifest.
3
+ // SKILL.md traversal over the payload root and the consumer-writable local
4
+ // zone, in deterministic order. The roots stay separately enumerable: the
5
+ // shipped skills.index.json is compared byte-for-byte against the package, so
6
+ // folding local skills into it would read as payload drift. They are unified
7
+ // only at lookup time, by resolveSkillFile.
17
8
 
18
9
  import fs from 'node:fs';
19
10
  import path from 'node:path';
20
11
 
21
- /** Tier directories a skills root is enumerated under. */
22
12
  const TIERS = Object.freeze(['core', 'stack']);
23
13
 
24
- /**
25
- * Path segments (from the repo root) of the package-payload skills root.
26
- * Materialized by `mandrel sync`; every file under it is payload.
27
- */
28
14
  export const PAYLOAD_SKILLS_SEGMENTS = Object.freeze(['.agents', 'skills']);
29
15
 
30
16
  /**
31
- * Path segments (from the repo root) of the consumer-writable skills root.
32
- * It sits inside the `.agents/local/` zone (Story #3498), which sync never
33
- * copies into and never prunes, and which the agents-drift check cannot
34
- * flag because that check only walks files present in the package payload.
17
+ * Inside `.agents/local/`, which sync never touches and drift checks never walk.
35
18
  */
36
19
  export const LOCAL_SKILLS_SEGMENTS = Object.freeze([
37
20
  '.agents',
@@ -40,27 +23,14 @@ export const LOCAL_SKILLS_SEGMENTS = Object.freeze([
40
23
  ]);
41
24
 
42
25
  /**
43
- * A skill id is the tier-relative path naming a skill — e.g.
44
- * `core/test-first` or `stack/qa/playwright`. It is the value that
45
- * appears in `skills.index.json` minus the root prefix, and the value a
46
- * `qa.environments.*.signInSeam.skill` seam carries.
47
- *
48
- * The pattern is deliberately strict: ids resolve to filesystem paths, so
49
- * anything that could escape a root (`..`, absolute paths, backslashes) or
50
- * smuggle a shell metacharacter is rejected rather than normalized.
51
- *
52
- * Exported because `config-settings-schema.js` mirrors it as the `pattern`
53
- * on `qa.environments.*.signInSeam.skill`, so a malformed id is rejected at
54
- * config-validation time rather than surviving to a path join (Story #5285).
55
- * It is one regex with two enforcement points, never two regexes: the AJV
56
- * `pattern` keyword takes the source string, so the schema must import this
57
- * value rather than restate it.
26
+ * A tier-relative skill id (`stack/qa/playwright`). Strict because ids become
27
+ * filesystem paths: anything that could escape a root is rejected, not
28
+ * normalized. The config schema imports this as its `pattern` — one regex,
29
+ * two enforcement points.
58
30
  */
59
31
  export const SKILL_ID_RE = /^[a-z0-9][a-z0-9._-]*(?:\/[a-z0-9][a-z0-9._-]*)+$/;
60
32
 
61
33
  /**
62
- * Recursively enumerate `SKILL.md` paths under a directory.
63
- *
64
34
  * @param {string} rootDir
65
35
  * @returns {string[]} absolute paths
66
36
  */
@@ -89,9 +59,6 @@ function walkSkillFiles(rootDir) {
89
59
  }
90
60
 
91
61
  /**
92
- * Sort absolute paths by their POSIX repo-relative form so output order is
93
- * deterministic across platforms.
94
- *
95
62
  * @param {string[]} files
96
63
  * @param {string} repoRoot
97
64
  * @returns {string[]}
@@ -105,9 +72,6 @@ function sortByRepoRelative(files, repoRoot) {
105
72
  }
106
73
 
107
74
  /**
108
- * Enumerate the `SKILL.md` files under one skills root, sorted by POSIX
109
- * repo-relative path.
110
- *
111
75
  * @param {string} repoRoot
112
76
  * @param {readonly string[]} rootSegments One of the exported segment lists.
113
77
  * @returns {string[]} absolute paths
@@ -121,11 +85,7 @@ function collectUnderRoot(repoRoot, rootSegments) {
121
85
  }
122
86
 
123
87
  /**
124
- * Build the list of payload SKILL.md files under
125
- * `<repoRoot>/.agents/skills/{core,stack}/`.
126
- *
127
- * This is the set the **shipped** `skills.index.json` is generated from —
128
- * it must never include local-zone skills (see the module header).
88
+ * The set the shipped index is generated from — never local-zone skills.
129
89
  *
130
90
  * @param {string} repoRoot
131
91
  * @returns {string[]} absolute paths
@@ -135,11 +95,6 @@ export function collectSkillFiles(repoRoot) {
135
95
  }
136
96
 
137
97
  /**
138
- * Build the list of consumer-authored SKILL.md files under
139
- * `<repoRoot>/.agents/local/skills/{core,stack}/`. Empty when the
140
- * consumer has authored none — the common case, and the case in this
141
- * repository itself.
142
- *
143
98
  * @param {string} repoRoot
144
99
  * @returns {string[]} absolute paths
145
100
  */
@@ -148,26 +103,14 @@ export function collectLocalSkillFiles(repoRoot) {
148
103
  }
149
104
 
150
105
  /**
151
- * Resolve a skill id to a readable `SKILL.md`, searching the payload root
152
- * first and the local zone second (payload-wins, matching
153
- * {@link collectAllSkillFiles}).
154
- *
155
- * Returns rather than throwing so callers own the error message — a config
156
- * resolver wants to name the offending config key, a workflow wants to name
157
- * the seam. The two failures are **distinguishable** (Story #5285):
158
- *
159
- * - `null` — a well-formed id that resolves under neither root. The remedy
160
- * is to author the skill, so the caller says so.
161
- * - `{ reason: 'invalid-id' }` — an id the pattern rejects (`../../secrets`,
162
- * `Core/Foo`, a bare `core`). No filesystem lookup happens, and telling
163
- * the operator to author `../../secrets/SKILL.md` would be advice that
164
- * cannot be followed. The remedy is to fix the id.
106
+ * Payload root first, then local (payload wins). Returns rather than throws
107
+ * so the caller names the offending key; `null` (author the skill) and
108
+ * `{ reason: 'invalid-id' }` (fix the id; nothing was searched) need
109
+ * different remedies.
165
110
  *
166
111
  * @param {string} repoRoot
167
112
  * @param {string} skillId Tier-relative id, e.g. `stack/qa/acme-sso`.
168
113
  * @returns {{ path: string, root: string } | { reason: 'invalid-id' } | null}
169
- * the absolute `SKILL.md` path and the POSIX repo-relative root it resolved
170
- * under, the malformed-id marker, or `null` when nothing resolved.
171
114
  */
172
115
  export function resolveSkillFile(repoRoot, skillId) {
173
116
  if (typeof skillId !== 'string' || !SKILL_ID_RE.test(skillId)) {
@@ -180,17 +123,13 @@ export function resolveSkillFile(repoRoot, skillId) {
180
123
  return { path: candidate, root: segments.join('/') };
181
124
  }
182
125
  } catch {
183
- // Unreadable or absent — try the next root.
126
+ // Absent — try the next root.
184
127
  }
185
128
  }
186
129
  return null;
187
130
  }
188
131
 
189
- /**
190
- * The POSIX repo-relative skills roots, in search order. Exported so error
191
- * messages can name exactly what was searched rather than restating the
192
- * paths as literals.
193
- */
132
+ /** POSIX repo-relative roots in search order, for error messages. */
194
133
  export const SKILL_SEARCH_ROOTS = Object.freeze([
195
134
  PAYLOAD_SKILLS_SEGMENTS.join('/'),
196
135
  LOCAL_SKILLS_SEGMENTS.join('/'),
@@ -1,45 +1,17 @@
1
1
  /**
2
- * source-extensions.js — the single source of truth for which file extensions
3
- * the CRAP and maintainability scanners score.
2
+ * SSOT for the extensions the CRAP/MI scanners score. The scanner walk, the
3
+ * coverage-freshness check and the CRAP projection filter must all agree: a
4
+ * narrower selector makes a gate green while measuring nothing. Not
5
+ * configurable, for the same reason.
4
6
  *
5
- * Three surfaces select "the files the scanner scores" and must agree, because
6
- * a selector narrower than the scanner's own walk makes a gate green while
7
- * measuring nothing: the maintainability/CRAP directory walk
8
- * (`maintainability-utils.js`), the coverage-freshness check
9
- * (`coverage-capture.js`), and the close-validation CRAP projection's
10
- * changed-file filter (`close-validation/projections/crap.js`). Story #5076
11
- * folded all three onto the set below after a TypeScript consumer's entire
12
- * source tree was filtered out of the freshness check by a `js|mjs`-only
13
- * literal.
14
- *
15
- * **This module MUST import nothing outside `node:` builtins.**
16
- * `coverage-capture.js` runs on the pre-push path; `maintainability-utils.js`
17
- * transitively pulls `typhonjs-escomplex` and `typescript`, so the shared set
18
- * cannot live there without dragging the scoring engines into every freshness
19
- * probe.
20
- *
21
- * The set is deliberately *not* configurable. Freshness exists only to serve
22
- * the CRAP gate, so the contract is "what the scanner walks" — a
23
- * consumer-settable extension list would be a second way to mis-scope the same
24
- * gate.
25
- *
26
- * Not to be confused with `transpile.js`'s `TS_EXTS`, which answers a
27
- * different question ("does this file need transpiling before scoring?") and
28
- * is correctly a subset of this set rather than a fork of it.
7
+ * MUST import only `node:` builtins — it runs on the pre-push path and must
8
+ * not drag the scoring engines in.
29
9
  */
30
10
  import path from 'node:path';
31
11
 
32
12
  /**
33
- * Extensions the CRAP and maintainability engines can score, lower-cased and
34
- * dot-prefixed. Frozen so a caller cannot mutate the shared set in place.
35
- *
36
- * Formats the engines cannot parse — `.astro`, `.vue`, `.svelte` — are
37
- * deliberately absent: this set selects what the scanner already scores, not
38
- * every source file that exists in a consumer's tree.
39
- *
40
- * Module-private: production consumers select through {@link
41
- * SCORABLE_SOURCE_EXT_RE} or {@link isScorableSourceFile}, so exporting the
42
- * raw list would be a dead production export.
13
+ * What the engines can parse (not `.vue`/`.svelte`/`.astro`). Private: select
14
+ * via the exported regex or predicate.
43
15
  *
44
16
  * @type {readonly string[]}
45
17
  */
@@ -54,10 +26,7 @@ const SCORABLE_SOURCE_EXTENSIONS = Object.freeze([
54
26
  ]);
55
27
 
56
28
  /**
57
- * Anchored pattern matching a scorable source path by extension, derived from
58
- * {@link SCORABLE_SOURCE_EXTENSIONS} so the list stays the only definition.
59
- * Use it where a path arrives as raw text (a `git ls-files` line, a porcelain
60
- * status entry) and `path.extname` would be the wrong tool.
29
+ * For paths arriving as raw text (git output lines).
61
30
  *
62
31
  * @type {RegExp}
63
32
  */
@@ -66,8 +35,8 @@ export const SCORABLE_SOURCE_EXT_RE = new RegExp(
66
35
  );
67
36
 
68
37
  /**
69
- * @param {string} filePath Absolute or relative path; only its extension is read.
70
- * @returns {boolean} True when the path's extension is one the engines score.
38
+ * @param {string} filePath
39
+ * @returns {boolean}
71
40
  */
72
41
  export function isScorableSourceFile(filePath) {
73
42
  return SCORABLE_SOURCE_EXTENSIONS.includes(