dorfl 0.0.0 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (619) hide show
  1. package/dist/advance-ci-template.d.ts +73 -0
  2. package/dist/advance-ci-template.d.ts.map +1 -0
  3. package/dist/advance-ci-template.js +104 -0
  4. package/dist/advance-ci-template.js.map +1 -0
  5. package/dist/advance-classify.d.ts +132 -0
  6. package/dist/advance-classify.d.ts.map +1 -0
  7. package/dist/advance-classify.js +120 -0
  8. package/dist/advance-classify.js.map +1 -0
  9. package/dist/advance-drivers.d.ts +182 -0
  10. package/dist/advance-drivers.d.ts.map +1 -0
  11. package/dist/advance-drivers.js +231 -0
  12. package/dist/advance-drivers.js.map +1 -0
  13. package/dist/advance-isolated.d.ts +156 -0
  14. package/dist/advance-isolated.d.ts.map +1 -0
  15. package/dist/advance-isolated.js +256 -0
  16. package/dist/advance-isolated.js.map +1 -0
  17. package/dist/advance-lifecycle-template.d.ts +107 -0
  18. package/dist/advance-lifecycle-template.d.ts.map +1 -0
  19. package/dist/advance-lifecycle-template.js +668 -0
  20. package/dist/advance-lifecycle-template.js.map +1 -0
  21. package/dist/advance-loop-driver.d.ts +325 -0
  22. package/dist/advance-loop-driver.d.ts.map +1 -0
  23. package/dist/advance-loop-driver.js +437 -0
  24. package/dist/advance-loop-driver.js.map +1 -0
  25. package/dist/advance-treeless-publish.d.ts +108 -0
  26. package/dist/advance-treeless-publish.d.ts.map +1 -0
  27. package/dist/advance-treeless-publish.js +71 -0
  28. package/dist/advance-treeless-publish.js.map +1 -0
  29. package/dist/advance.d.ts +340 -0
  30. package/dist/advance.d.ts.map +1 -0
  31. package/dist/advance.js +1122 -0
  32. package/dist/advance.js.map +1 -0
  33. package/dist/advancing-lock.d.ts +294 -0
  34. package/dist/advancing-lock.d.ts.map +1 -0
  35. package/dist/advancing-lock.js +594 -0
  36. package/dist/advancing-lock.js.map +1 -0
  37. package/dist/agent-launch.d.ts +79 -0
  38. package/dist/agent-launch.d.ts.map +1 -0
  39. package/dist/agent-launch.js +61 -0
  40. package/dist/agent-launch.js.map +1 -0
  41. package/dist/agent-stop.d.ts +149 -0
  42. package/dist/agent-stop.d.ts.map +1 -0
  43. package/dist/agent-stop.js +307 -0
  44. package/dist/agent-stop.js.map +1 -0
  45. package/dist/apply-decide.d.ts +127 -0
  46. package/dist/apply-decide.d.ts.map +1 -0
  47. package/dist/apply-decide.js +176 -0
  48. package/dist/apply-decide.js.map +1 -0
  49. package/dist/apply-merge-action.d.ts +206 -0
  50. package/dist/apply-merge-action.d.ts.map +1 -0
  51. package/dist/apply-merge-action.js +307 -0
  52. package/dist/apply-merge-action.js.map +1 -0
  53. package/dist/apply-persist.d.ts +174 -0
  54. package/dist/apply-persist.d.ts.map +1 -0
  55. package/dist/apply-persist.js +359 -0
  56. package/dist/apply-persist.js.map +1 -0
  57. package/dist/arbiter.d.ts +120 -0
  58. package/dist/arbiter.d.ts.map +1 -0
  59. package/dist/arbiter.js +255 -0
  60. package/dist/arbiter.js.map +1 -0
  61. package/dist/brand.d.ts +70 -0
  62. package/dist/brand.d.ts.map +1 -0
  63. package/dist/brand.js +84 -0
  64. package/dist/brand.js.map +1 -0
  65. package/dist/buildable-body.d.ts +132 -0
  66. package/dist/buildable-body.d.ts.map +1 -0
  67. package/dist/buildable-body.js +131 -0
  68. package/dist/buildable-body.js.map +1 -0
  69. package/dist/categorise.d.ts +66 -0
  70. package/dist/categorise.d.ts.map +1 -0
  71. package/dist/categorise.js +106 -0
  72. package/dist/categorise.js.map +1 -0
  73. package/dist/claim-cas.d.ts +117 -0
  74. package/dist/claim-cas.d.ts.map +1 -0
  75. package/dist/claim-cas.js +312 -0
  76. package/dist/claim-cas.js.map +1 -0
  77. package/dist/cli-spinner.d.ts +112 -0
  78. package/dist/cli-spinner.d.ts.map +1 -0
  79. package/dist/cli-spinner.js +157 -0
  80. package/dist/cli-spinner.js.map +1 -0
  81. package/dist/cli.d.ts +11 -0
  82. package/dist/cli.d.ts.map +1 -0
  83. package/dist/cli.js +3094 -0
  84. package/dist/cli.js.map +1 -0
  85. package/dist/close-job-template.d.ts +70 -0
  86. package/dist/close-job-template.d.ts.map +1 -0
  87. package/dist/close-job-template.js +180 -0
  88. package/dist/close-job-template.js.map +1 -0
  89. package/dist/close-job.d.ts +95 -0
  90. package/dist/close-job.d.ts.map +1 -0
  91. package/dist/close-job.js +226 -0
  92. package/dist/close-job.js.map +1 -0
  93. package/dist/complete.d.ts +361 -0
  94. package/dist/complete.d.ts.map +1 -0
  95. package/dist/complete.js +885 -0
  96. package/dist/complete.js.map +1 -0
  97. package/dist/concurrency.d.ts +68 -0
  98. package/dist/concurrency.d.ts.map +1 -0
  99. package/dist/concurrency.js +112 -0
  100. package/dist/concurrency.js.map +1 -0
  101. package/dist/config-override.d.ts +76 -0
  102. package/dist/config-override.d.ts.map +1 -0
  103. package/dist/config-override.js +50 -0
  104. package/dist/config-override.js.map +1 -0
  105. package/dist/config.d.ts +668 -0
  106. package/dist/config.d.ts.map +1 -0
  107. package/dist/config.js +241 -0
  108. package/dist/config.js.map +1 -0
  109. package/dist/continue-branch.d.ts +249 -0
  110. package/dist/continue-branch.d.ts.map +1 -0
  111. package/dist/continue-branch.js +389 -0
  112. package/dist/continue-branch.js.map +1 -0
  113. package/dist/cwd-section.d.ts +186 -0
  114. package/dist/cwd-section.d.ts.map +1 -0
  115. package/dist/cwd-section.js +209 -0
  116. package/dist/cwd-section.js.map +1 -0
  117. package/dist/decision-engine.d.ts +170 -0
  118. package/dist/decision-engine.d.ts.map +1 -0
  119. package/dist/decision-engine.js +136 -0
  120. package/dist/decision-engine.js.map +1 -0
  121. package/dist/detect.d.ts +17 -0
  122. package/dist/detect.d.ts.map +1 -0
  123. package/dist/detect.js +118 -0
  124. package/dist/detect.js.map +1 -0
  125. package/dist/do-autopick.d.ts +85 -0
  126. package/dist/do-autopick.d.ts.map +1 -0
  127. package/dist/do-autopick.js +112 -0
  128. package/dist/do-autopick.js.map +1 -0
  129. package/dist/do-config.d.ts +312 -0
  130. package/dist/do-config.d.ts.map +1 -0
  131. package/dist/do-config.js +358 -0
  132. package/dist/do-config.js.map +1 -0
  133. package/dist/do-remote-auto.d.ts +75 -0
  134. package/dist/do-remote-auto.d.ts.map +1 -0
  135. package/dist/do-remote-auto.js +111 -0
  136. package/dist/do-remote-auto.js.map +1 -0
  137. package/dist/do.d.ts +621 -0
  138. package/dist/do.d.ts.map +1 -0
  139. package/dist/do.js +1882 -0
  140. package/dist/do.js.map +1 -0
  141. package/dist/drop-source.d.ts +96 -0
  142. package/dist/drop-source.d.ts.map +1 -0
  143. package/dist/drop-source.js +91 -0
  144. package/dist/drop-source.js.map +1 -0
  145. package/dist/eligibility.d.ts +46 -0
  146. package/dist/eligibility.d.ts.map +1 -0
  147. package/dist/eligibility.js +34 -0
  148. package/dist/eligibility.js.map +1 -0
  149. package/dist/env-config.d.ts +51 -0
  150. package/dist/env-config.d.ts.map +1 -0
  151. package/dist/env-config.js +272 -0
  152. package/dist/env-config.js.map +1 -0
  153. package/dist/failure-cause.d.ts +70 -0
  154. package/dist/failure-cause.d.ts.map +1 -0
  155. package/dist/failure-cause.js +126 -0
  156. package/dist/failure-cause.js.map +1 -0
  157. package/dist/format.d.ts +43 -0
  158. package/dist/format.d.ts.map +1 -0
  159. package/dist/format.js +256 -0
  160. package/dist/format.js.map +1 -0
  161. package/dist/frontmatter.d.ts +215 -0
  162. package/dist/frontmatter.d.ts.map +1 -0
  163. package/dist/frontmatter.js +345 -0
  164. package/dist/frontmatter.js.map +1 -0
  165. package/dist/gate-readiness.d.ts +84 -0
  166. package/dist/gate-readiness.d.ts.map +1 -0
  167. package/dist/gate-readiness.js +103 -0
  168. package/dist/gate-readiness.js.map +1 -0
  169. package/dist/gc.d.ts +165 -0
  170. package/dist/gc.d.ts.map +1 -0
  171. package/dist/gc.js +313 -0
  172. package/dist/gc.js.map +1 -0
  173. package/dist/gh-failure.d.ts +42 -0
  174. package/dist/gh-failure.d.ts.map +1 -0
  175. package/dist/gh-failure.js +49 -0
  176. package/dist/gh-failure.js.map +1 -0
  177. package/dist/git.d.ts +75 -0
  178. package/dist/git.d.ts.map +1 -0
  179. package/dist/git.js +130 -0
  180. package/dist/git.js.map +1 -0
  181. package/dist/github.d.ts +187 -0
  182. package/dist/github.d.ts.map +1 -0
  183. package/dist/github.js +343 -0
  184. package/dist/github.js.map +1 -0
  185. package/dist/harness.d.ts +242 -0
  186. package/dist/harness.d.ts.map +1 -0
  187. package/dist/harness.js +157 -0
  188. package/dist/harness.js.map +1 -0
  189. package/dist/identity.d.ts +167 -0
  190. package/dist/identity.d.ts.map +1 -0
  191. package/dist/identity.js +231 -0
  192. package/dist/identity.js.map +1 -0
  193. package/dist/index.d.ts +147 -0
  194. package/dist/index.d.ts.map +1 -0
  195. package/dist/index.js +76 -0
  196. package/dist/index.js.map +1 -0
  197. package/dist/install-ci-branch-protection.d.ts +147 -0
  198. package/dist/install-ci-branch-protection.d.ts.map +1 -0
  199. package/dist/install-ci-branch-protection.js +166 -0
  200. package/dist/install-ci-branch-protection.js.map +1 -0
  201. package/dist/install-ci-capabilities/advance-lifecycle.d.ts +15 -0
  202. package/dist/install-ci-capabilities/advance-lifecycle.d.ts.map +1 -0
  203. package/dist/install-ci-capabilities/advance-lifecycle.js +28 -0
  204. package/dist/install-ci-capabilities/advance-lifecycle.js.map +1 -0
  205. package/dist/install-ci-capabilities/close-job.d.ts +13 -0
  206. package/dist/install-ci-capabilities/close-job.d.ts.map +1 -0
  207. package/dist/install-ci-capabilities/close-job.js +26 -0
  208. package/dist/install-ci-capabilities/close-job.js.map +1 -0
  209. package/dist/install-ci-capabilities/example-noop.d.ts +16 -0
  210. package/dist/install-ci-capabilities/example-noop.d.ts.map +1 -0
  211. package/dist/install-ci-capabilities/example-noop.js +23 -0
  212. package/dist/install-ci-capabilities/example-noop.js.map +1 -0
  213. package/dist/install-ci-capabilities/intake.d.ts +15 -0
  214. package/dist/install-ci-capabilities/intake.d.ts.map +1 -0
  215. package/dist/install-ci-capabilities/intake.js +28 -0
  216. package/dist/install-ci-capabilities/intake.js.map +1 -0
  217. package/dist/install-ci-capabilities/verify.d.ts +14 -0
  218. package/dist/install-ci-capabilities/verify.d.ts.map +1 -0
  219. package/dist/install-ci-capabilities/verify.js +27 -0
  220. package/dist/install-ci-capabilities/verify.js.map +1 -0
  221. package/dist/install-ci-core.d.ts +446 -0
  222. package/dist/install-ci-core.d.ts.map +1 -0
  223. package/dist/install-ci-core.js +760 -0
  224. package/dist/install-ci-core.js.map +1 -0
  225. package/dist/install-ci-github.d.ts +167 -0
  226. package/dist/install-ci-github.d.ts.map +1 -0
  227. package/dist/install-ci-github.js +315 -0
  228. package/dist/install-ci-github.js.map +1 -0
  229. package/dist/install-ci.d.ts +105 -0
  230. package/dist/install-ci.d.ts.map +1 -0
  231. package/dist/install-ci.js +363 -0
  232. package/dist/install-ci.js.map +1 -0
  233. package/dist/intake-event.d.ts +88 -0
  234. package/dist/intake-event.d.ts.map +1 -0
  235. package/dist/intake-event.js +66 -0
  236. package/dist/intake-event.js.map +1 -0
  237. package/dist/intake-marker.d.ts +95 -0
  238. package/dist/intake-marker.d.ts.map +1 -0
  239. package/dist/intake-marker.js +127 -0
  240. package/dist/intake-marker.js.map +1 -0
  241. package/dist/intake-triage.d.ts +48 -0
  242. package/dist/intake-triage.d.ts.map +1 -0
  243. package/dist/intake-triage.js +95 -0
  244. package/dist/intake-triage.js.map +1 -0
  245. package/dist/intake-trigger-template.d.ts +185 -0
  246. package/dist/intake-trigger-template.d.ts.map +1 -0
  247. package/dist/intake-trigger-template.js +449 -0
  248. package/dist/intake-trigger-template.js.map +1 -0
  249. package/dist/intake.d.ts +569 -0
  250. package/dist/intake.d.ts.map +1 -0
  251. package/dist/intake.js +1628 -0
  252. package/dist/intake.js.map +1 -0
  253. package/dist/integration-core.d.ts +539 -0
  254. package/dist/integration-core.d.ts.map +1 -0
  255. package/dist/integration-core.js +2195 -0
  256. package/dist/integration-core.js.map +1 -0
  257. package/dist/integrator.d.ts +343 -0
  258. package/dist/integrator.d.ts.map +1 -0
  259. package/dist/integrator.js +400 -0
  260. package/dist/integrator.js.map +1 -0
  261. package/dist/isolation.d.ts +219 -0
  262. package/dist/isolation.d.ts.map +1 -0
  263. package/dist/isolation.js +261 -0
  264. package/dist/isolation.js.map +1 -0
  265. package/dist/issue-provider.d.ts +349 -0
  266. package/dist/issue-provider.d.ts.map +1 -0
  267. package/dist/issue-provider.js +360 -0
  268. package/dist/issue-provider.js.map +1 -0
  269. package/dist/item-lock.d.ts +626 -0
  270. package/dist/item-lock.d.ts.map +1 -0
  271. package/dist/item-lock.js +1381 -0
  272. package/dist/item-lock.js.map +1 -0
  273. package/dist/item-path.d.ts +49 -0
  274. package/dist/item-path.d.ts.map +1 -0
  275. package/dist/item-path.js +66 -0
  276. package/dist/item-path.js.map +1 -0
  277. package/dist/ledger-lint.d.ts +129 -0
  278. package/dist/ledger-lint.d.ts.map +1 -0
  279. package/dist/ledger-lint.js +249 -0
  280. package/dist/ledger-lint.js.map +1 -0
  281. package/dist/ledger-read.d.ts +357 -0
  282. package/dist/ledger-read.d.ts.map +1 -0
  283. package/dist/ledger-read.js +442 -0
  284. package/dist/ledger-read.js.map +1 -0
  285. package/dist/ledger-write.d.ts +330 -0
  286. package/dist/ledger-write.d.ts.map +1 -0
  287. package/dist/ledger-write.js +411 -0
  288. package/dist/ledger-write.js.map +1 -0
  289. package/dist/lifecycle-gather.d.ts +30 -0
  290. package/dist/lifecycle-gather.d.ts.map +1 -0
  291. package/dist/lifecycle-gather.js +205 -0
  292. package/dist/lifecycle-gather.js.map +1 -0
  293. package/dist/lifecycle-pools.d.ts +180 -0
  294. package/dist/lifecycle-pools.d.ts.map +1 -0
  295. package/dist/lifecycle-pools.js +78 -0
  296. package/dist/lifecycle-pools.js.map +1 -0
  297. package/dist/merge-question-surfacer.d.ts +166 -0
  298. package/dist/merge-question-surfacer.d.ts.map +1 -0
  299. package/dist/merge-question-surfacer.js +297 -0
  300. package/dist/merge-question-surfacer.js.map +1 -0
  301. package/dist/mint-adr.d.ts +126 -0
  302. package/dist/mint-adr.d.ts.map +1 -0
  303. package/dist/mint-adr.js +257 -0
  304. package/dist/mint-adr.js.map +1 -0
  305. package/dist/mirror-pool-scan.d.ts +125 -0
  306. package/dist/mirror-pool-scan.d.ts.map +1 -0
  307. package/dist/mirror-pool-scan.js +104 -0
  308. package/dist/mirror-pool-scan.js.map +1 -0
  309. package/dist/needs-attention.d.ts +341 -0
  310. package/dist/needs-attention.d.ts.map +1 -0
  311. package/dist/needs-attention.js +900 -0
  312. package/dist/needs-attention.js.map +1 -0
  313. package/dist/orphan-sidecar.d.ts +79 -0
  314. package/dist/orphan-sidecar.d.ts.map +1 -0
  315. package/dist/orphan-sidecar.js +71 -0
  316. package/dist/orphan-sidecar.js.map +1 -0
  317. package/dist/output.d.ts +48 -0
  318. package/dist/output.d.ts.map +1 -0
  319. package/dist/output.js +66 -0
  320. package/dist/output.js.map +1 -0
  321. package/dist/pi-harness.d.ts +179 -0
  322. package/dist/pi-harness.d.ts.map +1 -0
  323. package/dist/pi-harness.js +342 -0
  324. package/dist/pi-harness.js.map +1 -0
  325. package/dist/placement.d.ts +99 -0
  326. package/dist/placement.d.ts.map +1 -0
  327. package/dist/placement.js +67 -0
  328. package/dist/placement.js.map +1 -0
  329. package/dist/prd-to-spec.d.ts +315 -0
  330. package/dist/prd-to-spec.d.ts.map +1 -0
  331. package/dist/prd-to-spec.js +684 -0
  332. package/dist/prd-to-spec.js.map +1 -0
  333. package/dist/prepare.d.ts +121 -0
  334. package/dist/prepare.d.ts.map +1 -0
  335. package/dist/prepare.js +140 -0
  336. package/dist/prepare.js.map +1 -0
  337. package/dist/prompt.d.ts +360 -0
  338. package/dist/prompt.d.ts.map +1 -0
  339. package/dist/prompt.js +499 -0
  340. package/dist/prompt.js.map +1 -0
  341. package/dist/protocol/ADR-FORMAT.md +47 -0
  342. package/dist/protocol/CLAIM-PROTOCOL.md +217 -0
  343. package/dist/protocol/REVIEW-PROTOCOL.md +119 -0
  344. package/dist/protocol/SURFACE-PROTOCOL.md +121 -0
  345. package/dist/protocol/TASKING-PROTOCOL.md +122 -0
  346. package/dist/protocol/WORK-CONTRACT.md +276 -0
  347. package/dist/protocol/spec-template.md +71 -0
  348. package/dist/protocol/task-template.md +65 -0
  349. package/dist/readiness.d.ts +66 -0
  350. package/dist/readiness.d.ts.map +1 -0
  351. package/dist/readiness.js +36 -0
  352. package/dist/readiness.js.map +1 -0
  353. package/dist/reap-branches.d.ts +102 -0
  354. package/dist/reap-branches.d.ts.map +1 -0
  355. package/dist/reap-branches.js +149 -0
  356. package/dist/reap-branches.js.map +1 -0
  357. package/dist/recover-isolated.d.ts +72 -0
  358. package/dist/recover-isolated.d.ts.map +1 -0
  359. package/dist/recover-isolated.js +188 -0
  360. package/dist/recover-isolated.js.map +1 -0
  361. package/dist/registry.d.ts +172 -0
  362. package/dist/registry.d.ts.map +1 -0
  363. package/dist/registry.js +296 -0
  364. package/dist/registry.js.map +1 -0
  365. package/dist/repo-config.d.ts +201 -0
  366. package/dist/repo-config.d.ts.map +1 -0
  367. package/dist/repo-config.js +414 -0
  368. package/dist/repo-config.js.map +1 -0
  369. package/dist/repo-key.d.ts +20 -0
  370. package/dist/repo-key.d.ts.map +1 -0
  371. package/dist/repo-key.js +68 -0
  372. package/dist/repo-key.js.map +1 -0
  373. package/dist/repo-mirror.d.ts +177 -0
  374. package/dist/repo-mirror.d.ts.map +1 -0
  375. package/dist/repo-mirror.js +271 -0
  376. package/dist/repo-mirror.js.map +1 -0
  377. package/dist/retry-backoff.d.ts +90 -0
  378. package/dist/retry-backoff.d.ts.map +1 -0
  379. package/dist/retry-backoff.js +98 -0
  380. package/dist/retry-backoff.js.map +1 -0
  381. package/dist/review-gate.d.ts +173 -0
  382. package/dist/review-gate.d.ts.map +1 -0
  383. package/dist/review-gate.js +261 -0
  384. package/dist/review-gate.js.map +1 -0
  385. package/dist/review-verdict.d.ts +149 -0
  386. package/dist/review-verdict.d.ts.map +1 -0
  387. package/dist/review-verdict.js +332 -0
  388. package/dist/review-verdict.js.map +1 -0
  389. package/dist/run.d.ts +221 -0
  390. package/dist/run.d.ts.map +1 -0
  391. package/dist/run.js +963 -0
  392. package/dist/run.js.map +1 -0
  393. package/dist/scan.d.ts +308 -0
  394. package/dist/scan.d.ts.map +1 -0
  395. package/dist/scan.js +374 -0
  396. package/dist/scan.js.map +1 -0
  397. package/dist/select-order.d.ts +75 -0
  398. package/dist/select-order.d.ts.map +1 -0
  399. package/dist/select-order.js +108 -0
  400. package/dist/select-order.js.map +1 -0
  401. package/dist/select-priority.d.ts +188 -0
  402. package/dist/select-priority.d.ts.map +1 -0
  403. package/dist/select-priority.js +80 -0
  404. package/dist/select-priority.js.map +1 -0
  405. package/dist/select.d.ts +25 -0
  406. package/dist/select.d.ts.map +1 -0
  407. package/dist/select.js +43 -0
  408. package/dist/select.js.map +1 -0
  409. package/dist/session-path.d.ts +36 -0
  410. package/dist/session-path.d.ts.map +1 -0
  411. package/dist/session-path.js +129 -0
  412. package/dist/session-path.js.map +1 -0
  413. package/dist/sidecar-apply.d.ts +83 -0
  414. package/dist/sidecar-apply.d.ts.map +1 -0
  415. package/dist/sidecar-apply.js +111 -0
  416. package/dist/sidecar-apply.js.map +1 -0
  417. package/dist/sidecar.d.ts +245 -0
  418. package/dist/sidecar.d.ts.map +1 -0
  419. package/dist/sidecar.js +481 -0
  420. package/dist/sidecar.js.map +1 -0
  421. package/dist/slug-namespace.d.ts +204 -0
  422. package/dist/slug-namespace.d.ts.map +1 -0
  423. package/dist/slug-namespace.js +229 -0
  424. package/dist/slug-namespace.js.map +1 -0
  425. package/dist/spec-complete.d.ts +44 -0
  426. package/dist/spec-complete.d.ts.map +1 -0
  427. package/dist/spec-complete.js +69 -0
  428. package/dist/spec-complete.js.map +1 -0
  429. package/dist/start.d.ts +97 -0
  430. package/dist/start.d.ts.map +1 -0
  431. package/dist/start.js +633 -0
  432. package/dist/start.js.map +1 -0
  433. package/dist/status.d.ts +199 -0
  434. package/dist/status.d.ts.map +1 -0
  435. package/dist/status.js +228 -0
  436. package/dist/status.js.map +1 -0
  437. package/dist/surface-gate.d.ts +162 -0
  438. package/dist/surface-gate.d.ts.map +1 -0
  439. package/dist/surface-gate.js +206 -0
  440. package/dist/surface-gate.js.map +1 -0
  441. package/dist/surface-persist.d.ts +86 -0
  442. package/dist/surface-persist.d.ts.map +1 -0
  443. package/dist/surface-persist.js +129 -0
  444. package/dist/surface-persist.js.map +1 -0
  445. package/dist/tasker-review-loop.d.ts +249 -0
  446. package/dist/tasker-review-loop.d.ts.map +1 -0
  447. package/dist/tasker-review-loop.js +369 -0
  448. package/dist/tasker-review-loop.js.map +1 -0
  449. package/dist/tasking-eligibility.d.ts +74 -0
  450. package/dist/tasking-eligibility.d.ts.map +1 -0
  451. package/dist/tasking-eligibility.js +52 -0
  452. package/dist/tasking-eligibility.js.map +1 -0
  453. package/dist/tasking-lock.d.ts +111 -0
  454. package/dist/tasking-lock.d.ts.map +1 -0
  455. package/dist/tasking-lock.js +256 -0
  456. package/dist/tasking-lock.js.map +1 -0
  457. package/dist/tasking.d.ts +275 -0
  458. package/dist/tasking.d.ts.map +1 -0
  459. package/dist/tasking.js +952 -0
  460. package/dist/tasking.js.map +1 -0
  461. package/dist/triage-gate.d.ts +127 -0
  462. package/dist/triage-gate.d.ts.map +1 -0
  463. package/dist/triage-gate.js +139 -0
  464. package/dist/triage-gate.js.map +1 -0
  465. package/dist/triage-persist.d.ts +163 -0
  466. package/dist/triage-persist.d.ts.map +1 -0
  467. package/dist/triage-persist.js +387 -0
  468. package/dist/triage-persist.js.map +1 -0
  469. package/dist/verdict-json.d.ts +32 -0
  470. package/dist/verdict-json.d.ts.map +1 -0
  471. package/dist/verdict-json.js +74 -0
  472. package/dist/verdict-json.js.map +1 -0
  473. package/dist/verify-workflow-template.d.ts +60 -0
  474. package/dist/verify-workflow-template.d.ts.map +1 -0
  475. package/dist/verify-workflow-template.js +126 -0
  476. package/dist/verify-workflow-template.js.map +1 -0
  477. package/dist/verify.d.ts +60 -0
  478. package/dist/verify.d.ts.map +1 -0
  479. package/dist/verify.js +62 -0
  480. package/dist/verify.js.map +1 -0
  481. package/dist/watch-session.d.ts +112 -0
  482. package/dist/watch-session.d.ts.map +1 -0
  483. package/dist/watch-session.js +347 -0
  484. package/dist/watch-session.js.map +1 -0
  485. package/dist/work-layout.d.ts +198 -0
  486. package/dist/work-layout.d.ts.map +1 -0
  487. package/dist/work-layout.js +217 -0
  488. package/dist/work-layout.js.map +1 -0
  489. package/dist/work-on.d.ts +154 -0
  490. package/dist/work-on.d.ts.map +1 -0
  491. package/dist/work-on.js +387 -0
  492. package/dist/work-on.js.map +1 -0
  493. package/dist/workspace.d.ts +224 -0
  494. package/dist/workspace.d.ts.map +1 -0
  495. package/dist/workspace.js +325 -0
  496. package/dist/workspace.js.map +1 -0
  497. package/package.json +46 -2
  498. package/src/advance-ci-template.ts +203 -0
  499. package/src/advance-classify.ts +197 -0
  500. package/src/advance-drivers.ts +414 -0
  501. package/src/advance-isolated.ts +432 -0
  502. package/src/advance-lifecycle-template.ts +791 -0
  503. package/src/advance-loop-driver.ts +745 -0
  504. package/src/advance-treeless-publish.ts +177 -0
  505. package/src/advance.ts +1564 -0
  506. package/src/advancing-lock.ts +988 -0
  507. package/src/agent-launch.ts +137 -0
  508. package/src/agent-stop.ts +361 -0
  509. package/src/apply-decide.ts +242 -0
  510. package/src/apply-merge-action.ts +502 -0
  511. package/src/apply-persist.ts +518 -0
  512. package/src/arbiter.ts +372 -0
  513. package/src/brand.ts +111 -0
  514. package/src/buildable-body.ts +196 -0
  515. package/src/categorise.ts +158 -0
  516. package/src/claim-cas.ts +513 -0
  517. package/src/cli-spinner.ts +225 -0
  518. package/src/cli.ts +4369 -0
  519. package/src/close-job-template.ts +236 -0
  520. package/src/close-job.ts +319 -0
  521. package/src/complete.ts +1379 -0
  522. package/src/concurrency.ts +151 -0
  523. package/src/config-override.ts +116 -0
  524. package/src/config.ts +883 -0
  525. package/src/continue-branch.ts +542 -0
  526. package/src/cwd-section.ts +392 -0
  527. package/src/decision-engine.ts +272 -0
  528. package/src/detect.ts +124 -0
  529. package/src/do-autopick.ts +223 -0
  530. package/src/do-config.ts +589 -0
  531. package/src/do-remote-auto.ts +197 -0
  532. package/src/do.ts +2623 -0
  533. package/src/drop-source.ts +194 -0
  534. package/src/eligibility.ts +79 -0
  535. package/src/env-config.ts +305 -0
  536. package/src/failure-cause.ts +142 -0
  537. package/src/format.ts +313 -0
  538. package/src/frontmatter.ts +485 -0
  539. package/src/gate-readiness.ts +147 -0
  540. package/src/gc.ts +510 -0
  541. package/src/gh-failure.ts +53 -0
  542. package/src/git.ts +186 -0
  543. package/src/github.ts +468 -0
  544. package/src/harness.ts +355 -0
  545. package/src/identity.ts +322 -0
  546. package/src/index.ts +785 -0
  547. package/src/install-ci-branch-protection.ts +255 -0
  548. package/src/install-ci-capabilities/advance-lifecycle.ts +34 -0
  549. package/src/install-ci-capabilities/close-job.ts +32 -0
  550. package/src/install-ci-capabilities/example-noop.ts +24 -0
  551. package/src/install-ci-capabilities/intake.ts +34 -0
  552. package/src/install-ci-capabilities/verify.ts +33 -0
  553. package/src/install-ci-core.ts +1088 -0
  554. package/src/install-ci-github.ts +376 -0
  555. package/src/install-ci.ts +552 -0
  556. package/src/intake-event.ts +102 -0
  557. package/src/intake-marker.ts +195 -0
  558. package/src/intake-triage.ts +138 -0
  559. package/src/intake-trigger-template.ts +591 -0
  560. package/src/intake.ts +2445 -0
  561. package/src/integration-core.ts +3065 -0
  562. package/src/integrator.ts +771 -0
  563. package/src/isolation.ts +484 -0
  564. package/src/issue-provider.ts +733 -0
  565. package/src/item-lock.ts +1858 -0
  566. package/src/item-path.ts +75 -0
  567. package/src/ledger-lint.ts +332 -0
  568. package/src/ledger-read.ts +924 -0
  569. package/src/ledger-write.ts +865 -0
  570. package/src/lifecycle-gather.ts +298 -0
  571. package/src/lifecycle-pools.ts +250 -0
  572. package/src/merge-question-surfacer.ts +496 -0
  573. package/src/mint-adr.ts +362 -0
  574. package/src/mirror-pool-scan.ts +240 -0
  575. package/src/needs-attention.ts +1506 -0
  576. package/src/orphan-sidecar.ts +150 -0
  577. package/src/output.ts +89 -0
  578. package/src/pi-harness.ts +403 -0
  579. package/src/placement.ts +131 -0
  580. package/src/prd-to-spec.ts +1023 -0
  581. package/src/prepare.ts +230 -0
  582. package/src/prompt.ts +760 -0
  583. package/src/readiness.ts +98 -0
  584. package/src/reap-branches.ts +278 -0
  585. package/src/recover-isolated.ts +276 -0
  586. package/src/registry.ts +475 -0
  587. package/src/repo-config.ts +550 -0
  588. package/src/repo-key.ts +74 -0
  589. package/src/repo-mirror.ts +367 -0
  590. package/src/retry-backoff.ts +130 -0
  591. package/src/review-gate.ts +389 -0
  592. package/src/review-verdict.ts +422 -0
  593. package/src/run.ts +1430 -0
  594. package/src/scan.ts +611 -0
  595. package/src/select-order.ts +143 -0
  596. package/src/select-priority.ts +266 -0
  597. package/src/select.ts +62 -0
  598. package/src/session-path.ts +153 -0
  599. package/src/sidecar-apply.ts +216 -0
  600. package/src/sidecar.ts +700 -0
  601. package/src/slug-namespace.ts +367 -0
  602. package/src/spec-complete.ts +118 -0
  603. package/src/start.ts +974 -0
  604. package/src/status.ts +441 -0
  605. package/src/surface-gate.ts +337 -0
  606. package/src/surface-persist.ts +241 -0
  607. package/src/tasker-review-loop.ts +671 -0
  608. package/src/tasking-eligibility.ts +114 -0
  609. package/src/tasking-lock.ts +416 -0
  610. package/src/tasking.ts +1438 -0
  611. package/src/triage-gate.ts +248 -0
  612. package/src/triage-persist.ts +570 -0
  613. package/src/verdict-json.ts +73 -0
  614. package/src/verify-workflow-template.ts +159 -0
  615. package/src/verify.ts +123 -0
  616. package/src/watch-session.ts +397 -0
  617. package/src/work-layout.ts +262 -0
  618. package/src/work-on.ts +660 -0
  619. package/src/workspace.ts +502 -0
