mandrel 2.60.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 (661) 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/pinned-identifier-lint.js +17 -57
  318. package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
  319. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  320. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  321. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  322. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  323. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  324. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  325. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
  326. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  327. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  328. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  329. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  330. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  331. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  332. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
  333. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  334. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
  335. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
  336. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
  337. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  338. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  339. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  340. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  341. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  342. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  343. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  344. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  345. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  346. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  347. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  348. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  349. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  350. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  351. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  352. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  353. package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
  354. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  355. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  356. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  357. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  358. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  359. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  360. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  361. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  362. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  363. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  364. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  365. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  366. package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
  367. package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
  368. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  369. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  370. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  371. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
  372. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
  373. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  390. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
  391. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  392. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  393. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  394. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  395. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  396. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  397. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  398. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  399. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
  400. package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
  401. package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
  402. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  403. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  404. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
  405. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  406. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  407. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  408. package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
  409. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  410. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
  411. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  412. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  413. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  414. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  415. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  416. package/.agents/scripts/lib/path-security.js +3 -6
  417. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  418. package/.agents/scripts/lib/preflight-runner.js +13 -69
  419. package/.agents/scripts/lib/process-group.js +143 -0
  420. package/.agents/scripts/lib/project-root.js +2 -8
  421. package/.agents/scripts/lib/provider-factory.js +2 -25
  422. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  423. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  424. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  425. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  426. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  427. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  428. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  429. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  430. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  431. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  432. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  433. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  434. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  435. package/.agents/scripts/lib/signals/index.js +2 -19
  436. package/.agents/scripts/lib/signals/schema.js +14 -109
  437. package/.agents/scripts/lib/signals/write.js +2 -11
  438. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  439. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  440. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  441. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  442. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  443. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  444. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  445. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  446. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  447. package/.agents/scripts/lib/source-extensions.js +11 -42
  448. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  449. package/.agents/scripts/lib/stdio-flush.js +9 -36
  450. package/.agents/scripts/lib/story-adjacency.js +8 -40
  451. package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
  452. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  453. package/.agents/scripts/lib/story-body/story-body.js +83 -358
  454. package/.agents/scripts/lib/temp-retention.js +42 -143
  455. package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
  456. package/.agents/scripts/lib/test-env.js +12 -65
  457. package/.agents/scripts/lib/test-run-credit.js +10 -65
  458. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  459. package/.agents/scripts/lib/test-temp.js +38 -184
  460. package/.agents/scripts/lib/test-tiers.js +12 -96
  461. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  462. package/.agents/scripts/lib/transpile.js +15 -74
  463. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  464. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  465. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  466. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  467. package/.agents/scripts/lib/validation-evidence.js +21 -96
  468. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  469. package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
  470. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  471. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  472. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  473. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  474. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  475. package/.agents/scripts/lib/workflow-closure.js +22 -105
  476. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  477. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  478. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  479. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  480. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  481. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  482. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  483. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  484. package/.agents/scripts/lib/worktree-manager.js +15 -40
  485. package/.agents/scripts/lint-issue-body.js +12 -68
  486. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  487. package/.agents/scripts/merge-baseline.js +30 -104
  488. package/.agents/scripts/nav-registry-diff.js +22 -108
  489. package/.agents/scripts/notify.js +12 -69
  490. package/.agents/scripts/plan-context.js +27 -111
  491. package/.agents/scripts/plan-critics.js +12 -66
  492. package/.agents/scripts/plan-persist.js +31 -148
  493. package/.agents/scripts/plan-run-epilogue.js +11 -37
  494. package/.agents/scripts/pr-watch-with-update.js +76 -267
  495. package/.agents/scripts/providers/github/auth.js +3 -8
  496. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  497. package/.agents/scripts/providers/github/board-add.js +5 -21
  498. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  499. package/.agents/scripts/providers/github/cache.js +2 -14
  500. package/.agents/scripts/providers/github/comments.js +7 -40
  501. package/.agents/scripts/providers/github/compose.js +3 -19
  502. package/.agents/scripts/providers/github/errors.js +22 -125
  503. package/.agents/scripts/providers/github/issues.js +31 -123
  504. package/.agents/scripts/providers/github/labels.js +24 -124
  505. package/.agents/scripts/providers/github/mappers.js +5 -27
  506. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  507. package/.agents/scripts/providers/github/project-board.js +2 -17
  508. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  509. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  510. package/.agents/scripts/providers/github/search-budget.js +9 -39
  511. package/.agents/scripts/providers/github/search-query.js +5 -26
  512. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  513. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  514. package/.agents/scripts/providers/github/tickets.js +32 -134
  515. package/.agents/scripts/providers/github.js +18 -59
  516. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  517. package/.agents/scripts/quality-preview.js +35 -220
  518. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  519. package/.agents/scripts/resolve-stories.js +16 -67
  520. package/.agents/scripts/resync-status-column.js +6 -25
  521. package/.agents/scripts/run-tests.js +29 -104
  522. package/.agents/scripts/single-story-close.js +23 -135
  523. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  524. package/.agents/scripts/single-story-init.js +47 -209
  525. package/.agents/scripts/stories-wave-tick.js +102 -472
  526. package/.agents/scripts/sync-agentrc.js +3 -21
  527. package/.agents/scripts/sync-claude-agents.js +9 -55
  528. package/.agents/scripts/sync-claude-commands.js +20 -110
  529. package/.agents/scripts/test-wrapper.js +6 -43
  530. package/.agents/scripts/update-coverage-baseline.js +5 -22
  531. package/.agents/scripts/update-crap-baseline.js +7 -30
  532. package/.agents/scripts/update-duplication-baseline.js +16 -92
  533. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  534. package/.agents/scripts/update-ticket-state.js +1 -7
  535. package/.agents/scripts/validate-skills.js +6 -26
  536. package/.agents/templates/agent-protocol.md +2 -2
  537. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  538. package/.agents/workflows/audit-accessibility.md +4 -7
  539. package/.agents/workflows/audit-adrs.md +3 -6
  540. package/.agents/workflows/audit-architecture.md +3 -11
  541. package/.agents/workflows/audit-baselines.md +6 -9
  542. package/.agents/workflows/audit-clean-code.md +8 -12
  543. package/.agents/workflows/audit-data-model.md +3 -7
  544. package/.agents/workflows/audit-dependencies.md +4 -7
  545. package/.agents/workflows/audit-devops.md +4 -8
  546. package/.agents/workflows/audit-documentation.md +1 -4
  547. package/.agents/workflows/audit-mobile.md +4 -7
  548. package/.agents/workflows/audit-navigability.md +3 -6
  549. package/.agents/workflows/audit-performance.md +2 -4
  550. package/.agents/workflows/audit-privacy.md +4 -7
  551. package/.agents/workflows/audit-quality.md +4 -7
  552. package/.agents/workflows/audit-security.md +4 -7
  553. package/.agents/workflows/audit-seo.md +4 -7
  554. package/.agents/workflows/audit-sre.md +4 -7
  555. package/.agents/workflows/audit-to-stories.md +17 -30
  556. package/.agents/workflows/audit-ux-ui.md +4 -7
  557. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  558. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  559. package/.agents/workflows/helpers/deliver-digest.md +6 -4
  560. package/.agents/workflows/helpers/deliver-reference.md +114 -188
  561. package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
  562. package/.agents/workflows/helpers/plan-reference.md +86 -139
  563. package/.agents/workflows/helpers/qa-core.md +12 -0
  564. package/.agents/workflows/memory-consolidate.md +1 -1
  565. package/.agents/workflows/qa-assist.md +27 -71
  566. package/.agents/workflows/qa-explore.md +19 -59
  567. package/.agents/workflows/qa-run.md +11 -33
  568. package/README.md +1 -1
  569. package/bin/mandrel.js +5 -46
  570. package/bin/postinstall.js +18 -107
  571. package/docs/CHANGELOG.md +25 -0
  572. package/lib/cli/doctor.js +11 -71
  573. package/lib/cli/init.js +26 -165
  574. package/lib/cli/migrate.js +5 -64
  575. package/lib/cli/registry.js +84 -467
  576. package/lib/cli/sync-agents.js +4 -64
  577. package/lib/cli/sync-commands.js +11 -64
  578. package/lib/cli/sync.js +34 -213
  579. package/lib/cli/uninstall.js +40 -219
  580. package/lib/cli/update.js +105 -661
  581. package/lib/cli/version-check.js +8 -72
  582. package/lib/cli/version-helpers.js +14 -87
  583. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  584. package/lib/migrations/index.js +15 -92
  585. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  586. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  587. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  588. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  589. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  590. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  591. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  592. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  593. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
  594. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  595. package/package.json +16 -14
  596. package/.agents/docs/SDLC.md +0 -590
  597. package/.agents/docs/quality-gates.md +0 -1183
  598. package/.agents/rules/known-tooling-behavior.md +0 -200
  599. package/.agents/rules/orchestration-error-handling.md +0 -61
  600. package/.agents/rules/test-seams.md +0 -59
  601. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  602. package/.agents/schemas/baselines/lint.schema.json +0 -47
  603. package/.agents/scripts/check-action-pinning.js +0 -260
  604. package/.agents/scripts/check-audit-attribution.js +0 -302
  605. package/.agents/scripts/check-baseline-drift.js +0 -211
  606. package/.agents/scripts/check-baseline-scope.js +0 -362
  607. package/.agents/scripts/check-generated-validator.js +0 -202
  608. package/.agents/scripts/check-knip-entries.js +0 -159
  609. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  610. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  611. package/.agents/scripts/check-schema-references.js +0 -368
  612. package/.agents/scripts/check-test-portability.js +0 -512
  613. package/.agents/scripts/check-workflow-citations.js +0 -218
  614. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  615. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  616. package/.agents/scripts/install-matrix-assert.js +0 -326
  617. package/.agents/scripts/lib/audit-advisories.js +0 -195
  618. package/.agents/scripts/lib/audit-attribution.js +0 -134
  619. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  620. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  621. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  622. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  623. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  624. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  625. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  626. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  627. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  628. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  629. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  630. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  631. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  632. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  633. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  634. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  635. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  636. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  637. package/.agents/scripts/lib/fs-walk.js +0 -52
  638. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  639. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  640. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  641. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  642. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  643. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  644. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  645. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  646. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  647. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  648. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  649. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  650. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  651. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  652. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  653. package/.agents/scripts/post-structured-comment.js +0 -127
  654. package/.agents/scripts/provision-git-hooks.js +0 -85
  655. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  656. package/.agents/scripts/run-coverage.js +0 -197
  657. package/.agents/scripts/run-lint.js +0 -133
  658. package/.agents/scripts/run-test-profile.js +0 -129
  659. package/.agents/scripts/run-verify.js +0 -125
  660. package/.agents/scripts/test-isolate.js +0 -55
  661. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -1,47 +1,9 @@
