@deftai/directive-runtime 0.126.0-beta.3 → 0.128.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 (430) hide show
  1. package/.agents/skills/deft-directive-release/SKILL.md +428 -7
  2. package/.githooks/_directive-run.sh +30 -0
  3. package/.githooks/pre-commit +4 -24
  4. package/.githooks/pre-push +11 -17
  5. package/Taskfile.yml +17 -16
  6. package/contracts/design-critique.md +5 -0
  7. package/dist/cli-router/route-argv.js +1 -0
  8. package/dist/contract-entry.js +2 -4
  9. package/dist/coverage-hotspots.js +2 -2
  10. package/dist/dispatch.d.ts +1 -1
  11. package/dist/dispatch.js +8 -6
  12. package/dist/doctor-diagnose.js +10 -7
  13. package/dist/hook-dispatch.d.ts +1 -1
  14. package/dist/hook-dispatch.js +1 -1
  15. package/dist/install-cli/coverage-map.d.ts +1 -5
  16. package/dist/install-cli/coverage-map.js +28 -22
  17. package/dist/installer-output-inventory.js +1 -4
  18. package/dist/lifecycle-cli/coverage-map.js +37 -35
  19. package/dist/migrate.js +12 -7
  20. package/dist/policy.d.ts +4 -2
  21. package/dist/policy.js +101 -2
  22. package/dist/pre-pr-run.d.ts +2 -0
  23. package/dist/pre-pr-run.js +40 -0
  24. package/dist/removal-steps/index.d.ts +2 -2
  25. package/dist/removal-steps/steps.js +6 -9
  26. package/dist/removal-steps/strategies.js +1 -1
  27. package/dist/render-cli/capability-map-cli.d.ts +3 -0
  28. package/dist/render-cli/capability-map-cli.js +6 -0
  29. package/dist/setup-wiring.d.ts +6 -0
  30. package/dist/setup-wiring.js +20 -7
  31. package/dist/setup.js +12 -14
  32. package/dist/uninstall.js +1 -1
  33. package/dist/vbrief-preflight-fixtures.js +1 -1
  34. package/dist/verify-intent-constraint.d.ts +2 -0
  35. package/dist/verify-intent-constraint.js +24 -0
  36. package/dist/verify-observable-scope.d.ts +2 -0
  37. package/dist/verify-observable-scope.js +24 -0
  38. package/docs/getting-started.md +2 -0
  39. package/docs/intent-constraint.md +7 -1
  40. package/docs/known-limitations.md +1 -0
  41. package/docs/launcher.md +10 -0
  42. package/docs/observable-scope.md +6 -0
  43. package/package.json +1 -1
  44. package/packs/skills/skills-pack-0.1.json +3 -3
  45. package/scm/github.md +1 -0
  46. package/skills/deft-directive-feedback/SKILL.md +9 -20
  47. package/skills/deft-directive-pre-pr/SKILL.md +13 -3
  48. package/skills/deft-directive-release/SKILL.md +4 -4
  49. package/skills/deft-directive-review-cycle/SKILL.md +2 -2
  50. package/skills/deft-directive-setup/SKILL.md +17 -41
  51. package/skills/deft-directive-swarm/references/host-cursor.md +18 -1
  52. package/skills/deft-directive-swarm/references/host-grok-build.md +3 -3
  53. package/skills/deft-directive-sync/SKILL.md +2 -2
  54. package/skills/deft-directive-tutorial/SKILL.md +1 -1
  55. package/tasks/agent.yml +0 -2
  56. package/tasks/cache.yml +0 -16
  57. package/tasks/capacity.yml +0 -4
  58. package/tasks/change.yml +0 -4
  59. package/tasks/codebase.yml +0 -10
  60. package/tasks/commit.yml +0 -2
  61. package/tasks/coverage.yml +0 -2
  62. package/tasks/decision.yml +0 -4
  63. package/tasks/directive.yml +0 -1
  64. package/tasks/docs.yml +6 -10
  65. package/tasks/engine-invoke.cjs +79 -0
  66. package/tasks/engine-invoke.test.cjs +84 -0
  67. package/tasks/engine.yml +27 -81
  68. package/tasks/eval.yml +0 -8
  69. package/tasks/feedback.yml +0 -2
  70. package/tasks/install.yml +0 -4
  71. package/tasks/issue.yml +0 -3
  72. package/tasks/lifecycle.yml +0 -1
  73. package/tasks/materialize.cjs +246 -0
  74. package/tasks/materialize.test.cjs +103 -0
  75. package/tasks/materialize.yml +13 -0
  76. package/tasks/migrate.yml +0 -6
  77. package/tasks/packs.yml +0 -16
  78. package/tasks/plan-sequence.yml +0 -8
  79. package/tasks/policy.yml +0 -24
  80. package/tasks/pr.yml +0 -6
  81. package/tasks/prd.yml +0 -2
  82. package/tasks/product-signal.yml +0 -10
  83. package/tasks/project.yml +0 -8
  84. package/tasks/reconcile.yml +0 -2
  85. package/tasks/review-monitor.yml +0 -4
  86. package/tasks/roadmap.yml +0 -4
  87. package/tasks/scm.yml +0 -32
  88. package/tasks/scope.yml +0 -30
  89. package/tasks/slice.yml +0 -4
  90. package/tasks/spec.yml +0 -6
  91. package/tasks/subagent.yml +0 -4
  92. package/tasks/swarm.yml +0 -7
  93. package/tasks/toolchain.yml +0 -4
  94. package/tasks/triage-actions.yml +0 -8
  95. package/tasks/triage-bootstrap.yml +0 -1
  96. package/tasks/triage-bulk.yml +0 -5
  97. package/tasks/triage-classify.yml +0 -2
  98. package/tasks/triage-evaluate.yml +0 -1
  99. package/tasks/triage-metrics.yml +0 -2
  100. package/tasks/triage-queue.yml +0 -3
  101. package/tasks/triage-reconcile.yml +0 -1
  102. package/tasks/triage-scope-drift.yml +0 -1
  103. package/tasks/triage-scope.yml +0 -1
  104. package/tasks/triage-smoketest.yml +0 -1
  105. package/tasks/triage-subscribe.yml +0 -2
  106. package/tasks/tutorial.yml +0 -20
  107. package/tasks/umbrella.yml +0 -2
  108. package/tasks/value.yml +0 -2
  109. package/tasks/vbrief.yml +0 -12
  110. package/tasks/verify.yml +0 -140
  111. package/tasks/xbrief.yml +0 -6
  112. package/templates/agents-entry.md +1 -0
  113. package/templates/design-critique-brief.md +3 -0
  114. package/vendor/directive-content/.agents/skills/deft-directive-release/SKILL.md +428 -7
  115. package/vendor/directive-content/.githooks/_directive-run.sh +30 -0
  116. package/vendor/directive-content/.githooks/pre-commit +4 -24
  117. package/vendor/directive-content/.githooks/pre-push +11 -17
  118. package/vendor/directive-content/Taskfile.yml +17 -16
  119. package/vendor/directive-content/contracts/design-critique.md +5 -0
  120. package/vendor/directive-content/docs/getting-started.md +2 -0
  121. package/vendor/directive-content/docs/intent-constraint.md +7 -1
  122. package/vendor/directive-content/docs/known-limitations.md +1 -0
  123. package/vendor/directive-content/docs/launcher.md +10 -0
  124. package/vendor/directive-content/docs/observable-scope.md +6 -0
  125. package/vendor/directive-content/packs/skills/skills-pack-0.1.json +3 -3
  126. package/vendor/directive-content/scm/github.md +1 -0
  127. package/vendor/directive-content/skills/deft-directive-feedback/SKILL.md +9 -20
  128. package/vendor/directive-content/skills/deft-directive-pre-pr/SKILL.md +13 -3
  129. package/vendor/directive-content/skills/deft-directive-release/SKILL.md +4 -4
  130. package/vendor/directive-content/skills/deft-directive-review-cycle/SKILL.md +2 -2
  131. package/vendor/directive-content/skills/deft-directive-setup/SKILL.md +17 -41
  132. package/vendor/directive-content/skills/deft-directive-swarm/references/host-cursor.md +18 -1
  133. package/vendor/directive-content/skills/deft-directive-swarm/references/host-grok-build.md +3 -3
  134. package/vendor/directive-content/skills/deft-directive-sync/SKILL.md +2 -2
  135. package/vendor/directive-content/skills/deft-directive-tutorial/SKILL.md +1 -1
  136. package/vendor/directive-content/tasks/agent.yml +0 -2
  137. package/vendor/directive-content/tasks/cache.yml +0 -16
  138. package/vendor/directive-content/tasks/capacity.yml +0 -4
  139. package/vendor/directive-content/tasks/change.yml +0 -4
  140. package/vendor/directive-content/tasks/codebase.yml +0 -10
  141. package/vendor/directive-content/tasks/commit.yml +0 -2
  142. package/vendor/directive-content/tasks/coverage.yml +0 -2
  143. package/vendor/directive-content/tasks/decision.yml +0 -4
  144. package/vendor/directive-content/tasks/directive.yml +0 -1
  145. package/vendor/directive-content/tasks/docs.yml +6 -10
  146. package/vendor/directive-content/tasks/engine-invoke.cjs +79 -0
  147. package/vendor/directive-content/tasks/engine-invoke.test.cjs +84 -0
  148. package/vendor/directive-content/tasks/engine.yml +27 -81
  149. package/vendor/directive-content/tasks/eval.yml +0 -8
  150. package/vendor/directive-content/tasks/feedback.yml +0 -2
  151. package/vendor/directive-content/tasks/install.yml +0 -4
  152. package/vendor/directive-content/tasks/issue.yml +0 -3
  153. package/vendor/directive-content/tasks/lifecycle.yml +0 -1
  154. package/vendor/directive-content/tasks/materialize.cjs +246 -0
  155. package/vendor/directive-content/tasks/materialize.test.cjs +103 -0
  156. package/vendor/directive-content/tasks/materialize.yml +13 -0
  157. package/vendor/directive-content/tasks/migrate.yml +0 -6
  158. package/vendor/directive-content/tasks/packs.yml +0 -16
  159. package/vendor/directive-content/tasks/plan-sequence.yml +0 -8
  160. package/vendor/directive-content/tasks/policy.yml +0 -24
  161. package/vendor/directive-content/tasks/pr.yml +0 -6
  162. package/vendor/directive-content/tasks/prd.yml +0 -2
  163. package/vendor/directive-content/tasks/product-signal.yml +0 -10
  164. package/vendor/directive-content/tasks/project.yml +0 -8
  165. package/vendor/directive-content/tasks/reconcile.yml +0 -2
  166. package/vendor/directive-content/tasks/review-monitor.yml +0 -4
  167. package/vendor/directive-content/tasks/roadmap.yml +0 -4
  168. package/vendor/directive-content/tasks/scm.yml +0 -32
  169. package/vendor/directive-content/tasks/scope.yml +0 -30
  170. package/vendor/directive-content/tasks/slice.yml +0 -4
  171. package/vendor/directive-content/tasks/spec.yml +0 -6
  172. package/vendor/directive-content/tasks/subagent.yml +0 -4
  173. package/vendor/directive-content/tasks/swarm.yml +0 -7
  174. package/vendor/directive-content/tasks/toolchain.yml +0 -4
  175. package/vendor/directive-content/tasks/triage-actions.yml +0 -8
  176. package/vendor/directive-content/tasks/triage-bootstrap.yml +0 -1
  177. package/vendor/directive-content/tasks/triage-bulk.yml +0 -5
  178. package/vendor/directive-content/tasks/triage-classify.yml +0 -2
  179. package/vendor/directive-content/tasks/triage-evaluate.yml +0 -1
  180. package/vendor/directive-content/tasks/triage-metrics.yml +0 -2
  181. package/vendor/directive-content/tasks/triage-queue.yml +0 -3
  182. package/vendor/directive-content/tasks/triage-reconcile.yml +0 -1
  183. package/vendor/directive-content/tasks/triage-scope-drift.yml +0 -1
  184. package/vendor/directive-content/tasks/triage-scope.yml +0 -1
  185. package/vendor/directive-content/tasks/triage-smoketest.yml +0 -1
  186. package/vendor/directive-content/tasks/triage-subscribe.yml +0 -2
  187. package/vendor/directive-content/tasks/tutorial.yml +0 -20
  188. package/vendor/directive-content/tasks/umbrella.yml +0 -2
  189. package/vendor/directive-content/tasks/value.yml +0 -2
  190. package/vendor/directive-content/tasks/vbrief.yml +0 -12
  191. package/vendor/directive-content/tasks/verify.yml +0 -140
  192. package/vendor/directive-content/tasks/xbrief.yml +0 -6
  193. package/vendor/directive-content/templates/agents-entry.md +1 -0
  194. package/vendor/directive-content/templates/design-critique-brief.md +3 -0
  195. package/vendor/directive-core/dist/.tsbuildinfo +1 -1
  196. package/vendor/directive-core/dist/consumer-check-contract/evaluate.d.ts +3 -2
  197. package/vendor/directive-core/dist/consumer-check-contract/evaluate.d.ts.map +1 -1
  198. package/vendor/directive-core/dist/consumer-check-contract/evaluate.js +7 -6
  199. package/vendor/directive-core/dist/consumer-check-contract/evaluate.js.map +1 -1
  200. package/vendor/directive-core/dist/content-contracts/skills/greptile-detector.d.ts +6 -0
  201. package/vendor/directive-core/dist/content-contracts/skills/greptile-detector.d.ts.map +1 -1
  202. package/vendor/directive-core/dist/content-contracts/skills/greptile-detector.js +97 -3
  203. package/vendor/directive-core/dist/content-contracts/skills/greptile-detector.js.map +1 -1
  204. package/vendor/directive-core/dist/content-root.d.ts.map +1 -1
  205. package/vendor/directive-core/dist/content-root.js +8 -1
  206. package/vendor/directive-core/dist/content-root.js.map +1 -1
  207. package/vendor/directive-core/dist/coverage-applicability/evaluate.d.ts.map +1 -1
  208. package/vendor/directive-core/dist/coverage-applicability/evaluate.js +406 -11
  209. package/vendor/directive-core/dist/coverage-applicability/evaluate.js.map +1 -1
  210. package/vendor/directive-core/dist/coverage-hotspots/evaluate.d.ts +13 -5
  211. package/vendor/directive-core/dist/coverage-hotspots/evaluate.d.ts.map +1 -1
  212. package/vendor/directive-core/dist/coverage-hotspots/evaluate.js +60 -2
  213. package/vendor/directive-core/dist/coverage-hotspots/evaluate.js.map +1 -1
  214. package/vendor/directive-core/dist/deposit/live-procedure-targets.d.ts.map +1 -1
  215. package/vendor/directive-core/dist/deposit/live-procedure-targets.js.map +1 -1
  216. package/vendor/directive-core/dist/deposit/python-free.d.ts +2 -0
  217. package/vendor/directive-core/dist/deposit/python-free.d.ts.map +1 -1
  218. package/vendor/directive-core/dist/deposit/python-free.js +5 -1
  219. package/vendor/directive-core/dist/deposit/python-free.js.map +1 -1
  220. package/vendor/directive-core/dist/doctor/checks.d.ts.map +1 -1
  221. package/vendor/directive-core/dist/doctor/checks.js +8 -10
  222. package/vendor/directive-core/dist/doctor/checks.js.map +1 -1
  223. package/vendor/directive-core/dist/doctor/main.d.ts.map +1 -1
  224. package/vendor/directive-core/dist/doctor/main.js +6 -0
  225. package/vendor/directive-core/dist/doctor/main.js.map +1 -1
  226. package/vendor/directive-core/dist/doctor/manifest.d.ts.map +1 -1
  227. package/vendor/directive-core/dist/doctor/manifest.js +3 -2
  228. package/vendor/directive-core/dist/doctor/manifest.js.map +1 -1
  229. package/vendor/directive-core/dist/doctor/paths.d.ts.map +1 -1
  230. package/vendor/directive-core/dist/doctor/paths.js +11 -0
  231. package/vendor/directive-core/dist/doctor/paths.js.map +1 -1
  232. package/vendor/directive-core/dist/engine-version.d.ts.map +1 -1
  233. package/vendor/directive-core/dist/engine-version.js +1 -4
  234. package/vendor/directive-core/dist/engine-version.js.map +1 -1
  235. package/vendor/directive-core/dist/hooks/dispatcher.d.ts +2 -0
  236. package/vendor/directive-core/dist/hooks/dispatcher.d.ts.map +1 -1
  237. package/vendor/directive-core/dist/hooks/dispatcher.js +5 -1
  238. package/vendor/directive-core/dist/hooks/dispatcher.js.map +1 -1
  239. package/vendor/directive-core/dist/index.d.ts +1 -0
  240. package/vendor/directive-core/dist/index.d.ts.map +1 -1
  241. package/vendor/directive-core/dist/index.js +1 -0
  242. package/vendor/directive-core/dist/index.js.map +1 -1
  243. package/vendor/directive-core/dist/init-deposit/agent-hooks.d.ts.map +1 -1
  244. package/vendor/directive-core/dist/init-deposit/agent-hooks.js.map +1 -1
  245. package/vendor/directive-core/dist/init-deposit/scaffold.d.ts +4 -0
  246. package/vendor/directive-core/dist/init-deposit/scaffold.d.ts.map +1 -1
  247. package/vendor/directive-core/dist/init-deposit/scaffold.js +4 -2
  248. package/vendor/directive-core/dist/init-deposit/scaffold.js.map +1 -1
  249. package/vendor/directive-core/dist/install-contract/constants.d.ts.map +1 -1
  250. package/vendor/directive-core/dist/install-contract/constants.js +9 -1
  251. package/vendor/directive-core/dist/install-contract/constants.js.map +1 -1
  252. package/vendor/directive-core/dist/install-contract/data-status.d.ts.map +1 -1
  253. package/vendor/directive-core/dist/install-contract/data-status.js.map +1 -1
  254. package/vendor/directive-core/dist/install-contract/index.d.ts +1 -1
  255. package/vendor/directive-core/dist/install-contract/index.d.ts.map +1 -1
  256. package/vendor/directive-core/dist/install-contract/index.js.map +1 -1
  257. package/vendor/directive-core/dist/install-contract/package-meta.d.ts.map +1 -1
  258. package/vendor/directive-core/dist/install-contract/package-meta.js.map +1 -1
  259. package/vendor/directive-core/dist/install-health/cheap.d.ts.map +1 -1
  260. package/vendor/directive-core/dist/install-health/cheap.js +2 -6
  261. package/vendor/directive-core/dist/install-health/cheap.js.map +1 -1
  262. package/vendor/directive-core/dist/install-health/in-sync.d.ts.map +1 -1
  263. package/vendor/directive-core/dist/install-health/in-sync.js.map +1 -1
  264. package/vendor/directive-core/dist/install-health/index.d.ts +6 -6
  265. package/vendor/directive-core/dist/install-health/index.d.ts.map +1 -1
  266. package/vendor/directive-core/dist/install-health/index.js +3 -3
  267. package/vendor/directive-core/dist/install-health/index.js.map +1 -1
  268. package/vendor/directive-core/dist/install-health/ownership.d.ts.map +1 -1
  269. package/vendor/directive-core/dist/install-health/ownership.js +2 -6
  270. package/vendor/directive-core/dist/install-health/ownership.js.map +1 -1
  271. package/vendor/directive-core/dist/install-health/readers.d.ts.map +1 -1
  272. package/vendor/directive-core/dist/install-health/readers.js.map +1 -1
  273. package/vendor/directive-core/dist/install-health/wiring.d.ts.map +1 -1
  274. package/vendor/directive-core/dist/install-health/wiring.js +2 -3
  275. package/vendor/directive-core/dist/install-health/wiring.js.map +1 -1
  276. package/vendor/directive-core/dist/intent-constraint/evaluate.d.ts +7 -0
  277. package/vendor/directive-core/dist/intent-constraint/evaluate.d.ts.map +1 -1
  278. package/vendor/directive-core/dist/intent-constraint/evaluate.js +26 -5
  279. package/vendor/directive-core/dist/intent-constraint/evaluate.js.map +1 -1
  280. package/vendor/directive-core/dist/intent-constraint/plan-id-adopter.d.ts +76 -0
  281. package/vendor/directive-core/dist/intent-constraint/plan-id-adopter.d.ts.map +1 -0
  282. package/vendor/directive-core/dist/intent-constraint/plan-id-adopter.js +239 -0
  283. package/vendor/directive-core/dist/intent-constraint/plan-id-adopter.js.map +1 -0
  284. package/vendor/directive-core/dist/observable-scope/evaluate.d.ts +7 -0
  285. package/vendor/directive-core/dist/observable-scope/evaluate.d.ts.map +1 -1
  286. package/vendor/directive-core/dist/observable-scope/evaluate.js +51 -7
  287. package/vendor/directive-core/dist/observable-scope/evaluate.js.map +1 -1
  288. package/vendor/directive-core/dist/policy/coverage-mode.d.ts +84 -0
  289. package/vendor/directive-core/dist/policy/coverage-mode.d.ts.map +1 -0
  290. package/vendor/directive-core/dist/policy/coverage-mode.js +226 -0
  291. package/vendor/directive-core/dist/policy/coverage-mode.js.map +1 -0
  292. package/vendor/directive-core/dist/policy/index.d.ts +2 -0
  293. package/vendor/directive-core/dist/policy/index.d.ts.map +1 -1
  294. package/vendor/directive-core/dist/policy/index.js +60 -40
  295. package/vendor/directive-core/dist/policy/index.js.map +1 -1
  296. package/vendor/directive-core/dist/pr-closing-keywords/main.d.ts +2 -0
  297. package/vendor/directive-core/dist/pr-closing-keywords/main.d.ts.map +1 -1
  298. package/vendor/directive-core/dist/pr-closing-keywords/main.js +143 -9
  299. package/vendor/directive-core/dist/pr-closing-keywords/main.js.map +1 -1
  300. package/vendor/directive-core/dist/pre-pr-controller/controller.d.ts +2 -0
  301. package/vendor/directive-core/dist/pre-pr-controller/controller.d.ts.map +1 -1
  302. package/vendor/directive-core/dist/pre-pr-controller/controller.js +109 -14
  303. package/vendor/directive-core/dist/pre-pr-controller/controller.js.map +1 -1
  304. package/vendor/directive-core/dist/pre-pr-controller/evaluate.d.ts +2 -0
  305. package/vendor/directive-core/dist/pre-pr-controller/evaluate.d.ts.map +1 -1
  306. package/vendor/directive-core/dist/pre-pr-controller/evaluate.js +11 -1
  307. package/vendor/directive-core/dist/pre-pr-controller/evaluate.js.map +1 -1
  308. package/vendor/directive-core/dist/pre-pr-controller/index.d.ts +1 -1
  309. package/vendor/directive-core/dist/pre-pr-controller/index.d.ts.map +1 -1
  310. package/vendor/directive-core/dist/pre-pr-controller/index.js +1 -1
  311. package/vendor/directive-core/dist/pre-pr-controller/index.js.map +1 -1
  312. package/vendor/directive-core/dist/pre-pr-controller/phases.d.ts +10 -0
  313. package/vendor/directive-core/dist/pre-pr-controller/phases.d.ts.map +1 -1
  314. package/vendor/directive-core/dist/pre-pr-controller/phases.js +15 -1
  315. package/vendor/directive-core/dist/pre-pr-controller/phases.js.map +1 -1
  316. package/vendor/directive-core/dist/pre-pr-controller/types.d.ts +20 -1
  317. package/vendor/directive-core/dist/pre-pr-controller/types.d.ts.map +1 -1
  318. package/vendor/directive-core/dist/pre-pr-controller/types.js +2 -0
  319. package/vendor/directive-core/dist/pre-pr-controller/types.js.map +1 -1
  320. package/vendor/directive-core/dist/preflight-gh/pre-push.d.ts +40 -3
  321. package/vendor/directive-core/dist/preflight-gh/pre-push.d.ts.map +1 -1
  322. package/vendor/directive-core/dist/preflight-gh/pre-push.js +340 -27
  323. package/vendor/directive-core/dist/preflight-gh/pre-push.js.map +1 -1
  324. package/vendor/directive-core/dist/release/cli-drift-report.d.ts +4 -4
  325. package/vendor/directive-core/dist/release/cli-drift-report.d.ts.map +1 -1
  326. package/vendor/directive-core/dist/release/cli-drift-report.js +6 -11
  327. package/vendor/directive-core/dist/release/cli-drift-report.js.map +1 -1
  328. package/vendor/directive-core/dist/release-e2e/constants.d.ts +4 -3
  329. package/vendor/directive-core/dist/release-e2e/constants.d.ts.map +1 -1
  330. package/vendor/directive-core/dist/release-e2e/constants.js +4 -3
  331. package/vendor/directive-core/dist/release-e2e/constants.js.map +1 -1
  332. package/vendor/directive-core/dist/release-e2e/greenfield-python-free-smoke.d.ts.map +1 -1
  333. package/vendor/directive-core/dist/release-e2e/greenfield-python-free-smoke.js +87 -28
  334. package/vendor/directive-core/dist/release-e2e/greenfield-python-free-smoke.js.map +1 -1
  335. package/vendor/directive-core/dist/release-e2e/legacy-bridge-leg.d.ts.map +1 -1
  336. package/vendor/directive-core/dist/release-e2e/legacy-bridge-leg.js +13 -2
  337. package/vendor/directive-core/dist/release-e2e/legacy-bridge-leg.js.map +1 -1
  338. package/vendor/directive-core/dist/release-e2e/main.js +1 -1
  339. package/vendor/directive-core/dist/release-e2e/npm-ops.d.ts +11 -5
  340. package/vendor/directive-core/dist/release-e2e/npm-ops.d.ts.map +1 -1
  341. package/vendor/directive-core/dist/release-e2e/npm-ops.js +90 -45
  342. package/vendor/directive-core/dist/release-e2e/npm-ops.js.map +1 -1
  343. package/vendor/directive-core/dist/render/project-render.d.ts.map +1 -1
  344. package/vendor/directive-core/dist/render/project-render.js +1 -0
  345. package/vendor/directive-core/dist/render/project-render.js.map +1 -1
  346. package/vendor/directive-core/dist/resolution/engine-resolve.d.ts.map +1 -1
  347. package/vendor/directive-core/dist/resolution/engine-resolve.js.map +1 -1
  348. package/vendor/directive-core/dist/resolution/pin.d.ts +11 -5
  349. package/vendor/directive-core/dist/resolution/pin.d.ts.map +1 -1
  350. package/vendor/directive-core/dist/resolution/pin.js +20 -11
  351. package/vendor/directive-core/dist/resolution/pin.js.map +1 -1
  352. package/vendor/directive-core/dist/resolution/plan.d.ts.map +1 -1
  353. package/vendor/directive-core/dist/resolution/plan.js +5 -3
  354. package/vendor/directive-core/dist/resolution/plan.js.map +1 -1
  355. package/vendor/directive-core/dist/review-monitor/bounded-pr-watch-deny.d.ts +54 -3
  356. package/vendor/directive-core/dist/review-monitor/bounded-pr-watch-deny.d.ts.map +1 -1
  357. package/vendor/directive-core/dist/review-monitor/bounded-pr-watch-deny.js +142 -0
  358. package/vendor/directive-core/dist/review-monitor/bounded-pr-watch-deny.js.map +1 -1
  359. package/vendor/directive-core/dist/scope/file-scope-coverage-warn.d.ts +21 -0
  360. package/vendor/directive-core/dist/scope/file-scope-coverage-warn.d.ts.map +1 -0
  361. package/vendor/directive-core/dist/scope/file-scope-coverage-warn.js +95 -0
  362. package/vendor/directive-core/dist/scope/file-scope-coverage-warn.js.map +1 -0
  363. package/vendor/directive-core/dist/session/spawn-occupancy.d.ts +7 -0
  364. package/vendor/directive-core/dist/session/spawn-occupancy.d.ts.map +1 -1
  365. package/vendor/directive-core/dist/session/spawn-occupancy.js +28 -0
  366. package/vendor/directive-core/dist/session/spawn-occupancy.js.map +1 -1
  367. package/vendor/directive-core/dist/staleness-tickler/run.d.ts.map +1 -1
  368. package/vendor/directive-core/dist/staleness-tickler/run.js.map +1 -1
  369. package/vendor/directive-core/dist/swarm/approach1-babysitter.d.ts +19 -6
  370. package/vendor/directive-core/dist/swarm/approach1-babysitter.d.ts.map +1 -1
  371. package/vendor/directive-core/dist/swarm/approach1-babysitter.js +69 -9
  372. package/vendor/directive-core/dist/swarm/approach1-babysitter.js.map +1 -1
  373. package/vendor/directive-core/dist/swarm/dest-place.d.ts +1 -1
  374. package/vendor/directive-core/dist/swarm/dest-place.d.ts.map +1 -1
  375. package/vendor/directive-core/dist/swarm/dest-place.js +1 -1
  376. package/vendor/directive-core/dist/swarm/dest-place.js.map +1 -1
  377. package/vendor/directive-core/dist/swarm/launch-cli.d.ts.map +1 -1
  378. package/vendor/directive-core/dist/swarm/launch-cli.js +12 -0
  379. package/vendor/directive-core/dist/swarm/launch-cli.js.map +1 -1
  380. package/vendor/directive-core/dist/swarm/launch.d.ts +6 -0
  381. package/vendor/directive-core/dist/swarm/launch.d.ts.map +1 -1
  382. package/vendor/directive-core/dist/swarm/launch.js +11 -0
  383. package/vendor/directive-core/dist/swarm/launch.js.map +1 -1
  384. package/vendor/directive-core/dist/swarm/leftover-before-activation.d.ts +27 -0
  385. package/vendor/directive-core/dist/swarm/leftover-before-activation.d.ts.map +1 -0
  386. package/vendor/directive-core/dist/swarm/leftover-before-activation.js +31 -0
  387. package/vendor/directive-core/dist/swarm/leftover-before-activation.js.map +1 -0
  388. package/vendor/directive-core/dist/swarm/worktree-pm-install.d.ts +5 -0
  389. package/vendor/directive-core/dist/swarm/worktree-pm-install.d.ts.map +1 -1
  390. package/vendor/directive-core/dist/swarm/worktree-pm-install.js +16 -6
  391. package/vendor/directive-core/dist/swarm/worktree-pm-install.js.map +1 -1
  392. package/vendor/directive-core/dist/swarm/worktrees.d.ts.map +1 -1
  393. package/vendor/directive-core/dist/swarm/worktrees.js.map +1 -1
  394. package/vendor/directive-core/dist/text/redos-safe.d.ts.map +1 -1
  395. package/vendor/directive-core/dist/text/redos-safe.js +2 -1
  396. package/vendor/directive-core/dist/text/redos-safe.js.map +1 -1
  397. package/vendor/directive-core/dist/triage/evaluate/worktrees.d.ts.map +1 -1
  398. package/vendor/directive-core/dist/triage/evaluate/worktrees.js +6 -6
  399. package/vendor/directive-core/dist/triage/evaluate/worktrees.js.map +1 -1
  400. package/vendor/directive-core/dist/vbrief-validate/conformance.d.ts.map +1 -1
  401. package/vendor/directive-core/dist/vbrief-validate/conformance.js +5 -0
  402. package/vendor/directive-core/dist/vbrief-validate/conformance.js.map +1 -1
  403. package/vendor/directive-core/dist/verify-env/agent-hooks-live-probe.js +1 -1
  404. package/vendor/directive-core/dist/verify-env/agent-hooks-live-probe.js.map +1 -1
  405. package/vendor/directive-core/dist/verify-env/verify-hooks-installed.d.ts +3 -3
  406. package/vendor/directive-core/dist/verify-env/verify-hooks-installed.d.ts.map +1 -1
  407. package/vendor/directive-core/dist/verify-env/verify-hooks-installed.js +7 -11
  408. package/vendor/directive-core/dist/verify-env/verify-hooks-installed.js.map +1 -1
  409. package/vendor/directive-core/dist/verify-source/project-definition-mutation-boundary.d.ts.map +1 -1
  410. package/vendor/directive-core/dist/verify-source/project-definition-mutation-boundary.js +1 -0
  411. package/vendor/directive-core/dist/verify-source/project-definition-mutation-boundary.js.map +1 -1
  412. package/vendor/directive-core/dist/xbrief/paths.d.ts.map +1 -1
  413. package/vendor/directive-core/dist/xbrief/paths.js +15 -12
  414. package/vendor/directive-core/dist/xbrief/paths.js.map +1 -1
  415. package/vendor/directive-core/dist/xbrief-migrate/constants.d.ts +7 -0
  416. package/vendor/directive-core/dist/xbrief-migrate/constants.d.ts.map +1 -1
  417. package/vendor/directive-core/dist/xbrief-migrate/constants.js +7 -0
  418. package/vendor/directive-core/dist/xbrief-migrate/constants.js.map +1 -1
  419. package/vendor/directive-core/dist/xbrief-migrate/detect.d.ts +9 -1
  420. package/vendor/directive-core/dist/xbrief-migrate/detect.d.ts.map +1 -1
  421. package/vendor/directive-core/dist/xbrief-migrate/detect.js +14 -7
  422. package/vendor/directive-core/dist/xbrief-migrate/detect.js.map +1 -1
  423. package/vendor/directive-core/dist/xbrief-migrate/migrate-project.d.ts.map +1 -1
  424. package/vendor/directive-core/dist/xbrief-migrate/migrate-project.js +118 -57
  425. package/vendor/directive-core/dist/xbrief-migrate/migrate-project.js.map +1 -1
  426. package/vendor/directive-core/dist/xbrief-migrate/transforms.d.ts.map +1 -1
  427. package/vendor/directive-core/dist/xbrief-migrate/transforms.js +8 -1
  428. package/vendor/directive-core/dist/xbrief-migrate/transforms.js.map +1 -1
  429. package/.githooks/_deft-run.sh +0 -47
  430. package/vendor/directive-content/.githooks/_deft-run.sh +0 -47
