dorfl 0.0.0 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (619) hide show
  1. package/dist/advance-ci-template.d.ts +73 -0
  2. package/dist/advance-ci-template.d.ts.map +1 -0
  3. package/dist/advance-ci-template.js +104 -0
  4. package/dist/advance-ci-template.js.map +1 -0
  5. package/dist/advance-classify.d.ts +132 -0
  6. package/dist/advance-classify.d.ts.map +1 -0
  7. package/dist/advance-classify.js +120 -0
  8. package/dist/advance-classify.js.map +1 -0
  9. package/dist/advance-drivers.d.ts +182 -0
  10. package/dist/advance-drivers.d.ts.map +1 -0
  11. package/dist/advance-drivers.js +231 -0
  12. package/dist/advance-drivers.js.map +1 -0
  13. package/dist/advance-isolated.d.ts +156 -0
  14. package/dist/advance-isolated.d.ts.map +1 -0
  15. package/dist/advance-isolated.js +256 -0
  16. package/dist/advance-isolated.js.map +1 -0
  17. package/dist/advance-lifecycle-template.d.ts +107 -0
  18. package/dist/advance-lifecycle-template.d.ts.map +1 -0
  19. package/dist/advance-lifecycle-template.js +668 -0
  20. package/dist/advance-lifecycle-template.js.map +1 -0
  21. package/dist/advance-loop-driver.d.ts +325 -0
  22. package/dist/advance-loop-driver.d.ts.map +1 -0
  23. package/dist/advance-loop-driver.js +437 -0
  24. package/dist/advance-loop-driver.js.map +1 -0
  25. package/dist/advance-treeless-publish.d.ts +108 -0
  26. package/dist/advance-treeless-publish.d.ts.map +1 -0
  27. package/dist/advance-treeless-publish.js +71 -0
  28. package/dist/advance-treeless-publish.js.map +1 -0
  29. package/dist/advance.d.ts +340 -0
  30. package/dist/advance.d.ts.map +1 -0
  31. package/dist/advance.js +1122 -0
  32. package/dist/advance.js.map +1 -0
  33. package/dist/advancing-lock.d.ts +294 -0
  34. package/dist/advancing-lock.d.ts.map +1 -0
  35. package/dist/advancing-lock.js +594 -0
  36. package/dist/advancing-lock.js.map +1 -0
  37. package/dist/agent-launch.d.ts +79 -0
  38. package/dist/agent-launch.d.ts.map +1 -0
  39. package/dist/agent-launch.js +61 -0
  40. package/dist/agent-launch.js.map +1 -0
  41. package/dist/agent-stop.d.ts +149 -0
  42. package/dist/agent-stop.d.ts.map +1 -0
  43. package/dist/agent-stop.js +307 -0
  44. package/dist/agent-stop.js.map +1 -0
  45. package/dist/apply-decide.d.ts +127 -0
  46. package/dist/apply-decide.d.ts.map +1 -0
  47. package/dist/apply-decide.js +176 -0
  48. package/dist/apply-decide.js.map +1 -0
  49. package/dist/apply-merge-action.d.ts +206 -0
  50. package/dist/apply-merge-action.d.ts.map +1 -0
  51. package/dist/apply-merge-action.js +307 -0
  52. package/dist/apply-merge-action.js.map +1 -0
  53. package/dist/apply-persist.d.ts +174 -0
  54. package/dist/apply-persist.d.ts.map +1 -0
  55. package/dist/apply-persist.js +359 -0
  56. package/dist/apply-persist.js.map +1 -0
  57. package/dist/arbiter.d.ts +120 -0
  58. package/dist/arbiter.d.ts.map +1 -0
  59. package/dist/arbiter.js +255 -0
  60. package/dist/arbiter.js.map +1 -0
  61. package/dist/brand.d.ts +70 -0
  62. package/dist/brand.d.ts.map +1 -0
  63. package/dist/brand.js +84 -0
  64. package/dist/brand.js.map +1 -0
  65. package/dist/buildable-body.d.ts +132 -0
  66. package/dist/buildable-body.d.ts.map +1 -0
  67. package/dist/buildable-body.js +131 -0
  68. package/dist/buildable-body.js.map +1 -0
  69. package/dist/categorise.d.ts +66 -0
  70. package/dist/categorise.d.ts.map +1 -0
  71. package/dist/categorise.js +106 -0
  72. package/dist/categorise.js.map +1 -0
  73. package/dist/claim-cas.d.ts +117 -0
  74. package/dist/claim-cas.d.ts.map +1 -0
  75. package/dist/claim-cas.js +312 -0
  76. package/dist/claim-cas.js.map +1 -0
  77. package/dist/cli-spinner.d.ts +112 -0
  78. package/dist/cli-spinner.d.ts.map +1 -0
  79. package/dist/cli-spinner.js +157 -0
  80. package/dist/cli-spinner.js.map +1 -0
  81. package/dist/cli.d.ts +11 -0
  82. package/dist/cli.d.ts.map +1 -0
  83. package/dist/cli.js +3094 -0
  84. package/dist/cli.js.map +1 -0
  85. package/dist/close-job-template.d.ts +70 -0
  86. package/dist/close-job-template.d.ts.map +1 -0
  87. package/dist/close-job-template.js +180 -0
  88. package/dist/close-job-template.js.map +1 -0
  89. package/dist/close-job.d.ts +95 -0
  90. package/dist/close-job.d.ts.map +1 -0
  91. package/dist/close-job.js +226 -0
  92. package/dist/close-job.js.map +1 -0
  93. package/dist/complete.d.ts +361 -0
  94. package/dist/complete.d.ts.map +1 -0
  95. package/dist/complete.js +885 -0
  96. package/dist/complete.js.map +1 -0
  97. package/dist/concurrency.d.ts +68 -0
  98. package/dist/concurrency.d.ts.map +1 -0
  99. package/dist/concurrency.js +112 -0
  100. package/dist/concurrency.js.map +1 -0
  101. package/dist/config-override.d.ts +76 -0
  102. package/dist/config-override.d.ts.map +1 -0
  103. package/dist/config-override.js +50 -0
  104. package/dist/config-override.js.map +1 -0
  105. package/dist/config.d.ts +668 -0
  106. package/dist/config.d.ts.map +1 -0
  107. package/dist/config.js +241 -0
  108. package/dist/config.js.map +1 -0
  109. package/dist/continue-branch.d.ts +249 -0
  110. package/dist/continue-branch.d.ts.map +1 -0
  111. package/dist/continue-branch.js +389 -0
  112. package/dist/continue-branch.js.map +1 -0
  113. package/dist/cwd-section.d.ts +186 -0
  114. package/dist/cwd-section.d.ts.map +1 -0
  115. package/dist/cwd-section.js +209 -0
  116. package/dist/cwd-section.js.map +1 -0
  117. package/dist/decision-engine.d.ts +170 -0
  118. package/dist/decision-engine.d.ts.map +1 -0
  119. package/dist/decision-engine.js +136 -0
  120. package/dist/decision-engine.js.map +1 -0
  121. package/dist/detect.d.ts +17 -0
  122. package/dist/detect.d.ts.map +1 -0
  123. package/dist/detect.js +118 -0
  124. package/dist/detect.js.map +1 -0
  125. package/dist/do-autopick.d.ts +85 -0
  126. package/dist/do-autopick.d.ts.map +1 -0
  127. package/dist/do-autopick.js +112 -0
  128. package/dist/do-autopick.js.map +1 -0
  129. package/dist/do-config.d.ts +312 -0
  130. package/dist/do-config.d.ts.map +1 -0
  131. package/dist/do-config.js +358 -0
  132. package/dist/do-config.js.map +1 -0
  133. package/dist/do-remote-auto.d.ts +75 -0
  134. package/dist/do-remote-auto.d.ts.map +1 -0
  135. package/dist/do-remote-auto.js +111 -0
  136. package/dist/do-remote-auto.js.map +1 -0
  137. package/dist/do.d.ts +621 -0
  138. package/dist/do.d.ts.map +1 -0
  139. package/dist/do.js +1882 -0
  140. package/dist/do.js.map +1 -0
  141. package/dist/drop-source.d.ts +96 -0
  142. package/dist/drop-source.d.ts.map +1 -0
  143. package/dist/drop-source.js +91 -0
  144. package/dist/drop-source.js.map +1 -0
  145. package/dist/eligibility.d.ts +46 -0
  146. package/dist/eligibility.d.ts.map +1 -0
  147. package/dist/eligibility.js +34 -0
  148. package/dist/eligibility.js.map +1 -0
  149. package/dist/env-config.d.ts +51 -0
  150. package/dist/env-config.d.ts.map +1 -0
  151. package/dist/env-config.js +272 -0
  152. package/dist/env-config.js.map +1 -0
  153. package/dist/failure-cause.d.ts +70 -0
  154. package/dist/failure-cause.d.ts.map +1 -0
  155. package/dist/failure-cause.js +126 -0
  156. package/dist/failure-cause.js.map +1 -0
  157. package/dist/format.d.ts +43 -0
  158. package/dist/format.d.ts.map +1 -0
  159. package/dist/format.js +256 -0
  160. package/dist/format.js.map +1 -0
  161. package/dist/frontmatter.d.ts +215 -0
  162. package/dist/frontmatter.d.ts.map +1 -0
  163. package/dist/frontmatter.js +345 -0
  164. package/dist/frontmatter.js.map +1 -0
  165. package/dist/gate-readiness.d.ts +84 -0
  166. package/dist/gate-readiness.d.ts.map +1 -0
  167. package/dist/gate-readiness.js +103 -0
  168. package/dist/gate-readiness.js.map +1 -0
  169. package/dist/gc.d.ts +165 -0
  170. package/dist/gc.d.ts.map +1 -0
  171. package/dist/gc.js +313 -0
  172. package/dist/gc.js.map +1 -0
  173. package/dist/gh-failure.d.ts +42 -0
  174. package/dist/gh-failure.d.ts.map +1 -0
  175. package/dist/gh-failure.js +49 -0
  176. package/dist/gh-failure.js.map +1 -0
  177. package/dist/git.d.ts +75 -0
  178. package/dist/git.d.ts.map +1 -0
  179. package/dist/git.js +130 -0
  180. package/dist/git.js.map +1 -0
  181. package/dist/github.d.ts +187 -0
  182. package/dist/github.d.ts.map +1 -0
  183. package/dist/github.js +343 -0
  184. package/dist/github.js.map +1 -0
  185. package/dist/harness.d.ts +242 -0
  186. package/dist/harness.d.ts.map +1 -0
  187. package/dist/harness.js +157 -0
  188. package/dist/harness.js.map +1 -0
  189. package/dist/identity.d.ts +167 -0
  190. package/dist/identity.d.ts.map +1 -0
  191. package/dist/identity.js +231 -0
  192. package/dist/identity.js.map +1 -0
  193. package/dist/index.d.ts +147 -0
  194. package/dist/index.d.ts.map +1 -0
  195. package/dist/index.js +76 -0
  196. package/dist/index.js.map +1 -0
  197. package/dist/install-ci-branch-protection.d.ts +147 -0
  198. package/dist/install-ci-branch-protection.d.ts.map +1 -0
  199. package/dist/install-ci-branch-protection.js +166 -0
  200. package/dist/install-ci-branch-protection.js.map +1 -0
  201. package/dist/install-ci-capabilities/advance-lifecycle.d.ts +15 -0
  202. package/dist/install-ci-capabilities/advance-lifecycle.d.ts.map +1 -0
  203. package/dist/install-ci-capabilities/advance-lifecycle.js +28 -0
  204. package/dist/install-ci-capabilities/advance-lifecycle.js.map +1 -0
  205. package/dist/install-ci-capabilities/close-job.d.ts +13 -0
  206. package/dist/install-ci-capabilities/close-job.d.ts.map +1 -0
  207. package/dist/install-ci-capabilities/close-job.js +26 -0
  208. package/dist/install-ci-capabilities/close-job.js.map +1 -0
  209. package/dist/install-ci-capabilities/example-noop.d.ts +16 -0
  210. package/dist/install-ci-capabilities/example-noop.d.ts.map +1 -0
  211. package/dist/install-ci-capabilities/example-noop.js +23 -0
  212. package/dist/install-ci-capabilities/example-noop.js.map +1 -0
  213. package/dist/install-ci-capabilities/intake.d.ts +15 -0
  214. package/dist/install-ci-capabilities/intake.d.ts.map +1 -0
  215. package/dist/install-ci-capabilities/intake.js +28 -0
  216. package/dist/install-ci-capabilities/intake.js.map +1 -0
  217. package/dist/install-ci-capabilities/verify.d.ts +14 -0
  218. package/dist/install-ci-capabilities/verify.d.ts.map +1 -0
  219. package/dist/install-ci-capabilities/verify.js +27 -0
  220. package/dist/install-ci-capabilities/verify.js.map +1 -0
  221. package/dist/install-ci-core.d.ts +446 -0
  222. package/dist/install-ci-core.d.ts.map +1 -0
  223. package/dist/install-ci-core.js +760 -0
  224. package/dist/install-ci-core.js.map +1 -0
  225. package/dist/install-ci-github.d.ts +167 -0
  226. package/dist/install-ci-github.d.ts.map +1 -0
  227. package/dist/install-ci-github.js +315 -0
  228. package/dist/install-ci-github.js.map +1 -0
  229. package/dist/install-ci.d.ts +105 -0
  230. package/dist/install-ci.d.ts.map +1 -0
  231. package/dist/install-ci.js +363 -0
  232. package/dist/install-ci.js.map +1 -0
  233. package/dist/intake-event.d.ts +88 -0
  234. package/dist/intake-event.d.ts.map +1 -0
  235. package/dist/intake-event.js +66 -0
  236. package/dist/intake-event.js.map +1 -0
  237. package/dist/intake-marker.d.ts +95 -0
  238. package/dist/intake-marker.d.ts.map +1 -0
  239. package/dist/intake-marker.js +127 -0
  240. package/dist/intake-marker.js.map +1 -0
  241. package/dist/intake-triage.d.ts +48 -0
  242. package/dist/intake-triage.d.ts.map +1 -0
  243. package/dist/intake-triage.js +95 -0
  244. package/dist/intake-triage.js.map +1 -0
  245. package/dist/intake-trigger-template.d.ts +185 -0
  246. package/dist/intake-trigger-template.d.ts.map +1 -0
  247. package/dist/intake-trigger-template.js +449 -0
  248. package/dist/intake-trigger-template.js.map +1 -0
  249. package/dist/intake.d.ts +569 -0
  250. package/dist/intake.d.ts.map +1 -0
  251. package/dist/intake.js +1628 -0
  252. package/dist/intake.js.map +1 -0
  253. package/dist/integration-core.d.ts +539 -0
  254. package/dist/integration-core.d.ts.map +1 -0
  255. package/dist/integration-core.js +2195 -0
  256. package/dist/integration-core.js.map +1 -0
  257. package/dist/integrator.d.ts +343 -0
  258. package/dist/integrator.d.ts.map +1 -0
  259. package/dist/integrator.js +400 -0
  260. package/dist/integrator.js.map +1 -0
  261. package/dist/isolation.d.ts +219 -0
  262. package/dist/isolation.d.ts.map +1 -0
  263. package/dist/isolation.js +261 -0
  264. package/dist/isolation.js.map +1 -0
  265. package/dist/issue-provider.d.ts +349 -0
  266. package/dist/issue-provider.d.ts.map +1 -0
  267. package/dist/issue-provider.js +360 -0
  268. package/dist/issue-provider.js.map +1 -0
  269. package/dist/item-lock.d.ts +626 -0
  270. package/dist/item-lock.d.ts.map +1 -0
  271. package/dist/item-lock.js +1381 -0
  272. package/dist/item-lock.js.map +1 -0
  273. package/dist/item-path.d.ts +49 -0
  274. package/dist/item-path.d.ts.map +1 -0
  275. package/dist/item-path.js +66 -0
  276. package/dist/item-path.js.map +1 -0
  277. package/dist/ledger-lint.d.ts +129 -0
  278. package/dist/ledger-lint.d.ts.map +1 -0
  279. package/dist/ledger-lint.js +249 -0
  280. package/dist/ledger-lint.js.map +1 -0
  281. package/dist/ledger-read.d.ts +357 -0
  282. package/dist/ledger-read.d.ts.map +1 -0
  283. package/dist/ledger-read.js +442 -0
  284. package/dist/ledger-read.js.map +1 -0
  285. package/dist/ledger-write.d.ts +330 -0
  286. package/dist/ledger-write.d.ts.map +1 -0
  287. package/dist/ledger-write.js +411 -0
  288. package/dist/ledger-write.js.map +1 -0
  289. package/dist/lifecycle-gather.d.ts +30 -0
  290. package/dist/lifecycle-gather.d.ts.map +1 -0
  291. package/dist/lifecycle-gather.js +205 -0
  292. package/dist/lifecycle-gather.js.map +1 -0
  293. package/dist/lifecycle-pools.d.ts +180 -0
  294. package/dist/lifecycle-pools.d.ts.map +1 -0
  295. package/dist/lifecycle-pools.js +78 -0
  296. package/dist/lifecycle-pools.js.map +1 -0
  297. package/dist/merge-question-surfacer.d.ts +166 -0
  298. package/dist/merge-question-surfacer.d.ts.map +1 -0
  299. package/dist/merge-question-surfacer.js +297 -0
  300. package/dist/merge-question-surfacer.js.map +1 -0
  301. package/dist/mint-adr.d.ts +126 -0
  302. package/dist/mint-adr.d.ts.map +1 -0
  303. package/dist/mint-adr.js +257 -0
  304. package/dist/mint-adr.js.map +1 -0
  305. package/dist/mirror-pool-scan.d.ts +125 -0
  306. package/dist/mirror-pool-scan.d.ts.map +1 -0
  307. package/dist/mirror-pool-scan.js +104 -0
  308. package/dist/mirror-pool-scan.js.map +1 -0
  309. package/dist/needs-attention.d.ts +341 -0
  310. package/dist/needs-attention.d.ts.map +1 -0
  311. package/dist/needs-attention.js +900 -0
  312. package/dist/needs-attention.js.map +1 -0
  313. package/dist/orphan-sidecar.d.ts +79 -0
  314. package/dist/orphan-sidecar.d.ts.map +1 -0
  315. package/dist/orphan-sidecar.js +71 -0
  316. package/dist/orphan-sidecar.js.map +1 -0
  317. package/dist/output.d.ts +48 -0
  318. package/dist/output.d.ts.map +1 -0
  319. package/dist/output.js +66 -0
  320. package/dist/output.js.map +1 -0
  321. package/dist/pi-harness.d.ts +179 -0
  322. package/dist/pi-harness.d.ts.map +1 -0
  323. package/dist/pi-harness.js +342 -0
  324. package/dist/pi-harness.js.map +1 -0
  325. package/dist/placement.d.ts +99 -0
  326. package/dist/placement.d.ts.map +1 -0
  327. package/dist/placement.js +67 -0
  328. package/dist/placement.js.map +1 -0
  329. package/dist/prd-to-spec.d.ts +315 -0
  330. package/dist/prd-to-spec.d.ts.map +1 -0
  331. package/dist/prd-to-spec.js +684 -0
  332. package/dist/prd-to-spec.js.map +1 -0
  333. package/dist/prepare.d.ts +121 -0
  334. package/dist/prepare.d.ts.map +1 -0
  335. package/dist/prepare.js +140 -0
  336. package/dist/prepare.js.map +1 -0
  337. package/dist/prompt.d.ts +360 -0
  338. package/dist/prompt.d.ts.map +1 -0
  339. package/dist/prompt.js +499 -0
  340. package/dist/prompt.js.map +1 -0
  341. package/dist/protocol/ADR-FORMAT.md +47 -0
  342. package/dist/protocol/CLAIM-PROTOCOL.md +217 -0
  343. package/dist/protocol/REVIEW-PROTOCOL.md +119 -0
  344. package/dist/protocol/SURFACE-PROTOCOL.md +121 -0
  345. package/dist/protocol/TASKING-PROTOCOL.md +122 -0
  346. package/dist/protocol/WORK-CONTRACT.md +276 -0
  347. package/dist/protocol/spec-template.md +71 -0
  348. package/dist/protocol/task-template.md +65 -0
  349. package/dist/readiness.d.ts +66 -0
  350. package/dist/readiness.d.ts.map +1 -0
  351. package/dist/readiness.js +36 -0
  352. package/dist/readiness.js.map +1 -0
  353. package/dist/reap-branches.d.ts +102 -0
  354. package/dist/reap-branches.d.ts.map +1 -0
  355. package/dist/reap-branches.js +149 -0
  356. package/dist/reap-branches.js.map +1 -0
  357. package/dist/recover-isolated.d.ts +72 -0
  358. package/dist/recover-isolated.d.ts.map +1 -0
  359. package/dist/recover-isolated.js +188 -0
  360. package/dist/recover-isolated.js.map +1 -0
  361. package/dist/registry.d.ts +172 -0
  362. package/dist/registry.d.ts.map +1 -0
  363. package/dist/registry.js +296 -0
  364. package/dist/registry.js.map +1 -0
  365. package/dist/repo-config.d.ts +201 -0
  366. package/dist/repo-config.d.ts.map +1 -0
  367. package/dist/repo-config.js +414 -0
  368. package/dist/repo-config.js.map +1 -0
  369. package/dist/repo-key.d.ts +20 -0
  370. package/dist/repo-key.d.ts.map +1 -0
  371. package/dist/repo-key.js +68 -0
  372. package/dist/repo-key.js.map +1 -0
  373. package/dist/repo-mirror.d.ts +177 -0
  374. package/dist/repo-mirror.d.ts.map +1 -0
  375. package/dist/repo-mirror.js +271 -0
  376. package/dist/repo-mirror.js.map +1 -0
  377. package/dist/retry-backoff.d.ts +90 -0
  378. package/dist/retry-backoff.d.ts.map +1 -0
  379. package/dist/retry-backoff.js +98 -0
  380. package/dist/retry-backoff.js.map +1 -0
  381. package/dist/review-gate.d.ts +173 -0
  382. package/dist/review-gate.d.ts.map +1 -0
  383. package/dist/review-gate.js +261 -0
  384. package/dist/review-gate.js.map +1 -0
  385. package/dist/review-verdict.d.ts +149 -0
  386. package/dist/review-verdict.d.ts.map +1 -0
  387. package/dist/review-verdict.js +332 -0
  388. package/dist/review-verdict.js.map +1 -0
  389. package/dist/run.d.ts +221 -0
  390. package/dist/run.d.ts.map +1 -0
  391. package/dist/run.js +963 -0
  392. package/dist/run.js.map +1 -0
  393. package/dist/scan.d.ts +308 -0
  394. package/dist/scan.d.ts.map +1 -0
  395. package/dist/scan.js +374 -0
  396. package/dist/scan.js.map +1 -0
  397. package/dist/select-order.d.ts +75 -0
  398. package/dist/select-order.d.ts.map +1 -0
  399. package/dist/select-order.js +108 -0
  400. package/dist/select-order.js.map +1 -0
  401. package/dist/select-priority.d.ts +188 -0
  402. package/dist/select-priority.d.ts.map +1 -0
  403. package/dist/select-priority.js +80 -0
  404. package/dist/select-priority.js.map +1 -0
  405. package/dist/select.d.ts +25 -0
  406. package/dist/select.d.ts.map +1 -0
  407. package/dist/select.js +43 -0
  408. package/dist/select.js.map +1 -0
  409. package/dist/session-path.d.ts +36 -0
  410. package/dist/session-path.d.ts.map +1 -0
  411. package/dist/session-path.js +129 -0
  412. package/dist/session-path.js.map +1 -0
  413. package/dist/sidecar-apply.d.ts +83 -0
  414. package/dist/sidecar-apply.d.ts.map +1 -0
  415. package/dist/sidecar-apply.js +111 -0
  416. package/dist/sidecar-apply.js.map +1 -0
  417. package/dist/sidecar.d.ts +245 -0
  418. package/dist/sidecar.d.ts.map +1 -0
  419. package/dist/sidecar.js +481 -0
  420. package/dist/sidecar.js.map +1 -0
  421. package/dist/slug-namespace.d.ts +204 -0
  422. package/dist/slug-namespace.d.ts.map +1 -0
  423. package/dist/slug-namespace.js +229 -0
  424. package/dist/slug-namespace.js.map +1 -0
  425. package/dist/spec-complete.d.ts +44 -0
  426. package/dist/spec-complete.d.ts.map +1 -0
  427. package/dist/spec-complete.js +69 -0
  428. package/dist/spec-complete.js.map +1 -0
  429. package/dist/start.d.ts +97 -0
  430. package/dist/start.d.ts.map +1 -0
  431. package/dist/start.js +633 -0
  432. package/dist/start.js.map +1 -0
  433. package/dist/status.d.ts +199 -0
  434. package/dist/status.d.ts.map +1 -0
  435. package/dist/status.js +228 -0
  436. package/dist/status.js.map +1 -0
  437. package/dist/surface-gate.d.ts +162 -0
  438. package/dist/surface-gate.d.ts.map +1 -0
  439. package/dist/surface-gate.js +206 -0
  440. package/dist/surface-gate.js.map +1 -0
  441. package/dist/surface-persist.d.ts +86 -0
  442. package/dist/surface-persist.d.ts.map +1 -0
  443. package/dist/surface-persist.js +129 -0
  444. package/dist/surface-persist.js.map +1 -0
  445. package/dist/tasker-review-loop.d.ts +249 -0
  446. package/dist/tasker-review-loop.d.ts.map +1 -0
  447. package/dist/tasker-review-loop.js +369 -0
  448. package/dist/tasker-review-loop.js.map +1 -0
  449. package/dist/tasking-eligibility.d.ts +74 -0
  450. package/dist/tasking-eligibility.d.ts.map +1 -0
  451. package/dist/tasking-eligibility.js +52 -0
  452. package/dist/tasking-eligibility.js.map +1 -0
  453. package/dist/tasking-lock.d.ts +111 -0
  454. package/dist/tasking-lock.d.ts.map +1 -0
  455. package/dist/tasking-lock.js +256 -0
  456. package/dist/tasking-lock.js.map +1 -0
  457. package/dist/tasking.d.ts +275 -0
  458. package/dist/tasking.d.ts.map +1 -0
  459. package/dist/tasking.js +952 -0
  460. package/dist/tasking.js.map +1 -0
  461. package/dist/triage-gate.d.ts +127 -0
  462. package/dist/triage-gate.d.ts.map +1 -0
  463. package/dist/triage-gate.js +139 -0
  464. package/dist/triage-gate.js.map +1 -0
  465. package/dist/triage-persist.d.ts +163 -0
  466. package/dist/triage-persist.d.ts.map +1 -0
  467. package/dist/triage-persist.js +387 -0
  468. package/dist/triage-persist.js.map +1 -0
  469. package/dist/verdict-json.d.ts +32 -0
  470. package/dist/verdict-json.d.ts.map +1 -0
  471. package/dist/verdict-json.js +74 -0
  472. package/dist/verdict-json.js.map +1 -0
  473. package/dist/verify-workflow-template.d.ts +60 -0
  474. package/dist/verify-workflow-template.d.ts.map +1 -0
  475. package/dist/verify-workflow-template.js +126 -0
  476. package/dist/verify-workflow-template.js.map +1 -0
  477. package/dist/verify.d.ts +60 -0
  478. package/dist/verify.d.ts.map +1 -0
  479. package/dist/verify.js +62 -0
  480. package/dist/verify.js.map +1 -0
  481. package/dist/watch-session.d.ts +112 -0
  482. package/dist/watch-session.d.ts.map +1 -0
  483. package/dist/watch-session.js +347 -0
  484. package/dist/watch-session.js.map +1 -0
  485. package/dist/work-layout.d.ts +198 -0
  486. package/dist/work-layout.d.ts.map +1 -0
  487. package/dist/work-layout.js +217 -0
  488. package/dist/work-layout.js.map +1 -0
  489. package/dist/work-on.d.ts +154 -0
  490. package/dist/work-on.d.ts.map +1 -0
  491. package/dist/work-on.js +387 -0
  492. package/dist/work-on.js.map +1 -0
  493. package/dist/workspace.d.ts +224 -0
  494. package/dist/workspace.d.ts.map +1 -0
  495. package/dist/workspace.js +325 -0
  496. package/dist/workspace.js.map +1 -0
  497. package/package.json +46 -2
  498. package/src/advance-ci-template.ts +203 -0
  499. package/src/advance-classify.ts +197 -0
  500. package/src/advance-drivers.ts +414 -0
  501. package/src/advance-isolated.ts +432 -0
  502. package/src/advance-lifecycle-template.ts +791 -0
  503. package/src/advance-loop-driver.ts +745 -0
  504. package/src/advance-treeless-publish.ts +177 -0
  505. package/src/advance.ts +1564 -0
  506. package/src/advancing-lock.ts +988 -0
  507. package/src/agent-launch.ts +137 -0
  508. package/src/agent-stop.ts +361 -0
  509. package/src/apply-decide.ts +242 -0
  510. package/src/apply-merge-action.ts +502 -0
  511. package/src/apply-persist.ts +518 -0
  512. package/src/arbiter.ts +372 -0
  513. package/src/brand.ts +111 -0
  514. package/src/buildable-body.ts +196 -0
  515. package/src/categorise.ts +158 -0
  516. package/src/claim-cas.ts +513 -0
  517. package/src/cli-spinner.ts +225 -0
  518. package/src/cli.ts +4369 -0
  519. package/src/close-job-template.ts +236 -0
  520. package/src/close-job.ts +319 -0
  521. package/src/complete.ts +1379 -0
  522. package/src/concurrency.ts +151 -0
  523. package/src/config-override.ts +116 -0
  524. package/src/config.ts +883 -0
  525. package/src/continue-branch.ts +542 -0
  526. package/src/cwd-section.ts +392 -0
  527. package/src/decision-engine.ts +272 -0
  528. package/src/detect.ts +124 -0
  529. package/src/do-autopick.ts +223 -0
  530. package/src/do-config.ts +589 -0
  531. package/src/do-remote-auto.ts +197 -0
  532. package/src/do.ts +2623 -0
  533. package/src/drop-source.ts +194 -0
  534. package/src/eligibility.ts +79 -0
  535. package/src/env-config.ts +305 -0
  536. package/src/failure-cause.ts +142 -0
  537. package/src/format.ts +313 -0
  538. package/src/frontmatter.ts +485 -0
  539. package/src/gate-readiness.ts +147 -0
  540. package/src/gc.ts +510 -0
  541. package/src/gh-failure.ts +53 -0
  542. package/src/git.ts +186 -0
  543. package/src/github.ts +468 -0
  544. package/src/harness.ts +355 -0
  545. package/src/identity.ts +322 -0
  546. package/src/index.ts +785 -0
  547. package/src/install-ci-branch-protection.ts +255 -0
  548. package/src/install-ci-capabilities/advance-lifecycle.ts +34 -0
  549. package/src/install-ci-capabilities/close-job.ts +32 -0
  550. package/src/install-ci-capabilities/example-noop.ts +24 -0
  551. package/src/install-ci-capabilities/intake.ts +34 -0
  552. package/src/install-ci-capabilities/verify.ts +33 -0
  553. package/src/install-ci-core.ts +1088 -0
  554. package/src/install-ci-github.ts +376 -0
  555. package/src/install-ci.ts +552 -0
  556. package/src/intake-event.ts +102 -0
  557. package/src/intake-marker.ts +195 -0
  558. package/src/intake-triage.ts +138 -0
  559. package/src/intake-trigger-template.ts +591 -0
  560. package/src/intake.ts +2445 -0
  561. package/src/integration-core.ts +3065 -0
  562. package/src/integrator.ts +771 -0
  563. package/src/isolation.ts +484 -0
  564. package/src/issue-provider.ts +733 -0
  565. package/src/item-lock.ts +1858 -0
  566. package/src/item-path.ts +75 -0
  567. package/src/ledger-lint.ts +332 -0
  568. package/src/ledger-read.ts +924 -0
  569. package/src/ledger-write.ts +865 -0
  570. package/src/lifecycle-gather.ts +298 -0
  571. package/src/lifecycle-pools.ts +250 -0
  572. package/src/merge-question-surfacer.ts +496 -0
  573. package/src/mint-adr.ts +362 -0
  574. package/src/mirror-pool-scan.ts +240 -0
  575. package/src/needs-attention.ts +1506 -0
  576. package/src/orphan-sidecar.ts +150 -0
  577. package/src/output.ts +89 -0
  578. package/src/pi-harness.ts +403 -0
  579. package/src/placement.ts +131 -0
  580. package/src/prd-to-spec.ts +1023 -0
  581. package/src/prepare.ts +230 -0
  582. package/src/prompt.ts +760 -0
  583. package/src/readiness.ts +98 -0
  584. package/src/reap-branches.ts +278 -0
  585. package/src/recover-isolated.ts +276 -0
  586. package/src/registry.ts +475 -0
  587. package/src/repo-config.ts +550 -0
  588. package/src/repo-key.ts +74 -0
  589. package/src/repo-mirror.ts +367 -0
  590. package/src/retry-backoff.ts +130 -0
  591. package/src/review-gate.ts +389 -0
  592. package/src/review-verdict.ts +422 -0
  593. package/src/run.ts +1430 -0
  594. package/src/scan.ts +611 -0
  595. package/src/select-order.ts +143 -0
  596. package/src/select-priority.ts +266 -0
  597. package/src/select.ts +62 -0
  598. package/src/session-path.ts +153 -0
  599. package/src/sidecar-apply.ts +216 -0
  600. package/src/sidecar.ts +700 -0
  601. package/src/slug-namespace.ts +367 -0
  602. package/src/spec-complete.ts +118 -0
  603. package/src/start.ts +974 -0
  604. package/src/status.ts +441 -0
  605. package/src/surface-gate.ts +337 -0
  606. package/src/surface-persist.ts +241 -0
  607. package/src/tasker-review-loop.ts +671 -0
  608. package/src/tasking-eligibility.ts +114 -0
  609. package/src/tasking-lock.ts +416 -0
  610. package/src/tasking.ts +1438 -0
  611. package/src/triage-gate.ts +248 -0
  612. package/src/triage-persist.ts +570 -0
  613. package/src/verdict-json.ts +73 -0
  614. package/src/verify-workflow-template.ts +159 -0
  615. package/src/verify.ts +123 -0
  616. package/src/watch-session.ts +397 -0
  617. package/src/work-layout.ts +262 -0
  618. package/src/work-on.ts +660 -0
  619. package/src/workspace.ts +502 -0