1
1
  // lib/cli/sync-agents.js
2
2
  /**
3
- * `mandrel sync-agents` subcommand (Story #4528 / #4530).
4
- *
5
- * Thin wrapper that delegates to the canonical sync script
6
- * (.agents/scripts/sync-claude-agents.js), projecting `.agents/agents/` into
7
- * a flat `.claude/agents/` tree. Exact sibling of `sync-commands.js` —
8
- * same delegation shape, same marker-gated refusal check, same seams —
9
- * targeting the role-agent tree instead of the command tree. The sync
10
- * script owns all sync logic; this module exists only to expose it through
11
- * the mandrel CLI surface without reimplementing it.
12
- *
13
- * `sync-claude-agents.js` uses top-level await and has no exported `main()`
14
- * function (marked `cli-opt-out`), so delegation runs via a child process
15
- * rather than a direct import. Exit code and all output are forwarded
16
- * verbatim to the caller so `mandrel sync-agents` is transparent to scripts
17
- * that check $?.
18
- *
19
- * ## Prior to this Story
20
- *
21
- * `sync-claude-agents.js` was invoked on the **bootstrap** path
22
- * (`project-bootstrap.js`'s `sync:agents` script, `prepare`, and
23
- * `runSyncCommands`) but had no `lib/cli/` subcommand counterpart and was
24
- * never run by `mandrel sync` / `mandrel update` on the CLI path — the gap
25
- * #4528 reported. See `update.js`'s `driftHealSteps()` /
26
- * `fullUpgradeSteps()`, which now spawn a `sync-agents` phase alongside
27
- * `sync-commands` so `.claude/agents/` materializes on that path too.
28
- *
29
- * ## Marker-gated refusal (Story #4526 / #4530) — same shape as sync-commands
30
- *
31
- * Before delegating, this wrapper checks whether the `.agents/` tree it is
32
- * about to project agents FROM actually matches the running CLI's own
33
- * payload version, exactly as `sync-commands.js` does for the command tree.
34
- * See that module's doc comment for the full rationale and the anchor-trap
35
- * warning — it applies identically here (`PROJECT_ROOT` is deliberately the
36
- * package root, used only to read the running CLI's OWN version; the marker
37
- * read is anchored at `cwd()`, never at `PROJECT_ROOT`).
38
- *
39
- * Gate order:
40
- * 1. Marker present (`.agents/.mandrel-version`) → compare it to the
41
- * running CLI's own package version. Mismatch → refuse.
42
- * 2. Marker absent (a pre-marker install) → fall back to the existing
43
- * `agents-drift` content-hash check. Drift detected → refuse.
44
- * 3. Clean either way → project as before.
3
+ * `mandrel sync-agents`: project `.agents/agents/` into `.claude/agents/` via
4
+ * `.agents/scripts/sync-claude-agents.js`. Exact sibling of
5
+ * `sync-commands.js` — same child-process delegation, same marker-gated
6
+ * refusal and anchor rule (see that module's doc).
45
7
  */
