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 @@
1
+ {"version":3,"file":"repo-key.d.ts","sourceRoot":"","sources":["../src/repo-key.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGjD"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * The arbiter-URL → **hub key** encoder, extracted from `repo-mirror.ts` so it
3
+ * is importable WITHOUT pulling in the rest of the hub-mirror plumbing (which
4
+ * itself depends on `repo-config.ts`). The split exists for ONE reason: the
5
+ * per-machine `config.override.json` layer (resolved in `repo-config.ts`)
6
+ * needs the hub key to look up the per-repo override bucket — but
7
+ * `repo-config.ts` cannot import from `repo-mirror.ts` without a cycle. The
8
+ * key encoder is pure (URL → string) and has no business depending on the
9
+ * mirror or the per-repo config, so it lives here. `repo-mirror.ts` re-exports
10
+ * {@link encodeRepoKey} so existing callers see no change.
11
+ */
12
+ /**
13
+ * Deterministically encode an arbiter remote URL into a hierarchical hub key:
14
+ * drop the scheme / user / `.git` suffix, then replace `.` → `-` **per path
15
+ * segment** (lossless and reversible; avoids the dotted-segment hazard that
16
+ * trips editors / tools and our own dotdir-pruning). E.g.
17
+ * `git@github.com:wighawag/dorfl.git` → `github-com/wighawag/dorfl`.
18
+ */
19
+ export function encodeRepoKey(url) {
20
+ const segments = urlSegments(url);
21
+ return segments.map(dashDots).join('/');
22
+ }
23
+ /**
24
+ * Split a remote URL into its host + path segments (lossy only of scheme/user/
25
+ * port/`.git`, which carry no identity for keying). Handles the four shapes the
26
+ * arbiter can take: scp-like ssh (`git@host:org/repo.git`), `ssh://`, `https://`
27
+ * / `http://`, `file://`, and a plain local filesystem path to a bare repo.
28
+ */
29
+ function urlSegments(url) {
30
+ const trimmed = url.trim();
31
+ // scp-like ssh: [user@]host:path (no `://`, has a `:` before the path).
32
+ const scp = /^(?:[^@/]+@)?([^/:]+):(.+)$/;
33
+ if (!trimmed.includes('://')) {
34
+ const m = scp.exec(trimmed);
35
+ if (m && !trimmed.startsWith('/')) {
36
+ return [m[1], ...pathSegments(m[2])];
37
+ }
38
+ // Otherwise a plain local path (e.g. `/srv/git/org/repo.git`).
39
+ return pathSegments(trimmed);
40
+ }
41
+ // scheme://[user@]host[:port]/path — or file:///abs/path (empty host).
42
+ const schemeEnd = trimmed.indexOf('://');
43
+ const rest = trimmed.slice(schemeEnd + 3);
44
+ const slash = rest.indexOf('/');
45
+ const authority = slash === -1 ? rest : rest.slice(0, slash);
46
+ const path = slash === -1 ? '' : rest.slice(slash + 1);
47
+ const host = stripUserAndPort(authority);
48
+ const hostSegments = host === '' ? [] : [host];
49
+ return [...hostSegments, ...pathSegments(path)];
50
+ }
51
+ /** Drop `user@` and `:port` from an authority, leaving the bare host. */
52
+ function stripUserAndPort(authority) {
53
+ const afterUser = authority.includes('@')
54
+ ? authority.slice(authority.lastIndexOf('@') + 1)
55
+ : authority;
56
+ const colon = afterUser.indexOf(':');
57
+ return colon === -1 ? afterUser : afterUser.slice(0, colon);
58
+ }
59
+ /** Split a `/`-path into non-empty segments, dropping a trailing `.git`. */
60
+ function pathSegments(path) {
61
+ const noGit = path.replace(/\.git\/?$/, '');
62
+ return noGit.split('/').filter((s) => s.length > 0);
63
+ }
64
+ /** Replace every `.` with `-` within a single segment (per-segment, lossless). */
65
+ function dashDots(segment) {
66
+ return segment.replace(/\./g, '-');
67
+ }
68
+ //# sourceMappingURL=repo-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo-key.js","sourceRoot":"","sources":["../src/repo-key.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,177 @@
1
+ import type { Config, PartialConfig } from './config.js';
2
+ import type { ConfigOverrideMap } from './config-override.js';
3
+ export { encodeRepoKey } from './repo-key.js';
4
+ /**
5
+ * Read a bare hub mirror's `origin` URL (`git -C <mirror> remote get-url
6
+ * origin`). Returns the trimmed URL, or `undefined` when the mirror has no
7
+ * `origin` or the read fails (a malformed mirror). The single helper both the
8
+ * registry enumeration (`remote ls`) and the per-machine override layer (the
9
+ * hub-key lookup in {@link resolveRepoConfigFromMirror}) use; defining it here
10
+ * avoids duplicating the `git remote get-url origin` call across modules.
11
+ */
12
+ export declare function readOriginUrl(mirrorDir: string, env: NodeJS.ProcessEnv | undefined): string | undefined;
13
+ /**
14
+ * The shared **hub-mirror primitive**: one bare mirror per repo under
15
+ * `<workspacesDir>/repos/<key>.git`, re-fetched from the arbiter. Both the
16
+ * autonomous job runner (`agent-workspaces`) and the human `work-on` build on
17
+ * it: a job worktree and a human worktree are both cut from the mirror's
18
+ * freshly-fetched `main`, so they always branch off the latest arbiter main
19
+ * (ADR §2).
20
+ *
21
+ * This module does NOT create worktrees, claim, or run anything — it only
22
+ * locates / creates / fetches the mirror. It is STATE, not cache (ADR §3): it
23
+ * lives under `~/.dorfl/` (config `workspacesDir`), never `~/.cache`.
24
+ */
25
+ /**
26
+ * The on-disk location of the bare hub mirror for `url`:
27
+ * `<workspacesDir>/repos/<key>.git`. Lives under `workspacesDir` (default
28
+ * `~/.dorfl`), never `~/.cache` (ADR §3).
29
+ */
30
+ export declare function mirrorPath(workspacesDir: string, url: string): string;
31
+ export interface EnsureMirrorOptions {
32
+ /**
33
+ * The arbiter remote URL to mirror. Either `url` OR (`fromRepo` + `arbiter`)
34
+ * must be given; if both, `url` wins.
35
+ */
36
+ url?: string;
37
+ /** A working repo to resolve the remote URL from (with `arbiter`). */
38
+ fromRepo?: string;
39
+ /** Remote name in `fromRepo` whose URL to mirror (default `origin`). */
40
+ arbiter?: string;
41
+ /** The execution working area (config `workspacesDir`, default `~/.dorfl`). */
42
+ workspacesDir: string;
43
+ env?: NodeJS.ProcessEnv;
44
+ }
45
+ export interface EnsureMirrorResult {
46
+ /** Absolute path to the bare mirror. */
47
+ path: string;
48
+ /** The resolved arbiter URL the mirror tracks. */
49
+ url: string;
50
+ /** True iff the mirror did not exist and was just created. */
51
+ created: boolean;
52
+ /** True iff an existing mirror was fetched (not created). */
53
+ fetched: boolean;
54
+ /** The mirror's freshly-fetched `main` tip (40-hex sha). */
55
+ mainSha: string;
56
+ }
57
+ /**
58
+ * Locate the bare hub mirror for the arbiter; create it (`git clone --bare`) if
59
+ * absent, or `git fetch` it if present. Idempotent: a second call fetches and
60
+ * reuses the same mirror (it never re-clones, so any local mirror state — e.g.
61
+ * other branches/objects — survives). Returns the mirror path and its
62
+ * freshly-fetched `main`, so callers (job worktrees, human worktrees) always
63
+ * branch off the latest arbiter main.
64
+ */
65
+ export declare function ensureMirror(options: EnsureMirrorOptions): EnsureMirrorResult;
66
+ /**
67
+ * Locate the bare hub mirror for the arbiter and refresh ONLY its `main`,
68
+ * WITHOUT the all-heads `--prune` fetch {@link ensureMirror} does. Clones the
69
+ * mirror (`git clone --bare`) if absent — a fresh clone has no local worktrees,
70
+ * so the all-heads clone refspec cannot collide with any checked-out branch —
71
+ * but on REUSE refreshes via {@link fetchMirrorMain} (main-only, no-prune).
72
+ *
73
+ * This is the MIRROR-ENSURE for the no-checkout CONFIG READ (`do --remote`/
74
+ * `do --isolated` per-repo `.dorfl.json`): `git show main:.dorfl.json`
75
+ * only needs `main`, and using the pruning all-heads fetch here would let a
76
+ * `work/<slug>` branch CHECKED OUT in some other (stale) job worktree block the
77
+ * fetch (`git refuses to fetch into branch … checked out`), throwing the config
78
+ * read into its global+default fallback. Narrowing the config-read fetch to
79
+ * main-only (no-prune) means a checked-out worktree branch can NEVER block it
80
+ * (the read-path `scan`/`status`/mirror-pool-scan already use main-only fetches
81
+ * for exactly this reason — ADR §6).
82
+ *
83
+ * Does NOT replace {@link ensureMirror}: the build's worktree MATERIALISATION
84
+ * still legitimately needs the all-heads fetch (continue-detection wants the
85
+ * kept `work/<slug>` head as a local mirror ref). This is only for the read.
86
+ */
87
+ export declare function ensureMirrorMain(options: EnsureMirrorOptions): EnsureMirrorResult;
88
+ /**
89
+ * Fetch ONLY `main` from the arbiter into an existing bare mirror, WITHOUT
90
+ * `--prune`. Use this when the mirror also holds LOCAL-ONLY branches that must
91
+ * survive (e.g. the `work/<slug>` branches of live worktrees): the full
92
+ * mirror-style `+refs/heads/*:refs/heads/*` fetch in {@link ensureMirror} prunes
93
+ * any local head absent on the arbiter, which would delete (and corrupt) a
94
+ * checked-out `work/<slug>` worktree branch. This refreshes `main` to the latest
95
+ * arbiter tip while leaving every other local ref untouched. Returns the fresh
96
+ * `main` tip.
97
+ */
98
+ export declare function fetchMirrorMain(mirrorDir: string, env?: NodeJS.ProcessEnv): string;
99
+ /**
100
+ * Read the target repo's COMMITTED `.dorfl.json` from the bare hub
101
+ * mirror's `main` (`git show main:.dorfl.json`) — the per-repo config
102
+ * layer for the NO-CHECKOUT paths (`do --remote`). The committed file is a
103
+ * tracked file on `<arbiter>/main`, so it is reachable from the mirror without a
104
+ * worktree. Returns the raw file CONTENT, or `undefined` when the repo has no
105
+ * `.dorfl.json` on `main` (a config-less repo — the caller then resolves to
106
+ * exactly global + default, byte-identical to before this layer existed).
107
+ *
108
+ * This is the task's ONE genuinely-new seam: sourcing the bytes from the arbiter
109
+ * instead of the cwd. The parse / allow-reject filtering stays in
110
+ * {@link loadRepoConfigFromContent} (the existing per-repo machinery), so the
111
+ * host-only key rejection is identical however the bytes were sourced.
112
+ *
113
+ * A `git show` failure that is NOT "path missing on main" (a corrupt mirror, an
114
+ * absent `main`) is propagated — it is a genuine plumbing fault, not a
115
+ * config-less repo. The missing-path case (`git show` exit ≠ 0 naming the path)
116
+ * is read as `undefined` (no file = no per-repo layer).
117
+ */
118
+ export declare function readRepoConfigFromMirrorMain(mirrorDir: string, env?: NodeJS.ProcessEnv): string | undefined;
119
+ /**
120
+ * Resolve a repo's effective {@link Config} for a NO-CHECKOUT path by layering its
121
+ * COMMITTED `.dorfl.json` (read from the bare hub mirror's `main` via
122
+ * {@link readRepoConfigFromMirrorMain}) into the SAME
123
+ * `flag > env > per-repo > global > default` chain a working checkout uses
124
+ * ({@link resolveRepoConfigFromLoaded}). This is the reusable core of `do
125
+ * --remote`'s inline per-repo resolution (`resolveRemoteRepoConfig` in `cli.ts`):
126
+ * the mirror is assumed ALREADY ensured + fetched by the caller (the read paths
127
+ * fetch-first), so this only READS its `main` config and layers it.
128
+ *
129
+ * Resilient: a config-less repo (no file on `main`) resolves to exactly
130
+ * global + flags (byte-identical to the no-per-repo behaviour). A genuine
131
+ * read fault is propagated by {@link readRepoConfigFromMirrorMain}; a caller that
132
+ * must never block on a fault (a read-only scan) catches + falls back to
133
+ * global + flags itself.
134
+ */
135
+ export declare function resolveRepoConfigFromMirror(options: {
136
+ /** The bare hub mirror directory whose `main:.dorfl.json` to read. */
137
+ mirrorPath: string;
138
+ /** The global + default config layer (from `loadConfig`/`mergeConfig`). */
139
+ global: Config;
140
+ /** Optional flag overrides (highest precedence). */
141
+ flags?: PartialConfig;
142
+ env?: NodeJS.ProcessEnv;
143
+ /**
144
+ * The per-machine override map (from `loadConfigOverride`), inserted between
145
+ * the committed per-repo file and env in the precedence chain. The hub key is
146
+ * derived from the mirror's own `origin` URL (via {@link readOriginUrl}); if
147
+ * unresolvable, the hub-key bucket is skipped and only the `"*"` bucket
148
+ * applies. Default: empty map (no override applied) — byte-identical to the
149
+ * pre-override behaviour.
150
+ */
151
+ override?: ConfigOverrideMap;
152
+ }): Config;
153
+ /** The bare mirror's `main` tip (40-hex sha), as freshly fetched. */
154
+ export declare function mirrorMainSha(mirrorDir: string, env?: NodeJS.ProcessEnv): string;
155
+ /**
156
+ * Fetch-first for the READ paths (`scan`/`status`, ADR
157
+ * `command-surface-and-journeys` §5/§6): refresh a registered mirror's `main`
158
+ * before reading its `work/` tree, so the read sees the remote truth (the
159
+ * registry model makes the remote the source of truth). It is a thin wrapper
160
+ * over {@link fetchMirrorMain} (the load-bearing main-only, no-prune fetch — it
161
+ * must NOT be the pruning `ensureMirror` fetch, which would delete live
162
+ * worktrees' `work/<slug>` branches, ADR §6).
163
+ *
164
+ * **Never errors out: warn + fall back to last-known.** A failed fetch (offline,
165
+ * a vanished origin, a dead arbiter) is NOT fatal for a read — `scan`/`status`
166
+ * must still report from the mirror's last-known `main`. On failure it routes a
167
+ * human-readable note through `warn` and returns `false`; on success it returns
168
+ * `true`. The freshness of the read then reflects the last SUCCESSFUL fetch.
169
+ */
170
+ export declare function fetchMirrorMainOrWarn(options: {
171
+ /** The bare hub mirror directory whose `main` to refresh. */
172
+ mirrorPath: string;
173
+ /** Sink for the fall-back warning when the fetch fails. */
174
+ warn?: (message: string) => void;
175
+ env?: NodeJS.ProcessEnv;
176
+ }): boolean;
177
+ //# sourceMappingURL=repo-mirror.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo-mirror.d.ts","sourceRoot":"","sources":["../src/repo-mirror.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,MAAM,EAAE,aAAa,EAAC,MAAM,aAAa,CAAC;AACvD,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,sBAAsB,CAAC;AAS5D,OAAO,EAAC,aAAa,EAAC,MAAM,eAAe,CAAC;AAE5C;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC5B,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,SAAS,GAChC,MAAM,GAAG,SAAS,CAOpB;AAED;;;;;;;;;;;GAWG;AAEH;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAErE;AAED,MAAM,WAAW,mBAAmB;IACnC;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+EAA+E;IAC/E,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IAClC,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,GAAG,EAAE,MAAM,CAAC;IACZ,8DAA8D;IAC9D,OAAO,EAAE,OAAO,CAAC;IACjB,6DAA6D;IAC7D,OAAO,EAAE,OAAO,CAAC;IACjB,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,kBAAkB,CAiD7E;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,gBAAgB,CAC/B,OAAO,EAAE,mBAAmB,GAC1B,kBAAkB,CAqBpB;AAkBD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC9B,SAAS,EAAE,MAAM,EACjB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GACrB,MAAM,CAKR;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,4BAA4B,CAC3C,SAAS,EAAE,MAAM,EACjB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GACrB,MAAM,GAAG,SAAS,CAqBpB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE;IACpD,sEAAsE;IACtE,UAAU,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC7B,GAAG,MAAM,CAmBT;AAED,qEAAqE;AACrE,wBAAgB,aAAa,CAC5B,SAAS,EAAE,MAAM,EACjB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GACrB,MAAM,CAER;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE;IAC9C,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACxB,GAAG,OAAO,CAYV"}
@@ -0,0 +1,271 @@
1
+ import { existsSync, mkdirSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ import { git, run } from './git.js';
4
+ import { REPO_CONFIG_FILENAME, loadRepoConfigFromContent, resolveRepoConfigFromLoaded, } from './repo-config.js';
5
+ import { encodeRepoKey } from './repo-key.js';
6
+ export { encodeRepoKey } from './repo-key.js';
7
+ /**
8
+ * Read a bare hub mirror's `origin` URL (`git -C <mirror> remote get-url
9
+ * origin`). Returns the trimmed URL, or `undefined` when the mirror has no
10
+ * `origin` or the read fails (a malformed mirror). The single helper both the
11
+ * registry enumeration (`remote ls`) and the per-machine override layer (the
12
+ * hub-key lookup in {@link resolveRepoConfigFromMirror}) use; defining it here
13
+ * avoids duplicating the `git remote get-url origin` call across modules.
14
+ */
15
+ export function readOriginUrl(mirrorDir, env) {
16
+ const result = run('git', ['remote', 'get-url', 'origin'], mirrorDir, { env });
17
+ if (result.status !== 0) {
18
+ return undefined;
19
+ }
20
+ const url = result.stdout.trim();
21
+ return url === '' ? undefined : url;
22
+ }
23
+ /**
24
+ * The shared **hub-mirror primitive**: one bare mirror per repo under
25
+ * `<workspacesDir>/repos/<key>.git`, re-fetched from the arbiter. Both the
26
+ * autonomous job runner (`agent-workspaces`) and the human `work-on` build on
27
+ * it: a job worktree and a human worktree are both cut from the mirror's
28
+ * freshly-fetched `main`, so they always branch off the latest arbiter main
29
+ * (ADR §2).
30
+ *
31
+ * This module does NOT create worktrees, claim, or run anything — it only
32
+ * locates / creates / fetches the mirror. It is STATE, not cache (ADR §3): it
33
+ * lives under `~/.dorfl/` (config `workspacesDir`), never `~/.cache`.
34
+ */
35
+ /**
36
+ * The on-disk location of the bare hub mirror for `url`:
37
+ * `<workspacesDir>/repos/<key>.git`. Lives under `workspacesDir` (default
38
+ * `~/.dorfl`), never `~/.cache` (ADR §3).
39
+ */
40
+ export function mirrorPath(workspacesDir, url) {
41
+ return join(workspacesDir, 'repos', `${encodeRepoKey(url)}.git`);
42
+ }
43
+ /**
44
+ * Locate the bare hub mirror for the arbiter; create it (`git clone --bare`) if
45
+ * absent, or `git fetch` it if present. Idempotent: a second call fetches and
46
+ * reuses the same mirror (it never re-clones, so any local mirror state — e.g.
47
+ * other branches/objects — survives). Returns the mirror path and its
48
+ * freshly-fetched `main`, so callers (job worktrees, human worktrees) always
49
+ * branch off the latest arbiter main.
50
+ */
51
+ export function ensureMirror(options) {
52
+ const env = options.env;
53
+ const url = resolveUrl(options);
54
+ const path = mirrorPath(options.workspacesDir, url);
55
+ let created = false;
56
+ let fetched = false;
57
+ if (existsSync(path)) {
58
+ // Reuse: fetch the latest from the arbiter into the existing bare mirror.
59
+ //
60
+ // `main` is the authoritative base every worktree branches off — fetch it
61
+ // HARD (prune), and it can never collide with a checked-out branch (`main` is
62
+ // never a job worktree branch).
63
+ git(['fetch', '--prune', 'origin', '+refs/heads/main:refs/heads/main'], path, {
64
+ env,
65
+ });
66
+ // SHARED-MIRROR SIBLING-WORKTREE SAFETY (task
67
+ // `cutover-claim-body-stays-and-complete-sources-from-backlog`): two SAME-repo
68
+ // `run` jobs share ONE bare mirror, and each `git worktree add`s its own LOCAL
69
+ // `work/<slug>` head. The remaining all-heads fetch (which brings down each
70
+ // arbiter `work/<slug>` so continue-detection can read it as a local head) tries
71
+ // to UPDATE every such head; git REFUSES to fetch into a SIBLING's `work/<slug>`
72
+ // head while that sibling worktree has it checked out (`fatal: refusing to fetch
73
+ // into branch ... checked out`) and exits non-zero — EVEN THOUGH it still updated
74
+ // every OTHER ref (incl. main, above, and THIS job's own `work/<slug>`). Before
75
+ // this task the claim's body-move serialised the jobs enough to hide the
76
+ // overlap; with claim no longer writing `main` the jobs run concurrently and it
77
+ // surfaces. So this all-heads fetch is BEST-EFFORT (soft): a sibling's
78
+ // checked-out head being refused must NOT fail the whole ensure — the refs we
79
+ // need (main + this job's own head) are already updated, and continue-detection
80
+ // is arbiter-authoritative (`ls-remote` in `createJob`) anyway. A genuinely
81
+ // unrelated failure (e.g. an unreachable arbiter) ALSO degrades to best-effort
82
+ // here, but `main` (the hard fetch above) already succeeded, so the worktree
83
+ // materialisation has its base; the per-branch onboard reads still fail loudly
84
+ // downstream if a needed ref is genuinely absent.
85
+ run('git', ['fetch', 'origin', '+refs/heads/*:refs/heads/*'], path, { env });
86
+ fetched = true;
87
+ }
88
+ else {
89
+ // First time: a bare mirror clone (shared object store, cheap).
90
+ mkdirSync(dirname(path), { recursive: true });
91
+ git(['clone', '--quiet', '--bare', url, path], dirname(path), { env });
92
+ created = true;
93
+ }
94
+ return { path, url, created, fetched, mainSha: mirrorMainSha(path, env) };
95
+ }
96
+ /**
97
+ * Locate the bare hub mirror for the arbiter and refresh ONLY its `main`,
98
+ * WITHOUT the all-heads `--prune` fetch {@link ensureMirror} does. Clones the
99
+ * mirror (`git clone --bare`) if absent — a fresh clone has no local worktrees,
100
+ * so the all-heads clone refspec cannot collide with any checked-out branch —
101
+ * but on REUSE refreshes via {@link fetchMirrorMain} (main-only, no-prune).
102
+ *
103
+ * This is the MIRROR-ENSURE for the no-checkout CONFIG READ (`do --remote`/
104
+ * `do --isolated` per-repo `.dorfl.json`): `git show main:.dorfl.json`
105
+ * only needs `main`, and using the pruning all-heads fetch here would let a
106
+ * `work/<slug>` branch CHECKED OUT in some other (stale) job worktree block the
107
+ * fetch (`git refuses to fetch into branch … checked out`), throwing the config
108
+ * read into its global+default fallback. Narrowing the config-read fetch to
109
+ * main-only (no-prune) means a checked-out worktree branch can NEVER block it
110
+ * (the read-path `scan`/`status`/mirror-pool-scan already use main-only fetches
111
+ * for exactly this reason — ADR §6).
112
+ *
113
+ * Does NOT replace {@link ensureMirror}: the build's worktree MATERIALISATION
114
+ * still legitimately needs the all-heads fetch (continue-detection wants the
115
+ * kept `work/<slug>` head as a local mirror ref). This is only for the read.
116
+ */
117
+ export function ensureMirrorMain(options) {
118
+ const env = options.env;
119
+ const url = resolveUrl(options);
120
+ const path = mirrorPath(options.workspacesDir, url);
121
+ let created = false;
122
+ let fetched = false;
123
+ if (existsSync(path)) {
124
+ // Reuse: refresh ONLY `main`, no-prune, so a `work/<slug>` branch checked
125
+ // out in some other worktree can never block this fetch.
126
+ fetchMirrorMain(path, env);
127
+ fetched = true;
128
+ }
129
+ else {
130
+ // First time: a bare mirror clone (no local worktrees yet, so the clone's
131
+ // own refspec can collide with nothing).
132
+ mkdirSync(dirname(path), { recursive: true });
133
+ git(['clone', '--quiet', '--bare', url, path], dirname(path), { env });
134
+ created = true;
135
+ }
136
+ return { path, url, created, fetched, mainSha: mirrorMainSha(path, env) };
137
+ }
138
+ /** Resolve the arbiter URL from `url`, or from `fromRepo` + `arbiter` remote. */
139
+ function resolveUrl(options) {
140
+ if (options.url && options.url.trim() !== '') {
141
+ return options.url.trim();
142
+ }
143
+ if (options.fromRepo) {
144
+ const remote = options.arbiter ?? 'origin';
145
+ return git(['remote', 'get-url', remote], options.fromRepo, {
146
+ env: options.env,
147
+ }).trim();
148
+ }
149
+ throw new Error('ensureMirror requires either `url` or `fromRepo` (with `arbiter`).');
150
+ }
151
+ /**
152
+ * Fetch ONLY `main` from the arbiter into an existing bare mirror, WITHOUT
153
+ * `--prune`. Use this when the mirror also holds LOCAL-ONLY branches that must
154
+ * survive (e.g. the `work/<slug>` branches of live worktrees): the full
155
+ * mirror-style `+refs/heads/*:refs/heads/*` fetch in {@link ensureMirror} prunes
156
+ * any local head absent on the arbiter, which would delete (and corrupt) a
157
+ * checked-out `work/<slug>` worktree branch. This refreshes `main` to the latest
158
+ * arbiter tip while leaving every other local ref untouched. Returns the fresh
159
+ * `main` tip.
160
+ */
161
+ export function fetchMirrorMain(mirrorDir, env) {
162
+ git(['fetch', 'origin', '+refs/heads/main:refs/heads/main'], mirrorDir, {
163
+ env,
164
+ });
165
+ return mirrorMainSha(mirrorDir, env);
166
+ }
167
+ /**
168
+ * Read the target repo's COMMITTED `.dorfl.json` from the bare hub
169
+ * mirror's `main` (`git show main:.dorfl.json`) — the per-repo config
170
+ * layer for the NO-CHECKOUT paths (`do --remote`). The committed file is a
171
+ * tracked file on `<arbiter>/main`, so it is reachable from the mirror without a
172
+ * worktree. Returns the raw file CONTENT, or `undefined` when the repo has no
173
+ * `.dorfl.json` on `main` (a config-less repo — the caller then resolves to
174
+ * exactly global + default, byte-identical to before this layer existed).
175
+ *
176
+ * This is the task's ONE genuinely-new seam: sourcing the bytes from the arbiter
177
+ * instead of the cwd. The parse / allow-reject filtering stays in
178
+ * {@link loadRepoConfigFromContent} (the existing per-repo machinery), so the
179
+ * host-only key rejection is identical however the bytes were sourced.
180
+ *
181
+ * A `git show` failure that is NOT "path missing on main" (a corrupt mirror, an
182
+ * absent `main`) is propagated — it is a genuine plumbing fault, not a
183
+ * config-less repo. The missing-path case (`git show` exit ≠ 0 naming the path)
184
+ * is read as `undefined` (no file = no per-repo layer).
185
+ */
186
+ export function readRepoConfigFromMirrorMain(mirrorDir, env) {
187
+ const spec = `main:${REPO_CONFIG_FILENAME}`;
188
+ const res = run('git', ['show', spec], mirrorDir, { env });
189
+ if (res.status === 0) {
190
+ return res.stdout;
191
+ }
192
+ // `git show main:<path>` exits non-zero both when the PATH is absent on main
193
+ // (the config-less repo — expected, → undefined) and when `main`/the object is
194
+ // unresolvable (a genuine fault — propagate). git words the former as
195
+ // "...does not exist in 'main'" / "exists on disk, but not in" / "path ...
196
+ // does not exist"; the latter as an invalid-object/unknown-revision error.
197
+ const stderr = res.stderr;
198
+ const pathMissing = /does not exist in|exists on disk, but not in|fatal: path/i.test(stderr) ||
199
+ /did not match any file/i.test(stderr);
200
+ if (pathMissing) {
201
+ return undefined;
202
+ }
203
+ throw new Error(`git show ${spec} failed in ${mirrorDir} (exit ${res.status}): ${stderr.trim()}`);
204
+ }
205
+ /**
206
+ * Resolve a repo's effective {@link Config} for a NO-CHECKOUT path by layering its
207
+ * COMMITTED `.dorfl.json` (read from the bare hub mirror's `main` via
208
+ * {@link readRepoConfigFromMirrorMain}) into the SAME
209
+ * `flag > env > per-repo > global > default` chain a working checkout uses
210
+ * ({@link resolveRepoConfigFromLoaded}). This is the reusable core of `do
211
+ * --remote`'s inline per-repo resolution (`resolveRemoteRepoConfig` in `cli.ts`):
212
+ * the mirror is assumed ALREADY ensured + fetched by the caller (the read paths
213
+ * fetch-first), so this only READS its `main` config and layers it.
214
+ *
215
+ * Resilient: a config-less repo (no file on `main`) resolves to exactly
216
+ * global + flags (byte-identical to the no-per-repo behaviour). A genuine
217
+ * read fault is propagated by {@link readRepoConfigFromMirrorMain}; a caller that
218
+ * must never block on a fault (a read-only scan) catches + falls back to
219
+ * global + flags itself.
220
+ */
221
+ export function resolveRepoConfigFromMirror(options) {
222
+ const { mirrorPath, global, flags, env, override } = options;
223
+ const content = readRepoConfigFromMirrorMain(mirrorPath, env);
224
+ const label = `${mirrorPath}#main:${REPO_CONFIG_FILENAME}`;
225
+ const loaded = content === undefined
226
+ ? { path: label, config: {}, rejected: [] }
227
+ : loadRepoConfigFromContent(content, label);
228
+ // The hub key for the override lookup comes from the mirror's OWN `origin`
229
+ // URL (the more reliable source for a no-checkout path — the mirror is what
230
+ // the runner actually operates on). Unresolvable ⇒ hub-key lookup skipped
231
+ // (graceful degrade); the `"*"` bucket still applies.
232
+ const arbiterUrl = readOriginUrl(mirrorPath, env);
233
+ return resolveRepoConfigFromLoaded(loaded, {
234
+ global,
235
+ flags,
236
+ override,
237
+ ...(arbiterUrl !== undefined ? { arbiterUrl } : {}),
238
+ }).config;
239
+ }
240
+ /** The bare mirror's `main` tip (40-hex sha), as freshly fetched. */
241
+ export function mirrorMainSha(mirrorDir, env) {
242
+ return git(['rev-parse', 'main'], mirrorDir, { env }).trim();
243
+ }
244
+ /**
245
+ * Fetch-first for the READ paths (`scan`/`status`, ADR
246
+ * `command-surface-and-journeys` §5/§6): refresh a registered mirror's `main`
247
+ * before reading its `work/` tree, so the read sees the remote truth (the
248
+ * registry model makes the remote the source of truth). It is a thin wrapper
249
+ * over {@link fetchMirrorMain} (the load-bearing main-only, no-prune fetch — it
250
+ * must NOT be the pruning `ensureMirror` fetch, which would delete live
251
+ * worktrees' `work/<slug>` branches, ADR §6).
252
+ *
253
+ * **Never errors out: warn + fall back to last-known.** A failed fetch (offline,
254
+ * a vanished origin, a dead arbiter) is NOT fatal for a read — `scan`/`status`
255
+ * must still report from the mirror's last-known `main`. On failure it routes a
256
+ * human-readable note through `warn` and returns `false`; on success it returns
257
+ * `true`. The freshness of the read then reflects the last SUCCESSFUL fetch.
258
+ */
259
+ export function fetchMirrorMainOrWarn(options) {
260
+ try {
261
+ fetchMirrorMain(options.mirrorPath, options.env);
262
+ return true;
263
+ }
264
+ catch (err) {
265
+ const reason = err instanceof Error ? err.message : String(err);
266
+ options.warn?.(`could not fetch mirror at ${options.mirrorPath}; ` +
267
+ `reading last-known state (offline). ${reason}`);
268
+ return false;
269
+ }
270
+ }
271
+ //# sourceMappingURL=repo-mirror.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo-mirror.js","sourceRoot":"","sources":["../src/repo-mirror.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
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
+ /** A sleep seam: resolve after `ms`. The real one is `setTimeout`-backed. */
33
+ export type Sleep = (ms: number) => Promise<void>;
34
+ /** The default real sleep (a `setTimeout`-backed promise). */
35
+ export declare const realSleep: Sleep;
36
+ /** Bounds for {@link retryWithBackoff}. All optional; defaults below. */
37
+ export interface BackoffOptions {
38
+ /** First inter-attempt delay (ms). Default {@link DEFAULT_BACKOFF}.initialDelayMs. */
39
+ initialDelayMs?: number;
40
+ /** Exponential-growth cap (ms). Default {@link DEFAULT_BACKOFF}.maxDelayMs. */
41
+ maxDelayMs?: number;
42
+ /** Total wall-clock budget for delays (ms). Default {@link DEFAULT_BACKOFF}.maxTotalMs. */
43
+ maxTotalMs?: number;
44
+ /** Hard attempt cap. Default {@link DEFAULT_BACKOFF}.maxAttempts. */
45
+ maxAttempts?: number;
46
+ /** Injected sleep (tests). Default {@link realSleep}. */
47
+ sleep?: Sleep;
48
+ }
49
+ /**
50
+ * The default bounds: a short first delay growing exponentially to a modest cap,
51
+ * with a small total budget — enough to ride out a blip, NOT a hang. A clean
52
+ * bounded give-up into the local-only degraded state beats waiting forever;
53
+ * CI/humans then retry deliberately.
54
+ */
55
+ export declare const DEFAULT_BACKOFF: Required<Omit<BackoffOptions, 'sleep'>>;
56
+ /** Outcome of {@link retryWithBackoff}: the op's value, or a clean give-up. */
57
+ export type RetryResult<T> = {
58
+ ok: true;
59
+ value: T;
60
+ attempts: number;
61
+ } | {
62
+ ok: false;
63
+ attempts: number;
64
+ lastError?: string;
65
+ };
66
+ /**
67
+ * Run `op` and, if it reports failure, RETRY it with bounded exponential backoff
68
+ * until it succeeds or the bounds are exhausted (then a clean give-up — NEVER an
69
+ * indefinite loop). `op` reports failure in EITHER of two ways, both treated the
70
+ * same so callers can use whichever fits the underlying API:
71
+ *
72
+ * - it RETURNS `{ok: false, error?}` (e.g. a git `RunResult` mapped to a
73
+ * boolean — a non-zero exit is a failure, not a throw), OR
74
+ * - it THROWS (e.g. a git plumbing helper's hard-fetch against an unreachable
75
+ * remote) — the throw is CAUGHT here and treated as a failed attempt.
76
+ *
77
+ * On success it returns `{ok: true, value}`. On exhaustion it returns
78
+ * `{ok: false, lastError}` — it NEVER throws out (the route must not crash on a
79
+ * git outage). The delay schedule is `initialDelayMs`, doubling each attempt up
80
+ * to `maxDelayMs`, stopping once another attempt's delay would exceed the
81
+ * `maxTotalMs` budget or `maxAttempts` is reached.
82
+ */
83
+ export declare function retryWithBackoff<T>(op: () => Promise<{
84
+ ok: true;
85
+ value: T;
86
+ } | {
87
+ ok: false;
88
+ error?: string;
89
+ }>, options?: BackoffOptions): Promise<RetryResult<T>>;
90
+ //# sourceMappingURL=retry-backoff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry-backoff.d.ts","sourceRoot":"","sources":["../src/retry-backoff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,6EAA6E;AAC7E,MAAM,MAAM,KAAK,GAAG,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAElD,8DAA8D;AAC9D,eAAO,MAAM,SAAS,EAAE,KAC0B,CAAC;AAEnD,yEAAyE;AACzE,MAAM,WAAW,cAAc;IAC9B,sFAAsF;IACtF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2FAA2F;IAC3F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,KAAK,CAAC,EAAE,KAAK,CAAC;CACd;AAED;;;;;GAKG;AACH,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,CAKnE,CAAC;AAEF,+EAA+E;AAC/E,MAAM,MAAM,WAAW,CAAC,CAAC,IACtB;IAAC,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAC,GACtC;IAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAC,CAAC;AAErD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EACvC,EAAE,EAAE,MAAM,OAAO,CAAC;IAAC,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAC,GAAG;IAAC,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAC,CAAC,EACrE,OAAO,GAAE,cAAmB,GAC1B,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAsCzB"}