package/dist/gc.d.ts ADDED
@@ -0,0 +1,165 @@
1
+ import { type JobRecord } from './workspace.js';
2
+ /**
3
+ * Why a job's worktree was retained (not provably safe to remove). The reaper
4
+ * surfaces exactly one of these per retained job (the FIRST failing clause, in
5
+ * predicate order: dirty tree dominates, then arbiter-reachability).
6
+ */
7
+ export type RetainReason = 'dirty-tree' | 'unmerged-commits' | 'branch-not-pushed';
8
+ /** Human-readable text for each retain reason (used in `gc` reports). */
9
+ export declare const RETAIN_REASON_TEXT: Record<RetainReason, string>;
10
+ /** How a job's branch tip is reachable on the arbiter (when it is). */
11
+ export type ReachableVia = 'merged' | 'pushed';
12
+ /** The result of applying the deletion-safety predicate to one job worktree. */
13
+ export interface SafetyVerdict {
14
+ /** True iff the worktree is provably safe to remove (clean AND reachable). */
15
+ safe: boolean;
16
+ /** When `safe`, HOW the tip is reachable on the arbiter. */
17
+ reachableVia?: ReachableVia;
18
+ /** When NOT `safe`, why it was retained. */
19
+ reason?: RetainReason;
20
+ }
21
+ export interface EvaluateSafetyInput {
22
+ /** The job worktree directory to evaluate. */
23
+ dir: string;
24
+ /** The work branch checked out there (`work/<slug>`). */
25
+ branch: string;
26
+ /**
27
+ * The arbiter remote name valid inside the worktree. Defaults to `origin`
28
+ * (the bare hub mirror's clone remote — ADR §2). Tests with a different
29
+ * layout can override it.
30
+ */
31
+ arbiter?: string;
32
+ /**
33
+ * Drop the CLEAN-TREE half of the predicate, keeping ONLY the
34
+ * reachable-on-arbiter half. A worktree whose durable branch is provably on
35
+ * the arbiter is then safe to reap EVEN WHEN its tree has incidental churn
36
+ * (uncommitted doc-churn / artefacts) — because the durable artefact is the
37
+ * PUSHED branch, not the worktree files.
38
+ *
39
+ * Scoped, deliberate opt-in for the FAILURE-return path of `performDoRemote`,
40
+ * where the needs-attention seam has ALREADY surfaced the item + pushed the
41
+ * branch, so we KNOW the work is safe. The reachability half is NEVER dropped
42
+ * (we never reap work not yet on the arbiter — never lose work). The default
43
+ * (`false`) keeps the full clean-AND-reachable predicate the clean-completion
44
+ * path and `gc`'s default sweep use unchanged.
45
+ */
46
+ reachableOnly?: boolean;
47
+ env?: NodeJS.ProcessEnv;
48
+ }
49
+ /**
50
+ * Apply the provably-safe deletion predicate (ADR §4) to ONE job worktree:
51
+ *
52
+ * 1. the working tree must be **clean** (no uncommitted changes), AND
53
+ * 2. the branch tip must be **reachable on the arbiter** — merged
54
+ * (`merge-base --is-ancestor <tip> <arbiter>/main`) OR pushed
55
+ * (`<arbiter>/<branch>` tip == local tip).
56
+ *
57
+ * Reaches out to the arbiter (a `git fetch`) so the remote-tracking refs reflect
58
+ * the live arbiter before checking reachability. Never mutates the worktree.
59
+ * Pure verdict — the caller decides whether to reap.
60
+ */
61
+ export declare function evaluateDeletionSafety(input: EvaluateSafetyInput): SafetyVerdict;
62
+ export interface ReapInput extends EvaluateSafetyInput {
63
+ /**
64
+ * The bare hub mirror the worktree was cut from. `git worktree remove` +
65
+ * `prune` are run there (the worktree's registration lives on the mirror).
66
+ */
67
+ mirrorPath: string;
68
+ /**
69
+ * Override the predicate: remove the worktree even when NOT provably safe
70
+ * (discard un-saved work). Loud + explicit — NEVER the default (ADR §4).
71
+ */
72
+ force?: boolean;
73
+ }
74
+ export interface ReapResult {
75
+ /** True iff the worktree was actually removed. */
76
+ removed: boolean;
77
+ /** The verdict the decision was based on. */
78
+ verdict: SafetyVerdict;
79
+ /** True iff removal happened only because `force` overrode the predicate. */
80
+ forced: boolean;
81
+ }
82
+ /**
83
+ * Auto-reap ONE job worktree iff the predicate holds (or `force` overrides):
84
+ * `git worktree remove` then `git worktree prune` on the hub mirror — NEVER a
85
+ * bare `rm -rf` (ADR §4). Returns whether it removed the worktree + the verdict
86
+ * it acted on (so the caller can report a retained job's reason).
87
+ *
88
+ * Used at end-of-job (the runner calls it after integrating) and by `gc` (the
89
+ * catch-up when auto-reap didn't run). A job whose work is NOT on the arbiter is
90
+ * never removed here (force is the only override, and it is explicit).
91
+ */
92
+ export declare function reapJob(input: ReapInput): ReapResult;
93
+ /** One job the `gc` sweep evaluated. */
94
+ export interface GcJob {
95
+ /** Absolute path to the job worktree. */
96
+ dir: string;
97
+ /** The work slug (from the record, else derived from the dir name). */
98
+ slug: string;
99
+ /** The work branch (`work/<slug>`). */
100
+ branch: string;
101
+ /** The per-job record, when present. */
102
+ record?: JobRecord;
103
+ }
104
+ /** A worktree `gc` reaped (provably safe, or forced). */
105
+ export interface ReapedJob extends GcJob {
106
+ verdict: SafetyVerdict;
107
+ /** True iff removed only because `--force` overrode the predicate. */
108
+ forced: boolean;
109
+ }
110
+ /** A worktree `gc` retained, with the human-readable reason it kept it. */
111
+ export interface RetainedJob extends GcJob {
112
+ reason: RetainReason;
113
+ /** Human-readable reason text (`RETAIN_REASON_TEXT[reason]`). */
114
+ reasonText: string;
115
+ }
116
+ export interface GcOptions {
117
+ /** The execution working area (config `workspacesDir`, default `~/.dorfl`). */
118
+ workspacesDir: string;
119
+ /**
120
+ * Override the predicate for EVERY job: discard un-saved work. Loud +
121
+ * explicit (the CLI guards it behind a confirmation) — NEVER the default.
122
+ */
123
+ force?: boolean;
124
+ /** Sink for human-readable progress notes (per reaped / retained job). */
125
+ note?: (message: string) => void;
126
+ env?: NodeJS.ProcessEnv;
127
+ }
128
+ export interface GcResult {
129
+ /** The worktrees reaped this sweep (provably safe, or forced). */
130
+ reaped: ReapedJob[];
131
+ /** The worktrees retained, each with a clear reason. */
132
+ retained: RetainedJob[];
133
+ }
134
+ /**
135
+ * Re-apply the deletion-safety predicate across every `<workspacesDir>/work/*`
136
+ * job (ADR §4): reap the provably-safe ones, RETAIN the rest and report each
137
+ * with a clear reason. This is the safety-net catch-up for when auto-reap didn't
138
+ * run (a runner crash/kill left the worktree behind).
139
+ *
140
+ * `force: true` overrides the predicate for every job (discard un-saved work) —
141
+ * loud + explicit (the CLI confirms first), NEVER the default. A job whose work
142
+ * is NOT on the arbiter is never auto-removed without `force`.
143
+ */
144
+ export declare function gc(options: GcOptions): GcResult;
145
+ /**
146
+ * Discover every job worktree under `<workspacesDir>/work/*` (the flat layout —
147
+ * ADR §2). The per-job record is a SIBLING of the worktree dir
148
+ * (`<work-id>.json` next to `<work-id>/`, {@link jobRecordPath}) — OUTSIDE the
149
+ * checked-out tree so it can never be swept into a commit — so a work-id dir is
150
+ * a job iff its sibling record file exists (with a LEGACY fallback to an in-tree
151
+ * record left by an old binary, via {@link readJobRecord}). The branch comes
152
+ * from the record (falling back to `work/<derived-slug>`).
153
+ */
154
+ export declare function discoverJobs(workspacesDir: string): GcJob[];
155
+ /**
156
+ * True iff `ancestor` is an ancestor of (or equal to) `descendant`, both
157
+ * resolved IN the local repo `dir` (`git merge-base --is-ancestor`). This is the
158
+ * ONE provably-merged reachability predicate in the system: the worktree reaper
159
+ * above uses it for `<tip> --is-ancestor <arbiter>/main`, and the remote
160
+ * merged-branch sweep (`reap-branches.ts`) REUSES it (not a second predicate) to
161
+ * decide a remote `work/<slug>` branch is provably merged before deleting it.
162
+ * EXPORTED so that single source of truth is shared, never forked.
163
+ */
164
+ export declare function isAncestor(dir: string, ancestor: string, descendant: string, env: NodeJS.ProcessEnv | undefined): boolean;
165
+ //# sourceMappingURL=gc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gc.d.ts","sourceRoot":"","sources":["../src/gc.ts"],"names":[],"mappings":"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"}
package/dist/gc.js ADDED
@@ -0,0 +1,313 @@
1
+ import { existsSync, readdirSync, statSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { git, run } from './git.js';
4
+ import { JOB_RECORD_FILENAME, jobRecordPath, readJobRecord, removeJobRecord, } from './workspace.js';
5
+ import { workBranchRef } from './slug-namespace.js';
6
+ /**
7
+ * The **reaper** for job worktrees, governed by the **provably-safe deletion
8
+ * predicate** (ADR §4 in `docs/adr/execution-substrate-decisions.md`, the
9
+ * authoritative source). Split out of `agent-workspaces` so the substrate stays
10
+ * thin; this module owns deletion.
11
+ *
12
+ * A job's worktree is removed (auto, at end-of-job; or by `gc`) **iff**:
13
+ *
14
+ * 1. its working tree is **clean** (no uncommitted changes), AND
15
+ * 2. its branch tip is **reachable on the arbiter** — either merged into
16
+ * `<arbiter>/main` (`git merge-base --is-ancestor <tip> <arbiter>/main`),
17
+ * OR pushed as an up-to-date branch (`<arbiter>/<branch>` tip == local tip).
18
+ *
19
+ * Both hold ⇒ the worktree is genuinely redundant (reconstructible from the
20
+ * arbiter) ⇒ remove. Otherwise ⇒ **retain for the human** (a retained worktree
21
+ * is a reliable "needs attention" signal that dovetails with `watch`'s
22
+ * surface-failures rail).
23
+ *
24
+ * The trigger is **provable safety, not "success"**: a successful-but-unpushed
25
+ * job is retained; a job whose commits are on the arbiter is reaped. One rule,
26
+ * no done-vs-failed special-casing. Removal is always `git worktree remove`
27
+ * (+ prune), NEVER a bare `rm -rf` (which would leave a dangling worktree
28
+ * registration on the hub).
29
+ *
30
+ * `--force` overrides the predicate (discard un-saved work) — it must be loud
31
+ * and explicit, NEVER the default.
32
+ */
33
+ /** The arbiter remote name valid INSIDE a job worktree (ADR §2: cut from the
34
+ * bare hub mirror whose clone remote is `origin`). */
35
+ const ARBITER_REMOTE = 'origin';
36
+ /** Human-readable text for each retain reason (used in `gc` reports). */
37
+ export const RETAIN_REASON_TEXT = {
38
+ 'dirty-tree': 'dirty tree (uncommitted changes)',
39
+ 'unmerged-commits': 'unmerged commits (branch tip not on the arbiter)',
40
+ 'branch-not-pushed': 'branch not pushed (remote tip differs from local tip)',
41
+ };
42
+ /**
43
+ * Apply the provably-safe deletion predicate (ADR §4) to ONE job worktree:
44
+ *
45
+ * 1. the working tree must be **clean** (no uncommitted changes), AND
46
+ * 2. the branch tip must be **reachable on the arbiter** — merged
47
+ * (`merge-base --is-ancestor <tip> <arbiter>/main`) OR pushed
48
+ * (`<arbiter>/<branch>` tip == local tip).
49
+ *
50
+ * Reaches out to the arbiter (a `git fetch`) so the remote-tracking refs reflect
51
+ * the live arbiter before checking reachability. Never mutates the worktree.
52
+ * Pure verdict — the caller decides whether to reap.
53
+ */
54
+ export function evaluateDeletionSafety(input) {
55
+ const env = input.env;
56
+ const arbiter = input.arbiter ?? ARBITER_REMOTE;
57
+ // 1. Clean tree? Dirty dominates (we never reap over uncommitted work) —
58
+ // UNLESS `reachableOnly` was opted into (the failure path, where the branch
59
+ // is already pushed so the durable artefact is the branch, not the tree).
60
+ if (input.reachableOnly !== true && !isWorkingTreeClean(input.dir, env)) {
61
+ return { safe: false, reason: 'dirty-tree' };
62
+ }
63
+ // Refresh the arbiter's refs so reachability is checked against the LIVE
64
+ // arbiter (not a stale local mirror). A job worktree is cut from a bare hub
65
+ // mirror whose `origin` remote has NO fetch refspec (so `origin/main` /
66
+ // `origin/<branch>` would not otherwise resolve) — so we fetch the two refs
67
+ // we need EXPLICITLY into remote-tracking refs (the same technique
68
+ // `integrator.rebaseOntoArbiterMain` uses). A plain `git fetch origin` would
69
+ // instead try to clobber the checked-out branch on a mirror. Best-effort: an
70
+ // unreachable arbiter leaves the local refs in place and the predicate reads
71
+ // as not-reachable → retain (the safe direction).
72
+ fetchTracking(input.dir, arbiter, 'main', env);
73
+ fetchTracking(input.dir, arbiter, input.branch, env);
74
+ const localTip = revParse(input.dir, 'HEAD', env);
75
+ // 2a. Merged: the tip is an ancestor of <arbiter>/main.
76
+ if (isAncestor(input.dir, localTip, `refs/remotes/${arbiter}/main`, env)) {
77
+ return { safe: true, reachableVia: 'merged' };
78
+ }
79
+ // 2b. Pushed: <arbiter>/<branch> exists AND its tip == the local tip.
80
+ const remoteTip = revParseOrUndefined(input.dir, `refs/remotes/${arbiter}/${input.branch}`, env);
81
+ if (remoteTip !== undefined && remoteTip === localTip) {
82
+ return { safe: true, reachableVia: 'pushed' };
83
+ }
84
+ // Clean, but NOT on the arbiter: distinguish "a remote branch exists but its
85
+ // tip differs (un-pushed amend)" from "no remote presence at all".
86
+ if (remoteTip !== undefined) {
87
+ return { safe: false, reason: 'branch-not-pushed' };
88
+ }
89
+ return { safe: false, reason: 'unmerged-commits' };
90
+ }
91
+ /**
92
+ * Auto-reap ONE job worktree iff the predicate holds (or `force` overrides):
93
+ * `git worktree remove` then `git worktree prune` on the hub mirror — NEVER a
94
+ * bare `rm -rf` (ADR §4). Returns whether it removed the worktree + the verdict
95
+ * it acted on (so the caller can report a retained job's reason).
96
+ *
97
+ * Used at end-of-job (the runner calls it after integrating) and by `gc` (the
98
+ * catch-up when auto-reap didn't run). A job whose work is NOT on the arbiter is
99
+ * never removed here (force is the only override, and it is explicit).
100
+ */
101
+ export function reapJob(input) {
102
+ const verdict = evaluateDeletionSafety(input);
103
+ const force = input.force === true;
104
+ if (!verdict.safe && !force) {
105
+ return { removed: false, verdict, forced: false };
106
+ }
107
+ removeWorktree(input.mirrorPath, input.dir, input.branch, input.env);
108
+ return { removed: true, verdict, forced: !verdict.safe };
109
+ }
110
+ /**
111
+ * Re-apply the deletion-safety predicate across every `<workspacesDir>/work/*`
112
+ * job (ADR §4): reap the provably-safe ones, RETAIN the rest and report each
113
+ * with a clear reason. This is the safety-net catch-up for when auto-reap didn't
114
+ * run (a runner crash/kill left the worktree behind).
115
+ *
116
+ * `force: true` overrides the predicate for every job (discard un-saved work) —
117
+ * loud + explicit (the CLI confirms first), NEVER the default. A job whose work
118
+ * is NOT on the arbiter is never auto-removed without `force`.
119
+ */
120
+ export function gc(options) {
121
+ const note = options.note ?? (() => { });
122
+ const env = options.env;
123
+ const reaped = [];
124
+ const retained = [];
125
+ for (const job of discoverJobs(options.workspacesDir)) {
126
+ const mirrorPath = resolveMirrorPath(options.workspacesDir, job);
127
+ const result = reapJob({
128
+ dir: job.dir,
129
+ branch: job.branch,
130
+ mirrorPath,
131
+ force: options.force,
132
+ env,
133
+ });
134
+ if (result.removed) {
135
+ reaped.push({ ...job, verdict: result.verdict, forced: result.forced });
136
+ note(result.forced
137
+ ? `Reaped ${job.slug} (FORCED — discarded un-saved work).`
138
+ : `Reaped ${job.slug} (${result.verdict.reachableVia}).`);
139
+ continue;
140
+ }
141
+ const reason = result.verdict.reason ?? 'unmerged-commits';
142
+ const reasonText = RETAIN_REASON_TEXT[reason];
143
+ retained.push({ ...job, reason, reasonText });
144
+ note(`Retained ${job.slug}: ${reasonText}.`);
145
+ }
146
+ return { reaped, retained };
147
+ }
148
+ /**
149
+ * Discover every job worktree under `<workspacesDir>/work/*` (the flat layout —
150
+ * ADR §2). The per-job record is a SIBLING of the worktree dir
151
+ * (`<work-id>.json` next to `<work-id>/`, {@link jobRecordPath}) — OUTSIDE the
152
+ * checked-out tree so it can never be swept into a commit — so a work-id dir is
153
+ * a job iff its sibling record file exists (with a LEGACY fallback to an in-tree
154
+ * record left by an old binary, via {@link readJobRecord}). The branch comes
155
+ * from the record (falling back to `work/<derived-slug>`).
156
+ */
157
+ export function discoverJobs(workspacesDir) {
158
+ const workDir = join(workspacesDir, 'work');
159
+ if (!existsSync(workDir)) {
160
+ return [];
161
+ }
162
+ const jobs = [];
163
+ for (const entry of readdirSync(workDir)) {
164
+ const dir = join(workDir, entry);
165
+ let isDir;
166
+ try {
167
+ isDir = statSync(dir).isDirectory();
168
+ }
169
+ catch {
170
+ continue;
171
+ }
172
+ if (!isDir) {
173
+ continue; // skip the sibling `<work-id>.json` record files themselves
174
+ }
175
+ // A job iff a record exists — the sibling path first, then the legacy
176
+ // in-tree path (an old-binary worktree). Mirrors `readJobRecord`'s order.
177
+ if (!existsSync(jobRecordPath(dir)) &&
178
+ !existsSync(join(dir, JOB_RECORD_FILENAME))) {
179
+ continue; // not a job worktree (no record at either location)
180
+ }
181
+ const record = readJobRecord(dir);
182
+ const slug = record?.slug ?? deriveSlug(entry);
183
+ // The job record carries the (already-namespaced) branch — the SOURCE OF
184
+ // TRUTH. Only when a record is missing/legacy do we synthesise a fallback;
185
+ // the flat work-id dir name cannot recover the type, so default to the
186
+ // overwhelmingly-common `task` namespace (a recordless worktree is a rare
187
+ // legacy/corrupt case).
188
+ const branch = record?.branch ?? workBranchRef('task', slug);
189
+ jobs.push({ dir, slug, branch, record });
190
+ }
191
+ return jobs;
192
+ }
193
+ /** Derive a slug from a flat work-id dir name (`host__org__repo__slug`). */
194
+ function deriveSlug(workId) {
195
+ const parts = workId.split('__');
196
+ return parts[parts.length - 1] || workId;
197
+ }
198
+ /**
199
+ * The hub mirror a job worktree was cut from. We do NOT reconstruct it from the
200
+ * encoded repo key (the key may not round-trip the arbiter URL): a worktree's
201
+ * `.git` file points at its mirror's `worktrees/<id>` admin dir, so we read the
202
+ * mirror's common dir directly from the worktree (robust + layout-agnostic).
203
+ */
204
+ function resolveMirrorPath(workspacesDir, job) {
205
+ const common = run('git', ['rev-parse', '--path-format=absolute', '--git-common-dir'], job.dir);
206
+ const dir = common.stdout.trim();
207
+ if (common.status === 0 && dir !== '') {
208
+ return dir;
209
+ }
210
+ // Fallback: the repos hub under the workspaces dir (best-effort).
211
+ return join(workspacesDir, 'repos');
212
+ }
213
+ /**
214
+ * True iff the working tree has NO uncommitted WORK (tracked, staged, or
215
+ * untracked). The agent's edits and any untracked artefacts count: untracked
216
+ * work is still un-saved work.
217
+ *
218
+ * The `.dorfl-job.json` exclusion below is now INERT: the per-job record
219
+ * lives at a SIBLING path OUTSIDE the worktree, so it can no longer appear in
220
+ * the worktree's `git status` at all. It used to be load-bearing (the record
221
+ * was written INSIDE the worktree, so a perfectly-saved job would otherwise read
222
+ * as "dirty" purely because the runner wrote its own state file there). It is
223
+ * kept as a harmless no-op that still names the record for a hypothetical
224
+ * old-binary worktree whose record is still in-tree (the read-fallback case);
225
+ * removing it would only risk regressing that edge with no upside. The
226
+ * `work/`-ledger exclusion is a SEPARATE concern and stays.
227
+ */
228
+ function isWorkingTreeClean(dir, env) {
229
+ // `status --porcelain` prints one line per change; empty ⇒ clean. Includes
230
+ // staged, unstaged, and untracked files.
231
+ const res = run('git', ['status', '--porcelain'], dir, { env });
232
+ if (res.status !== 0) {
233
+ // Can't determine cleanliness ⇒ treat as dirty (the safe direction).
234
+ return false;
235
+ }
236
+ const lines = res.stdout
237
+ .split('\n')
238
+ .map((l) => l.trimEnd())
239
+ .filter((l) => l !== '');
240
+ // Each porcelain line is `XY <path>` (path starts at column 3). Drop the
241
+ // runner's own job-record line; any remaining change ⇒ genuinely dirty.
242
+ const work = lines.filter((l) => l.slice(3).trim() !== JOB_RECORD_FILENAME);
243
+ return work.length === 0;
244
+ }
245
+ /**
246
+ * Fetch a single arbiter head into its remote-tracking ref EXPLICITLY
247
+ * (`+refs/heads/<head>:refs/remotes/<arbiter>/<head>`). A bare hub mirror has no
248
+ * fetch refspec, so this is the only way the remote-tracking ref exists; it is
249
+ * also harmless on a normal clone. Best-effort: the arbiter may be unreachable
250
+ * (offline) or the head may not exist there — either way the local ref simply
251
+ * stays absent/stale and the predicate reads as not-reachable → retain.
252
+ */
253
+ function fetchTracking(dir, arbiter, head, env) {
254
+ run('git', [
255
+ 'fetch',
256
+ '--quiet',
257
+ arbiter,
258
+ `+refs/heads/${head}:refs/remotes/${arbiter}/${head}`,
259
+ ], dir, { env });
260
+ }
261
+ /**
262
+ * True iff `ancestor` is an ancestor of (or equal to) `descendant`, both
263
+ * resolved IN the local repo `dir` (`git merge-base --is-ancestor`). This is the
264
+ * ONE provably-merged reachability predicate in the system: the worktree reaper
265
+ * above uses it for `<tip> --is-ancestor <arbiter>/main`, and the remote
266
+ * merged-branch sweep (`reap-branches.ts`) REUSES it (not a second predicate) to
267
+ * decide a remote `work/<slug>` branch is provably merged before deleting it.
268
+ * EXPORTED so that single source of truth is shared, never forked.
269
+ */
270
+ export function isAncestor(dir, ancestor, descendant, env) {
271
+ const res = run('git', ['merge-base', '--is-ancestor', ancestor, descendant], dir, { env });
272
+ return res.status === 0;
273
+ }
274
+ /** Resolve a ref to its 40-hex sha (throws if it doesn't resolve). */
275
+ function revParse(dir, ref, env) {
276
+ return git(['rev-parse', '--verify', '--quiet', ref], dir, { env }).trim();
277
+ }
278
+ /** Resolve a ref to its sha, or `undefined` if it doesn't resolve. */
279
+ function revParseOrUndefined(dir, ref, env) {
280
+ const res = run('git', ['rev-parse', '--verify', '--quiet', ref], dir, { env });
281
+ if (res.status !== 0) {
282
+ return undefined;
283
+ }
284
+ const sha = res.stdout.trim();
285
+ return sha === '' ? undefined : sha;
286
+ }
287
+ /**
288
+ * Remove a job worktree the contract-safe way: `git worktree remove` then
289
+ * `git worktree prune` on the hub mirror, plus dropping the now-orphaned work
290
+ * branch AND the now-orphaned per-job record (a SIBLING of the worktree since
291
+ * the relocation — it no longer goes away WITH the worktree dir, so we delete it
292
+ * explicitly so a reaped job leaves no `<work-id>.json` litter). NEVER a bare
293
+ * `rm -rf` of the WORKTREE (ADR §4): a raw delete leaves a dangling worktree
294
+ * registration on the hub. Best-effort on prune/branch-drop/record (idempotent
295
+ * re-runs of `gc` must not error on an already-clean hub).
296
+ */
297
+ function removeWorktree(mirrorPath, dir, branch, env) {
298
+ git(['worktree', 'remove', '--force', dir], mirrorPath, { env });
299
+ removeJobRecord(dir);
300
+ try {
301
+ git(['worktree', 'prune'], mirrorPath, { env });
302
+ }
303
+ catch {
304
+ // best-effort
305
+ }
306
+ try {
307
+ git(['branch', '-D', branch], mirrorPath, { env });
308
+ }
309
+ catch {
310
+ // branch may already be gone
311
+ }
312
+ }
313
+ //# sourceMappingURL=gc.js.map
package/dist/gc.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gc.js","sourceRoot":"","sources":["../src/gc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { type RunResult } from './git.js';
2
+ /**
3
+ * **Shared `gh`-failure diagnostics** for the two `gh`-backed provider seams (the
4
+ * review-request `GitHubProvider` in `github.ts` and the `GitHubIssueProvider` in
5
+ * `issue-provider.ts`).
6
+ *
7
+ * Both providers shell out to `gh` and must, on a failure, surface the REAL cause
8
+ * — the actual `gh` stderr (a rate-limit, a permissions error, a transient 5xx),
9
+ * NOT a hard-coded "`gh` is unavailable or unauthenticated" guess that sends an
10
+ * operator chasing a phantom auth problem. This module is the single source of
11
+ * truth for that distillation so the two providers can NEVER drift apart on the
12
+ * next fix (the drift the original hard-coded strings created).
13
+ *
14
+ * Both `gh`-shelling helpers (`runGh`) return `RunResult | undefined`, where
15
+ * `undefined` = the `gh` BINARY could not be spawned (missing / not on `PATH`).
16
+ * That case has no `RunResult` to read, so the PAIR below resolves it to a fixed
17
+ * "binary missing" string and reserves {@link ghFailureReason} for a genuine
18
+ * `RunResult`.
19
+ */
20
+ /** The fixed reason for a missing/unspawnable `gh` binary (no `RunResult` to read). */
21
+ export declare const GH_BINARY_MISSING = "`gh` is not available (binary missing).";
22
+ /**
23
+ * Distil the REAL reason a `gh` invocation failed from its result — the trimmed
24
+ * stderr (the actual cause, e.g. `'dorfl:processing' not found`), falling
25
+ * back to the exit status when stderr is empty. This is what replaces the old
26
+ * hard-coded "unavailable or unauthenticated" guess: the cause must be diagnosable.
27
+ *
28
+ * Requires a NON-undefined `RunResult` (it reads `stderr`/`status`); a missing
29
+ * binary (`undefined`) has no result to read — use {@link ghFailureDetail} when
30
+ * the value may be `undefined`.
31
+ */
32
+ export declare function ghFailureReason(result: RunResult): string;
33
+ /**
34
+ * Resolve the real failure detail for a `gh` shell-out whose result MAY be
35
+ * `undefined` (binary missing) — the two-arm guard both providers' degrade paths
36
+ * need: a missing binary yields the fixed {@link GH_BINARY_MISSING} string, and
37
+ * only a genuine `RunResult` is passed to {@link ghFailureReason}. This keeps the
38
+ * undefined-vs-`RunResult` split in ONE place so no degrade branch ever calls
39
+ * `ghFailureReason(undefined)`.
40
+ */
41
+ export declare function ghFailureDetail(result: RunResult | undefined): string;
42
+ //# sourceMappingURL=gh-failure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gh-failure.d.ts","sourceRoot":"","sources":["../src/gh-failure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,SAAS,EAAC,MAAM,UAAU,CAAC;AAExC;;;;;;;;;;;;;;;;;GAiBG;AAEH,uFAAuF;AACvF,eAAO,MAAM,iBAAiB,4CAA4C,CAAC;AAE3E;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAMzD;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAErE"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * **Shared `gh`-failure diagnostics** for the two `gh`-backed provider seams (the
3
+ * review-request `GitHubProvider` in `github.ts` and the `GitHubIssueProvider` in
4
+ * `issue-provider.ts`).
5
+ *
6
+ * Both providers shell out to `gh` and must, on a failure, surface the REAL cause
7
+ * — the actual `gh` stderr (a rate-limit, a permissions error, a transient 5xx),
8
+ * NOT a hard-coded "`gh` is unavailable or unauthenticated" guess that sends an
9
+ * operator chasing a phantom auth problem. This module is the single source of
10
+ * truth for that distillation so the two providers can NEVER drift apart on the
11
+ * next fix (the drift the original hard-coded strings created).
12
+ *
13
+ * Both `gh`-shelling helpers (`runGh`) return `RunResult | undefined`, where
14
+ * `undefined` = the `gh` BINARY could not be spawned (missing / not on `PATH`).
15
+ * That case has no `RunResult` to read, so the PAIR below resolves it to a fixed
16
+ * "binary missing" string and reserves {@link ghFailureReason} for a genuine
17
+ * `RunResult`.
18
+ */
19
+ /** The fixed reason for a missing/unspawnable `gh` binary (no `RunResult` to read). */
20
+ export const GH_BINARY_MISSING = '`gh` is not available (binary missing).';
21
+ /**
22
+ * Distil the REAL reason a `gh` invocation failed from its result — the trimmed
23
+ * stderr (the actual cause, e.g. `'dorfl:processing' not found`), falling
24
+ * back to the exit status when stderr is empty. This is what replaces the old
25
+ * hard-coded "unavailable or unauthenticated" guess: the cause must be diagnosable.
26
+ *
27
+ * Requires a NON-undefined `RunResult` (it reads `stderr`/`status`); a missing
28
+ * binary (`undefined`) has no result to read — use {@link ghFailureDetail} when
29
+ * the value may be `undefined`.
30
+ */
31
+ export function ghFailureReason(result) {
32
+ const stderr = result.stderr.trim();
33
+ if (stderr) {
34
+ return stderr;
35
+ }
36
+ return `\`gh\` exited ${result.status}.`;
37
+ }
38
+ /**
39
+ * Resolve the real failure detail for a `gh` shell-out whose result MAY be
40
+ * `undefined` (binary missing) — the two-arm guard both providers' degrade paths
41
+ * need: a missing binary yields the fixed {@link GH_BINARY_MISSING} string, and
42
+ * only a genuine `RunResult` is passed to {@link ghFailureReason}. This keeps the
43
+ * undefined-vs-`RunResult` split in ONE place so no degrade branch ever calls
44
+ * `ghFailureReason(undefined)`.
45
+ */
46
+ export function ghFailureDetail(result) {
47
+ return result === undefined ? GH_BINARY_MISSING : ghFailureReason(result);
48
+ }
49
+ //# sourceMappingURL=gh-failure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gh-failure.js","sourceRoot":"","sources":["../src/gh-failure.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;GAiBG;AAEH,uFAAuF;AACvF,MAAM,CAAC,MAAM,iBAAiB,GAAG,yCAAyC,CAAC;AAE3E;;;;;;;;;GASG;AACH,MAAM,UAAU,eAAe,CAAC,MAAiB;IAChD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,MAAM,EAAE,CAAC;QACZ,OAAO,MAAM,CAAC;IACf,CAAC;IACD,OAAO,iBAAiB,MAAM,CAAC,MAAM,GAAG,CAAC;AAC1C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,MAA6B;IAC5D,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;AAC3E,CAAC"}