46
8
 
47
9
  import { spawnSync } from 'node:child_process';
@@ -63,11 +25,6 @@ const SYNC_SCRIPT = path.join(
63
25
  );
64
26
 
65
27
  /**
66
- * Resolve the running CLI's own package version from `PROJECT_ROOT`'s
67
- * `package.json`. See `sync-commands.js`'s "anchor trap" module doc: this is
68
- * the ONE place `PROJECT_ROOT` (the package's own two-dirs-up root) is the
69
- * correct anchor.
70
- *
71
28
  * @param {typeof nodeFs} fsImpl
72
29
  * @returns {string}
73
30
  */
@@ -79,23 +36,6 @@ function resolveOwnPackageVersion(fsImpl) {
79
36
  }
80
37
 
81
38
  /**
82
- * Run the sync-claude-agents script and forward its output + exit code —
83
- * unless the marker-gated refusal check (see module doc) finds the
84
- * `.agents/` tree mismatched against the running CLI, in which case it
85
- * refuses and exits non-zero before spawning anything.
86
- *
87
- * Injectable seams — identical shape to `sync-commands.js`:
88
- * - `runner` — replaces `spawnSync` for the real delegation.
89
- * - `cwd()` — replaces `process.cwd`; anchors the marker read at the
90
- * consumer project root.
91
- * - `fs` — replaces the `node:fs` surface for both the marker read and the
92
- * own-version read.
93
- * - `ownVersion` — overrides the running CLI's own resolved version
94
- * directly, bypassing `resolveOwnPackageVersion`.
95
- * - `checkAgentsDrift` — overrides the fallback drift probe used when the
96
- * marker is absent; defaults to `runAgentsDrift({ cwd })`.
97
- * - `writeErr` / `exit` — replace the corresponding process surfaces.
98
- *
99
39
  * @param {string[]} _argv - Unused; reserved for future flags.
100
40
  * @param {{
101
41
  * runner?: typeof spawnSync,
@@ -1,49 +1,18 @@
1
1
  // lib/cli/sync-commands.js
2
2
  /**
3
- * `mandrel sync-commands` subcommand.
3
+ * `mandrel sync-commands`: delegate to `.agents/scripts/sync-claude-commands.js`
4
+ * in a child process (it has top-level await and no exported main), forwarding
5
+ * output and exit code.
4
6
  *
5
- * Thin wrapper that delegates to the canonical sync script
6
- * (.agents/scripts/sync-claude-commands.js). The sync script owns all sync
7
- * logic; this module exists only to expose that logic through the mandrel CLI
8
- * surface without reimplementing it.
7
+ * Refuses first when `.agents/` does not match the running CLI — otherwise
8
+ * commands are projected from a stale tree, and since `.claude/*` is
9
+ * gitignored nothing surfaces until an agent hits a missing module. With the
10
+ * `.agents/.mandrel-version` marker, compare it to the CLI's own version;
11
+ * without it, fall back to the `agents-drift` content check.
9
12
  *
10
- * The sync script uses top-level await and has no exported `main()` function
11
- * (marked `cli-opt-out`), so delegation runs via a child process rather than
12
- * a direct import. Exit code and all output are forwarded verbatim to the
13
- * caller so `mandrel sync-commands` is transparent to scripts that check $?.
14
- *
15
- * ## Marker-gated refusal (Story #4526 / #4530)
16
- *
17
- * Before delegating, this wrapper checks whether the `.agents/` tree it is
18
- * about to project commands FROM actually matches the running CLI's own
19
- * payload version. Without this gate, a consumer whose `.agents/` tree lags
20
- * the installed package (see #4525's pin-skew scenario) gets commands
21
- * faithfully projected from a **stale** tree — describing a workflow whose
22
- * backing scripts are not installed. Because `.claude/*` is conventionally
23
- * gitignored, that wrong projection leaves no diff and no signal until an
24
- * agent hits a missing-module error mid-task, far from the actual cause.
25
- *
26
- * Gate order:
27
- * 1. Marker present (`.agents/.mandrel-version`, Story #4530) → compare it
28
- * to the running CLI's own package version. Mismatch → refuse.
29
- * 2. Marker absent (a pre-marker install with no baseline to compare) →
30
- * fall back to the existing `agents-drift` content-hash check
31
- * (`registry.js`). Drift detected → refuse.
32
- * 3. Clean either way → project as before.
33
- *
34
- * ## Anchor trap (do not repeat)
35
- *
36
- * `PROJECT_ROOT` below is deliberately the **package** root — resolved from
37
- * this module's own two-dirs-up location — because it is used ONLY to read
38
- * the running CLI's OWN version, which is exactly what that self-referential
39
- * pattern correctly answers (contrast with the #4525 bug in `update.js`,
40
- * where the same pattern was wrongly used to answer a *consumer*-pin
41
- * question). The marker read is a SEPARATE resolution, anchored at `cwd()`
42
- * (the consumer project root) via `readVersionMarker` — never at
43
- * `PROJECT_ROOT`. Comparing the marker to `PROJECT_ROOT`'s own version would
44
- * make the check compare the package against itself and could never fire —
45
- * the exact trap `registry.js`'s `agents-in-sync` check documents for the
46
- * same reason.
13
+ * `PROJECT_ROOT` (the package root) answers only "what version is this CLI";
14
+ * the marker is read from `cwd()`. Reading both from `PROJECT_ROOT` would
15
+ * compare the package with itself and never fire.
47
16
  */
