dorfl 0.0.0 → 0.1.1

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 (619) hide show
  1. package/dist/advance-ci-template.d.ts +73 -0
  2. package/dist/advance-ci-template.d.ts.map +1 -0
  3. package/dist/advance-ci-template.js +104 -0
  4. package/dist/advance-ci-template.js.map +1 -0
  5. package/dist/advance-classify.d.ts +132 -0
  6. package/dist/advance-classify.d.ts.map +1 -0
  7. package/dist/advance-classify.js +120 -0
  8. package/dist/advance-classify.js.map +1 -0
  9. package/dist/advance-drivers.d.ts +182 -0
  10. package/dist/advance-drivers.d.ts.map +1 -0
  11. package/dist/advance-drivers.js +231 -0
  12. package/dist/advance-drivers.js.map +1 -0
  13. package/dist/advance-isolated.d.ts +156 -0
  14. package/dist/advance-isolated.d.ts.map +1 -0
  15. package/dist/advance-isolated.js +256 -0
  16. package/dist/advance-isolated.js.map +1 -0
  17. package/dist/advance-lifecycle-template.d.ts +107 -0
  18. package/dist/advance-lifecycle-template.d.ts.map +1 -0
  19. package/dist/advance-lifecycle-template.js +668 -0
  20. package/dist/advance-lifecycle-template.js.map +1 -0
  21. package/dist/advance-loop-driver.d.ts +325 -0
  22. package/dist/advance-loop-driver.d.ts.map +1 -0
  23. package/dist/advance-loop-driver.js +437 -0
  24. package/dist/advance-loop-driver.js.map +1 -0
  25. package/dist/advance-treeless-publish.d.ts +108 -0
  26. package/dist/advance-treeless-publish.d.ts.map +1 -0
  27. package/dist/advance-treeless-publish.js +71 -0
  28. package/dist/advance-treeless-publish.js.map +1 -0
  29. package/dist/advance.d.ts +340 -0
  30. package/dist/advance.d.ts.map +1 -0
  31. package/dist/advance.js +1122 -0
  32. package/dist/advance.js.map +1 -0
  33. package/dist/advancing-lock.d.ts +294 -0
  34. package/dist/advancing-lock.d.ts.map +1 -0
  35. package/dist/advancing-lock.js +594 -0
  36. package/dist/advancing-lock.js.map +1 -0
  37. package/dist/agent-launch.d.ts +79 -0
  38. package/dist/agent-launch.d.ts.map +1 -0
  39. package/dist/agent-launch.js +61 -0
  40. package/dist/agent-launch.js.map +1 -0
  41. package/dist/agent-stop.d.ts +149 -0
  42. package/dist/agent-stop.d.ts.map +1 -0
  43. package/dist/agent-stop.js +307 -0
  44. package/dist/agent-stop.js.map +1 -0
  45. package/dist/apply-decide.d.ts +127 -0
  46. package/dist/apply-decide.d.ts.map +1 -0
  47. package/dist/apply-decide.js +176 -0
  48. package/dist/apply-decide.js.map +1 -0
  49. package/dist/apply-merge-action.d.ts +206 -0
  50. package/dist/apply-merge-action.d.ts.map +1 -0
  51. package/dist/apply-merge-action.js +307 -0
  52. package/dist/apply-merge-action.js.map +1 -0
  53. package/dist/apply-persist.d.ts +174 -0
  54. package/dist/apply-persist.d.ts.map +1 -0
  55. package/dist/apply-persist.js +359 -0
  56. package/dist/apply-persist.js.map +1 -0
  57. package/dist/arbiter.d.ts +120 -0
  58. package/dist/arbiter.d.ts.map +1 -0
  59. package/dist/arbiter.js +255 -0
  60. package/dist/arbiter.js.map +1 -0
  61. package/dist/brand.d.ts +70 -0
  62. package/dist/brand.d.ts.map +1 -0
  63. package/dist/brand.js +84 -0
  64. package/dist/brand.js.map +1 -0
  65. package/dist/buildable-body.d.ts +132 -0
  66. package/dist/buildable-body.d.ts.map +1 -0
  67. package/dist/buildable-body.js +131 -0
  68. package/dist/buildable-body.js.map +1 -0
  69. package/dist/categorise.d.ts +66 -0
  70. package/dist/categorise.d.ts.map +1 -0
  71. package/dist/categorise.js +106 -0
  72. package/dist/categorise.js.map +1 -0
  73. package/dist/claim-cas.d.ts +117 -0
  74. package/dist/claim-cas.d.ts.map +1 -0
  75. package/dist/claim-cas.js +312 -0
  76. package/dist/claim-cas.js.map +1 -0
  77. package/dist/cli-spinner.d.ts +112 -0
  78. package/dist/cli-spinner.d.ts.map +1 -0
  79. package/dist/cli-spinner.js +157 -0
  80. package/dist/cli-spinner.js.map +1 -0
  81. package/dist/cli.d.ts +11 -0
  82. package/dist/cli.d.ts.map +1 -0
  83. package/dist/cli.js +3100 -0
  84. package/dist/cli.js.map +1 -0
  85. package/dist/close-job-template.d.ts +70 -0
  86. package/dist/close-job-template.d.ts.map +1 -0
  87. package/dist/close-job-template.js +180 -0
  88. package/dist/close-job-template.js.map +1 -0
  89. package/dist/close-job.d.ts +95 -0
  90. package/dist/close-job.d.ts.map +1 -0
  91. package/dist/close-job.js +226 -0
  92. package/dist/close-job.js.map +1 -0
  93. package/dist/complete.d.ts +361 -0
  94. package/dist/complete.d.ts.map +1 -0
  95. package/dist/complete.js +885 -0
  96. package/dist/complete.js.map +1 -0
  97. package/dist/concurrency.d.ts +68 -0
  98. package/dist/concurrency.d.ts.map +1 -0
  99. package/dist/concurrency.js +112 -0
  100. package/dist/concurrency.js.map +1 -0
  101. package/dist/config-override.d.ts +76 -0
  102. package/dist/config-override.d.ts.map +1 -0
  103. package/dist/config-override.js +50 -0
  104. package/dist/config-override.js.map +1 -0
  105. package/dist/config.d.ts +668 -0
  106. package/dist/config.d.ts.map +1 -0
  107. package/dist/config.js +241 -0
  108. package/dist/config.js.map +1 -0
  109. package/dist/continue-branch.d.ts +249 -0
  110. package/dist/continue-branch.d.ts.map +1 -0
  111. package/dist/continue-branch.js +389 -0
  112. package/dist/continue-branch.js.map +1 -0
  113. package/dist/cwd-section.d.ts +186 -0
  114. package/dist/cwd-section.d.ts.map +1 -0
  115. package/dist/cwd-section.js +209 -0
  116. package/dist/cwd-section.js.map +1 -0
  117. package/dist/decision-engine.d.ts +170 -0
  118. package/dist/decision-engine.d.ts.map +1 -0
  119. package/dist/decision-engine.js +136 -0
  120. package/dist/decision-engine.js.map +1 -0
  121. package/dist/detect.d.ts +17 -0
  122. package/dist/detect.d.ts.map +1 -0
  123. package/dist/detect.js +118 -0
  124. package/dist/detect.js.map +1 -0
  125. package/dist/do-autopick.d.ts +85 -0
  126. package/dist/do-autopick.d.ts.map +1 -0
  127. package/dist/do-autopick.js +112 -0
  128. package/dist/do-autopick.js.map +1 -0
  129. package/dist/do-config.d.ts +312 -0
  130. package/dist/do-config.d.ts.map +1 -0
  131. package/dist/do-config.js +358 -0
  132. package/dist/do-config.js.map +1 -0
  133. package/dist/do-remote-auto.d.ts +75 -0
  134. package/dist/do-remote-auto.d.ts.map +1 -0
  135. package/dist/do-remote-auto.js +111 -0
  136. package/dist/do-remote-auto.js.map +1 -0
  137. package/dist/do.d.ts +621 -0
  138. package/dist/do.d.ts.map +1 -0
  139. package/dist/do.js +1882 -0
  140. package/dist/do.js.map +1 -0
  141. package/dist/drop-source.d.ts +96 -0
  142. package/dist/drop-source.d.ts.map +1 -0
  143. package/dist/drop-source.js +91 -0
  144. package/dist/drop-source.js.map +1 -0
  145. package/dist/eligibility.d.ts +46 -0
  146. package/dist/eligibility.d.ts.map +1 -0
  147. package/dist/eligibility.js +34 -0
  148. package/dist/eligibility.js.map +1 -0
  149. package/dist/env-config.d.ts +51 -0
  150. package/dist/env-config.d.ts.map +1 -0
  151. package/dist/env-config.js +272 -0
  152. package/dist/env-config.js.map +1 -0
  153. package/dist/failure-cause.d.ts +70 -0
  154. package/dist/failure-cause.d.ts.map +1 -0
  155. package/dist/failure-cause.js +126 -0
  156. package/dist/failure-cause.js.map +1 -0
  157. package/dist/format.d.ts +43 -0
  158. package/dist/format.d.ts.map +1 -0
  159. package/dist/format.js +256 -0
  160. package/dist/format.js.map +1 -0
  161. package/dist/frontmatter.d.ts +208 -0
  162. package/dist/frontmatter.d.ts.map +1 -0
  163. package/dist/frontmatter.js +344 -0
  164. package/dist/frontmatter.js.map +1 -0
  165. package/dist/gate-readiness.d.ts +84 -0
  166. package/dist/gate-readiness.d.ts.map +1 -0
  167. package/dist/gate-readiness.js +103 -0
  168. package/dist/gate-readiness.js.map +1 -0
  169. package/dist/gc.d.ts +165 -0
  170. package/dist/gc.d.ts.map +1 -0
  171. package/dist/gc.js +313 -0
  172. package/dist/gc.js.map +1 -0
  173. package/dist/gh-failure.d.ts +42 -0
  174. package/dist/gh-failure.d.ts.map +1 -0
  175. package/dist/gh-failure.js +49 -0
  176. package/dist/gh-failure.js.map +1 -0
  177. package/dist/git.d.ts +75 -0
  178. package/dist/git.d.ts.map +1 -0
  179. package/dist/git.js +130 -0
  180. package/dist/git.js.map +1 -0
  181. package/dist/github.d.ts +187 -0
  182. package/dist/github.d.ts.map +1 -0
  183. package/dist/github.js +343 -0
  184. package/dist/github.js.map +1 -0
  185. package/dist/harness.d.ts +242 -0
  186. package/dist/harness.d.ts.map +1 -0
  187. package/dist/harness.js +157 -0
  188. package/dist/harness.js.map +1 -0
  189. package/dist/identity.d.ts +167 -0
  190. package/dist/identity.d.ts.map +1 -0
  191. package/dist/identity.js +231 -0
  192. package/dist/identity.js.map +1 -0
  193. package/dist/index.d.ts +147 -0
  194. package/dist/index.d.ts.map +1 -0
  195. package/dist/index.js +76 -0
  196. package/dist/index.js.map +1 -0
  197. package/dist/install-ci-branch-protection.d.ts +147 -0
  198. package/dist/install-ci-branch-protection.d.ts.map +1 -0
  199. package/dist/install-ci-branch-protection.js +166 -0
  200. package/dist/install-ci-branch-protection.js.map +1 -0
  201. package/dist/install-ci-capabilities/advance-lifecycle.d.ts +15 -0
  202. package/dist/install-ci-capabilities/advance-lifecycle.d.ts.map +1 -0
  203. package/dist/install-ci-capabilities/advance-lifecycle.js +28 -0
  204. package/dist/install-ci-capabilities/advance-lifecycle.js.map +1 -0
  205. package/dist/install-ci-capabilities/close-job.d.ts +13 -0
  206. package/dist/install-ci-capabilities/close-job.d.ts.map +1 -0
  207. package/dist/install-ci-capabilities/close-job.js +26 -0
  208. package/dist/install-ci-capabilities/close-job.js.map +1 -0
  209. package/dist/install-ci-capabilities/example-noop.d.ts +16 -0
  210. package/dist/install-ci-capabilities/example-noop.d.ts.map +1 -0
  211. package/dist/install-ci-capabilities/example-noop.js +23 -0
  212. package/dist/install-ci-capabilities/example-noop.js.map +1 -0
  213. package/dist/install-ci-capabilities/intake.d.ts +15 -0
  214. package/dist/install-ci-capabilities/intake.d.ts.map +1 -0
  215. package/dist/install-ci-capabilities/intake.js +28 -0
  216. package/dist/install-ci-capabilities/intake.js.map +1 -0
  217. package/dist/install-ci-capabilities/verify.d.ts +14 -0
  218. package/dist/install-ci-capabilities/verify.d.ts.map +1 -0
  219. package/dist/install-ci-capabilities/verify.js +27 -0
  220. package/dist/install-ci-capabilities/verify.js.map +1 -0
  221. package/dist/install-ci-core.d.ts +446 -0
  222. package/dist/install-ci-core.d.ts.map +1 -0
  223. package/dist/install-ci-core.js +760 -0
  224. package/dist/install-ci-core.js.map +1 -0
  225. package/dist/install-ci-github.d.ts +167 -0
  226. package/dist/install-ci-github.d.ts.map +1 -0
  227. package/dist/install-ci-github.js +315 -0
  228. package/dist/install-ci-github.js.map +1 -0
  229. package/dist/install-ci.d.ts +105 -0
  230. package/dist/install-ci.d.ts.map +1 -0
  231. package/dist/install-ci.js +363 -0
  232. package/dist/install-ci.js.map +1 -0
  233. package/dist/intake-event.d.ts +88 -0
  234. package/dist/intake-event.d.ts.map +1 -0
  235. package/dist/intake-event.js +66 -0
  236. package/dist/intake-event.js.map +1 -0
  237. package/dist/intake-marker.d.ts +95 -0
  238. package/dist/intake-marker.d.ts.map +1 -0
  239. package/dist/intake-marker.js +127 -0
  240. package/dist/intake-marker.js.map +1 -0
  241. package/dist/intake-triage.d.ts +48 -0
  242. package/dist/intake-triage.d.ts.map +1 -0
  243. package/dist/intake-triage.js +95 -0
  244. package/dist/intake-triage.js.map +1 -0
  245. package/dist/intake-trigger-template.d.ts +185 -0
  246. package/dist/intake-trigger-template.d.ts.map +1 -0
  247. package/dist/intake-trigger-template.js +449 -0
  248. package/dist/intake-trigger-template.js.map +1 -0
  249. package/dist/intake.d.ts +569 -0
  250. package/dist/intake.d.ts.map +1 -0
  251. package/dist/intake.js +1628 -0
  252. package/dist/intake.js.map +1 -0
  253. package/dist/integration-core.d.ts +539 -0
  254. package/dist/integration-core.d.ts.map +1 -0
  255. package/dist/integration-core.js +2195 -0
  256. package/dist/integration-core.js.map +1 -0
  257. package/dist/integrator.d.ts +343 -0
  258. package/dist/integrator.d.ts.map +1 -0
  259. package/dist/integrator.js +400 -0
  260. package/dist/integrator.js.map +1 -0
  261. package/dist/isolation.d.ts +219 -0
  262. package/dist/isolation.d.ts.map +1 -0
  263. package/dist/isolation.js +261 -0
  264. package/dist/isolation.js.map +1 -0
  265. package/dist/issue-provider.d.ts +349 -0
  266. package/dist/issue-provider.d.ts.map +1 -0
  267. package/dist/issue-provider.js +360 -0
  268. package/dist/issue-provider.js.map +1 -0
  269. package/dist/item-lock.d.ts +626 -0
  270. package/dist/item-lock.d.ts.map +1 -0
  271. package/dist/item-lock.js +1381 -0
  272. package/dist/item-lock.js.map +1 -0
  273. package/dist/item-path.d.ts +49 -0
  274. package/dist/item-path.d.ts.map +1 -0
  275. package/dist/item-path.js +66 -0
  276. package/dist/item-path.js.map +1 -0
  277. package/dist/ledger-lint.d.ts +129 -0
  278. package/dist/ledger-lint.d.ts.map +1 -0
  279. package/dist/ledger-lint.js +249 -0
  280. package/dist/ledger-lint.js.map +1 -0
  281. package/dist/ledger-read.d.ts +357 -0
  282. package/dist/ledger-read.d.ts.map +1 -0
  283. package/dist/ledger-read.js +442 -0
  284. package/dist/ledger-read.js.map +1 -0
  285. package/dist/ledger-write.d.ts +330 -0
  286. package/dist/ledger-write.d.ts.map +1 -0
  287. package/dist/ledger-write.js +411 -0
  288. package/dist/ledger-write.js.map +1 -0
  289. package/dist/lifecycle-gather.d.ts +30 -0
  290. package/dist/lifecycle-gather.d.ts.map +1 -0
  291. package/dist/lifecycle-gather.js +205 -0
  292. package/dist/lifecycle-gather.js.map +1 -0
  293. package/dist/lifecycle-pools.d.ts +180 -0
  294. package/dist/lifecycle-pools.d.ts.map +1 -0
  295. package/dist/lifecycle-pools.js +78 -0
  296. package/dist/lifecycle-pools.js.map +1 -0
  297. package/dist/merge-question-surfacer.d.ts +166 -0
  298. package/dist/merge-question-surfacer.d.ts.map +1 -0
  299. package/dist/merge-question-surfacer.js +297 -0
  300. package/dist/merge-question-surfacer.js.map +1 -0
  301. package/dist/mint-adr.d.ts +126 -0
  302. package/dist/mint-adr.d.ts.map +1 -0
  303. package/dist/mint-adr.js +257 -0
  304. package/dist/mint-adr.js.map +1 -0
  305. package/dist/mirror-pool-scan.d.ts +125 -0
  306. package/dist/mirror-pool-scan.d.ts.map +1 -0
  307. package/dist/mirror-pool-scan.js +104 -0
  308. package/dist/mirror-pool-scan.js.map +1 -0
  309. package/dist/needs-attention.d.ts +341 -0
  310. package/dist/needs-attention.d.ts.map +1 -0
  311. package/dist/needs-attention.js +900 -0
  312. package/dist/needs-attention.js.map +1 -0
  313. package/dist/orphan-sidecar.d.ts +79 -0
  314. package/dist/orphan-sidecar.d.ts.map +1 -0
  315. package/dist/orphan-sidecar.js +71 -0
  316. package/dist/orphan-sidecar.js.map +1 -0
  317. package/dist/output.d.ts +48 -0
  318. package/dist/output.d.ts.map +1 -0
  319. package/dist/output.js +66 -0
  320. package/dist/output.js.map +1 -0
  321. package/dist/pi-harness.d.ts +179 -0
  322. package/dist/pi-harness.d.ts.map +1 -0
  323. package/dist/pi-harness.js +342 -0
  324. package/dist/pi-harness.js.map +1 -0
  325. package/dist/placement.d.ts +99 -0
  326. package/dist/placement.d.ts.map +1 -0
  327. package/dist/placement.js +67 -0
  328. package/dist/placement.js.map +1 -0
  329. package/dist/prd-to-spec.d.ts +329 -0
  330. package/dist/prd-to-spec.d.ts.map +1 -0
  331. package/dist/prd-to-spec.js +706 -0
  332. package/dist/prd-to-spec.js.map +1 -0
  333. package/dist/prepare.d.ts +121 -0
  334. package/dist/prepare.d.ts.map +1 -0
  335. package/dist/prepare.js +140 -0
  336. package/dist/prepare.js.map +1 -0
  337. package/dist/prompt.d.ts +363 -0
  338. package/dist/prompt.d.ts.map +1 -0
  339. package/dist/prompt.js +499 -0
  340. package/dist/prompt.js.map +1 -0
  341. package/dist/protocol/ADR-FORMAT.md +47 -0
  342. package/dist/protocol/CLAIM-PROTOCOL.md +217 -0
  343. package/dist/protocol/REVIEW-PROTOCOL.md +119 -0
  344. package/dist/protocol/SURFACE-PROTOCOL.md +121 -0
  345. package/dist/protocol/TASKING-PROTOCOL.md +122 -0
  346. package/dist/protocol/WORK-CONTRACT.md +276 -0
  347. package/dist/protocol/spec-template.md +71 -0
  348. package/dist/protocol/task-template.md +65 -0
  349. package/dist/readiness.d.ts +66 -0
  350. package/dist/readiness.d.ts.map +1 -0
  351. package/dist/readiness.js +36 -0
  352. package/dist/readiness.js.map +1 -0
  353. package/dist/reap-branches.d.ts +102 -0
  354. package/dist/reap-branches.d.ts.map +1 -0
  355. package/dist/reap-branches.js +149 -0
  356. package/dist/reap-branches.js.map +1 -0
  357. package/dist/recover-isolated.d.ts +72 -0
  358. package/dist/recover-isolated.d.ts.map +1 -0
  359. package/dist/recover-isolated.js +188 -0
  360. package/dist/recover-isolated.js.map +1 -0
  361. package/dist/registry.d.ts +172 -0
  362. package/dist/registry.d.ts.map +1 -0
  363. package/dist/registry.js +296 -0
  364. package/dist/registry.js.map +1 -0
  365. package/dist/repo-config.d.ts +201 -0
  366. package/dist/repo-config.d.ts.map +1 -0
  367. package/dist/repo-config.js +414 -0
  368. package/dist/repo-config.js.map +1 -0
  369. package/dist/repo-key.d.ts +20 -0
  370. package/dist/repo-key.d.ts.map +1 -0
  371. package/dist/repo-key.js +68 -0
  372. package/dist/repo-key.js.map +1 -0
  373. package/dist/repo-mirror.d.ts +177 -0
  374. package/dist/repo-mirror.d.ts.map +1 -0
  375. package/dist/repo-mirror.js +271 -0
  376. package/dist/repo-mirror.js.map +1 -0
  377. package/dist/retry-backoff.d.ts +90 -0
  378. package/dist/retry-backoff.d.ts.map +1 -0
  379. package/dist/retry-backoff.js +98 -0
  380. package/dist/retry-backoff.js.map +1 -0
  381. package/dist/review-gate.d.ts +173 -0
  382. package/dist/review-gate.d.ts.map +1 -0
  383. package/dist/review-gate.js +261 -0
  384. package/dist/review-gate.js.map +1 -0
  385. package/dist/review-verdict.d.ts +149 -0
  386. package/dist/review-verdict.d.ts.map +1 -0
  387. package/dist/review-verdict.js +332 -0
  388. package/dist/review-verdict.js.map +1 -0
  389. package/dist/run.d.ts +221 -0
  390. package/dist/run.d.ts.map +1 -0
  391. package/dist/run.js +963 -0
  392. package/dist/run.js.map +1 -0
  393. package/dist/scan.d.ts +308 -0
  394. package/dist/scan.d.ts.map +1 -0
  395. package/dist/scan.js +374 -0
  396. package/dist/scan.js.map +1 -0
  397. package/dist/select-order.d.ts +75 -0
  398. package/dist/select-order.d.ts.map +1 -0
  399. package/dist/select-order.js +108 -0
  400. package/dist/select-order.js.map +1 -0
  401. package/dist/select-priority.d.ts +188 -0
  402. package/dist/select-priority.d.ts.map +1 -0
  403. package/dist/select-priority.js +80 -0
  404. package/dist/select-priority.js.map +1 -0
  405. package/dist/select.d.ts +25 -0
  406. package/dist/select.d.ts.map +1 -0
  407. package/dist/select.js +43 -0
  408. package/dist/select.js.map +1 -0
  409. package/dist/session-path.d.ts +36 -0
  410. package/dist/session-path.d.ts.map +1 -0
  411. package/dist/session-path.js +129 -0
  412. package/dist/session-path.js.map +1 -0
  413. package/dist/sidecar-apply.d.ts +83 -0
  414. package/dist/sidecar-apply.d.ts.map +1 -0
  415. package/dist/sidecar-apply.js +111 -0
  416. package/dist/sidecar-apply.js.map +1 -0
  417. package/dist/sidecar.d.ts +245 -0
  418. package/dist/sidecar.d.ts.map +1 -0
  419. package/dist/sidecar.js +481 -0
  420. package/dist/sidecar.js.map +1 -0
  421. package/dist/slug-namespace.d.ts +204 -0
  422. package/dist/slug-namespace.d.ts.map +1 -0
  423. package/dist/slug-namespace.js +229 -0
  424. package/dist/slug-namespace.js.map +1 -0
  425. package/dist/spec-complete.d.ts +44 -0
  426. package/dist/spec-complete.d.ts.map +1 -0
  427. package/dist/spec-complete.js +69 -0
  428. package/dist/spec-complete.js.map +1 -0
  429. package/dist/start.d.ts +97 -0
  430. package/dist/start.d.ts.map +1 -0
  431. package/dist/start.js +633 -0
  432. package/dist/start.js.map +1 -0
  433. package/dist/status.d.ts +199 -0
  434. package/dist/status.d.ts.map +1 -0
  435. package/dist/status.js +228 -0
  436. package/dist/status.js.map +1 -0
  437. package/dist/surface-gate.d.ts +162 -0
  438. package/dist/surface-gate.d.ts.map +1 -0
  439. package/dist/surface-gate.js +206 -0
  440. package/dist/surface-gate.js.map +1 -0
  441. package/dist/surface-persist.d.ts +86 -0
  442. package/dist/surface-persist.d.ts.map +1 -0
  443. package/dist/surface-persist.js +129 -0
  444. package/dist/surface-persist.js.map +1 -0
  445. package/dist/tasker-review-loop.d.ts +249 -0
  446. package/dist/tasker-review-loop.d.ts.map +1 -0
  447. package/dist/tasker-review-loop.js +369 -0
  448. package/dist/tasker-review-loop.js.map +1 -0
  449. package/dist/tasking-eligibility.d.ts +74 -0
  450. package/dist/tasking-eligibility.d.ts.map +1 -0
  451. package/dist/tasking-eligibility.js +52 -0
  452. package/dist/tasking-eligibility.js.map +1 -0
  453. package/dist/tasking-lock.d.ts +111 -0
  454. package/dist/tasking-lock.d.ts.map +1 -0
  455. package/dist/tasking-lock.js +256 -0
  456. package/dist/tasking-lock.js.map +1 -0
  457. package/dist/tasking.d.ts +275 -0
  458. package/dist/tasking.d.ts.map +1 -0
  459. package/dist/tasking.js +951 -0
  460. package/dist/tasking.js.map +1 -0
  461. package/dist/triage-gate.d.ts +127 -0
  462. package/dist/triage-gate.d.ts.map +1 -0
  463. package/dist/triage-gate.js +139 -0
  464. package/dist/triage-gate.js.map +1 -0
  465. package/dist/triage-persist.d.ts +163 -0
  466. package/dist/triage-persist.d.ts.map +1 -0
  467. package/dist/triage-persist.js +387 -0
  468. package/dist/triage-persist.js.map +1 -0
  469. package/dist/verdict-json.d.ts +32 -0
  470. package/dist/verdict-json.d.ts.map +1 -0
  471. package/dist/verdict-json.js +74 -0
  472. package/dist/verdict-json.js.map +1 -0
  473. package/dist/verify-workflow-template.d.ts +60 -0
  474. package/dist/verify-workflow-template.d.ts.map +1 -0
  475. package/dist/verify-workflow-template.js +126 -0
  476. package/dist/verify-workflow-template.js.map +1 -0
  477. package/dist/verify.d.ts +60 -0
  478. package/dist/verify.d.ts.map +1 -0
  479. package/dist/verify.js +62 -0
  480. package/dist/verify.js.map +1 -0
  481. package/dist/watch-session.d.ts +112 -0
  482. package/dist/watch-session.d.ts.map +1 -0
  483. package/dist/watch-session.js +347 -0
  484. package/dist/watch-session.js.map +1 -0
  485. package/dist/work-layout.d.ts +198 -0
  486. package/dist/work-layout.d.ts.map +1 -0
  487. package/dist/work-layout.js +217 -0
  488. package/dist/work-layout.js.map +1 -0
  489. package/dist/work-on.d.ts +154 -0
  490. package/dist/work-on.d.ts.map +1 -0
  491. package/dist/work-on.js +387 -0
  492. package/dist/work-on.js.map +1 -0
  493. package/dist/workspace.d.ts +224 -0
  494. package/dist/workspace.d.ts.map +1 -0
  495. package/dist/workspace.js +325 -0
  496. package/dist/workspace.js.map +1 -0
  497. package/package.json +46 -2
  498. package/src/advance-ci-template.ts +203 -0
  499. package/src/advance-classify.ts +197 -0
  500. package/src/advance-drivers.ts +414 -0
  501. package/src/advance-isolated.ts +432 -0
  502. package/src/advance-lifecycle-template.ts +791 -0
  503. package/src/advance-loop-driver.ts +745 -0
  504. package/src/advance-treeless-publish.ts +177 -0
  505. package/src/advance.ts +1564 -0
  506. package/src/advancing-lock.ts +988 -0
  507. package/src/agent-launch.ts +137 -0
  508. package/src/agent-stop.ts +361 -0
  509. package/src/apply-decide.ts +242 -0
  510. package/src/apply-merge-action.ts +502 -0
  511. package/src/apply-persist.ts +518 -0
  512. package/src/arbiter.ts +372 -0
  513. package/src/brand.ts +111 -0
  514. package/src/buildable-body.ts +196 -0
  515. package/src/categorise.ts +158 -0
  516. package/src/claim-cas.ts +513 -0
  517. package/src/cli-spinner.ts +225 -0
  518. package/src/cli.ts +4379 -0
  519. package/src/close-job-template.ts +236 -0
  520. package/src/close-job.ts +319 -0
  521. package/src/complete.ts +1379 -0
  522. package/src/concurrency.ts +151 -0
  523. package/src/config-override.ts +116 -0
  524. package/src/config.ts +883 -0
  525. package/src/continue-branch.ts +542 -0
  526. package/src/cwd-section.ts +392 -0
  527. package/src/decision-engine.ts +272 -0
  528. package/src/detect.ts +124 -0
  529. package/src/do-autopick.ts +223 -0
  530. package/src/do-config.ts +589 -0
  531. package/src/do-remote-auto.ts +197 -0
  532. package/src/do.ts +2623 -0
  533. package/src/drop-source.ts +194 -0
  534. package/src/eligibility.ts +79 -0
  535. package/src/env-config.ts +305 -0
  536. package/src/failure-cause.ts +142 -0
  537. package/src/format.ts +313 -0
  538. package/src/frontmatter.ts +477 -0
  539. package/src/gate-readiness.ts +147 -0
  540. package/src/gc.ts +510 -0
  541. package/src/gh-failure.ts +53 -0
  542. package/src/git.ts +186 -0
  543. package/src/github.ts +468 -0
  544. package/src/harness.ts +355 -0
  545. package/src/identity.ts +322 -0
  546. package/src/index.ts +785 -0
  547. package/src/install-ci-branch-protection.ts +255 -0
  548. package/src/install-ci-capabilities/advance-lifecycle.ts +34 -0
  549. package/src/install-ci-capabilities/close-job.ts +32 -0
  550. package/src/install-ci-capabilities/example-noop.ts +24 -0
  551. package/src/install-ci-capabilities/intake.ts +34 -0
  552. package/src/install-ci-capabilities/verify.ts +33 -0
  553. package/src/install-ci-core.ts +1088 -0
  554. package/src/install-ci-github.ts +376 -0
  555. package/src/install-ci.ts +552 -0
  556. package/src/intake-event.ts +102 -0
  557. package/src/intake-marker.ts +195 -0
  558. package/src/intake-triage.ts +138 -0
  559. package/src/intake-trigger-template.ts +591 -0
  560. package/src/intake.ts +2445 -0
  561. package/src/integration-core.ts +3065 -0
  562. package/src/integrator.ts +771 -0
  563. package/src/isolation.ts +484 -0
  564. package/src/issue-provider.ts +733 -0
  565. package/src/item-lock.ts +1858 -0
  566. package/src/item-path.ts +75 -0
  567. package/src/ledger-lint.ts +332 -0
  568. package/src/ledger-read.ts +924 -0
  569. package/src/ledger-write.ts +865 -0
  570. package/src/lifecycle-gather.ts +298 -0
  571. package/src/lifecycle-pools.ts +250 -0
  572. package/src/merge-question-surfacer.ts +496 -0
  573. package/src/mint-adr.ts +362 -0
  574. package/src/mirror-pool-scan.ts +240 -0
  575. package/src/needs-attention.ts +1506 -0
  576. package/src/orphan-sidecar.ts +150 -0
  577. package/src/output.ts +89 -0
  578. package/src/pi-harness.ts +403 -0
  579. package/src/placement.ts +131 -0
  580. package/src/prd-to-spec.ts +1059 -0
  581. package/src/prepare.ts +230 -0
  582. package/src/prompt.ts +763 -0
  583. package/src/readiness.ts +98 -0
  584. package/src/reap-branches.ts +278 -0
  585. package/src/recover-isolated.ts +276 -0
  586. package/src/registry.ts +475 -0
  587. package/src/repo-config.ts +550 -0
  588. package/src/repo-key.ts +74 -0
  589. package/src/repo-mirror.ts +367 -0
  590. package/src/retry-backoff.ts +130 -0
  591. package/src/review-gate.ts +389 -0
  592. package/src/review-verdict.ts +422 -0
  593. package/src/run.ts +1430 -0
  594. package/src/scan.ts +611 -0
  595. package/src/select-order.ts +143 -0
  596. package/src/select-priority.ts +266 -0
  597. package/src/select.ts +62 -0
  598. package/src/session-path.ts +153 -0
  599. package/src/sidecar-apply.ts +216 -0
  600. package/src/sidecar.ts +700 -0
  601. package/src/slug-namespace.ts +367 -0
  602. package/src/spec-complete.ts +118 -0
  603. package/src/start.ts +974 -0
  604. package/src/status.ts +441 -0
  605. package/src/surface-gate.ts +337 -0
  606. package/src/surface-persist.ts +241 -0
  607. package/src/tasker-review-loop.ts +671 -0
  608. package/src/tasking-eligibility.ts +114 -0
  609. package/src/tasking-lock.ts +416 -0
  610. package/src/tasking.ts +1437 -0
  611. package/src/triage-gate.ts +248 -0
  612. package/src/triage-persist.ts +570 -0
  613. package/src/verdict-json.ts +73 -0
  614. package/src/verify-workflow-template.ts +159 -0
  615. package/src/verify.ts +123 -0
  616. package/src/watch-session.ts +397 -0
  617. package/src/work-layout.ts +262 -0
  618. package/src/work-on.ts +660 -0
  619. package/src/workspace.ts +502 -0