@@ -0,0 +1,205 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { ledgerRead } from './ledger-read.js';
4
+ import { parseSidecar, sidecarPathCandidates, } from './sidecar.js';
5
+ import { runAsync } from './git.js';
6
+ import { buildLifecyclePools, } from './lifecycle-pools.js';
7
+ /**
8
+ * Read the ACTIVE sidecar for `<namespace>:<slug>` from a WORKING checkout (sync),
9
+ * or `undefined` when none exists. Identity-keyed at `work/questions/<type>-<slug>.md`
10
+ * \u2014 the SAME path `readItemSignals` reads in-place.
11
+ */
12
+ function readSidecarInPlace(repoPath, namespace, slug) {
13
+ // Probe every candidate path (spec-<slug>.md, then the legacy prd-<slug>.md the
14
+ // migration command has not converted yet) and read the FIRST that exists.
15
+ for (const rel of sidecarPathCandidates(`${namespace}:${slug}`)) {
16
+ const abs = join(repoPath, rel);
17
+ if (existsSync(abs)) {
18
+ return parseSidecar(readFileSync(abs, 'utf8'));
19
+ }
20
+ }
21
+ return undefined;
22
+ }
23
+ /**
24
+ * Collect every `needsAnswers:true` task (from `work/backlog`) + prd (from
25
+ * `work/prds`) for the in-place repo, through the read seam (the SAME readers the
26
+ * build-pool scan uses). These are the SURFACE/APPLY candidates this task draws
27
+ * into the selection (today they are build/task-INELIGIBLE, so nothing else
28
+ * surfaces them).
29
+ */
30
+ function blockedItemsInPlace(read, repoPath, surfaceStaging) {
31
+ const out = [];
32
+ const state = read.resolveLocalState({ repoPath });
33
+ for (const item of state.ready) {
34
+ if (item.needsAnswers === true) {
35
+ out.push({ namespace: 'task', slug: item.slug });
36
+ }
37
+ }
38
+ const pool = read.resolveSpecPool({ repoPath });
39
+ for (const spec of pool.specs) {
40
+ if (spec.needsAnswers === true) {
41
+ out.push({ namespace: 'spec', slug: spec.slug });
42
+ }
43
+ }
44
+ // TASKED resting prds (`prds/tasked/`) — enumerated UNCONDITIONALLY (NOT behind
45
+ // `surfaceStaging`), because a prd may legitimately carry `needsAnswers:true`
46
+ // while resting in `prds/tasked/` (WORK-CONTRACT "A PRD that has drifted AFTER
47
+ // it was TASKED"). This is NOT a staging widening: a tasked prd is a durable
48
+ // resting state, like the pool, so it is enumerated like the pool. Routing
49
+ // still respects the gates in `buildLifecyclePools` (an ANSWERED sidecar -> the
50
+ // always-on APPLY pool so the human's answer is never STRANDED; a NO-sidecar
51
+ // tasked prd -> SURFACE, still gated by `surfaceBlockers`). Without this, a
52
+ // tasked prd's answered sidecar is enumerated by no pool and apply never runs
53
+ // on it (observation `tasked-prd-needsanswers-sidecar-stranded-no-apply-pool`).
54
+ for (const spec of read.resolveLocalSpecTasked({ repoPath })) {
55
+ if (spec.needsAnswers === true) {
56
+ out.push({ namespace: 'spec', slug: spec.slug });
57
+ }
58
+ }
59
+ // SURFACE-on-STAGING widening (prd
60
+ // `staging-surface-and-apply-promote-safety` F2): when `surfaceStaging` is
61
+ // ON, the candidate set ADDITIONALLY enumerates `needsAnswers` items resting
62
+ // in STAGING (`tasks/backlog/` + `prds/proposed/`), so a tasked item
63
+ // surfaces its questions BEFORE the human promotes it. BUILD/claim still
64
+ // reads POOL-only (`scoreItems` over `state.ready`); only the surface polarity
65
+ // widens here.
66
+ if (surfaceStaging) {
67
+ for (const item of read.resolveLocalTaskStaging({ repoPath })) {
68
+ if (item.needsAnswers === true) {
69
+ out.push({ namespace: 'task', slug: item.slug });
70
+ }
71
+ }
72
+ for (const spec of read.resolveLocalSpecStaging({ repoPath })) {
73
+ if (spec.needsAnswers === true) {
74
+ out.push({ namespace: 'spec', slug: spec.slug });
75
+ }
76
+ }
77
+ }
78
+ return out;
79
+ }
80
+ /**
81
+ * Gather + build the lifecycle pools for an IN-PLACE working checkout (sync).
82
+ * Reads `work/notes/observations/` + the per-item sidecar state through the read seam +
83
+ * the filesystem, then hands them to the shared {@link buildLifecyclePools}. The
84
+ * gates default BOTH OFF (the interim hardcoded-off, calm by default).
85
+ */
86
+ export function gatherLifecycleInPlace(input) {
87
+ const read = input.read ?? ledgerRead;
88
+ const repoPath = input.repoPath;
89
+ const rawObservations = read.resolveLocalState({ repoPath }).observations;
90
+ const observations = rawObservations.map((obs) => ({
91
+ slug: obs.slug,
92
+ triaged: obs.triaged,
93
+ sidecar: readSidecarInPlace(repoPath, 'observation', obs.slug),
94
+ }));
95
+ const surfaceStaging = input.gates?.surfaceStaging === true;
96
+ const needsAnswers = blockedItemsInPlace(read, repoPath, surfaceStaging).map((item) => ({
97
+ repoPath,
98
+ namespace: item.namespace,
99
+ slug: item.slug,
100
+ sidecar: readSidecarInPlace(repoPath, item.namespace, item.slug),
101
+ }));
102
+ return buildLifecyclePools({
103
+ repoPath,
104
+ observations,
105
+ needsAnswers,
106
+ gates: input.gates,
107
+ });
108
+ }
109
+ /**
110
+ * Read the ACTIVE sidecar for `<namespace>:<slug>` from a BARE hub mirror's
111
+ * committed `<ref>:work/questions/<type>-<slug>.md` via `git show` (the SAME
112
+ * mechanism the mirror-ref ledger reads use), or `undefined` when none exists.
113
+ */
114
+ async function readSidecarMirror(mirrorPath, ref, namespace, slug, env) {
115
+ // Probe every candidate committed path (spec-<slug>.md, then the legacy
116
+ // prd-<slug>.md the migration command has not converted yet) via `git show`,
117
+ // returning the FIRST that resolves.
118
+ for (const rel of sidecarPathCandidates(`${namespace}:${slug}`)) {
119
+ const object = `${ref}:${rel}`;
120
+ const show = await runAsync('git', ['show', object], mirrorPath, { env });
121
+ if (show.status === 0) {
122
+ return parseSidecar(show.stdout);
123
+ }
124
+ }
125
+ return undefined;
126
+ }
127
+ /**
128
+ * Gather + build the lifecycle pools for a MIRROR-SIDE bare hub mirror (async).
129
+ * Reads the SAME logical inputs as {@link gatherLifecycleInPlace} \u2014 observations +
130
+ * the `needsAnswers` pool from the mirror's committed `main` (via
131
+ * `resolveMirrorState`), the prd pool via `resolveMirrorSpecPool`, and each item's
132
+ * sidecar via `git show` \u2014 then hands them to the SAME shared
133
+ * {@link buildLifecyclePools}, so the in-place + mirror enumerations AGREE.
134
+ */
135
+ export async function gatherLifecycleMirror(input) {
136
+ const read = input.read ?? ledgerRead;
137
+ const mirrorPath = input.mirrorPath;
138
+ const ref = input.ref ?? 'main';
139
+ const env = input.env;
140
+ const state = await read.resolveMirrorState({ mirrorPath, ref, env });
141
+ const specPool = await read.resolveMirrorSpecPool({ mirrorPath, ref, env });
142
+ const surfaceStaging = input.gates?.surfaceStaging === true;
143
+ const [taskStaging, specStaging] = surfaceStaging
144
+ ? await Promise.all([
145
+ read.resolveMirrorTaskStaging({ mirrorPath, ref, env }),
146
+ read.resolveMirrorSpecStaging({ mirrorPath, ref, env }),
147
+ ])
148
+ : [[], []];
149
+ const blocked = [];
150
+ for (const item of state.ready) {
151
+ if (item.needsAnswers === true) {
152
+ blocked.push({ namespace: 'task', slug: item.slug });
153
+ }
154
+ }
155
+ for (const spec of specPool.specs) {
156
+ if (spec.needsAnswers === true) {
157
+ blocked.push({ namespace: 'spec', slug: spec.slug });
158
+ }
159
+ }
160
+ // TASKED resting prds (`<ref>:work/prds/tasked/`) — enumerated UNCONDITIONALLY,
161
+ // the mirror-side counterpart of the in-place tasked-prd enumeration above
162
+ // (so a `needsAnswers` tasked prd's answered sidecar is never stranded on the
163
+ // mirror/CI advance path either). Routing still respects the gates.
164
+ const specTasked = await read.resolveMirrorSpecTasked({ mirrorPath, ref, env });
165
+ for (const spec of specTasked) {
166
+ if (spec.needsAnswers === true) {
167
+ blocked.push({ namespace: 'spec', slug: spec.slug });
168
+ }
169
+ }
170
+ // SURFACE-on-STAGING widening (prd
171
+ // `staging-surface-and-apply-promote-safety` F2): mirror-side counterpart of
172
+ // the in-place widening above — enumerate `needsAnswers` items in
173
+ // STAGING (`tasks/backlog/` + `prds/proposed/`) from the bare mirror's
174
+ // committed `<ref>` tree, so the in-place + mirror surfaces AGREE. The
175
+ // staging reads are skipped entirely when the gate is OFF (no extra git
176
+ // ls-tree work in the legacy mode).
177
+ for (const item of taskStaging) {
178
+ if (item.needsAnswers === true) {
179
+ blocked.push({ namespace: 'task', slug: item.slug });
180
+ }
181
+ }
182
+ for (const spec of specStaging) {
183
+ if (spec.needsAnswers === true) {
184
+ blocked.push({ namespace: 'spec', slug: spec.slug });
185
+ }
186
+ }
187
+ const needsAnswers = await Promise.all(blocked.map(async (item) => ({
188
+ repoPath: mirrorPath,
189
+ namespace: item.namespace,
190
+ slug: item.slug,
191
+ sidecar: await readSidecarMirror(mirrorPath, ref, item.namespace, item.slug, env),
192
+ })));
193
+ const observations = await Promise.all(state.observations.map(async (obs) => ({
194
+ slug: obs.slug,
195
+ triaged: obs.triaged,
196
+ sidecar: await readSidecarMirror(mirrorPath, ref, 'observation', obs.slug, env),
197
+ })));
198
+ return buildLifecyclePools({
199
+ repoPath: mirrorPath,
200
+ observations,
201
+ needsAnswers,
202
+ gates: input.gates,
203
+ });
204
+ }
205
+ //# sourceMappingURL=lifecycle-gather.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle-gather.js","sourceRoot":"","sources":["../src/lifecycle-gather.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,180 @@
1
+ import type { SidecarModel } from './sidecar.js';
2
+ import type { LifecycleSelectedItem } from './select-priority.js';
3
+ /**
4
+ * The SHARED, PURE enumeration of the advance auto-pick's LIFECYCLE POOLS (task
5
+ * `advance-autopick-lifecycle-pools`) \u2014 the MISSING FOUNDATION a 2026-06-12 review
6
+ * found. Before this, `performAdvanceAuto` (in-place) and `scanMirrorPool`
7
+ * (mirror-side) enumerated ONLY the two BUILD pools (eligible tasks + taskable
8
+ * prds), so a bare / `-n` / loop / CI `advance` could ONLY build tasks + task
9
+ * prds. The lifecycle rungs (triage / surface / apply) were EXPLICIT-INVOCATION-
10
+ * ONLY because NOTHING enumerated observations or `needsAnswers`-blocked items
11
+ * into the selection. This unit closes that gap, at the SELECTION layer ONLY (it
12
+ * does NOT touch the classifier `advance-classify.ts` or the rung bodies \u2014 the
13
+ * tick still re-classifies each selected item and runs the right rung).
14
+ *
15
+ * It is ONE shared unit reused by BOTH the in-place caller (`performAdvanceAuto`)
16
+ * and the mirror-side caller (`scanMirrorPool` \u2192 the loop/CI drivers), NOT two
17
+ * divergent enumerations. The per-substrate I/O (reading `work/notes/observations/` +
18
+ * the per-item sidecar state) is done CALLER-SIDE through the read seam (sync
19
+ * in-place, async mirror-ref) and the already-resolved inputs are handed here \u2014
20
+ * exactly as `taskableSpecs` is fed by each caller. This unit is then pure: no I/O.
21
+ *
22
+ * **Three lifecycle sub-pools, gated by PURPOSE (ADR `ci-config-policy-and-gate-
23
+ * family.md` \u00a74 \u2014 gates govern CREATE only; CONSUME is always-on):**
24
+ *
25
+ * - **triage** \u2014 UNTRIAGED observations (no `triaged:` settled marker). A CREATE
26
+ * act (the bot mints a promote/keep/delete question), so gated by
27
+ * {@link LifecyclePoolGates.triage} (the future `observationTriage` gate).
28
+ * - **surface** \u2014 `needsAnswers`-blocked tasks/prds with NO all-answered sidecar
29
+ * (no sidecar yet, or a still-pending one). A CREATE act (the bot mints the
30
+ * blocker question), so gated by {@link LifecyclePoolGates.surface} (the future
31
+ * `surfaceBlockers` gate). A PENDING sidecar is NOT enumerated (it would only
32
+ * no-op \u2014 leaving it out keeps the pool calm + thrash-free).
33
+ * - **apply** \u2014 `needsAnswers`-blocked items WITH an all-answered sidecar. A
34
+ * CONSUME act (the bot applies the human's committed answer), ALWAYS allowed,
35
+ * never gated \u2014 gating it would STRAND a human's answer (\u00a74's create-vs-consume
36
+ * invariant). So an answered sidecar is selected even with BOTH create-gates
37
+ * off.
38
+ *
39
+ * **INTERIM SAFETY (task `## Decisions`, DECIDED): the create-gates are born
40
+ * OFF.** The gate tasks (`observation-triage-tri-state-gate` /
41
+ * `surface-blockers-gate`) land AFTER this one, so this task must be SAFE
42
+ * STANDALONE: {@link LifecyclePoolGates} default `triage:false` + `surface:false`,
43
+ * so the triage + surface sub-pools contribute NOTHING by default and landing this
44
+ * task alone auto-triages / auto-surfaces NOTHING (it changes no repo's
45
+ * behaviour). The gate tasks REPLACE the hardcoded-off the callers pass with the
46
+ * real `observationTriage` / `surfaceBlockers` config read. The apply sub-pool is
47
+ * NOT gated (consume is always-on), so an answered sidecar always applies.
48
+ */
49
+ /**
50
+ * The create-side gates for the lifecycle pools (ADR \u00a72/\u00a74). Both default OFF
51
+ * (the calm interim state) \u2014 the gate tasks flip them on by reading
52
+ * `observationTriage` / `surfaceBlockers` from config. `apply` is NOT here: it is
53
+ * the CONSUME phase, ALWAYS allowed (never gated).
54
+ */
55
+ export interface LifecyclePoolGates {
56
+ /**
57
+ * May the TRIAGE sub-pool (untriaged observations) contribute to the selection?
58
+ * Default `false` (the interim hardcoded-off; the `observationTriage` gate
59
+ * replaces this). OFF \u21d2 observations are never auto-selected.
60
+ */
61
+ triage?: boolean;
62
+ /**
63
+ * May the SURFACE sub-pool (`needsAnswers`-blocked, no all-answered sidecar)
64
+ * contribute? Default `false` (the interim hardcoded-off; the `surfaceBlockers`
65
+ * gate replaces this). OFF \u21d2 blocked items are never auto-surfaced.
66
+ */
67
+ surface?: boolean;
68
+ /**
69
+ * Does the SURFACE candidate set widen to include STAGING (`tasks/backlog/` +
70
+ * `prds/proposed/`), or stay POOL-ONLY? This field is CONSUMED BY THE
71
+ * GATHER (`lifecycle-gather.ts`), NOT by {@link buildLifecyclePools} — the
72
+ * builder is pure and only routes already-resolved candidates between surface
73
+ * / apply by sidecar-answered-state. The gather decides WHICH items become
74
+ * candidates in the first place; this gate widens that input set when `true`.
75
+ * Default `false` at THIS library boundary (calm; the CLI threads
76
+ * `config.surfaceStaging` which itself defaults to `true`, so the user-visible
77
+ * default is `true`). Spec `staging-surface-and-apply-promote-safety` F2.
78
+ * BUILD/claim eligibility is UNCHANGED in either mode — staging items stay
79
+ * non-claimable, the trust model is untouched.
80
+ */
81
+ surfaceStaging?: boolean;
82
+ }
83
+ /**
84
+ * One `needsAnswers`-blocked task/spec candidate for the SURFACE/APPLY sub-pools,
85
+ * before this unit routes it. The caller resolves the item's namespace + slug
86
+ * (from `work/backlog` tasks + `work/specs` specs carrying `needsAnswers:true`) and
87
+ * its ACTIVE sidecar (parsed from `work/questions/<type>-<slug>.md`, or
88
+ * `undefined` when none exists) \u2014 through the read seam (sync in-place / async
89
+ * mirror-ref). This unit then routes it to APPLY (sidecar all-answered, consume,
90
+ * always-on) or SURFACE (no all-answered sidecar, create, gated). PURE: no I/O.
91
+ */
92
+ export interface NeedsAnswersCandidate {
93
+ /** The repo this item lives in (a working checkout in-place, the mirror path remote). */
94
+ repoPath: string;
95
+ /** `'task'` (a `work/backlog/` task) or `'spec'` (a `work/specs/` spec). */
96
+ namespace: 'task' | 'spec';
97
+ /** The bare slug. */
98
+ slug: string;
99
+ /** The parsed ACTIVE sidecar, or `undefined` when none exists yet. */
100
+ sidecar: SidecarModel | undefined;
101
+ }
102
+ /**
103
+ * One OBSERVATION candidate for the TRIAGE/APPLY sub-pools, resolved through
104
+ * the same read seam as its `needsAnswers` task/spec siblings (task
105
+ * `route-answered-observation-sidecar-to-apply-pool`). The classifier receives
106
+ * a sidecar-aware observation shape so an ANSWERED observation sidecar routes
107
+ * to the always-on APPLY pool (a CONSUME act — the human's answer is never
108
+ * stranded), while a NO/PENDING sidecar UNTRIAGED observation stays a TRIAGE
109
+ * candidate (gated) as today. PURE: the caller resolves the active sidecar (via
110
+ * {@link sidecarPathFor} — the SAME resolver the task/prd `needsAnswers`
111
+ * candidates use); this unit only routes.
112
+ */
113
+ export interface ObservationCandidate {
114
+ /** The observation's identity — its FILENAME slug (never a foreign frontmatter `slug:`). */
115
+ slug: string;
116
+ /**
117
+ * The SETTLED marker (`triaged:` frontmatter): a non-empty value drops the
118
+ * observation out of the TRIAGE pool; `undefined` ⇒ UNTRIAGED. IGNORED for
119
+ * the APPLY routing (an ANSWERED sidecar wins regardless of the marker: a
120
+ * human's answer must never be stranded — task `## Decisions`).
121
+ */
122
+ triaged: string | undefined;
123
+ /** The parsed ACTIVE sidecar (`work/questions/observation-<slug>.md`), or `undefined`. */
124
+ sidecar: SidecarModel | undefined;
125
+ }
126
+ /** Inputs to {@link buildLifecyclePools}: the raw lifecycle candidates + the gates. */
127
+ export interface LifecyclePoolsInput {
128
+ /** The repo whose lifecycle items these are (carried onto each selected item). */
129
+ repoPath: string;
130
+ /**
131
+ * Every observation in `work/notes/observations/` (the read seam's observation
132
+ * read), each with its resolved active sidecar (task
133
+ * `route-answered-observation-sidecar-to-apply-pool`). This unit routes each
134
+ * to APPLY (sidecar all-answered, consume, always-on) or TRIAGE (untriaged, no
135
+ * all-answered sidecar; create, gated).
136
+ */
137
+ observations: ObservationCandidate[];
138
+ /**
139
+ * Every `needsAnswers:true` task/prd (the create-side blocked items), each
140
+ * with its resolved active sidecar. This unit routes each to SURFACE or APPLY.
141
+ */
142
+ needsAnswers: NeedsAnswersCandidate[];
143
+ /**
144
+ * The create-side gates (default BOTH OFF \u2014 the interim hardcoded-off). The
145
+ * apply sub-pool is never gated.
146
+ */
147
+ gates?: LifecyclePoolGates;
148
+ }
149
+ /**
150
+ * The three lifecycle sub-pools, each an ordered {@link LifecycleSelectedItem[]}.
151
+ * The caller concatenates them into the overall selection in the four-pool order
152
+ * (see {@link selectPrioritised}); `apply` is consume (always present), `triage` /
153
+ * `surface` are present only when their gate is on.
154
+ */
155
+ export interface LifecyclePools {
156
+ /** `apply` items (answered sidecars; CONSUME, always present). */
157
+ apply: LifecycleSelectedItem[];
158
+ /** `surface` items (blocked, no all-answered sidecar; gated by `gates.surface`). */
159
+ surface: LifecycleSelectedItem[];
160
+ /** `triage` items (untriaged observations; gated by `gates.triage`). */
161
+ triage: LifecycleSelectedItem[];
162
+ }
163
+ /**
164
+ * Build the three lifecycle sub-pools from the raw candidates + the gates, PURE.
165
+ * Each selected item carries the lifecycle `namespace` discriminator so the
166
+ * driver's per-item dispatch can map it to the right TICK arg (observation \u2192
167
+ * `obs:<slug>`; a blocked task/prd \u2192 `task:`/`prd:<slug>`, which the tick then
168
+ * classifies into surface/apply/no-op). This unit decides WHICH sub-pool each item
169
+ * belongs to (and whether its gate lets it through); the TICK re-classifies and
170
+ * runs the actual rung (the classifier + rung bodies are unchanged).
171
+ *
172
+ * Routing:
173
+ * - an UNTRIAGED observation \u2192 `triage` (gated by `gates.triage`);
174
+ * - a `needsAnswers` item with an ALL-ANSWERED sidecar \u2192 `apply` (always);
175
+ * - a `needsAnswers` item with NO all-answered sidecar \u2192 `surface` (gated by
176
+ * `gates.surface`); a PENDING sidecar is NOT enumerated into either pool (it
177
+ * would only no-op \u2014 leaving it out keeps the pool calm).
178
+ */
179
+ export declare function buildLifecyclePools(input: LifecyclePoolsInput): LifecyclePools;
180
+ //# sourceMappingURL=lifecycle-pools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle-pools.d.ts","sourceRoot":"","sources":["../src/lifecycle-pools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,cAAc,CAAC;AAE/C,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,sBAAsB,CAAC;AAEhE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AAEH;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IAClC;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;;;;;;;;OAYG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,qBAAqB;IACrC,yFAAyF;IACzF,QAAQ,EAAE,MAAM,CAAC;IACjB,4EAA4E;IAC5E,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,OAAO,EAAE,YAAY,GAAG,SAAS,CAAC;CAClC;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,oBAAoB;IACpC,4FAA4F;IAC5F,IAAI,EAAE,MAAM,CAAC;IACb;;;;;OAKG;IACH,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,0FAA0F;IAC1F,OAAO,EAAE,YAAY,GAAG,SAAS,CAAC;CAClC;AAED,uFAAuF;AACvF,MAAM,WAAW,mBAAmB;IACnC,kFAAkF;IAClF,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;;OAMG;IACH,YAAY,EAAE,oBAAoB,EAAE,CAAC;IACrC;;;OAGG;IACH,YAAY,EAAE,qBAAqB,EAAE,CAAC;IACtC;;;OAGG;IACH,KAAK,CAAC,EAAE,kBAAkB,CAAC;CAC3B;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC9B,kEAAkE;IAClE,KAAK,EAAE,qBAAqB,EAAE,CAAC;IAC/B,oFAAoF;IACpF,OAAO,EAAE,qBAAqB,EAAE,CAAC;IACjC,wEAAwE;IACxE,MAAM,EAAE,qBAAqB,EAAE,CAAC;CAChC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CAClC,KAAK,EAAE,mBAAmB,GACxB,cAAc,CA6DhB"}
@@ -0,0 +1,78 @@
1
+ import { allAnswered } from './sidecar.js';
2
+ /**
3
+ * Build the three lifecycle sub-pools from the raw candidates + the gates, PURE.
4
+ * Each selected item carries the lifecycle `namespace` discriminator so the
5
+ * driver's per-item dispatch can map it to the right TICK arg (observation \u2192
6
+ * `obs:<slug>`; a blocked task/prd \u2192 `task:`/`prd:<slug>`, which the tick then
7
+ * classifies into surface/apply/no-op). This unit decides WHICH sub-pool each item
8
+ * belongs to (and whether its gate lets it through); the TICK re-classifies and
9
+ * runs the actual rung (the classifier + rung bodies are unchanged).
10
+ *
11
+ * Routing:
12
+ * - an UNTRIAGED observation \u2192 `triage` (gated by `gates.triage`);
13
+ * - a `needsAnswers` item with an ALL-ANSWERED sidecar \u2192 `apply` (always);
14
+ * - a `needsAnswers` item with NO all-answered sidecar \u2192 `surface` (gated by
15
+ * `gates.surface`); a PENDING sidecar is NOT enumerated into either pool (it
16
+ * would only no-op \u2014 leaving it out keeps the pool calm).
17
+ */
18
+ export function buildLifecyclePools(input) {
19
+ const gates = input.gates ?? {};
20
+ const triageOn = gates.triage === true;
21
+ const surfaceOn = gates.surface === true;
22
+ // --- observation routing: apply (all-answered sidecar) vs triage (untriaged) ---
23
+ const triage = [];
24
+ const apply = [];
25
+ for (const obs of input.observations) {
26
+ const answered = obs.sidecar !== undefined && allAnswered(obs.sidecar);
27
+ if (answered) {
28
+ // CONSUME (apply the human's committed answer) — ALWAYS allowed, even
29
+ // with the triage create-gate off (the create-vs-consume invariant, ADR
30
+ // `ci-config-policy-and-gate-family` §4). An answered sidecar wins even
31
+ // when the observation body also carries a `triaged:` marker: a human's
32
+ // answer must never be stranded (task `## Decisions`).
33
+ apply.push({
34
+ repoPath: input.repoPath,
35
+ slug: obs.slug,
36
+ namespace: 'observation',
37
+ });
38
+ }
39
+ else if (obs.triaged === undefined && triageOn) {
40
+ // CREATE (mint the promote/keep/delete question) — gated by
41
+ // `observationTriage`. An untriaged observation with NO sidecar or a
42
+ // PENDING sidecar is a triage candidate as today.
43
+ triage.push({
44
+ repoPath: input.repoPath,
45
+ slug: obs.slug,
46
+ namespace: 'observation',
47
+ });
48
+ }
49
+ // else: SETTLED (triaged:) with no answered sidecar — NOT enumerated.
50
+ }
51
+ // --- surface / apply: split `needsAnswers` items by sidecar answered-state ---
52
+ const surface = [];
53
+ for (const candidate of input.needsAnswers) {
54
+ const answered = candidate.sidecar !== undefined && allAnswered(candidate.sidecar);
55
+ if (answered) {
56
+ // CONSUME (apply the human's committed answer) \u2014 ALWAYS allowed, even with
57
+ // both create-gates off (the create-vs-consume invariant, ADR \u00a74).
58
+ apply.push({
59
+ repoPath: candidate.repoPath,
60
+ slug: candidate.slug,
61
+ namespace: candidate.namespace,
62
+ });
63
+ }
64
+ else if (candidate.sidecar === undefined && surfaceOn) {
65
+ // CREATE (mint the blocker question) \u2014 gated by `surfaceBlockers`. Only an
66
+ // item with NO sidecar yet is a surface candidate; a PENDING sidecar would
67
+ // only no-op, so it is left OUT of the pool (keeps the selection calm).
68
+ surface.push({
69
+ repoPath: candidate.repoPath,
70
+ slug: candidate.slug,
71
+ namespace: candidate.namespace,
72
+ });
73
+ }
74
+ // else: a PENDING sidecar (exists, not all-answered) \u2014 NOT enumerated.
75
+ }
76
+ return { apply, surface, triage };
77
+ }
78
+ //# sourceMappingURL=lifecycle-pools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle-pools.js","sourceRoot":"","sources":["../src/lifecycle-pools.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,WAAW,EAAC,MAAM,cAAc,CAAC;AAyKzC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,mBAAmB,CAClC,KAA0B;IAE1B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;IAChC,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC;IACvC,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC;IAEzC,kFAAkF;IAClF,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,MAAM,KAAK,GAA4B,EAAE,CAAC;IAC1C,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,KAAK,SAAS,IAAI,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvE,IAAI,QAAQ,EAAE,CAAC;YACd,sEAAsE;YACtE,wEAAwE;YACxE,wEAAwE;YACxE,wEAAwE;YACxE,uDAAuD;YACvD,KAAK,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,SAAS,EAAE,aAAa;aACxB,CAAC,CAAC;QACJ,CAAC;aAAM,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,IAAI,QAAQ,EAAE,CAAC;YAClD,4DAA4D;YAC5D,qEAAqE;YACrE,kDAAkD;YAClD,MAAM,CAAC,IAAI,CAAC;gBACX,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,SAAS,EAAE,aAAa;aACxB,CAAC,CAAC;QACJ,CAAC;QACD,sEAAsE;IACvE,CAAC;IAED,gFAAgF;IAChF,MAAM,OAAO,GAA4B,EAAE,CAAC;IAC5C,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QAC5C,MAAM,QAAQ,GACb,SAAS,CAAC,OAAO,KAAK,SAAS,IAAI,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACnE,IAAI,QAAQ,EAAE,CAAC;YACd,gFAAgF;YAChF,wEAAwE;YACxE,KAAK,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,SAAS,CAAC,QAAQ;gBAC5B,IAAI,EAAE,SAAS,CAAC,IAAI;gBACpB,SAAS,EAAE,SAAS,CAAC,SAAS;aAC9B,CAAC,CAAC;QACJ,CAAC;aAAM,IAAI,SAAS,CAAC,OAAO,KAAK,SAAS,IAAI,SAAS,EAAE,CAAC;YACzD,gFAAgF;YAChF,2EAA2E;YAC3E,wEAAwE;YACxE,OAAO,CAAC,IAAI,CAAC;gBACZ,QAAQ,EAAE,SAAS,CAAC,QAAQ;gBAC5B,IAAI,EAAE,SAAS,CAAC,IAAI;gBACpB,SAAS,EAAE,SAAS,CAAC,SAAS;aAC9B,CAAC,CAAC;QACJ,CAAC;QACD,4EAA4E;IAC7E,CAAC;IAED,OAAO,EAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,166 @@
1
+ import { type SurfacePersistOptions, type SurfacePersistResult } from './surface-persist.js';
2
+ /**
3
+ * The **MERGE-QUESTION SURFACER** (prd `land-time-reverify-and-parallel-merge-ceiling`,
4
+ * task `merge-question-surfacer`, US #14) — the SECOND, STATE-sourced surfacer
5
+ * in the advance loop. It is a clean SIBLING to the existing
6
+ * `surface-questions` JUDGEMENT surfacer (`surface-gate.ts` +
7
+ * `surface-persist.ts`) — that one spawns a fresh-context agent to JUDGE an
8
+ * item's open content questions; this one enumerates RUNNER STATE (unmerged
9
+ * `work/*` branches) and surfaces one MERGE-QUESTION per branch into the SAME
10
+ * binary sidecar shape. The judgement skill is UNTOUCHED.
11
+ *
12
+ * The shape is `surface → answer → apply` over the BINARY sidecar (the keystone
13
+ * `agentic-question-resolution-retire-disposition-vocabulary`): a sidecar entry
14
+ * is `no-answer | answered`; there is no `disposition=` token. The dispatch
15
+ * signal the (separate) apply rung reads is the typed `kind` field
16
+ * (`sidecar-kind-field`) — this surfacer STAMPS `kind: merge` on every entry it
17
+ * emits. The `merge | hold | drop` menu rides the entry's `default` as a
18
+ * human-readable HINT only; the apply layer must NEVER recognise a
19
+ * merge-question by the shape of `default` (that string-sniff workaround is
20
+ * exactly what a first build of this task was BLOCKED at review for).
21
+ *
22
+ * Layered like the spec asks: the FLOOR (git-alone reachability) is the
23
+ * authoritative enumerator — it works against a bare `--bare` arbiter with
24
+ * `NoneProvider`. The CEILING (`gh pr list` PR metadata) is pure ENRICHMENT
25
+ * layered on top when a GitHub host is configured; the surfacer functions
26
+ * identically without it.
27
+ *
28
+ * OUT OF SCOPE for this task (covered by sibling tasks of the same prd):
29
+ *
30
+ * - The APPLY rung dispatch that lands an answered `kind: merge` through the
31
+ * land primitive (rebase → re-verify → advance). Task
32
+ * `apply-rung-merge-disposition`.
33
+ * - The GATE axis that decides whether this surfacer runs at all on a given
34
+ * advance tick. Task `merge-questions-gate-axis`.
35
+ *
36
+ * Tests inject the two seams ({@link listUnmergedWorkBranches},
37
+ * {@link listOpenPullRequests}) so they NEVER hit real GitHub — the floor uses
38
+ * `git for-each-ref` against a throwaway repo, the ceiling is the injected
39
+ * `gh pr list` stub.
40
+ */
41
+ /** A `work/<slug>` branch whose tip is not reachable from `<base>`. */
42
+ export interface UnmergedWorkBranch {
43
+ /** The full short ref, e.g. `work/foo`. */
44
+ ref: string;
45
+ /** The bare slug (`work/` prefix stripped), e.g. `foo`. */
46
+ slug: string;
47
+ /** Branch tip SHA (advisory). */
48
+ sha?: string;
49
+ }
50
+ /** Minimal PR metadata the ceiling renders into the question context. */
51
+ export interface MergeQuestionPullRequest {
52
+ number: number;
53
+ url?: string;
54
+ title?: string;
55
+ state?: string;
56
+ }
57
+ /** Inputs to the listings seams (and the surfacer). */
58
+ export interface ListUnmergedInput {
59
+ cwd: string;
60
+ base: string;
61
+ env?: NodeJS.ProcessEnv;
62
+ }
63
+ export interface ListPullRequestsInput {
64
+ cwd: string;
65
+ ghBin: string;
66
+ base: string;
67
+ env?: NodeJS.ProcessEnv;
68
+ }
69
+ /** Options the surfacer takes (almost all seams are injectable for tests). */
70
+ export interface SurfaceMergeQuestionsOptions {
71
+ /** Working clone the surfacer reads git refs + writes sidecars from. */
72
+ cwd: string;
73
+ /**
74
+ * The arbiter remote URL — when GitHub-shaped (per
75
+ * {@link isGitHubArbiterUrl}) the CEILING (`gh pr list`) runs. Absent /
76
+ * non-GitHub ⇒ the floor only (a bare arbiter with `NoneProvider`).
77
+ */
78
+ arbiterUrl?: string;
79
+ /** The base branch reachability is checked against. Default `main`. */
80
+ base?: string;
81
+ /** The `gh` CLI binary to invoke for the ceiling. Default `gh` on PATH. */
82
+ ghBin?: string;
83
+ /** Environment for spawned git/gh processes. */
84
+ env?: NodeJS.ProcessEnv;
85
+ /** Sink for human-readable progress notes. */
86
+ note?: (message: string) => void;
87
+ /**
88
+ * Seam: enumerate unmerged `work/*` branches (the FLOOR). Production uses
89
+ * `git for-each-ref` + `git merge-base --is-ancestor`. Tests inject a canned
90
+ * list so the surfacer is exercised over deterministic inputs.
91
+ */
92
+ listUnmergedWorkBranches?: (input: ListUnmergedInput) => UnmergedWorkBranch[];
93
+ /**
94
+ * Seam: list open PRs by branch (the CEILING). Production shells
95
+ * `gh pr list --json …`. Tests inject a stub map so they NEVER touch real
96
+ * GitHub. Skipped entirely when the arbiter is not GitHub-shaped.
97
+ */
98
+ listOpenPullRequests?: (input: ListPullRequestsInput) => Map<string, MergeQuestionPullRequest>;
99
+ /** Seam: persist a single merge-question. Defaults to {@link persistSurfacedQuestions}. */
100
+ persist?: (options: SurfacePersistOptions) => SurfacePersistResult;
101
+ }
102
+ /** One surfaced merge-question (a row in the result). */
103
+ export interface MergeQuestionSurfaced {
104
+ /** The namespaced item identity (`task:<slug>`). */
105
+ item: string;
106
+ /** The bare slug. */
107
+ slug: string;
108
+ /** The `work/<slug>` ref the question is about. */
109
+ ref: string;
110
+ /** The sidecar path the persist touched (repo-relative). */
111
+ sidecarPath: string;
112
+ /** The persist commit (`undefined` if the persist was a no-op). */
113
+ commit?: string;
114
+ /** PR url when a GitHub ceiling matched the branch (advisory). */
115
+ prUrl?: string;
116
+ }
117
+ /** One branch the surfacer considered but did not surface (with the reason). */
118
+ export interface MergeQuestionSkipped {
119
+ ref: string;
120
+ slug: string;
121
+ reason: 'no-item-body' | 'already-pending-merge-question' | 'persist-nothing';
122
+ }
123
+ /** Aggregate result of one surfacer pass. */
124
+ export interface SurfaceMergeQuestionsResult {
125
+ /** How many `work/*` branches were unreachable from `<base>` (the floor). */
126
+ considered: number;
127
+ /** The branches a merge-question was emitted for. */
128
+ surfaced: MergeQuestionSurfaced[];
129
+ /** The branches that were considered but skipped, with the reason. */
130
+ skipped: MergeQuestionSkipped[];
131
+ }
132
+ /** Raised for fatal usage errors (a missing repo, etc.). */
133
+ export declare class MergeQuestionSurfacerError extends Error {
134
+ constructor(message: string);
135
+ }
136
+ /**
137
+ * Surface merge-questions for every unmerged `work/*` branch in `cwd`.
138
+ *
139
+ * The FLOOR (git reachability) is authoritative; the CEILING (`gh pr list`)
140
+ * runs only when {@link isGitHubArbiterUrl} accepts the arbiter URL, and is
141
+ * pure enrichment (a missing/failed `gh` degrades silently — the floor still
142
+ * surfaces the question).
143
+ *
144
+ * Idempotency: a branch whose sidecar ALREADY carries a PENDING `kind: merge`
145
+ * entry is SKIPPED (with `already-pending-merge-question`). A branch with no
146
+ * item body on `main` is SKIPPED (with `no-item-body`) — the cross-cutting
147
+ * branch-keyed sidecar identity (PRD sidecar Q5-i) is OOS for this task; an
148
+ * unmerged-branch-with-no-body lands on the same skip path until that
149
+ * generalisation arrives.
150
+ */
151
+ export declare function surfaceMergeQuestions(options: SurfaceMergeQuestionsOptions): SurfaceMergeQuestionsResult;
152
+ /**
153
+ * Production FLOOR: enumerate every `refs/heads/work/*` whose tip is NOT
154
+ * reachable from `<base>`. A repo with no `<base>` (e.g. a fresh init before
155
+ * the first commit) yields the empty list — the surfacer is a no-op until
156
+ * `main` exists.
157
+ */
158
+ export declare function listUnmergedWorkBranchesViaGit(input: ListUnmergedInput): UnmergedWorkBranch[];
159
+ /**
160
+ * Production CEILING: shell `gh pr list --state open --json …` and index the
161
+ * results by their `headRefName` so the surfacer can enrich the matching
162
+ * branch's question. A non-zero / missing `gh` is treated as "no host
163
+ * metadata available" — the floor still surfaces every unmerged branch.
164
+ */
165
+ export declare function listOpenPullRequestsViaGh(input: ListPullRequestsInput): Map<string, MergeQuestionPullRequest>;
166
+ //# sourceMappingURL=merge-question-surfacer.d.ts.map