48
17
 
49
18
  import { spawnSync } from 'node:child_process';
@@ -65,10 +34,6 @@ const SYNC_SCRIPT = path.join(
65
34
  );
66
35
 
67
36
  /**
68
- * Resolve the running CLI's own package version from `PROJECT_ROOT`'s
69
- * `package.json`. See the "anchor trap" module doc: this is the ONE place
70
- * `PROJECT_ROOT` (the package's own two-dirs-up root) is the correct anchor.
71
- *
72
37
  * @param {typeof nodeFs} fsImpl
73
38
  * @returns {string}
74
39
  */
@@ -80,24 +45,6 @@ function resolveOwnPackageVersion(fsImpl) {
80
45
  }
81
46
 
82
47
  /**
83
- * Run the sync-claude-commands script and forward its output + exit code —
84
- * unless the marker-gated refusal check (see module doc) finds the
85
- * `.agents/` tree mismatched against the running CLI, in which case it
86
- * refuses and exits non-zero before spawning anything.
87
- *
88
- * Injectable seams (used by tests so no real filesystem, child process, or
89
- * package resolution occurs on the gate path):
90
- * - `runner` — replaces `spawnSync` for the real delegation.
91
- * - `cwd()` — replaces `process.cwd`; anchors the marker read at the
92
- * consumer project root.
93
- * - `fs` — replaces the `node:fs` surface for both the marker read and the
94
- * own-version read.
95
- * - `ownVersion` — overrides the running CLI's own resolved version
96
- * directly, bypassing `resolveOwnPackageVersion`.
97
- * - `checkAgentsDrift` — overrides the fallback drift probe used when the
98
- * marker is absent; defaults to `runAgentsDrift({ cwd })`.
99
- * - `writeErr` / `exit` — replace the corresponding process surfaces.
100
- *
101
48
  * @param {string[]} _argv - Unused; reserved for future flags.
102
49
  * @param {{
103
50
  * runner?: typeof spawnSync,
package/lib/cli/sync.js CHANGED
@@ -1,64 +1,16 @@
1
1
  // lib/cli/sync.js
2
2
  /**
3
- * `mandrel sync` subcommand — the .agents/ materializer.
3
+ * `mandrel sync`: materialize `node_modules/mandrel/.agents/` into
4
+ * `./.agents/` by plain file copy (never symlinks, so Windows and POSIX
5
+ * match), then prune managed-zone files with no payload counterpart and write
6
+ * the version marker. Idempotent; `--dry-run` writes nothing. `.agents/local/`
7
+ * and `*.local.*` files are never copied into or pruned.
4
8
  *
5
- * Copies the published package payload
6
- * (`node_modules/mandrel/.agents/`) into the consumer project's
7
- * `./.agents/` directory by **plain file copy** — never a symlink — so
8
- * Windows and POSIX behave identically (Tech Spec #3459, Feature #3461).
9
- *
10
- * Design contract (per Story #3467 AC, Tech Spec #3459 "API Changes", and
11
- * Story #4046 sync-prune):
12
- * - Copy, not symlink. The materialized tree is plain regular files.
13
- * - Idempotent. A second run overwrites in place and leaves ./.agents/
14
- * byte-identical to the package payload.
15
- * - Self-locating. The package root is resolved from the installed
16
- * `mandrel` package metadata, not from the current working
17
- * directory, so it works regardless of where `mandrel` is invoked.
18
- * - Exits non-zero with an actionable message when `mandrel` is
19
- * not resolvable in node_modules.
20
- * - `--dry-run` reports the planned copies and writes nothing.
21
- * - Local-additions zone. The `.agents/local/` subtree is never copied
22
- * into nor pruned from the destination (Story #3498). It is the
23
- * consumer-owned space for hand-authored additions that must survive
24
- * every re-materialization.
25
- * - Sync prune (Story #4046). After the copy pass, any file inside the
26
- * managed `.agents/` zone (everything except `.agents/local/`) that has
27
- * no counterpart in the package payload is deleted. Consumer additions
28
- * under `.agents/local/` are never touched.
29
- * - Generated, never-pruned registry (Story #4534). Framework-generated
30
- * `.agents/` files have no payload counterpart by design, so the prune
31
- * pass would delete each one unless it is declared in
32
- * {@link GENERATED_FILES}. That registry — not a per-file special case in
33
- * {@link listDestFiles} — is the single place a generated artifact is
34
- * exempted. Registered today: the version marker (Story #4530) and the
35
- * install ledger the bootstrap writes and `mandrel uninstall` reads.
36
- * - Version marker (Story #4530). After the prune pass, `.agents/.mandrel-
37
- * version` is (re)written with the executing package's own version. See
38
- * {@link readVersionMarker} for how callers consume it.
39
- *
40
- * Security (Tech Spec #3459 "Postinstall safety"):
41
- * - No network, and no shell: every child process is spawned with argv
42
- * tokens and `shell: false`.
43
- * - Logs only paths and counts, never file contents or environment values.
44
- * - One write outside `./.agents/` (Story #5277): the per-clone
45
- * `merge.mandrel-baseline.driver` git config, and only when the project's
46
- * own tracked `.gitattributes` already declares the attribute that needs
47
- * it. That half of the registration cannot ship with the repository — git
48
- * will not execute a command chosen by whoever wrote it — so every fresh
49
- * clone silently text-merges generated baselines until something installs
50
- * it locally, and `sync` is the one command every consumer runs. It never
51
- * creates or edits `.gitattributes`; a project that has not opted into the
52
- * quality surface is left untouched.
53
- *
54
- * Injectable seams (used by lib/cli/__tests__/sync.test.js):
55
- * - `resolvePackageRoot` — replaces real `mandrel` resolution
56
- * - `fs` — replaces the node:fs surface used here
57
- * - `cwd` — replaces process.cwd()
58
- * - `ensureMergeDriver` — replaces the git-config merge-driver install
59
- * - `write` — replaces process.stdout.write
60
- * - `writeErr` — replaces process.stderr.write
61
- * - `exit` — replaces process.exit
9
+ * No network, no shell. The one write outside `./.agents/` is the per-clone
10
+ * `merge.mandrel-baseline.driver` git config, made only when the project's
11
+ * tracked `.gitattributes` already declares the attribute — git will not run
12
+ * a command shipped by the repo, so every fresh clone needs it installed
13
+ * locally, and `sync` is the command every consumer runs.
62
14
  */
