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,98 @@
1
+ import {parseFrontmatter} from './frontmatter.js';
2
+ import {resolveBlockedBy} from './eligibility.js';
3
+ import {ledgerRead} from './ledger-read.js';
4
+
5
+ /**
6
+ * The pre-claim readiness guard for the HUMAN `start` / `claim` path. Today the
7
+ * human path decides purely on the FOLDER on `<arbiter>/main` (is the slug in
8
+ * `backlog/`?) and never parses the task's frontmatter — so it will happily
9
+ * claim a task whose `blockedBy` deps are not yet in `work/done/`, or one
10
+ * flagged `needsAnswers: true`. The autonomous `run --once` path already filters
11
+ * these out (scan → eligibility → select); this closes that asymmetry for the
12
+ * human path.
13
+ *
14
+ * It reads the SAME source of truth the folder check uses — the task file and
15
+ * the `work/done/` listing on `<arbiter>/main` — and resolves `blockedBy` with
16
+ * the shared {@link resolveBlockedBy} (no reimplemented dep resolution).
17
+ *
18
+ * The two axes are deliberately treated differently (see WORK-CONTRACT and the
19
+ * task prd):
20
+ *
21
+ * - `blockedBy` unmet is a FACTUAL prerequisite (the dep work does not exist
22
+ * yet) → REFUSE by default. An override flag is the human escape hatch.
23
+ * - `needsAnswers: true` is a softer, set-by-someone flag (the claimer may be
24
+ * the one about to resolve it) → WARN loudly but still claim. The same
25
+ * override silences the warning.
26
+ *
27
+ * `humanOnly` is NOT consulted here: `start`/`claim` is the human path, and a
28
+ * human is never bound by `humanOnly` (it means "a human must drive this", and
29
+ * the human is here).
30
+ */
31
+
32
+ export interface ReadinessVerdict {
33
+ /**
34
+ * `true` when the claim should be REFUSED before the CAS runs (an unmet
35
+ * `blockedBy`, not overridden). When `true`, the caller claims nothing.
36
+ */
37
+ refuse: boolean;
38
+ /** Blocker slugs not present in `work/done/` on the arbiter, in order. */
39
+ missing: string[];
40
+ /** Whether the task declares `needsAnswers: true`. */
41
+ needsAnswers: boolean;
42
+ /**
43
+ * `true` when an override flag was supplied (the refusal is bypassed and the
44
+ * `needsAnswers` warning is silenced — loudly).
45
+ */
46
+ overridden: boolean;
47
+ }
48
+
49
+ export interface ResolveReadinessOptions {
50
+ /** The slug being claimed (`work/backlog/<slug>.md`). */
51
+ slug: string;
52
+ /** Working clone the human path runs in. */
53
+ cwd: string;
54
+ /** Name of the arbiter git remote. */
55
+ arbiter: string;
56
+ /** Override flag (`--force` / `--ignore-not-ready`): bypass refusal + warning. */
57
+ override: boolean;
58
+ /** Environment for child git processes. */
59
+ env?: NodeJS.ProcessEnv;
60
+ }
61
+
62
+ /**
63
+ * Resolve the readiness of a task against `<arbiter>/main`. PURE w.r.t. the
64
+ * work tree — it reads only committed objects on the arbiter (the task file and
65
+ * the `work/done/` listing), the same source of truth the folder check uses.
66
+ *
67
+ * Assumes the caller has already fetched the arbiter (the human path fetches
68
+ * before deciding on the folder). Missing/unparseable task frontmatter degrades
69
+ * to "no blockers, no needsAnswers" — the folder check, not this guard, owns the
70
+ * "task exists / is in backlog" decision.
71
+ */
72
+ export async function resolveReadiness(
73
+ options: ResolveReadinessOptions,
74
+ ): Promise<ReadinessVerdict> {
75
+ const {slug, cwd, arbiter, override, env} = options;
76
+
77
+ // Resolve the task + `work/done/` from `<arbiter>/main` THROUGH the read
78
+ // seam's arbiter method — the single insertion point. Same source of truth the
79
+ // folder check uses; behaviour is byte-identical to the inline reads it
80
+ // replaced (task from `backlog/` or `in-progress/`, done slugs from the tree).
81
+ const {task, doneSlugs} = await ledgerRead.resolveArbiterState({
82
+ slug,
83
+ cwd,
84
+ arbiter,
85
+ env,
86
+ });
87
+ const fm = parseFrontmatter(task ?? '');
88
+ const needsAnswers = fm.needsAnswers === true;
89
+
90
+ const {missing} = resolveBlockedBy(fm.blockedBy, doneSlugs);
91
+
92
+ return {
93
+ refuse: missing.length > 0 && !override,
94
+ missing,
95
+ needsAnswers,
96
+ overridden: override,
97
+ };
98
+ }
@@ -0,0 +1,278 @@
1
+ import {run} from './git.js';
2
+ import {isAncestor} from './gc.js';
3
+ import {parseWorkBranchRef} from './slug-namespace.js';
4
+
5
+ /**
6
+ * The **remote merged-work-branch reaper** — the cross-machine COUNTERPART of the
7
+ * job-worktree reaper in `gc.ts`. Where `gc.ts` reaps LOCAL job WORKTREES under
8
+ * `workspacesDir/work/*`, this reaps REMOTE `work/<slug>` BRANCHES that linger on
9
+ * the arbiter after their propose-mode PR has MERGED.
10
+ *
11
+ * The safety lynchpin is the SAME provably-merged predicate the worktree reaper
12
+ * uses (`gc.ts` `isAncestor`, REUSED here, never a second one): a remote
13
+ * `work/<slug>` branch is reapable **iff** its tip is
14
+ * `git merge-base --is-ancestor <tip> <arbiter>/main` — provably on `main`. A
15
+ * merely-pushed-but-unmerged branch (an in-flight, kept-for-continue recovery
16
+ * point) is NOT an ancestor of `main`, so the predicate AUTOMATICALLY excludes it
17
+ * — the never-delete-the-in-flight-branch invariant (ADR §4 deletion-safety)
18
+ * stays absolute. Deletion of a fully-merged ref needs NO force, so this NEVER
19
+ * `--force`s.
20
+ *
21
+ * It is provider-AGNOSTIC plain git (`git ls-remote` to enumerate, `git push
22
+ * --delete` to reap), so it works against a local `--bare` arbiter and any
23
+ * provider — NOT relying on GitHub's repo-level auto-delete setting (which is an
24
+ * additive convenience for GitHub arbiters only). The arbiter is addressed
25
+ * THROUGH a local repo (`cwd`) whose `<arbiter>` remote points at it: the same
26
+ * way `requeue --reset` addresses the arbiter for its sanctioned UN-merged
27
+ * deletion (the complement of this merged-only sweep).
28
+ */
29
+
30
+ /** Why a remote `work/<slug>` branch was RETAINED (not provably merged). */
31
+ export type RemoteRetainReason =
32
+ | 'not-merged' // the tip is NOT an ancestor of <arbiter>/main (still in-flight)
33
+ | 'main-unresolved'; // <arbiter>/main could not be resolved (cannot prove safety)
34
+
35
+ /** Human-readable text for each remote-branch retain reason (`sweep` reports). */
36
+ export const REMOTE_RETAIN_REASON_TEXT: Record<RemoteRetainReason, string> = {
37
+ 'not-merged':
38
+ 'not merged (branch tip is not an ancestor of the arbiter main — still in-flight)',
39
+ 'main-unresolved':
40
+ 'arbiter main could not be resolved, so merge could not be proven (kept — safe direction)',
41
+ };
42
+
43
+ /** A remote `work/<slug>` branch the sweep reaped (provably merged). */
44
+ export interface ReapedBranch {
45
+ /** The full branch ref (`work/<slug>`). */
46
+ branch: string;
47
+ /** The 40-hex tip the branch pointed at when it was deleted. */
48
+ tip: string;
49
+ }
50
+
51
+ /** A remote `work/<slug>` branch the sweep RETAINED, with the reason it kept it. */
52
+ export interface RetainedBranch {
53
+ branch: string;
54
+ tip: string;
55
+ reason: RemoteRetainReason;
56
+ /** Human-readable reason text (`REMOTE_RETAIN_REASON_TEXT[reason]`). */
57
+ reasonText: string;
58
+ }
59
+
60
+ export interface SweepRemoteBranchesInput {
61
+ /**
62
+ * A local repo (a checkout or a hub mirror) whose `<arbiter>` remote points at
63
+ * the arbiter to sweep. All git runs in here; nothing in the working tree is
64
+ * touched (only remote refs are read + deleted).
65
+ */
66
+ cwd: string;
67
+ /** The arbiter remote name (default `origin`, as `requeue --arbiter` defaults). */
68
+ arbiter: string;
69
+ /** Sink for human-readable progress notes (per reaped / retained branch). */
70
+ note?: (message: string) => void;
71
+ /**
72
+ * Do NOT actually delete — only REPORT what WOULD be reaped vs retained. A
73
+ * read-only preview (`--dry-run`); the predicate still runs so the report is
74
+ * exact.
75
+ */
76
+ dryRun?: boolean;
77
+ env?: NodeJS.ProcessEnv;
78
+ }
79
+
80
+ export interface SweepRemoteBranchesResult {
81
+ /** The remote branches reaped this sweep (provably merged). Empty on dry-run. */
82
+ reaped: ReapedBranch[];
83
+ /** The remote branches retained, each with a clear reason. */
84
+ retained: RetainedBranch[];
85
+ /** On `dryRun`, the branches that WOULD be reaped (not actually deleted). */
86
+ wouldReap: ReapedBranch[];
87
+ }
88
+
89
+ /**
90
+ * Sweep the arbiter's remote `work/*` branches and DELETE exactly those that are
91
+ * provably merged into `<arbiter>/main` (`git merge-base --is-ancestor`, REUSING
92
+ * `gc.ts`'s `isAncestor`), reporting each as deleted-merged / retained-with-
93
+ * reason. NEVER `--force` (a merged ref needs none); NEVER touches a branch that
94
+ * is not an ancestor of `main` (the in-flight recovery point the never-delete
95
+ * invariant protects). Provider-agnostic plain git, so it works on a `--bare`
96
+ * arbiter.
97
+ *
98
+ * The flow:
99
+ * 1. `git ls-remote --heads <arbiter> 'work/*'` — enumerate remote work
100
+ * branches + their tips (one network round-trip; no full fetch).
101
+ * 2. Fetch `<arbiter>/main` into a local tracking ref so the ancestor check
102
+ * resolves the descendant LOCALLY; fetch each candidate tip object too (so
103
+ * `merge-base` can read it) — best-effort, into a scratch ref.
104
+ * 3. For each branch whose tip `--is-ancestor` of the fetched main ⇒ delete via
105
+ * `git push <arbiter> --delete <branch>`; else retain with a reason.
106
+ */
107
+ export function sweepRemoteMergedBranches(
108
+ input: SweepRemoteBranchesInput,
109
+ ): SweepRemoteBranchesResult {
110
+ const note = input.note ?? (() => {});
111
+ const env = input.env;
112
+ const dryRun = input.dryRun === true;
113
+ const reaped: ReapedBranch[] = [];
114
+ const retained: RetainedBranch[] = [];
115
+ const wouldReap: ReapedBranch[] = [];
116
+
117
+ const branches = listRemoteWorkBranches(input.cwd, input.arbiter, env);
118
+
119
+ // Resolve the arbiter's main tip LOCALLY (fetch it into a scratch tracking
120
+ // ref). If it cannot be resolved (unreachable arbiter / no main), we cannot
121
+ // PROVE any branch merged — retain everything (the safe direction).
122
+ const mainRef = fetchScratch(input.cwd, input.arbiter, 'main', env);
123
+
124
+ for (const {branch, tip} of branches) {
125
+ if (mainRef === undefined) {
126
+ retain(retained, note, branch, tip, 'main-unresolved');
127
+ continue;
128
+ }
129
+ // Make the candidate tip OBJECT readable locally so `merge-base` can use it
130
+ // (ls-remote gave us the sha, but the object may not be in the local repo).
131
+ fetchScratch(input.cwd, input.arbiter, branch, env);
132
+
133
+ if (!isAncestor(input.cwd, tip, mainRef, env)) {
134
+ // NOT an ancestor of main ⇒ still in-flight ⇒ NEVER delete (the invariant).
135
+ retain(retained, note, branch, tip, 'not-merged');
136
+ continue;
137
+ }
138
+
139
+ // Provably merged. Report (dry-run) or delete (the real sweep). Deletion of
140
+ // a fully-merged ref needs NO force — and we NEVER force here. The deletion
141
+ // is WRITE-THROUGH: drop the LOCAL tracking ref FIRST, THEN `git push
142
+ // --delete`. An arbiter-delete failure thus leaves the local store BEHIND
143
+ // (self-healing on next fetch), never AHEAD (a stale tracking ref that
144
+ // drives a wrong "continue" — the permanent stale-continue bug today's
145
+ // arbiter-first ordering creates).
146
+ if (dryRun) {
147
+ wouldReap.push({branch, tip});
148
+ note(`Would reap ${branch} (merged) on ${input.arbiter}.`);
149
+ continue;
150
+ }
151
+ run(
152
+ 'git',
153
+ ['update-ref', '-d', `refs/remotes/${input.arbiter}/${branch}`],
154
+ input.cwd,
155
+ {env},
156
+ );
157
+ const del = run(
158
+ 'git',
159
+ ['push', input.arbiter, '--delete', branch],
160
+ input.cwd,
161
+ {env},
162
+ );
163
+ if (del.status !== 0) {
164
+ // A failed delete is NOT a reap; surface it but keep sweeping the rest.
165
+ // Tolerate "already gone" (a concurrent reap) as a clean delete.
166
+ const stderr = del.stderr.trim();
167
+ const alreadyGone = /remote ref does not exist|unable to delete/i.test(
168
+ stderr,
169
+ );
170
+ if (alreadyGone) {
171
+ reaped.push({branch, tip});
172
+ note(`Reaped ${branch} (merged; remote ref was already gone).`);
173
+ continue;
174
+ }
175
+ retain(retained, note, branch, tip, 'not-merged');
176
+ note(
177
+ `Failed to delete ${branch} on ${input.arbiter} (${stderr || 'unknown error'}); kept.`,
178
+ );
179
+ continue;
180
+ }
181
+ reaped.push({branch, tip});
182
+ note(`Reaped ${branch} (merged) on ${input.arbiter}.`);
183
+ }
184
+
185
+ return {reaped, retained, wouldReap};
186
+ }
187
+
188
+ /** Push a retained branch into the result + emit its note. */
189
+ function retain(
190
+ retained: RetainedBranch[],
191
+ note: (message: string) => void,
192
+ branch: string,
193
+ tip: string,
194
+ reason: RemoteRetainReason,
195
+ ): void {
196
+ const reasonText = REMOTE_RETAIN_REASON_TEXT[reason];
197
+ retained.push({branch, tip, reason, reasonText});
198
+ note(`Retained ${branch}: ${reasonText}.`);
199
+ }
200
+
201
+ /**
202
+ * Enumerate the arbiter's remote `work/*` heads + their tips via
203
+ * `git ls-remote --heads <arbiter> 'work/*'` (one round-trip, no full fetch).
204
+ * Only `work/<type>-<slug>` branches that {@link parseWorkBranchRef} recognises
205
+ * are returned (a stray `work/foo` that is not a namespaced work branch is
206
+ * ignored — the sweep only reaps the branches the protocol creates). Returns []
207
+ * when the arbiter is unreachable (the safe direction — nothing to reap).
208
+ */
209
+ export function listRemoteWorkBranches(
210
+ cwd: string,
211
+ arbiter: string,
212
+ env: NodeJS.ProcessEnv | undefined,
213
+ ): Array<{branch: string; tip: string}> {
214
+ const res = run('git', ['ls-remote', '--heads', arbiter, 'work/*'], cwd, {
215
+ env,
216
+ });
217
+ if (res.status !== 0) {
218
+ return [];
219
+ }
220
+ const out: Array<{branch: string; tip: string}> = [];
221
+ for (const line of res.stdout.split('\n')) {
222
+ const trimmed = line.trim();
223
+ if (trimmed === '') {
224
+ continue;
225
+ }
226
+ // Each line is `<sha>\trefs/heads/<branch>`.
227
+ const m = /^([0-9a-f]{40})\s+refs\/heads\/(.+)$/.exec(trimmed);
228
+ if (!m) {
229
+ continue;
230
+ }
231
+ const tip = m[1];
232
+ const branch = m[2];
233
+ // Only namespaced work branches (`work/<type>-<slug>`) — the protocol's own
234
+ // branches. A non-conforming `work/...` head is left untouched.
235
+ if (parseWorkBranchRef(branch) === undefined) {
236
+ continue;
237
+ }
238
+ out.push({branch, tip});
239
+ }
240
+ return out;
241
+ }
242
+
243
+ /**
244
+ * Fetch a single arbiter head into a SCRATCH remote-tracking ref
245
+ * (`refs/remotes/<arbiter>/<head>`) EXPLICITLY (a bare arbiter has no fetch
246
+ * refspec), so the object + ref resolve LOCALLY for the ancestor check. Returns
247
+ * the local ref name on success, or `undefined` when the head could not be
248
+ * fetched (unreachable arbiter / missing head) — the caller reads that as
249
+ * not-provable ⇒ retain (the safe direction). Best-effort; never throws.
250
+ */
251
+ function fetchScratch(
252
+ cwd: string,
253
+ arbiter: string,
254
+ head: string,
255
+ env: NodeJS.ProcessEnv | undefined,
256
+ ): string | undefined {
257
+ const localRef = `refs/remotes/${arbiter}/${head}`;
258
+ const res = run(
259
+ 'git',
260
+ ['fetch', '--quiet', arbiter, `+refs/heads/${head}:${localRef}`],
261
+ cwd,
262
+ {env},
263
+ );
264
+ if (res.status !== 0) {
265
+ return undefined;
266
+ }
267
+ // Confirm the ref now resolves locally (an empty/odd fetch should read as
268
+ // unresolved → retain).
269
+ const verify = run(
270
+ 'git',
271
+ ['rev-parse', '--verify', '--quiet', localRef],
272
+ cwd,
273
+ {
274
+ env,
275
+ },
276
+ );
277
+ return verify.status === 0 ? localRef : undefined;
278
+ }
@@ -0,0 +1,276 @@
1
+ import {existsSync} from 'node:fs';
2
+ import {performIntegration} from './integration-core.js';
3
+ import {resolveArbiterUrlFromCheckout} from './do.js';
4
+ import {jobWorktreePath} from './workspace.js';
5
+ import {mirrorPath} from './repo-mirror.js';
6
+ import {reapJob} from './gc.js';
7
+ import {workBranchRef} from './slug-namespace.js';
8
+ import {run, type RunResult} from './git.js';
9
+ import type {IntegrationMode} from './config.js';
10
+ import type {ReviewProvider} from './integrator.js';
11
+
12
+ /**
13
+ * **`complete --isolated <slug>` — FINISH an already-committed, already-done-moved
14
+ * STRANDED isolated worktree** (prd `ledger-integrity` story 6, the
15
+ * `finish-already-committed-branch` task). The LOCATE-EXISTING inverse of
16
+ * `do --isolated` (which CREATES a worktree): it resolves the slug's RETAINED job
17
+ * worktree via the existing arbiter-URL-keyed naming
18
+ * (`jobWorktreePath`/`encodeWorkId` — NOT a slug glob, since two repos can share a
19
+ * slug), then runs the recover-already-committed integration path
20
+ * (`performIntegration({committedRecovery: true})`) from it: rebase the kept
21
+ * commit onto `<arbiter>/main` → integrate, SKIPPING the (already-done) gate /
22
+ * done-move / commit.
23
+ *
24
+ * IDEMPOTENT / HONEST: when NO worktree is retained for the slug, this is a clean
25
+ * "nothing to recover / already integrated" no-op (exit 0, no crash, no fresh
26
+ * worktree) — after a successful recovery the worktree is reaped, so a re-run
27
+ * correctly finds nothing. The integration core's own UNSPOOFABLE detection
28
+ * (`already-integrated`) covers the case where the worktree still exists but its
29
+ * tip is already on the arbiter (never a double-integrate).
30
+ *
31
+ * `resume --isolated <slug>` shares the SAME locate-existing resolver (see
32
+ * {@link locateIsolatedRecovery}) to re-engage the retained worktree WITHOUT
33
+ * claiming — it just reports the worktree path for the operator to cd into.
34
+ */
35
+
36
+ const DEFAULT_ARBITER = 'origin';
37
+ /** The arbiter remote name valid INSIDE a job worktree (cut from the bare hub mirror). */
38
+ const WORKTREE_ARBITER_REMOTE = 'origin';
39
+
40
+ export type RecoverIsolatedOutcome =
41
+ | 'completed' // integrated the kept commit from the retained worktree
42
+ | 'already-integrated' // the kept tip was already on the arbiter (clean no-op)
43
+ | 'nothing-to-recover' // no retained worktree for the slug (clean no-op)
44
+ | 'rebase-conflict' // the kept commit did not replay onto the latest main
45
+ | 'usage-error'; // not a git repo / no such arbiter remote / etc.
46
+
47
+ export interface RecoverIsolatedOptions {
48
+ /** The slug to recover (its retained worktree is located by arbiter-URL + slug). */
49
+ slug: string;
50
+ /** The operator's checkout — its arbiter remote names the repo the worktree is off. */
51
+ cwd: string;
52
+ /** Name of the arbiter remote in {@link cwd}. Defaults to `origin`. */
53
+ arbiter?: string;
54
+ /** The execution working area (config `workspacesDir`); where job worktrees live. */
55
+ workspacesDir: string;
56
+ /** Integration mode: `propose` (default) or `merge`. */
57
+ integration?: IntegrationMode;
58
+ /** Suppress the PR on the propose path (push the branch, open no review request). */
59
+ noPR?: boolean;
60
+ /** Optional fully-formed provider used verbatim (test/embedding seam). */
61
+ providerInstance?: ReviewProvider;
62
+ /** Optional injectable PR opener (legacy bridge); used in `propose` mode. */
63
+ openPr?: (opts: {
64
+ cwd: string;
65
+ branch: string;
66
+ env?: NodeJS.ProcessEnv;
67
+ }) => void;
68
+ /** Environment for child git/provider processes (the identity-scoped env). */
69
+ env?: NodeJS.ProcessEnv;
70
+ /** Sink for human-readable progress notes. */
71
+ note?: (message: string) => void;
72
+ }
73
+
74
+ export interface RecoverIsolatedResult {
75
+ exitCode: 0 | 1;
76
+ outcome: RecoverIsolatedOutcome;
77
+ /** The work branch that was recovered, when a worktree was located. */
78
+ branch?: string;
79
+ /** The retained worktree dir that was recovered from, when located. */
80
+ worktree?: string;
81
+ /** The review-request URL opened in propose mode, when a provider opened one. */
82
+ prUrl?: string;
83
+ /** Human-readable summary of the terminal condition. */
84
+ message: string;
85
+ }
86
+
87
+ /**
88
+ * The LOCATE-EXISTING resolver shared by `complete --isolated` and
89
+ * `resume --isolated`: resolve the arbiter URL from the operator's checkout, then
90
+ * the slug's retained job-worktree dir via `jobWorktreePath` (arbiter-URL-keyed —
91
+ * NOT a slug glob). Returns the resolved dir + arbiter URL when the worktree is
92
+ * PRESENT; an `error` (usage) when the arbiter is unresolvable; or
93
+ * `{present: false}` when no worktree is retained (the clean nothing-to-recover
94
+ * case). Pure resolution — no side effects.
95
+ */
96
+ export function locateIsolatedRecovery(params: {
97
+ slug: string;
98
+ cwd: string;
99
+ arbiter: string;
100
+ workspacesDir: string;
101
+ env?: NodeJS.ProcessEnv;
102
+ }):
103
+ | {dir: string; arbiterUrl: string; present: true}
104
+ | {present: false}
105
+ | {
106
+ error: string;
107
+ } {
108
+ const arbiterUrl = resolveArbiterUrlFromCheckout(
109
+ params.cwd,
110
+ params.arbiter,
111
+ params.env,
112
+ );
113
+ if (arbiterUrl === undefined) {
114
+ return {
115
+ error:
116
+ `--isolated finishes a worktree off this repo's arbiter (inferred from ` +
117
+ `cwd), but no '${params.arbiter}' remote was found here (is this a git ` +
118
+ `repo? does the '${params.arbiter}' remote exist?).`,
119
+ };
120
+ }
121
+ const dir = jobWorktreePath(params.workspacesDir, arbiterUrl, params.slug);
122
+ if (!existsSync(dir)) {
123
+ return {present: false};
124
+ }
125
+ return {dir, arbiterUrl, present: true};
126
+ }
127
+
128
+ /**
129
+ * Run the isolated recovery for a stranded, already-committed, already-done-moved
130
+ * worktree (the `complete --isolated <slug>` surface). Never throws for the
131
+ * expected cases — they are returned with a specific outcome + exit code.
132
+ */
133
+ export async function performRecoverIsolated(
134
+ options: RecoverIsolatedOptions,
135
+ ): Promise<RecoverIsolatedResult> {
136
+ const note = options.note ?? (() => {});
137
+ const env = options.env;
138
+ const arbiter = options.arbiter ?? DEFAULT_ARBITER;
139
+
140
+ const located = locateIsolatedRecovery({
141
+ slug: options.slug,
142
+ cwd: options.cwd,
143
+ arbiter,
144
+ workspacesDir: options.workspacesDir,
145
+ env,
146
+ });
147
+ if ('error' in located) {
148
+ return {exitCode: 1, outcome: 'usage-error', message: located.error};
149
+ }
150
+ if (!located.present) {
151
+ // No retained worktree — honest no-op: nothing to recover (already
152
+ // integrated + reaped, or never stranded). No crash, NO fresh worktree.
153
+ const message =
154
+ `Nothing to recover for '${options.slug}': no retained isolated worktree ` +
155
+ 'found (already integrated and reaped, or never stranded).';
156
+ note(message);
157
+ return {exitCode: 0, outcome: 'nothing-to-recover', message};
158
+ }
159
+
160
+ const dir = located.dir;
161
+ const branch = workBranchRef('task', options.slug);
162
+ // The strand left the worktree ON its `work/<slug>` branch; make sure we are on
163
+ // it (it carries the kept committed work + the done-move). Best-effort: if HEAD
164
+ // is already there this is a no-op; a missing branch surfaces as a usage error
165
+ // from the integration core's HEAD-resolution.
166
+ gitSoft(['switch', '--quiet', branch], dir, env);
167
+
168
+ note(`Recovering '${options.slug}' from the retained worktree ${dir}…`);
169
+ const core = await performIntegration({
170
+ cwd: dir,
171
+ // Inside a job worktree the arbiter remote is `origin` (the mirror's clone
172
+ // remote), NOT the operator's checkout arbiter name.
173
+ arbiter: WORKTREE_ARBITER_REMOTE,
174
+ slug: options.slug,
175
+ branch,
176
+ source: 'in-progress',
177
+ recovering: false,
178
+ committedRecovery: true,
179
+ mode: options.integration ?? 'propose',
180
+ noPR: options.noPR,
181
+ providerInstance: options.providerInstance,
182
+ openPr: options.openPr,
183
+ env,
184
+ note,
185
+ });
186
+
187
+ if (core.outcome === 'already-integrated') {
188
+ // The kept tip is already on the arbiter — a clean no-op. Reap the now-redundant
189
+ // worktree (its branch is provably on the arbiter), so a re-run finds nothing.
190
+ reapIfSafe(options.workspacesDir, located.arbiterUrl, branch, dir, env);
191
+ return {
192
+ exitCode: 0,
193
+ outcome: 'already-integrated',
194
+ branch,
195
+ worktree: dir,
196
+ message: core.reason ?? `'${options.slug}' is already integrated.`,
197
+ };
198
+ }
199
+ if (core.outcome === 'rebase-conflict') {
200
+ // A genuine code conflict — the kept commit stays intact on the branch
201
+ // (recoverable); the operator resolves it and re-runs. Worktree RETAINED.
202
+ return {
203
+ exitCode: 1,
204
+ outcome: 'rebase-conflict',
205
+ branch,
206
+ worktree: dir,
207
+ message:
208
+ core.reason ?? `recovering '${options.slug}' hit a rebase conflict.`,
209
+ };
210
+ }
211
+ if (core.outcome === 'completed') {
212
+ // Integrated from the kept commit. The work is now on the arbiter, so the
213
+ // worktree is provably redundant — reap it (the same §4 predicate the build
214
+ // teardown uses; never lose work — reachability still gates).
215
+ reapIfSafe(options.workspacesDir, located.arbiterUrl, branch, dir, env);
216
+ const prUrl = core.integration?.url;
217
+ const message = prUrl
218
+ ? `Recovered '${options.slug}': integrated the kept commit (${prUrl}).`
219
+ : `Recovered '${options.slug}': integrated the kept commit from ${branch}.`;
220
+ note(message);
221
+ return {
222
+ exitCode: 0,
223
+ outcome: 'completed',
224
+ branch,
225
+ worktree: dir,
226
+ prUrl,
227
+ message,
228
+ };
229
+ }
230
+ // Any other core outcome (defensive — committed-recovery only returns the three
231
+ // above): surface it as a usage error rather than mis-reporting success.
232
+ return {
233
+ exitCode: 1,
234
+ outcome: 'usage-error',
235
+ branch,
236
+ worktree: dir,
237
+ message:
238
+ core.reason ??
239
+ `recovering '${options.slug}' returned an unexpected outcome ` +
240
+ `'${core.outcome}'.`,
241
+ };
242
+ }
243
+
244
+ /**
245
+ * Reap the recovered worktree iff its branch is provably on the arbiter (the §4
246
+ * predicate, reachable-only so incidental churn does not retain a worktree whose
247
+ * branch is already safe). Best-effort: never throws on this success path.
248
+ */
249
+ function reapIfSafe(
250
+ workspacesDir: string,
251
+ arbiterUrl: string,
252
+ branch: string,
253
+ dir: string,
254
+ env: NodeJS.ProcessEnv | undefined,
255
+ ): void {
256
+ try {
257
+ reapJob({
258
+ dir,
259
+ branch,
260
+ mirrorPath: mirrorPath(workspacesDir, arbiterUrl),
261
+ reachableOnly: true,
262
+ env,
263
+ });
264
+ } catch {
265
+ // best-effort — the work is already on the arbiter; a reap failure is cosmetic.
266
+ }
267
+ }
268
+
269
+ /** Run git, returning the raw result (no throw) — for soft checks. */
270
+ function gitSoft(
271
+ args: string[],
272
+ cwd: string,
273
+ env: NodeJS.ProcessEnv | undefined,
274
+ ): RunResult {
275
+ return run('git', args, cwd, {env});
276
+ }