dorfl 0.0.0 → 0.1.1

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 +3100 -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 +208 -0
  162. package/dist/frontmatter.d.ts.map +1 -0
  163. package/dist/frontmatter.js +344 -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 +329 -0
  330. package/dist/prd-to-spec.d.ts.map +1 -0
  331. package/dist/prd-to-spec.js +706 -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 +363 -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 +951 -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 +4379 -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 +477 -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 +1059 -0
  581. package/src/prepare.ts +230 -0
  582. package/src/prompt.ts +763 -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 +1437 -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,502 @@
1
+ import {existsSync, readFileSync} from 'node:fs';
2
+ import {join} from 'node:path';
3
+ import {
4
+ allAnswered,
5
+ isEntryAnswered,
6
+ parseSidecar,
7
+ sidecarPathFor,
8
+ type SidecarEntry,
9
+ type SidecarModel,
10
+ } from './sidecar.js';
11
+ import {run as runProc} from './git.js';
12
+ import {createJob, type Job} from './workspace.js';
13
+ import {
14
+ performIntegration,
15
+ type IntegrationCoreResult,
16
+ } from './integration-core.js';
17
+ import type {VerifyConfig} from './verify.js';
18
+
19
+ /**
20
+ * The **answered MERGE-QUESTION ACTION DISPATCH** (prd
21
+ * `land-time-reverify-and-parallel-merge-ceiling`, task
22
+ * `apply-rung-merge-disposition`; Stories #15, #16) — the deterministic,
23
+ * answer-driven RUNNER-ACTION layer that turns an answered
24
+ * `kind: merge` sidecar entry into a LAND through the EXISTING
25
+ * `integration-core.ts` land primitive (rebase → re-verify on the rebased tip →
26
+ * advance).
27
+ *
28
+ * This is a SIBLING of the agentic `decide()` content-decision in
29
+ * `apply-decide.ts`, NOT a route through it: a merge-acceptance has no
30
+ * judgement content (the human's plain `merge | hold | drop` answer IS the
31
+ * decision; the apply-time fresh-worktree re-verify on the rebased tip is the
32
+ * real correctness gate). Per the PRD's resolved mechanism, routing this
33
+ * through an LLM only adds cost and non-determinism, so the apply rung
34
+ * KIND-CHECKS the sidecar BEFORE calling the agentic decider: a sidecar entry
35
+ * carrying `kind: merge` (the typed dispatch field from `sidecar-kind-field`,
36
+ * stamped by `merge-question-surfacer`) dispatches HERE deterministically;
37
+ * content kinds (observation / triage / spec) keep going through `decide()` as
38
+ * today.
39
+ *
40
+ * The KEYING is the question identity + the human's plain answer:
41
+ *
42
+ * - `answer ≈ merge` → invoke the LAND primitive (see {@link performMergeLand})
43
+ * with `committedRecovery: true` + `freshWorktreeGate: true`. The unmerged
44
+ * `work/<slug>` is checked out via the EXISTING `workspace.ts` per-job
45
+ * worktree seam ({@link createJob} off the hub mirror), NOT a bespoke
46
+ * worktree/clone; `performIntegration` then re-verifies the REBASED tip and
47
+ * REFUSES on red (routes to needs-attention through its own shared seam),
48
+ * so `main` never receives a tree that fails `verify`.
49
+ * - `answer ≈ hold` → SKIP the land; the apply rung still records the answer
50
+ * in the item body via the normal apply path (the work branch stays
51
+ * unmerged; the next surface pass may re-emit a question).
52
+ * - `answer ≈ drop` → SKIP the land; the apply rung still records the answer
53
+ * in the item body via the normal apply path. (Cancellation of the work
54
+ * branch itself is out of this task's scope — the question is recorded as
55
+ * "drop" and the human / a later surfacer handles the artifact.)
56
+ *
57
+ * The STALE-APPROVAL POLICY (PRD OQ6, applied answer q1): default is the cheap
58
+ * "HONOUR the prior approval + land on a green re-verify" path; opt-in
59
+ * `strictMergeApproval` (resolved per-repo via the gate-family precedence chain
60
+ * by the sibling task `strict-merge-approval-gate`, default OFF) RE-SURFACES
61
+ * the merge-question instead of landing when the merge-base moved between the
62
+ * surfacer's question and this apply. The RED-re-verify refusal is unchanged
63
+ * in both modes.
64
+ *
65
+ * House-style boundary: this module is the DETERMINISTIC DISPATCH LAYER. It
66
+ * does NOT re-implement rebase / verify / integrate (it drives the EXISTING
67
+ * `performIntegration` with `committedRecovery: true` + `freshWorktreeGate:
68
+ * true`, which {@link createJob} cuts the worktree for), and it does NOT
69
+ * improvise a worktree or clone (it uses the same `createJob` seam the build /
70
+ * recovery callers use). Tests inject the {@link MergeActionHandler} seam so
71
+ * they assert on EXTERNAL behaviour (what lands on `main`, what routes to
72
+ * needs-attention, that `verify` ran on the rebased tip).
73
+ */
74
+
75
+ /** The three deterministic actions a merge-question answer encodes. */
76
+ export type MergeActionVerb = 'merge' | 'hold' | 'drop';
77
+
78
+ /** A detected, answer-driven merge-action keyed off ONE answered `kind: merge` entry. */
79
+ export interface DetectedMergeAction {
80
+ /** The deterministic verb parsed from the entry's answer text. */
81
+ verb: MergeActionVerb;
82
+ /** The answered `kind: merge` entry the verb came from. */
83
+ entry: SidecarEntry;
84
+ }
85
+
86
+ /**
87
+ * Parse the human's plain free-text answer into the deterministic
88
+ * {@link MergeActionVerb}. The merge-question surfacer renders
89
+ * `merge | hold | drop` in the entry's `default` as a human-readable hint, so
90
+ * the human typically types one of those words verbatim. We accept any text
91
+ * whose first whole word (case-insensitive) is one of `merge` / `hold` / `drop`
92
+ * — this is the same machine-parseable choice shape the surfacer's applied
93
+ * answer q1 documents ("a DETERMINISTIC CHOICE shape … the human picks and the
94
+ * system parses unambiguously").
95
+ *
96
+ * Returns `undefined` on ANYTHING else (an empty answer, a typo, a long
97
+ * narrative without one of the three words at the start) so the caller can
98
+ * route the ambiguity HONESTLY — never default-to-merge on a malformed answer,
99
+ * which would invent a land the human did not authorise.
100
+ */
101
+ export function parseMergeAnswer(text: string): MergeActionVerb | undefined {
102
+ const trimmed = text.trim().toLowerCase();
103
+ if (trimmed === '') return undefined;
104
+ // The first whole alphabetic word; trailing punctuation (a comma, em-dash,
105
+ // period) and any following commentary are tolerated. We deliberately do
106
+ // NOT consume hyphens / apostrophes — the three verbs are plain ASCII
107
+ // words, and over-tolerating typo-shapes would silently invent a verb the
108
+ // human did not pick.
109
+ const match = /^([a-z]+)/.exec(trimmed);
110
+ if (match === null) return undefined;
111
+ const word = match[1];
112
+ if (word === 'merge' || word === 'hold' || word === 'drop') {
113
+ return word;
114
+ }
115
+ return undefined;
116
+ }
117
+
118
+ /**
119
+ * Detect the FIRST answered `kind: merge` entry's deterministic action verb in
120
+ * a fully-answered sidecar (the apply rung's pre-decider kind-check). Returns
121
+ * `undefined` when the sidecar carries no answered `kind: merge` entry (the
122
+ * apply rung then proceeds to the existing path — agentic for observations,
123
+ * normal apply for task/prd content questions).
124
+ *
125
+ * The sidecar is read OFF DISK keyed off the namespaced item identity; the
126
+ * model is parsed via the SAME `parseSidecar` the rest of the engine uses.
127
+ * Returns `undefined` on a missing/unparseable sidecar (the caller's normal
128
+ * apply path will then raise the right error).
129
+ */
130
+ export function detectAnsweredMergeAction(
131
+ cwd: string,
132
+ item: string,
133
+ ): DetectedMergeAction | undefined {
134
+ const abs = join(cwd, sidecarPathFor(item));
135
+ if (!existsSync(abs)) return undefined;
136
+ let model: SidecarModel;
137
+ try {
138
+ model = parseSidecar(readFileSync(abs, 'utf8'));
139
+ } catch {
140
+ return undefined;
141
+ }
142
+ if (!allAnswered(model)) return undefined;
143
+ for (const entry of model.entries) {
144
+ if (entry.kind !== 'merge') continue;
145
+ if (!isEntryAnswered(entry)) continue;
146
+ const verb = parseMergeAnswer(entry.answer);
147
+ if (verb !== undefined) {
148
+ return {verb, entry};
149
+ }
150
+ }
151
+ return undefined;
152
+ }
153
+
154
+ /** Input the production merge-action handler consumes. */
155
+ export interface MergeActionInput {
156
+ /** The detected action (verb + source entry). */
157
+ action: DetectedMergeAction;
158
+ /** The namespaced item identity (`task:<slug>`). */
159
+ item: string;
160
+ /** The bare slug (the work branch is `work/task-<slug>` / `work/<slug>`). */
161
+ slug: string;
162
+ /** The apply rung's working clone (used to resolve the arbiter URL when needed). */
163
+ cwd: string;
164
+ /** The arbiter remote NAME in `cwd` (defaults to `origin`). */
165
+ arbiter: string;
166
+ /**
167
+ * The arbiter URL the land worktree mirrors from. When set, used DIRECTLY
168
+ * (the registry-set advance driver threads the per-mirror origin URL here).
169
+ * When unset, the URL is resolved from `cwd` + `arbiter` via `git remote
170
+ * get-url` (the in-place / one-shot caller).
171
+ */
172
+ arbiterUrl?: string;
173
+ /** The execution working area (`~/.dorfl` by default) `createJob` cuts under. */
174
+ workspacesDir: string;
175
+ /** Per-repo env-prep config the fresh-worktree gate runs before `verify`. */
176
+ prepare?: VerifyConfig;
177
+ /** Per-repo acceptance gate (`verify`). */
178
+ verify?: VerifyConfig;
179
+ /**
180
+ * `strictMergeApproval` (resolved per-repo by the sibling task
181
+ * `strict-merge-approval-gate`; default OFF). OFF ⇒ honour the prior answer
182
+ * + land on a green re-verify (the cheap default). ON ⇒ re-surface the
183
+ * merge-question when the merge-base moved between the surfacer's question
184
+ * and this apply (don't land; the apply rung folds this into a re-pause).
185
+ */
186
+ strictMergeApproval?: boolean;
187
+ /** Bounded recovery-rebase retry knob (mirrors the build path). */
188
+ recoveryRebaseRetries?: number;
189
+ /** Modest livelock-spreading jitter (ms) between recovery-rebase retries. */
190
+ recoveryRebaseJitterMs?: number;
191
+ /** Cross-job land-CAS retry cap (the `mergeRetries` precedence chain). */
192
+ mergeRetries?: number;
193
+ /** Environment for child git processes. */
194
+ env?: NodeJS.ProcessEnv;
195
+ /** Sink for human-readable progress notes. */
196
+ note?: (message: string) => void;
197
+ }
198
+
199
+ /** The terminal verbs the dispatcher reports to the apply rung. */
200
+ export type MergeActionOutcome =
201
+ /** `answer=merge` + green re-verify ⇒ the kept commit landed on `<arbiter>/main`. */
202
+ | 'landed'
203
+ /** `answer=merge` + the kept tip was already on `<arbiter>/main` (idempotent re-run). */
204
+ | 'already-integrated'
205
+ /**
206
+ * `answer=merge` + RED re-verify on the rebased tip (or a rebase-conflict): the
207
+ * land was REFUSED; `performIntegration` routed the item to needs-attention
208
+ * through its shared seam — `main` never received the failing tree. The apply
209
+ * rung short-circuits (does NOT resolve the sidecar, so the open question
210
+ * stays surfaced for a human follow-up).
211
+ */
212
+ | 'refused'
213
+ /**
214
+ * `answer=merge` + `strictMergeApproval` ON + the merge-base moved between
215
+ * the surfacer's question and this apply: the dispatcher RE-SURFACES the
216
+ * merge-question (the apply rung appends a fresh follow-up + re-pauses).
217
+ */
218
+ | 'restale'
219
+ /** `answer=hold` ⇒ no land; the apply rung records the answer in body as usual. */
220
+ | 'hold'
221
+ /** `answer=drop` ⇒ no land; the apply rung records the answer in body as usual. */
222
+ | 'drop';
223
+
224
+ /** What the production handler returns to the apply rung. */
225
+ export interface MergeActionResult {
226
+ outcome: MergeActionOutcome;
227
+ /** Human-readable summary for the rung's message. */
228
+ message: string;
229
+ /**
230
+ * The integration-core result, when the dispatcher reached
231
+ * `performIntegration` (i.e. `answer=merge` + not re-staled). Carries the
232
+ * routing observed by the land primitive (`gate-failed`, `completed`,
233
+ * `already-integrated`, …), so callers can branch on it.
234
+ */
235
+ integration?: IntegrationCoreResult;
236
+ }
237
+
238
+ /**
239
+ * The injectable dispatch SEAM. Production wires {@link performMergeAction}
240
+ * (which checks out via `createJob` + lands via `performIntegration`); tests
241
+ * inject a stub to assert the apply-rung short-circuits on `refused` and falls
242
+ * through on `landed` / `hold` / `drop` / `restale` WITHOUT spinning up a real
243
+ * hub mirror.
244
+ */
245
+ export type MergeActionHandler = (
246
+ input: MergeActionInput,
247
+ ) => Promise<MergeActionResult>;
248
+
249
+ /**
250
+ * Resolve the arbiter URL the land worktree mirrors from. Prefers the
251
+ * caller-supplied `arbiterUrl` (the registry-set advance driver knows it
252
+ * directly); falls back to `git remote get-url <arbiter>` in the apply rung's
253
+ * `cwd` (the in-place / one-shot caller). Returns `undefined` when the URL
254
+ * cannot be resolved — the caller maps that to a clean refusal.
255
+ */
256
+ function resolveArbiterUrl(input: MergeActionInput): string | undefined {
257
+ if (input.arbiterUrl !== undefined && input.arbiterUrl !== '') {
258
+ return input.arbiterUrl;
259
+ }
260
+ const res = runProc('git', ['remote', 'get-url', input.arbiter], input.cwd, {
261
+ env: input.env,
262
+ });
263
+ if (res.status !== 0) return undefined;
264
+ const url = res.stdout.trim();
265
+ return url === '' ? undefined : url;
266
+ }
267
+
268
+ /**
269
+ * The `strictMergeApproval` re-stale check (PRD OQ6 opt-in): did `<arbiter>/
270
+ * main` move past the merge-base of the work branch since the surfacer
271
+ * authored the question? The git-alone analogue of GitHub's "dismiss stale
272
+ * approvals when the base changes" — host-agnostic by reachability.
273
+ *
274
+ * We fetch the latest `<arbiter>/main` from the JOB worktree's hub mirror (the
275
+ * worktree's `origin`), compute `merge-base(<branch>, <origin/main>)`, and
276
+ * compare against `<origin/main>` itself: if the merge-base IS `<origin/main>`,
277
+ * the branch is a strict descendant — the merge-base did NOT move — and the
278
+ * cheap default applies (HONOUR + land on green re-verify). If the merge-base
279
+ * is NOT `<origin/main>`, `main` advanced past the branch's divergence point
280
+ * since the branch was last rebased — the merge-base MOVED — and the strict
281
+ * mode re-surfaces.
282
+ *
283
+ * Returns `true` when the merge-base moved (⇒ re-surface), `false` otherwise.
284
+ * On any plumbing failure returns `false` (do NOT spuriously re-surface — the
285
+ * red re-verify is still the load-bearing safety; a transient git failure must
286
+ * not block a clean answer-then-land).
287
+ */
288
+ function mergeBaseMoved(job: Job, env: NodeJS.ProcessEnv | undefined): boolean {
289
+ const fetch = runProc(
290
+ 'git',
291
+ [
292
+ 'fetch',
293
+ '--quiet',
294
+ job.arbiterRemote,
295
+ `+refs/heads/main:refs/remotes/${job.arbiterRemote}/main`,
296
+ ],
297
+ job.dir,
298
+ {env},
299
+ );
300
+ if (fetch.status !== 0) return false;
301
+ const mainRef = `${job.arbiterRemote}/main`;
302
+ const mainSha = runProc(
303
+ 'git',
304
+ ['rev-parse', '--verify', '--quiet', mainRef],
305
+ job.dir,
306
+ {env},
307
+ );
308
+ if (mainSha.status !== 0) return false;
309
+ const base = runProc('git', ['merge-base', 'HEAD', mainRef], job.dir, {env});
310
+ if (base.status !== 0) return false;
311
+ return base.stdout.trim() !== mainSha.stdout.trim();
312
+ }
313
+
314
+ /**
315
+ * The PRODUCTION dispatcher: an answered `kind: merge` entry's verb drives one
316
+ * of the four terminals (`landed` / `refused` / `restale` / `hold|drop`). For
317
+ * `answer=merge` it checks out the unmerged `work/<slug>` via the EXISTING
318
+ * `workspace.ts` per-job worktree seam ({@link createJob}, the same seam the
319
+ * build / recovery callers use) and invokes the LAND primitive
320
+ * ({@link performIntegration}) with `committedRecovery: true` +
321
+ * `freshWorktreeGate: true` — so the rebased tip is re-verified BEFORE it
322
+ * lands, the answered-merge land path NEVER integrates a clean-rebase-but-
323
+ * broken tree, and a refusal routes to needs-attention through the SAME
324
+ * shared seam (`applyNeedsAttentionTransition`) the build path uses. The job
325
+ * worktree is always disposed (success or failure) so the hub mirror does not
326
+ * accumulate stale per-job state.
327
+ *
328
+ * For `answer=hold` and `answer=drop` the dispatcher does not land — it just
329
+ * tells the apply rung to fall through to the normal answer-recording path.
330
+ * (Cancellation of the work branch on `drop` is OUT OF SCOPE; the answer is
331
+ * recorded and a future surfacer / human handles the artifact.)
332
+ */
333
+ export async function performMergeAction(
334
+ input: MergeActionInput,
335
+ ): Promise<MergeActionResult> {
336
+ const note = input.note ?? (() => {});
337
+ const {verb} = input.action;
338
+
339
+ if (verb === 'hold') {
340
+ return {
341
+ outcome: 'hold',
342
+ message:
343
+ `merge-question for ${input.item} answered HOLD — leaving \`work/${input.slug}\` ` +
344
+ `unmerged (the answer is recorded in the item body).`,
345
+ };
346
+ }
347
+ if (verb === 'drop') {
348
+ return {
349
+ outcome: 'drop',
350
+ message:
351
+ `merge-question for ${input.item} answered DROP — leaving \`work/${input.slug}\` ` +
352
+ `unmerged (the answer is recorded; cancellation of the work branch is ` +
353
+ `out of this dispatcher's scope).`,
354
+ };
355
+ }
356
+
357
+ // verb === 'merge'
358
+ const url = resolveArbiterUrl(input);
359
+ if (url === undefined) {
360
+ return {
361
+ outcome: 'refused',
362
+ message:
363
+ `merge-question for ${input.item} answered MERGE — but the arbiter URL ` +
364
+ `could not be resolved (no arbiterUrl threaded, and \`git remote get-url ` +
365
+ `${input.arbiter}\` failed in ${input.cwd}). NOT landing; the answer ` +
366
+ `stays surfaced.`,
367
+ };
368
+ }
369
+
370
+ // Check out the unmerged `work/<type>-<slug>` via the EXISTING per-job
371
+ // worktree seam — the SAME seam build/recovery callers use, NOT a bespoke
372
+ // worktree or clone. The job dir is the worktree `performIntegration` works
373
+ // from; its `arbiterRemote` is the worktree's `origin` (a bare-hub remote
374
+ // that mirrors the real arbiter), which the integration core push-targets.
375
+ let job: Job;
376
+ try {
377
+ job = createJob({
378
+ url,
379
+ slug: input.slug,
380
+ type: 'task',
381
+ workspacesDir: input.workspacesDir,
382
+ env: input.env,
383
+ });
384
+ } catch (err) {
385
+ const detail = err instanceof Error ? err.message : String(err);
386
+ return {
387
+ outcome: 'refused',
388
+ message:
389
+ `merge-question for ${input.item} answered MERGE — but checking out ` +
390
+ `\`work/${input.slug}\` via the per-job worktree seam failed (${detail}). ` +
391
+ `NOT landing; the answer stays surfaced.`,
392
+ };
393
+ }
394
+
395
+ try {
396
+ // CONTINUE-rebase-conflict: createJob's CONTINUE-rebase aborted on a
397
+ // genuine code conflict. The kept work stays on the branch (recoverable);
398
+ // we refuse the land and route via the standard refusal shape.
399
+ if (job.continueRebaseConflict) {
400
+ return {
401
+ outcome: 'refused',
402
+ message:
403
+ `merge-question for ${input.item} answered MERGE — but rebasing ` +
404
+ `\`work/${input.slug}\` onto current main conflicted (the kept work is ` +
405
+ `intact on the branch; resolve and re-answer). NOT landing.`,
406
+ };
407
+ }
408
+ if (job.continuePushFailure !== undefined) {
409
+ return {
410
+ outcome: 'refused',
411
+ message:
412
+ `merge-question for ${input.item} answered MERGE — but the ` +
413
+ `continue-rebase push to the arbiter failed (${job.continuePushFailure}). ` +
414
+ `NOT landing; the kept work is intact on the branch.`,
415
+ };
416
+ }
417
+
418
+ // STRICT re-stale check (OQ6 opt-in): when ON and the merge-base moved
419
+ // between the surfacer's question and this apply, RE-SURFACE the
420
+ // merge-question (the apply rung folds this into a re-pause) instead of
421
+ // landing. Default OFF ⇒ this block is skipped; the cheap "green
422
+ // re-verify is enough" path runs.
423
+ if (input.strictMergeApproval === true && mergeBaseMoved(job, input.env)) {
424
+ return {
425
+ outcome: 'restale',
426
+ message:
427
+ `merge-question for ${input.item} answered MERGE — but ` +
428
+ `strictMergeApproval is ON and the merge-base of \`work/${input.slug}\` ` +
429
+ `moved between answer and apply: RE-SURFACING the merge-question ` +
430
+ `(no land; the human re-confirms against the new base).`,
431
+ };
432
+ }
433
+
434
+ // LAND through the EXISTING `performIntegration`. The branch's tip
435
+ // already carries its done-move commit (surfacer enumerates `work/*`
436
+ // unreachable from main, so it is a previously-built strand), so we
437
+ // drive the committed-recovery tail — but with `freshWorktreeGate: true`
438
+ // so the REBASED TIP is re-verified BEFORE the integrate (the
439
+ // `committed-recovery-honours-fresh-worktree-gate` task's contract).
440
+ const integration = await performIntegration({
441
+ cwd: job.dir,
442
+ arbiter: job.arbiterRemote,
443
+ slug: input.slug,
444
+ source: 'tasks-ready',
445
+ recovering: false,
446
+ committedRecovery: true,
447
+ freshWorktreeGate: true,
448
+ prepare: input.prepare,
449
+ verify: input.verify,
450
+ mode: 'merge',
451
+ // surfaceArbiter is set so a RED rebased-tip gate (or a rebase
452
+ // conflict surfaced during the retry loop) routes to needs-attention
453
+ // observably on the arbiter (not local-only). The build path uses
454
+ // this shape; we mirror it here for the answered-merge land.
455
+ surfaceArbiter: job.arbiterRemote,
456
+ recoveryRebaseRetries: input.recoveryRebaseRetries,
457
+ recoveryRebaseJitterMs: input.recoveryRebaseJitterMs,
458
+ mergeRetries: input.mergeRetries,
459
+ env: input.env,
460
+ note,
461
+ });
462
+
463
+ if (integration.outcome === 'completed') {
464
+ return {
465
+ outcome: 'landed',
466
+ message:
467
+ `merge-question for ${input.item} answered MERGE — landed ` +
468
+ `\`work/${input.slug}\` on \`${job.arbiterRemote}/main\` via the ` +
469
+ `land primitive (rebase → re-verify on the rebased tip → advance).`,
470
+ integration,
471
+ };
472
+ }
473
+ if (integration.outcome === 'already-integrated') {
474
+ return {
475
+ outcome: 'already-integrated',
476
+ message:
477
+ `merge-question for ${input.item} answered MERGE — \`work/${input.slug}\` ` +
478
+ `was already on \`${job.arbiterRemote}/main\` (idempotent re-run).`,
479
+ integration,
480
+ };
481
+ }
482
+ // gate-failed / prepare-failed / review-blocked / review-unparseable /
483
+ // rebase-conflict / invariant-violation: the land was REFUSED;
484
+ // performIntegration routed the bounce per its own shared seam (gated by
485
+ // `surfaceArbiter`), so `main` never received a failing tree.
486
+ return {
487
+ outcome: 'refused',
488
+ message:
489
+ integration.reason ??
490
+ `merge-question for ${input.item} answered MERGE — the land was REFUSED ` +
491
+ `(${integration.outcome}); NOT landing; the answer stays surfaced.`,
492
+ integration,
493
+ };
494
+ } finally {
495
+ try {
496
+ job.dispose();
497
+ } catch {
498
+ // Best-effort: a failed dispose leaves a reapable per-job worktree
499
+ // behind, which `gc` cleans up. Never crash the dispatch on teardown.
500
+ }
501
+ }
502
+ }