63
15
 
64
16
  import nodeFs from 'node:fs';
@@ -70,56 +22,22 @@ import { LEDGER_RELATIVE_PATH } from '../../.agents/scripts/lib/bootstrap/instal
70
22
 
71
23
  export const PACKAGE_NAME = 'mandrel';
72
24
 
73
- /**
74
- * Name of the managed destination directory, relative to the project root.
75
- * Generating modules export their artifact paths relative to the *project
76
- * root* (e.g. `install-ledger.js`'s `LEDGER_RELATIVE_PATH`), whereas the
77
- * prune pass compares paths relative to this directory — {@link
78
- * toManagedZoneRelative} is the one conversion between the two.
79
- */
80
25
  const AGENTS_DIR = '.agents';
81
26
 
82
- /**
83
- * Top-level directory name (relative to `.agents/`) reserved as the
84
- * sync-exempt local-additions zone (Story #3498, f-drift-local-zone).
85
- *
86
- * `.agents/local/` is a sanctioned space for consumer hand-authored
87
- * additions: `mandrel sync` never copies a payload file into it (the
88
- * published payload ships none) and never prunes what a consumer has
89
- * placed there, so local additions survive every re-materialization. The
90
- * exemption is enforced by skipping this subtree during source enumeration,
91
- * which keeps both the dry-run plan and the real copy free of any
92
- * `.agents/local/**` path even if a future payload were to ship one.
93
- */
27
+ /** Top-level `.agents/` subdirectory reserved for consumer additions. */
94
28
  export const LOCAL_ZONE_DIR = 'local';
