dorfl 0.14.2 → 0.15.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 (418) hide show
  1. package/dist/advance-ci-template.d.ts +17 -16
  2. package/dist/advance-ci-template.d.ts.map +1 -1
  3. package/dist/advance-ci-template.js +42 -53
  4. package/dist/advance-ci-template.js.map +1 -1
  5. package/dist/advance-drivers.d.ts +8 -0
  6. package/dist/advance-drivers.d.ts.map +1 -1
  7. package/dist/advance-drivers.js +28 -4
  8. package/dist/advance-drivers.js.map +1 -1
  9. package/dist/advance-isolated.d.ts.map +1 -1
  10. package/dist/advance-isolated.js +3 -2
  11. package/dist/advance-isolated.js.map +1 -1
  12. package/dist/advance-lifecycle-template.d.ts +41 -40
  13. package/dist/advance-lifecycle-template.d.ts.map +1 -1
  14. package/dist/advance-lifecycle-template.js +309 -489
  15. package/dist/advance-lifecycle-template.js.map +1 -1
  16. package/dist/advance-loop-driver.d.ts.map +1 -1
  17. package/dist/advance-loop-driver.js +3 -2
  18. package/dist/advance-loop-driver.js.map +1 -1
  19. package/dist/advance-treeless-publish.d.ts +31 -0
  20. package/dist/advance-treeless-publish.d.ts.map +1 -1
  21. package/dist/advance-treeless-publish.js +40 -0
  22. package/dist/advance-treeless-publish.js.map +1 -1
  23. package/dist/advance.d.ts +63 -3
  24. package/dist/advance.d.ts.map +1 -1
  25. package/dist/advance.js +80 -12
  26. package/dist/advance.js.map +1 -1
  27. package/dist/advancing-lock.d.ts +9 -0
  28. package/dist/advancing-lock.d.ts.map +1 -1
  29. package/dist/advancing-lock.js +21 -1
  30. package/dist/advancing-lock.js.map +1 -1
  31. package/dist/agent-env.d.ts +61 -0
  32. package/dist/agent-env.d.ts.map +1 -0
  33. package/dist/agent-env.js +144 -0
  34. package/dist/agent-env.js.map +1 -0
  35. package/dist/agent-stop.d.ts +35 -0
  36. package/dist/agent-stop.d.ts.map +1 -1
  37. package/dist/agent-stop.js +62 -0
  38. package/dist/agent-stop.js.map +1 -1
  39. package/dist/apply-merge-action.d.ts +76 -34
  40. package/dist/apply-merge-action.d.ts.map +1 -1
  41. package/dist/apply-merge-action.js +339 -129
  42. package/dist/apply-merge-action.js.map +1 -1
  43. package/dist/apply-stuck-action.js +2 -2
  44. package/dist/apply-stuck-action.js.map +1 -1
  45. package/dist/ci-agent-result.d.ts +151 -0
  46. package/dist/ci-agent-result.d.ts.map +1 -0
  47. package/dist/ci-agent-result.js +314 -0
  48. package/dist/ci-agent-result.js.map +1 -0
  49. package/dist/ci-handoff-apply.d.ts +162 -0
  50. package/dist/ci-handoff-apply.d.ts.map +1 -0
  51. package/dist/ci-handoff-apply.js +497 -0
  52. package/dist/ci-handoff-apply.js.map +1 -0
  53. package/dist/ci-handoff-format.d.ts +369 -0
  54. package/dist/ci-handoff-format.d.ts.map +1 -0
  55. package/dist/ci-handoff-format.js +646 -0
  56. package/dist/ci-handoff-format.js.map +1 -0
  57. package/dist/ci-handoff-lfs.d.ts +146 -0
  58. package/dist/ci-handoff-lfs.d.ts.map +1 -0
  59. package/dist/ci-handoff-lfs.js +397 -0
  60. package/dist/ci-handoff-lfs.js.map +1 -0
  61. package/dist/ci-handoff.d.ts +99 -0
  62. package/dist/ci-handoff.d.ts.map +1 -0
  63. package/dist/ci-handoff.js +277 -0
  64. package/dist/ci-handoff.js.map +1 -0
  65. package/dist/ci-lock-outputs.d.ts +93 -0
  66. package/dist/ci-lock-outputs.d.ts.map +1 -0
  67. package/dist/ci-lock-outputs.js +223 -0
  68. package/dist/ci-lock-outputs.js.map +1 -0
  69. package/dist/ci-phase-build.d.ts +178 -0
  70. package/dist/ci-phase-build.d.ts.map +1 -0
  71. package/dist/ci-phase-build.js +989 -0
  72. package/dist/ci-phase-build.js.map +1 -0
  73. package/dist/ci-phase-driver.d.ts +247 -0
  74. package/dist/ci-phase-driver.d.ts.map +1 -0
  75. package/dist/ci-phase-driver.js +370 -0
  76. package/dist/ci-phase-driver.js.map +1 -0
  77. package/dist/ci-phase-intake.d.ts +172 -0
  78. package/dist/ci-phase-intake.d.ts.map +1 -0
  79. package/dist/ci-phase-intake.js +555 -0
  80. package/dist/ci-phase-intake.js.map +1 -0
  81. package/dist/ci-phase-tasking.d.ts +205 -0
  82. package/dist/ci-phase-tasking.d.ts.map +1 -0
  83. package/dist/ci-phase-tasking.js +906 -0
  84. package/dist/ci-phase-tasking.js.map +1 -0
  85. package/dist/ci-phase-treeless.d.ts +224 -0
  86. package/dist/ci-phase-treeless.d.ts.map +1 -0
  87. package/dist/ci-phase-treeless.js +1482 -0
  88. package/dist/ci-phase-treeless.js.map +1 -0
  89. package/dist/ci-read-token.d.ts +47 -0
  90. package/dist/ci-read-token.d.ts.map +1 -0
  91. package/dist/ci-read-token.js +80 -0
  92. package/dist/ci-read-token.js.map +1 -0
  93. package/dist/cli.d.ts.map +1 -1
  94. package/dist/cli.js +447 -22
  95. package/dist/cli.js.map +1 -1
  96. package/dist/close-job-template.d.ts +10 -1
  97. package/dist/close-job-template.d.ts.map +1 -1
  98. package/dist/close-job-template.js +46 -14
  99. package/dist/close-job-template.js.map +1 -1
  100. package/dist/close-job.d.ts +20 -5
  101. package/dist/close-job.d.ts.map +1 -1
  102. package/dist/close-job.js +65 -12
  103. package/dist/close-job.js.map +1 -1
  104. package/dist/complete.d.ts.map +1 -1
  105. package/dist/complete.js +20 -1
  106. package/dist/complete.js.map +1 -1
  107. package/dist/config.d.ts +41 -44
  108. package/dist/config.d.ts.map +1 -1
  109. package/dist/config.js +2 -4
  110. package/dist/config.js.map +1 -1
  111. package/dist/continue-branch.d.ts +63 -15
  112. package/dist/continue-branch.d.ts.map +1 -1
  113. package/dist/continue-branch.js +75 -8
  114. package/dist/continue-branch.js.map +1 -1
  115. package/dist/crashed-run-save.d.ts +73 -0
  116. package/dist/crashed-run-save.d.ts.map +1 -0
  117. package/dist/crashed-run-save.js +86 -0
  118. package/dist/crashed-run-save.js.map +1 -0
  119. package/dist/cwd-section.d.ts.map +1 -1
  120. package/dist/cwd-section.js +10 -2
  121. package/dist/cwd-section.js.map +1 -1
  122. package/dist/decision-engine.d.ts +10 -0
  123. package/dist/decision-engine.d.ts.map +1 -1
  124. package/dist/decision-engine.js.map +1 -1
  125. package/dist/do-config.d.ts +2 -24
  126. package/dist/do-config.d.ts.map +1 -1
  127. package/dist/do-config.js +1 -33
  128. package/dist/do-config.js.map +1 -1
  129. package/dist/do.d.ts +149 -1
  130. package/dist/do.d.ts.map +1 -1
  131. package/dist/do.js +115 -25
  132. package/dist/do.js.map +1 -1
  133. package/dist/dorfl-item-template.d.ts +98 -0
  134. package/dist/dorfl-item-template.d.ts.map +1 -0
  135. package/dist/dorfl-item-template.js +504 -0
  136. package/dist/dorfl-item-template.js.map +1 -0
  137. package/dist/env-config.d.ts.map +1 -1
  138. package/dist/env-config.js +7 -5
  139. package/dist/env-config.js.map +1 -1
  140. package/dist/frontmatter.d.ts +52 -0
  141. package/dist/frontmatter.d.ts.map +1 -1
  142. package/dist/frontmatter.js +136 -2
  143. package/dist/frontmatter.js.map +1 -1
  144. package/dist/gc.d.ts +13 -0
  145. package/dist/gc.d.ts.map +1 -1
  146. package/dist/gc.js +16 -2
  147. package/dist/gc.js.map +1 -1
  148. package/dist/git.d.ts +18 -1
  149. package/dist/git.d.ts.map +1 -1
  150. package/dist/git.js +70 -5
  151. package/dist/git.js.map +1 -1
  152. package/dist/harness.d.ts +44 -5
  153. package/dist/harness.d.ts.map +1 -1
  154. package/dist/harness.js +24 -1
  155. package/dist/harness.js.map +1 -1
  156. package/dist/index.d.ts +11 -4
  157. package/dist/index.d.ts.map +1 -1
  158. package/dist/index.js +7 -3
  159. package/dist/index.js.map +1 -1
  160. package/dist/install-ci-action-pins.d.ts +123 -0
  161. package/dist/install-ci-action-pins.d.ts.map +1 -0
  162. package/dist/install-ci-action-pins.js +190 -0
  163. package/dist/install-ci-action-pins.js.map +1 -0
  164. package/dist/install-ci-actions-pr-creation.d.ts +70 -0
  165. package/dist/install-ci-actions-pr-creation.d.ts.map +1 -0
  166. package/dist/install-ci-actions-pr-creation.js +106 -0
  167. package/dist/install-ci-actions-pr-creation.js.map +1 -0
  168. package/dist/install-ci-capabilities/dorfl-item.d.ts +12 -0
  169. package/dist/install-ci-capabilities/dorfl-item.d.ts.map +1 -0
  170. package/dist/install-ci-capabilities/dorfl-item.js +26 -0
  171. package/dist/install-ci-capabilities/dorfl-item.js.map +1 -0
  172. package/dist/install-ci-core.d.ts +155 -37
  173. package/dist/install-ci-core.d.ts.map +1 -1
  174. package/dist/install-ci-core.js +304 -200
  175. package/dist/install-ci-core.js.map +1 -1
  176. package/dist/install-ci-github.d.ts +47 -2
  177. package/dist/install-ci-github.d.ts.map +1 -1
  178. package/dist/install-ci-github.js +113 -1
  179. package/dist/install-ci-github.js.map +1 -1
  180. package/dist/install-ci.d.ts +25 -6
  181. package/dist/install-ci.d.ts.map +1 -1
  182. package/dist/install-ci.js +72 -36
  183. package/dist/install-ci.js.map +1 -1
  184. package/dist/intake-marker.d.ts +6 -1
  185. package/dist/intake-marker.d.ts.map +1 -1
  186. package/dist/intake-marker.js.map +1 -1
  187. package/dist/intake-triage.d.ts.map +1 -1
  188. package/dist/intake-triage.js +6 -2
  189. package/dist/intake-triage.js.map +1 -1
  190. package/dist/intake-trigger-template.d.ts +31 -25
  191. package/dist/intake-trigger-template.d.ts.map +1 -1
  192. package/dist/intake-trigger-template.js +107 -292
  193. package/dist/intake-trigger-template.js.map +1 -1
  194. package/dist/intake.d.ts +186 -4
  195. package/dist/intake.d.ts.map +1 -1
  196. package/dist/intake.js +533 -416
  197. package/dist/intake.js.map +1 -1
  198. package/dist/integration-core.d.ts +154 -1
  199. package/dist/integration-core.d.ts.map +1 -1
  200. package/dist/integration-core.js +759 -486
  201. package/dist/integration-core.js.map +1 -1
  202. package/dist/integrator.d.ts +12 -0
  203. package/dist/integrator.d.ts.map +1 -1
  204. package/dist/integrator.js +21 -0
  205. package/dist/integrator.js.map +1 -1
  206. package/dist/isolation.d.ts +12 -2
  207. package/dist/isolation.d.ts.map +1 -1
  208. package/dist/isolation.js +19 -8
  209. package/dist/isolation.js.map +1 -1
  210. package/dist/item-lock.d.ts +93 -11
  211. package/dist/item-lock.d.ts.map +1 -1
  212. package/dist/item-lock.js +233 -65
  213. package/dist/item-lock.js.map +1 -1
  214. package/dist/land-question-residue.d.ts +58 -0
  215. package/dist/land-question-residue.d.ts.map +1 -0
  216. package/dist/land-question-residue.js +95 -0
  217. package/dist/land-question-residue.js.map +1 -0
  218. package/dist/lifecycle-gather.d.ts +16 -0
  219. package/dist/lifecycle-gather.d.ts.map +1 -1
  220. package/dist/lifecycle-gather.js +54 -6
  221. package/dist/lifecycle-gather.js.map +1 -1
  222. package/dist/merge-answer.d.ts +41 -0
  223. package/dist/merge-answer.d.ts.map +1 -0
  224. package/dist/merge-answer.js +60 -0
  225. package/dist/merge-answer.js.map +1 -0
  226. package/dist/merge-question-surfacer.d.ts +105 -30
  227. package/dist/merge-question-surfacer.d.ts.map +1 -1
  228. package/dist/merge-question-surfacer.js +202 -91
  229. package/dist/merge-question-surfacer.js.map +1 -1
  230. package/dist/merge-question-tick.d.ts +64 -0
  231. package/dist/merge-question-tick.d.ts.map +1 -0
  232. package/dist/merge-question-tick.js +96 -0
  233. package/dist/merge-question-tick.js.map +1 -0
  234. package/dist/mint-adr.d.ts.map +1 -1
  235. package/dist/mint-adr.js +20 -2
  236. package/dist/mint-adr.js.map +1 -1
  237. package/dist/needs-attention.d.ts +72 -2
  238. package/dist/needs-attention.d.ts.map +1 -1
  239. package/dist/needs-attention.js +275 -38
  240. package/dist/needs-attention.js.map +1 -1
  241. package/dist/phase-recorder.d.ts +168 -0
  242. package/dist/phase-recorder.d.ts.map +1 -0
  243. package/dist/phase-recorder.js +218 -0
  244. package/dist/phase-recorder.js.map +1 -0
  245. package/dist/phase.d.ts +94 -0
  246. package/dist/phase.d.ts.map +1 -0
  247. package/dist/phase.js +148 -0
  248. package/dist/phase.js.map +1 -0
  249. package/dist/pi-harness.d.ts.map +1 -1
  250. package/dist/pi-harness.js +19 -6
  251. package/dist/pi-harness.js.map +1 -1
  252. package/dist/prepare.d.ts.map +1 -1
  253. package/dist/prepare.js +4 -0
  254. package/dist/prepare.js.map +1 -1
  255. package/dist/prompt.d.ts +4 -0
  256. package/dist/prompt.d.ts.map +1 -1
  257. package/dist/prompt.js +48 -1
  258. package/dist/prompt.js.map +1 -1
  259. package/dist/protocol/CLAIM-PROTOCOL.md +3 -1
  260. package/dist/protocol/WORK-CONTRACT.md +1 -1
  261. package/dist/reap-branches.d.ts +48 -0
  262. package/dist/reap-branches.d.ts.map +1 -1
  263. package/dist/reap-branches.js +64 -0
  264. package/dist/reap-branches.js.map +1 -1
  265. package/dist/ref-write.d.ts +198 -0
  266. package/dist/ref-write.d.ts.map +1 -0
  267. package/dist/ref-write.js +79 -0
  268. package/dist/ref-write.js.map +1 -0
  269. package/dist/repo-config.js +8 -8
  270. package/dist/repo-config.js.map +1 -1
  271. package/dist/repo-mirror.d.ts +36 -0
  272. package/dist/repo-mirror.d.ts.map +1 -1
  273. package/dist/repo-mirror.js +91 -1
  274. package/dist/repo-mirror.js.map +1 -1
  275. package/dist/review-verdict.d.ts +1 -1
  276. package/dist/review-verdict.js +1 -1
  277. package/dist/run.d.ts +7 -1
  278. package/dist/run.d.ts.map +1 -1
  279. package/dist/run.js +28 -4
  280. package/dist/run.js.map +1 -1
  281. package/dist/scan.d.ts +19 -1
  282. package/dist/scan.d.ts.map +1 -1
  283. package/dist/scan.js +21 -8
  284. package/dist/scan.js.map +1 -1
  285. package/dist/sidecar.d.ts +14 -0
  286. package/dist/sidecar.d.ts.map +1 -1
  287. package/dist/sidecar.js +21 -0
  288. package/dist/sidecar.js.map +1 -1
  289. package/dist/single-job-warning.d.ts +63 -0
  290. package/dist/single-job-warning.d.ts.map +1 -0
  291. package/dist/single-job-warning.js +110 -0
  292. package/dist/single-job-warning.js.map +1 -0
  293. package/dist/skills/setup/protocol/CLAIM-PROTOCOL.md +3 -1
  294. package/dist/skills/setup/protocol/WORK-CONTRACT.md +1 -1
  295. package/dist/spec-complete.d.ts +13 -6
  296. package/dist/spec-complete.d.ts.map +1 -1
  297. package/dist/spec-complete.js +23 -11
  298. package/dist/spec-complete.js.map +1 -1
  299. package/dist/start.d.ts.map +1 -1
  300. package/dist/start.js +47 -14
  301. package/dist/start.js.map +1 -1
  302. package/dist/status.d.ts +12 -0
  303. package/dist/status.d.ts.map +1 -1
  304. package/dist/status.js +11 -3
  305. package/dist/status.js.map +1 -1
  306. package/dist/tasking.d.ts +246 -1
  307. package/dist/tasking.d.ts.map +1 -1
  308. package/dist/tasking.js +452 -358
  309. package/dist/tasking.js.map +1 -1
  310. package/dist/triage-persist.d.ts.map +1 -1
  311. package/dist/triage-persist.js +21 -2
  312. package/dist/triage-persist.js.map +1 -1
  313. package/dist/verify-workflow-template.d.ts.map +1 -1
  314. package/dist/verify-workflow-template.js +8 -4
  315. package/dist/verify-workflow-template.js.map +1 -1
  316. package/dist/verify.d.ts.map +1 -1
  317. package/dist/verify.js +4 -0
  318. package/dist/verify.js.map +1 -1
  319. package/dist/watch-session.d.ts +42 -13
  320. package/dist/watch-session.d.ts.map +1 -1
  321. package/dist/watch-session.js +52 -23
  322. package/dist/watch-session.js.map +1 -1
  323. package/dist/work-layout.d.ts +10 -4
  324. package/dist/work-layout.d.ts.map +1 -1
  325. package/dist/work-layout.js +11 -3
  326. package/dist/work-layout.js.map +1 -1
  327. package/dist/workspace.d.ts +65 -4
  328. package/dist/workspace.d.ts.map +1 -1
  329. package/dist/workspace.js +159 -11
  330. package/dist/workspace.js.map +1 -1
  331. package/package.json +1 -1
  332. package/src/advance-ci-template.ts +80 -81
  333. package/src/advance-drivers.ts +45 -6
  334. package/src/advance-isolated.ts +3 -5
  335. package/src/advance-lifecycle-template.ts +375 -538
  336. package/src/advance-loop-driver.ts +3 -5
  337. package/src/advance-treeless-publish.ts +61 -0
  338. package/src/advance.ts +145 -15
  339. package/src/advancing-lock.ts +36 -1
  340. package/src/agent-env.ts +174 -0
  341. package/src/agent-stop.ts +81 -0
  342. package/src/apply-merge-action.ts +401 -154
  343. package/src/apply-stuck-action.ts +2 -2
  344. package/src/ci-agent-result.ts +421 -0
  345. package/src/ci-handoff-apply.ts +737 -0
  346. package/src/ci-handoff-format.ts +926 -0
  347. package/src/ci-handoff-lfs.ts +519 -0
  348. package/src/ci-handoff.ts +392 -0
  349. package/src/ci-lock-outputs.ts +273 -0
  350. package/src/ci-phase-build.ts +1328 -0
  351. package/src/ci-phase-driver.ts +548 -0
  352. package/src/ci-phase-intake.ts +861 -0
  353. package/src/ci-phase-tasking.ts +1255 -0
  354. package/src/ci-phase-treeless.ts +2028 -0
  355. package/src/ci-read-token.ts +90 -0
  356. package/src/cli.ts +591 -29
  357. package/src/close-job-template.ts +52 -15
  358. package/src/close-job.ts +77 -12
  359. package/src/complete.ts +19 -1
  360. package/src/config.ts +43 -48
  361. package/src/continue-branch.ts +121 -16
  362. package/src/crashed-run-save.ts +162 -0
  363. package/src/cwd-section.ts +10 -0
  364. package/src/decision-engine.ts +10 -0
  365. package/src/do-config.ts +2 -57
  366. package/src/do.ts +170 -28
  367. package/src/dorfl-item-template.ts +556 -0
  368. package/src/env-config.ts +7 -5
  369. package/src/frontmatter.ts +155 -2
  370. package/src/gc.ts +27 -2
  371. package/src/git.ts +83 -5
  372. package/src/harness.ts +58 -6
  373. package/src/index.ts +50 -1
  374. package/src/install-ci-action-pins.ts +209 -0
  375. package/src/install-ci-actions-pr-creation.ts +186 -0
  376. package/src/install-ci-capabilities/dorfl-item.ts +33 -0
  377. package/src/install-ci-core.ts +388 -233
  378. package/src/install-ci-github.ts +149 -1
  379. package/src/install-ci.ts +83 -37
  380. package/src/intake-marker.ts +6 -1
  381. package/src/intake-triage.ts +7 -3
  382. package/src/intake-trigger-template.ts +126 -327
  383. package/src/intake.ts +725 -544
  384. package/src/integration-core.ts +975 -523
  385. package/src/integrator.ts +28 -0
  386. package/src/isolation.ts +29 -10
  387. package/src/item-lock.ts +308 -92
  388. package/src/land-question-residue.ts +122 -0
  389. package/src/lifecycle-gather.ts +82 -10
  390. package/src/merge-answer.ts +82 -0
  391. package/src/merge-question-surfacer.ts +320 -112
  392. package/src/merge-question-tick.ts +182 -0
  393. package/src/mint-adr.ts +28 -2
  394. package/src/needs-attention.ts +350 -42
  395. package/src/phase-recorder.ts +350 -0
  396. package/src/phase.ts +177 -0
  397. package/src/pi-harness.ts +25 -5
  398. package/src/prepare.ts +4 -0
  399. package/src/prompt.ts +68 -1
  400. package/src/reap-branches.ts +107 -0
  401. package/src/ref-write.ts +324 -0
  402. package/src/repo-config.ts +8 -8
  403. package/src/repo-mirror.ts +107 -1
  404. package/src/review-verdict.ts +1 -1
  405. package/src/run.ts +47 -6
  406. package/src/scan.ts +37 -7
  407. package/src/sidecar.ts +36 -0
  408. package/src/single-job-warning.ts +135 -0
  409. package/src/spec-complete.ts +36 -14
  410. package/src/start.ts +55 -16
  411. package/src/status.ts +29 -3
  412. package/src/tasking.ts +593 -378
  413. package/src/triage-persist.ts +24 -2
  414. package/src/verify-workflow-template.ts +8 -4
  415. package/src/verify.ts +4 -0
  416. package/src/watch-session.ts +86 -28
  417. package/src/work-layout.ts +11 -3
  418. package/src/workspace.ts +210 -14
