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,143 @@
1
+ /**
2
+ * The pure SELECTION-ORDER resolver: turn the per-repo `selectionOrder` config
3
+ * value (a PRESET keyword OR an explicit pool-name list) into the canonical
4
+ * ordered list of the FOUR orderable pools, which {@link selectPrioritised}
5
+ * interleaves AFTER the always-first `apply` pool.
6
+ *
7
+ * Two load-bearing rules (ADR `ci-config-policy-and-gate-family`, selection-order
8
+ * section; task `advance-selection-order-config`):
9
+ *
10
+ * 1. **`apply` is PINNED FIRST and is NOT nameable here.** Consuming a human's
11
+ * committed answer is highest-value, cheap (no model), and someone is waiting
12
+ * — deprioritizing it is never a real want (consume-always-wins). So this
13
+ * resolver ranks ONLY the other four; naming `apply` in `selectionOrder` is a
14
+ * LOUD usage error (it signals a misunderstanding — `apply` cannot be reordered).
15
+ * 2. **The value is a PRESET STRING or an explicit ORDER LIST** (the preset is
16
+ * sugar over a list; the canonical form is the list). A single recognized
17
+ * preset keyword EXPANDS to its list; ANYTHING else is parsed as an explicit
18
+ * pool-name list, validating each name. An unknown pool name OR an unknown
19
+ * single keyword FAILS LOUDLY naming the offending value.
20
+ *
21
+ * Pure: no I/O, no config read. The callers resolve `config.selectionOrder`
22
+ * through this, then hand the ordered list to {@link selectPrioritised}.
23
+ */
24
+
25
+ /**
26
+ * The four ORDERABLE pools (the ones `selectionOrder` ranks). `apply` is
27
+ * deliberately ABSENT — it is pinned first and not configurable, so it is not a
28
+ * member of this union and naming it is a usage error.
29
+ *
30
+ * - `build` — build an eligible task;
31
+ * - `task` — task a taskable prd;
32
+ * - `surface` — render a `needsAnswers` blocker into an answerable sidecar;
33
+ * - `triage` — triage an untriaged observation.
34
+ */
35
+ export type SelectionPool = 'build' | 'task' | 'surface' | 'triage';
36
+
37
+ /** The orderable pools, in their canonical "drain" order (the default). */
38
+ export const SELECTION_POOLS: readonly SelectionPool[] = [
39
+ 'build',
40
+ 'task',
41
+ 'surface',
42
+ 'triage',
43
+ ];
44
+
45
+ /**
46
+ * The recognized PRESET keywords, each sugar over an explicit pool-order list:
47
+ *
48
+ * - `drain` (the DEFAULT) — drain ready work, then create, then ask:
49
+ * `[build, task, surface, triage]`. Reproduces today's drain-first
50
+ * "drain before create" default (`build` before `task`).
51
+ * - `groom` — ask/groom first, build later: `[surface, triage, build, task]`.
52
+ *
53
+ * Kept deliberately SMALL (the minimize-head-space stance): a third preset earns
54
+ * its place only when a real need appears.
55
+ */
56
+ export const SELECTION_ORDER_PRESETS: Record<string, readonly SelectionPool[]> =
57
+ {
58
+ drain: ['build', 'task', 'surface', 'triage'],
59
+ groom: ['surface', 'triage', 'build', 'task'],
60
+ };
61
+
62
+ /** The default `selectionOrder` value when unset (the `drain` preset). */
63
+ export const DEFAULT_SELECTION_ORDER = 'drain';
64
+
65
+ /**
66
+ * The config value a user writes for `selectionOrder`: a preset keyword (or a
67
+ * single explicit pool name) as a STRING, or an explicit ordered LIST of pool
68
+ * names (the env `'list'` coercion always yields the list form).
69
+ */
70
+ export type SelectionOrderConfig = string | string[];
71
+
72
+ const POOL_SET = new Set<string>(SELECTION_POOLS);
73
+ const PRESET_NAMES = Object.keys(SELECTION_ORDER_PRESETS);
74
+
75
+ /**
76
+ * Resolve a `selectionOrder` config value into the canonical ordered list of the
77
+ * four orderable pools. A single recognized preset keyword expands to its list;
78
+ * anything else is treated as an explicit pool-name list (each name validated).
79
+ *
80
+ * FAILS LOUDLY (throws) on:
81
+ * - an unknown SINGLE keyword (not a preset AND not a pool name);
82
+ * - an unknown pool name anywhere in an explicit list;
83
+ * - naming `apply` (it is pinned first, not orderable);
84
+ * - an empty order (no pools named);
85
+ * - a duplicate pool name in an explicit list.
86
+ *
87
+ * The list form is taken VERBATIM (no implicit padding of omitted pools — a list
88
+ * names exactly the orderable pools the user wants, in order; an omitted pool is
89
+ * simply ranked nowhere, which only matters if that pool is present, see the gate
90
+ * orthogonality note in {@link selectPrioritised}).
91
+ */
92
+ export function resolveSelectionOrder(
93
+ value: SelectionOrderConfig,
94
+ ): SelectionPool[] {
95
+ // Normalise to a list of trimmed, non-empty tokens. A bare string is one token
96
+ // (so `'drain'` and `['drain']` resolve identically — the env single-keyword
97
+ // case); a list is its trimmed entries.
98
+ const tokens = (typeof value === 'string' ? [value] : value)
99
+ .map((t) => t.trim())
100
+ .filter((t) => t !== '');
101
+
102
+ // A SINGLE token that is a recognized preset keyword expands to its list. This
103
+ // is the ONLY place a preset is honoured: a preset keyword mixed into a
104
+ // multi-element list is NOT a pool name and so fails loudly below.
105
+ if (tokens.length === 1 && tokens[0] in SELECTION_ORDER_PRESETS) {
106
+ return [...SELECTION_ORDER_PRESETS[tokens[0]]];
107
+ }
108
+
109
+ if (tokens.length === 0) {
110
+ throw new Error(
111
+ `Invalid selectionOrder: empty. Expected a preset ` +
112
+ `(${PRESET_NAMES.join(' / ')}) or an explicit pool-order list ` +
113
+ `(${SELECTION_POOLS.join(', ')}).`,
114
+ );
115
+ }
116
+
117
+ // Otherwise an EXPLICIT pool-name list: validate each name is a known orderable
118
+ // pool, failing loudly on `apply` (pinned, not orderable) or any unknown name.
119
+ const seen = new Set<string>();
120
+ const order: SelectionPool[] = [];
121
+ for (const token of tokens) {
122
+ if (token === 'apply') {
123
+ throw new Error(
124
+ `Invalid selectionOrder: 'apply' is pinned FIRST and is not ` +
125
+ `orderable — remove it. selectionOrder ranks only: ` +
126
+ `${SELECTION_POOLS.join(', ')}.`,
127
+ );
128
+ }
129
+ if (!POOL_SET.has(token)) {
130
+ throw new Error(
131
+ `Invalid selectionOrder: unknown pool '${token}'. Expected a preset ` +
132
+ `(${PRESET_NAMES.join(' / ')}) or pool names from: ` +
133
+ `${SELECTION_POOLS.join(', ')}.`,
134
+ );
135
+ }
136
+ if (seen.has(token)) {
137
+ throw new Error(`Invalid selectionOrder: duplicate pool '${token}'.`);
138
+ }
139
+ seen.add(token);
140
+ order.push(token as SelectionPool);
141
+ }
142
+ return order;
143
+ }
@@ -0,0 +1,266 @@
1
+ import {selectCandidates, type Candidate, type SelectCaps} from './select.js';
2
+ import type {ScanReport} from './scan.js';
3
+ import {
4
+ resolveTaskingEligibility,
5
+ type HumanOnlyGate,
6
+ } from './tasking-eligibility.js';
7
+ import {
8
+ resolveSelectionOrder,
9
+ DEFAULT_SELECTION_ORDER,
10
+ type SelectionPool,
11
+ type SelectionOrderConfig,
12
+ } from './select-order.js';
13
+
14
+ /**
15
+ * The SHARED, PURE selection-and-ordering helper for the multi-item `do`/`advance`
16
+ * forms (auto-pick / `-n <x>` / `<a> <b> …`) and the CONFIGURABLE selection ORDER
17
+ * (task `advance-selection-order-config`; ADR `ci-config-policy-and-gate-family`,
18
+ * selection-order section). `apply` is PINNED FIRST (consume-always-wins); the
19
+ * other four pools (`build` / `task` / `surface` / `triage`) are ranked by the
20
+ * per-repo `selectionOrder` field (a PRESET keyword or an explicit pool-name
21
+ * list), whose `drain` default reproduces today's tasks-first "drain ready work
22
+ * before creating more".
23
+ *
24
+ * It is the ONE place the cross-pool ordering lives, so it is not duplicated when
25
+ * `run`'s tick later adopts the SAME priority
26
+ * (ADR §3: "the `run`/`do` auto-task step"). This task (`do-autopick`) OWNS and
27
+ * builds this helper; it does NOT retro-wire `run` to call it (at `do-autopick`
28
+ * time `run`'s tick is task-only — concurrent + looped — and adopting this
29
+ * helper, so `run` also auto-tasks eligible prds, is a noted FOLLOW-UP once both
30
+ * land). Build it standalone; do not assume `run` already calls it.
31
+ *
32
+ * **Up to FIVE pools.** The `scan`/`selectCandidates`/eligibility model is
33
+ * TASK-ONLY (there is no prd candidate). So this helper composes:
34
+ *
35
+ * - the **`build` pool** (eligible TASKS) — the EXISTING {@link selectCandidates}
36
+ * path (round-robin across repos, capped). This is the EXACT task-selection
37
+ * primitive `run` uses, so `run` and this helper SHARE it (they share
38
+ * `selectCandidates`, the task-pool core).
39
+ * - the **`task` pool** (prd-to-task) — a pool the caller builds from the prd reader
40
+ * (`ledgerRead.resolveSpecPool`) filtered by `autoslice-gate`'s pure predicate
41
+ * ({@link resolveTaskingEligibility}); see {@link taskableSpecs}. The helper
42
+ * does NOT reinvent prd eligibility.
43
+ *
44
+ * `do` is STRICTLY SEQUENTIAL (parallelism is `run`'s job, ADR §3) — this helper
45
+ * only ORDERS + COUNTS the items; the caller runs the existing `do` pipeline per
46
+ * item one at a time. `count` bounds how many items are taken (auto-pick = 1,
47
+ * `-n <x>` = x). It is NOT a parallelism knob.
48
+ */
49
+
50
+ /**
51
+ * Which namespace a selected item names (mirrors the slug-namespace split). The
52
+ * `do` selection only ever produces `task`/`prd`; the `advance` selection ALSO
53
+ * produces `observation` (the lifecycle triage pool, task
54
+ * `advance-autopick-lifecycle-pools`), so a selected lifecycle item carries which
55
+ * rung the driver dispatches to. The widening is BACKWARD-COMPATIBLE: `do` never
56
+ * emits `observation` (its lifecycle pools default to none, see
57
+ * {@link selectPrioritised}).
58
+ */
59
+ export type SelectedNamespace = 'task' | 'spec' | 'observation';
60
+
61
+ /** One item the selection layer picked, in run order. */
62
+ export interface SelectedItem {
63
+ /** The repo this item lives in (a working checkout for in-place `do`). */
64
+ repoPath: string;
65
+ /** The bare slug to act on. */
66
+ slug: string;
67
+ /**
68
+ * `'task'` ⇒ run the task-build `do` pipeline; `'spec'` ⇒ dispatch to the
69
+ * `do spec:<slug>` tasking path (tasking itself is `autoslice-command`, not
70
+ * here); `'observation'` ⇒ (advance only) the triage rung via `obs:<slug>`. The
71
+ * caller turns this into the right `do`/`advance` arg/dispatch.
72
+ */
73
+ namespace: SelectedNamespace;
74
+ }
75
+
76
+ /**
77
+ * A lifecycle-pool selected item (task `advance-autopick-lifecycle-pools`). It is
78
+ * a {@link SelectedItem} — the same shape — carrying the lifecycle namespace
79
+ * (`observation` for triage; `task`/`prd` for a `needsAnswers`-blocked item the
80
+ * tick will surface/apply). A distinct alias names the lifecycle pools at the
81
+ * call sites WITHOUT a structural difference (the discriminator is `namespace`).
82
+ */
83
+ export type LifecycleSelectedItem = SelectedItem;
84
+
85
+ /** A prd candidate for the tasking pool, before the eligibility gate runs. */
86
+ export interface SpecCandidate {
87
+ repoPath: string;
88
+ slug: string;
89
+ humanOnly: HumanOnlyGate;
90
+ needsAnswers: HumanOnlyGate;
91
+ taskedAfter: string[];
92
+ }
93
+
94
+ /** Inputs to {@link taskableSpecs}: the raw prd pool + the gate context. */
95
+ export interface TaskableSpecsInput {
96
+ /** Every prd enumerated from `work/prds/ready/` (the auto-task candidate source). */
97
+ candidates: SpecCandidate[];
98
+ /** Slugs whose prd resides in `work/prds/tasked/` (resolves `taskedAfter`). */
99
+ taskedSlugs: Set<string>;
100
+ /** The repo's resolved `autoTask` policy (`autoslice-gate`'s per-repo key). */
101
+ autoTask: boolean;
102
+ }
103
+
104
+ /**
105
+ * Filter a raw prd pool down to the TASKABLE prds, in declaration order, using
106
+ * `autoslice-gate`'s pure predicate ({@link resolveTaskingEligibility}) — NOT a
107
+ * reinvented eligibility model. A prd is taskable iff `needsAnswers !== true &&
108
+ * humanOnly !== true && autoTask` AND every `taskedAfter` prd is already tasked.
109
+ * Pure: no I/O (the caller reads the pool through `ledgerRead.resolveSpecPool`).
110
+ */
111
+ export function taskableSpecs(input: TaskableSpecsInput): SpecCandidate[] {
112
+ return input.candidates.filter(
113
+ (spec) =>
114
+ resolveTaskingEligibility({
115
+ humanOnly: spec.humanOnly,
116
+ needsAnswers: spec.needsAnswers,
117
+ taskedAfter: spec.taskedAfter,
118
+ taskedSlugs: input.taskedSlugs,
119
+ autoTask: input.autoTask,
120
+ }).taskable,
121
+ );
122
+ }
123
+
124
+ /** Inputs to {@link selectPrioritised}: the pools + ordering + count. */
125
+ export interface SelectPrioritisedInput {
126
+ /**
127
+ * The task pool source — a `scan` report (task-only, the existing model) +
128
+ * the concurrency/selection caps. The helper runs the EXISTING
129
+ * {@link selectCandidates} over it, so the task ordering is byte-identical to
130
+ * what `run` selects (the shared primitive).
131
+ */
132
+ report: ScanReport;
133
+ /** Caps for the task-pool selection (round-robin/per-repo/total). */
134
+ caps: SelectCaps;
135
+ /**
136
+ * The ALREADY-FILTERED taskable spec pool (run {@link taskableSpecs} first).
137
+ * In declaration order; this helper does not re-gate them.
138
+ */
139
+ specs: SpecCandidate[];
140
+ /**
141
+ * The configurable selection ORDER across the four ORDERABLE pools (`build` /
142
+ * `task` / `surface` / `triage`), as a PRESET keyword or an explicit pool-name
143
+ * list (task `advance-selection-order-config`; the `selectionOrder` config
144
+ * field). Resolved through {@link resolveSelectionOrder} (apply is pinned first
145
+ * and NOT nameable here). OMITTED ⇒ the `drain` default (`[build, task,
146
+ * surface, triage]`), which reproduces today's tasks-first "drain before
147
+ * create" two-pool default. `[task, build, ...]` reproduces the old
148
+ * `prdsFirst: true`. An unknown name/keyword FAILS LOUDLY.
149
+ */
150
+ selectionOrder?: SelectionOrderConfig;
151
+ /**
152
+ * How many items to take across ALL pools, in priority order. Auto-pick = 1;
153
+ * `do -n <x>` = x. Unset ⇒ take ALL eligible items (the priority order is still
154
+ * applied). Sequential — NOT a parallelism knob.
155
+ */
156
+ count?: number;
157
+ /**
158
+ * The OPTIONAL lifecycle pools (task `advance-autopick-lifecycle-pools`),
159
+ * constructed CALLER-SIDE (the `advance` callers only) and passed in — exactly
160
+ * as {@link prds} is. DEFAULTS to none, so `performDoAuto` (which passes only
161
+ * its two pools) is provably UNCHANGED: `do` auto-pick never selects an
162
+ * observation or a `needsAnswers` item. ONLY the `advance` callers
163
+ * (`performAdvanceAuto` / the mirror-side advance path) supply these.
164
+ *
165
+ * Ordered per the resolved {@link selectionOrder}: `apply` is ALWAYS prepended
166
+ * (pinned first — consume-always-wins), then the four orderable pools (`build` /
167
+ * `task` / `surface` / `triage`) in the configured order, truncated to
168
+ * {@link count}. A pool NAMED in the order but absent here (gated off — empty)
169
+ * is simply a no-op (it contributes no items), so the gates (what is PRESENT)
170
+ * and `selectionOrder` (what runs first) compose ORTHOGONALLY.
171
+ */
172
+ lifecycle?: SelectedLifecyclePools;
173
+ /**
174
+ * The HELD-SLUG set to SUBTRACT from the `build` pool (eligible TASKS) — prd
175
+ * `ledger-status-per-item-lock-refs` US #15, task
176
+ * `claim-acquires-unified-lock-no-body-move`. A task whose per-item lock is
177
+ * currently held is dropped from selection, so the eligible pool is "in
178
+ * `backlog/` on `main` AND no lock held". Normally the `report` is already
179
+ * subtracted at {@link scoreItems} time (the readers gather held locks), so this
180
+ * is a SECOND, explicit guard for callers that build the report WITHOUT the
181
+ * subtraction; OMITTED ⇒ no extra filtering. Redundant-but-harmless while the
182
+ * body still moves to `in-progress/`; in force for task #9.
183
+ */
184
+ heldSlugs?: Set<string>;
185
+ }
186
+
187
+ /** The (optional) lifecycle pools handed to {@link selectPrioritised}, pre-built. */
188
+ export interface SelectedLifecyclePools {
189
+ /** `apply` items (answered sidecars; CONSUME, always present when supplied). */
190
+ apply: LifecycleSelectedItem[];
191
+ /** `surface` items (blocked, no all-answered sidecar; already gate-filtered). */
192
+ surface: LifecycleSelectedItem[];
193
+ /** `triage` items (untriaged observations; already gate-filtered). */
194
+ triage: LifecycleSelectedItem[];
195
+ }
196
+
197
+ /**
198
+ * Build the ordered, counted list of items to do across the (up to) FIVE pools,
199
+ * applying the configurable {@link selectionOrder} with `apply` PINNED FIRST and
200
+ * the count bound. The task pool is selected via the EXISTING
201
+ * {@link selectCandidates} (the shared primitive `run` uses); the prd pool is the
202
+ * pre-filtered {@link taskableSpecs} output; the lifecycle pools (`apply` /
203
+ * `surface` / `triage`) are caller-built (none for `do`).
204
+ *
205
+ * Ordering: `apply` is always prepended (consume-always-wins; not orderable),
206
+ * then the four orderable pools (`build` = eligible tasks, `task` = taskable
207
+ * prds, `surface`, `triage`) interleaved in the resolved {@link selectionOrder}
208
+ * (default `drain` = `[build, task, surface, triage]`, which reproduces today's
209
+ * tasks-first two-pool default). A pool named in the order but EMPTY (gated off)
210
+ * contributes nothing — a no-op, not an error (gates decide what is PRESENT,
211
+ * `selectionOrder` ranks what is present). Then truncated to `count`.
212
+ *
213
+ * Deterministic + pure. The caller runs the existing `do` pipeline per returned
214
+ * item, SEQUENTIALLY.
215
+ */
216
+ export function selectPrioritised(
217
+ input: SelectPrioritisedInput,
218
+ ): SelectedItem[] {
219
+ const held = input.heldSlugs;
220
+ const buildItems: SelectedItem[] = selectCandidates(input.report, input.caps)
221
+ .filter((candidate: Candidate) => !held || !held.has(candidate.slug))
222
+ .map((candidate: Candidate) => ({
223
+ repoPath: candidate.repoPath,
224
+ slug: candidate.slug,
225
+ namespace: 'task' as const,
226
+ }));
227
+
228
+ const taskItems: SelectedItem[] = input.specs.map((spec) => ({
229
+ repoPath: spec.repoPath,
230
+ slug: spec.slug,
231
+ namespace: 'spec' as const,
232
+ }));
233
+
234
+ const lifecycle = input.lifecycle;
235
+
236
+ // The per-pool item lists, keyed by the orderable pool name. NOTE the
237
+ // vocabulary bridge: `build` = the eligible-TASK pool (namespace `task`),
238
+ // `task` = the taskable-prd pool (namespace `prd`) — the action names, not the
239
+ // item namespaces (task `advance-selection-order-config`).
240
+ const byPool: Record<SelectionPool, SelectedItem[]> = {
241
+ build: buildItems,
242
+ task: taskItems,
243
+ surface: lifecycle?.surface ?? [],
244
+ triage: lifecycle?.triage ?? [],
245
+ };
246
+
247
+ // Resolve the configured order (preset or explicit list; unknown name/keyword
248
+ // FAILS LOUDLY here). OMITTED ⇒ the `drain` default.
249
+ const order = resolveSelectionOrder(
250
+ input.selectionOrder ?? DEFAULT_SELECTION_ORDER,
251
+ );
252
+
253
+ // `apply` is ALWAYS first (pinned, not orderable), then the four orderable
254
+ // pools in the resolved order. An absent (gated-off) pool's list is empty, so it
255
+ // drops out cleanly — no special-casing.
256
+ const applyItems = lifecycle?.apply ?? [];
257
+ const ordered: SelectedItem[] = [
258
+ ...applyItems,
259
+ ...order.flatMap((pool) => byPool[pool]),
260
+ ];
261
+
262
+ if (input.count === undefined) {
263
+ return ordered;
264
+ }
265
+ return ordered.slice(0, Math.max(0, input.count));
266
+ }
package/src/select.ts ADDED
@@ -0,0 +1,62 @@
1
+ import type {ScanReport} from './scan.js';
2
+
3
+ /** One item the runner intends to claim+run, identified by repo + slug. */
4
+ export interface Candidate {
5
+ repoPath: string;
6
+ slug: string;
7
+ }
8
+
9
+ export interface SelectCaps {
10
+ /** Global cap on items claimed+run in one tick. */
11
+ maxParallel: number;
12
+ /** Per-repo cap on concurrent claims. */
13
+ perRepoMax: number;
14
+ }
15
+
16
+ /**
17
+ * Build the ordered list of candidates to attempt from a `scan` report,
18
+ * respecting the concurrency caps. Only eligible items are considered. Selection
19
+ * is round-robin across repos for fairness (so a single busy repo cannot starve
20
+ * the others under `maxParallel`), capping each repo at `perRepoMax` and the
21
+ * total at `maxParallel`. Deterministic: repos and items are already sorted by
22
+ * the scan core.
23
+ *
24
+ * NOTE: this is optimistic selection only — actual ownership is decided by the
25
+ * arbiter when the claim CAS runs. A candidate that loses the race is dropped then.
26
+ */
27
+ export function selectCandidates(
28
+ report: ScanReport,
29
+ caps: SelectCaps,
30
+ ): Candidate[] {
31
+ // Per-repo queues of eligible slugs, preserving scan order.
32
+ const queues = report.repos.map((repo) => ({
33
+ path: repo.path,
34
+ slugs: repo.items
35
+ .filter((item) => item.eligibility.eligible)
36
+ .map((item) => item.slug),
37
+ taken: 0,
38
+ }));
39
+
40
+ const picks: Candidate[] = [];
41
+ let progress = true;
42
+ while (picks.length < caps.maxParallel && progress) {
43
+ progress = false;
44
+ for (const queue of queues) {
45
+ if (picks.length >= caps.maxParallel) {
46
+ break;
47
+ }
48
+ if (queue.taken >= caps.perRepoMax) {
49
+ continue;
50
+ }
51
+ const next = queue.slugs[queue.taken];
52
+ if (next === undefined) {
53
+ continue;
54
+ }
55
+ picks.push({repoPath: queue.path, slug: next});
56
+ queue.taken++;
57
+ progress = true;
58
+ }
59
+ }
60
+
61
+ return picks;
62
+ }
@@ -0,0 +1,153 @@
1
+ import {homedir} from 'node:os';
2
+ import {join, resolve} from 'node:path';
3
+
4
+ /**
5
+ * pi's env override for its agent dir. Real pi reads
6
+ * `${APP_NAME.toUpperCase()}_CODING_AGENT_DIR` (i.e. `PI_CODING_AGENT_DIR`) in its
7
+ * `getAgentDir()` (verified vs pinned source `config.ts`); when set, ALL of pi's
8
+ * default session paths move under it. dorfl's replica MUST honour the same
9
+ * var, or a user/CI that points pi at a custom agent dir would have dorfl
10
+ * write sessions to `~/.pi/agent/sessions` while pi reads the custom dir — sessions
11
+ * then invisible to pi AND pi-remote (the very breakage this task fixes). Also the
12
+ * clean lever for test isolation (point it at a scratch dir). NOTE: we honour only
13
+ * the agent-dir var, not pi's separate `PI_CODING_AGENT_SESSION_DIR` — dorfl
14
+ * already has its own `sessionsDir` override for that role.
15
+ */
16
+ const PI_AGENT_DIR_ENV = 'PI_CODING_AGENT_DIR';
17
+
18
+ /** Expand a leading `~`/`~/` to the home dir (pi's `expandTildePath` behaviour). */
19
+ function expandTilde(p: string): string {
20
+ if (p === '~') {
21
+ return homedir();
22
+ }
23
+ if (p.startsWith('~/') || p.startsWith('~\\')) {
24
+ return join(homedir(), p.slice(2));
25
+ }
26
+ return p;
27
+ }
28
+
29
+ /**
30
+ * Generate the **full pi session-file path** the harness passes as `--session
31
+ * <path>` (task `session-path-pi-default`). This is the single source of the
32
+ * session path: the caller generates it ONCE (before pi launches, so the
33
+ * `do --watch` tailer can tail the KNOWN path) and threads it into BOTH the
34
+ * adapter (`LaunchInput.session`) and the tailer.
35
+ *
36
+ * ## Why a full FILE path, not `--session-dir`
37
+ *
38
+ * dorfl used to pin `--session-dir <cwd>/.dorfl-pi-session`, which
39
+ * (1) hid sessions from the pi-remote dashboard (`SessionManager.listAll()` only
40
+ * scans `~/.pi/agent/sessions/`), (2) made `do --watch` race onto a stale
41
+ * prior-run log (newest-by-mtime in a shared dir), and (3) polluted the in-place
42
+ * checkout with an untracked dir. Passing `--session <full-path>` fixes all
43
+ * three: pi creates+writes the session at exactly that path, it takes precedence
44
+ * over `--session-dir`, and the watcher tails a path it knew before pi started.
45
+ *
46
+ * ## The four load-bearing pi `--session` invariants (verified vs pinned pi
47
+ * source `core/session-manager.ts` + `main.ts` `resolveSessionPath`)
48
+ *
49
+ * 1. **The arg MUST be PATH-SHAPED — absolute and ending `.jsonl`.** pi's
50
+ * `resolveSessionPath` takes the file-path branch ONLY when the arg contains
51
+ * a slash OR ends `.jsonl`; otherwise it treats the arg as a session-ID to
52
+ * look up, fails `not_found`, and pi EXITS 1. So `<sessionsDir>/<id>.jsonl`
53
+ * is required (a bare id would kill the run).
54
+ * 2. **pi creates+writes a NON-EXISTENT `--session` path** (`SessionManager.open`
55
+ * on a missing file → `newSession()` pinned to the path). So the FILENAME
56
+ * must be UNIQUE PER LAUNCH: a reused name on an existing non-empty file would
57
+ * make pi LOAD + APPEND (resume), silently replaying the prior run.
58
+ * 3. **The header `cwd` falls back to `process.cwd()` for a new file** (no header
59
+ * to read), so dashboard repo-grouping is correct ONLY because the adapter
60
+ * spawns pi with `cwd: input.dir`. The FOLDER does not imply the repo.
61
+ * 4. **`listAll` is NON-RECURSIVE (one level):** a session is dashboard-visible
62
+ * via the default `listAll()` ONLY as a `.jsonl` DIRECTLY inside a first-level
63
+ * subdir of `~/.pi/agent/sessions/` — which the default {@link
64
+ * piDefaultSessionDir} (a direct child) gives.
65
+ *
66
+ * ## Why the slug helper is replicated, not imported
67
+ *
68
+ * dorfl depends ONLY on `commander` (see
69
+ * `work/notes/observations/task-premise-pi-coding-agent-not-a-dep.md`). pi's exported
70
+ * `getDefaultSessionDir(cwd)` lives in `@earendil-works/pi-coding-agent`, whose
71
+ * dependency tree is heavy (`pi-agent-core`, `pi-ai`, `zod`, `ws`). Pulling that
72
+ * in for one tiny slug function is not worth it, so the encoding is REPLICATED
73
+ * here (the same choice the do-watch task made for its session-log type). The
74
+ * encoding is verified verbatim against pinned pi source `getDefaultSessionDirPath`:
75
+ *
76
+ * join(agentDir, 'sessions', `--${resolve(cwd).replace(/^[/\\]/,'').replace(/[/\\:]/g,'-')}--`)
77
+ *
78
+ * where `agentDir` is `~/.pi/agent`. If a runtime dep on pi-coding-agent is ever
79
+ * wanted, swapping this for the import is a one-line change.
80
+ */
81
+
82
+ /**
83
+ * pi's agent dir — the parent of `sessions/`. Honours `PI_CODING_AGENT_DIR`
84
+ * (matching real pi's `getAgentDir()`), else `~/.pi/agent`. Read at call time (not
85
+ * cached) so a test setting `process.env.PI_CODING_AGENT_DIR` is respected.
86
+ */
87
+ function piAgentDir(): string {
88
+ const override = process.env[PI_AGENT_DIR_ENV];
89
+ if (override !== undefined && override !== '') {
90
+ return expandTilde(override);
91
+ }
92
+ return join(homedir(), '.pi', 'agent');
93
+ }
94
+
95
+ /**
96
+ * pi's DEFAULT per-cwd sessions folder for `cwd` — a direct child of
97
+ * `~/.pi/agent/sessions/` (invariant #4), so the dashboard's non-recursive
98
+ * `listAll()` scans it and groups by the session header `cwd`. Replicates pi's
99
+ * `getDefaultSessionDirPath` encoding verbatim (verified vs pinned source). PURE
100
+ * (does not create the folder — the parent is ensured at generation time / by
101
+ * pi's own `SessionManager.open`).
102
+ */
103
+ export function piDefaultSessionDir(cwd: string): string {
104
+ const resolvedCwd = resolve(cwd);
105
+ const safe = `--${resolvedCwd.replace(/^[/\\]/, '').replace(/[/\\:]/g, '-')}--`;
106
+ return join(piAgentDir(), 'sessions', safe);
107
+ }
108
+
109
+ /**
110
+ * Build a filename STEM that is UNIQUE PER LAUNCH (invariant #2). The `id`
111
+ * (slug for in-place, work-id for job-worktree) is the human-readable anchor; a
112
+ * timestamp + a short random suffix make it collision-proof even for two
113
+ * launches in the same millisecond / same checkout reusing the same slug.
114
+ */
115
+ function uniqueStem(id: string): string {
116
+ const ts = Date.now().toString(36);
117
+ const rand = Math.random().toString(36).slice(2, 8);
118
+ return `${id}-${ts}-${rand}`;
119
+ }
120
+
121
+ /** Inputs to {@link generateSessionPath}. */
122
+ export interface GenerateSessionPathInput {
123
+ /**
124
+ * The HOST-ONLY sessions root (resolved `config.sessionsDir`). `undefined`
125
+ * (unset) ⇒ pi's default per-cwd folder for {@link cwd} (the DYNAMIC default,
126
+ * kept in this ONE place — never smeared across config defaulting).
127
+ */
128
+ sessionsDir?: string;
129
+ /** The job cwd pi is spawned in — used for the unset-default folder. */
130
+ cwd: string;
131
+ /**
132
+ * A human-readable id for the filename stem (the slug in-place, the work-id
133
+ * for a job worktree). Made unique per launch internally.
134
+ */
135
+ id: string;
136
+ }
137
+
138
+ /**
139
+ * Generate the absolute, `.jsonl`-ending session FILE path to pass as
140
+ * `--session <path>` (invariant #1). `<root>/<id>-<unique>.jsonl`, where `<root>`
141
+ * is the resolved `sessionsDir` or — when unset — pi's default per-cwd folder
142
+ * (the DYNAMIC default). The path is ABSOLUTE (resolved against the process cwd
143
+ * if a relative `sessionsDir` was given) and the stem is unique per launch, so a
144
+ * second launch in the same checkout never appends to / replays the first's
145
+ * session.
146
+ */
147
+ export function generateSessionPath(input: GenerateSessionPathInput): string {
148
+ const root =
149
+ input.sessionsDir !== undefined && input.sessionsDir !== ''
150
+ ? resolve(input.sessionsDir)
151
+ : piDefaultSessionDir(input.cwd);
152
+ return join(root, `${uniqueStem(input.id)}.jsonl`);
153
+ }