95
29
 
96
- /**
97
- * Basename pattern for consumer local-override files (`*.local.<ext>`,
98
- * e.g. `instructions.local.md`, `foo.local.json`). Matches the gitignore
99
- * convention (`.agents/*.local.md`, `.agentrc.local.json`) and the override
100
- * mechanism documented in `.agents/instructions.md` § 1.E. These files never
101
- * ship in the payload and are exempt from the sync prune pass.
102
- */
30
+ /** Consumer local-override basenames (`instructions.local.md`, …). */
103
31
  export const LOCAL_OVERRIDE_RE = /\.local\.[^.]+$/;
104
32
 
105
- /**
106
- * Relative path (from `.agents/`) of the version marker `runSync` writes
107
- * after every sync, carrying the executing package's own version.
108
- */
33
+ /** `.agents/`-relative path of the version marker written after each sync. */
109
34
  export const VERSION_MARKER_RELATIVE_PATH = '.mandrel-version';
110
35
 
111
36
  /**
112
- * Convert a project-root-relative POSIX path — the shape a generating module
113
- * exports as its own source of truth (e.g. `install-ledger.js`'s
114
- * `LEDGER_RELATIVE_PATH`, `'.agents/.install-manifest.json'`) — into the
115
- * `.agents/`-relative, OS-separator form {@link listDestFiles} enumerates and
116
- * {@link GENERATED_FILES} is compared against.
117
- *
118
- * Throws on a path outside `.agents/`: a generated file the sync prune pass
119
- * never walks has no business in the registry, and registering one would be a
120
- * silent no-op that reads as protection. Failing at module load surfaces the
121
- * mistake at the first import rather than as a mystery deletion in a
122
- * consumer's tree.
37
+ * Convert a project-root-relative POSIX path into the `.agents/`-relative,
38
+ * OS-separator form {@link listDestFiles} enumerates. Throws on a path
39
+ * outside `.agents/` at module load, since registering one would be a silent
40
+ * no-op that reads as protection.
123
41
  *
124
42
  * @param {string} projectRelativePosixPath - e.g. `.agents/.install-manifest.json`.
125
43
  * @returns {string} e.g. `.install-manifest.json` (OS separators).
@@ -136,50 +54,20 @@ function toManagedZoneRelative(projectRelativePosixPath) {
136
54
  }
137
55
 
138
56
  /**
139
- * The **generated, never-pruned registry**: every framework-generated
140
- * `.agents/` file that has no payload counterpart and must therefore be
141
- * exempted from the prune pass. Paths are `.agents/`-relative with OS
142
- * separators, matching what {@link listDestFiles} enumerates.
143
- *
144
- * The prune pass (Story #4046 A3) deletes any managed-zone file absent from
145
- * the payload. That is the correct rule for consumer drift, but it is also
146
- * exactly the shape of every file the framework itself generates into
147
- * `.agents/` outside the payload — so each such artifact is deleted by the very
148
- * sync that wrote it unless registered here. Two have hit this already: the
149
- * install ledger (`.agents/.install-manifest.json`), whose loss made
150
- * `mandrel uninstall` silently reverse nothing and exit 0 (Story #4534), and
151
- * the version marker (Story #4530).
152
- *
153
- * This is deliberately a **registry, not a list of special cases**. Register a
154
- * new generated file by adding one entry here — keyed off the generating
155
- * module's own exported constant wherever one exists, never a duplicated
156
- * string literal — rather than by adding another branch to
157
- * {@link listDestFiles}. That keeps the never-prune contract declared in one
158
- * place and keeps the registry honest: if the generator renames its artifact,
159
- * the exemption moves with it.
160
- *
161
- * This registry does **not** subsume the `.agents/local/` zone or the
162
- * `*.local.*` overrides ({@link LOCAL_ZONE_DIR}, {@link LOCAL_OVERRIDE_RE}).
163
- * Those are a different concept — consumer-authored overrides, not
164
- * framework-generated artifacts — and stay separate on purpose.
57
+ * Framework-generated `.agents/` files with no payload counterpart, which the
58
+ * prune pass would otherwise delete (losing the install ledger makes
59
+ * `mandrel uninstall` silently reverse nothing). Register a new one here,
60
+ * keyed off the generator's exported constant — not as a branch in
61
+ * {@link listDestFiles}. Consumer overrides are a separate concept.
165
62
  */
166
63
  export const GENERATED_FILES = Object.freeze([
167
- // Version marker (Story #4530) — written by runSync itself, below.
168
64
  VERSION_MARKER_RELATIVE_PATH,
169
- // Install ledger (Story #4534) — written by the bootstrap
170
- // (`install-ledger.js`), read by `mandrel uninstall` as its single source of
171
- // truth. Keyed off the generator's exported constant.
172
65
  toManagedZoneRelative(LEDGER_RELATIVE_PATH),
173
66
  ]);
174
67
 
