dorfl 0.0.0 → 0.1.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 (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 +3094 -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 +215 -0
  162. package/dist/frontmatter.d.ts.map +1 -0
  163. package/dist/frontmatter.js +345 -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 +315 -0
  330. package/dist/prd-to-spec.d.ts.map +1 -0
  331. package/dist/prd-to-spec.js +684 -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 +360 -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 +952 -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 +4369 -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 +485 -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 +1023 -0
  581. package/src/prepare.ts +230 -0
  582. package/src/prompt.ts +760 -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 +1438 -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
package/src/prompt.ts ADDED
@@ -0,0 +1,760 @@
1
+ /**
2
+ * Builds the prompt the runner hands to `agentCmd`: a small CONSTANT wrapper
3
+ * (only the `<slug>` / source-prd path vary) around the claimed task's own
4
+ * `## Prompt` section. This is dual-use — the SAME assembly the autonomous
5
+ * runner feeds `agentCmd` and the human `dorfl prompt [<slug>]` command.
6
+ *
7
+ * The wrapper is NOT hardcoded here: it is read VERBATIM from the work-contract
8
+ * (`skills/setup/protocol/CLAIM-PROTOCOL.md` → "The prompt handed to the work agent"),
9
+ * so the emitted text can never silently diverge from the canonical contract.
10
+ * We only substitute the per-task placeholders (`<slug>`, `<prd>`).
11
+ *
12
+ * The wrapper draws the git boundary IN-BAND — the spawned agent does NO git ops
13
+ * on the repo (no commit/push, no moving `work/` files); the RUNNER owns every
14
+ * git-state transition (claim, done-move, work commit, integration). We state
15
+ * this in the prompt rather than relying on the host's global agent config (an
16
+ * `AGENTS.md`), because the runner is portable and cannot assume any host rule
17
+ * exists. See CLAIM-PROTOCOL.md → "The prompt handed to the work agent".
18
+ */
19
+
20
+ import {existsSync, readFileSync} from 'node:fs';
21
+ import {dirname, join, resolve} from 'node:path';
22
+ import {fileURLToPath} from 'node:url';
23
+ import {parseFrontmatter, type Frontmatter} from './frontmatter.js';
24
+ import type {PromptGuidance} from './config.js';
25
+ import {
26
+ WORK_ROOT,
27
+ workFolderName,
28
+ workItemPath,
29
+ workFolderRel,
30
+ type TaskResolutionFolder,
31
+ } from './work-layout.js';
32
+ import {run, type RunResult} from './git.js';
33
+ import {branchAheadOf} from './continue-branch.js';
34
+ import {isAncestor} from './gc.js';
35
+ import {extractReason} from './needs-attention.js';
36
+
37
+ /**
38
+ * Extract the body of the `## Prompt` section from a task's markdown. Returns
39
+ * the section text with the heading removed, leading `>` blockquote markers
40
+ * stripped, trimmed; or `undefined` when the task has no `## Prompt` heading.
41
+ */
42
+ export function extractPromptSection(content: string): string | undefined {
43
+ const normalized = content.replace(/\r\n/g, '\n');
44
+ const lines = normalized.split('\n');
45
+
46
+ let start = -1;
47
+ let headingLevel = 0;
48
+ for (let i = 0; i < lines.length; i++) {
49
+ const match = /^(#{1,6})\s+(.*)$/.exec(lines[i]);
50
+ if (match && match[2].trim().toLowerCase() === 'prompt') {
51
+ start = i + 1;
52
+ headingLevel = match[1].length;
53
+ break;
54
+ }
55
+ }
56
+ if (start === -1) {
57
+ return undefined;
58
+ }
59
+
60
+ // Collect until the next heading of the same or higher level (fewer/equal #).
61
+ const body: string[] = [];
62
+ for (let i = start; i < lines.length; i++) {
63
+ const heading = /^(#{1,6})\s+/.exec(lines[i]);
64
+ if (heading && heading[1].length <= headingLevel) {
65
+ break;
66
+ }
67
+ body.push(lines[i]);
68
+ }
69
+
70
+ // Strip a single leading blockquote marker (`> ` or `>`) from each line.
71
+ const unquoted = body.map((line) => line.replace(/^>\s?/, ''));
72
+
73
+ const text = unquoted.join('\n').trim();
74
+ return text === '' ? undefined : text;
75
+ }
76
+
77
+ /**
78
+ * Locate one of the runtime-read protocol docs (`CLAIM-PROTOCOL.md`,
79
+ * `REVIEW-PROTOCOL.md`, …) the runner reads at RUNTIME. Resolution order,
80
+ * highest authority first:
81
+ *
82
+ * 1. `override` — explicit, for tests / unusual layouts (short-circuits).
83
+ * 2. `<cwd>/work/protocol/<name>` — the TARGET repo's adopted copy. `setup`
84
+ * copies the protocol docs verbatim into every repo's `work/protocol/`
85
+ * (ADR `methodology-and-skills.md` §5, the `work/protocol/` propagation),
86
+ * so a set-up repo carries the protocol VERSION it adopted; that copy
87
+ * wins.
88
+ * 3. `dist/protocol/<name>` — a copy VENDORED inside this package (by the
89
+ * `vendor-protocol` build step). The published-CLI fallback: an installed
90
+ * CLI has no sibling `skills/` tree, and the target repo may not be set
91
+ * up yet (no `work/protocol/`), so the package ships its own copy of the
92
+ * SET of runtime-read protocol docs.
93
+ * 4. the legacy monorepo-relative `skills/setup/protocol/<name>` walk —
94
+ * DEV-only, kept LAST (it only resolves inside this dev monorepo; an
95
+ * installed CLI's walks escape into the consumer's filesystem → ENOENT,
96
+ * which is why it cannot be the primary source).
97
+ *
98
+ * `cwd` is the target repo root (threaded from `renderPrompt`/`do`/`run`/the
99
+ * `render-prompt` CLI). When omitted, the target-repo step is simply skipped.
100
+ * `name` is the doc's BASENAME (e.g. `'CLAIM-PROTOCOL.md'`).
101
+ */
102
+ export function resolveProtocolDoc(
103
+ name: string,
104
+ cwd?: string,
105
+ override?: string,
106
+ ): string {
107
+ if (override) {
108
+ return override;
109
+ }
110
+ const here = dirname(fileURLToPath(import.meta.url));
111
+ // here = .../packages/dorfl/{src,dist}.
112
+ const candidates: string[] = [];
113
+ // 2. The target repo's adopted copy (authoritative when present).
114
+ if (cwd) {
115
+ candidates.push(resolve(cwd, WORK_ROOT, workFolderName('protocol'), name));
116
+ }
117
+ // 3. The copy vendored inside this package (published-CLI fallback). From
118
+ // `src/` (tsx) `dist/` is a sibling; from `dist/` it is the dir itself.
119
+ candidates.push(
120
+ resolve(here, '..', 'dist', 'protocol', name),
121
+ resolve(here, 'protocol', name),
122
+ );
123
+ // 4. The legacy monorepo-relative `skills/setup/protocol/` walks — DEV-only,
124
+ // LAST. The docs are OWNED by the `setup` skill (`skills/setup/protocol/`).
125
+ candidates.push(
126
+ resolve(here, '..', '..', '..', 'skills', 'setup', 'protocol', name),
127
+ resolve(here, '..', '..', '..', '..', 'skills', 'setup', 'protocol', name),
128
+ );
129
+ for (const candidate of candidates) {
130
+ if (existsSync(candidate)) {
131
+ return candidate;
132
+ }
133
+ }
134
+ return candidates[0];
135
+ }
136
+
137
+ /**
138
+ * Pull the canonical wrapper TEMPLATE out of CLAIM-PROTOCOL.md: the first fenced
139
+ * code block following the "The prompt handed to the work agent" heading. The
140
+ * returned text still contains the `<slug>` / `<prd>` placeholders verbatim — it
141
+ * is the single source of truth for the wrapper.
142
+ */
143
+ export function extractCanonicalWrapperTemplate(protocol: string): string {
144
+ const normalized = protocol.replace(/\r\n/g, '\n');
145
+ const lines = normalized.split('\n');
146
+
147
+ // Find the "prompt handed to the work agent" heading (any level).
148
+ let headingIndex = -1;
149
+ for (let i = 0; i < lines.length; i++) {
150
+ const match = /^#{1,6}\s+(.*)$/.exec(lines[i]);
151
+ if (match && /prompt handed to the work agent/i.test(match[1])) {
152
+ headingIndex = i;
153
+ break;
154
+ }
155
+ }
156
+ if (headingIndex === -1) {
157
+ throw new Error(
158
+ 'CLAIM-PROTOCOL.md: could not find the "prompt handed to the work agent" section',
159
+ );
160
+ }
161
+
162
+ // Find the opening fence of the first code block after the heading.
163
+ let open = -1;
164
+ for (let i = headingIndex + 1; i < lines.length; i++) {
165
+ if (/^```/.test(lines[i])) {
166
+ open = i;
167
+ break;
168
+ }
169
+ // A new heading before any fence means the wrapper block is missing.
170
+ if (/^#{1,6}\s+/.test(lines[i])) {
171
+ break;
172
+ }
173
+ }
174
+ if (open === -1) {
175
+ throw new Error(
176
+ 'CLAIM-PROTOCOL.md: no fenced wrapper block under the work-agent-prompt section',
177
+ );
178
+ }
179
+
180
+ let close = -1;
181
+ for (let i = open + 1; i < lines.length; i++) {
182
+ if (/^```/.test(lines[i])) {
183
+ close = i;
184
+ break;
185
+ }
186
+ }
187
+ if (close === -1) {
188
+ throw new Error('CLAIM-PROTOCOL.md: unterminated wrapper code block');
189
+ }
190
+
191
+ return lines
192
+ .slice(open + 1, close)
193
+ .join('\n')
194
+ .trim();
195
+ }
196
+
197
+ /**
198
+ * The single-pass extractor-post-step for the `promptGuidance` NUDGE namespace.
199
+ * Resolves every `<!-- if promptGuidance.<member> --> … <!-- else --> … <!-- /if -->`
200
+ * conditional fragment in the canonical wrapper template ("Option A" — single
201
+ * wrapper, conditional fragments — see the ADR + this task's recorded decision):
202
+ * when the named nudge member resolves TRUE the IF-branch text is kept and the
203
+ * markers + ELSE-branch are stripped; when FALSE the ELSE-branch text is kept
204
+ * and the markers + IF-branch are stripped. The markers' own lines (and the
205
+ * newlines that terminate them) are consumed too, so the OFF-path output is
206
+ * BYTE-IDENTICAL to the pre-marker template — the guard the prompt-assembly
207
+ * byte-identity test pins.
208
+ *
209
+ * Pure string transform; runs AFTER `extractCanonicalWrapperTemplate` (a pure
210
+ * verbatim extractor stays a pure verbatim extractor) and BEFORE the
211
+ * `<slug>`/`<prd>` substitution.
212
+ */
213
+ export function applyPromptGuidance(
214
+ template: string,
215
+ nudges: {testFirst?: boolean} = {},
216
+ ): string {
217
+ const values: Record<string, boolean> = {
218
+ testFirst: nudges.testFirst === true,
219
+ };
220
+ return template.replace(
221
+ /<!-- if promptGuidance\.(\w+) -->\n([\s\S]*?)\n<!-- else -->\n([\s\S]*?)\n<!-- \/if -->/g,
222
+ (_match, member: string, ifBranch: string, elseBranch: string) => {
223
+ const on = values[member] === true;
224
+ return on ? ifBranch : elseBranch;
225
+ },
226
+ );
227
+ }
228
+
229
+ /**
230
+ * The constant wrapper, parameterised only by the task slug, its source prd
231
+ * slug, and (optionally) the resolved {@link PromptGuidance} nudges. Read
232
+ * verbatim from the work-contract and substituted — never a divergent hardcoded
233
+ * copy. `prd` may be `undefined` when the task has no `prd:` field. When
234
+ * `promptGuidance` is omitted (or every member resolves false) the output is
235
+ * BYTE-IDENTICAL to today's wrapper (the ELSE-branch of every conditional is
236
+ * the historic text).
237
+ */
238
+ export function wrapper(
239
+ slug: string,
240
+ prd: string | undefined,
241
+ options: {
242
+ protocolPath?: string;
243
+ cwd?: string;
244
+ promptGuidance?: {testFirst?: boolean};
245
+ } = {},
246
+ ): string {
247
+ const protocolPath = resolveProtocolDoc(
248
+ 'CLAIM-PROTOCOL.md',
249
+ options.cwd,
250
+ options.protocolPath,
251
+ );
252
+ const protocol = readFileSync(protocolPath, 'utf8');
253
+ const template = extractCanonicalWrapperTemplate(protocol);
254
+ const resolved = applyPromptGuidance(template, options.promptGuidance);
255
+ return resolved.replace(/<slug>/g, slug).replace(/<prd>/g, prd ?? '<prd>');
256
+ }
257
+
258
+ /**
259
+ * The CONTINUE context that turns the fresh-start assembly into a continue-mode
260
+ * one (the `agent-prompt-continue-context` task). It is OPT-IN state inherited
261
+ * from a PRIOR attempt: present iff the arbiter holds a `work/<slug>` branch
262
+ * AHEAD of main (the `requeue` default kept it) — the SAME condition the
263
+ * `requeue-continue-and-reset` onboarding paths detect via {@link branchAheadOf}.
264
+ * When absent, the assembly stays byte-identical to the fresh-start wrapper.
265
+ */
266
+ export interface ContinueContext {
267
+ /**
268
+ * The arbiter remote name the prior `work/<type>-<slug>` lives on (e.g.
269
+ * `origin` / `arbiter`). Used only to point the agent at the right diff base
270
+ * (`<arbiter>/main`) — the block is prose, not a git op.
271
+ */
272
+ arbiter: string;
273
+ /**
274
+ * The NAMESPACED work branch the prior attempt's work lives on
275
+ * (`work/<type>-<slug>`), derived from the resolved `branchRef`. The block
276
+ * prose names it VERBATIM (the agent's `git diff` pointer must hit the real
277
+ * branch, not a bare `work/<slug>`).
278
+ */
279
+ branch: string;
280
+ /**
281
+ * The needs-attention reason (runner-written: WHY the prior attempt stalled),
282
+ * read from the item BODY. Empty string when none was recorded.
283
+ */
284
+ reason: string;
285
+ /**
286
+ * The requeue handoff note(s) (human-written via `requeue -m`: what to do
287
+ * about it), read from the item BODY — the accumulated `## Requeue YYYY-MM-DD`
288
+ * sections, newest last. Empty array when none were threaded.
289
+ */
290
+ requeueNotes: string[];
291
+ }
292
+
293
+ /** The heading prefix the requeue handoff notes are appended under. */
294
+ const REQUEUE_HEADING_PREFIX = '## Requeue';
295
+
296
+ /**
297
+ * Extract the accumulated requeue handoff notes from an item's BODY: the prose
298
+ * under each `## Requeue YYYY-MM-DD` heading (append-only; written by
299
+ * `requeue -m "<note>"` in `needs-attention.ts`). Returns one trimmed string per
300
+ * section in file order (oldest first, newest last); `[]` when none are present.
301
+ */
302
+ export function extractRequeueNotes(content: string): string[] {
303
+ const normalized = content.replace(/\r\n/g, '\n');
304
+ const lines = normalized.split('\n');
305
+ const notes: string[] = [];
306
+ for (let i = 0; i < lines.length; i++) {
307
+ if (!lines[i].startsWith(REQUEUE_HEADING_PREFIX)) {
308
+ continue;
309
+ }
310
+ // Collect the prose under this heading until the next `## ` heading or EOF.
311
+ const collected: string[] = [];
312
+ for (let j = i + 1; j < lines.length; j++) {
313
+ if (/^##\s/.test(lines[j])) {
314
+ break;
315
+ }
316
+ collected.push(lines[j]);
317
+ }
318
+ const note = collected.join('\n').trim();
319
+ if (note !== '') {
320
+ notes.push(note);
321
+ }
322
+ }
323
+ return notes;
324
+ }
325
+
326
+ /**
327
+ * Resolve the CONTINUE context for `slug`, runner-side, REUSING the SAME
328
+ * continue-detection the `requeue-continue-and-reset` claim/start path uses
329
+ * ({@link branchAheadOf}) — never a parallel re-derivation. Returns a
330
+ * {@link ContinueContext} iff the arbiter holds a `work/<slug>` ref AHEAD of
331
+ * main (the prior attempt's kept work); otherwise `undefined` (fresh-start: the
332
+ * common case, a first attempt or a `requeue --reset` that deleted the branch).
333
+ *
334
+ * The reason + handoff note(s) are read from the item BODY (the ledger file the
335
+ * caller already resolved), so they survive the requeue → tasks-ready (the pool) → claim gap
336
+ * and cross machines. The ref names match the two onboarding paths:
337
+ * - in-place clone: branchRef=`<arbiter>/work/<slug>`, mainRef=`<arbiter>/main`
338
+ * - bare hub mirror: branchRef=`work/<slug>`, mainRef=`main`
339
+ */
340
+ export function resolveContinueContext(options: {
341
+ /** The repo/worktree/mirror the branch refs live in. */
342
+ cwd: string;
343
+ /** The slug being onboarded. */
344
+ slug: string;
345
+ /** The arbiter remote name (for the diff-base pointer in the block). */
346
+ arbiter: string;
347
+ /** The `work/<slug>` ref to test (in-place: `<arbiter>/work/<slug>`). */
348
+ branchRef: string;
349
+ /** The main ref to compare against (in-place: `<arbiter>/main`). */
350
+ mainRef: string;
351
+ /** The resolved task file content (the item body the notes live in). */
352
+ content: string;
353
+ /** Environment for the read-only git child. */
354
+ env?: NodeJS.ProcessEnv;
355
+ }): ContinueContext | undefined {
356
+ if (
357
+ !branchAheadOf(options.cwd, options.branchRef, options.mainRef, options.env)
358
+ ) {
359
+ return undefined;
360
+ }
361
+ return {
362
+ arbiter: options.arbiter,
363
+ // Strip any `<arbiter>/` remote prefix off the ref to recover the bare
364
+ // `work/<type>-<slug>` branch name the prose points at.
365
+ branch: stripRemotePrefix(options.branchRef, options.arbiter),
366
+ reason: extractReason(options.content),
367
+ requeueNotes: extractRequeueNotes(options.content),
368
+ };
369
+ }
370
+
371
+ /**
372
+ * Recover the bare `work/<type>-<slug>` branch from a resolved ref: drop a
373
+ * leading `<arbiter>/` (the in-place remote-tracking form `<arbiter>/work/...`);
374
+ * the bare hub-mirror form (`work/...`) is returned as-is.
375
+ */
376
+ function stripRemotePrefix(branchRef: string, arbiter: string): string {
377
+ const prefix = `${arbiter}/`;
378
+ return branchRef.startsWith(prefix)
379
+ ? branchRef.slice(prefix.length)
380
+ : branchRef;
381
+ }
382
+
383
+ /**
384
+ * Build the CONTINUE block injected ahead of the task prompt in continue-mode.
385
+ * Pure text: a "you are continuing" framing + a pointer to review the prior diff
386
+ * vs `<arbiter>/main` + the needs-attention reason + the requeue handoff note(s)
387
+ * (read from the item body). Never emitted in fresh-start mode.
388
+ */
389
+ export function buildContinueBlock(slug: string, ctx: ContinueContext): string {
390
+ const lines: string[] = [];
391
+ lines.push('## You are CONTINUING prior work on this task');
392
+ lines.push('');
393
+ lines.push(
394
+ `This is NOT a fresh start. A prior attempt at '${slug}' was requeued, and ` +
395
+ `you have landed on its \`${ctx.branch}\` branch — it ALREADY carries that ` +
396
+ 'work. Before you implement anything, REVIEW what the prior attempt did ' +
397
+ `(\`git diff ${ctx.arbiter}/main...${ctx.branch}\`) and BUILD ON what is ` +
398
+ 'good — do NOT blindly restart or undo it.',
399
+ );
400
+ if (ctx.reason.trim() !== '') {
401
+ lines.push('');
402
+ lines.push('### Why the prior attempt stalled (needs-attention reason)');
403
+ lines.push('');
404
+ lines.push(ctx.reason.trim());
405
+ }
406
+ if (ctx.requeueNotes.length > 0) {
407
+ lines.push('');
408
+ lines.push('### Handoff note(s) from the requeue');
409
+ lines.push('');
410
+ for (const note of ctx.requeueNotes) {
411
+ lines.push(note.trim());
412
+ lines.push('');
413
+ }
414
+ }
415
+ return lines.join('\n').trim();
416
+ }
417
+
418
+ /**
419
+ * Build the full prompt: the canonical wrapper for `slug` (with its source prd
420
+ * substituted) followed by the task's own `## Prompt` body, appended verbatim.
421
+ *
422
+ * In CONTINUE-mode (a {@link ContinueContext} is supplied), a CONTINUE block is
423
+ * injected between the wrapper and the task prompt — telling the agent it is
424
+ * continuing, where to find the prior diff, why it stalled, and the human's
425
+ * handoff note(s). In FRESH-START mode (no context, the common case) the output
426
+ * is BYTE-IDENTICAL to the canonical wrapper + task prompt — no CONTINUE block.
427
+ */
428
+ export function buildAgentPrompt(
429
+ slug: string,
430
+ prd: string | undefined,
431
+ taskPrompt: string,
432
+ options: {
433
+ protocolPath?: string;
434
+ cwd?: string;
435
+ continueContext?: ContinueContext;
436
+ promptGuidance?: {testFirst?: boolean};
437
+ } = {},
438
+ ): string {
439
+ const head = wrapper(slug, prd, options);
440
+ if (options.continueContext) {
441
+ const block = buildContinueBlock(slug, options.continueContext);
442
+ return `${head}\n\n${block}\n\n${taskPrompt}\n`;
443
+ }
444
+ return `${head}\n\n${taskPrompt}\n`;
445
+ }
446
+
447
+ /**
448
+ * Which work/ folder a task file was resolved from. `done` is reachable ONLY on
449
+ * a CONTINUE and ONLY when the work-branch tip is STRANDED (committed-but-not-on
450
+ * the arbiter) — never on a fresh claim, never for a genuinely-COMPLETE task
451
+ * (see {@link resolveTask} + {@link ContinueResolutionGate}).
452
+ */
453
+ export type TaskFolder = TaskResolutionFolder;
454
+
455
+ export interface ResolvedTask {
456
+ /** The slug of the resolved task. */
457
+ slug: string;
458
+ /** Absolute path to the task file that was read. */
459
+ path: string;
460
+ /** The folder the task was resolved from (in-progress wins over tasks-ready). */
461
+ folder: TaskFolder;
462
+ /** The task's source prd slug (frontmatter `prd:`), if any. */
463
+ prd: string | undefined;
464
+ /** The extracted `## Prompt` body. */
465
+ taskPrompt: string;
466
+ }
467
+
468
+ export interface PromptOptions {
469
+ /** Slug to render. If omitted, inferred from a `work/<slug>` branch. */
470
+ slug?: string;
471
+ /** The repo root (defaults to cwd). */
472
+ cwd: string;
473
+ /** Override the path to CLAIM-PROTOCOL.md (tests / unusual layouts). */
474
+ protocolPath?: string;
475
+ /** Environment for the branch-inference git child. */
476
+ env?: NodeJS.ProcessEnv;
477
+ /**
478
+ * Resolved {@link PromptGuidance} nudges (the prompt-text knobs the
479
+ * `promptGuidance` namespace carries; e.g. `testFirst`). Omitted (the
480
+ * common case) ⇒ every member false ⇒ wrapper byte-identical to today.
481
+ * The CLI's `prompt` action resolves this from the per-repo config; the
482
+ * autonomous `do`/`run` paths thread it through `buildAgentPrompt`.
483
+ */
484
+ promptGuidance?: {testFirst?: boolean};
485
+ }
486
+
487
+ /** Raised for usage/environment problems (no slug, no task file, no prompt). */
488
+ export class PromptError extends Error {}
489
+
490
+ /**
491
+ * The CONTINUE-only gate that lets {@link resolveTask} reach a task that has
492
+ * already been done-moved into `work/done/` — story 5 of the `ledger-integrity`
493
+ * prd (defect 3). A continue/re-claim can legitimately land on a branch whose
494
+ * task was ALREADY moved to `done/` (the green-but-unpushed STRAND state), and
495
+ * onboard must find it; but a `done/` task is folder-indistinguishable between
496
+ * two states and re-onboarding a genuinely-finished one would RE-RUN it. So
497
+ * `done/` is admitted ONLY behind this gate, which disambiguates by TIP-vs-
498
+ * ARBITER reachability, NEVER folder name alone:
499
+ *
500
+ * - work-branch tip REACHABLE on `<arbiter>/main` => COMPLETE => NOT admitted
501
+ * (onboard must not resurrect a finished task).
502
+ * - work-branch tip committed-but-NOT-on-the-arbiter => STRANDED => admitted
503
+ * (the continue is legitimate).
504
+ *
505
+ * The reachability predicate REUSES {@link isAncestor} (the one provably-merged
506
+ * primitive in `gc.ts`, the same `merge-base --is-ancestor <tip> <arbiter>/main`
507
+ * the reaper uses) — no second, divergent reachability implementation. Absent
508
+ * this gate (a fresh claim — `resolveTask` called with no continue gate) the
509
+ * resolution is UNCHANGED: `in-progress` then `tasks-ready` (the pool), blind to
510
+ * `done/`.
511
+ */
512
+ export interface ContinueResolutionGate {
513
+ /** The repo/worktree/mirror the work-branch + arbiter refs live in. */
514
+ cwd: string;
515
+ /**
516
+ * The work-branch tip to test for reachability. In-place clone:
517
+ * `<arbiter>/work/<slug>`; bare hub mirror: `work/<slug>`. The SAME ref the
518
+ * matching {@link resolveContinueContext} call passes as `branchRef`.
519
+ */
520
+ branchRef: string;
521
+ /**
522
+ * The arbiter main ref the tip is tested against. In-place clone:
523
+ * `<arbiter>/main`; bare hub mirror: `main`. The SAME ref the matching
524
+ * {@link resolveContinueContext} call passes as `mainRef`.
525
+ */
526
+ mainRef: string;
527
+ /** Environment for the read-only reachability git child. */
528
+ env?: NodeJS.ProcessEnv;
529
+ }
530
+
531
+ /**
532
+ * Extra knobs for {@link resolveTask} beyond the continue gate. Today the only
533
+ * member is `allowBacklog` (prd
534
+ * `do-allow-backlog-drive-staged-tasks-without-promotion`): the operator's
535
+ * EXPLICIT `do … --allow-backlog`, which widens resolution to also search
536
+ * `tasks-backlog` (staging) at LOWEST priority. Default off (omitted) \u21d2 the
537
+ * resolution is byte-identical to today; no autonomous path sets it.
538
+ */
539
+ export interface ResolveTaskOptions {
540
+ /**
541
+ * When `true`, append `tasks-backlog` (staging) to the resolution order at
542
+ * LOWEST priority (after `tasks-ready`), so a human can drive a staged task in
543
+ * place WITHOUT promoting it. The READY copy wins a same-slug tie. Reachable
544
+ * ONLY via the explicit `--allow-backlog` flag \u2014 never `run`/auto-pick/advance.
545
+ */
546
+ allowBacklog?: boolean;
547
+ }
548
+
549
+ /**
550
+ * True iff the work-branch tip (`gate.branchRef`) is genuinely STRANDED: it
551
+ * resolves to a commit that is NOT reachable on the arbiter main
552
+ * (`gate.mainRef`). REUSES {@link isAncestor} (`gc.ts`) — the one reachability
553
+ * predicate — never a second one. When the branch ref does not resolve (no prior
554
+ * attempt's branch on the arbiter) the task is NOT treated as a stranded
555
+ * continue (false → `done/` stays unreachable, the safe direction). Read-only.
556
+ */
557
+ function isStrandedDoneTip(gate: ContinueResolutionGate): boolean {
558
+ const tip = run(
559
+ 'git',
560
+ ['rev-parse', '--verify', '--quiet', `${gate.branchRef}^{commit}`],
561
+ gate.cwd,
562
+ {env: gate.env},
563
+ ).stdout.trim();
564
+ if (tip === '') {
565
+ return false; // no work-branch tip on the arbiter → not a stranded continue
566
+ }
567
+ // STRANDED ⇔ the tip is NOT an ancestor of the arbiter main (not integrated).
568
+ // REACHABLE (an ancestor) ⇒ COMPLETE ⇒ do NOT re-onboard.
569
+ return !isAncestor(gate.cwd, tip, gate.mainRef, gate.env);
570
+ }
571
+
572
+ /**
573
+ * Resolve a task's file: prefer `work/in-progress/<slug>.md`, fall back to
574
+ * `work/tasks/ready/<slug>.md` (the pool). Returns the parsed prd + extracted
575
+ * `## Prompt` body. Throws {@link PromptError} when neither file exists or it has
576
+ * no prompt body.
577
+ *
578
+ * On a CONTINUE (a {@link ContinueResolutionGate} is supplied), `work/done/` is
579
+ * added to the resolution AFTER `in-progress`/`tasks-ready` — but ONLY when the
580
+ * gate proves the work-branch tip is STRANDED (committed-but-not-on-the-arbiter).
581
+ * A genuinely-COMPLETE `done/` task (tip reachable on `<arbiter>/main`) is NEVER
582
+ * resolved, so onboard cannot resurrect a finished task (defect 3 / story 5).
583
+ * The `in-progress`/`tasks-ready` resolution is UNCHANGED in every case; `done/`
584
+ * is
585
+ * the only addition, and it is gated. With no gate (a fresh claim) the behaviour
586
+ * is byte-identical to the original `['in-progress','tasks-ready']`-only resolution.
587
+ *
588
+ * `--allow-backlog` (prd `do-allow-backlog-drive-staged-tasks-without-promotion`):
589
+ * when {@link ResolveTaskOptions.allowBacklog} is set, `tasks-backlog` (the staging
590
+ * folder) is appended at the LOWEST priority — after `tasks-ready`, so a slug
591
+ * present in BOTH the pool and staging resolves to the READY copy (the same-slug
592
+ * precedence the prd's decision 5 fixes). Default off ⇒ byte-identical to today
593
+ * (no autonomous path sets it; staging stays unreachable to `run`/auto-pick).
594
+ */
595
+ export function resolveTask(
596
+ cwd: string,
597
+ slug: string,
598
+ continueGate?: ContinueResolutionGate,
599
+ options?: ResolveTaskOptions,
600
+ ): ResolvedTask {
601
+ const order: TaskFolder[] = ['in-progress', 'tasks-ready'];
602
+ // `--allow-backlog`: append `tasks-backlog` at LOWEST priority (after
603
+ // `tasks-ready`), so the READY copy wins a same-slug tie and a staged task is
604
+ // only reachable behind the explicit flag. Default off ⇒ unchanged.
605
+ if (options?.allowBacklog === true) {
606
+ order.push('tasks-backlog');
607
+ }
608
+ // `done/` is appended ONLY on a continue whose work-branch tip is STRANDED —
609
+ // the tip-vs-arbiter gate (NEVER folder name alone). A complete task (tip on
610
+ // the arbiter) leaves the order untouched, so onboard never re-runs it.
611
+ if (continueGate && isStrandedDoneTip(continueGate)) {
612
+ order.push('done');
613
+ }
614
+ for (const folder of order) {
615
+ const path = workItemPath(cwd, folder, slug);
616
+ if (!existsSync(path)) {
617
+ continue;
618
+ }
619
+ const content = readFileSync(path, 'utf8');
620
+ const taskPrompt = extractPromptSection(content);
621
+ if (taskPrompt === undefined) {
622
+ throw new PromptError(
623
+ `task '${slug}' (${workFolderRel(folder)}/${slug}.md) has no '## Prompt' section`,
624
+ );
625
+ }
626
+ const fm = parseFrontmatter(content);
627
+ // MIGRATE step (prd `prd-to-spec-vocabulary-cutover-and-migration-command`):
628
+ // read the parent-spec pointer off the new `fm.spec` field (populated beside
629
+ // `fm.prd` by the expand task). The `ResolvedTask.prd` field name is left
630
+ // unchanged (a struct-field rename is out of this batch's scope).
631
+ return {slug, path, folder, prd: fm.spec, taskPrompt};
632
+ }
633
+ const searched = order.map((f) => `${workFolderRel(f)}/`).join(', ');
634
+ throw new PromptError(`no task '${slug}' found in ${searched}`);
635
+ }
636
+
637
+ /** If HEAD is a `work/<slug>` branch, return `<slug>`; else `''`. */
638
+ export function inferSlugFromBranch(
639
+ cwd: string,
640
+ env?: NodeJS.ProcessEnv,
641
+ ): string {
642
+ const sym: RunResult = run(
643
+ 'git',
644
+ ['symbolic-ref', '--quiet', '--short', 'HEAD'],
645
+ cwd,
646
+ {env},
647
+ );
648
+ if (sym.status !== 0) {
649
+ return '';
650
+ }
651
+ const match = /^work\/(.+)$/.exec(sym.stdout.trim());
652
+ return match ? match[1] : '';
653
+ }
654
+
655
+ /**
656
+ * The full `dorfl prompt [<slug>]` rendering: resolve the slug (explicit,
657
+ * else inferred from a `work/<slug>` branch), resolve its task file
658
+ * (in-progress over `tasks-ready`, the pool), and assemble the canonical wrapper
659
+ * + the task's
660
+ * `## Prompt`. Pure with respect to the repo (read-only) — the caller writes the
661
+ * result to stdout.
662
+ */
663
+ /**
664
+ * Resolve the EFFECTIVE `promptGuidance` for an item by walking the precedence
665
+ * chain (highest → lowest): the per-task frontmatter override, the per-prd
666
+ * frontmatter override (only when the task carries a `prd:`), then the
667
+ * already-resolved repo policy. Each nudge member resolves independently — a
668
+ * task's `promptGuidance.testFirst` override never bleeds into a sibling
669
+ * member — mirroring the `humanOnly`/`autoBuild` per-item override shape.
670
+ *
671
+ * A task may carry the override even when it has NO `prd:` (a self-contained
672
+ * chore), by symmetry with `humanOnly` at the item level; `specFrontmatter`
673
+ * is then simply absent and the chain reads task ⇒ repo.
674
+ */
675
+ export function resolveItemPromptGuidance(
676
+ repoResolved: PromptGuidance,
677
+ taskFrontmatter?: Frontmatter,
678
+ specFrontmatter?: Frontmatter,
679
+ ): PromptGuidance {
680
+ const taskTestFirst = taskFrontmatter?.promptGuidance.testFirst;
681
+ const specTestFirst = specFrontmatter?.promptGuidance.testFirst;
682
+ return {
683
+ testFirst: taskTestFirst ?? specTestFirst ?? repoResolved.testFirst,
684
+ };
685
+ }
686
+
687
+ /**
688
+ * Locate a prd's file on disk: prefer `work/prds/ready/<slug>.md` (the
689
+ * auto-slice pool), then fall back to `work/prds/tasked/<slug>.md` (tasked,
690
+ * resting). Returns `undefined` when neither exists — the caller treats that
691
+ * as "no prd-level override available" and the precedence chain falls
692
+ * through to the repo policy (a missing prd is NOT an error at this seam;
693
+ * the per-item override is OPTIONAL by design).
694
+ */
695
+ export function findSpecPath(
696
+ cwd: string,
697
+ specSlug: string,
698
+ ): string | undefined {
699
+ const candidates = [
700
+ workItemPath(cwd, 'specs-ready', specSlug),
701
+ workItemPath(cwd, 'specs-tasked', specSlug),
702
+ ];
703
+ for (const path of candidates) {
704
+ if (existsSync(path)) {
705
+ return path;
706
+ }
707
+ }
708
+ return undefined;
709
+ }
710
+
711
+ /**
712
+ * The convenience seam every caller of {@link buildAgentPrompt} reuses to
713
+ * resolve the per-item override: load the task frontmatter from its file +
714
+ * (when the task carries `prd:`) the prd frontmatter, then walk
715
+ * {@link resolveItemPromptGuidance}. Pure-ish (reads at most two files);
716
+ * returns the repo policy verbatim when neither item layer overrides anything.
717
+ */
718
+ export function resolvePromptGuidanceForItem(options: {
719
+ cwd: string;
720
+ repoResolved: PromptGuidance;
721
+ taskContent: string;
722
+ }): PromptGuidance {
723
+ const taskFm = parseFrontmatter(options.taskContent);
724
+ let specFm: Frontmatter | undefined;
725
+ // MIGRATE step (prd `prd-to-spec-vocabulary-cutover-and-migration-command`):
726
+ // read the parent-spec pointer off `fm.spec` (populated beside `fm.prd`).
727
+ if (taskFm.spec !== undefined) {
728
+ const specPath = findSpecPath(options.cwd, taskFm.spec);
729
+ if (specPath !== undefined) {
730
+ specFm = parseFrontmatter(readFileSync(specPath, 'utf8'));
731
+ }
732
+ }
733
+ return resolveItemPromptGuidance(options.repoResolved, taskFm, specFm);
734
+ }
735
+
736
+ export function renderPrompt(options: PromptOptions): string {
737
+ const slug = options.slug || inferSlugFromBranch(options.cwd, options.env);
738
+ if (!slug) {
739
+ throw new PromptError(
740
+ 'missing <slug> and the current branch is not a work/<slug> branch. ' +
741
+ 'usage: dorfl prompt [<slug>]',
742
+ );
743
+ }
744
+ const task = resolveTask(options.cwd, slug);
745
+ // Per-item override layer: a task or prd may pin `promptGuidance.testFirst`
746
+ // in its frontmatter, superseding the resolved repo policy for THIS item.
747
+ // We ALWAYS walk the resolver (even when no repo policy was threaded), so a
748
+ // task can opt IN to the strengthened nudge even on a repo whose default is
749
+ // off (and vice-versa) — the per-item override is the escape hatch.
750
+ const resolvedGuidance = resolvePromptGuidanceForItem({
751
+ cwd: options.cwd,
752
+ repoResolved: {testFirst: options.promptGuidance?.testFirst === true},
753
+ taskContent: readFileSync(task.path, 'utf8'),
754
+ });
755
+ return buildAgentPrompt(task.slug, task.prd, task.taskPrompt, {
756
+ protocolPath: options.protocolPath,
757
+ cwd: options.cwd,
758
+ promptGuidance: resolvedGuidance,
759
+ });
760
+ }