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
@@ -0,0 +1,370 @@
1
+ /**
2
+ * **The shared CI phase driver** (spec `ci-agent-job-without-write-token`, ADR
3
+ * `ci-agent-job-holds-no-write-token`, task `ci-split-build-path`).
4
+ *
5
+ * Every CI item runs as three jobs (`phase.ts`): lock, agent, apply. Each path
6
+ * split (`ci-phase-build.ts` first; intake, tasking and the tree-less rungs
7
+ * later) needs the same few steps around its own pipeline halves, and they live
8
+ * here so every split does them the same way:
9
+ *
10
+ * - the lock phase reads `<arbiter>/main` as the base (never the run's own
11
+ * commit), classifies the item in a throwaway worktree of that base, and
12
+ * publishes its trusted facts to `$GITHUB_OUTPUT` (`ci-lock-outputs.ts`);
13
+ * - the agent and apply phases read those facts back from
14
+ * {@link LOCK_OUTPUTS_ENV} and check them;
15
+ * - the lock-ownership rule (spec §8): the agent phase checks, read-only, that
16
+ * the item's lock ref still equals `lockSha` before launching anything, and
17
+ * the apply phase checks it before its FIRST write and writes nothing when
18
+ * it does not; every later lock operation is leased on the sha last observed
19
+ * ({@link releaseLockLeased});
20
+ * - the agent phase bounds the free text it hands over to the handoff limits;
21
+ * - the lock phase computes the agent job's timeout from the config at
22
+ * `baseSha` ({@link agentTimeoutMinutesAt}), and the apply phase decides what
23
+ * to do with the agent job's result before it reads any artifact
24
+ * ({@link resolveAgentResult}, `ci-agent-result.ts`): only `success` reads
25
+ * it (task `ci-split-agent-result-and-reruns`).
26
+ *
27
+ * **A handled outcome is green** (task `a-handled-surface-exits-green-in-ci`):
28
+ * the job's exit code is the only signal a CI run's colour carries, so every
29
+ * phase (build, tasking, tree-less, intake) exits 0 for an outcome it HANDLED
30
+ * and non-zero only for one it did not:
31
+ *
32
+ * - exit 0: the item was surfaced to needs-attention (including a rejected
33
+ * handoff whose surface landed: outcome `rejected` / `surfaced`); a lock
34
+ * phase that backed off because another run holds the lock (`lost`,
35
+ * `backed-off`); an agent or apply phase whose lock is no longer this run's
36
+ * (`stale-lock`, e.g. a "Re-run failed jobs" of a finished run), which
37
+ * writes nothing;
38
+ * - non-zero: a surface that did not land (`surface-unmoved`), a refused or
39
+ * failed publish or release (`stale-lease`, `publish-refused`,
40
+ * `publish-failed`, `release-refused`, `land-failed`), an agent that failed
41
+ * without a handoff (`agent-failed`), a usage or environment problem, and
42
+ * any unexpected error.
43
+ */
44
+ import { mkdtempSync, rmSync, appendFileSync } from 'node:fs';
45
+ import { tmpdir } from 'node:os';
46
+ import { join } from 'node:path';
47
+ import { LOCK_OUTPUTS_ENV, readLockOutputsFromEnv, serializeLockOutputs, } from './ci-lock-outputs.js';
48
+ import { HandoffRejected } from './ci-handoff-format.js';
49
+ import { actionsRunRefFromEnv, decideAgentResult, detectAgentTimeout, githubTokenApiGet, } from './ci-agent-result.js';
50
+ import { DEFAULT_CONFIG } from './config.js';
51
+ import { git, run, runAsync } from './git.js';
52
+ import { pushLfsObjects } from './ci-handoff-lfs.js';
53
+ import { workItemRel } from './work-layout.js';
54
+ import { REPO_CONFIG_FILENAME, REPO_CONFIG_FILENAME_LEGACY, loadRepoConfigFromContent, } from './repo-config.js';
55
+ import { itemLockRef, lockEntryFor } from './item-lock.js';
56
+ import { refWrite } from './ref-write.js';
57
+ export { LOCK_OUTPUTS_ENV };
58
+ /** A phase run that cannot go on: bad trusted inputs or a missing precondition. */
59
+ export class PhaseDriverError extends Error {
60
+ name = 'PhaseDriverError';
61
+ }
62
+ /**
63
+ * The instruction a phase prints when it refuses to act for a lock it no longer
64
+ * owns (spec §8, "Re-runs"): "Re-run failed jobs" replays old lock outputs, and
65
+ * the way to retry an item is a new run, which takes a fresh lock.
66
+ */
67
+ export const STALE_LOCK_RETRY_HINT = 'The lock was released, reaped or re-taken since the lock job ran (for ' +
68
+ 'example a "Re-run failed jobs" of a finished run). Nothing was written. To ' +
69
+ 'retry the item, start a NEW run (the next tick, or a dispatch), which takes ' +
70
+ 'a fresh lock; do not re-run the old jobs.';
71
+ /** Git environment for any checkout of hostile or unverified content: never smudge LFS. */
72
+ export function noSmudgeEnv(env) {
73
+ return { ...(env ?? process.env), GIT_LFS_SKIP_SMUDGE: '1' };
74
+ }
75
+ /**
76
+ * Fetch the arbiter's `main` into `<arbiter>/main` and return its tip: the
77
+ * phase's `baseSha`. The lock phase classifies against THIS tip, never the
78
+ * run's `github.sha` (a queued run may start hours after its dispatch).
79
+ */
80
+ export async function fetchArbiterMain(params) {
81
+ const { cwd, arbiter, env } = params;
82
+ await gitAsyncHard([
83
+ 'fetch',
84
+ '--quiet',
85
+ '--no-tags',
86
+ arbiter,
87
+ `+refs/heads/main:refs/remotes/${arbiter}/main`,
88
+ ], cwd, env);
89
+ return (await gitAsyncHard(['rev-parse', '--verify', `refs/remotes/${arbiter}/main^{commit}`], cwd, env)).trim();
90
+ }
91
+ /**
92
+ * Run `fn` with a throwaway, detached worktree of `baseSha` (LFS smudging off),
93
+ * removed afterwards. The lock phase reads the ledger (the item's folder, its
94
+ * frontmatter, its sidecar) from here, so a checkout behind the arbiter cannot
95
+ * make it act on stale state. Only files are read: no repository code runs.
96
+ */
97
+ export async function withBaseWorktree(params, fn) {
98
+ const { cwd, baseSha } = params;
99
+ const env = noSmudgeEnv(params.env);
100
+ const parent = mkdtempSync(join(tmpdir(), 'dorfl-base-'));
101
+ const dir = join(parent, 'tree');
102
+ await gitAsyncHard(['worktree', 'add', '--quiet', '--detach', dir, baseSha], cwd, env);
103
+ try {
104
+ return await fn(dir);
105
+ }
106
+ finally {
107
+ await runAsync('git', ['worktree', 'remove', '--force', dir], cwd, { env });
108
+ rmSync(parent, { recursive: true, force: true });
109
+ await runAsync('git', ['worktree', 'prune'], cwd, { env });
110
+ }
111
+ }
112
+ /** The sha of `ref` on the arbiter (`git ls-remote`, read-only), or `undefined`. */
113
+ export async function arbiterRefSha(params) {
114
+ const out = await gitAsyncHard(['ls-remote', params.arbiter, params.ref], params.cwd, params.env);
115
+ for (const line of out.split('\n')) {
116
+ const [sha, name] = line.split('\t');
117
+ if (name === params.ref && sha !== undefined && sha !== '')
118
+ return sha;
119
+ }
120
+ return undefined;
121
+ }
122
+ /** The item's lock ref sha on the arbiter (read-only), or `undefined` when released. */
123
+ export function arbiterLockSha(params) {
124
+ return arbiterRefSha({
125
+ ...params,
126
+ ref: itemLockRef(lockEntryFor(params.item)),
127
+ });
128
+ }
129
+ /**
130
+ * The lock-ownership rule (spec §8): does the item's lock ref on the arbiter
131
+ * still equal `lockSha`, the sha the lock job produced? Read-only. The lock
132
+ * `holder` is the same bot for every CI run, so the sha is what tells runs
133
+ * apart. When it does not match, the message carries the retry instruction.
134
+ */
135
+ export async function checkLockOwnership(params) {
136
+ const current = await arbiterLockSha(params);
137
+ if (current === params.lockSha)
138
+ return { owned: true };
139
+ const now = current === undefined ? 'is released' : `now points at ${current}`;
140
+ return {
141
+ owned: false,
142
+ current,
143
+ message: `the lock of ${params.item} ${now}, not the lock job's ` +
144
+ `${params.lockSha}. ${STALE_LOCK_RETRY_HINT}`,
145
+ };
146
+ }
147
+ /**
148
+ * Release the item's lock with a LEASE on `expectedSha`, the sha this phase last
149
+ * observed, so a phase never releases a lock another run holds now. Returns
150
+ * whether the ref was deleted (a lost lease leaves it untouched).
151
+ */
152
+ export async function releaseLockLeased(params) {
153
+ const ref = itemLockRef(lockEntryFor(params.item));
154
+ const del = await refWrite.deleteLockRef({
155
+ arbiter: params.arbiter,
156
+ ref,
157
+ expectedSha: params.expectedSha,
158
+ cwd: params.cwd,
159
+ env: params.env,
160
+ });
161
+ if (del.status === 0) {
162
+ await runAsync('git', ['update-ref', '-d', ref], params.cwd, {
163
+ env: params.env,
164
+ });
165
+ return { released: true, message: `released ${ref}` };
166
+ }
167
+ return {
168
+ released: false,
169
+ message: `the leased release of ${ref} was rejected: ${del.stderr.trim()}`,
170
+ };
171
+ }
172
+ /**
173
+ * Publish the lock phase's facts: append them to the `$GITHUB_OUTPUT` file when
174
+ * one is given, else print them (a local replay). The serializer refuses any
175
+ * value that is not a sha, an enum, a boolean, a bounded integer or a
176
+ * dorfl-derived name.
177
+ */
178
+ export function emitLockOutputs(facts, params) {
179
+ const lines = serializeLockOutputs(facts);
180
+ if (params.githubOutput !== undefined && params.githubOutput !== '') {
181
+ appendFileSync(params.githubOutput, lines);
182
+ }
183
+ else {
184
+ params.note(`lock outputs:\n${lines}`);
185
+ }
186
+ }
187
+ /**
188
+ * Read the lock outputs (given, or from {@link LOCK_OUTPUTS_ENV}) and require
189
+ * what an agent or apply phase needs: the lock was acquired, on `rung`, with a
190
+ * base and a lock sha. Throws {@link PhaseDriverError} otherwise.
191
+ */
192
+ export function requireHeldLock(params) {
193
+ const facts = params.lockOutputs ?? readLockOutputsFromEnv(params.env);
194
+ if (facts.acquired !== true) {
195
+ throw new PhaseDriverError('the lock job did not acquire the item (acquired != true); nothing to do');
196
+ }
197
+ if (facts.rung !== params.rung) {
198
+ throw new PhaseDriverError(`the lock job classified the rung ${String(facts.rung)}, not ${params.rung}`);
199
+ }
200
+ if (facts.baseSha === undefined || facts.lockSha === undefined) {
201
+ throw new PhaseDriverError('the lock outputs carry no baseSha or no lockSha');
202
+ }
203
+ return {
204
+ baseSha: facts.baseSha,
205
+ lockSha: facts.lockSha,
206
+ rung: facts.rung,
207
+ continueTip: facts.continueTip,
208
+ handoffName: facts.handoffName,
209
+ needsAgent: facts.needsAgent,
210
+ agentTimeoutMinutes: facts.agentTimeoutMinutes,
211
+ };
212
+ }
213
+ /** Control characters the handoff record refuses (all but tab, LF, CR). */
214
+ // eslint-disable-next-line no-control-regex
215
+ const HANDOFF_TEXT_CONTROL_RE = /[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/g;
216
+ /**
217
+ * Bound one free-text product for the handoff record: drop the control
218
+ * characters the record refuses (an agent's output may carry terminal escapes)
219
+ * and cut it to `maxChars`, marking the cut. The apply phase re-validates it;
220
+ * this only keeps a long but honest summary from failing the whole handoff.
221
+ */
222
+ export function boundHandoffText(text, maxChars) {
223
+ const clean = text.replace(HANDOFF_TEXT_CONTROL_RE, '');
224
+ if (clean.length <= maxChars)
225
+ return clean;
226
+ const marker = '\n\n[truncated by dorfl for the CI handoff]';
227
+ return clean.slice(0, Math.max(0, maxChars - marker.length)) + marker;
228
+ }
229
+ /**
230
+ * The `$RUNNER_TEMP` the apply phase reads the artifact under (the handoff
231
+ * reader refuses a directory outside it).
232
+ */
233
+ export function runnerTempFrom(given, env) {
234
+ const dir = given ?? env.RUNNER_TEMP;
235
+ if (dir === undefined || dir === '') {
236
+ throw new PhaseDriverError('RUNNER_TEMP is not set (the apply phase reads the handoff only from under it)');
237
+ }
238
+ return dir;
239
+ }
240
+ /**
241
+ * The repository config committed at `baseSha` (`dorfl.json`, else the legacy
242
+ * dotfile): the trusted config a phase acts on, never the checkout's or a
243
+ * bundle's. `undefined` when neither file exists or the first one found does
244
+ * not parse.
245
+ */
246
+ export function repoConfigAt(cwd, baseSha, env) {
247
+ for (const name of [REPO_CONFIG_FILENAME, REPO_CONFIG_FILENAME_LEGACY]) {
248
+ const r = run('git', ['cat-file', 'blob', `${baseSha}:${name}`], cwd, {
249
+ env,
250
+ });
251
+ if (r.status !== 0)
252
+ continue;
253
+ try {
254
+ return loadRepoConfigFromContent(r.stdout, `${baseSha}:${name}`).config;
255
+ }
256
+ catch {
257
+ return undefined;
258
+ }
259
+ }
260
+ return undefined;
261
+ }
262
+ /**
263
+ * The agent job's timeout in minutes, as the lock phase publishes it
264
+ * (`agentTimeoutMinutes`): today's `agentDeadlineMinutes +
265
+ * checkpointHeadroomMinutes`, each read from the config at `baseSha` and falling
266
+ * back to its default (60 and 30) when absent or outside its valid range
267
+ * ([1, 240] and [10, 60]).
268
+ */
269
+ export function agentTimeoutMinutesAt(cwd, baseSha, env) {
270
+ const config = repoConfigAt(cwd, baseSha, env) ?? {};
271
+ const pick = (v, min, max, fallback) => typeof v === 'number' && Number.isInteger(v) && v >= min && v <= max
272
+ ? v
273
+ : fallback;
274
+ return (pick(config.agentDeadlineMinutes, 1, 240, DEFAULT_CONFIG.agentDeadlineMinutes) +
275
+ pick(config.checkpointHeadroomMinutes, 10, 60, DEFAULT_CONFIG.checkpointHeadroomMinutes));
276
+ }
277
+ /**
278
+ * Decide what the apply phase does with the agent job's result (decision 5),
279
+ * BEFORE any artifact is read. For `cancelled` it reads the agent job from the
280
+ * Actions API with `GITHUB_TOKEN` (or the injected `api`) to tell a timeout from
281
+ * a real cancel. `agentTimeoutMinutes` is the trusted lock output
282
+ * (`--agent-timeout-minutes`, else the lock outputs), never the artifact's.
283
+ * Nothing it reads from the API is ever printed.
284
+ */
285
+ export function resolveAgentResult(params) {
286
+ return decideAgentResult({
287
+ result: params.result,
288
+ needsAgent: params.held.needsAgent,
289
+ detectTimeout: () => detectAgentTimeout({
290
+ get: params.api ?? githubTokenApiGet(params.env),
291
+ run: actionsRunRefFromEnv(params.env),
292
+ agentTimeoutMinutes: params.agentTimeoutMinutes ?? params.held.agentTimeoutMinutes,
293
+ }),
294
+ });
295
+ }
296
+ /**
297
+ * Run a shared lock acquire whose refusal is BOTH noted and returned as its
298
+ * `message`, which the phase returns as its result line and the CLI prints:
299
+ * its notes are held back until it returns, then every one is passed on except
300
+ * a refusal's own message, so that line appears once in the job log (task
301
+ * `ci-phase-logs-each-line-once`). An acquire is one short arbiter round trip,
302
+ * so holding its notes back does not delay the log noticeably.
303
+ */
304
+ export async function acquireNotingOnce(note, acquire) {
305
+ const held = [];
306
+ const result = await acquire((m) => held.push(m));
307
+ for (const m of held) {
308
+ if (result.exitCode === 0 || m !== result.message)
309
+ note(m);
310
+ }
311
+ return result;
312
+ }
313
+ /**
314
+ * Push the validated handoff's Git LFS objects to the arbiter (decision 6),
315
+ * the apply phase's FIRST write: before any ref of any intent (a continue push,
316
+ * the land's pushes, a WIP branch save), so a ref never lands pointing at a
317
+ * missing object. Pushed from the apply checkout of the trusted base, so
318
+ * `.lfsconfig` and the endpoint come from main. The caller surfaces the item on
319
+ * a failure (`rejected` when an object broke a handoff rule).
320
+ */
321
+ export async function pushHandoffLfs(params) {
322
+ const { cwd, arbiter, objects, env, note } = params;
323
+ if (objects.length === 0)
324
+ return { ok: true };
325
+ let pushed;
326
+ try {
327
+ pushed = await pushLfsObjects({ cwd, arbiter, objects, env });
328
+ }
329
+ catch (err) {
330
+ if (!(err instanceof HandoffRejected))
331
+ throw err;
332
+ note(err.message);
333
+ return { ok: false, rejected: true, reason: err.message };
334
+ }
335
+ if (pushed.status !== 0) {
336
+ const reason = `the ${objects.length} Git LFS object(s) of the handoff ` +
337
+ `could not be pushed to ${arbiter} (${pushed.stderr.trim().slice(0, 500)}), ` +
338
+ 'so no branch of the work was pushed';
339
+ note(reason);
340
+ return { ok: false, rejected: false, reason };
341
+ }
342
+ note(`pushed ${objects.length} Git LFS object(s) to ${arbiter}`);
343
+ return { ok: true };
344
+ }
345
+ /**
346
+ * The done-move source folder of the task AT `baseSha` (trusted), which picks
347
+ * the land half's ledger reconcile arms exactly as the agent's `complete` did.
348
+ */
349
+ export function taskSourceAtBase(cwd, baseSha, slug, env) {
350
+ const folders = ['tasks-ready', 'tasks-backlog', 'done'];
351
+ for (const folder of folders) {
352
+ const spec = `${baseSha}:${workItemRel(folder, `${slug}.md`)}`;
353
+ try {
354
+ git(['cat-file', '-e', spec], cwd, { env });
355
+ return folder;
356
+ }
357
+ catch {
358
+ // not in this folder
359
+ }
360
+ }
361
+ return 'tasks-ready';
362
+ }
363
+ async function gitAsyncHard(args, cwd, env) {
364
+ const r = await runAsync('git', args, cwd, { env });
365
+ if (r.status !== 0) {
366
+ throw new Error(`git ${args.join(' ')} failed (exit ${r.status}): ${r.stderr.trim()}`);
367
+ }
368
+ return r.stdout;
369
+ }
370
+ //# sourceMappingURL=ci-phase-driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci-phase-driver.js","sourceRoot":"","sources":["../src/ci-phase-driver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,172 @@
1
+ /**
2
+ * **The intake path split into the three CI phases** (spec
3
+ * `ci-agent-job-without-write-token` §3 intake row, ADR
4
+ * `ci-agent-job-holds-no-write-token`, task `ci-split-intake`).
5
+ *
6
+ * `intake <N> --phase` runs ONE of three halves of the one intake pipeline
7
+ * (`intake.ts`: {@link decideIntake} is the agent half, {@link applyIntakeDecision}
8
+ * / {@link emitIntakeDocument} the write half), never a second implementation.
9
+ * The item is `issue:<N>`; its lock is the `processing` LABEL, not a lock ref.
10
+ *
11
+ * - **lock** ({@link performIntakeLockPhase}): fetch `<arbiter>/main` (its tip
12
+ * is `baseSha`); read the issue, its comments and its labels; take the
13
+ * `processing` label (the provider creates it on a fresh repository); run
14
+ * the deterministic triage (a skip needs no agent: `needsAgent: false`);
15
+ * derive the origin trust from the event (`comment.author_association`, else
16
+ * `issue.author_association`, as `intake.yml` does) and the document mode
17
+ * (`intakeIntegration ?? integration` from the config at `baseSha`); publish
18
+ * them with `seenCommentIds`, every comment id it read. No agent, no
19
+ * repository code.
20
+ * - **agent** ({@link performIntakeAgentPhase}): read the issue with the read
21
+ * token, but give the decision agent ONLY the comments whose ids are in
22
+ * `seenCommentIds` (a comment posted after the lock is neither read nor
23
+ * marked seen); run the decision agent and the lone-task review rounds; hand
24
+ * over the verdict (`intake-ask`, `intake-bounce`, `intake-task`,
25
+ * `intake-spec`) carrying only the record fields the intent table allows. Any
26
+ * failure writes no handoff and fails the job.
27
+ * - **apply** ({@link performIntakeApplyPhase}): refuse to write when the label
28
+ * is gone (a re-run of a finished run); act on the agent job's result first
29
+ * (anything but `success` never reads the handoff: remove the label, post
30
+ * nothing); validate the handoff as hostile; for a document, RECOMPUTE the
31
+ * slug (`slug-safety.ts`), the placement, the origin-trust stamp and the mode
32
+ * from trusted inputs, render the document with the title YAML-quoted and
33
+ * re-parse it to prove the stamp survived, then integrate
34
+ * (`performIntegration`, PR or merge with the CAS loop) and post the
35
+ * completion comment. The marker's `seen=` is `seenCommentIds`. The label is
36
+ * ALWAYS removed.
37
+ */
38
+ import { type HandoffIntentKind, type HandoffRecord } from './ci-handoff-format.js';
39
+ import { type LockOutputs } from './ci-lock-outputs.js';
40
+ import type { AgentJobResult } from './ci-agent-result.js';
41
+ import type { IntegrationMode } from './config.js';
42
+ import { type OriginTrust } from './frontmatter.js';
43
+ import { type IntakeDecision, type IntakeDocumentDecision, type PerformIntakeOptions } from './intake.js';
44
+ import type { Phase } from './phase.js';
45
+ /** Options of an intake phase run: the `intake` options plus the phase inputs. */
46
+ export interface IntakePhaseOptions extends PerformIntakeOptions {
47
+ /** Which of the three jobs this process is. */
48
+ phase: Phase;
49
+ /**
50
+ * The handoff directory: the agent phase writes the artifact here (empty or
51
+ * absent); the apply phase reads it (under {@link runnerTemp}).
52
+ */
53
+ handoffDir?: string;
54
+ /** `$RUNNER_TEMP` (the apply phase); defaults to the env's. */
55
+ runnerTemp?: string;
56
+ /** The lock job's outputs (agent / apply); defaults to `DORFL_LOCK_OUTPUTS`. */
57
+ lockOutputs?: LockOutputs;
58
+ /** `github.run_attempt` (names the artifact); default the env's, else 1. */
59
+ runAttempt?: string;
60
+ /** The `$GITHUB_OUTPUT` file the lock phase appends to; default the env's. */
61
+ githubOutput?: string;
62
+ /**
63
+ * lock: the event payload file (`$GITHUB_EVENT_PATH`) the origin trust is
64
+ * read from; default the env's. A called workflow sees its caller's event.
65
+ */
66
+ eventPath?: string;
67
+ /**
68
+ * apply: `needs.agent.result` (`--agent-result`), REQUIRED. Only `success`
69
+ * reads the handoff.
70
+ */
71
+ agentResult?: AgentJobResult;
72
+ /** The merge-mode CAS-loop jitter (tests pass 0). */
73
+ mergeJitterMs?: number;
74
+ }
75
+ /** How an intake phase run ended. */
76
+ export type IntakePhaseOutcome =
77
+ /** lock: the label is taken and the agent runs next. */
78
+ 'locked'
79
+ /** lock: the triage skipped (label taken, `needsAgent: false`). */
80
+ | 'no-new-input' | 'already-terminal'
81
+ /** lock: another run holds the label; nothing was written. */
82
+ | 'backed-off'
83
+ /** lock: the label could not be read or taken. */
84
+ | 'lock-failed'
85
+ /** agent: the handoff was written (see `intent`). */
86
+ | 'handed-over'
87
+ /** agent / apply: nothing to do (the lock job's triage skipped). */
88
+ | 'no-op'
89
+ /** apply: the label is gone (a finished run re-run); nothing was written. */
90
+ | 'stale-lock'
91
+ /** apply: the agent job did not succeed; the label was removed, nothing posted. */
92
+ | 'released'
93
+ /** apply: the handoff broke a rule; the label was removed, nothing posted. */
94
+ | 'rejected'
95
+ /** apply: the write half's outcomes (as the laptop `intake`). */
96
+ | 'asked' | 'bounced' | 'tasked' | 'spec-written' | 'stale'
97
+ /** agent: the decision or the review failed (no handoff; the job fails). */
98
+ | 'agent-failed'
99
+ /** A usage or environment problem. */
100
+ | 'usage-error';
101
+ /** The result of one intake phase run. */
102
+ export interface IntakePhaseResult {
103
+ /** See "A handled outcome is green" in `ci-phase-driver.ts`. */
104
+ exitCode: 0 | 1 | 4;
105
+ outcome: IntakePhaseOutcome;
106
+ issueNumber: number;
107
+ /**
108
+ * The result line: the CLI prints it (`>> ` or `error: `), so the phase does
109
+ * NOT also `note` it (each line appears once in the job log).
110
+ */
111
+ message: string;
112
+ /** lock: the facts published. */
113
+ lockOutputs?: LockOutputs;
114
+ /** agent: the handed-over intent kind. */
115
+ intent?: HandoffIntentKind;
116
+ /** apply: the emitted document (task / spec). */
117
+ emitted?: string;
118
+ emittedSlug?: string;
119
+ }
120
+ /**
121
+ * Run one phase of the intake path. The CLI calls this for `intake <N> --phase`.
122
+ */
123
+ export declare function performIntakePhase(options: IntakePhaseOptions): Promise<IntakePhaseResult>;
124
+ /**
125
+ * The origin trust from the event payload at `eventPath`: the COMMENT's
126
+ * `author_association` on an `issue_comment` event, else the ISSUE's (the rule
127
+ * `intake.yml` applies), classified by {@link isAuthorTrusted}. A payload that
128
+ * is missing, unreadable, or about another issue gives `untrusted` (the
129
+ * fail-safe side of a public front door).
130
+ */
131
+ export declare function originTrustFromEvent(eventPath: string | undefined, issueNumber: number): OriginTrust;
132
+ /**
133
+ * The intake document mode from the repository config AT `baseSha`:
134
+ * `intakeIntegration ?? integration`, else `propose` (the conservative
135
+ * default). Never read from the agent job.
136
+ */
137
+ export declare function intakeDocumentModeAt(cwd: string, baseSha: string, env: NodeJS.ProcessEnv | undefined): IntegrationMode;
138
+ /**
139
+ * The lock phase: read the issue, its thread and its labels, take the
140
+ * `processing` label, run the deterministic triage and publish the trusted
141
+ * facts. Runs no agent and no repository code. Every fact is checked BEFORE the
142
+ * label is taken, so a refused output never leaves the label behind.
143
+ */
144
+ export declare function performIntakeLockPhase(options: IntakePhaseOptions): Promise<IntakePhaseResult>;
145
+ /**
146
+ * The handoff record of a decision: only the fields the intent table allows,
147
+ * each bounded to its limit. A task / spec carries its title and body (and a
148
+ * spec its two gate booleans), never a slug, a path, a stamp or a mode.
149
+ */
150
+ export declare function intakeHandoffRecord(issueNumber: number, decision: IntakeDecision): HandoffRecord;
151
+ /**
152
+ * The agent phase: read the issue (read token) and ONLY the comments the lock
153
+ * job read, run the decision agent and the lone-task review, and write the
154
+ * handoff. Writes nothing anywhere else. Any failure writes no handoff and
155
+ * fails the job, so the apply job removes the label and posts nothing.
156
+ */
157
+ export declare function performIntakeAgentPhase(options: IntakePhaseOptions): Promise<IntakePhaseResult>;
158
+ /**
159
+ * The document a `intake-task` / `intake-spec` record describes, with the slug
160
+ * RECOMPUTED from its title (`paramCase`, then `slug-safety.ts`). Throws
161
+ * {@link HandoffRejected} for a title that is not one line or holds a control
162
+ * character, or that leaves no safe slug.
163
+ */
164
+ export declare function intakeDocumentFromRecord(record: HandoffRecord): IntakeDocumentDecision;
165
+ /**
166
+ * The apply phase: check the label is still held, act on the agent job's
167
+ * result, validate the handoff as hostile, then resume at the write half with
168
+ * every target, stamp and mode from trusted inputs. Runs no agent and no
169
+ * repository code. The label is ALWAYS removed once the check passed.
170
+ */
171
+ export declare function performIntakeApplyPhase(options: IntakePhaseOptions): Promise<IntakePhaseResult>;
172
+ //# sourceMappingURL=ci-phase-intake.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci-phase-intake.d.ts","sourceRoot":"","sources":["../src/ci-phase-intake.ts"],"names":[],"mappings":"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"}