175
68
  /**
176
- * Resolve the version of the package whose `.agents/` payload was just
177
- * copied — i.e. the version the marker must carry. Reads `package.json` at
178
- * the already-resolved `packageRoot`, never the two-directories-up
179
- * self-referential pattern `lib/cli/update.js`'s pre-Story-#4530
180
- * `defaultCurrentVersion` used (that pattern conflates "the CLI that is
181
- * running" with "the payload that was materialized" — the exact confusion
182
- * #4525 fixes on the consumer-pin side of this Story).
69
+ * Version of the payload just copied, read at `packageRoot` — not the
70
+ * running CLI's own version, which may differ.
183
71
  *
184
72
  * @param {string} packageRoot - Absolute path to the resolved package root.
185
73
  * @param {typeof nodeFs} fsImpl
@@ -192,10 +80,8 @@ function resolvePackageVersion(packageRoot, fsImpl) {
192
80
  }
193
81
 
194
82
  /**
195
- * Read the consumer's `.agents/.mandrel-version` marker. Returns `null` when
196
- * absent — a pre-marker install, or a tree that has never been synced —
197
- * so callers (the sync-commands mismatch refusal, the doctor pin check) can
198
- * degrade to their existing content-hash drift check rather than failing.
83
+ * `null` when absent (pre-marker install or never synced), so callers can
84
+ * fall back to content-hash drift checks.
199
85
  *
200
86
  * @param {string} consumerRoot - Consumer project root (not `.agents/`).
201
87
  * @param {typeof nodeFs} [fsImpl]
@@ -216,33 +102,21 @@ export function readVersionMarker(consumerRoot, fsImpl = nodeFs) {
216
102
  }
217
103
 
218
104
  /**
219
- * Default resolver: locate the installed `mandrel` package root by
220
- * resolving its `package.json` and returning the directory that contains it.
221
- *
222
- * Throws an Error with `code: 'MODULE_NOT_FOUND'` when the package is not
223
- * installed — the caller maps that to an actionable non-zero exit.
105
+ * Resolved from the consumer project so it finds their install, not a copy
106
+ * hoisted next to this module. Throws `MODULE_NOT_FOUND` when not installed.
224
107
  *
225
108
  * @param {string} fromDir - Directory to resolve from (the consumer project).
226
109
  * @returns {string} Absolute path to the package root.
227
110
  */
228
111
  export function defaultResolvePackageRoot(fromDir) {
229
- // Resolve relative to the consumer project so we find *their* install,
230
- // not a copy hoisted next to this CLI module.
231
112
  const requireFrom = createRequire(path.join(fromDir, 'noop.js'));
232
113
  const pkgJsonPath = requireFrom.resolve(`${PACKAGE_NAME}/package.json`);
233
114
  return path.dirname(pkgJsonPath);
234
115
  }
235
116
 