@@ -4,6 +4,7 @@ import { run } from './git.js';
4
4
  import { isGitHubArbiterUrl, DEFAULT_GH_BIN } from './github.js';
5
5
  import { parseSidecar, sidecarPathFor, isEntryAnswered, } from './sidecar.js';
6
6
  import { persistSurfacedQuestions, } from './surface-persist.js';
7
+ import { parseWorkBranchRef } from './slug-namespace.js';
7
8
  import { workItemRel } from './work-layout.js';
8
9
  /** Raised for fatal usage errors (a missing repo, etc.). */
9
10
  export class MergeQuestionSurfacerError extends Error {
@@ -13,21 +14,17 @@ export class MergeQuestionSurfacerError extends Error {
13
14
  }
14
15
  }
15
16
  /**
16
- * The lifecycle folders {@link findTaskItemPath} scans for a task body to flip
17
- * `needsAnswers:true` on. This set DELIBERATELY DIVERGES from `advance.ts`'s
18
- * `FOLDERS_FOR_TYPE.task` (`['tasks-backlog','tasks-ready','in-progress','done']`):
19
- *
20
- * - OMITS `in-progress` (and `needs-attention`): an unmerged `work/<slug>`
21
- * branch whose body is mid-build should NOT trigger a merge-question — the
22
- * build is still active, and surfacing a land-decision now would race the
23
- * builder. Such tasks fall through to the `no-item-body` skip.
24
- * - ADDS `cancelled`: a cancelled task with a lingering unmerged `work/*`
25
- * branch SHOULD surface a merge-question so the operator explicitly decides
26
- * whether to merge the branch or drop it.
17
+ * The lifecycle folders {@link findTaskItemPath} asks about (task
18
+ * `wire-merge-questions-into-the-advance-tick`, decision 6): the pool and
19
+ * staging. `in-progress` / `needs-attention` no longer exist as folders (a
20
+ * build in flight is a held lock, filtered separately).
27
21
  */