@@ -0,0 +1,706 @@
1
+ import { existsSync, readdirSync, readFileSync, writeFileSync, copyFileSync, mkdirSync, rmdirSync, } from 'node:fs';
2
+ import { join, relative, dirname } from 'node:path';
3
+ import { run, git, gitMv } from './git.js';
4
+ import { resolveProtocolDoc } from './prompt.js';
5
+ import { WORK_ROOT } from './work-layout.js';
6
+ /** The `prd → spec` cutover this verb enacts (ADR §7e). */
7
+ export const MIGRATION = {
8
+ from: 'prd',
9
+ to: 'spec',
10
+ fromFolder: 'prds',
11
+ toFolder: 'specs',
12
+ configKeys: [{ from: 'prdsLandIn', to: 'specsLandIn' }],
13
+ };
14
+ /**
15
+ * The FULL set of protocol docs `setup` propagates into a repo's
16
+ * `work/protocol/`. The re-sync copies EACH from the package's canonical source
17
+ * (via {@link resolveProtocolDoc}) so the migrated repo carries the new `spec`
18
+ * contract. Kept in lockstep with `skills/setup/protocol/` (the source of truth)
19
+ * and the `vendor-protocol` build step (which vendors these into `dist/protocol/`
20
+ * so the published CLI is self-contained).
21
+ */
22
+ export const PROTOCOL_DOCS = [
23
+ 'WORK-CONTRACT.md',
24
+ 'CLAIM-PROTOCOL.md',
25
+ 'REVIEW-PROTOCOL.md',
26
+ 'SURFACE-PROTOCOL.md',
27
+ 'TASKING-PROTOCOL.md',
28
+ 'ADR-FORMAT.md',
29
+ 'task-template.md',
30
+ 'spec-template.md',
31
+ ];
32
+ // ───────────────────────────────────────────────────────────────────────────
33
+ // Layer: keep-case replace (the bespoke sweep — see the tooling JSDoc above).
34
+ // ───────────────────────────────────────────────────────────────────────────
35
+ /** Upper-case the first letter of a word (`prd → Prd`). */
36
+ function capitalise(word) {
37
+ return word.length === 0 ? word : word[0].toUpperCase() + word.slice(1);
38
+ }
39
+ /**
40
+ * Keep-case replace EVERY occurrence of `from` with `to` across the three case
41
+ * variants — lower (`prd → spec`), Capitalised (`Prd → Spec`), and UPPER
42
+ * (`PRD → SPEC`) — preserving the shape of each hit. Deliberately does a plain
43
+ * substring replace (no word boundary) so it rewrites `prd` inside identifiers
44
+ * like `prdsLandIn`/`work/prds/`; callers scope it to the tokens they mean to
45
+ * rewrite (a whole config key, a frontmatter-field line, a path). The bespoke
46
+ * dependency-free sweep the tooling JSDoc justifies over `change-case`.
47
+ */
48
+ export function keepCaseReplace(text, from, to) {
49
+ const variants = [
50
+ [from.toUpperCase(), to.toUpperCase()],
51
+ [capitalise(from), capitalise(to)],
52
+ [from.toLowerCase(), to.toLowerCase()],
53
+ ];
54
+ let out = text;
55
+ for (const [f, t] of variants) {
56
+ out = out.split(f).join(t);
57
+ }
58
+ return out;
59
+ }
60
+ /**
61
+ * Is the repo QUIESCENT enough to migrate (ADR §7e, 1a)? Refuse if ANY of:
62
+ * - the working tree is DIRTY (uncommitted/untracked changes), OR
63
+ * - a per-item LOCK ref is held (`refs/dorfl/lock/*`), OR
64
+ * - an in-progress `work/<from>-*`/`work/<to>-*` work-branch exists (a branch
65
+ * that is NOT merged into the current tip = unlanded work in flight).
66
+ *
67
+ * Returns the FIRST violation (dirty tree dominates, then locks, then branches),
68
+ * naming the offender, or `undefined` when quiescent. Read-only: it inspects the
69
+ * LOCAL repo's refs + status (the fixture/downstream case where the migration
70
+ * runs in-place). The quiescence gate is what makes layer (d) safe: with no held
71
+ * lock and no in-flight branch, only INERT refs remain to rename.
72
+ */
73
+ export function checkQuiescence(repoPath, migration = MIGRATION, env = undefined) {
74
+ // 1. Dirty tree dominates — never migrate over uncommitted work.
75
+ const status = run('git', ['status', '--porcelain'], repoPath, { env });
76
+ if (status.status !== 0) {
77
+ return { kind: 'dirty-tree', offender: '(git status failed)' };
78
+ }
79
+ const dirty = status.stdout
80
+ .split('\n')
81
+ .map((l) => l.trimEnd())
82
+ .filter((l) => l !== '');
83
+ if (dirty.length > 0) {
84
+ return {
85
+ kind: 'dirty-tree',
86
+ offender: dirty.map((l) => l.slice(3).trim()).join(', '),
87
+ };
88
+ }
89
+ // 2. A held per-item lock ref (`refs/dorfl/lock/<entry>`). Any such LOCAL ref
90
+ // means an item is claimed/in-flight — refuse, naming the entry.
91
+ const locks = run('git', ['for-each-ref', '--format=%(refname)', 'refs/dorfl/lock/'], repoPath, { env });
92
+ if (locks.status === 0) {
93
+ const held = locks.stdout
94
+ .split('\n')
95
+ .map((l) => l.trim())
96
+ .filter((l) => l.startsWith('refs/dorfl/lock/'));
97
+ if (held.length > 0) {
98
+ return { kind: 'held-lock', offender: held[0] };
99
+ }
100
+ }
101
+ // 3. An in-progress `work/<from>-*` / `work/<to>-*` branch carrying UNLANDED
102
+ // work (a local branch not merged into HEAD). A branch already merged into
103
+ // the current tip is inert; an unmerged one is work in flight — refuse.
104
+ const branches = run('git', [
105
+ 'for-each-ref',
106
+ '--format=%(refname:short)',
107
+ `refs/heads/${WORK_ROOT}/${migration.from}-*`,
108
+ `refs/heads/${WORK_ROOT}/${migration.to}-*`,
109
+ ], repoPath, { env });
110
+ if (branches.status === 0) {
111
+ const names = branches.stdout
112
+ .split('\n')
113
+ .map((l) => l.trim())
114
+ .filter((l) => l !== '');
115
+ for (const branch of names) {
116
+ // Merged into the current tip ⇒ inert (safe to rename); otherwise it
117
+ // carries unlanded work ⇒ refuse, naming the branch.
118
+ const merged = run('git', ['merge-base', '--is-ancestor', branch, 'HEAD'], repoPath, { env });
119
+ if (merged.status !== 0) {
120
+ return { kind: 'in-progress-branch', offender: branch };
121
+ }
122
+ }
123
+ }
124
+ return undefined;
125
+ }
126
+ /**
127
+ * Re-sync the target repo's `work/protocol/*` from the package's canonical
128
+ * source (the deterministic part of the `setup` skill — copy the docs verbatim +
129
+ * bump `VERSION`). Resolves each doc's SOURCE via {@link resolveProtocolDoc} with
130
+ * NO `cwd`, so it reads the package-vendored (`dist/protocol/`) or dev-source
131
+ * (`skills/setup/protocol/`) copy — NEVER the target repo's own (old) copy. This
132
+ * is how the migrated repo picks up the new `spec` contract before its data is
133
+ * converted. Idempotent: a doc already byte-identical is reported `unchanged`.
134
+ * A doc whose SOURCE cannot be resolved is reported `skipped` (NOT copied, NEVER
135
+ * a VERSION-bump) rather than silently bumping VERSION with nothing copied.
136
+ *
137
+ * `dryRun` reports what WOULD be copied without writing. `resolveDoc` overrides
138
+ * how a doc's source path is resolved (defaults to {@link resolveProtocolDoc});
139
+ * it exists so a test can force a non-resolvable source (a path that does not
140
+ * exist) to exercise the skip path.
141
+ */
142
+ export function resyncProtocol(repoPath, options = {}) {
143
+ const protocolDir = join(repoPath, WORK_ROOT, 'protocol');
144
+ const resolveDoc = options.resolveDoc ?? ((name) => resolveProtocolDoc(name));
145
+ const docs = [];
146
+ for (const name of PROTOCOL_DOCS) {
147
+ // Resolve the SOURCE (package/dev), never the target's adopted copy.
148
+ const source = resolveDoc(name);
149
+ const destAbs = join(protocolDir, name);
150
+ const destRel = relative(repoPath, destAbs);
151
+ const sourceExists = existsSync(source);
152
+ if (!sourceExists) {
153
+ // The source doc could not be resolved: copy NOTHING and record the doc as
154
+ // SKIPPED (never a change). This is the latent-bug fix: a non-resolvable
155
+ // source must not count as `changed` and bump `VERSION` while copying no
156
+ // file. `unchanged: false` here is honest (the dest was not made to match a
157
+ // source), but `skipped: true` keeps it OUT of the VERSION-bump tally.
158
+ docs.push({ name, dest: destRel, unchanged: false, skipped: true });
159
+ continue;
160
+ }
161
+ // Source resolved: a doc is CHANGED (VERSION-bump-worthy) only when the dest
162
+ // is absent OR its content differs from the source. An identical dest is a
163
+ // no-op copy (`unchanged`), so an already-synced re-run stays a true no-op.
164
+ const unchanged = existsSync(destAbs) &&
165
+ readFileSync(source, 'utf8') === readFileSync(destAbs, 'utf8');
166
+ if (!options.dryRun) {
167
+ mkdirSync(dirname(destAbs), { recursive: true });
168
+ copyFileSync(source, destAbs);
169
+ }
170
+ docs.push({ name, dest: destRel, unchanged, skipped: false });
171
+ }
172
+ const versionAbs = join(protocolDir, 'VERSION');
173
+ const versionRel = relative(repoPath, versionAbs);
174
+ // Bump VERSION only when a doc was ACTUALLY COPIED with new content, or when
175
+ // VERSION is absent AND at least one doc was genuinely synced (copied). A
176
+ // SKIPPED doc (unresolvable source, nothing copied) is NEVER a change —
177
+ // counting it would bump VERSION without copying a single doc (the latent bug),
178
+ // and the write-when-absent fallback must ALSO require a real copy so an
179
+ // all-skipped resync leaves no VERSION behind. A re-run on an already-synced
180
+ // repo must stay a true no-op — otherwise the (always-fresh) `synced-at`
181
+ // timestamp would dirty the tree on every idempotent re-run.
182
+ const anyDocChanged = docs.some((d) => !d.unchanged && !d.skipped);
183
+ const anyDocSynced = docs.some((d) => !d.skipped);
184
+ if (!options.dryRun &&
185
+ (anyDocChanged || (anyDocSynced && !existsSync(versionAbs)))) {
186
+ mkdirSync(dirname(versionAbs), { recursive: true });
187
+ const today = new Date().toISOString().slice(0, 10);
188
+ writeFileSync(versionAbs, [
189
+ `protocol-version: ${today}`,
190
+ 'synced-from: skills/setup/protocol/',
191
+ `synced-at: ${new Date().toISOString()}`,
192
+ 'source-commit: dorfl prd-to-spec',
193
+ '',
194
+ ].join('\n'));
195
+ }
196
+ return { docs, versionPath: versionRel };
197
+ }
198
+ // ───────────────────────────────────────────────────────────────────────────
199
+ // Layer 3a: the FOLDER move (in lockstep with work-layout.ts).
200
+ // ───────────────────────────────────────────────────────────────────────────
201
+ /** The four lifecycle sub-folders under `work/<from>s/` the move relocates. */
202
+ const LIFECYCLE_SUBFOLDERS = [
203
+ 'proposed',
204
+ 'ready',
205
+ 'tasked',
206
+ 'dropped',
207
+ ];
208
+ /**
209
+ * Move `work/<from>s/{proposed,ready,tasked,dropped}/ → work/<to>s/…`. The
210
+ * DESTINATION spellings match `work-layout.ts`'s post-cutover folder names in
211
+ * lockstep — this layer moves the DATA folders the CODE already renamed.
212
+ *
213
+ * A sub-folder with TRACKED files is `git mv`'d (renames preserve history); a
214
+ * sub-folder that exists on disk but has NO tracked files (an empty staging dir
215
+ * `setup` created — git never tracks empty dirs, so `git mv` would fatal on it)
216
+ * is instead removed with a plain `rmdir` so no stray `work/<from>s/` folder is
217
+ * left to leak (the empty dir carries no data). Only folders that EXIST are
218
+ * touched (an absent sub-folder is skipped), so it is idempotent AND
219
+ * partial-repo safe: a second run finds `work/<from>s/*` gone and does nothing.
220
+ * `dryRun` reports the moves without touching git or the filesystem.
221
+ */
222
+ export function migrateFolders(repoPath, migration = MIGRATION, options = {}) {
223
+ const moves = [];
224
+ for (const sub of LIFECYCLE_SUBFOLDERS) {
225
+ const fromRel = `${WORK_ROOT}/${migration.fromFolder}/${sub}`;
226
+ const toRel = `${WORK_ROOT}/${migration.toFolder}/${sub}`;
227
+ const fromAbs = join(repoPath, fromRel);
228
+ if (!existsSync(fromAbs)) {
229
+ continue;
230
+ }
231
+ const tracked = run('git', ['ls-files', '--', fromRel], repoPath)
232
+ .stdout.split('\n')
233
+ .some((l) => l.trim() !== '');
234
+ if (!tracked) {
235
+ // An empty/untracked on-disk staging dir: nothing for git to move, but
236
+ // leave no stray `work/<from>s/` behind. Best-effort rmdir (only removes
237
+ // an empty dir; a dir with untracked files stays and is reported).
238
+ if (!options.dryRun) {
239
+ try {
240
+ rmdirSync(fromAbs);
241
+ }
242
+ catch {
243
+ // non-empty untracked dir — leave it; the leak scan will surface it.
244
+ }
245
+ }
246
+ continue;
247
+ }
248
+ moves.push({ from: fromRel, to: toRel });
249
+ if (!options.dryRun) {
250
+ gitMv(fromRel, toRel, repoPath);
251
+ }
252
+ }
253
+ // Prune a now-empty `work/<from>s/` parent so no stray folder leaks.
254
+ if (!options.dryRun) {
255
+ const parent = join(repoPath, WORK_ROOT, migration.fromFolder);
256
+ try {
257
+ rmdirSync(parent);
258
+ }
259
+ catch {
260
+ // still has (untracked) content — leave it for the leak scan to surface.
261
+ }
262
+ }
263
+ return moves;
264
+ }
265
+ /**
266
+ * Which `work/` folders carry ITEMS whose bodies/frontmatter may reference the
267
+ * retired word — the FULL set including terminal/history folders, because
268
+ * done-items ARE converted (ADR §7e: a `done/` full of dangling `prd:` refs is a
269
+ * broken repo, so determinism overrides the old "don't touch done" convenience).
270
+ * Paths are repo-relative and walked recursively. `work/specs/*` is included so
271
+ * items ALREADY moved by layer 3a (whose bodies may still say `work/prds/…`) are
272
+ * swept too. `work/protocol/` is EXCLUDED — layer 2 owns it (verbatim contract
273
+ * copies, not data). Each entry is a path UNDER `work/` (the `WORK_ROOT` prefix
274
+ * is prepended by the walker).
275
+ */
276
+ const ITEM_CONTENT_FOLDERS = [
277
+ 'tasks/backlog',
278
+ 'tasks/ready',
279
+ 'tasks/done',
280
+ 'tasks/cancelled',
281
+ // BOTH the post-move `specs/*` locations AND the pre-move `prds/*` locations
282
+ // are walked: after a real (non-dry-run) migration the items live in `specs/*`
283
+ // (layer 3a moved them first) and `prds/*` is empty; under `--dry-run` the
284
+ // folders are NOT moved, so the items are still in `prds/*` — walking both makes
285
+ // the content sweep (and its dry-run report) accurate in either order, and it
286
+ // stays idempotent (an empty folder contributes nothing).
287
+ 'prds/proposed',
288
+ 'prds/ready',
289
+ 'prds/tasked',
290
+ 'prds/dropped',
291
+ 'specs/proposed',
292
+ 'specs/ready',
293
+ 'specs/tasked',
294
+ 'specs/dropped',
295
+ 'notes/observations',
296
+ 'notes/ideas',
297
+ 'notes/findings',
298
+ 'questions',
299
+ ];
300
+ /**
301
+ * Recursively collect every `.md` file under a `work/`-relative folder (the entry
302
+ * is UNDER `work/` — e.g. `'tasks/done'` — and `WORK_ROOT` is prepended here).
303
+ * Returns repo-relative paths WITH the `work/` prefix.
304
+ */
305
+ function collectMarkdown(repoPath, folderUnderWork) {
306
+ return collectMarkdownRel(repoPath, `${WORK_ROOT}/${folderUnderWork}`);
307
+ }
308
+ /** Recursively collect every `.md` file under a repo-relative folder path. */
309
+ function collectMarkdownRel(repoPath, folderRel) {
310
+ const abs = join(repoPath, folderRel);
311
+ if (!existsSync(abs)) {
312
+ return [];
313
+ }
314
+ const out = [];
315
+ for (const entry of readdirSync(abs, { withFileTypes: true })) {
316
+ const childRel = `${folderRel}/${entry.name}`;
317
+ if (entry.isDirectory()) {
318
+ out.push(...collectMarkdownRel(repoPath, childRel));
319
+ }
320
+ else if (entry.name.toLowerCase().endsWith('.md')) {
321
+ out.push(childRel);
322
+ }
323
+ }
324
+ return out;
325
+ }
326
+ /**
327
+ * Rewrite the retired word in ONE item's text, SCOPED to genuine STRUCTURAL
328
+ * refs so it never corrupts prose or an immutable provenance SLUG (a landed
329
+ * item's `slug: prd-to-spec-…` must survive verbatim — a slug can never be
330
+ * renamed):
331
+ *
332
+ * - the `prd:` frontmatter KEY at line start (`prdAfter:` too), NOT a `prd`
333
+ * inside a value/slug;
334
+ * - `work/prds/…` folder paths and a bare `prds/` folder segment;
335
+ * - `work/prd-<slug>` branch refs (the `work/` prefix makes it unambiguous —
336
+ * a bare `prd-<slug>` is NOT rewritten because it is indistinguishable from
337
+ * a provenance slug fragment; a genuine bare lock entry lives on a git ref,
338
+ * which {@link migrateRefs} handles, not in an item body);
339
+ * - `prd:<slug>` CLI-arg tokens (a `prd:` at a non-word boundary followed by a
340
+ * slug char), NOT a `prd:` embedded in a longer word.
341
+ *
342
+ * Returns the new text (unchanged when nothing matched). PURE — no IO — so it is
343
+ * trivially testable and the caller decides whether to write. Exported for reuse
344
+ * + the fixture test's determinism assertion.
345
+ */
346
+ export function migrateItemContent(text, migration = MIGRATION) {
347
+ const from = migration.from;
348
+ let out = text;
349
+ // (i) The frontmatter FIELD key on its own line: `prd:` → `spec:` (keep-case),
350
+ // matched at line start (optionally indented) so only the KEY is rewritten,
351
+ // never a `prd` inside a value/slug. Also `prdAfter:` if it ever appears.
352
+ out = out.replace(new RegExp(`^(\\s*)(${from})(After)?(\\s*:)`, gimFlags()), (_m, indent, word, after, colon) => indent +
353
+ keepCaseReplace(word, from, migration.to) +
354
+ (after ?? '') +
355
+ colon);
356
+ // (ii) Folder-path refs `work/prds/…` → `work/specs/…` (keep-case on the
357
+ // plural segment). A whole-path token, so a bare `prds/` inside a longer
358
+ // path is caught by the segment replace below too.
359
+ out = replaceToken(out, `${WORK_ROOT}/${migration.fromFolder}`, `${WORK_ROOT}/${migration.toFolder}`);
360
+ out = replaceToken(out, `${migration.fromFolder}/`, `${migration.toFolder}/`);
361
+ // (iii) Inert `work/<from>-<slug>` branch refs: the `work/` prefix makes this
362
+ // unambiguous (never a provenance-slug fragment), so a keep-case prefix
363
+ // replace is safe. A BARE `<from>-<slug>` is deliberately NOT rewritten
364
+ // (it is indistinguishable from a slug like `prd-to-spec-…`); a genuine
365
+ // bare lock entry lives on a git ref (`migrateRefs`), not an item body.
366
+ out = replaceToken(out, `${WORK_ROOT}/${from}-`, `${WORK_ROOT}/${migration.to}-`);
367
+ // (iv) `<from>:<slug>` CLI-arg tokens (`prd:my-feature`): only at a non-word
368
+ // boundary followed by a slug char, so a `prd:` mid-word is untouched and
369
+ // the frontmatter KEY (line-start, handled by (i)) is not double-hit.
370
+ out = out.replace(new RegExp(`(^|[^A-Za-z0-9_])(${from})(:[A-Za-z0-9])`, gimFlags()), (_m, pre, word, tail) => pre + keepCaseReplace(word, from, migration.to) + tail);
371
+ return out;
372
+ }
373
+ /** Case-insensitive, multiline, global regex flags. */
374
+ function gimFlags() {
375
+ return 'gim';
376
+ }
377
+ /**
378
+ * Keep-case replace a fixed TOKEN wherever it appears (all three case variants),
379
+ * a thin wrapper over {@link keepCaseReplace} scoped to a specific substring so
380
+ * the intent (rewrite THIS token) is explicit at the call site.
381
+ */
382
+ function replaceToken(text, from, to) {
383
+ return keepCaseReplace(text, from, to);
384
+ }
385
+ /**
386
+ * Rewrite the retired word across EVERY item in the data folders (incl.
387
+ * `done/`/`tasked/` — determinism). Writes each changed file in place (unless
388
+ * `dryRun`), returning the list of files that changed. Idempotent: a file
389
+ * already in the `spec` shape produces identical text and is not listed.
390
+ */
391
+ export function migrateAllItemContent(repoPath, migration = MIGRATION, options = {}) {
392
+ const changed = [];
393
+ for (const folder of ITEM_CONTENT_FOLDERS) {
394
+ for (const rel of collectMarkdown(repoPath, folder)) {
395
+ const abs = join(repoPath, rel);
396
+ const before = readFileSync(abs, 'utf8');
397
+ const after = migrateItemContent(before, migration);
398
+ if (after !== before) {
399
+ changed.push({ path: rel });
400
+ if (!options.dryRun) {
401
+ writeFileSync(abs, after);
402
+ }
403
+ }
404
+ }
405
+ }
406
+ return changed;
407
+ }
408
+ /**
409
+ * Rewrite the retired config KEYS in `.dorfl.json` (`prdsLandIn → specsLandIn`),
410
+ * preserving each key's VALUE and the file's surrounding formatting — a TEXTUAL
411
+ * key rename on the raw JSON, NOT a parse+reserialise (which would drop unknown
412
+ * keys / reflow the file). Only renames a key that is actually present, so it is
413
+ * idempotent (a config already on `specsLandIn` changes nothing) and safe on a
414
+ * repo with no `.dorfl.json`. Returns the keys renamed. `dryRun` reports without
415
+ * writing.
416
+ */
417
+ export function migrateConfig(repoPath, migration = MIGRATION, options = {}) {
418
+ const configAbs = join(repoPath, '.dorfl.json');
419
+ if (!existsSync(configAbs)) {
420
+ return [];
421
+ }
422
+ const before = readFileSync(configAbs, 'utf8');
423
+ let after = before;
424
+ const renamed = [];
425
+ for (const { from, to } of migration.configKeys) {
426
+ // Match the quoted JSON key exactly: `"prdsLandIn"` → `"specsLandIn"`.
427
+ const needle = `"${from}"`;
428
+ if (after.includes(needle)) {
429
+ after = after.split(needle).join(`"${to}"`);
430
+ renamed.push({ from, to });
431
+ }
432
+ }
433
+ if (after !== before && !options.dryRun) {
434
+ writeFileSync(configAbs, after);
435
+ }
436
+ return renamed;
437
+ }
438
+ /**
439
+ * Rename INERT local git refs carrying the retired word: per-item lock refs
440
+ * `refs/dorfl/lock/<from>-<slug>` → `…/<to>-<slug>` and work-branches
441
+ * `refs/heads/work/<from>-<slug>` → `…/work/<to>-<slug>`. The {@link
442
+ * checkQuiescence} gate guarantees NO lock is held and NO in-flight branch
443
+ * exists, so every ref reaching here is inert (a leftover created before the
444
+ * cutover) and a plain rename is safe. Uses `git update-ref` for lock refs (they
445
+ * are not branches) and `git branch -m` for work-branches. Idempotent: a ref
446
+ * already on the `<to>-` spelling is left alone; `dryRun` reports without
447
+ * touching refs.
448
+ */
449
+ export function migrateRefs(repoPath, migration = MIGRATION, options = {}) {
450
+ const env = options.env;
451
+ const renames = [];
452
+ // Lock refs: `refs/dorfl/lock/<from>-<slug>` → `refs/dorfl/lock/<to>-<slug>`.
453
+ const lockPrefix = 'refs/dorfl/lock/';
454
+ const locks = run('git', ['for-each-ref', '--format=%(refname) %(objectname)', lockPrefix], repoPath, { env });
455
+ if (locks.status === 0) {
456
+ for (const line of locks.stdout.split('\n')) {
457
+ const trimmed = line.trim();
458
+ if (trimmed === '')
459
+ continue;
460
+ const [ref, sha] = trimmed.split(/\s+/);
461
+ const entry = ref.slice(lockPrefix.length);
462
+ if (!entry.startsWith(`${migration.from}-`))
463
+ continue;
464
+ const newEntry = migration.to + entry.slice(migration.from.length);
465
+ const newRef = lockPrefix + newEntry;
466
+ renames.push({ from: ref, to: newRef });
467
+ if (!options.dryRun) {
468
+ git(['update-ref', newRef, sha], repoPath, { env });
469
+ git(['update-ref', '-d', ref], repoPath, { env });
470
+ }
471
+ }
472
+ }
473
+ // Work-branches: `work/<from>-<slug>` → `work/<to>-<slug>`.
474
+ const branchPrefix = `${WORK_ROOT}/${migration.from}-`;
475
+ const branches = run('git', [
476
+ 'for-each-ref',
477
+ '--format=%(refname:short)',
478
+ `refs/heads/${branchPrefix}*`,
479
+ ], repoPath, { env });
480
+ if (branches.status === 0) {
481
+ for (const line of branches.stdout.split('\n')) {
482
+ const branch = line.trim();
483
+ if (branch === '' || !branch.startsWith(branchPrefix))
484
+ continue;
485
+ const newBranch = `${WORK_ROOT}/${migration.to}-${branch.slice(branchPrefix.length)}`;
486
+ renames.push({
487
+ from: `refs/heads/${branch}`,
488
+ to: `refs/heads/${newBranch}`,
489
+ });
490
+ if (!options.dryRun) {
491
+ git(['branch', '-m', branch, newBranch], repoPath, { env });
492
+ }
493
+ }
494
+ }
495
+ return renames;
496
+ }
497
+ /**
498
+ * The DATA-tree forward+reverse leak scan — the acceptance GATE for the
499
+ * command's OUTPUT (ADR §7e: the leak scan is exhaustive-by-construction). This
500
+ * is the DATA analogue of the source-part `prd-to-spec-leak-scan.test.ts`
501
+ * (which scans `src/`/`skills/`/`docs/`): here it walks the CONVERTED `work/`
502
+ * tree + `.dorfl.json` + the git refs.
503
+ *
504
+ * - **FORWARD:** fails on any surviving retired word (`prd`/`Prd`/`PRD`) in a
505
+ * data STRUCTURE position — a frontmatter `prd:` KEY, a `work/prds/…` folder
506
+ * path, a `work/prd-<slug>` branch ref, a `prd-<slug>` lock entry, a config
507
+ * key `prdsLandIn`, or a `prd:<slug>` token. It deliberately IGNORES the
508
+ * retired word in running PROSE (a body sentence, an immutable provenance
509
+ * slug like `prd-to-spec-…`) — those are the artifact word in narrative, not
510
+ * a dangling structural ref, exactly as the source-part scan's option-A cut.
511
+ * - **REVERSE:** fails on genuine English CORRUPTED by a blind keep-case sweep
512
+ * (`espec…`→`esspec…`-style mangles) — the guard that `spec`'s English
513
+ * collisions were not mangled.
514
+ *
515
+ * A green scan on the converted fixture is the proof the four layers left no
516
+ * dangling structural `prd`. Returns every leak (empty ⇒ green).
517
+ */
518
+ export function scanForLeaks(repoPath, migration = MIGRATION, env = undefined) {
519
+ const leaks = [];
520
+ const from = migration.from;
521
+ // STRUCTURAL forward patterns: a surviving retired word in a data position.
522
+ const structural = [
523
+ {
524
+ pattern: new RegExp(`^\\s*${from}(After)?\\s*:`, 'i'),
525
+ why: `surviving '${from}:' frontmatter key`,
526
+ },
527
+ {
528
+ pattern: new RegExp(`${WORK_ROOT}/${migration.fromFolder}(/|\\b)`, 'i'),
529
+ why: `surviving '${WORK_ROOT}/${migration.fromFolder}/' folder path`,
530
+ },
531
+ {
532
+ // A bare `prds/` folder ref, but ONLY a real on-disk path shape:
533
+ // lowercase `prds/` followed by a lifecycle subfolder. Deliberately NO
534
+ // `'i'` flag + a required lifecycle segment, so a prose acronym-plural
535
+ // like `slices/PRDs/code` or `PRDs/ADRs` (the artifact word `PRDs` + `/`
536
+ // + another word) is NOT mis-flagged as a folder ref (the option-A prose
537
+ // exemption). The `${WORK_ROOT}/${fromFolder}` pattern above still
538
+ // catches a rooted `work/prds/...` path case-insensitively as the backstop.
539
+ pattern: new RegExp(`\\b${migration.fromFolder}/(proposed|ready|tasked|dropped)\\b`),
540
+ why: `surviving '${migration.fromFolder}/' folder ref`,
541
+ },
542
+ {
543
+ pattern: new RegExp(`${WORK_ROOT}/${from}-`, 'i'),
544
+ why: `surviving '${WORK_ROOT}/${from}-' branch ref`,
545
+ },
546
+ {
547
+ pattern: new RegExp(`(^|[^A-Za-z])${from}:[A-Za-z0-9]`, 'i'),
548
+ why: `surviving '${from}:<slug>' arg`,
549
+ },
550
+ ];
551
+ // Config-key survivors (the exact keys the config layer renames).
552
+ const configKeyPatterns = migration.configKeys.map(({ from: key }) => ({
553
+ pattern: new RegExp(`"${key}"`),
554
+ why: `surviving '${key}' config key`,
555
+ }));
556
+ // Corrupted-English (reverse) shapes a blind sweep would have produced.
557
+ const corrupted = [
558
+ { pattern: /esspec/i, why: 'especially → esspec… (mangle)' },
559
+ { pattern: /speccif/i, why: 'specify/specific → speccif… (mangle)' },
560
+ { pattern: /inspecc/i, why: 'inspect → inspecc… (mangle)' },
561
+ { pattern: /respecc/i, why: 'respect → respecc… (mangle)' },
562
+ ];
563
+ const scanText = (where, text, keyPatterns) => {
564
+ const lines = text.split('\n');
565
+ lines.forEach((line, idx) => {
566
+ for (const { pattern, why } of structural) {
567
+ const m = pattern.exec(line);
568
+ if (m) {
569
+ leaks.push({
570
+ where: `${where}:${idx + 1}`,
571
+ token: m[0],
572
+ lens: 'forward',
573
+ why,
574
+ });
575
+ }
576
+ }
577
+ for (const { pattern, why } of keyPatterns) {
578
+ const m = pattern.exec(line);
579
+ if (m) {
580
+ leaks.push({
581
+ where: `${where}:${idx + 1}`,
582
+ token: m[0],
583
+ lens: 'forward',
584
+ why,
585
+ });
586
+ }
587
+ }
588
+ for (const { pattern, why } of corrupted) {
589
+ const m = pattern.exec(line);
590
+ if (m) {
591
+ leaks.push({
592
+ where: `${where}:${idx + 1}`,
593
+ token: m[0],
594
+ lens: 'reverse',
595
+ why,
596
+ });
597
+ }
598
+ }
599
+ });
600
+ };
601
+ // Walk every converted data item (the FULL folder set, incl. done/tasked).
602
+ for (const folder of ITEM_CONTENT_FOLDERS) {
603
+ for (const rel of collectMarkdown(repoPath, folder)) {
604
+ scanText(rel, readFileSync(join(repoPath, rel), 'utf8'), []);
605
+ }
606
+ }
607
+ // The config file (the key layer).
608
+ const configAbs = join(repoPath, '.dorfl.json');
609
+ if (existsSync(configAbs)) {
610
+ scanText('.dorfl.json', readFileSync(configAbs, 'utf8'), configKeyPatterns);
611
+ }
612
+ // The FOLDER TREE itself: a surviving `work/prds/` directory (empty ⇒ no
613
+ // file, but the folder still leaks). Report it structurally.
614
+ const strayFolder = join(repoPath, WORK_ROOT, migration.fromFolder);
615
+ if (existsSync(strayFolder)) {
616
+ leaks.push({
617
+ where: `${WORK_ROOT}/${migration.fromFolder}`,
618
+ token: `${WORK_ROOT}/${migration.fromFolder}`,
619
+ lens: 'forward',
620
+ why: `surviving '${WORK_ROOT}/${migration.fromFolder}/' folder`,
621
+ });
622
+ }
623
+ // The git refs (lock refs + branches carrying the retired word).
624
+ for (const spec of [
625
+ {
626
+ args: ['for-each-ref', '--format=%(refname)', 'refs/dorfl/lock/'],
627
+ where: 'refs/dorfl/lock',
628
+ },
629
+ {
630
+ args: [
631
+ 'for-each-ref',
632
+ '--format=%(refname:short)',
633
+ `refs/heads/${WORK_ROOT}/`,
634
+ ],
635
+ where: 'refs/heads',
636
+ },
637
+ ]) {
638
+ const res = run('git', spec.args, repoPath, { env });
639
+ if (res.status !== 0)
640
+ continue;
641
+ for (const line of res.stdout.split('\n')) {
642
+ const ref = line.trim();
643
+ if (ref === '')
644
+ continue;
645
+ if (new RegExp(`(^|/)${from}-`, 'i').test(ref) ||
646
+ new RegExp(`/${from}-`, 'i').test(ref)) {
647
+ leaks.push({
648
+ where: spec.where,
649
+ token: ref,
650
+ lens: 'forward',
651
+ why: `surviving '${from}-' git ref`,
652
+ });
653
+ }
654
+ }
655
+ }
656
+ return leaks;
657
+ }
658
+ /**
659
+ * Run the self-contained `prd → spec` migration end-to-end (ADR §7e, decision
660
+ * B): quiescence gate → setup re-sync → four-layer data migration → leak scan.
661
+ * On a quiescence violation it REFUSES (returns `{refused}`, runs no layer). The
662
+ * thin `dorfl prd-to-spec` CLI shell formats this result; the fixture test
663
+ * asserts each field. `dryRun` threads through every layer.
664
+ */
665
+ export function runPrdToSpec(options) {
666
+ const { repoPath } = options;
667
+ const migration = options.migration ?? MIGRATION;
668
+ const dryRun = options.dryRun === true;
669
+ const env = options.env;
670
+ const refused = checkQuiescence(repoPath, migration, env);
671
+ if (refused) {
672
+ return {
673
+ refused,
674
+ dryRun,
675
+ folderMoves: [],
676
+ contentRewrites: [],
677
+ configRewrites: [],
678
+ refRenames: [],
679
+ leaks: [],
680
+ };
681
+ }
682
+ // 2. Setup contract re-sync FIRST (decision B).
683
+ const resync = resyncProtocol(repoPath, { dryRun });
684
+ // 3a. Folders (git mv) — before content, so the content sweep also fixes the
685
+ // moved items' own `work/prds/…` body refs in their NEW location.
686
+ const folderMoves = migrateFolders(repoPath, migration, { dryRun });
687
+ // 3b. Item content (frontmatter + inert refs) across ALL items incl. done/.
688
+ const contentRewrites = migrateAllItemContent(repoPath, migration, { dryRun });
689
+ // 3c. Config key rename.
690
+ const configRewrites = migrateConfig(repoPath, migration, { dryRun });
691
+ // 3d. Inert git refs (lock refs + work-branches).
692
+ const refRenames = migrateRefs(repoPath, migration, { dryRun, env });
693
+ // The acceptance GATE over the converted tree (skipped under dry-run, where
694
+ // nothing was written so the tree still carries the pre-migration data).
695
+ const leaks = dryRun ? [] : scanForLeaks(repoPath, migration, env);
696
+ return {
697
+ dryRun,
698
+ resync,
699
+ folderMoves,
700
+ contentRewrites,
701
+ configRewrites,
702
+ refRenames,
703
+ leaks,
704
+ };
705
+ }
706
+ //# sourceMappingURL=prd-to-spec.js.map