@@ -2,248 +2,250 @@
2
2
  * Wave 8.5 Bucket B coverage map: pytest CLI tests → TS vitest / existing-coverage (#1838 s3).
3
3
  * Python tests remain in-tree until Wave 9 (#1731); entries tagged wave9-delete are dedup candidates.
4
4
  */
5
+ /** Python pytest root segments joined at runtime (avoid class-2 path literals). */
6
+ const PY_CLI_TESTS = "tests" + "/cli";
5
7
  /** Canonical mapping for lifecycle CLI pytest files in scope of story 1838-s3. */
6
8
  export const LIFECYCLE_CLI_COVERAGE_MAP = [
7
9
  {
8
- pythonTest: "tests/cli/test_vbrief_activate.py",
10
+ pythonTest: `${PY_CLI_TESTS}/test_vbrief_activate.py`,
9
11
  tsTarget: "packages/core/src/vbrief-activate/{activate,main,coverage-boost}.test.ts + lifecycle-cli/dispatch-vbrief.test.ts",
10
12
  disposition: "lifecycle-cli-dispatch",
11
13
  wave9Delete: true,
12
14
  notes: "Module matrix in core; deft-ts vbrief-activate argv/exit in lifecycle-cli.",
13
15
  },
14
16
  {
15
- pythonTest: "tests/cli/test_vbrief_fidelity_legacy.py",
17
+ pythonTest: `${PY_CLI_TESTS}/test_vbrief_fidelity_legacy.py`,
16
18
  tsTarget: "packages/core/src/vbrief-validation/fidelity.test.ts",
17
19
  disposition: "existing-coverage",
18
20
  wave9Delete: true,
19
21
  notes: "Legacy fidelity normalization covered in TS vbrief-validation module.",
20
22
  },
21
23
  {
22
- pythonTest: "tests/cli/test_vbrief_migrate_conformance.py",
24
+ pythonTest: `${PY_CLI_TESTS}/test_vbrief_migrate_conformance.py`,
23
25
  tsTarget: "packages/core/src/vbrief-validate/main.test.ts (scanVbrief/conformance)",
24
26
  disposition: "existing-coverage",
25
27
  wave9Delete: true,
26
28
  notes: "Conformance scan parity in vbrief-validate TS port.",
27
29
  },
28
30
  {
29
- pythonTest: "tests/cli/test_vbrief_preflight_resolver.py",
31
+ pythonTest: `${PY_CLI_TESTS}/test_vbrief_preflight_resolver.py`,
30
32
  tsTarget: "packages/cli/src/vbrief-preflight.test.ts + lifecycle-cli/dispatch-preflight.test.ts",
31
33
  disposition: "lifecycle-cli-dispatch",
32
34
  wave9Delete: false,
33
35
  notes: "Install-layout resolver still Python-only; TS preflight gate + dispatcher alias covered.",
34
36
  },
35
37
  {
36
- pythonTest: "tests/cli/test_vbrief_reconcile_graph.py",
38
+ pythonTest: `${PY_CLI_TESTS}/test_vbrief_reconcile_graph.py`,
37
39
  tsTarget: "packages/core/src/vbrief-reconcile/graph.test.ts",
38
40
  disposition: "existing-coverage",
39
41
  wave9Delete: true,
40
42
  notes: "Dependency-graph promotion logic in TS vbrief-reconcile.",
41
43
  },
42
44
  {
43
- pythonTest: "tests/cli/test_vbrief_reconcile_labels.py",
45
+ pythonTest: `${PY_CLI_TESTS}/test_vbrief_reconcile_labels.py`,
44
46
  tsTarget: "packages/core/src/vbrief-reconcile/labels.test.ts",
45
47
  disposition: "existing-coverage",
46
48
  wave9Delete: true,
47
49
  notes: "Label/status derivation covered in TS reconcile engine.",
48
50
  },
49
51
  {
50
- pythonTest: "tests/cli/test_vbrief_reconcile_umbrellas.py",
52
+ pythonTest: `${PY_CLI_TESTS}/test_vbrief_reconcile_umbrellas.py`,
51
53
  tsTarget: "packages/core/src/vbrief-reconcile/umbrellas.test.ts",
52
54
  disposition: "existing-coverage",
53
55
  wave9Delete: true,
54
56
  notes: "Umbrella current-shape render/parse in TS.",
55
57
  },
56
58
  {
57
- pythonTest: "tests/cli/test_vbrief_reconciliation.py",
59
+ pythonTest: `${PY_CLI_TESTS}/test_vbrief_reconciliation.py`,
58
60
  tsTarget: "packages/core/src/vbrief-reconcile/reconciliation.test.ts",
59
61
  disposition: "existing-coverage",
60
62
  wave9Delete: true,
61
63
  notes: "Override reconciliation table covered in TS.",
62
64
  },
63
65
  {
64
- pythonTest: "tests/cli/test_vbrief_routing.py",
66
+ pythonTest: `${PY_CLI_TESTS}/test_vbrief_routing.py`,
65
67
  tsTarget: "packages/core/src/vbrief-build/routing.test.ts",
66
68
  disposition: "existing-coverage",
67
69
  wave9Delete: true,
68
70
  notes: "Status↔folder routing map in TS vbrief-build.",
69
71
  },
70
72
  {
71
- pythonTest: "tests/cli/test_vbrief_validate.py",
73
+ pythonTest: `${PY_CLI_TESTS}/test_vbrief_validate.py`,
72
74
  tsTarget: "packages/core/src/vbrief-validate/main.test.ts",
73
75
  disposition: "lifecycle-cli-dispatch",
74
76
  wave9Delete: true,
75
77
  notes: "validateAll matrix in core; deft-ts vbrief-validate argv in lifecycle-cli.",
76
78
  },
77
79
  {
78
- pythonTest: "tests/cli/test_vbrief_validate_direct.py",
80
+ pythonTest: `${PY_CLI_TESTS}/test_vbrief_validate_direct.py`,
79
81
  tsTarget: "packages/core/src/vbrief-validate/branches.test.ts",
80
82
  disposition: "existing-coverage",
81
83
  wave9Delete: true,
82
84
  notes: "Direct validate orchestration branches in TS.",
83
85
  },
84
86
  {
85
- pythonTest: "tests/cli/test_vbrief_validate_direct_orchestration.py",
87
+ pythonTest: `${PY_CLI_TESTS}/test_vbrief_validate_direct_orchestration.py`,
86
88
  tsTarget: "packages/core/src/vbrief-validate/branches.test.ts",
87
89
  disposition: "existing-coverage",
88
90
  wave9Delete: true,
89
91
  notes: "Reference/orchestration warnings in TS validate-all.",
90
92
  },
91
93
  {
92
- pythonTest: "tests/cli/test_vbrief_validate_issue_536.py",
94
+ pythonTest: `${PY_CLI_TESTS}/test_vbrief_validate_issue_536.py`,
93
95
  tsTarget: "packages/core/src/vbrief-validate/branches.test.ts",
94
96
  disposition: "existing-coverage",
95
97
  wave9Delete: true,
96
98
  notes: "x-vbrief/github-issue reference counting in TS.",
97
99
  },
98
100
  {
99
- pythonTest: "tests/cli/test_vbrief_validation.py",
101
+ pythonTest: `${PY_CLI_TESTS}/test_vbrief_validation.py`,
100
102
  tsTarget: "packages/core/src/vbrief-validation/validation.test.ts",
101
103
  disposition: "lifecycle-cli-dispatch",
102
104
  wave9Delete: true,
103
105
  notes: "Slug/title normalization in core; deft-ts vbrief-validation argv in lifecycle-cli.",
104
106
  },
105
107
  {
106
- pythonTest: "tests/cli/test_scope_decompose.py",
108
+ pythonTest: `${PY_CLI_TESTS}/test_scope_decompose.py`,
107
109
  tsTarget: "packages/core/src/scope/decomposed-refs.test.ts",
108
110
  disposition: "python-oracle",
109
111
  wave9Delete: false,
110
112
  notes: "scope:decompose CLI still Python; unit helpers partially covered in decomposed-refs TS.",
111
113
  },
112
114
  {
113
- pythonTest: "tests/cli/test_scope_decompose_unit.py",
115
+ pythonTest: `${PY_CLI_TESTS}/test_scope_decompose_unit.py`,
114
116
  tsTarget: "packages/core/src/scope/decomposed-refs.test.ts",
115
117
  disposition: "existing-coverage",
116
118
  wave9Delete: false,
117
119
  notes: "Pure decomposition helpers; CLI entry remains Python until Wave 9.",
118
120
  },
119
121
  {
120
- pythonTest: "tests/cli/test_scope_demote.py",
122
+ pythonTest: `${PY_CLI_TESTS}/test_scope_demote.py`,
121
123
  tsTarget: "packages/core/src/scope/demote.test.ts",
122
124
  disposition: "lifecycle-cli-dispatch",
123
125
  wave9Delete: true,
124
126
  notes: "Demote transitions in core; deft-ts scope-lifecycle argv in lifecycle-cli.",
125
127
  },
126
128
  {
127
- pythonTest: "tests/cli/test_scope_lifecycle.py",
129
+ pythonTest: `${PY_CLI_TESTS}/test_scope_lifecycle.py`,
128
130
  tsTarget: "packages/core/src/scope/{main,transition,scope-exhaustive}.test.ts",
129
131
  disposition: "lifecycle-cli-dispatch",
130
132
  wave9Delete: true,
131
133
  notes: "Promote/activate/complete matrix in core; scope-lifecycle dispatcher in lifecycle-cli.",
132
134
  },
133
135
  {
134
- pythonTest: "tests/cli/test_scope_undo.py",
136
+ pythonTest: `${PY_CLI_TESTS}/test_scope_undo.py`,
135
137
  tsTarget: "packages/core/src/scope/undo.test.ts",
136
138
  disposition: "existing-coverage",
137
139
  wave9Delete: true,
138
140
  notes: "Undo round-trip covered in TS scope module.",
139
141
  },
140
142
  {
141
- pythonTest: "tests/cli/test_issue_emit.py",
143
+ pythonTest: `${PY_CLI_TESTS}/test_issue_emit.py`,
142
144
  tsTarget: "packages/core/src/intake/issue-emit.test.ts",
143
145
  disposition: "lifecycle-cli-dispatch",
144
146
  wave9Delete: true,
145
147
  notes: "Emit body/render in core; deft-ts issue-emit argv in lifecycle-cli.",
146
148
  },
147
149
  {
148
- pythonTest: "tests/cli/test_issue_ingest.py",
150
+ pythonTest: `${PY_CLI_TESTS}/test_issue_ingest.py`,
149
151
  tsTarget: "packages/core/src/intake/{issue-ingest,intake-cli-and-branches}.test.ts + lifecycle-cli/dispatch-intake.test.ts",
150
152
  disposition: "lifecycle-cli-dispatch",
151
153
  wave9Delete: true,
152
154
  notes: "Ingest happy-path/duplicate in core; dispatcher routing in lifecycle-cli.",
153
155
  },
154
156
  {
155
- pythonTest: "tests/cli/test_issue_ingest_body_parsing.py",
157
+ pythonTest: `${PY_CLI_TESTS}/test_issue_ingest_body_parsing.py`,
156
158
  tsTarget: "packages/core/src/intake/markdown-scanners.test.ts",
157
159
  disposition: "existing-coverage",
158
160
  wave9Delete: true,
159
161
  notes: "Checkbox/AC body scanners in TS intake module.",
160
162
  },
161
163
  {
162
- pythonTest: "tests/cli/test_issue_ingest_canonical_refs.py",
164
+ pythonTest: `${PY_CLI_TESTS}/test_issue_ingest_canonical_refs.py`,
163
165
  tsTarget: "packages/core/src/intake/issue-ingest.test.ts",
164
166
  disposition: "existing-coverage",
165
167
  wave9Delete: true,
166
168
  notes: "v0.6 canonical reference shape in TS ingest.",
167
169
  },
168
170
  {
169
- pythonTest: "tests/cli/test_issue_ingest_direct.py",
171
+ pythonTest: `${PY_CLI_TESTS}/test_issue_ingest_direct.py`,
170
172
  tsTarget: "packages/core/src/intake/intake-coverage-boost.test.ts",
171
173
  disposition: "existing-coverage",
172
174
  wave9Delete: true,
173
175
  notes: "Repo URL / gh helper branches in TS intake.",
174
176
  },
175
177
  {
176
- pythonTest: "tests/cli/test_issue_ingest_escape_corruption.py",
178
+ pythonTest: `${PY_CLI_TESTS}/test_issue_ingest_escape_corruption.py`,
177
179
  tsTarget: "packages/core/src/intake/intake-cli-and-branches.test.ts",
178
180
  disposition: "existing-coverage",
179
181
  wave9Delete: true,
180
182
  notes: "Literal escape preservation in TS ingest path.",
181
183
  },
182
184
  {
183
- pythonTest: "tests/cli/test_reconcile_issues.py",
185
+ pythonTest: `${PY_CLI_TESTS}/test_reconcile_issues.py`,
184
186
  tsTarget: "packages/core/src/intake/reconcile-issues.test.ts",
185
187
  disposition: "lifecycle-cli-dispatch",
186
188
  wave9Delete: true,
187
189
  notes: "Reconcile classification in core; deft-ts reconcile-issues argv in lifecycle-cli.",
188
190
  },
189
191
  {
190
- pythonTest: "tests/cli/test_reconcile_issues_754.py",
192
+ pythonTest: `${PY_CLI_TESTS}/test_reconcile_issues_754.py`,
191
193
  tsTarget: "packages/core/src/intake/reconcile-issues.test.ts",
192
194
  disposition: "existing-coverage",
193
195
  wave9Delete: true,
194
196
  notes: "Batch gh state fetch (>500) in TS reconcile module.",
195
197
  },
196
198
  {
197
- pythonTest: "tests/cli/test_reconcile_issues_apply.py",
199
+ pythonTest: `${PY_CLI_TESTS}/test_reconcile_issues_apply.py`,
198
200
  tsTarget: "packages/core/src/intake/reconcile-issues.test.ts",
199
201
  disposition: "existing-coverage",
200
202
  wave9Delete: true,
201
203
  notes: "Apply/move section-C entries in TS reconcile.",
202
204
  },
203
205
  {
204
- pythonTest: "tests/cli/test_reconcile_issues_direct.py",
206
+ pythonTest: `${PY_CLI_TESTS}/test_reconcile_issues_direct.py`,
205
207
  tsTarget: "packages/core/src/intake/intake-coverage-boost.test.ts",
206
208
  disposition: "existing-coverage",
207
209
  wave9Delete: true,
208
210
  notes: "gh subprocess error branches in TS reconcile helpers.",
209
211
  },
210
212
  {
211
- pythonTest: "tests/cli/test_preflight_architecture_sor.py",
213
+ pythonTest: `${PY_CLI_TESTS}/test_preflight_architecture_sor.py`,
212
214
  tsTarget: "python-oracle (scripts/preflight_architecture_sor.py)",
213
215
  disposition: "python-oracle",
214
216
  wave9Delete: false,
215
217
  notes: "Architecture SOR preflight not yet on deft-ts; stays Python until TS port.",
216
218
  },
217
219
  {
218
- pythonTest: "tests/cli/test_preflight_branch.py",
220
+ pythonTest: `${PY_CLI_TESTS}/test_preflight_branch.py`,
219
221
  tsTarget: "packages/core/src/branch/evaluate.test.ts + packages/cli/src/verify-branch.test.ts + lifecycle-cli/dispatch-preflight.test.ts",
220
222
  disposition: "lifecycle-cli-dispatch",
221
223
  wave9Delete: true,
222
224
  notes: "Branch gate in core/cli; verify-branch + vbrief:preflight alias via dispatcher.",
223
225
  },
224
226
  {
225
- pythonTest: "tests/cli/test_preflight_cache.py",
227
+ pythonTest: `${PY_CLI_TESTS}/test_preflight_cache.py`,
226
228
  tsTarget: "python-oracle (scripts/preflight_cache.py)",
227
229
  disposition: "python-oracle",
228
230
  wave9Delete: false,
229
231
  notes: "verify:cache-fresh still Python-only per Wave 8 notes; TS cache module covers fetch not preflight gate.",
230
232
  },
231
233
  {
232
- pythonTest: "tests/cli/test_preflight_gh.py",
234
+ pythonTest: `${PY_CLI_TESTS}/test_preflight_gh.py`,
233
235
  tsTarget: "python-oracle (scripts/preflight_gh.py)",
234
236
  disposition: "python-oracle",
235
237
  wave9Delete: false,
236
238
  notes: "Destructive gh preflight still Python-only; intake github-auth-modes partially overlaps read paths.",
237
239
  },
238
240
  {
239
- pythonTest: "tests/cli/test_preflight_implementation.py",
241
+ pythonTest: `${PY_CLI_TESTS}/test_preflight_implementation.py`,
240
242
  tsTarget: "packages/core/src/preflight/evaluate.test.ts + packages/cli/src/vbrief-preflight.test.ts + lifecycle-cli/dispatch-preflight.test.ts",
241
243
  disposition: "lifecycle-cli-dispatch",
242
244
  wave9Delete: true,
243
245
  notes: "#810 state matrix in core; vbrief:preflight / vbrief-preflight dispatcher in lifecycle-cli.",
244
246
  },
245
247
  {
246
- pythonTest: "tests/cli/test_preflight_story_start.py",
248
+ pythonTest: `${PY_CLI_TESTS}/test_preflight_story_start.py`,
247
249
  tsTarget: "packages/core/src/story-ready/evaluate.test.ts + packages/cli/src/verify-story-ready.test.ts + lifecycle-cli/dispatch-preflight.test.ts",
248
250
  disposition: "lifecycle-cli-dispatch",
249
251
  wave9Delete: true,
package/dist/migrate.js CHANGED
@@ -3,9 +3,13 @@
3
3
  * Bumps the committed schema marker and runs supported vbrief→xbrief migration.
4
4
  */
5
5
  import { existsSync, readFileSync } from "node:fs";
6
- import { join } from "node:path";
6
+ import { join, resolve } from "node:path";
7
7
  import { ContainedWriteError, containedWrite, } from "../vendor/directive-core/dist/fs/contained-write.js";
8
8
  import { detectLegacyVbriefLayout, detectXbriefConvergence, runXbriefMigration, } from "../vendor/directive-core/dist/xbrief-migrate/index.js";
9
+ /** Normalize caller roots (including relative `--root app`) before path probes. */
10
+ function absoluteProjectRoot(projectRoot) {
11
+ return resolve(projectRoot);
12
+ }
9
13
  export const DATA_SCHEMA_MARKER_REL = ".deft/directive/data-schema.json";
10
14
  /** YOLO initial supported schema version recorded by migrate. */
11
15
  export const CURRENT_DATA_SCHEMA_VERSION = 1;
@@ -47,16 +51,19 @@ function emptyResult(from, root, message) {
47
51
  * Marker currency alone is insufficient — unmigrated vbrief/ must stay behind.
48
52
  */
49
53
  export function projectNeedsXbriefMigration(projectRoot) {
50
- const convergence = detectXbriefConvergence(projectRoot);
54
+ const root = absoluteProjectRoot(projectRoot);
55
+ const convergence = detectXbriefConvergence(root);
51
56
  if (convergence.state === "legacy-only" ||
52
57
  convergence.state === "dual-populated" ||
53
58
  convergence.state === "empty-vbrief") {
54
59
  return true;
55
60
  }
61
+ // Marked vbrief/ retention is intentional; probe residual under xbrief/ only
62
+ // (skipLegacyRoot) so we never parse reason-string paths.
56
63
  if (convergence.state === "xbrief-marker") {
57
- return false;
64
+ return detectLegacyVbriefLayout(root, { skipLegacyRoot: true }).legacyLayout;
58
65
  }
59
- return detectLegacyVbriefLayout(projectRoot).legacyLayout;
66
+ return detectLegacyVbriefLayout(root).legacyLayout;
60
67
  }
61
68
  function applyXbriefMigration(root) {
62
69
  if (!projectNeedsXbriefMigration(root)) {
@@ -74,9 +81,7 @@ function applyXbriefMigration(root) {
74
81
  migrated: [...outcome.migratedPaths],
75
82
  archived: [...outcome.archivedPaths],
76
83
  message: `xbrief migrate: ${outcome.migratedPaths.length} migrated` +
77
- (outcome.archivedPaths.length > 0
78
- ? `, ${outcome.archivedPaths.length} archived`
79
- : ""),
84
+ (outcome.archivedPaths.length > 0 ? `, ${outcome.archivedPaths.length} archived` : ""),
80
85
  };
81
86
  case "rewritten":
82
87
  return {
package/dist/policy.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { type CeremonyDepth, type HookHost, type SpecGuardEnforcement } from "@deftai/directive-core/policy";
2
+ import { type CeremonyDepth, type CoverageMode, type HookHost, type SpecGuardEnforcement } from "@deftai/directive-core/policy";
3
3
  interface ShowArgs {
4
4
  format: "text" | "json";
5
5
  changedOnly: boolean;
@@ -8,7 +8,7 @@ interface ShowArgs {
8
8
  error?: string;
9
9
  }
10
10
  interface SetArgs {
11
- cmd: "show" | "enforce-branches" | "allow-direct-commits" | "allow-destructive-gh-verbs" | "enforce-destructive-gh-verbs" | "allow-bot-merge" | "enable-value-feedback" | "clear-value-feedback" | "set-ceremony-dial" | "set-spec-guard-enforcement" | "disable-host-hooks" | "disable-directive" | "enable-directive" | "resolve";
11
+ cmd: "show" | "enforce-branches" | "allow-direct-commits" | "allow-destructive-gh-verbs" | "enforce-destructive-gh-verbs" | "allow-bot-merge" | "enable-value-feedback" | "clear-value-feedback" | "set-ceremony-dial" | "set-coverage-mode" | "set-spec-guard-enforcement" | "disable-host-hooks" | "disable-directive" | "enable-directive" | "resolve";
12
12
  confirm: boolean;
13
13
  actor: string;
14
14
  note: string;
@@ -21,6 +21,8 @@ interface SetArgs {
21
21
  ceremonyOverride?: CeremonyDepth | null;
22
22
  /** #3214 ceremony dial enabled flag for set-ceremony-dial. */
23
23
  ceremonyEnabled?: boolean;
24
+ /** #5791 coverageMode target for set-coverage-mode. */
25
+ coverageMode?: CoverageMode;
24
26
  /** #5350 driftGuard.enforcement target for set-spec-guard-enforcement. */
25
27
  specGuardEnforcement?: SpecGuardEnforcement;
26
28
  /** #4375 audited setter for valueFeedback.upstreamPrompt. */
package/dist/policy.js CHANGED
@@ -6,7 +6,7 @@
6
6
  import { existsSync } from "node:fs";
7
7
  import { resolve as pathResolve, relative } from "node:path";
8
8
  import { fileURLToPath } from "node:url";
9
- import { ALLOW_BOT_MERGE_CAPABILITY_COST, ALLOW_DESTRUCTIVE_GH_VERBS_CAPABILITY_COST, CEREMONY_DEPTHS, clearValueFeedback, createNoDeftDirectiveFlag, describeShadowedPlanExtension, detectNoDeftDirective, detectShadowedPlanExtensions, disableHostHooks, disclosureLine, enableValueFeedback, FIELD_VALUE_FEEDBACK, FIELD_VALUE_FEEDBACK_CLI_ALIAS, formatValueFeedbackStatusLine, humanMergeDisclosureLine, inspectAllPolicies, inspectOnePolicy, loadProjectDefinition, NO_DEFT_DIRECTIVE_DISABLED_MESSAGE, NO_DEFT_DIRECTIVE_FLAG_NAME, NO_DEFT_DIRECTIVE_INCONSISTENT_MESSAGE, POLICY_AUDIT_NOOP_STDOUT, parseHookHost, policyColonInvocation, projectDefinitionPath, promoteSpecGuardDriftEnforcement, pythonListRepr, pythonStringRepr, registeredPolicyNames, removeNoDeftDirectiveFlag, renderJson, renderText, resolveHumanMergePolicy, resolvePolicy, resolveValueFeedback, SPEC_GUARD_ENFORCEMENTS, setAllowDestructiveGhVerbs, setCeremonyDial, setPolicy, setRequireHumanMerge, } from "../vendor/directive-core/dist/policy/index.js";
9
+ import { ALLOW_BOT_MERGE_CAPABILITY_COST, ALLOW_DESTRUCTIVE_GH_VERBS_CAPABILITY_COST, CEREMONY_DEPTHS, COVERAGE_MODES, clearValueFeedback, createNoDeftDirectiveFlag, describeShadowedPlanExtension, detectNoDeftDirective, detectShadowedPlanExtensions, disableHostHooks, disclosureLine, enableValueFeedback, FIELD_VALUE_FEEDBACK, FIELD_VALUE_FEEDBACK_CLI_ALIAS, formatValueFeedbackStatusLine, humanMergeDisclosureLine, inspectAllPolicies, inspectOnePolicy, loadProjectDefinition, NO_DEFT_DIRECTIVE_DISABLED_MESSAGE, NO_DEFT_DIRECTIVE_FLAG_NAME, NO_DEFT_DIRECTIVE_INCONSISTENT_MESSAGE, POLICY_AUDIT_NOOP_STDOUT, parseHookHost, policyColonInvocation, projectDefinitionPath, promoteSpecGuardDriftEnforcement, pythonListRepr, pythonStringRepr, registeredPolicyNames, removeNoDeftDirectiveFlag, renderJson, renderText, resolveHumanMergePolicy, resolvePolicy, resolveValueFeedback, SPEC_GUARD_ENFORCEMENTS, setAllowDestructiveGhVerbs, setCeremonyDial, setCoverageMode, setPolicy, setRequireHumanMerge, } from "../vendor/directive-core/dist/policy/index.js";
10
10
  const CAPABILITY_COST_DISCLOSURE = "\u26a0 Capability-cost disclosure -- enabling direct commits to the default " +
11
11
  "branch turns OFF the deft branch-protection policy.\n" +
12
12
  " \u2022 Pre-commit + pre-push hooks will no longer block default-branch " +
@@ -114,10 +114,87 @@ export function parseShowArgs(argv) {
114
114
  /** Parse argv for the policy CLI (show + set subcommands). */
115
115
  export function parseArgs(argv) {
116
116
  if (argv.length === 0) {
117
- const usage = "usage: policy [show|enforce-branches|allow-direct-commits|allow-destructive-gh-verbs|enforce-destructive-gh-verbs|allow-bot-merge|enable-value-feedback|clear-value-feedback|set-ceremony-dial|set-spec-guard-enforcement|disable-host-hooks|disable-directive|enable-directive|resolve] ...";
117
+ const usage = "usage: policy [show|enforce-branches|allow-direct-commits|allow-destructive-gh-verbs|enforce-destructive-gh-verbs|allow-bot-merge|enable-value-feedback|clear-value-feedback|set-ceremony-dial|set-coverage-mode|set-spec-guard-enforcement|disable-host-hooks|disable-directive|enable-directive|resolve] ...";
118
118
  return makeSetError(usage);
119
119
  }
120
120
  const cmd = argv[0];
121
+ if (cmd === "set-coverage-mode") {
122
+ let confirm = false;
123
+ let actor = policyColonInvocation("set-coverage-mode");
124
+ let note = "";
125
+ let projectRoot = ".";
126
+ let coverageMode;
127
+ for (let i = 1; i < argv.length; i += 1) {
128
+ const arg = argv[i];
129
+ if (arg === "--confirm") {
130
+ confirm = true;
131
+ }
132
+ else if (arg === "--actor") {
133
+ const v = argv[i + 1];
134
+ if (v === undefined)
135
+ return makeSetError("argument --actor: expected one argument");
136
+ actor = v;
137
+ i += 1;
138
+ }
139
+ else if (arg?.startsWith("--actor=")) {
140
+ actor = arg.slice("--actor=".length);
141
+ }
142
+ else if (arg === "--note") {
143
+ const v = argv[i + 1];
144
+ if (v === undefined)
145
+ return makeSetError("argument --note: expected one argument");
146
+ note = v;
147
+ i += 1;
148
+ }
149
+ else if (arg?.startsWith("--note=")) {
150
+ note = arg.slice("--note=".length);
151
+ }
152
+ else if (arg === "--mode") {
153
+ const v = argv[i + 1];
154
+ if (v === undefined) {
155
+ return makeSetError("argument --mode: expected initial|disabled|full");
156
+ }
157
+ if (!COVERAGE_MODES.includes(v)) {
158
+ return makeSetError("argument --mode: expected initial|disabled|full, got " + JSON.stringify(v));
159
+ }
160
+ coverageMode = v;
161
+ i += 1;
162
+ }
163
+ else if (arg?.startsWith("--mode=")) {
164
+ const v = arg.slice("--mode=".length);
165
+ if (!COVERAGE_MODES.includes(v)) {
166
+ return makeSetError("argument --mode: expected initial|disabled|full, got " + JSON.stringify(v));
167
+ }
168
+ coverageMode = v;
169
+ }
170
+ else if (arg === "--project-root") {
171
+ const v = argv[i + 1];
172
+ if (v === undefined)
173
+ return makeSetError("argument --project-root: expected one argument");
174
+ projectRoot = v;
175
+ i += 1;
176
+ }
177
+ else if (arg?.startsWith("--project-root=")) {
178
+ projectRoot = arg.slice("--project-root=".length);
179
+ }
180
+ else if (arg === "--") {
181
+ }
182
+ else {
183
+ return makeSetError("unrecognized argument: " + arg);
184
+ }
185
+ }
186
+ return {
187
+ cmd: "set-coverage-mode",
188
+ confirm,
189
+ actor,
190
+ note,
191
+ projectRoot,
192
+ format: "text",
193
+ changedOnly: false,
194
+ field: null,
195
+ coverageMode,
196
+ };
197
+ }
121
198
  if (cmd === "set-spec-guard-enforcement") {
122
199
  let confirm = false;
123
200
  let actor = policyColonInvocation("set-spec-guard-enforcement");
@@ -691,6 +768,9 @@ export function run(argv) {
691
768
  if (args.cmd === "set-ceremony-dial") {
692
769
  return runSetCeremonyDial(args);
693
770
  }
771
+ if (args.cmd === "set-coverage-mode") {
772
+ return runSetCoverageMode(args);
773
+ }
694
774
  if (args.cmd === "set-spec-guard-enforcement") {
695
775
  return runSetSpecGuardEnforcement(args);
696
776
  }
@@ -720,6 +800,25 @@ function runSetSpecGuardEnforcement(args) {
720
800
  process.stdout.write(result.stdout);
721
801
  return result.exitCode;
722
802
  }
803
+ /** Persist plan.policy.coverageMode (#5791). */
804
+ function runSetCoverageMode(args) {
805
+ const root = pathResolve(args.projectRoot);
806
+ if (args.coverageMode === undefined) {
807
+ process.stdout.write("usage: policy set-coverage-mode -- --mode initial|disabled|full [--confirm] [--project-root PATH]\n" +
808
+ " Inspect: " +
809
+ policyColonInvocation("show", " --field=coverageMode") +
810
+ "\n");
811
+ return 1;
812
+ }
813
+ const result = setCoverageMode(root, {
814
+ mode: args.coverageMode,
815
+ confirm: args.confirm,
816
+ actor: args.actor,
817
+ note: args.note,
818
+ });
819
+ process.stdout.write(result.stdout);
820
+ return result.exitCode;
821
+ }
723
822
  /** Persist plan.policy.ceremonyDial override/enabled (#3214). */
724
823
  function runSetCeremonyDial(args) {
725
824
  const root = pathResolve(args.projectRoot);
@@ -29,6 +29,8 @@ interface ParsedArgs {
29
29
  markComplete: boolean;
30
30
  skillOpen: boolean;
31
31
  evaluate: boolean;
32
+ pushAdmit: boolean;
33
+ projectRoot: string | null;
32
34
  json: boolean;
33
35
  help: boolean;
34
36
  error?: string;
@@ -4,7 +4,9 @@
4
4
  * `deft pre-pr:run` starts the prescribed workflow. Opening the skill file
5
5
  * is not completion. Generic mark-complete cannot mint a pass.
6
6
  */
7
+ import { readFileSync } from "node:fs";
7
8
  import { completeRun, computeControllerObservedHash, controllerPublisher, digestApprovedCriteria, evaluateLivePrePrCheck, getDefaultPrePrStore, markComplete, noteSkillFileOpen, observeCommandPhase, PRE_PR_PHASE_IDS, phaseSpec, resolveRecordFromStore, startControllerRun, submitReviewerReport, } from "../vendor/directive-core/dist/pre-pr-controller/index.js";
9
+ import { evaluatePrePush, parsePrePushStdin } from "../vendor/directive-core/dist/preflight/index.js";
8
10
  import { isDirectEntrypoint } from "./entrypoint.js";
9
11
  const USAGE = `Usage: deft pre-pr:run [options]
10
12
 
@@ -42,6 +44,8 @@ Options:
42
44
  --mark-complete always refuses; cannot mint a pass
43
45
  --skill-open always refuses; opening the skill is not completion
44
46
  --evaluate evaluate live binding against the private store
47
+ --push-admit enrolled push admission (#5804); reads pre-push stdin
48
+ --project-root <path> project root for --push-admit / store resolution
45
49
  --json
46
50
  --help
47
51
  `;
@@ -76,6 +80,8 @@ export function parseArgs(argv) {
76
80
  markComplete: false,
77
81
  skillOpen: false,
78
82
  evaluate: false,
83
+ pushAdmit: false,
84
+ projectRoot: null,
79
85
  json: false,
80
86
  help: false,
81
87
  };
@@ -205,6 +211,18 @@ export function parseArgs(argv) {
205
211
  else if (arg === "--evaluate") {
206
212
  parsed.evaluate = true;
207
213
  }
214
+ else if (arg === "--push-admit") {
215
+ parsed.pushAdmit = true;
216
+ }
217
+ else if (arg === "--project-root" || arg?.startsWith("--project-root=")) {
218
+ const value = arg === "--project-root" ? argv[i + 1] : arg.slice("--project-root=".length);
219
+ if (value === undefined) {
220
+ return { ...parsed, error: "argument --project-root: expected one argument" };
221
+ }
222
+ parsed.projectRoot = value;
223
+ if (arg === "--project-root")
224
+ i += 1;
225
+ }
208
226
  else if (arg === "--repo" || arg?.startsWith("--repo=")) {
209
227
  const value = arg === "--repo" ? argv[i + 1] : arg.slice("--repo=".length);
210
228
  if (value === undefined)
@@ -346,6 +364,27 @@ export function run(argv) {
346
364
  process.stderr.write(`pre_pr_run: ${args.error}\n`);
347
365
  return 2;
348
366
  }
367
+ if (args.pushAdmit) {
368
+ const projectRoot = args.projectRoot?.trim() || process.cwd();
369
+ let rawStdin = "";
370
+ try {
371
+ rawStdin = readFileSync(0, "utf8");
372
+ }
373
+ catch {
374
+ rawStdin = "";
375
+ }
376
+ const refs = parsePrePushStdin(rawStdin);
377
+ const [code, msg] = evaluatePrePush(refs, {
378
+ projectRoot,
379
+ enrolledBoundPrePr: true,
380
+ rawStdin,
381
+ });
382
+ if (code === 0)
383
+ process.stdout.write(`${msg}\n`);
384
+ else
385
+ process.stderr.write(`${msg}\n`);
386
+ return code;
387
+ }
349
388
  if (args.skillOpen) {
350
389
  const d = noteSkillFileOpen();
351
390
  emit(args.json, d, d.message, true);
@@ -377,6 +416,7 @@ export function run(argv) {
377
416
  process.stderr.write("pre_pr_run: --observe-command requires --exit-code\n");
378
417
  return 2;
379
418
  }
419
+ // #5814 / #5791: mode-skip pairs use non-zero exit (lint_iteration exit 5 + LINT_ITERATION_MODE_SKIP).
380
420
  if (args.skipReason !== null && args.skipReason.length > 0 && args.exitCode === 0) {
381
421
  process.stderr.write("pre_pr_run: skip requires a non-zero --exit-code plus --skip-reason\n");
382
422
  return 2;
@@ -3,6 +3,6 @@
3
3
  * Runtime owns fs primitives so uninstall and upgrade share one substrate.
4
4
  * Launcher stays dep-free (AC3.1); cli registry only names convert-via-removals.
5
5
  */
6
- export { clearOwnedHookEntries, isUnsafeSubmoduleGitlink, normalizeGitmodules, pruneEmptyAncestors, RemovalStepError, removeCopiedCore, removeDeftFrameworkTree, removeOrphanDeftVersion, removeOwnedSkillPointers, removeSoleAuthorHusks, runStep, stripLegacyLauncherPin, type RemovalStepId, type StepContext, type StepResult, } from "./steps.js";
7
- export { isConvertStrategyFrom, runStrategy, STRATEGIES, strategyForShape, type LayoutStrategy, type StrategyResult, type StrategyShapeId, } from "./strategies.js";
6
+ export { clearOwnedHookEntries, isUnsafeSubmoduleGitlink, normalizeGitmodules, pruneEmptyAncestors, RemovalStepError, type RemovalStepId, removeCopiedCore, removeDeftFrameworkTree, removeOrphanDeftVersion, removeOwnedSkillPointers, removeSoleAuthorHusks, runStep, type StepContext, type StepResult, stripLegacyLauncherPin, } from "./steps.js";
7
+ export { isConvertStrategyFrom, type LayoutStrategy, runStrategy, STRATEGIES, type StrategyResult, type StrategyShapeId, strategyForShape, } from "./strategies.js";
8
8
  //# sourceMappingURL=index.d.ts.map
@@ -4,7 +4,7 @@
4
4
  * Layout steps (core / deft / hooks / skills / gitmodules / orphan): wave 3f.
5
5
  */
6
6
  import { execFileSync } from "node:child_process";
7
- import { existsSync, lstatSync, readdirSync, readFileSync, writeFileSync, } from "node:fs";
7
+ import { existsSync, lstatSync, readdirSync, readFileSync, writeFileSync } from "node:fs";
8
8
  import { dirname, join, sep } from "node:path";
9
9
  import { containedRemove } from "../../vendor/directive-core/dist/fs/contained-write.js";
10
10
  import { CONSUMER_HEADER_PLACEHOLDER_ONELINER, renderConsumerHeader, unmanagedHeaderOneLiner, } from "../../vendor/directive-core/dist/platform/agents-consumer-header.js";
@@ -35,10 +35,7 @@ const HOST_HOOK_RELS = [
35
35
  ".codex/hooks.json",
36
36
  ".grok/hooks/deft.json",
37
37
  ];
38
- const DIRECTIVE_PACKAGE_NAMES = new Set([
39
- "@deftai/directive",
40
- "@deftai/directive-runtime",
41
- ]);
38
+ const DIRECTIVE_PACKAGE_NAMES = new Set(["@deftai/directive", "@deftai/directive-runtime"]);
42
39
  const GITIGNORE_SEED_LINES = new Set([
43
40
  "node_modules/",
44
41
  "node_modules",
@@ -215,7 +212,9 @@ function isNearEmptyLockfile(abs) {
215
212
  return true;
216
213
  if (abs.endsWith("pnpm-lock.yaml")) {
217
214
  // Near-empty pnpm lock: no package snapshots beyond lockfileVersion / settings.
218
- if (!/^\s*[^#\s].*:/m.test(trimmed.replace(/^lockfileVersion:.*$/m, "").replace(/^settings:[\s\S]*?(?=\n\S|\n*$)/m, ""))) {
215
+ if (!/^\s*[^#\s].*:/m.test(trimmed
216
+ .replace(/^lockfileVersion:.*$/m, "")
217
+ .replace(/^settings:[\s\S]*?(?=\n\S|\n*$)/m, ""))) {
219
218
  return trimmed.length < 200;
220
219
  }
221
220
  if (/importers:\s*\n\s*\.:\s*\n\s*(?:dependencies|devDependencies):\s*\n\s*\{\s*\}/.test(trimmed)) {
@@ -656,9 +655,7 @@ export function normalizeGitmodules(root) {
656
655
  export function runStep(stepId, ctx) {
657
656
  switch (stepId) {
658
657
  case "pruneEmptyAncestors": {
659
- const seeds = ctx.emptiedFrom !== undefined
660
- ? [ctx.emptiedFrom]
661
- : [...(ctx.priorRemoved ?? [])];
658
+ const seeds = ctx.emptiedFrom !== undefined ? [ctx.emptiedFrom] : [...(ctx.priorRemoved ?? [])];
662
659
  if (seeds.length === 0) {
663
660
  // Standalone call still requires a seed (uninstall / unit API).
664
661
  throw new Error("pruneEmptyAncestors requires ctx.emptiedFrom or ctx.priorRemoved");
@@ -2,7 +2,7 @@
2
2
  * WAVE3-V2 layout strategies — fixed table of ordered removal step ids.
3
3
  * Bookends dispatch detect → strategy; bulk logic stays in steps (smell test).
4
4
  */
5
- import { RemovalStepError, runStep, } from "./steps.js";
5
+ import { RemovalStepError, runStep } from "./steps.js";
6
6
  const CONVERT_SHAPE_IDS = new Set([
7
7
  "vendored-core-go",
8
8
  "go-tarball-deft-root",