dorfl 0.0.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (619) hide show
  1. package/dist/advance-ci-template.d.ts +73 -0
  2. package/dist/advance-ci-template.d.ts.map +1 -0
  3. package/dist/advance-ci-template.js +104 -0
  4. package/dist/advance-ci-template.js.map +1 -0
  5. package/dist/advance-classify.d.ts +132 -0
  6. package/dist/advance-classify.d.ts.map +1 -0
  7. package/dist/advance-classify.js +120 -0
  8. package/dist/advance-classify.js.map +1 -0
  9. package/dist/advance-drivers.d.ts +182 -0
  10. package/dist/advance-drivers.d.ts.map +1 -0
  11. package/dist/advance-drivers.js +231 -0
  12. package/dist/advance-drivers.js.map +1 -0
  13. package/dist/advance-isolated.d.ts +156 -0
  14. package/dist/advance-isolated.d.ts.map +1 -0
  15. package/dist/advance-isolated.js +256 -0
  16. package/dist/advance-isolated.js.map +1 -0
  17. package/dist/advance-lifecycle-template.d.ts +107 -0
  18. package/dist/advance-lifecycle-template.d.ts.map +1 -0
  19. package/dist/advance-lifecycle-template.js +668 -0
  20. package/dist/advance-lifecycle-template.js.map +1 -0
  21. package/dist/advance-loop-driver.d.ts +325 -0
  22. package/dist/advance-loop-driver.d.ts.map +1 -0
  23. package/dist/advance-loop-driver.js +437 -0
  24. package/dist/advance-loop-driver.js.map +1 -0
  25. package/dist/advance-treeless-publish.d.ts +108 -0
  26. package/dist/advance-treeless-publish.d.ts.map +1 -0
  27. package/dist/advance-treeless-publish.js +71 -0
  28. package/dist/advance-treeless-publish.js.map +1 -0
  29. package/dist/advance.d.ts +340 -0
  30. package/dist/advance.d.ts.map +1 -0
  31. package/dist/advance.js +1122 -0
  32. package/dist/advance.js.map +1 -0
  33. package/dist/advancing-lock.d.ts +294 -0
  34. package/dist/advancing-lock.d.ts.map +1 -0
  35. package/dist/advancing-lock.js +594 -0
  36. package/dist/advancing-lock.js.map +1 -0
  37. package/dist/agent-launch.d.ts +79 -0
  38. package/dist/agent-launch.d.ts.map +1 -0
  39. package/dist/agent-launch.js +61 -0
  40. package/dist/agent-launch.js.map +1 -0
  41. package/dist/agent-stop.d.ts +149 -0
  42. package/dist/agent-stop.d.ts.map +1 -0
  43. package/dist/agent-stop.js +307 -0
  44. package/dist/agent-stop.js.map +1 -0
  45. package/dist/apply-decide.d.ts +127 -0
  46. package/dist/apply-decide.d.ts.map +1 -0
  47. package/dist/apply-decide.js +176 -0
  48. package/dist/apply-decide.js.map +1 -0
  49. package/dist/apply-merge-action.d.ts +206 -0
  50. package/dist/apply-merge-action.d.ts.map +1 -0
  51. package/dist/apply-merge-action.js +307 -0
  52. package/dist/apply-merge-action.js.map +1 -0
  53. package/dist/apply-persist.d.ts +174 -0
  54. package/dist/apply-persist.d.ts.map +1 -0
  55. package/dist/apply-persist.js +359 -0
  56. package/dist/apply-persist.js.map +1 -0
  57. package/dist/arbiter.d.ts +120 -0
  58. package/dist/arbiter.d.ts.map +1 -0
  59. package/dist/arbiter.js +255 -0
  60. package/dist/arbiter.js.map +1 -0
  61. package/dist/brand.d.ts +70 -0
  62. package/dist/brand.d.ts.map +1 -0
  63. package/dist/brand.js +84 -0
  64. package/dist/brand.js.map +1 -0
  65. package/dist/buildable-body.d.ts +132 -0
  66. package/dist/buildable-body.d.ts.map +1 -0
  67. package/dist/buildable-body.js +131 -0
  68. package/dist/buildable-body.js.map +1 -0
  69. package/dist/categorise.d.ts +66 -0
  70. package/dist/categorise.d.ts.map +1 -0
  71. package/dist/categorise.js +106 -0
  72. package/dist/categorise.js.map +1 -0
  73. package/dist/claim-cas.d.ts +117 -0
  74. package/dist/claim-cas.d.ts.map +1 -0
  75. package/dist/claim-cas.js +312 -0
  76. package/dist/claim-cas.js.map +1 -0
  77. package/dist/cli-spinner.d.ts +112 -0
  78. package/dist/cli-spinner.d.ts.map +1 -0
  79. package/dist/cli-spinner.js +157 -0
  80. package/dist/cli-spinner.js.map +1 -0
  81. package/dist/cli.d.ts +11 -0
  82. package/dist/cli.d.ts.map +1 -0
  83. package/dist/cli.js +3100 -0
  84. package/dist/cli.js.map +1 -0
  85. package/dist/close-job-template.d.ts +70 -0
  86. package/dist/close-job-template.d.ts.map +1 -0
  87. package/dist/close-job-template.js +180 -0
  88. package/dist/close-job-template.js.map +1 -0
  89. package/dist/close-job.d.ts +95 -0
  90. package/dist/close-job.d.ts.map +1 -0
  91. package/dist/close-job.js +226 -0
  92. package/dist/close-job.js.map +1 -0
  93. package/dist/complete.d.ts +361 -0
  94. package/dist/complete.d.ts.map +1 -0
  95. package/dist/complete.js +885 -0
  96. package/dist/complete.js.map +1 -0
  97. package/dist/concurrency.d.ts +68 -0
  98. package/dist/concurrency.d.ts.map +1 -0
  99. package/dist/concurrency.js +112 -0
  100. package/dist/concurrency.js.map +1 -0
  101. package/dist/config-override.d.ts +76 -0
  102. package/dist/config-override.d.ts.map +1 -0
  103. package/dist/config-override.js +50 -0
  104. package/dist/config-override.js.map +1 -0
  105. package/dist/config.d.ts +668 -0
  106. package/dist/config.d.ts.map +1 -0
  107. package/dist/config.js +241 -0
  108. package/dist/config.js.map +1 -0
  109. package/dist/continue-branch.d.ts +249 -0
  110. package/dist/continue-branch.d.ts.map +1 -0
  111. package/dist/continue-branch.js +389 -0
  112. package/dist/continue-branch.js.map +1 -0
  113. package/dist/cwd-section.d.ts +186 -0
  114. package/dist/cwd-section.d.ts.map +1 -0
  115. package/dist/cwd-section.js +209 -0
  116. package/dist/cwd-section.js.map +1 -0
  117. package/dist/decision-engine.d.ts +170 -0
  118. package/dist/decision-engine.d.ts.map +1 -0
  119. package/dist/decision-engine.js +136 -0
  120. package/dist/decision-engine.js.map +1 -0
  121. package/dist/detect.d.ts +17 -0
  122. package/dist/detect.d.ts.map +1 -0
  123. package/dist/detect.js +118 -0
  124. package/dist/detect.js.map +1 -0
  125. package/dist/do-autopick.d.ts +85 -0
  126. package/dist/do-autopick.d.ts.map +1 -0
  127. package/dist/do-autopick.js +112 -0
  128. package/dist/do-autopick.js.map +1 -0
  129. package/dist/do-config.d.ts +312 -0
  130. package/dist/do-config.d.ts.map +1 -0
  131. package/dist/do-config.js +358 -0
  132. package/dist/do-config.js.map +1 -0
  133. package/dist/do-remote-auto.d.ts +75 -0
  134. package/dist/do-remote-auto.d.ts.map +1 -0
  135. package/dist/do-remote-auto.js +111 -0
  136. package/dist/do-remote-auto.js.map +1 -0
  137. package/dist/do.d.ts +621 -0
  138. package/dist/do.d.ts.map +1 -0
  139. package/dist/do.js +1882 -0
  140. package/dist/do.js.map +1 -0
  141. package/dist/drop-source.d.ts +96 -0
  142. package/dist/drop-source.d.ts.map +1 -0
  143. package/dist/drop-source.js +91 -0
  144. package/dist/drop-source.js.map +1 -0
  145. package/dist/eligibility.d.ts +46 -0
  146. package/dist/eligibility.d.ts.map +1 -0
  147. package/dist/eligibility.js +34 -0
  148. package/dist/eligibility.js.map +1 -0
  149. package/dist/env-config.d.ts +51 -0
  150. package/dist/env-config.d.ts.map +1 -0
  151. package/dist/env-config.js +272 -0
  152. package/dist/env-config.js.map +1 -0
  153. package/dist/failure-cause.d.ts +70 -0
  154. package/dist/failure-cause.d.ts.map +1 -0
  155. package/dist/failure-cause.js +126 -0
  156. package/dist/failure-cause.js.map +1 -0
  157. package/dist/format.d.ts +43 -0
  158. package/dist/format.d.ts.map +1 -0
  159. package/dist/format.js +256 -0
  160. package/dist/format.js.map +1 -0
  161. package/dist/frontmatter.d.ts +208 -0
  162. package/dist/frontmatter.d.ts.map +1 -0
  163. package/dist/frontmatter.js +344 -0
  164. package/dist/frontmatter.js.map +1 -0
  165. package/dist/gate-readiness.d.ts +84 -0
  166. package/dist/gate-readiness.d.ts.map +1 -0
  167. package/dist/gate-readiness.js +103 -0
  168. package/dist/gate-readiness.js.map +1 -0
  169. package/dist/gc.d.ts +165 -0
  170. package/dist/gc.d.ts.map +1 -0
  171. package/dist/gc.js +313 -0
  172. package/dist/gc.js.map +1 -0
  173. package/dist/gh-failure.d.ts +42 -0
  174. package/dist/gh-failure.d.ts.map +1 -0
  175. package/dist/gh-failure.js +49 -0
  176. package/dist/gh-failure.js.map +1 -0
  177. package/dist/git.d.ts +75 -0
  178. package/dist/git.d.ts.map +1 -0
  179. package/dist/git.js +130 -0
  180. package/dist/git.js.map +1 -0
  181. package/dist/github.d.ts +187 -0
  182. package/dist/github.d.ts.map +1 -0
  183. package/dist/github.js +343 -0
  184. package/dist/github.js.map +1 -0
  185. package/dist/harness.d.ts +242 -0
  186. package/dist/harness.d.ts.map +1 -0
  187. package/dist/harness.js +157 -0
  188. package/dist/harness.js.map +1 -0
  189. package/dist/identity.d.ts +167 -0
  190. package/dist/identity.d.ts.map +1 -0
  191. package/dist/identity.js +231 -0
  192. package/dist/identity.js.map +1 -0
  193. package/dist/index.d.ts +147 -0
  194. package/dist/index.d.ts.map +1 -0
  195. package/dist/index.js +76 -0
  196. package/dist/index.js.map +1 -0
  197. package/dist/install-ci-branch-protection.d.ts +147 -0
  198. package/dist/install-ci-branch-protection.d.ts.map +1 -0
  199. package/dist/install-ci-branch-protection.js +166 -0
  200. package/dist/install-ci-branch-protection.js.map +1 -0
  201. package/dist/install-ci-capabilities/advance-lifecycle.d.ts +15 -0
  202. package/dist/install-ci-capabilities/advance-lifecycle.d.ts.map +1 -0
  203. package/dist/install-ci-capabilities/advance-lifecycle.js +28 -0
  204. package/dist/install-ci-capabilities/advance-lifecycle.js.map +1 -0
  205. package/dist/install-ci-capabilities/close-job.d.ts +13 -0
  206. package/dist/install-ci-capabilities/close-job.d.ts.map +1 -0
  207. package/dist/install-ci-capabilities/close-job.js +26 -0
  208. package/dist/install-ci-capabilities/close-job.js.map +1 -0
  209. package/dist/install-ci-capabilities/example-noop.d.ts +16 -0
  210. package/dist/install-ci-capabilities/example-noop.d.ts.map +1 -0
  211. package/dist/install-ci-capabilities/example-noop.js +23 -0
  212. package/dist/install-ci-capabilities/example-noop.js.map +1 -0
  213. package/dist/install-ci-capabilities/intake.d.ts +15 -0
  214. package/dist/install-ci-capabilities/intake.d.ts.map +1 -0
  215. package/dist/install-ci-capabilities/intake.js +28 -0
  216. package/dist/install-ci-capabilities/intake.js.map +1 -0
  217. package/dist/install-ci-capabilities/verify.d.ts +14 -0
  218. package/dist/install-ci-capabilities/verify.d.ts.map +1 -0
  219. package/dist/install-ci-capabilities/verify.js +27 -0
  220. package/dist/install-ci-capabilities/verify.js.map +1 -0
  221. package/dist/install-ci-core.d.ts +446 -0
  222. package/dist/install-ci-core.d.ts.map +1 -0
  223. package/dist/install-ci-core.js +760 -0
  224. package/dist/install-ci-core.js.map +1 -0
  225. package/dist/install-ci-github.d.ts +167 -0
  226. package/dist/install-ci-github.d.ts.map +1 -0
  227. package/dist/install-ci-github.js +315 -0
  228. package/dist/install-ci-github.js.map +1 -0
  229. package/dist/install-ci.d.ts +105 -0
  230. package/dist/install-ci.d.ts.map +1 -0
  231. package/dist/install-ci.js +363 -0
  232. package/dist/install-ci.js.map +1 -0
  233. package/dist/intake-event.d.ts +88 -0
  234. package/dist/intake-event.d.ts.map +1 -0
  235. package/dist/intake-event.js +66 -0
  236. package/dist/intake-event.js.map +1 -0
  237. package/dist/intake-marker.d.ts +95 -0
  238. package/dist/intake-marker.d.ts.map +1 -0
  239. package/dist/intake-marker.js +127 -0
  240. package/dist/intake-marker.js.map +1 -0
  241. package/dist/intake-triage.d.ts +48 -0
  242. package/dist/intake-triage.d.ts.map +1 -0
  243. package/dist/intake-triage.js +95 -0
  244. package/dist/intake-triage.js.map +1 -0
  245. package/dist/intake-trigger-template.d.ts +185 -0
  246. package/dist/intake-trigger-template.d.ts.map +1 -0
  247. package/dist/intake-trigger-template.js +449 -0
  248. package/dist/intake-trigger-template.js.map +1 -0
  249. package/dist/intake.d.ts +569 -0
  250. package/dist/intake.d.ts.map +1 -0
  251. package/dist/intake.js +1628 -0
  252. package/dist/intake.js.map +1 -0
  253. package/dist/integration-core.d.ts +539 -0
  254. package/dist/integration-core.d.ts.map +1 -0
  255. package/dist/integration-core.js +2195 -0
  256. package/dist/integration-core.js.map +1 -0
  257. package/dist/integrator.d.ts +343 -0
  258. package/dist/integrator.d.ts.map +1 -0
  259. package/dist/integrator.js +400 -0
  260. package/dist/integrator.js.map +1 -0
  261. package/dist/isolation.d.ts +219 -0
  262. package/dist/isolation.d.ts.map +1 -0
  263. package/dist/isolation.js +261 -0
  264. package/dist/isolation.js.map +1 -0
  265. package/dist/issue-provider.d.ts +349 -0
  266. package/dist/issue-provider.d.ts.map +1 -0
  267. package/dist/issue-provider.js +360 -0
  268. package/dist/issue-provider.js.map +1 -0
  269. package/dist/item-lock.d.ts +626 -0
  270. package/dist/item-lock.d.ts.map +1 -0
  271. package/dist/item-lock.js +1381 -0
  272. package/dist/item-lock.js.map +1 -0
  273. package/dist/item-path.d.ts +49 -0
  274. package/dist/item-path.d.ts.map +1 -0
  275. package/dist/item-path.js +66 -0
  276. package/dist/item-path.js.map +1 -0
  277. package/dist/ledger-lint.d.ts +129 -0
  278. package/dist/ledger-lint.d.ts.map +1 -0
  279. package/dist/ledger-lint.js +249 -0
  280. package/dist/ledger-lint.js.map +1 -0
  281. package/dist/ledger-read.d.ts +357 -0
  282. package/dist/ledger-read.d.ts.map +1 -0
  283. package/dist/ledger-read.js +442 -0
  284. package/dist/ledger-read.js.map +1 -0
  285. package/dist/ledger-write.d.ts +330 -0
  286. package/dist/ledger-write.d.ts.map +1 -0
  287. package/dist/ledger-write.js +411 -0
  288. package/dist/ledger-write.js.map +1 -0
  289. package/dist/lifecycle-gather.d.ts +30 -0
  290. package/dist/lifecycle-gather.d.ts.map +1 -0
  291. package/dist/lifecycle-gather.js +205 -0
  292. package/dist/lifecycle-gather.js.map +1 -0
  293. package/dist/lifecycle-pools.d.ts +180 -0
  294. package/dist/lifecycle-pools.d.ts.map +1 -0
  295. package/dist/lifecycle-pools.js +78 -0
  296. package/dist/lifecycle-pools.js.map +1 -0
  297. package/dist/merge-question-surfacer.d.ts +166 -0
  298. package/dist/merge-question-surfacer.d.ts.map +1 -0
  299. package/dist/merge-question-surfacer.js +297 -0
  300. package/dist/merge-question-surfacer.js.map +1 -0
  301. package/dist/mint-adr.d.ts +126 -0
  302. package/dist/mint-adr.d.ts.map +1 -0
  303. package/dist/mint-adr.js +257 -0
  304. package/dist/mint-adr.js.map +1 -0
  305. package/dist/mirror-pool-scan.d.ts +125 -0
  306. package/dist/mirror-pool-scan.d.ts.map +1 -0
  307. package/dist/mirror-pool-scan.js +104 -0
  308. package/dist/mirror-pool-scan.js.map +1 -0
  309. package/dist/needs-attention.d.ts +341 -0
  310. package/dist/needs-attention.d.ts.map +1 -0
  311. package/dist/needs-attention.js +900 -0
  312. package/dist/needs-attention.js.map +1 -0
  313. package/dist/orphan-sidecar.d.ts +79 -0
  314. package/dist/orphan-sidecar.d.ts.map +1 -0
  315. package/dist/orphan-sidecar.js +71 -0
  316. package/dist/orphan-sidecar.js.map +1 -0
  317. package/dist/output.d.ts +48 -0
  318. package/dist/output.d.ts.map +1 -0
  319. package/dist/output.js +66 -0
  320. package/dist/output.js.map +1 -0
  321. package/dist/pi-harness.d.ts +179 -0
  322. package/dist/pi-harness.d.ts.map +1 -0
  323. package/dist/pi-harness.js +342 -0
  324. package/dist/pi-harness.js.map +1 -0
  325. package/dist/placement.d.ts +99 -0
  326. package/dist/placement.d.ts.map +1 -0
  327. package/dist/placement.js +67 -0
  328. package/dist/placement.js.map +1 -0
  329. package/dist/prd-to-spec.d.ts +329 -0
  330. package/dist/prd-to-spec.d.ts.map +1 -0
  331. package/dist/prd-to-spec.js +706 -0
  332. package/dist/prd-to-spec.js.map +1 -0
  333. package/dist/prepare.d.ts +121 -0
  334. package/dist/prepare.d.ts.map +1 -0
  335. package/dist/prepare.js +140 -0
  336. package/dist/prepare.js.map +1 -0
  337. package/dist/prompt.d.ts +363 -0
  338. package/dist/prompt.d.ts.map +1 -0
  339. package/dist/prompt.js +499 -0
  340. package/dist/prompt.js.map +1 -0
  341. package/dist/protocol/ADR-FORMAT.md +47 -0
  342. package/dist/protocol/CLAIM-PROTOCOL.md +217 -0
  343. package/dist/protocol/REVIEW-PROTOCOL.md +119 -0
  344. package/dist/protocol/SURFACE-PROTOCOL.md +121 -0
  345. package/dist/protocol/TASKING-PROTOCOL.md +122 -0
  346. package/dist/protocol/WORK-CONTRACT.md +276 -0
  347. package/dist/protocol/spec-template.md +71 -0
  348. package/dist/protocol/task-template.md +65 -0
  349. package/dist/readiness.d.ts +66 -0
  350. package/dist/readiness.d.ts.map +1 -0
  351. package/dist/readiness.js +36 -0
  352. package/dist/readiness.js.map +1 -0
  353. package/dist/reap-branches.d.ts +102 -0
  354. package/dist/reap-branches.d.ts.map +1 -0
  355. package/dist/reap-branches.js +149 -0
  356. package/dist/reap-branches.js.map +1 -0
  357. package/dist/recover-isolated.d.ts +72 -0
  358. package/dist/recover-isolated.d.ts.map +1 -0
  359. package/dist/recover-isolated.js +188 -0
  360. package/dist/recover-isolated.js.map +1 -0
  361. package/dist/registry.d.ts +172 -0
  362. package/dist/registry.d.ts.map +1 -0
  363. package/dist/registry.js +296 -0
  364. package/dist/registry.js.map +1 -0
  365. package/dist/repo-config.d.ts +201 -0
  366. package/dist/repo-config.d.ts.map +1 -0
  367. package/dist/repo-config.js +414 -0
  368. package/dist/repo-config.js.map +1 -0
  369. package/dist/repo-key.d.ts +20 -0
  370. package/dist/repo-key.d.ts.map +1 -0
  371. package/dist/repo-key.js +68 -0
  372. package/dist/repo-key.js.map +1 -0
  373. package/dist/repo-mirror.d.ts +177 -0
  374. package/dist/repo-mirror.d.ts.map +1 -0
  375. package/dist/repo-mirror.js +271 -0
  376. package/dist/repo-mirror.js.map +1 -0
  377. package/dist/retry-backoff.d.ts +90 -0
  378. package/dist/retry-backoff.d.ts.map +1 -0
  379. package/dist/retry-backoff.js +98 -0
  380. package/dist/retry-backoff.js.map +1 -0
  381. package/dist/review-gate.d.ts +173 -0
  382. package/dist/review-gate.d.ts.map +1 -0
  383. package/dist/review-gate.js +261 -0
  384. package/dist/review-gate.js.map +1 -0
  385. package/dist/review-verdict.d.ts +149 -0
  386. package/dist/review-verdict.d.ts.map +1 -0
  387. package/dist/review-verdict.js +332 -0
  388. package/dist/review-verdict.js.map +1 -0
  389. package/dist/run.d.ts +221 -0
  390. package/dist/run.d.ts.map +1 -0
  391. package/dist/run.js +963 -0
  392. package/dist/run.js.map +1 -0
  393. package/dist/scan.d.ts +308 -0
  394. package/dist/scan.d.ts.map +1 -0
  395. package/dist/scan.js +374 -0
  396. package/dist/scan.js.map +1 -0
  397. package/dist/select-order.d.ts +75 -0
  398. package/dist/select-order.d.ts.map +1 -0
  399. package/dist/select-order.js +108 -0
  400. package/dist/select-order.js.map +1 -0
  401. package/dist/select-priority.d.ts +188 -0
  402. package/dist/select-priority.d.ts.map +1 -0
  403. package/dist/select-priority.js +80 -0
  404. package/dist/select-priority.js.map +1 -0
  405. package/dist/select.d.ts +25 -0
  406. package/dist/select.d.ts.map +1 -0
  407. package/dist/select.js +43 -0
  408. package/dist/select.js.map +1 -0
  409. package/dist/session-path.d.ts +36 -0
  410. package/dist/session-path.d.ts.map +1 -0
  411. package/dist/session-path.js +129 -0
  412. package/dist/session-path.js.map +1 -0
  413. package/dist/sidecar-apply.d.ts +83 -0
  414. package/dist/sidecar-apply.d.ts.map +1 -0
  415. package/dist/sidecar-apply.js +111 -0
  416. package/dist/sidecar-apply.js.map +1 -0
  417. package/dist/sidecar.d.ts +245 -0
  418. package/dist/sidecar.d.ts.map +1 -0
  419. package/dist/sidecar.js +481 -0
  420. package/dist/sidecar.js.map +1 -0
  421. package/dist/slug-namespace.d.ts +204 -0
  422. package/dist/slug-namespace.d.ts.map +1 -0
  423. package/dist/slug-namespace.js +229 -0
  424. package/dist/slug-namespace.js.map +1 -0
  425. package/dist/spec-complete.d.ts +44 -0
  426. package/dist/spec-complete.d.ts.map +1 -0
  427. package/dist/spec-complete.js +69 -0
  428. package/dist/spec-complete.js.map +1 -0
  429. package/dist/start.d.ts +97 -0
  430. package/dist/start.d.ts.map +1 -0
  431. package/dist/start.js +633 -0
  432. package/dist/start.js.map +1 -0
  433. package/dist/status.d.ts +199 -0
  434. package/dist/status.d.ts.map +1 -0
  435. package/dist/status.js +228 -0
  436. package/dist/status.js.map +1 -0
  437. package/dist/surface-gate.d.ts +162 -0
  438. package/dist/surface-gate.d.ts.map +1 -0
  439. package/dist/surface-gate.js +206 -0
  440. package/dist/surface-gate.js.map +1 -0
  441. package/dist/surface-persist.d.ts +86 -0
  442. package/dist/surface-persist.d.ts.map +1 -0
  443. package/dist/surface-persist.js +129 -0
  444. package/dist/surface-persist.js.map +1 -0
  445. package/dist/tasker-review-loop.d.ts +249 -0
  446. package/dist/tasker-review-loop.d.ts.map +1 -0
  447. package/dist/tasker-review-loop.js +369 -0
  448. package/dist/tasker-review-loop.js.map +1 -0
  449. package/dist/tasking-eligibility.d.ts +74 -0
  450. package/dist/tasking-eligibility.d.ts.map +1 -0
  451. package/dist/tasking-eligibility.js +52 -0
  452. package/dist/tasking-eligibility.js.map +1 -0
  453. package/dist/tasking-lock.d.ts +111 -0
  454. package/dist/tasking-lock.d.ts.map +1 -0
  455. package/dist/tasking-lock.js +256 -0
  456. package/dist/tasking-lock.js.map +1 -0
  457. package/dist/tasking.d.ts +275 -0
  458. package/dist/tasking.d.ts.map +1 -0
  459. package/dist/tasking.js +951 -0
  460. package/dist/tasking.js.map +1 -0
  461. package/dist/triage-gate.d.ts +127 -0
  462. package/dist/triage-gate.d.ts.map +1 -0
  463. package/dist/triage-gate.js +139 -0
  464. package/dist/triage-gate.js.map +1 -0
  465. package/dist/triage-persist.d.ts +163 -0
  466. package/dist/triage-persist.d.ts.map +1 -0
  467. package/dist/triage-persist.js +387 -0
  468. package/dist/triage-persist.js.map +1 -0
  469. package/dist/verdict-json.d.ts +32 -0
  470. package/dist/verdict-json.d.ts.map +1 -0
  471. package/dist/verdict-json.js +74 -0
  472. package/dist/verdict-json.js.map +1 -0
  473. package/dist/verify-workflow-template.d.ts +60 -0
  474. package/dist/verify-workflow-template.d.ts.map +1 -0
  475. package/dist/verify-workflow-template.js +126 -0
  476. package/dist/verify-workflow-template.js.map +1 -0
  477. package/dist/verify.d.ts +60 -0
  478. package/dist/verify.d.ts.map +1 -0
  479. package/dist/verify.js +62 -0
  480. package/dist/verify.js.map +1 -0
  481. package/dist/watch-session.d.ts +112 -0
  482. package/dist/watch-session.d.ts.map +1 -0
  483. package/dist/watch-session.js +347 -0
  484. package/dist/watch-session.js.map +1 -0
  485. package/dist/work-layout.d.ts +198 -0
  486. package/dist/work-layout.d.ts.map +1 -0
  487. package/dist/work-layout.js +217 -0
  488. package/dist/work-layout.js.map +1 -0
  489. package/dist/work-on.d.ts +154 -0
  490. package/dist/work-on.d.ts.map +1 -0
  491. package/dist/work-on.js +387 -0
  492. package/dist/work-on.js.map +1 -0
  493. package/dist/workspace.d.ts +224 -0
  494. package/dist/workspace.d.ts.map +1 -0
  495. package/dist/workspace.js +325 -0
  496. package/dist/workspace.js.map +1 -0
  497. package/package.json +46 -2
  498. package/src/advance-ci-template.ts +203 -0
  499. package/src/advance-classify.ts +197 -0
  500. package/src/advance-drivers.ts +414 -0
  501. package/src/advance-isolated.ts +432 -0
  502. package/src/advance-lifecycle-template.ts +791 -0
  503. package/src/advance-loop-driver.ts +745 -0
  504. package/src/advance-treeless-publish.ts +177 -0
  505. package/src/advance.ts +1564 -0
  506. package/src/advancing-lock.ts +988 -0
  507. package/src/agent-launch.ts +137 -0
  508. package/src/agent-stop.ts +361 -0
  509. package/src/apply-decide.ts +242 -0
  510. package/src/apply-merge-action.ts +502 -0
  511. package/src/apply-persist.ts +518 -0
  512. package/src/arbiter.ts +372 -0
  513. package/src/brand.ts +111 -0
  514. package/src/buildable-body.ts +196 -0
  515. package/src/categorise.ts +158 -0
  516. package/src/claim-cas.ts +513 -0
  517. package/src/cli-spinner.ts +225 -0
  518. package/src/cli.ts +4379 -0
  519. package/src/close-job-template.ts +236 -0
  520. package/src/close-job.ts +319 -0
  521. package/src/complete.ts +1379 -0
  522. package/src/concurrency.ts +151 -0
  523. package/src/config-override.ts +116 -0
  524. package/src/config.ts +883 -0
  525. package/src/continue-branch.ts +542 -0
  526. package/src/cwd-section.ts +392 -0
  527. package/src/decision-engine.ts +272 -0
  528. package/src/detect.ts +124 -0
  529. package/src/do-autopick.ts +223 -0
  530. package/src/do-config.ts +589 -0
  531. package/src/do-remote-auto.ts +197 -0
  532. package/src/do.ts +2623 -0
  533. package/src/drop-source.ts +194 -0
  534. package/src/eligibility.ts +79 -0
  535. package/src/env-config.ts +305 -0
  536. package/src/failure-cause.ts +142 -0
  537. package/src/format.ts +313 -0
  538. package/src/frontmatter.ts +477 -0
  539. package/src/gate-readiness.ts +147 -0
  540. package/src/gc.ts +510 -0
  541. package/src/gh-failure.ts +53 -0
  542. package/src/git.ts +186 -0
  543. package/src/github.ts +468 -0
  544. package/src/harness.ts +355 -0
  545. package/src/identity.ts +322 -0
  546. package/src/index.ts +785 -0
  547. package/src/install-ci-branch-protection.ts +255 -0
  548. package/src/install-ci-capabilities/advance-lifecycle.ts +34 -0
  549. package/src/install-ci-capabilities/close-job.ts +32 -0
  550. package/src/install-ci-capabilities/example-noop.ts +24 -0
  551. package/src/install-ci-capabilities/intake.ts +34 -0
  552. package/src/install-ci-capabilities/verify.ts +33 -0
  553. package/src/install-ci-core.ts +1088 -0
  554. package/src/install-ci-github.ts +376 -0
  555. package/src/install-ci.ts +552 -0
  556. package/src/intake-event.ts +102 -0
  557. package/src/intake-marker.ts +195 -0
  558. package/src/intake-triage.ts +138 -0
  559. package/src/intake-trigger-template.ts +591 -0
  560. package/src/intake.ts +2445 -0
  561. package/src/integration-core.ts +3065 -0
  562. package/src/integrator.ts +771 -0
  563. package/src/isolation.ts +484 -0
  564. package/src/issue-provider.ts +733 -0
  565. package/src/item-lock.ts +1858 -0
  566. package/src/item-path.ts +75 -0
  567. package/src/ledger-lint.ts +332 -0
  568. package/src/ledger-read.ts +924 -0
  569. package/src/ledger-write.ts +865 -0
  570. package/src/lifecycle-gather.ts +298 -0
  571. package/src/lifecycle-pools.ts +250 -0
  572. package/src/merge-question-surfacer.ts +496 -0
  573. package/src/mint-adr.ts +362 -0
  574. package/src/mirror-pool-scan.ts +240 -0
  575. package/src/needs-attention.ts +1506 -0
  576. package/src/orphan-sidecar.ts +150 -0
  577. package/src/output.ts +89 -0
  578. package/src/pi-harness.ts +403 -0
  579. package/src/placement.ts +131 -0
  580. package/src/prd-to-spec.ts +1059 -0
  581. package/src/prepare.ts +230 -0
  582. package/src/prompt.ts +763 -0
  583. package/src/readiness.ts +98 -0
  584. package/src/reap-branches.ts +278 -0
  585. package/src/recover-isolated.ts +276 -0
  586. package/src/registry.ts +475 -0
  587. package/src/repo-config.ts +550 -0
  588. package/src/repo-key.ts +74 -0
  589. package/src/repo-mirror.ts +367 -0
  590. package/src/retry-backoff.ts +130 -0
  591. package/src/review-gate.ts +389 -0
  592. package/src/review-verdict.ts +422 -0
  593. package/src/run.ts +1430 -0
  594. package/src/scan.ts +611 -0
  595. package/src/select-order.ts +143 -0
  596. package/src/select-priority.ts +266 -0
  597. package/src/select.ts +62 -0
  598. package/src/session-path.ts +153 -0
  599. package/src/sidecar-apply.ts +216 -0
  600. package/src/sidecar.ts +700 -0
  601. package/src/slug-namespace.ts +367 -0
  602. package/src/spec-complete.ts +118 -0
  603. package/src/start.ts +974 -0
  604. package/src/status.ts +441 -0
  605. package/src/surface-gate.ts +337 -0
  606. package/src/surface-persist.ts +241 -0
  607. package/src/tasker-review-loop.ts +671 -0
  608. package/src/tasking-eligibility.ts +114 -0
  609. package/src/tasking-lock.ts +416 -0
  610. package/src/tasking.ts +1437 -0
  611. package/src/triage-gate.ts +248 -0
  612. package/src/triage-persist.ts +570 -0
  613. package/src/verdict-json.ts +73 -0
  614. package/src/verify-workflow-template.ts +159 -0
  615. package/src/verify.ts +123 -0
  616. package/src/watch-session.ts +397 -0
  617. package/src/work-layout.ts +262 -0
  618. package/src/work-on.ts +660 -0
  619. package/src/workspace.ts +502 -0
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Pure tasking-eligibility resolution — the auto-task decision layer, one level
3
+ * UP from the build gate (`eligibility.ts`). No I/O: callers pass in the prd's
4
+ * two autonomy axes (`humanOnly`, `needsAnswers`), the repo's `autoTask` policy,
5
+ * the prd's `taskedAfter` slugs, and the set of slugs whose prds are already
6
+ * TASKED (resolved against `work/prds/tasked/` residence, NOT `work/done/`).
7
+ *
8
+ * This mirrors the build-gate shape deliberately (CONTEXT.md / the `auto-slice`
9
+ * prd): the same `needsAnswers !== true && humanOnly !== true && <repo policy>`
10
+ * predicate, applied to a prd's two axes + the repo's `autoTask` toggle — and a
11
+ * cross-prd ordering check that resolves against tasked-ness rather than done-ness.
12
+ */
13
+
14
+ import type {HumanOnlyGate} from './eligibility.js';
15
+
16
+ export type {HumanOnlyGate};
17
+
18
+ /** Resolution of a prd's `taskedAfter` against the set of already-tasked prds. */
19
+ export interface TaskedAfterResult {
20
+ /** True when every listed prd is already tasked. */
21
+ satisfied: boolean;
22
+ /** Listed prd slugs not yet tasked, in declaration order. */
23
+ missing: string[];
24
+ }
25
+
26
+ export interface TaskingEligibilityInput {
27
+ /** Autonomy axis 1 (DECIDED): a human must drive THIS prd's tasking. */
28
+ humanOnly: HumanOnlyGate;
29
+ /** Autonomy axis 2 (DISCOVERED): the prd has unresolved questions. */
30
+ needsAnswers: HumanOnlyGate;
31
+ /** Cross-prd order: prd slugs that must already be tasked before this one. */
32
+ taskedAfter: string[];
33
+ /** Slugs of prds that are already TASKED (residence in `work/prds/tasked/`). */
34
+ taskedSlugs: Set<string>;
35
+ /** Per-repo policy: may an agent auto-task *undeclared* prds in this repo? */
36
+ autoTask: boolean;
37
+ /**
38
+ * The target was named EXPLICITLY by the operator (`do prd:<slug>`), so the
39
+ * `autoTask` POLICY is already satisfied — naming the prd IS the authorization,
40
+ * exactly as `do <task>` builds a named task regardless of `autoBuild` (the
41
+ * `autoBuild` precedent: the pool/scan gates the policy, the explicit claim path
42
+ * never re-checks it). When `true`, the policy term drops from the gate and ONLY
43
+ * the prd's own readiness axes (`humanOnly`/`needsAnswers`) + `taskedAfter` bind.
44
+ * Defaults `false` (the AUTO-PICK pool path, where the `autoTask` policy DOES
45
+ * gate). The pool is the single policy-enforcement point; the per-invocation gate
46
+ * applies the policy only when NOT explicit.
47
+ */
48
+ explicit?: boolean;
49
+ }
50
+
51
+ export interface TaskingEligibilityResult {
52
+ /** Taskable now = gate passes AND every `taskedAfter` prd is already tasked. */
53
+ taskable: boolean;
54
+ /** Whether the autonomy gate alone passes (agent-taskable on its own axes). */
55
+ gatePass: boolean;
56
+ taskedAfter: TaskedAfterResult;
57
+ }
58
+
59
+ /**
60
+ * Resolve the tasking autonomy gate: agent-taskable iff `needsAnswers` is not
61
+ * `true` AND `humanOnly` is not `true` AND the repo's `autoTask` POLICY is
62
+ * satisfied — where the policy is satisfied either by the repo's `autoTask`
63
+ * toggle being on (the AUTO-PICK pool path) OR by the target being named
64
+ * EXPLICITLY (`explicit: true` — `do prd:<slug>`, where naming IS the
65
+ * authorization, mirroring `do <task>` vs `autoBuild`). Both readiness axes
66
+ * block orthogonally and are never agent-taskable regardless of policy; a human
67
+ * is never bound by either. The exact mirror of `resolveGate` (the build gate),
68
+ * one level up.
69
+ */
70
+ export function resolveTaskGate(
71
+ humanOnly: HumanOnlyGate,
72
+ needsAnswers: HumanOnlyGate,
73
+ autoTask: boolean,
74
+ explicit = false,
75
+ ): boolean {
76
+ if (needsAnswers === true || humanOnly === true) {
77
+ return false;
78
+ }
79
+ // EXPLICIT naming satisfies the policy term (the build path's autoBuild
80
+ // precedent); otherwise the repo's autoTask toggle gates the auto-pick pool.
81
+ return explicit || autoTask;
82
+ }
83
+
84
+ /**
85
+ * Resolve a prd's `taskedAfter` against the slugs of prds already TASKED (NOT
86
+ * `done/`): satisfied iff every listed prd is present in `taskedSlugs`. An
87
+ * untasked blocker ⇒ not yet taskable (so this prd's emitted tasks can
88
+ * reference the real slugs of those prds' tasks).
89
+ */
90
+ export function resolveTaskedAfter(
91
+ taskedAfter: string[],
92
+ taskedSlugs: Set<string>,
93
+ ): TaskedAfterResult {
94
+ const missing = taskedAfter.filter((slug) => !taskedSlugs.has(slug));
95
+ return {satisfied: missing.length === 0, missing};
96
+ }
97
+
98
+ /** Combine the tasking gate and `taskedAfter` resolution into a verdict. */
99
+ export function resolveTaskingEligibility(
100
+ input: TaskingEligibilityInput,
101
+ ): TaskingEligibilityResult {
102
+ const gatePass = resolveTaskGate(
103
+ input.humanOnly,
104
+ input.needsAnswers,
105
+ input.autoTask,
106
+ input.explicit,
107
+ );
108
+ const taskedAfter = resolveTaskedAfter(input.taskedAfter, input.taskedSlugs);
109
+ return {
110
+ taskable: gatePass && taskedAfter.satisfied,
111
+ gatePass,
112
+ taskedAfter,
113
+ };
114
+ }
@@ -0,0 +1,416 @@
1
+ import {runAsync, type RunResult} from './git.js';
2
+ import {
3
+ acquireItemLock,
4
+ releaseItemLock,
5
+ markStuckItemLock,
6
+ } from './item-lock.js';
7
+ import {workItemRel} from './work-layout.js';
8
+
9
+ /**
10
+ * The **tasking concurrency lock** (prd `auto-slice`, task `autoslice-lock`).
11
+ *
12
+ * Serialises *concurrent* taskers (two CI runs, or human + CI) so a prd is never
13
+ * double-tasked. As of the capstone cut-over (task
14
+ * `cutover-retire-slicing-advancing-markers-and-trim-folder-sets`, prd
15
+ * `ledger-status-per-item-lock-refs`; ADR `ledger-status-on-per-item-lock-refs`)
16
+ * the legacy `git mv work/prds/ready/<slug>.md → work/tasking/<slug>.md` MARKER on `main`
17
+ * is GONE: the body NEVER relocates until the durable promotion, exactly as claim
18
+ * no longer moves the task body (task
19
+ * `cutover-claim-body-stays-and-complete-sources-from-backlog`). The tasking lock
20
+ * is now ONLY the UNIFIED per-item lock (`refs/dorfl/lock/<entry>`,
21
+ * `action: task`, keyed `prd:<slug>`) — the SAME ref claim and advance use for
22
+ * the same item, so tasking a prd is mutually exclusive with claiming/advancing
23
+ * the SAME item BY CONSTRUCTION (the second acquirer loses the SAME create-only
24
+ * ref CAS, with NO retry budget and NO false contention). There is no transient
25
+ * status in `main`'s tree anymore, so a work branch cut from `main` inherits no
26
+ * stale `tasking/` marker.
27
+ *
28
+ * - **Acquire** ({@link acquireTaskingLock}) acquires the unified per-item lock.
29
+ * A `lost` (the item is already held for implement/task/advance) makes the
30
+ * tasking acquire lose DEFINITIVELY (exit 2, no retry). On a successful acquire
31
+ * it returns {@link AcquireTaskingLockResult.lockedBlob}: the git blob sha of the
32
+ * prd body the lock TOOK, read from `work/prds/ready/<slug>.md` on the arbiter — the
33
+ * snapshot the tasker reads + tasks from, handed back so the integrate
34
+ * transition can fail loud if the held prd was edited concurrently (the
35
+ * read-stability backstop). A dry-run takes no lock (it mutates nothing).
36
+ *
37
+ * - **Release** ({@link releaseTaskingLock}) DELETES the unified lock ref. It
38
+ * moves NO lifecycle file: the durable `prd → prd-tasked` success move is owned
39
+ * by the integrate band (`tasking.ts`/`integration-core.ts`), and there is no
40
+ * `tasking/ → prd/` abort bounce anymore (the body never left `prd/`). When
41
+ * `routeToNeedsAttention` is set (the tasker review/edit loop's
42
+ * decomposition-unclear verdict, or the task-SET acceptance gate's `block`),
43
+ * release amends the lock `active → stuck` with the reason on the entry INSTEAD
44
+ * of deleting it — the per-item-lock stuck state IS the tasking needs-attention
45
+ * surface now (no `work/needs-attention/` folder write), consistent with the
46
+ * needs-attention cut-over (task
47
+ * `cutover-needs-attention-becomes-lock-stuck-recovery-surface`). A human reads
48
+ * it via `dorfl status` / `gc --ledger` and resolves via
49
+ * `release-lock`/`resume`.
50
+ *
51
+ * The READ-STABILITY backstop (the content-identity stale check that used to live
52
+ * in the release, comparing the held `work/tasking/<slug>.md` blob against the
53
+ * acquire-time snapshot) now lives at the integrate seam (`tasking.ts`
54
+ * `heldSpecIsStale`, comparing `work/prds/ready/<slug>.md`) — relocated because the
55
+ * completing transition, not the release, owns the commit. See
56
+ * `work/notes/observations/tasking-lock-does-not-stabilise-prd-content.md`.
57
+ *
58
+ * This module provides the lock PRIMITIVES only. The orchestrating `do prd:<slug>`
59
+ * tasking command (`tasking.ts`) acquires, drives the agent's tasking, integrates
60
+ * the emitted tasks + the durable `prd → prd-tasked` move, and releases. The
61
+ * human path (no contention) may task on `main` directly without the lock.
62
+ */
63
+
64
+ const DEFAULT_ARBITER = 'origin';
65
+
66
+ /** A semantic label for the lock-acquire outcome (never the verdict itself). */
67
+ export type AcquireTaskingLockOutcome =
68
+ | 'acquired'
69
+ | 'usage-error'
70
+ | 'lost'
71
+ | 'contended';
72
+
73
+ /** Maps onto the claim-CAS exit codes (identical semantics). */
74
+ export type AcquireTaskingLockExitCode = 0 | 1 | 2 | 3;
75
+
76
+ export interface AcquireTaskingLockOptions {
77
+ /** The prd slug to lock (`work/prds/ready/<slug>.md`). */
78
+ slug: string;
79
+ /** Working clone/worktree the lock acquire runs in. */
80
+ cwd: string;
81
+ /** Name of the arbiter remote (`--arbiter`). Defaults to `origin`. */
82
+ arbiter?: string;
83
+ /** Advisory locker id. Defaults to git user.name, then $USER. */
84
+ by?: string;
85
+ /** Cap on push retries when main merely advanced. Default 3. (Unified lock is retry-free; retained for API parity.) */
86
+ retries?: number;
87
+ /** Show the intended acquire without mutating the arbiter (`--dry-run`). */
88
+ dryRun?: boolean;
89
+ /** Environment for child git processes. */
90
+ env?: NodeJS.ProcessEnv;
91
+ /** Sink for human-readable progress notes. */
92
+ note?: (message: string) => void;
93
+ }
94
+
95
+ export interface AcquireTaskingLockResult {
96
+ exitCode: AcquireTaskingLockExitCode;
97
+ outcome: AcquireTaskingLockOutcome;
98
+ /** Human-readable summary of the terminal condition. */
99
+ message: string;
100
+ /**
101
+ * On a successful acquire (`acquired`), the git BLOB sha of the prd body that
102
+ * the lock TOOK (`work/prds/ready/<slug>.md` on the arbiter). This IS the snapshot the
103
+ * tasker reads + tasks from; the integrate transition compares the current
104
+ * `work/prds/ready/<slug>.md` blob against it to fail loud on a concurrent edit (the
105
+ * read-stability backstop). `undefined` unless `outcome === 'acquired'` (and on
106
+ * dry-run, where nothing was published).
107
+ */
108
+ lockedBlob?: string;
109
+ }
110
+
111
+ /** Raised for usage/environment errors (exit 1). */
112
+ class TaskingLockUsageError extends Error {}
113
+
114
+ /**
115
+ * Acquire the tasking lock for `slug`: take the item's unified `action: task`
116
+ * lock (a parentless ref CAS). Never throws for the expected "lost the race"
117
+ * (exit 2) case — it is returned. Usage/environment problems surface as exit 1; a
118
+ * held lock is exit 0.
119
+ */
120
+ export async function acquireTaskingLock(
121
+ options: AcquireTaskingLockOptions,
122
+ ): Promise<AcquireTaskingLockResult> {
123
+ const note = options.note ?? (() => {});
124
+ try {
125
+ return await runAcquire(options, note);
126
+ } catch (err) {
127
+ if (err instanceof TaskingLockUsageError) {
128
+ return {exitCode: 1, outcome: 'usage-error', message: err.message};
129
+ }
130
+ const message = err instanceof Error ? err.message : String(err);
131
+ return {exitCode: 1, outcome: 'usage-error', message};
132
+ }
133
+ }
134
+
135
+ async function runAcquire(
136
+ options: AcquireTaskingLockOptions,
137
+ note: (m: string) => void,
138
+ ): Promise<AcquireTaskingLockResult> {
139
+ const slug = options.slug;
140
+ const arbiter = options.arbiter ?? DEFAULT_ARBITER;
141
+ const dryRun = options.dryRun ?? false;
142
+ const cwd = options.cwd;
143
+ const env = options.env;
144
+
145
+ if (!slug) {
146
+ throw new TaskingLockUsageError(
147
+ 'missing <slug>. usage: acquireTaskingLock({slug, cwd, arbiter})',
148
+ );
149
+ }
150
+ if ((await gitSoft(['rev-parse', '--git-dir'], cwd, env)).status !== 0) {
151
+ throw new TaskingLockUsageError('not inside a git repository');
152
+ }
153
+ if ((await gitSoft(['remote', 'get-url', arbiter], cwd, env)).status !== 0) {
154
+ throw new TaskingLockUsageError(
155
+ `no git remote named '${arbiter}' (set one, or pass --arbiter)`,
156
+ );
157
+ }
158
+ const by = options.by || (await resolveBy(cwd, env));
159
+
160
+ // Is the prd still lockable (present in work/prds/ready/ on the arbiter's main)?
161
+ await gitHard(['fetch', '--quiet', arbiter], cwd, env);
162
+ const spec = workItemRel('specs-ready', `${slug}.md`);
163
+ const specBlob = await gitSoft(
164
+ ['rev-parse', `${arbiter}/main:${spec}`],
165
+ cwd,
166
+ env,
167
+ );
168
+ if (specBlob.status !== 0) {
169
+ const message = `'${spec}' not found on ${arbiter}/main (no such prd, or it was already moved/tasked).`;
170
+ note(message);
171
+ return {exitCode: 2, outcome: 'lost', message};
172
+ }
173
+ const lockedBlob = specBlob.stdout.trim();
174
+
175
+ // A dry-run takes no lock (it mutates nothing) but still reports the lockable
176
+ // snapshot it WOULD take.
177
+ if (dryRun) {
178
+ const message = `[dry-run] would acquire the tasking lock for '${slug}' (${spec} present on ${arbiter}/main).`;
179
+ note(message);
180
+ return {exitCode: 0, outcome: 'acquired', message, lockedBlob};
181
+ }
182
+
183
+ // Acquire the UNIFIED per-item lock (`action: task`, keyed `prd:<slug>` so it
184
+ // shares the ONE ref with claim/advance of the SAME item). A create-only ref
185
+ // CAS: the winner holds it, the loser is DEFINITIVELY `lost` (exit 2, no retry
186
+ // budget). No auto-steal of an orphaned lock, consistent with claim/advance and
187
+ // the ADR's recovery model (no liveness heartbeat / auto-sweep; a human asserts
188
+ // a lock is dead via `release-lock` + `gc --ledger`).
189
+ // MIGRATE step (prd `prd-to-spec-vocabulary-cutover-and-migration-command`):
190
+ // EMIT the parent-spec item identity as `spec:<slug>` so the unified per-item
191
+ // lock ref is `refs/dorfl/lock/spec-<slug>` (the expand-lock task made
192
+ // `spec:<slug>` resolve to a `spec-<slug>` entry). The resolver still ACCEPTS
193
+ // `prd:<slug>`, so any lock taken under the old identity stays readable; the
194
+ // contract task removes the legacy form.
195
+ const lock = await acquireItemLock({
196
+ item: `spec:${slug}`,
197
+ action: 'task',
198
+ cwd,
199
+ arbiter,
200
+ holder: by,
201
+ env,
202
+ });
203
+ if (lock.outcome === 'error') {
204
+ throw new TaskingLockUsageError(
205
+ `failed to acquire the item lock for '${slug}': ${lock.message}`,
206
+ );
207
+ }
208
+ if (lock.outcome === 'lost') {
209
+ note(lock.message);
210
+ return {exitCode: 2, outcome: 'lost', message: lock.message};
211
+ }
212
+ const message = `LOCKED '${slug}' for tasking on ${arbiter} (unified lock).`;
213
+ note(message);
214
+ return {exitCode: 0, outcome: 'acquired', message, lockedBlob};
215
+ }
216
+
217
+ // --- Release --------------------------------------------------------------
218
+
219
+ /** A semantic label for the lock-release outcome. */
220
+ export type ReleaseTaskingLockOutcome =
221
+ | 'released'
222
+ | 'usage-error'
223
+ | 'lost'
224
+ | 'contended'
225
+ | 'stale';
226
+
227
+ /** Maps onto the claim-CAS exit codes, plus `4` for a STALE (conflicting) lock. */
228
+ export type ReleaseTaskingLockExitCode = 0 | 1 | 2 | 3 | 4;
229
+
230
+ export interface ReleaseTaskingLockOptions {
231
+ /** The prd slug whose lock to release. */
232
+ slug: string;
233
+ /** Working clone/worktree the release runs in. */
234
+ cwd: string;
235
+ /** Name of the arbiter remote (`--arbiter`). Defaults to `origin`. */
236
+ arbiter?: string;
237
+ /**
238
+ * The git BLOB sha the lock TOOK ({@link AcquireTaskingLockResult.lockedBlob}).
239
+ * RETAINED for API parity; the content-identity stale check now lives at the
240
+ * integrate seam (`tasking.ts` `heldSpecIsStale`), which runs BEFORE the
241
+ * completing commit. The release itself no longer reads the held body (there is
242
+ * no `tasking/` marker), so it does not consult this.
243
+ */
244
+ lockedBlob?: string;
245
+ /** Advisory releaser id. Defaults to git user.name, then $USER. */
246
+ by?: string;
247
+ /** Cap on push retries when main merely advanced. Default 3. */
248
+ retries?: number;
249
+ /**
250
+ * The tasker review→edit LOOP's **decomposition-unclear** verdict
251
+ * (`slicer-review-edit-loop`), or the task-SET acceptance gate's `block`:
252
+ * instead of DELETING the lock (returning the prd to the claimable/taskable
253
+ * pool), amend it `active → stuck` with this reason recorded on the entry,
254
+ * emitting NO guessed tasks. The prd body stays in `work/prds/ready/` (it never moved
255
+ * under the lock); the stuck lock IS the tasking needs-attention surface (no
256
+ * `work/needs-attention/` folder write), so it is NOT re-taskable until a human
257
+ * resolves it via `release-lock`/`resume`. Omitted ⇒ the normal release DELETES
258
+ * the lock ref.
259
+ */
260
+ routeToNeedsAttention?: {reason: string};
261
+ /** Environment for child git processes. */
262
+ env?: NodeJS.ProcessEnv;
263
+ /** Sink for human-readable progress notes. */
264
+ note?: (message: string) => void;
265
+ }
266
+
267
+ export interface ReleaseTaskingLockResult {
268
+ exitCode: ReleaseTaskingLockExitCode;
269
+ outcome: ReleaseTaskingLockOutcome;
270
+ /** Human-readable summary of the terminal condition. */
271
+ message: string;
272
+ }
273
+
274
+ /**
275
+ * Release the tasking lock for `slug`: DELETE the unified `action: task` lock ref
276
+ * (idempotent — an already-absent ref is a clean `released`). It moves NO lifecycle
277
+ * file: the durable `prd → prd-tasked` success move is owned by the integrate band,
278
+ * and the prd body never left `work/prds/ready/` under the lock, so there is no
279
+ * `tasking/ → prd/` restore.
280
+ *
281
+ * When `routeToNeedsAttention` is set (the tasker decomposition-unclear verdict /
282
+ * the task-SET acceptance gate `block`), the lock is AMENDED `active → stuck`
283
+ * with the reason on the entry INSTEAD of deleted — the stuck per-item lock IS the
284
+ * tasking needs-attention surface now (no folder write).
285
+ *
286
+ * Outcomes:
287
+ * - `released` (0): the lock ref is deleted (or amended stuck), the tasking is done.
288
+ * - `usage-error` (1): bad input / environment / a lock-amend fault.
289
+ * - `lost` (2): the lock is not held (nothing to release).
290
+ */
291
+ export async function releaseTaskingLock(
292
+ options: ReleaseTaskingLockOptions,
293
+ ): Promise<ReleaseTaskingLockResult> {
294
+ const note = options.note ?? (() => {});
295
+ try {
296
+ return await runRelease(options, note);
297
+ } catch (err) {
298
+ if (err instanceof TaskingLockUsageError) {
299
+ return {exitCode: 1, outcome: 'usage-error', message: err.message};
300
+ }
301
+ const message = err instanceof Error ? err.message : String(err);
302
+ return {exitCode: 1, outcome: 'usage-error', message};
303
+ }
304
+ }
305
+
306
+ async function runRelease(
307
+ options: ReleaseTaskingLockOptions,
308
+ note: (m: string) => void,
309
+ ): Promise<ReleaseTaskingLockResult> {
310
+ const slug = options.slug;
311
+ const arbiter = options.arbiter ?? DEFAULT_ARBITER;
312
+ const cwd = options.cwd;
313
+ const env = options.env;
314
+
315
+ if (!slug) {
316
+ throw new TaskingLockUsageError(
317
+ 'missing <slug>. usage: releaseTaskingLock({slug, cwd, arbiter})',
318
+ );
319
+ }
320
+ if ((await gitSoft(['rev-parse', '--git-dir'], cwd, env)).status !== 0) {
321
+ throw new TaskingLockUsageError('not inside a git repository');
322
+ }
323
+ if ((await gitSoft(['remote', 'get-url', arbiter], cwd, env)).status !== 0) {
324
+ throw new TaskingLockUsageError(
325
+ `no git remote named '${arbiter}' (set one, or pass --arbiter)`,
326
+ );
327
+ }
328
+
329
+ // DECOMPOSITION-UNCLEAR / TASK-GATE BLOCK: amend the lock `active → stuck` with
330
+ // the reason on the entry (the tasking needs-attention surface), NOT delete it.
331
+ // The prd body stays in `work/prds/ready/`; the stuck lock keeps it out of the
332
+ // taskable pool until a human resolves it (`release-lock`/`resume`).
333
+ if (options.routeToNeedsAttention !== undefined) {
334
+ // MIGRATE: EMIT `spec:<slug>` (keyed to the `spec-<slug>` lock entry).
335
+ const stuck = await markStuckItemLock({
336
+ item: `spec:${slug}`,
337
+ reason: options.routeToNeedsAttention.reason,
338
+ cwd,
339
+ arbiter,
340
+ env,
341
+ });
342
+ if (stuck.outcome === 'transitioned' || stuck.outcome === 'wrong-state') {
343
+ // `wrong-state` (already stuck) is a tolerated idempotent re-surface.
344
+ const message = `Routed the tasking of '${slug}' to needs-attention (per-item lock marked stuck).`;
345
+ note(message);
346
+ return {exitCode: 0, outcome: 'released', message};
347
+ }
348
+ if (stuck.outcome === 'not-held') {
349
+ const message = `'${slug}' is not locked for tasking — nothing to mark stuck.`;
350
+ note(message);
351
+ return {exitCode: 2, outcome: 'lost', message};
352
+ }
353
+ const message = `could not mark the per-item lock for '${slug}' stuck (${stuck.outcome}: ${stuck.message}).`;
354
+ note(message);
355
+ return {exitCode: 1, outcome: 'usage-error', message};
356
+ }
357
+
358
+ // NORMAL release: delete the lock ref (idempotent).
359
+ // MIGRATE: EMIT `spec:<slug>` (keyed to the `spec-<slug>` lock entry).
360
+ const released = await releaseItemLock({
361
+ item: `spec:${slug}`,
362
+ cwd,
363
+ arbiter,
364
+ env,
365
+ });
366
+ if (released.outcome === 'error') {
367
+ throw new TaskingLockUsageError(
368
+ `failed to release the item lock for '${slug}': ${released.message}`,
369
+ );
370
+ }
371
+ const message =
372
+ released.outcome === 'not-held'
373
+ ? `'${slug}' was not locked for tasking (already released).`
374
+ : `RELEASED the tasking lock for '${slug}' on ${arbiter}.`;
375
+ note(message);
376
+ return {exitCode: 0, outcome: 'released', message};
377
+ }
378
+
379
+ // --- Shared helpers -------------------------------------------------------
380
+
381
+ /** Resolve the advisory locker: git user.name, else $USER/$USERNAME, else ''. */
382
+ async function resolveBy(
383
+ cwd: string,
384
+ env: NodeJS.ProcessEnv | undefined,
385
+ ): Promise<string> {
386
+ const name = await gitSoft(['config', 'user.name'], cwd, env);
387
+ if (name.status === 0 && name.stdout.trim() !== '') {
388
+ return name.stdout.trim();
389
+ }
390
+ const e = env ?? process.env;
391
+ return e.USER ?? e.USERNAME ?? '';
392
+ }
393
+
394
+ /** Run git, returning the raw result (no throw) — for soft checks. */
395
+ function gitSoft(
396
+ args: string[],
397
+ cwd: string,
398
+ env: NodeJS.ProcessEnv | undefined,
399
+ ): Promise<RunResult> {
400
+ return runAsync('git', args, cwd, {env});
401
+ }
402
+
403
+ /** Run git; throw on non-zero (genuinely unexpected plumbing failures). */
404
+ async function gitHard(
405
+ args: string[],
406
+ cwd: string,
407
+ env: NodeJS.ProcessEnv | undefined,
408
+ ): Promise<RunResult> {
409
+ const result = await runAsync('git', args, cwd, {env});
410
+ if (result.status !== 0) {
411
+ throw new Error(
412
+ `git ${args.join(' ')} failed (exit ${result.status}): ${result.stderr.trim()}`,
413
+ );
414
+ }
415
+ return result;
416
+ }