236
117
  /**
237
- * Recursively enumerate every regular file under `dir`, returning paths
238
- * relative to `dir` using POSIX-agnostic OS separators.
239
- *
240
- * Symlinks encountered in the source are dereferenced to their target file
241
- * content on copy (we never create symlinks in the destination).
242
- *
243
- * The top-level `local/` subtree (`.agents/local/`) is skipped entirely:
244
- * it is the consumer-owned local-additions zone and is never materialized
245
- * from the package payload (Story #3498). See {@link LOCAL_ZONE_DIR}.
118
+ * Every file under `dir` (relative, OS separators), skipping the top-level
119
+ * local zone only.
246
120
  *
247
121
  * @param {string} dir - Absolute directory to walk.
248
122
  * @param {typeof nodeFs} fsImpl
@@ -252,9 +126,6 @@ export function defaultResolvePackageRoot(fromDir) {
252
126
  export function listFiles(dir, fsImpl, prefix = '') {
253
127
  const out = [];
254
128
  for (const ent of fsImpl.readdirSync(dir, { withFileTypes: true })) {
255
- // Never enumerate the sync-exempt local-additions zone. Matching on the
256
- // empty prefix scopes the skip to the top-level `.agents/local/` only,
257
- // leaving any deeper directory that happens to be named `local` intact.
258
129
  if (prefix === '' && ent.name === LOCAL_ZONE_DIR && ent.isDirectory()) {
259
130
  continue;
260
131
  }
@@ -270,26 +141,8 @@ export function listFiles(dir, fsImpl, prefix = '') {
270
141
  }
271
142
 
272
143
  /**
273
- * Recursively enumerate every regular file under `dir`, returning paths
274
- * relative to `dir` using OS separators. Three disjoint classes are skipped,
275
- * so a caller diffing this against the payload never treats them as stale:
276
- *
277
- * 1. The top-level `local/` subtree — consumer additions inside
278
- * `.agents/local/` are never pruned (Story #3498).
279
- * 2. Files matching the `*.local.*` convention (e.g.
280
- * `.agents/instructions.local.md`) — the documented consumer override
281
- * mechanism (instructions.md § 1.E); they never ship in the payload and
282
- * must survive every sync.
283
- * 3. Everything declared in the {@link GENERATED_FILES} registry —
284
- * framework-generated artifacts with no payload counterpart by design
285
- * (Story #4534). New generated files are registered there, not added as
286
- * a fourth branch here.
287
- *
288
- * (1) and (2) are consumer-authored; (3) is framework-generated. They are
289
- * kept separate deliberately — conflating them would muddy both contracts.
290
- *
291
- * Mirrors `listFiles` but operates on the destination tree so we can
292
- * identify stale files that have no payload counterpart (Story #4046 A3).
144
+ * Destination-tree enumeration for pruning. Skips the top-level local zone,
145
+ * `*.local.*` overrides, and {@link GENERATED_FILES}.
293
146
  *
294
147
  * @param {string} dir - Absolute directory to walk.
295
148
  * @param {typeof nodeFs} fsImpl
@@ -302,23 +155,16 @@ function listDestFiles(dir, fsImpl, prefix = '') {
302
155
  try {
303
156
  entries = fsImpl.readdirSync(dir, { withFileTypes: true });
304
157
  } catch {
305
- // Directory absent — nothing to prune.
306
158
  return out;
307
159
  }
308
160
  for (const ent of entries) {
309
- // The local-additions zone is never pruned; skip it at the top level.
310
161
  if (prefix === '' && ent.name === LOCAL_ZONE_DIR && ent.isDirectory()) {
311
162
  continue;
312
163
  }
313
- // Consumer local-override files (`*.local.*`, e.g. instructions.local.md,
314
- // foo.local.json) are gitignored, never shipped in the payload, and a
315
- // documented override mechanism (instructions.md § 1.E) — never prune.
316
164
  if (!ent.isDirectory() && LOCAL_OVERRIDE_RE.test(ent.name)) {
317
165
  continue;
318
166
  }
319
167
  const rel = prefix ? path.join(prefix, ent.name) : ent.name;
320
- // Framework-generated artifacts — declared once in the never-pruned
321
- // registry (Story #4534); see GENERATED_FILES.
322
168
  if (!ent.isDirectory() && GENERATED_FILES.includes(rel)) {
323
169
  continue;
324
170
  }
@@ -333,13 +179,6 @@ function listDestFiles(dir, fsImpl, prefix = '') {
333
179
  }
334
180
 
335
181
  /**
336
- * Materialize the package's `.agents/` tree into `./.agents/`.
337
- *
338
- * After the copy pass, any file inside the managed zone of the destination
339
- * `.agents/` tree (everything outside `.agents/local/`) that has no
340
- * counterpart in the package payload is deleted (sync-prune, Story #4046 A3).
341
- * Consumer additions placed under `.agents/local/` are never touched.
342
- *
343
182
  * @param {{
344
183
  * argv?: string[],
345
184
  * resolvePackageRoot?: (fromDir: string) => string,
@@ -395,8 +234,6 @@ export function runSync({
395
234
  for (const rel of payloadFiles) {
396
235
  write(`would copy ${path.join('.agents', rel)}\n`);
397
236
  }
398
- // Compute stale files (managed-zone destination files with no payload
399
- // counterpart) for the dry-run plan so operators can preview pruning.
400
237
  const payloadSet = new Set(payloadFiles);
401
238
  const destFiles = listDestFiles(destRoot, fs);
402
239
  const stale = destFiles.filter((f) => !payloadSet.has(f));
@@ -418,15 +255,9 @@ export function runSync({
418
255
  const src = path.join(sourceRoot, rel);
419
256
  const dest = path.join(destRoot, rel);
420
257
  fs.mkdirSync(path.dirname(dest), { recursive: true });
421
- // copyFileSync overwrites the destination in place (idempotent) and
422
- // produces a plain regular file — never a symlink.
423
258
  fs.copyFileSync(src, dest);
424
259
  }
425
260
 
426
- // Prune pass (Story #4046 A3): remove managed-zone destination files that
427
- // have no counterpart in the payload. The local-additions zone
428
- // (.agents/local/) is never enumerated by listDestFiles and is therefore
429
- // never pruned — consumer additions there are sanctioned, not stale.
430
261
  const payloadSet = new Set(payloadFiles);
431
262
  const destFiles = listDestFiles(destRoot, fs);
432
263
  const staleFiles = destFiles.filter((f) => !payloadSet.has(f));
@@ -435,22 +266,14 @@ export function runSync({
435
266
  fs.unlinkSync(dest);
436
267
  }
437
268
 
438
- // Version marker (Story #4530): written AFTER the prune pass, never
439
- // before — the GENERATED_FILES registry already keeps listDestFiles from
440
- // ever enumerating it as stale, but ordering the write after prune is a
441
- // second, independent safeguard against the same class of bug (see the
442
- // GENERATED_FILES doc comment) surviving a future prune-pass reorder. The
443
- // install ledger gets no such belt-and-braces: it is written by the
444
- // bootstrap, not here, so the registry is its only protection.
269
+ // Written after the prune as a second safeguard beside GENERATED_FILES.
445
270
  const packageVersion = resolvePackageVersion(packageRoot, fs);
446
271
  fs.writeFileSync(
447
272
  path.join(destRoot, VERSION_MARKER_RELATIVE_PATH),
448
273
  `${packageVersion}\n`,
449
274
  );
450
275
 
451
- // Baseline merge driver (Story #5277) — config half only; see the module
452
- // preamble's security note. Never allowed to fail the sync: a consumer
453
- // without git, or with a read-only config, still gets their `.agents/` tree.
276
+ // Config half only; never allowed to fail the sync (no git, read-only config).
454
277
  const driver = ensureMergeDriver({
455
278
  projectRoot,
456
279
  configOnly: true,
@@ -476,8 +299,6 @@ export function runSync({
476
299
  }
477
300
 
478
301
  /**
479
- * Default export consumed by `bin/mandrel.js`.
480
- *
481
302
  * @param {string[]} argv - Subcommand arguments (after `mandrel sync`).
482
303
  * @returns {Promise<void>}
483
304
  */