28
22
  const TASK_FOLDERS = [
29
23
  'tasks-ready',
30
24
  'tasks-backlog',
25
+ ];
26
+ /** A body in one of these is TERMINAL: its branch is never asked about. */
27
+ const TERMINAL_TASK_FOLDERS = [
31
28
  'done',
32
29
  'cancelled',
33
30
  ];
@@ -35,9 +32,10 @@ const TASK_FOLDERS = [
35
32
  * Surface merge-questions for every unmerged `work/*` branch in `cwd`.
36
33
  *
37
34
  * The FLOOR (git reachability) is authoritative; the CEILING (`gh pr list`)
38
- * runs only when {@link isGitHubArbiterUrl} accepts the arbiter URL, and is
39
- * pure enrichment (a missing/failed `gh` degrades silently — the floor still
40
- * surfaces the question).
35
+ * runs only when {@link isGitHubArbiterUrl} accepts the arbiter URL. On GitHub
36
+ * it is load-bearing (an open PR is the land decision), so a failed listing
37
+ * asks about NO branch and is reported on
38
+ * {@link SurfaceMergeQuestionsResult.prListingError}.
41
39
  *
42
40
  * Idempotency: a branch whose sidecar ALREADY carries a PENDING `kind: merge`
43
41
  * entry is SKIPPED (with `already-pending-merge-question`). A branch with no
@@ -53,10 +51,14 @@ export function surfaceMergeQuestions(options) {
53
51
  const note = options.note ?? (() => { });
54
52
  const persist = options.persist ?? persistSurfacedQuestions;
55
53
  const listBranches = options.listUnmergedWorkBranches ?? listUnmergedWorkBranchesViaGit;
56
- const branches = listBranches({ cwd, base, env });
54
+ const branches = listBranches({ cwd, base, arbiter: options.arbiter, env });
57
55
  // CEILING: only consult `gh pr list` when the arbiter is GitHub-shaped. A
58
56
  // bare / non-GitHub arbiter never spawns `gh` (the floor is sufficient).
57
+ // On GitHub an open PR is the land decision, so a branch with one is not
58
+ // asked about; a failed listing asks about NOTHING this pass (a question on
59
+ // a branch with an open PR would land it behind the PR's back).
59
60
  let prs = new Map();
61
+ let prListingError;
60
62
  const ghEnabled = options.arbiterUrl !== undefined && isGitHubArbiterUrl(options.arbiterUrl);
61
63
  if (ghEnabled && branches.length > 0) {
62
64
  const listPRs = options.listOpenPullRequests ?? listOpenPullRequestsViaGh;
@@ -69,45 +71,76 @@ export function surfaceMergeQuestions(options) {
69
71
  });
70
72
  }
71
73
  catch (err) {
72
- // `gh` is the ENRICHMENT layer — a failure must NEVER suppress the
73
- // floor's surfacing. Note it and proceed with an empty PR map.
74
74
  const detail = err instanceof Error ? err.message : String(err);
75
- note(`merge-question surfacer: gh pr list failed (${detail}) — continuing with the git-only floor.`);
76
- prs = new Map();
75
+ note(`merge-question surfacer: gh pr list failed (${detail}); asking about no branch this pass.`);
76
+ prs = undefined;
77
+ prListingError = detail;
78
+ }
79
+ }
80
+ // The item locks by task slug (`task-<slug>` entries only).
81
+ const locks = new Map();
82
+ for (const lock of options.locks ?? []) {
83
+ if (lock.entry.startsWith('task-')) {
84
+ locks.set(lock.entry.slice('task-'.length), lock);
77
85
  }
78
86
  }
