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
@@ -0,0 +1,312 @@
1
+ import { runAsync } from './git.js';
2
+ import { acquireItemLock, releaseItemLock, heldTaskSlugs } from './item-lock.js';
3
+ import { extractPromptSection } from './prompt.js';
4
+ import { resolveReadiness } from './readiness.js';
5
+ import { workBranchRef } from './slug-namespace.js';
6
+ import { workItemRel } from './work-layout.js';
7
+ /**
8
+ * The "lost" diagnostic for a held-lock loss, reused so its message carries the
9
+ * recovery hints a human re-running their OWN item needs. The body now STAYS in
10
+ * `work/backlog/` (claim never moves it), so a held item is identified by its LOCK
11
+ * (`action: implement` held on the per-item ref), not an `in-progress/` folder: a
12
+ * held lock + the body still in `backlog/` is the normal claimed state. We fetch
13
+ * the lock refs and, when the slug's lock is held, surface the resume/requeue
14
+ * recovery hints; otherwise (the body left `backlog/` entirely — done/removed) we
15
+ * fall back to the generic message.
16
+ */
17
+ async function lostMessage(slug, arbiter, cwd, env, fallback) {
18
+ const held = await heldTaskSlugs(cwd, arbiter, env);
19
+ if (held.has(slug)) {
20
+ return `'${slug}' is already claimed on ${arbiter}/main (its per-item lock is held). If someone else claimed it, pick another item; if it's your own (e.g. an interrupted run), continue it with \`dorfl resume ${slug}\` (or \`work-on\`), or recover via \`requeue\`.`;
21
+ }
22
+ return fallback;
23
+ }
24
+ /** Raised for usage/environment errors (exit 1). */
25
+ class ClaimUsageError extends Error {
26
+ }
27
+ /**
28
+ * Raised for a deliberate readiness REFUSAL (exit 1, outcome 'not-ready') —
29
+ * distinct from a usage/environment error. The task has an unmet `blockedBy`
30
+ * and the override was not supplied, so nothing is claimed.
31
+ */
32
+ class ClaimNotReady extends Error {
33
+ }
34
+ const DEFAULT_ARBITER = 'origin';
35
+ /**
36
+ * Perform the claim CAS. Never throws for the expected "lost the race" or
37
+ * "contended" cases — those are returned as exit 2 / 3. Usage/environment
38
+ * problems surface as exit 1. A successful claim is exit 0. This mirrors
39
+ * claim.sh's control flow exactly (refuse dirty tree → loop attempts → on
40
+ * rejection refetch & decide lost-vs-advanced → cap retries → back off).
41
+ */
42
+ export async function performClaim(options) {
43
+ const note = options.note ?? (() => { });
44
+ try {
45
+ return await runClaim(options, note);
46
+ }
47
+ catch (err) {
48
+ if (err instanceof ClaimNotReady) {
49
+ return { exitCode: 1, outcome: 'not-ready', message: err.message };
50
+ }
51
+ if (err instanceof ClaimUsageError) {
52
+ return { exitCode: 1, outcome: 'usage-error', message: err.message };
53
+ }
54
+ // Any other unexpected failure is an environment error (exit 1), never a
55
+ // false "claimed". claim.sh treats unexpected rc the same way (die → 1).
56
+ const message = err instanceof Error ? err.message : String(err);
57
+ return { exitCode: 1, outcome: 'usage-error', message };
58
+ }
59
+ }
60
+ async function runClaim(options, note) {
61
+ const slug = options.slug;
62
+ const arbiter = options.arbiter ?? DEFAULT_ARBITER;
63
+ const dryRun = options.dryRun ?? false;
64
+ const cwd = options.cwd;
65
+ const env = options.env;
66
+ if (!slug) {
67
+ throw new ClaimUsageError('missing <slug>. usage: dorfl claim <slug> [--arbiter remote]');
68
+ }
69
+ if ((await gitSoft(['rev-parse', '--git-dir'], cwd, env)).status !== 0) {
70
+ throw new ClaimUsageError('not inside a git repository');
71
+ }
72
+ if ((await gitSoft(['remote', 'get-url', arbiter], cwd, env)).status !== 0) {
73
+ throw new ClaimUsageError(`no git remote named '${arbiter}' (set one, or pass --arbiter)`);
74
+ }
75
+ // Refuse to run with a dirty tree — the claim must be a clean, isolated commit.
76
+ const dirtyWorktree = (await gitSoft(['diff', '--quiet'], cwd, env)).status !== 0;
77
+ const dirtyIndex = (await gitSoft(['diff', '--cached', '--quiet'], cwd, env)).status !== 0;
78
+ if (dirtyWorktree || dirtyIndex) {
79
+ throw new ClaimUsageError('working tree has uncommitted changes; commit/stash them before claiming');
80
+ }
81
+ // HUMAN-path readiness guard (run BEFORE the CAS so a not-ready task is never
82
+ // claimed). Reads the task frontmatter + `work/done/` from `<arbiter>/main`
83
+ // (the same source of truth the folder check uses) and resolves `blockedBy`
84
+ // via the shared resolveBlockedBy. Skipped entirely for the autonomous runner
85
+ // (no `humanPath`), whose eligibility filter already handles these upstream.
86
+ if (options.humanPath) {
87
+ await gitHard(['fetch', '--quiet', arbiter], cwd, env);
88
+ const readiness = await resolveReadiness({
89
+ slug,
90
+ cwd,
91
+ arbiter,
92
+ override: options.override === true,
93
+ env,
94
+ });
95
+ if (readiness.refuse) {
96
+ const missing = readiness.missing.join(', ');
97
+ const message = `'${slug}' is not ready: blocked by unmet dependencies not yet in ` +
98
+ `work/done/ on ${arbiter}/main: ${missing}. ` +
99
+ 'Re-run with --force (or --ignore-not-ready) to claim it anyway.';
100
+ note(message);
101
+ throw new ClaimNotReady(message);
102
+ }
103
+ if (readiness.overridden && readiness.missing.length > 0) {
104
+ note(`!! readiness guard OVERRIDDEN: claiming '${slug}' despite unmet ` +
105
+ `blockedBy: ${readiness.missing.join(', ')} (not yet in work/done/).`);
106
+ }
107
+ if (readiness.needsAnswers && !readiness.overridden) {
108
+ note(`!! WARNING: '${slug}' is flagged needsAnswers: true — it has open ` +
109
+ 'questions (see the task body). Claiming it anyway (human path); ' +
110
+ 'resolve the questions before/while building.');
111
+ }
112
+ else if (readiness.needsAnswers && readiness.overridden) {
113
+ note(`!! readiness guard OVERRIDDEN: silencing the needsAnswers warning for '${slug}'.`);
114
+ }
115
+ }
116
+ const backlog = workItemRel('tasks-ready', `${slug}.md`);
117
+ const staged = workItemRel('tasks-backlog', `${slug}.md`);
118
+ const branch = workBranchRef('task', slug);
119
+ /**
120
+ * The CLAIMABLE-RESIDENCE half of the predicate: the body rests in the pool
121
+ * (`tasks/ready/`) on `<arbiter>/main`, OR \u2014 under `--allow-backlog` \u2014 in
122
+ * `tasks/backlog/` (staging). The held-lock half is the create-only acquire.
123
+ * Folder-agnostic exclusion is the lock, never the folder, so a staged body is
124
+ * a legitimate claimable residence under the flag; otherwise staging is invisible.
125
+ */
126
+ async function claimableBodyRel() {
127
+ if (await catFileExists(`${arbiter}/main:${backlog}`, cwd, env)) {
128
+ return backlog;
129
+ }
130
+ if (options.allowBacklog === true &&
131
+ (await catFileExists(`${arbiter}/main:${staged}`, cwd, env))) {
132
+ return staged;
133
+ }
134
+ return undefined;
135
+ }
136
+ async function bodyRestsClaimable() {
137
+ return (await claimableBodyRel()) !== undefined;
138
+ }
139
+ /**
140
+ * The human-facing folder label for a resolved claimable body path (`work/<dir>`,
141
+ * e.g. `work/tasks/ready` or `work/tasks/backlog`). Derived from the ACTUAL
142
+ * resolved residence so the claim message never hard-codes the wrong folder.
143
+ */
144
+ function residenceFolder(bodyRel) {
145
+ const dir = bodyRel.slice(0, bodyRel.lastIndexOf('/'));
146
+ return dir === '' ? bodyRel : dir;
147
+ }
148
+ /**
149
+ * PRE-CLAIM WELL-FORMEDNESS GUARD (this task's interim guard against the
150
+ * promptless-promoted-task strand). The validator `resolveTask` /
151
+ * `extractPromptSection` (`prompt.ts`) requires a task body to carry a
152
+ * `## Prompt` section; it runs at DISPATCH (`do.ts` step 5), AFTER the claim,
153
+ * so a body missing `## Prompt` was caught only post-claim — the failure routed
154
+ * to `saveAgentFailure`, which left the lock `state: stuck`. We run the SAME
155
+ * validator (`extractPromptSection`, the single source of truth for "what makes
156
+ * a task dispatchable") HERE, BEFORE the lock is acquired, so a malformed body
157
+ * from ANY source (promotion, hand-authored, externally edited) is refused with a
158
+ * clean usage error and NO lock is taken. `bodyRel` is the resolved claimable
159
+ * residence (`tasks/ready/` or, under the flag, `tasks/backlog/`). A genuinely
160
+ * absent body is NOT this guard's concern (the claimability check returns `lost`
161
+ * separately) — this only fires when a body that DOES rest claimable lacks a
162
+ * `## Prompt`.
163
+ */
164
+ async function assertBodyWellFormed(bodyRel) {
165
+ const show = await gitSoft(['show', `${arbiter}/main:${bodyRel}`], cwd, env);
166
+ if (show.status !== 0) {
167
+ // The body vanished between the residence check and this read — leave it to
168
+ // the claimability path to report `lost`; do not synthesise a guard error.
169
+ return;
170
+ }
171
+ if (extractPromptSection(show.stdout) === undefined) {
172
+ throw new ClaimUsageError(`'${slug}' (${bodyRel}) has no '## Prompt' section, so it is not ` +
173
+ 'dispatchable — add a `## Prompt` section to the task body before ' +
174
+ 'claiming it. NO lock was acquired.');
175
+ }
176
+ }
177
+ // UNIFIED PER-ITEM LOCK — the WHOLE of the claim now (prd
178
+ // `ledger-status-per-item-lock-refs` US #1/#15/#16; ADR
179
+ // `ledger-status-on-per-item-lock-refs`). The interim dual-write is GONE: claim
180
+ // acquires the item's per-item lock (`action: implement`) and writes NOTHING to
181
+ // `main` — the body STAYS at `work/backlog/<slug>.md`, the claimable predicate is
182
+ // "in `backlog/` on `main` AND no lock held", and the held lock IS the claim. So
183
+ // a protected-`main` repo can be claimed (claim touches no protected ref).
184
+ //
185
+ // A dry-run takes no lock (it mutates nothing) and just reports it WOULD claim.
186
+ /** The not-found diagnostic, naming the pool (and staging under the flag). */
187
+ const notFoundFallback = options.allowBacklog === true
188
+ ? `neither '${backlog}' nor '${staged}' found on ${arbiter}/main (already done/removed, or wrong slug).`
189
+ : `'${backlog}' not found on ${arbiter}/main (already done/removed, or wrong slug).`;
190
+ if (dryRun) {
191
+ await gitHard(['fetch', '--quiet', arbiter], cwd, env);
192
+ const bodyRel = await claimableBodyRel();
193
+ if (bodyRel === undefined) {
194
+ const message = await lostMessage(slug, arbiter, cwd, env, notFoundFallback);
195
+ note(message);
196
+ return { exitCode: 2, outcome: 'lost', message };
197
+ }
198
+ // A dry-run still runs the pre-claim well-formedness guard so it reports a
199
+ // promptless body as a usage error rather than "would claim" it.
200
+ await assertBodyWellFormed(bodyRel);
201
+ const message = `DRY-RUN: would acquire the per-item lock for '${slug}' (body stays in ${residenceFolder(bodyRel)}/).`;
202
+ note(message);
203
+ return { exitCode: 0, outcome: 'claimed', message };
204
+ }
205
+ // PRE-CLAIM WELL-FORMEDNESS GUARD: fetch + read the claimable body and refuse a
206
+ // task missing its `## Prompt` BEFORE the lock is acquired (so a malformed body
207
+ // never strands a `state: stuck` lock at dispatch). A genuinely absent body is
208
+ // left to the post-lock claimability re-check to report as `lost`; this guard
209
+ // only fires for a body that DOES rest claimable but is not dispatchable.
210
+ await gitHard(['fetch', '--quiet', arbiter], cwd, env);
211
+ {
212
+ const bodyRel = await claimableBodyRel();
213
+ if (bodyRel !== undefined) {
214
+ await assertBodyWellFormed(bodyRel);
215
+ }
216
+ }
217
+ // Acquire the lock FIRST. A lock `lost` (someone already holds this SAME item's
218
+ // lock) makes claim lose DEFINITIVELY — exit 2, NO retry budget (a per-item ref
219
+ // never falsely contends, so a rejection is a GENUINE same-item conflict the
220
+ // loser should lose). We do NOT try to tell "our own orphaned lock" apart by
221
+ // holder identity and auto-reclaim it: holder ids are NOT unique (a CI bot claims
222
+ // many items under one `user.name`), so a release+re-acquire "reclaim" could let a
223
+ // concurrent LOSER release the WINNER's still-valid lock — and an automatic sweep
224
+ // contradicts the ADR's recovery model (`ledger-status-on-per-item-lock-refs`:
225
+ // "no liveness heartbeat, no auto-sweep; a human asserts a lock is dead"). A
226
+ // genuinely orphaned lock is cleared by the human-mediated `release-lock` verb +
227
+ // `gc --ledger` report, never an auto-steal at claim time.
228
+ const lock = await acquireItemLock({
229
+ item: `task:${slug}`,
230
+ action: 'implement',
231
+ cwd,
232
+ arbiter,
233
+ env,
234
+ });
235
+ if (lock.outcome === 'error') {
236
+ // Environment/usage problem acquiring the lock — surface as exit 1, never a
237
+ // false claim. Nothing was acquired.
238
+ throw new ClaimUsageError(`failed to acquire the item lock for '${slug}': ${lock.message}`);
239
+ }
240
+ if (lock.outcome === 'lost') {
241
+ const message = await lostMessage(slug, arbiter, cwd, env, lock.message);
242
+ note(message);
243
+ return { exitCode: 2, outcome: 'lost', message };
244
+ }
245
+ /** Release the lock we just acquired (best-effort) — used when the claimability
246
+ * re-check finds the item is no longer in the pool, so the lock is never
247
+ * orphaned (the body never moved, so the item is cleanly returned to the pool). */
248
+ async function releaseHeldLock() {
249
+ await releaseItemLock({ item: `task:${slug}`, cwd, arbiter, env });
250
+ }
251
+ // The RESOLVED claimable residence (`tasks/ready/` or, under `--allow-backlog`,
252
+ // `tasks/backlog/`), captured by the post-lock claimability re-check below so the
253
+ // success message reports the real folder rather than a hard-coded guess.
254
+ let claimedBodyRel;
255
+ try {
256
+ // CLAIMABLE PREDICATE (US #15): "in `tasks/ready/` (the pool) on `main` AND no
257
+ // lock held" \u2014 widened under `--allow-backlog` to ALSO accept a
258
+ // `tasks/backlog/`-resident body (staging), so a human can drive a staged task
259
+ // in place. The HELD-LOCK half is the create-only acquire above (a held slug
260
+ // already lost the race). Confirm the residence here \u2014 the body STAYS where it
261
+ // rested (claim moves nothing, even under the flag), so a `done`/absent item is
262
+ // not claimable: release the lock we just took (it never protected any in-flight
263
+ // work) and lose (exit 2).
264
+ await gitHard(['fetch', '--quiet', arbiter], cwd, env);
265
+ claimedBodyRel = await claimableBodyRel();
266
+ if (claimedBodyRel === undefined) {
267
+ await releaseHeldLock();
268
+ const message = await lostMessage(slug, arbiter, cwd, env, notFoundFallback);
269
+ note(message);
270
+ return { exitCode: 2, outcome: 'lost', message };
271
+ }
272
+ }
273
+ catch (err) {
274
+ // A plumbing failure after we took the lock: release it so the held lock does
275
+ // not orphan an item that never started, then re-throw for the top-level
276
+ // handler to classify (exit 1).
277
+ await releaseHeldLock();
278
+ throw err;
279
+ }
280
+ // CLAIMED. The body rests where it was claimed from (`tasks/ready/` normally, or
281
+ // `tasks/backlog/` under `--allow-backlog`) on `<arbiter>/main` and the lock is
282
+ // held. There is NO claim commit and nothing on `main` to branch from —
283
+ // onboarding cuts the work branch straight off `<arbiter>/main` (which carries the
284
+ // body). The folder is the RESOLVED residence, not a hard-coded guess: a `ready/`
285
+ // claim must not falsely report `backlog/` (it misled a whole CI-incident triage).
286
+ // `claimedBodyRel` is always set here (the claimability re-check above returns
287
+ // `lost` otherwise); fall back to the pool residence (`backlog` IS the
288
+ // `tasks-ready` path constant) for type-safety — derived via the layout helper,
289
+ // never a raw `work/<folder>` literal (the work-layout guard).
290
+ const residence = residenceFolder(claimedBodyRel ?? backlog);
291
+ const message = `CLAIMED '${slug}' (lock held; body stays in ${residence}/ on ${arbiter}/main).`;
292
+ note(message);
293
+ note(`Start work: git fetch ${arbiter} && git switch -C ${branch} ${arbiter}/main`);
294
+ return { exitCode: 0, outcome: 'claimed', message };
295
+ }
296
+ /** `git cat-file -e <object>` — true iff the object exists. */
297
+ async function catFileExists(object, cwd, env) {
298
+ return (await gitSoft(['cat-file', '-e', object], cwd, env)).status === 0;
299
+ }
300
+ /** Run git, returning the raw result (no throw) — for soft checks. */
301
+ function gitSoft(args, cwd, env) {
302
+ return runAsync('git', args, cwd, { env });
303
+ }
304
+ /** Run git; throw on non-zero (genuinely unexpected plumbing failures). */
305
+ async function gitHard(args, cwd, env) {
306
+ const result = await runAsync('git', args, cwd, { env });
307
+ if (result.status !== 0) {
308
+ throw new Error(`git ${args.join(' ')} failed (exit ${result.status}): ${result.stderr.trim()}`);
309
+ }
310
+ return result;
311
+ }
312
+ //# sourceMappingURL=claim-cas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claim-cas.js","sourceRoot":"","sources":["../src/claim-cas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * A small, isolated terminal-spinner helper for the standalone
3
+ * `dorfl claim <slug>` CLI command (prd/task `claim-cas-spinner`).
4
+ *
5
+ * The push the claim CAS performs can take a few seconds (network +
6
+ * arbiter round-trip), so the terminal looked frozen. This helper wraps
7
+ * ONLY that CLI call site: it animates a single-line spinner on stderr
8
+ * while {@link import('./claim-cas.js').performClaim} is in flight, and
9
+ * tears it down cleanly on completion / SIGINT / a thrown error.
10
+ *
11
+ * Design constraints (all surfaced as injected seams so the helper is
12
+ * unit-testable without real timers or a real TTY):
13
+ * - `stream` — the WritableStream sink (stderr in production).
14
+ * - `isTTY` — whether to animate at all. Defaults to `false` (the
15
+ * non-TTY path), so tests stay deterministic by default.
16
+ * - `clock` — `setInterval` / `clearInterval` pair. Defaults to a
17
+ * no-op pair (no real timers in tests).
18
+ *
19
+ * Output contract:
20
+ * - In NON-TTY mode the helper is a pure no-op for animation. `note`
21
+ * writes `>> <message>\n` to the stream (byte-identical to today's
22
+ * `console.error('>> ' + message)`); `finish(result)` writes
23
+ * `error: <message>\n` ONLY on a non-zero exit (byte-identical to
24
+ * today's `if (result.exitCode !== 0) console.error('error: ' + ...)`).
25
+ * No new status line is introduced — silent on success, exactly as
26
+ * today's CLI tests and CI log scrapers expect.
27
+ * - In TTY mode the spinner frame is drawn/redrawn on a fake-clock
28
+ * tick; `note(message)` clears the current frame, writes the note
29
+ * line, then redraws (so notes and frames never trample each other);
30
+ * `finish(result)` clears the frame, restores the cursor, and writes
31
+ * ONE terminal status line describing the outcome.
32
+ * - `stop()` is the pure teardown path used for SIGINT / a thrown
33
+ * error: clear the frame, restore the cursor, NO status line.
34
+ *
35
+ * This module is consumed ONLY by the `dorfl claim <slug>` CLI
36
+ * surface in `cli.ts`. The autonomous `performClaim` call sites
37
+ * (`do.ts`, `run.ts`, `start.ts`, `work-on.ts`, `continue-branch.ts`)
38
+ * are explicitly OUT OF SCOPE and MUST NOT be wrapped — the claim-cas
39
+ * return contract, exit codes, and seam contract are unchanged.
40
+ */
41
+ import type { ClaimCasResult } from './claim-cas.js';
42
+ /** The clock seam: `setInterval` / `clearInterval`, faked in tests. */
43
+ export interface SpinnerClock {
44
+ setInterval: (fn: () => void, ms: number) => unknown;
45
+ clearInterval: (handle: unknown) => void;
46
+ }
47
+ /** The minimal writable surface the spinner needs (stderr in production). */
48
+ export interface SpinnerStream {
49
+ write(chunk: string): boolean;
50
+ }
51
+ export interface CreateClaimSpinnerOptions {
52
+ /** The sink the spinner animates / notes / status line are written to. */
53
+ stream: SpinnerStream;
54
+ /**
55
+ * Whether to animate at all. Defaults to `false` — the non-TTY path,
56
+ * which is a no-op for animation and keeps stderr byte-identical to
57
+ * today. Production passes `process.stdout.isTTY === true`.
58
+ */
59
+ isTTY?: boolean;
60
+ /**
61
+ * The `setInterval`/`clearInterval` seam. Defaults to a NO-OP pair so a
62
+ * test that forgets to inject a fake clock cannot accidentally spin a
63
+ * real timer (and so the non-TTY default truly never starts one).
64
+ * Production passes the global timers.
65
+ */
66
+ clock?: SpinnerClock;
67
+ /** The short label drawn next to the animating frame (e.g. `Claiming alpha…`). */
68
+ label: string;
69
+ /** Frame cadence in ms. Default 80ms (a calm braille spinner). */
70
+ intervalMs?: number;
71
+ /** The animation frames. Default: the standard 10-frame braille spinner. */
72
+ frames?: readonly string[];
73
+ }
74
+ export interface ClaimSpinner {
75
+ /** True iff this spinner instance will actually animate (TTY mode). */
76
+ readonly isTTY: boolean;
77
+ /** Begin animating (no-op in non-TTY mode, or if already started). */
78
+ start(): void;
79
+ /**
80
+ * Route the `performClaim` `note` callback through the spinner. In TTY
81
+ * mode this clears the current frame, writes `>> <message>\n`, then
82
+ * redraws the frame so notes and frames never trample each other. In
83
+ * non-TTY mode it writes the line directly — byte-identical to today.
84
+ */
85
+ note(message: string): void;
86
+ /**
87
+ * Finish with the claim result. In TTY mode: tear down (clear frame,
88
+ * restore cursor) and emit ONE terminal status line describing the
89
+ * outcome. In non-TTY mode: emit `error: <message>` ONLY on a non-zero
90
+ * exit, otherwise stay silent — byte-identical to today's CLI.
91
+ */
92
+ finish(result: ClaimCasResult): void;
93
+ /**
94
+ * Pure teardown for SIGINT / a thrown error: clear the frame and
95
+ * restore the cursor. NO status line. Safe to call multiple times.
96
+ */
97
+ stop(): void;
98
+ }
99
+ /**
100
+ * Format the single terminal status line that replaces the spinner in TTY
101
+ * mode. The outcome label tracks the existing exit-code semantics
102
+ * (0=claimed / 2=lost (not claimable) / 3=contended / 1=usage-error or
103
+ * not-ready); `result.message` is reused verbatim as the body.
104
+ */
105
+ export declare function formatClaimStatusLine(result: ClaimCasResult): string;
106
+ /**
107
+ * Build a {@link ClaimSpinner} from injected seams. See the module-level
108
+ * docstring for the contract; see the per-method JSDoc for the per-method
109
+ * semantics in TTY vs non-TTY mode.
110
+ */
111
+ export declare function createClaimSpinner(options: CreateClaimSpinnerOptions): ClaimSpinner;
112
+ //# sourceMappingURL=cli-spinner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-spinner.d.ts","sourceRoot":"","sources":["../src/cli-spinner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,gBAAgB,CAAC;AAEnD,uEAAuE;AACvE,MAAM,WAAW,YAAY;IAC5B,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IACrD,aAAa,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CACzC;AAED,6EAA6E;AAC7E,MAAM,WAAW,aAAa;IAC7B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,yBAAyB;IACzC,0EAA0E;IAC1E,MAAM,EAAE,aAAa,CAAC;IACtB;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,kFAAkF;IAClF,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC5B,uEAAuE;IACvE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,sEAAsE;IACtE,KAAK,IAAI,IAAI,CAAC;IACd;;;;;OAKG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B;;;;;OAKG;IACH,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;IACrC;;;OAGG;IACH,IAAI,IAAI,IAAI,CAAC;CACb;AA2BD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAcpE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CACjC,OAAO,EAAE,yBAAyB,GAChC,YAAY,CAkEd"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * A small, isolated terminal-spinner helper for the standalone
3
+ * `dorfl claim <slug>` CLI command (prd/task `claim-cas-spinner`).
4
+ *
5
+ * The push the claim CAS performs can take a few seconds (network +
6
+ * arbiter round-trip), so the terminal looked frozen. This helper wraps
7
+ * ONLY that CLI call site: it animates a single-line spinner on stderr
8
+ * while {@link import('./claim-cas.js').performClaim} is in flight, and
9
+ * tears it down cleanly on completion / SIGINT / a thrown error.
10
+ *
11
+ * Design constraints (all surfaced as injected seams so the helper is
12
+ * unit-testable without real timers or a real TTY):
13
+ * - `stream` — the WritableStream sink (stderr in production).
14
+ * - `isTTY` — whether to animate at all. Defaults to `false` (the
15
+ * non-TTY path), so tests stay deterministic by default.
16
+ * - `clock` — `setInterval` / `clearInterval` pair. Defaults to a
17
+ * no-op pair (no real timers in tests).
18
+ *
19
+ * Output contract:
20
+ * - In NON-TTY mode the helper is a pure no-op for animation. `note`
21
+ * writes `>> <message>\n` to the stream (byte-identical to today's
22
+ * `console.error('>> ' + message)`); `finish(result)` writes
23
+ * `error: <message>\n` ONLY on a non-zero exit (byte-identical to
24
+ * today's `if (result.exitCode !== 0) console.error('error: ' + ...)`).
25
+ * No new status line is introduced — silent on success, exactly as
26
+ * today's CLI tests and CI log scrapers expect.
27
+ * - In TTY mode the spinner frame is drawn/redrawn on a fake-clock
28
+ * tick; `note(message)` clears the current frame, writes the note
29
+ * line, then redraws (so notes and frames never trample each other);
30
+ * `finish(result)` clears the frame, restores the cursor, and writes
31
+ * ONE terminal status line describing the outcome.
32
+ * - `stop()` is the pure teardown path used for SIGINT / a thrown
33
+ * error: clear the frame, restore the cursor, NO status line.
34
+ *
35
+ * This module is consumed ONLY by the `dorfl claim <slug>` CLI
36
+ * surface in `cli.ts`. The autonomous `performClaim` call sites
37
+ * (`do.ts`, `run.ts`, `start.ts`, `work-on.ts`, `continue-branch.ts`)
38
+ * are explicitly OUT OF SCOPE and MUST NOT be wrapped — the claim-cas
39
+ * return contract, exit codes, and seam contract are unchanged.
40
+ */
41
+ const DEFAULT_FRAMES = [
42
+ '⠋',
43
+ '⠙',
44
+ '⠹',
45
+ '⠸',
46
+ '⠼',
47
+ '⠴',
48
+ '⠦',
49
+ '⠧',
50
+ '⠇',
51
+ '⠏',
52
+ ];
53
+ const DEFAULT_INTERVAL_MS = 80;
54
+ // Bare ANSI for hide-cursor / show-cursor / clear-current-line — kept tiny and
55
+ // inline so the helper has no runtime dependency. Only emitted in TTY mode.
56
+ const HIDE_CURSOR = '\x1b[?25l';
57
+ const SHOW_CURSOR = '\x1b[?25h';
58
+ const CLEAR_LINE = '\r\x1b[2K';
59
+ const NOOP_CLOCK = {
60
+ setInterval: () => undefined,
61
+ clearInterval: () => undefined,
62
+ };
63
+ /**
64
+ * Format the single terminal status line that replaces the spinner in TTY
65
+ * mode. The outcome label tracks the existing exit-code semantics
66
+ * (0=claimed / 2=lost (not claimable) / 3=contended / 1=usage-error or
67
+ * not-ready); `result.message` is reused verbatim as the body.
68
+ */
69
+ export function formatClaimStatusLine(result) {
70
+ switch (result.outcome) {
71
+ case 'claimed':
72
+ return `✓ claimed — ${result.message}`;
73
+ case 'lost':
74
+ return `✗ not claimable — ${result.message}`;
75
+ case 'contended':
76
+ return `✗ contended — ${result.message}`;
77
+ case 'not-ready':
78
+ return `✗ not ready — ${result.message}`;
79
+ case 'usage-error':
80
+ default:
81
+ return `✗ error — ${result.message}`;
82
+ }
83
+ }
84
+ /**
85
+ * Build a {@link ClaimSpinner} from injected seams. See the module-level
86
+ * docstring for the contract; see the per-method JSDoc for the per-method
87
+ * semantics in TTY vs non-TTY mode.
88
+ */
89
+ export function createClaimSpinner(options) {
90
+ const stream = options.stream;
91
+ const isTTY = options.isTTY === true;
92
+ const clock = options.clock ?? NOOP_CLOCK;
93
+ const frames = options.frames ?? DEFAULT_FRAMES;
94
+ const intervalMs = options.intervalMs ?? DEFAULT_INTERVAL_MS;
95
+ const label = options.label;
96
+ let handle;
97
+ let frameIndex = 0;
98
+ let active = false;
99
+ const drawFrame = () => {
100
+ stream.write(`${frames[frameIndex % frames.length]} ${label}`);
101
+ };
102
+ const clearFrame = () => {
103
+ stream.write(CLEAR_LINE);
104
+ };
105
+ const teardown = () => {
106
+ if (!active)
107
+ return;
108
+ clock.clearInterval(handle);
109
+ handle = undefined;
110
+ clearFrame();
111
+ stream.write(SHOW_CURSOR);
112
+ active = false;
113
+ };
114
+ return {
115
+ isTTY,
116
+ start() {
117
+ if (!isTTY || active)
118
+ return;
119
+ active = true;
120
+ stream.write(HIDE_CURSOR);
121
+ drawFrame();
122
+ handle = clock.setInterval(() => {
123
+ frameIndex = (frameIndex + 1) % frames.length;
124
+ clearFrame();
125
+ drawFrame();
126
+ }, intervalMs);
127
+ },
128
+ note(message) {
129
+ if (!isTTY) {
130
+ // Non-TTY: byte-identical to today's `console.error('>> ' + msg)`.
131
+ stream.write(`>> ${message}\n`);
132
+ return;
133
+ }
134
+ if (active)
135
+ clearFrame();
136
+ stream.write(`>> ${message}\n`);
137
+ if (active)
138
+ drawFrame();
139
+ },
140
+ finish(result) {
141
+ if (isTTY) {
142
+ teardown();
143
+ stream.write(`${formatClaimStatusLine(result)}\n`);
144
+ return;
145
+ }
146
+ // Non-TTY: silent on success, `error: <message>` on failure —
147
+ // byte-identical to today's CLI behaviour.
148
+ if (result.exitCode !== 0) {
149
+ stream.write(`error: ${result.message}\n`);
150
+ }
151
+ },
152
+ stop() {
153
+ teardown();
154
+ },
155
+ };
156
+ }
157
+ //# sourceMappingURL=cli-spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-spinner.js","sourceRoot":"","sources":["../src/cli-spinner.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ export declare function buildProgram(): Command;
4
+ /**
5
+ * Run the CLI: build the program and parse argv. Split from {@link buildProgram}
6
+ * so tests can build + introspect/parse the program WITHOUT triggering a real
7
+ * argv parse + `process.exit` on import (the module-level bootstrap below only
8
+ * fires when this file is the process entry point).
9
+ */
10
+ export declare function runCli(argv?: string[]): Promise<void>;
11
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAC,OAAO,EAAS,MAAM,WAAW,CAAC;AA2nC1C,wBAAgB,YAAY,IAAI,OAAO,CA8gGtC;AA+FD;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,IAAI,GAAE,MAAM,EAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAQzE"}