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,367 @@
1
+ import {existsSync, mkdirSync} from 'node:fs';
2
+ import {dirname, join} from 'node:path';
3
+ import {git, run} from './git.js';
4
+ import type {Config, PartialConfig} from './config.js';
5
+ import type {ConfigOverrideMap} from './config-override.js';
6
+ import {
7
+ REPO_CONFIG_FILENAME,
8
+ loadRepoConfigFromContent,
9
+ resolveRepoConfigFromLoaded,
10
+ type LoadedRepoConfig,
11
+ } from './repo-config.js';
12
+ import {encodeRepoKey} from './repo-key.js';
13
+
14
+ export {encodeRepoKey} from './repo-key.js';
15
+
16
+ /**
17
+ * Read a bare hub mirror's `origin` URL (`git -C <mirror> remote get-url
18
+ * origin`). Returns the trimmed URL, or `undefined` when the mirror has no
19
+ * `origin` or the read fails (a malformed mirror). The single helper both the
20
+ * registry enumeration (`remote ls`) and the per-machine override layer (the
21
+ * hub-key lookup in {@link resolveRepoConfigFromMirror}) use; defining it here
22
+ * avoids duplicating the `git remote get-url origin` call across modules.
23
+ */
24
+ export function readOriginUrl(
25
+ mirrorDir: string,
26
+ env: NodeJS.ProcessEnv | undefined,
27
+ ): string | undefined {
28
+ const result = run('git', ['remote', 'get-url', 'origin'], mirrorDir, {env});
29
+ if (result.status !== 0) {
30
+ return undefined;
31
+ }
32
+ const url = result.stdout.trim();
33
+ return url === '' ? undefined : url;
34
+ }
35
+
36
+ /**
37
+ * The shared **hub-mirror primitive**: one bare mirror per repo under
38
+ * `<workspacesDir>/repos/<key>.git`, re-fetched from the arbiter. Both the
39
+ * autonomous job runner (`agent-workspaces`) and the human `work-on` build on
40
+ * it: a job worktree and a human worktree are both cut from the mirror's
41
+ * freshly-fetched `main`, so they always branch off the latest arbiter main
42
+ * (ADR §2).
43
+ *
44
+ * This module does NOT create worktrees, claim, or run anything — it only
45
+ * locates / creates / fetches the mirror. It is STATE, not cache (ADR §3): it
46
+ * lives under `~/.dorfl/` (config `workspacesDir`), never `~/.cache`.
47
+ */
48
+
49
+ /**
50
+ * The on-disk location of the bare hub mirror for `url`:
51
+ * `<workspacesDir>/repos/<key>.git`. Lives under `workspacesDir` (default
52
+ * `~/.dorfl`), never `~/.cache` (ADR §3).
53
+ */
54
+ export function mirrorPath(workspacesDir: string, url: string): string {
55
+ return join(workspacesDir, 'repos', `${encodeRepoKey(url)}.git`);
56
+ }
57
+
58
+ export interface EnsureMirrorOptions {
59
+ /**
60
+ * The arbiter remote URL to mirror. Either `url` OR (`fromRepo` + `arbiter`)
61
+ * must be given; if both, `url` wins.
62
+ */
63
+ url?: string;
64
+ /** A working repo to resolve the remote URL from (with `arbiter`). */
65
+ fromRepo?: string;
66
+ /** Remote name in `fromRepo` whose URL to mirror (default `origin`). */
67
+ arbiter?: string;
68
+ /** The execution working area (config `workspacesDir`, default `~/.dorfl`). */
69
+ workspacesDir: string;
70
+ env?: NodeJS.ProcessEnv;
71
+ }
72
+
73
+ export interface EnsureMirrorResult {
74
+ /** Absolute path to the bare mirror. */
75
+ path: string;
76
+ /** The resolved arbiter URL the mirror tracks. */
77
+ url: string;
78
+ /** True iff the mirror did not exist and was just created. */
79
+ created: boolean;
80
+ /** True iff an existing mirror was fetched (not created). */
81
+ fetched: boolean;
82
+ /** The mirror's freshly-fetched `main` tip (40-hex sha). */
83
+ mainSha: string;
84
+ }
85
+
86
+ /**
87
+ * Locate the bare hub mirror for the arbiter; create it (`git clone --bare`) if
88
+ * absent, or `git fetch` it if present. Idempotent: a second call fetches and
89
+ * reuses the same mirror (it never re-clones, so any local mirror state — e.g.
90
+ * other branches/objects — survives). Returns the mirror path and its
91
+ * freshly-fetched `main`, so callers (job worktrees, human worktrees) always
92
+ * branch off the latest arbiter main.
93
+ */
94
+ export function ensureMirror(options: EnsureMirrorOptions): EnsureMirrorResult {
95
+ const env = options.env;
96
+ const url = resolveUrl(options);
97
+ const path = mirrorPath(options.workspacesDir, url);
98
+
99
+ let created = false;
100
+ let fetched = false;
101
+ if (existsSync(path)) {
102
+ // Reuse: fetch the latest from the arbiter into the existing bare mirror.
103
+ //
104
+ // `main` is the authoritative base every worktree branches off — fetch it
105
+ // HARD (prune), and it can never collide with a checked-out branch (`main` is
106
+ // never a job worktree branch).
107
+ git(
108
+ ['fetch', '--prune', 'origin', '+refs/heads/main:refs/heads/main'],
109
+ path,
110
+ {
111
+ env,
112
+ },
113
+ );
114
+ // SHARED-MIRROR SIBLING-WORKTREE SAFETY (task
115
+ // `cutover-claim-body-stays-and-complete-sources-from-backlog`): two SAME-repo
116
+ // `run` jobs share ONE bare mirror, and each `git worktree add`s its own LOCAL
117
+ // `work/<slug>` head. The remaining all-heads fetch (which brings down each
118
+ // arbiter `work/<slug>` so continue-detection can read it as a local head) tries
119
+ // to UPDATE every such head; git REFUSES to fetch into a SIBLING's `work/<slug>`
120
+ // head while that sibling worktree has it checked out (`fatal: refusing to fetch
121
+ // into branch ... checked out`) and exits non-zero — EVEN THOUGH it still updated
122
+ // every OTHER ref (incl. main, above, and THIS job's own `work/<slug>`). Before
123
+ // this task the claim's body-move serialised the jobs enough to hide the
124
+ // overlap; with claim no longer writing `main` the jobs run concurrently and it
125
+ // surfaces. So this all-heads fetch is BEST-EFFORT (soft): a sibling's
126
+ // checked-out head being refused must NOT fail the whole ensure — the refs we
127
+ // need (main + this job's own head) are already updated, and continue-detection
128
+ // is arbiter-authoritative (`ls-remote` in `createJob`) anyway. A genuinely
129
+ // unrelated failure (e.g. an unreachable arbiter) ALSO degrades to best-effort
130
+ // here, but `main` (the hard fetch above) already succeeded, so the worktree
131
+ // materialisation has its base; the per-branch onboard reads still fail loudly
132
+ // downstream if a needed ref is genuinely absent.
133
+ run('git', ['fetch', 'origin', '+refs/heads/*:refs/heads/*'], path, {env});
134
+ fetched = true;
135
+ } else {
136
+ // First time: a bare mirror clone (shared object store, cheap).
137
+ mkdirSync(dirname(path), {recursive: true});
138
+ git(['clone', '--quiet', '--bare', url, path], dirname(path), {env});
139
+ created = true;
140
+ }
141
+
142
+ return {path, url, created, fetched, mainSha: mirrorMainSha(path, env)};
143
+ }
144
+
145
+ /**
146
+ * Locate the bare hub mirror for the arbiter and refresh ONLY its `main`,
147
+ * WITHOUT the all-heads `--prune` fetch {@link ensureMirror} does. Clones the
148
+ * mirror (`git clone --bare`) if absent — a fresh clone has no local worktrees,
149
+ * so the all-heads clone refspec cannot collide with any checked-out branch —
150
+ * but on REUSE refreshes via {@link fetchMirrorMain} (main-only, no-prune).
151
+ *
152
+ * This is the MIRROR-ENSURE for the no-checkout CONFIG READ (`do --remote`/
153
+ * `do --isolated` per-repo `.dorfl.json`): `git show main:.dorfl.json`
154
+ * only needs `main`, and using the pruning all-heads fetch here would let a
155
+ * `work/<slug>` branch CHECKED OUT in some other (stale) job worktree block the
156
+ * fetch (`git refuses to fetch into branch … checked out`), throwing the config
157
+ * read into its global+default fallback. Narrowing the config-read fetch to
158
+ * main-only (no-prune) means a checked-out worktree branch can NEVER block it
159
+ * (the read-path `scan`/`status`/mirror-pool-scan already use main-only fetches
160
+ * for exactly this reason — ADR §6).
161
+ *
162
+ * Does NOT replace {@link ensureMirror}: the build's worktree MATERIALISATION
163
+ * still legitimately needs the all-heads fetch (continue-detection wants the
164
+ * kept `work/<slug>` head as a local mirror ref). This is only for the read.
165
+ */
166
+ export function ensureMirrorMain(
167
+ options: EnsureMirrorOptions,
168
+ ): EnsureMirrorResult {
169
+ const env = options.env;
170
+ const url = resolveUrl(options);
171
+ const path = mirrorPath(options.workspacesDir, url);
172
+
173
+ let created = false;
174
+ let fetched = false;
175
+ if (existsSync(path)) {
176
+ // Reuse: refresh ONLY `main`, no-prune, so a `work/<slug>` branch checked
177
+ // out in some other worktree can never block this fetch.
178
+ fetchMirrorMain(path, env);
179
+ fetched = true;
180
+ } else {
181
+ // First time: a bare mirror clone (no local worktrees yet, so the clone's
182
+ // own refspec can collide with nothing).
183
+ mkdirSync(dirname(path), {recursive: true});
184
+ git(['clone', '--quiet', '--bare', url, path], dirname(path), {env});
185
+ created = true;
186
+ }
187
+
188
+ return {path, url, created, fetched, mainSha: mirrorMainSha(path, env)};
189
+ }
190
+
191
+ /** Resolve the arbiter URL from `url`, or from `fromRepo` + `arbiter` remote. */
192
+ function resolveUrl(options: EnsureMirrorOptions): string {
193
+ if (options.url && options.url.trim() !== '') {
194
+ return options.url.trim();
195
+ }
196
+ if (options.fromRepo) {
197
+ const remote = options.arbiter ?? 'origin';
198
+ return git(['remote', 'get-url', remote], options.fromRepo, {
199
+ env: options.env,
200
+ }).trim();
201
+ }
202
+ throw new Error(
203
+ 'ensureMirror requires either `url` or `fromRepo` (with `arbiter`).',
204
+ );
205
+ }
206
+
207
+ /**
208
+ * Fetch ONLY `main` from the arbiter into an existing bare mirror, WITHOUT
209
+ * `--prune`. Use this when the mirror also holds LOCAL-ONLY branches that must
210
+ * survive (e.g. the `work/<slug>` branches of live worktrees): the full
211
+ * mirror-style `+refs/heads/*:refs/heads/*` fetch in {@link ensureMirror} prunes
212
+ * any local head absent on the arbiter, which would delete (and corrupt) a
213
+ * checked-out `work/<slug>` worktree branch. This refreshes `main` to the latest
214
+ * arbiter tip while leaving every other local ref untouched. Returns the fresh
215
+ * `main` tip.
216
+ */
217
+ export function fetchMirrorMain(
218
+ mirrorDir: string,
219
+ env?: NodeJS.ProcessEnv,
220
+ ): string {
221
+ git(['fetch', 'origin', '+refs/heads/main:refs/heads/main'], mirrorDir, {
222
+ env,
223
+ });
224
+ return mirrorMainSha(mirrorDir, env);
225
+ }
226
+
227
+ /**
228
+ * Read the target repo's COMMITTED `.dorfl.json` from the bare hub
229
+ * mirror's `main` (`git show main:.dorfl.json`) — the per-repo config
230
+ * layer for the NO-CHECKOUT paths (`do --remote`). The committed file is a
231
+ * tracked file on `<arbiter>/main`, so it is reachable from the mirror without a
232
+ * worktree. Returns the raw file CONTENT, or `undefined` when the repo has no
233
+ * `.dorfl.json` on `main` (a config-less repo — the caller then resolves to
234
+ * exactly global + default, byte-identical to before this layer existed).
235
+ *
236
+ * This is the task's ONE genuinely-new seam: sourcing the bytes from the arbiter
237
+ * instead of the cwd. The parse / allow-reject filtering stays in
238
+ * {@link loadRepoConfigFromContent} (the existing per-repo machinery), so the
239
+ * host-only key rejection is identical however the bytes were sourced.
240
+ *
241
+ * A `git show` failure that is NOT "path missing on main" (a corrupt mirror, an
242
+ * absent `main`) is propagated — it is a genuine plumbing fault, not a
243
+ * config-less repo. The missing-path case (`git show` exit ≠ 0 naming the path)
244
+ * is read as `undefined` (no file = no per-repo layer).
245
+ */
246
+ export function readRepoConfigFromMirrorMain(
247
+ mirrorDir: string,
248
+ env?: NodeJS.ProcessEnv,
249
+ ): string | undefined {
250
+ const spec = `main:${REPO_CONFIG_FILENAME}`;
251
+ const res = run('git', ['show', spec], mirrorDir, {env});
252
+ if (res.status === 0) {
253
+ return res.stdout;
254
+ }
255
+ // `git show main:<path>` exits non-zero both when the PATH is absent on main
256
+ // (the config-less repo — expected, → undefined) and when `main`/the object is
257
+ // unresolvable (a genuine fault — propagate). git words the former as
258
+ // "...does not exist in 'main'" / "exists on disk, but not in" / "path ...
259
+ // does not exist"; the latter as an invalid-object/unknown-revision error.
260
+ const stderr = res.stderr;
261
+ const pathMissing =
262
+ /does not exist in|exists on disk, but not in|fatal: path/i.test(stderr) ||
263
+ /did not match any file/i.test(stderr);
264
+ if (pathMissing) {
265
+ return undefined;
266
+ }
267
+ throw new Error(
268
+ `git show ${spec} failed in ${mirrorDir} (exit ${res.status}): ${stderr.trim()}`,
269
+ );
270
+ }
271
+
272
+ /**
273
+ * Resolve a repo's effective {@link Config} for a NO-CHECKOUT path by layering its
274
+ * COMMITTED `.dorfl.json` (read from the bare hub mirror's `main` via
275
+ * {@link readRepoConfigFromMirrorMain}) into the SAME
276
+ * `flag > env > per-repo > global > default` chain a working checkout uses
277
+ * ({@link resolveRepoConfigFromLoaded}). This is the reusable core of `do
278
+ * --remote`'s inline per-repo resolution (`resolveRemoteRepoConfig` in `cli.ts`):
279
+ * the mirror is assumed ALREADY ensured + fetched by the caller (the read paths
280
+ * fetch-first), so this only READS its `main` config and layers it.
281
+ *
282
+ * Resilient: a config-less repo (no file on `main`) resolves to exactly
283
+ * global + flags (byte-identical to the no-per-repo behaviour). A genuine
284
+ * read fault is propagated by {@link readRepoConfigFromMirrorMain}; a caller that
285
+ * must never block on a fault (a read-only scan) catches + falls back to
286
+ * global + flags itself.
287
+ */
288
+ export function resolveRepoConfigFromMirror(options: {
289
+ /** The bare hub mirror directory whose `main:.dorfl.json` to read. */
290
+ mirrorPath: string;
291
+ /** The global + default config layer (from `loadConfig`/`mergeConfig`). */
292
+ global: Config;
293
+ /** Optional flag overrides (highest precedence). */
294
+ flags?: PartialConfig;
295
+ env?: NodeJS.ProcessEnv;
296
+ /**
297
+ * The per-machine override map (from `loadConfigOverride`), inserted between
298
+ * the committed per-repo file and env in the precedence chain. The hub key is
299
+ * derived from the mirror's own `origin` URL (via {@link readOriginUrl}); if
300
+ * unresolvable, the hub-key bucket is skipped and only the `"*"` bucket
301
+ * applies. Default: empty map (no override applied) — byte-identical to the
302
+ * pre-override behaviour.
303
+ */
304
+ override?: ConfigOverrideMap;
305
+ }): Config {
306
+ const {mirrorPath, global, flags, env, override} = options;
307
+ const content = readRepoConfigFromMirrorMain(mirrorPath, env);
308
+ const label = `${mirrorPath}#main:${REPO_CONFIG_FILENAME}`;
309
+ const loaded: LoadedRepoConfig =
310
+ content === undefined
311
+ ? {path: label, config: {}, rejected: []}
312
+ : loadRepoConfigFromContent(content, label);
313
+ // The hub key for the override lookup comes from the mirror's OWN `origin`
314
+ // URL (the more reliable source for a no-checkout path — the mirror is what
315
+ // the runner actually operates on). Unresolvable ⇒ hub-key lookup skipped
316
+ // (graceful degrade); the `"*"` bucket still applies.
317
+ const arbiterUrl = readOriginUrl(mirrorPath, env);
318
+ return resolveRepoConfigFromLoaded(loaded, {
319
+ global,
320
+ flags,
321
+ override,
322
+ ...(arbiterUrl !== undefined ? {arbiterUrl} : {}),
323
+ }).config;
324
+ }
325
+
326
+ /** The bare mirror's `main` tip (40-hex sha), as freshly fetched. */
327
+ export function mirrorMainSha(
328
+ mirrorDir: string,
329
+ env?: NodeJS.ProcessEnv,
330
+ ): string {
331
+ return git(['rev-parse', 'main'], mirrorDir, {env}).trim();
332
+ }
333
+
334
+ /**
335
+ * Fetch-first for the READ paths (`scan`/`status`, ADR
336
+ * `command-surface-and-journeys` §5/§6): refresh a registered mirror's `main`
337
+ * before reading its `work/` tree, so the read sees the remote truth (the
338
+ * registry model makes the remote the source of truth). It is a thin wrapper
339
+ * over {@link fetchMirrorMain} (the load-bearing main-only, no-prune fetch — it
340
+ * must NOT be the pruning `ensureMirror` fetch, which would delete live
341
+ * worktrees' `work/<slug>` branches, ADR §6).
342
+ *
343
+ * **Never errors out: warn + fall back to last-known.** A failed fetch (offline,
344
+ * a vanished origin, a dead arbiter) is NOT fatal for a read — `scan`/`status`
345
+ * must still report from the mirror's last-known `main`. On failure it routes a
346
+ * human-readable note through `warn` and returns `false`; on success it returns
347
+ * `true`. The freshness of the read then reflects the last SUCCESSFUL fetch.
348
+ */
349
+ export function fetchMirrorMainOrWarn(options: {
350
+ /** The bare hub mirror directory whose `main` to refresh. */
351
+ mirrorPath: string;
352
+ /** Sink for the fall-back warning when the fetch fails. */
353
+ warn?: (message: string) => void;
354
+ env?: NodeJS.ProcessEnv;
355
+ }): boolean {
356
+ try {
357
+ fetchMirrorMain(options.mirrorPath, options.env);
358
+ return true;
359
+ } catch (err) {
360
+ const reason = err instanceof Error ? err.message : String(err);
361
+ options.warn?.(
362
+ `could not fetch mirror at ${options.mirrorPath}; ` +
363
+ `reading last-known state (offline). ${reason}`,
364
+ );
365
+ return false;
366
+ }
367
+ }
@@ -0,0 +1,130 @@
1
+ /**
2
+ * A small, shared **bounded exponential-backoff** retry helper for git / provider
3
+ * NETWORK ops on the needs-attention route (the OBSERVABLE surface push, the
4
+ * RECOVERABLE branch push, and the propose-mode PR create). The route does a
5
+ * LOCAL move that always succeeds offline, then these best-effort remote ops; a
6
+ * transient OUTAGE (unreachable arbiter / flaky provider) should be RETRIED a few
7
+ * times with a temporal delay before a clean BOUNDED give-up into the local-only
8
+ * degraded state — never an indefinite hang, never an uncaught throw out of the
9
+ * failure handler.
10
+ *
11
+ * This is DELIBERATELY NOT the model in {@link file://./claim-cas.ts}: that loop
12
+ * retries CONTENTION (a REJECTED push — someone advanced the ref) INSTANTLY with
13
+ * NO delay, refetching+rebuilding against the new base. THIS helper is for the
14
+ * OUTAGE/unreachable case, which needs a temporal back-off (the remote may come
15
+ * back); the two are distinct and must not be conflated.
16
+ *
17
+ * Bounds (all configurable, sensible defaults):
18
+ * - `initialDelayMs` (X): the first inter-attempt delay.
19
+ * - `maxDelayMs` (Y): the cap the exponentially-growing delay never exceeds.
20
+ * - `maxTotalMs` (Z): the wall-clock budget; once the NEXT delay would push the
21
+ * cumulative sleep past this, we stop retrying (a clean bounded give-up).
22
+ * - `maxAttempts`: a hard upper bound on attempts (a belt-and-braces cap so a
23
+ * tiny/zero delay budget still terminates).
24
+ *
25
+ * The SLEEP is INJECTABLE (reusing the `sleep?: (ms) => Promise<void>` /
26
+ * `realSleep` seam `src/run.ts` already uses for the inter-tick sleep) so tests
27
+ * drive the whole retry TIMELINE deterministically with NO real wall-clock waits.
28
+ *
29
+ * Model-endpoint retries are NOT this helper's job — the pi harness retries its
30
+ * own API. This is git/provider network resilience only.
31
+ */
32
+
33
+ /** A sleep seam: resolve after `ms`. The real one is `setTimeout`-backed. */
34
+ export type Sleep = (ms: number) => Promise<void>;
35
+
36
+ /** The default real sleep (a `setTimeout`-backed promise). */
37
+ export const realSleep: Sleep = (ms: number): Promise<void> =>
38
+ new Promise((resolve) => setTimeout(resolve, ms));
39
+
40
+ /** Bounds for {@link retryWithBackoff}. All optional; defaults below. */
41
+ export interface BackoffOptions {
42
+ /** First inter-attempt delay (ms). Default {@link DEFAULT_BACKOFF}.initialDelayMs. */
43
+ initialDelayMs?: number;
44
+ /** Exponential-growth cap (ms). Default {@link DEFAULT_BACKOFF}.maxDelayMs. */
45
+ maxDelayMs?: number;
46
+ /** Total wall-clock budget for delays (ms). Default {@link DEFAULT_BACKOFF}.maxTotalMs. */
47
+ maxTotalMs?: number;
48
+ /** Hard attempt cap. Default {@link DEFAULT_BACKOFF}.maxAttempts. */
49
+ maxAttempts?: number;
50
+ /** Injected sleep (tests). Default {@link realSleep}. */
51
+ sleep?: Sleep;
52
+ }
53
+
54
+ /**
55
+ * The default bounds: a short first delay growing exponentially to a modest cap,
56
+ * with a small total budget — enough to ride out a blip, NOT a hang. A clean
57
+ * bounded give-up into the local-only degraded state beats waiting forever;
58
+ * CI/humans then retry deliberately.
59
+ */
60
+ export const DEFAULT_BACKOFF: Required<Omit<BackoffOptions, 'sleep'>> = {
61
+ initialDelayMs: 500,
62
+ maxDelayMs: 8_000,
63
+ maxTotalMs: 30_000,
64
+ maxAttempts: 6,
65
+ };
66
+
67
+ /** Outcome of {@link retryWithBackoff}: the op's value, or a clean give-up. */
68
+ export type RetryResult<T> =
69
+ | {ok: true; value: T; attempts: number}
70
+ | {ok: false; attempts: number; lastError?: string};
71
+
72
+ /**
73
+ * Run `op` and, if it reports failure, RETRY it with bounded exponential backoff
74
+ * until it succeeds or the bounds are exhausted (then a clean give-up — NEVER an
75
+ * indefinite loop). `op` reports failure in EITHER of two ways, both treated the
76
+ * same so callers can use whichever fits the underlying API:
77
+ *
78
+ * - it RETURNS `{ok: false, error?}` (e.g. a git `RunResult` mapped to a
79
+ * boolean — a non-zero exit is a failure, not a throw), OR
80
+ * - it THROWS (e.g. a git plumbing helper's hard-fetch against an unreachable
81
+ * remote) — the throw is CAUGHT here and treated as a failed attempt.
82
+ *
83
+ * On success it returns `{ok: true, value}`. On exhaustion it returns
84
+ * `{ok: false, lastError}` — it NEVER throws out (the route must not crash on a
85
+ * git outage). The delay schedule is `initialDelayMs`, doubling each attempt up
86
+ * to `maxDelayMs`, stopping once another attempt's delay would exceed the
87
+ * `maxTotalMs` budget or `maxAttempts` is reached.
88
+ */
89
+ export async function retryWithBackoff<T>(
90
+ op: () => Promise<{ok: true; value: T} | {ok: false; error?: string}>,
91
+ options: BackoffOptions = {},
92
+ ): Promise<RetryResult<T>> {
93
+ const initialDelayMs =
94
+ options.initialDelayMs ?? DEFAULT_BACKOFF.initialDelayMs;
95
+ const maxDelayMs = options.maxDelayMs ?? DEFAULT_BACKOFF.maxDelayMs;
96
+ const maxTotalMs = options.maxTotalMs ?? DEFAULT_BACKOFF.maxTotalMs;
97
+ const maxAttempts = options.maxAttempts ?? DEFAULT_BACKOFF.maxAttempts;
98
+ const sleep = options.sleep ?? realSleep;
99
+
100
+ let attempts = 0;
101
+ let elapsed = 0;
102
+ let delay = initialDelayMs;
103
+ let lastError: string | undefined;
104
+
105
+ // eslint-disable-next-line no-constant-condition
106
+ while (true) {
107
+ attempts++;
108
+ try {
109
+ const r = await op();
110
+ if (r.ok) {
111
+ return {ok: true, value: r.value, attempts};
112
+ }
113
+ lastError = r.error;
114
+ } catch (err) {
115
+ lastError = err instanceof Error ? err.message : String(err);
116
+ }
117
+
118
+ // Decide whether ANOTHER attempt is allowed (bounded give-up, not a hang).
119
+ if (attempts >= maxAttempts) {
120
+ return {ok: false, attempts, lastError};
121
+ }
122
+ if (elapsed + delay > maxTotalMs) {
123
+ return {ok: false, attempts, lastError};
124
+ }
125
+
126
+ await sleep(delay);
127
+ elapsed += delay;
128
+ delay = Math.min(delay * 2, maxDelayMs);
129
+ }
130
+ }