mandrel 2.60.0 → 2.62.0

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