79
87
  const surfaced = [];
80
88
  const skipped = [];
89
+ const skip = (branch, reason) => {
90
+ skipped.push({ ref: branch.ref, slug: branch.slug, reason });
91
+ };
92
+ // The `main` every question of this pass is asked against: recorded on the
93
+ // entry so a `strictMergeApproval` apply can tell whether `main` moved since
94
+ // (task `strict-merge-approval-restale-check-runs-before-the-continue-rebase`).
95
+ // Unresolvable (a test seam over a non-repo) ⇒ no base recorded.
96
+ const askedAtMain = branches.length > 0 ? resolveCommit(cwd, base, env) : undefined;
81
97
  for (const branch of branches) {
82
98
  const item = `task:${branch.slug}`;
83
- // Idempotency: if the sidecar already carries a PENDING `kind: merge`
84
- // entry, this surfacer must not append a duplicate. (An ANSWERED merge
85
- // entry is fine — apply will dispatch it; appending a new entry would
86
- // re-pause the sidecar unnecessarily.)
87
- if (alreadyHasPendingMergeQuestion(cwd, item)) {
88
- skipped.push({
89
- ref: branch.ref,
90
- slug: branch.slug,
91
- reason: 'already-pending-merge-question',
92
- });
93
- continue;
94
- }
95
99
  const itemPath = findTaskItemPath(cwd, branch.slug);
96
100
  if (itemPath === undefined) {
101
+ // A terminal body (done / cancelled): its branch is finished business
102
+ // (a squash-merged PR whose branch was not deleted rests here too).
103
+ if (isTerminalTask(cwd, branch.slug)) {
104
+ skip(branch, 'terminal');
105
+ continue;
106
+ }
97
107
  // The `branch:`/`ref:`-keyed sidecar identity (SPEC sidecar Q5-i, the
98
108
  // cross-cutting open question SHARED with the stuck-lock surfacer) is
99
- // OUT OF SCOPE for this task — without a body to flip `needsAnswers`
100
- // on, persist would tear the invariant. Skip with the reason so the
101
- // case is visible to the caller.
102
- skipped.push({
103
- ref: branch.ref,
104
- slug: branch.slug,
105
- reason: 'no-item-body',
106
- });
109
+ // OUT OF SCOPE: without a body to flip `needsAnswers` on, persist would
110
+ // tear the invariant. Skip with the reason so the case is visible.
111
+ skip(branch, 'no-item-body');
112
+ continue;
113
+ }
114
+ // Idempotency: never append a second merge question. A PENDING one is
115
+ // awaiting its answer; an ANSWERED one awaits its apply (appending would
116
+ // re-pause the sidecar and strand the answer).
117
+ const existing = existingMergeQuestion(cwd, item);
118
+ if (existing === 'pending') {
119
+ skip(branch, 'already-pending-merge-question');
120
+ continue;
121
+ }
122
+ if (existing === 'answered') {
123
+ skip(branch, 'merge-question-answered');
124
+ continue;
125
+ }
126
+ if (prs === undefined) {
127
+ skip(branch, 'pr-state-unknown');
128
+ continue;
129
+ }
130
+ if (prs.has(branch.ref)) {
131
+ skip(branch, 'open-pr');
132
+ continue;
133
+ }
134
+ const lock = locks.get(branch.slug);
135
+ if (lock !== undefined && lock.keptFor !== 'propose-pr') {
136
+ skip(branch, 'lock-held');
137
+ continue;
138
+ }
139
+ if (!tipHasDoneMove(cwd, branch, env)) {
140
+ skip(branch, 'no-done-move');
107
141
  continue;
108
142
  }
109
- const pr = prs.get(branch.ref);
110
- const question = buildMergeQuestion(branch, pr);
143
+ const question = buildMergeQuestion(branch, ghEnabled, askedAtMain);
111
144
  const result = persist({
112
145
  cwd,
113
146
  item,
@@ -117,11 +150,7 @@ export function surfaceMergeQuestions(options) {
117
150
  note,
118
151
  });
119
152
  if (result.outcome === 'nothing') {
120
- skipped.push({
121
- ref: branch.ref,
122
- slug: branch.slug,
123
- reason: 'persist-nothing',
124
- });
153
+ skip(branch, 'persist-nothing');
125
154
  continue;
126
155
  }
127
156
  surfaced.push({
@@ -130,10 +159,14 @@ export function surfaceMergeQuestions(options) {
130
159
  ref: branch.ref,
131
160
  sidecarPath: result.sidecarPath,
132
161
  commit: result.commit,
133
- prUrl: pr?.url,
134
162
  });
135
163
  }
136
- return { considered: branches.length, surfaced, skipped };
164
+ return {
165
+ considered: branches.length,
166
+ surfaced,
167
+ skipped,
168
+ ...(prListingError === undefined ? {} : { prListingError }),
169
+ };
137
170
  }
138
171
  /**
139
172
  * Build the merge-question for ONE unmerged branch.
@@ -148,19 +181,13 @@ export function surfaceMergeQuestions(options) {
148
181
  * `kind: merge` is what the apply rung reads to route the answer to the
149
182
  * deterministic land primitive.
150
183
  */
151
- function buildMergeQuestion(branch, pr) {
184
+ function buildMergeQuestion(branch, ghEnabled, askedAtMain) {
152
185
  const contextLines = [
153
186
  `The branch \`${branch.ref}\` is not reachable from \`main\` — it carries pushed work that has not yet landed.`,
187
+ ghEnabled
188
+ ? 'It has no open PR (none was opened, or its PR was closed without merging).'
189
+ : 'No host PR metadata available (git-alone floor: the branch is the source of truth).',
154
190
  ];
155
- if (pr !== undefined) {
156
- const titleSuffix = pr.title ? `: ${pr.title}` : '';
157
- const urlSuffix = pr.url ? ` (${pr.url})` : '';
158
- const stateSuffix = pr.state ? ` [${pr.state}]` : '';
159
- contextLines.push(`Open PR #${pr.number}${stateSuffix}${titleSuffix}${urlSuffix}.`);
160
- }
161
- else {
162
- contextLines.push(`No host PR metadata available (git-alone floor — the branch is the source of truth).`);
163
- }
164
191
  return {
165
192
  question: `Land \`${branch.ref}\`? An unmerged \`work/*\` branch is awaiting an integration decision.`,
166
193
  context: contextLines.join('\n'),
@@ -168,25 +195,62 @@ function buildMergeQuestion(branch, pr) {
168
195
  default: 'merge | hold | drop',
169
196
  // MACHINE dispatch signal — the apply layer routes on this, not on `default`.
170
197
  kind: 'merge',
198
+ ...(askedAtMain === undefined ? {} : { askedAtMain }),
171
199
  };
172
200
  }
173
- /** Probe the sidecar for an existing pending `kind: merge` entry. */
174
- function alreadyHasPendingMergeQuestion(cwd, item) {
201
+ /** The full sha `rev` names in `cwd`, or `undefined` when it does not resolve. */
202
+ function resolveCommit(cwd, rev, env) {
203
+ let res;
204
+ try {
205
+ res = gitSoft(['rev-parse', '--verify', '--quiet', `${rev}^{commit}`], cwd, env);
206
+ }
207
+ catch {
208
+ return undefined;
209
+ }
210
+ if (res.status !== 0)
211
+ return undefined;
212
+ const sha = res.stdout.trim();
213
+ return sha === '' ? undefined : sha;
214
+ }
215
+ /**
216
+ * Probe the sidecar for an existing `kind: merge` entry: `pending` when one is
217
+ * unanswered, `answered` when every one is answered, `undefined` when there is
218
+ * none.
219
+ */
220
+ function existingMergeQuestion(cwd, item) {
175
221
  const rel = sidecarPathFor(item);
176
222
  const abs = join(cwd, rel);
177
223
  if (!existsSync(abs)) {
178
- return false;
224
+ return undefined;
179
225
  }
180
226
  try {
181
- const model = parseSidecar(readFileSync(abs, 'utf8'));
182
- return model.entries.some((e) => e.kind === 'merge' && !isEntryAnswered(e));
227
+ const merge = parseSidecar(readFileSync(abs, 'utf8')).entries.filter((e) => e.kind === 'merge');
228
+ if (merge.length === 0)
229
+ return undefined;
230
+ return merge.some((e) => !isEntryAnswered(e)) ? 'pending' : 'answered';
183
231
  }
184
232
  catch {
185
233
  // A malformed sidecar is not THIS surfacer's problem — pretend there is
186
- // no pending merge-question and let the persist write surface the issue.
187
- return false;
234
+ // no merge-question and let the persist write surface the issue.
235
+ return undefined;
188
236
  }
189
237
  }
238
+ /** Does the body of `slug` rest in a terminal task folder? */
239
+ function isTerminalTask(cwd, slug) {
240
+ return TERMINAL_TASK_FOLDERS.some((folder) => existsSync(join(cwd, workItemRel(folder, `${slug}.md`))));
241
+ }
242
+ /**
243
+ * Does the branch tip carry the task's done-move (its body at
244
+ * `work/tasks/done/<slug>.md`)? The answered-merge land is the
245
+ * committed-recovery tail, which presupposes it. Read at the tip sha the
246
+ * listing gave; a branch listed without one is not asked about.
247
+ */
248
+ function tipHasDoneMove(cwd, branch, env) {
249
+ if (branch.sha === undefined)
250
+ return false;
251
+ const done = workItemRel('done', `${branch.slug}.md`);
252
+ return (gitSoft(['cat-file', '-e', `${branch.sha}:${done}`], cwd, env).status === 0);
253
+ }
190
254
  /** Locate the task body `work/<folder>/<slug>.md` across lifecycle folders. */
191
255
  function findTaskItemPath(cwd, slug) {
192
256
  for (const folder of TASK_FOLDERS) {
@@ -202,23 +266,51 @@ function gitSoft(args, cwd, env) {
202
266
  return run('git', args, cwd, { env });
203
267
  }
204
268
  /**
205
- * Production FLOOR: enumerate every `refs/heads/work/*` whose tip is NOT
206
- * reachable from `<base>`. A repo with no `<base>` (e.g. a fresh init before
207
- * the first commit) yields the empty list — the surfacer is a no-op until
208
- * `main` exists.
269
+ * Production FLOOR: enumerate the ARBITER's task build branches
270
+ * (`work/task-<slug>`, the {@link workBranchRef} form) whose tip is NOT
271
+ * reachable from the arbiter's `<base>`.
272
+ *
273
+ * WHERE the arbiter's refs live depends on the repo `cwd` is:
274
+ *
275
+ * - A **clone** (non-bare, with an `<arbiter>` remote): the arbiter's branches
276
+ * are the remote-tracking refs `refs/remotes/<arbiter>/work/*`, checked
277
+ * against `refs/remotes/<arbiter>/<base>`. Local `refs/heads/work/*` in a
278
+ * clone are this machine's own (possibly unpushed or stale) heads, not the
279
+ * arbiter's, so they are NOT listed.
280
+ * - The **hub mirror** (a `--bare` clone, or a worktree added from one, where
281
+ * `core.bare` reads `true`) or a repo with no `<arbiter>` remote (the repo IS
282
+ * the arbiter's ref store): the local heads `refs/heads/work/*`, checked
283
+ * against the local `<base>`.
284
+ *
285
+ * The item slug comes from {@link parseWorkBranchRef}, never from slicing the
286
+ * ref. Only the plain BUILD branch of a task (`namespace: 'task'`, no producer)
287
+ * is listed: an intake branch (`work/intake-*`) creates an item rather than
288
+ * building one, a spec branch (`work/spec-*`) carries tasking, and an
289
+ * un-namespaced `work/<slug>` is a pre-cutover ref `parseWorkBranchRef` refuses
290
+ * (the clean-break stance). None of those is what a `kind: merge` answer lands.
291
+ *
292
+ * Purely local: it reads refs already in `cwd` (no fetch, no `ls-remote`); the
293
+ * caller refreshes them. A repo whose `<base>` does not resolve (e.g. a fresh
294
+ * init before the first commit, or a clone that never fetched `<base>`) yields
295
+ * the empty list: without a base, "unmerged" is meaningless and every branch
296
+ * would over-surface.
209
297
  */
210
298
  export function listUnmergedWorkBranchesViaGit(input) {
211
299
  const { cwd, base, env } = input;
212
- // Bail if `<base>` does not resolve — without a base, "unmerged" is
213
- // meaningless and we'd over-surface every branch as unmerged.
214
- const haveBase = gitSoft(['rev-parse', '--verify', '--quiet', base], cwd, env);
300
+ const arbiter = input.arbiter ?? 'origin';
301
+ const source = arbiterRefSource(cwd, arbiter, env);
302
+ const baseRef = source === 'remote-tracking'
303
+ ? `refs/remotes/${arbiter}/${base}`
304
+ : `refs/heads/${base}`;
305
+ const branchPrefix = source === 'remote-tracking' ? `refs/remotes/${arbiter}/` : 'refs/heads/';
306
+ const haveBase = gitSoft(['rev-parse', '--verify', '--quiet', `${baseRef}^{commit}`], cwd, env);
215
307
  if (haveBase.status !== 0) {
216
308
  return [];
217
309
  }
218
310
  const refs = gitSoft([
219
311
  'for-each-ref',
220
- '--format=%(refname:short) %(objectname)',
221
- 'refs/heads/work/',
312
+ '--format=%(refname) %(objectname)',
313
+ `${branchPrefix}work/`,
222
314
  ], cwd, env);
223
315
  if (refs.status !== 0) {
224
316
  return [];
@@ -233,34 +325,53 @@ export function listUnmergedWorkBranchesViaGit(input) {
233
325
  if (space === -1) {
234
326
  continue;
235
327
  }
236
- const ref = line.slice(0, space);
328
+ const fullRef = line.slice(0, space);
237
329
  const sha = line.slice(space + 1).trim();
238
- if (!ref.startsWith('work/')) {
330
+ if (!fullRef.startsWith(branchPrefix)) {
239
331
  continue;
240
332
  }
241
- const slug = ref.slice('work/'.length);
242
- if (slug === '') {
333
+ // The branch name AS IT IS ON THE ARBITER (`work/task-<slug>`), whichever
334
+ // local namespace it was read from.
335
+ const ref = fullRef.slice(branchPrefix.length);
336
+ const parsed = parseWorkBranchRef(ref);
337
+ if (parsed === undefined ||
338
+ parsed.namespace !== 'task' ||
339
+ parsed.producer !== undefined) {
243
340
  continue;
244
341
  }
245
- // `git merge-base --is-ancestor <sha> <base>` — exit 0 ⇒ reachable
342
+ // `git merge-base --is-ancestor <sha> <base>`: exit 0 ⇒ reachable
246
343
  // (merged), exit 1 ⇒ unmerged.
247
- const reach = gitSoft(['merge-base', '--is-ancestor', sha, base], cwd, env);
344
+ const reach = gitSoft(['merge-base', '--is-ancestor', sha, baseRef], cwd, env);
248
345
  if (reach.status !== 0) {
249
- unmerged.push({ ref, slug, sha });
346
+ unmerged.push({ ref, slug: parsed.slug, sha });
250
347
  }
251
348
  }
252
349
  return unmerged;
253
350
  }
351
+ /**
352
+ * Which local ref namespace holds the arbiter's branches in `cwd`: the local
353
+ * heads for the bare hub mirror (and its worktrees, which share its
354
+ * `core.bare = true` config) or for a repo with no `<arbiter>` remote; the
355
+ * remote-tracking refs for an ordinary clone.
356
+ */
357
+ function arbiterRefSource(cwd, arbiter, env) {
358
+ const bare = gitSoft(['config', '--bool', 'core.bare'], cwd, env);
359
+ if (bare.status === 0 && bare.stdout.trim() === 'true') {
360
+ return 'local-heads';
361
+ }
362
+ const remote = gitSoft(['remote', 'get-url', arbiter], cwd, env);
363
+ return remote.status === 0 ? 'remote-tracking' : 'local-heads';
364
+ }
254
365
  /**
255
366
  * Production CEILING: shell `gh pr list --state open --json …` and index the
256
- * results by their `headRefName` so the surfacer can enrich the matching
257
- * branch's question. A non-zero / missing `gh` is treated as "no host
258
- * metadata available" — the floor still surfaces every unmerged branch.
367
+ * results by their `headRefName`, so the surfacer can skip a branch with an
368
+ * open PR. A non-zero `gh` (or output that is not a JSON array) THROWS: the
369
+ * surfacer then asks about no branch this pass, rather than asking about
370
+ * branches whose PR it cannot see.
259
371
  *
260
- * Best-effort enrichment. The git-reachability FLOOR is authoritative; the
261
- * `--state open`, `--base <base>`, and `--limit 200` arguments are DELIBERATE
262
- * ceilings — a PR targeting a non-`main` base (e.g. a stacked PR) or the case
263
- * of >200 open PRs degrades to floor-only output, never corrupts it.
372
+ * The `--state open`, `--base <base>`, and `--limit 200` arguments are
373
+ * DELIBERATE ceilings: a PR targeting a non-`main` base (e.g. a stacked PR) or
374
+ * the case of >200 open PRs is not seen, so its branch may still be asked about.
264
375
  */
265
376
  export function listOpenPullRequestsViaGh(input) {
266
377
  const { cwd, ghBin, base, env } = input;
@@ -277,17 +388,17 @@ export function listOpenPullRequestsViaGh(input) {
277
388
  'number,url,title,headRefName,state',
278
389
  ], cwd, { env });
279
390
  if (result.status !== 0) {
280
- return new Map();
391
+ throw new Error(`${ghBin} pr list exited ${result.status}: ${result.stderr.trim().slice(0, 300)}`);
281
392
  }
282
393
  let parsed;
283
394
  try {
284
395
  parsed = JSON.parse(result.stdout);
285
396
  }
286
397
  catch {
287
- return new Map();
398
+ throw new Error(`${ghBin} pr list printed no JSON`);
288
399
  }
289
400
  if (!Array.isArray(parsed)) {
290
- return new Map();
401
+ throw new Error(`${ghBin} pr list printed no JSON array`);
291
402
  }
292
403
  const out = new Map();
293
404
  for (const raw of parsed) {
@@ -1 +1 @@
1
- {"version":3,"file":"merge-question-surfacer.js","sourceRoot":"","sources":["../src/merge-question-surfacer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"merge-question-surfacer.js","sourceRoot":"","sources":["../src/merge-question-surfacer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import type { MergeQuestions } from './config.js';
2
+ import { type LockEntry } from './item-lock.js';
3
+ import { type SurfaceMergeQuestionsOptions, type SurfaceMergeQuestionsResult } from './merge-question-surfacer.js';
4
+ /**
5
+ * The **merge-question TICK** (task `wire-merge-questions-into-the-advance-tick`):
6
+ * the one production caller of {@link surfaceMergeQuestions}, behind the
7
+ * `mergeQuestions: off | ask` gate. Surfacing is deterministic (it reads runner
8
+ * state, no agent), so it runs as its own step rather than as a rung of the
9
+ * per-item tick:
10
+ *
11
+ * - the laptop bare `advance` runs it before selecting (`advance-drivers.ts`);
12
+ * - CI runs it as the no-agent `surface-merge-questions` job of the generated
13
+ * `advance-lifecycle` workflow, through `dorfl surface-merge-questions`
14
+ * (decision 5). The read-only `enumerate` job does not run it.
15
+ *
16
+ * One pass: fetch the arbiter (so the listing sees its current work branches),
17
+ * read the held item locks STRICTLY (a lock that cannot be read must not look
18
+ * like "no live build"), run the surfacer in `cwd` (each question is its own
19
+ * local commit on `HEAD`, via `persistSurfacedQuestions`), then publish those
20
+ * commits to `<arbiter>/main` through the tree-less publish seam (re-fetch and
21
+ * rebase on a race, never `--force`).
22
+ */
23
+ /** Options of {@link runMergeQuestionTick}. */
24
+ export interface MergeQuestionTickOptions {
25
+ /** The working clone (checked out on `main`) the questions are committed in. */
26
+ cwd: string;
27
+ /** The arbiter remote NAME in `cwd`. */
28
+ arbiter: string;
29
+ /** The resolved `mergeQuestions` gate. `off` ⇒ nothing runs. */
30
+ mergeQuestions: MergeQuestions;
31
+ /** The base branch. Default `main`. */
32
+ base?: string;
33
+ /**
34
+ * Push the surfaced questions to `<arbiter>/main`. Default `true`. The laptop
35
+ * tick passes `false` when it has no arbiter configured (its checkout sits on
36
+ * the real `main`).
37
+ */
38
+ publish?: boolean;
39
+ /** The `gh` binary for the open-PR listing (GitHub arbiters). */
40
+ ghBin?: string;
41
+ env?: NodeJS.ProcessEnv;
42
+ note?: (message: string) => void;
43
+ /** Seam: the surfacer (tests). */
44
+ surface?: (options: SurfaceMergeQuestionsOptions) => SurfaceMergeQuestionsResult;
45
+ /** Seam: the strict lock read (tests). */
46
+ readLocks?: (cwd: string, arbiter: string, env: NodeJS.ProcessEnv | undefined) => Promise<LockEntry[]>;
47
+ }
48
+ /** What one {@link runMergeQuestionTick} pass did. */
49
+ export interface MergeQuestionTickResult {
50
+ /** `false` when the gate is `off` or a read failed (nothing surfaced). */
51
+ ran: boolean;
52
+ /**
53
+ * `true` when a read the pass depends on failed (fetch, lock refs, or the
54
+ * open-PR listing of a GitHub arbiter).
55
+ */
56
+ failed: boolean;
57
+ /** The surfacer's result, when it ran. */
58
+ result?: SurfaceMergeQuestionsResult;
59
+ /** A one-paragraph summary for the log. */
60
+ message: string;
61
+ }
62
+ /** Run one merge-question pass (see the module doc). Never throws. */
63
+ export declare function runMergeQuestionTick(options: MergeQuestionTickOptions): Promise<MergeQuestionTickResult>;
64
+ //# sourceMappingURL=merge-question-tick.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-question-tick.d.ts","sourceRoot":"","sources":["../src/merge-question-tick.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,aAAa,CAAC;AAChD,OAAO,EAA4B,KAAK,SAAS,EAAC,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAEN,KAAK,4BAA4B,EACjC,KAAK,2BAA2B,EAChC,MAAM,8BAA8B,CAAC;AAGtC;;;;;;;;;;;;;;;;;;GAkBG;AAEH,+CAA+C;AAC/C,MAAM,WAAW,wBAAwB;IACxC,gFAAgF;IAChF,GAAG,EAAE,MAAM,CAAC;IACZ,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,cAAc,EAAE,cAAc,CAAC;IAC/B,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,kCAAkC;IAClC,OAAO,CAAC,EAAE,CACT,OAAO,EAAE,4BAA4B,KACjC,2BAA2B,CAAC;IACjC,0CAA0C;IAC1C,SAAS,CAAC,EAAE,CACX,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,SAAS,KAC9B,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;CAC1B;AAED,sDAAsD;AACtD,MAAM,WAAW,uBAAuB;IACvC,0EAA0E;IAC1E,GAAG,EAAE,OAAO,CAAC;IACb;;;OAGG;IACH,MAAM,EAAE,OAAO,CAAC;IAChB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,2BAA2B,CAAC;IACrC,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,sEAAsE;AACtE,wBAAsB,oBAAoB,CACzC,OAAO,EAAE,wBAAwB,GAC/B,OAAO,CAAC,uBAAuB,CAAC,CAqGlC"}
@@ -0,0 +1,96 @@
1
+ import { runAsync } from './git.js';
2
+ import { listItemLockEntriesStrict } from './item-lock.js';
3
+ import { surfaceMergeQuestions, } from './merge-question-surfacer.js';
4
+ import { refWrite } from './ref-write.js';
5
+ /** Run one merge-question pass (see the module doc). Never throws. */
6
+ export async function runMergeQuestionTick(options) {
7
+ const { cwd, arbiter, env } = options;
8
+ const note = options.note ?? (() => { });
9
+ if (options.mergeQuestions === 'off') {
10
+ return {
11
+ ran: false,
12
+ failed: false,
13
+ message: 'mergeQuestions is off: no merge question is surfaced.',
14
+ };
15
+ }
16
+ const url = await runAsync('git', ['remote', 'get-url', arbiter], cwd, {
17
+ env,
18
+ });
19
+ const arbiterUrl = url.status === 0 ? url.stdout.trim() : undefined;
20
+ let locks = [];
21
+ if (arbiterUrl !== undefined) {
22
+ // The arbiter's CURRENT work branches (the floor reads the remote-tracking
23
+ // refs of a clone) and `main` (the reachability base).
24
+ const fetched = await runAsync('git', ['fetch', '--prune', '--quiet', arbiter], cwd, { env });
25
+ if (fetched.status !== 0) {
26
+ return {
27
+ ran: false,
28
+ failed: true,
29
+ message: `merge questions: fetching ${arbiter} failed (${fetched.stderr.trim()}); nothing surfaced.`,
30
+ };
31
+ }
32
+ try {
33
+ locks = await (options.readLocks ?? listItemLockEntriesStrict)(cwd, arbiter, env);
34
+ }
35
+ catch (err) {
36
+ const detail = err instanceof Error ? err.message : String(err);
37
+ return {
38
+ ran: false,
39
+ failed: true,
40
+ message: `merge questions: the item locks on ${arbiter} could not be read (${detail}); nothing surfaced.`,
41
+ };
42
+ }
43
+ }
44
+ const result = (options.surface ?? surfaceMergeQuestions)({
45
+ cwd,
46
+ arbiterUrl,
47
+ arbiter,
48
+ base: options.base,
49
+ ghBin: options.ghBin,
50
+ env,
51
+ note,
52
+ locks,
53
+ });
54
+ for (const s of result.skipped) {
55
+ note(`merge question: not asked about ${s.ref} (${s.reason}).`);
56
+ }
57
+ for (const s of result.surfaced) {
58
+ note(`merge question: asked about ${s.ref} (${s.sidecarPath}).`);
59
+ }
60
+ // A GitHub arbiter whose open PRs could not be listed: the surfacer asked
61
+ // about no branch (it cannot tell which have an open PR). Report the pass as
62
+ // FAILED so it is visible (gate-3 of PR #459: an uncredentialed `gh` in CI
63
+ // otherwise skipped every branch as `pr-state-unknown` with exit 0).
64
+ if (result.prListingError !== undefined) {
65
+ return {
66
+ ran: true,
67
+ failed: true,
68
+ result,
69
+ message: `merge questions: the open PRs on ${arbiter} could not be listed ` +
70
+ `(${result.prListingError}); no merge question was asked. Give gh a ` +
71
+ 'credential (GH_TOKEN) that can read pull requests.',
72
+ };
73
+ }
74
+ if (result.surfaced.length > 0 &&
75
+ options.publish !== false &&
76
+ arbiterUrl !== undefined) {
77
+ await refWrite.publishTreelessResult({
78
+ cwd,
79
+ arbiter,
80
+ // The same large liveness ceiling the in-place tree-less publish uses: a
81
+ // clean re-rebase never counts against a small budget.
82
+ retries: 1000,
83
+ env,
84
+ note,
85
+ });
86
+ }
87
+ return {
88
+ ran: true,
89
+ failed: false,
90
+ result,
91
+ message: `merge questions: ${result.surfaced.length} surfaced, ` +
92
+ `${result.skipped.length} not asked, of ${result.considered} unmerged ` +
93
+ 'work branch(es).',
94
+ };
95
+ }
96
+ //# sourceMappingURL=merge-question-tick.js.map