dorfl 0.0.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (619) hide show
  1. package/dist/advance-ci-template.d.ts +73 -0
  2. package/dist/advance-ci-template.d.ts.map +1 -0
  3. package/dist/advance-ci-template.js +104 -0
  4. package/dist/advance-ci-template.js.map +1 -0
  5. package/dist/advance-classify.d.ts +132 -0
  6. package/dist/advance-classify.d.ts.map +1 -0
  7. package/dist/advance-classify.js +120 -0
  8. package/dist/advance-classify.js.map +1 -0
  9. package/dist/advance-drivers.d.ts +182 -0
  10. package/dist/advance-drivers.d.ts.map +1 -0
  11. package/dist/advance-drivers.js +231 -0
  12. package/dist/advance-drivers.js.map +1 -0
  13. package/dist/advance-isolated.d.ts +156 -0
  14. package/dist/advance-isolated.d.ts.map +1 -0
  15. package/dist/advance-isolated.js +256 -0
  16. package/dist/advance-isolated.js.map +1 -0
  17. package/dist/advance-lifecycle-template.d.ts +107 -0
  18. package/dist/advance-lifecycle-template.d.ts.map +1 -0
  19. package/dist/advance-lifecycle-template.js +668 -0
  20. package/dist/advance-lifecycle-template.js.map +1 -0
  21. package/dist/advance-loop-driver.d.ts +325 -0
  22. package/dist/advance-loop-driver.d.ts.map +1 -0
  23. package/dist/advance-loop-driver.js +437 -0
  24. package/dist/advance-loop-driver.js.map +1 -0
  25. package/dist/advance-treeless-publish.d.ts +108 -0
  26. package/dist/advance-treeless-publish.d.ts.map +1 -0
  27. package/dist/advance-treeless-publish.js +71 -0
  28. package/dist/advance-treeless-publish.js.map +1 -0
  29. package/dist/advance.d.ts +340 -0
  30. package/dist/advance.d.ts.map +1 -0
  31. package/dist/advance.js +1122 -0
  32. package/dist/advance.js.map +1 -0
  33. package/dist/advancing-lock.d.ts +294 -0
  34. package/dist/advancing-lock.d.ts.map +1 -0
  35. package/dist/advancing-lock.js +594 -0
  36. package/dist/advancing-lock.js.map +1 -0
  37. package/dist/agent-launch.d.ts +79 -0
  38. package/dist/agent-launch.d.ts.map +1 -0
  39. package/dist/agent-launch.js +61 -0
  40. package/dist/agent-launch.js.map +1 -0
  41. package/dist/agent-stop.d.ts +149 -0
  42. package/dist/agent-stop.d.ts.map +1 -0
  43. package/dist/agent-stop.js +307 -0
  44. package/dist/agent-stop.js.map +1 -0
  45. package/dist/apply-decide.d.ts +127 -0
  46. package/dist/apply-decide.d.ts.map +1 -0
  47. package/dist/apply-decide.js +176 -0
  48. package/dist/apply-decide.js.map +1 -0
  49. package/dist/apply-merge-action.d.ts +206 -0
  50. package/dist/apply-merge-action.d.ts.map +1 -0
  51. package/dist/apply-merge-action.js +307 -0
  52. package/dist/apply-merge-action.js.map +1 -0
  53. package/dist/apply-persist.d.ts +174 -0
  54. package/dist/apply-persist.d.ts.map +1 -0
  55. package/dist/apply-persist.js +359 -0
  56. package/dist/apply-persist.js.map +1 -0
  57. package/dist/arbiter.d.ts +120 -0
  58. package/dist/arbiter.d.ts.map +1 -0
  59. package/dist/arbiter.js +255 -0
  60. package/dist/arbiter.js.map +1 -0
  61. package/dist/brand.d.ts +70 -0
  62. package/dist/brand.d.ts.map +1 -0
  63. package/dist/brand.js +84 -0
  64. package/dist/brand.js.map +1 -0
  65. package/dist/buildable-body.d.ts +132 -0
  66. package/dist/buildable-body.d.ts.map +1 -0
  67. package/dist/buildable-body.js +131 -0
  68. package/dist/buildable-body.js.map +1 -0
  69. package/dist/categorise.d.ts +66 -0
  70. package/dist/categorise.d.ts.map +1 -0
  71. package/dist/categorise.js +106 -0
  72. package/dist/categorise.js.map +1 -0
  73. package/dist/claim-cas.d.ts +117 -0
  74. package/dist/claim-cas.d.ts.map +1 -0
  75. package/dist/claim-cas.js +312 -0
  76. package/dist/claim-cas.js.map +1 -0
  77. package/dist/cli-spinner.d.ts +112 -0
  78. package/dist/cli-spinner.d.ts.map +1 -0
  79. package/dist/cli-spinner.js +157 -0
  80. package/dist/cli-spinner.js.map +1 -0
  81. package/dist/cli.d.ts +11 -0
  82. package/dist/cli.d.ts.map +1 -0
  83. package/dist/cli.js +3100 -0
  84. package/dist/cli.js.map +1 -0
  85. package/dist/close-job-template.d.ts +70 -0
  86. package/dist/close-job-template.d.ts.map +1 -0
  87. package/dist/close-job-template.js +180 -0
  88. package/dist/close-job-template.js.map +1 -0
  89. package/dist/close-job.d.ts +95 -0
  90. package/dist/close-job.d.ts.map +1 -0
  91. package/dist/close-job.js +226 -0
  92. package/dist/close-job.js.map +1 -0
  93. package/dist/complete.d.ts +361 -0
  94. package/dist/complete.d.ts.map +1 -0
  95. package/dist/complete.js +885 -0
  96. package/dist/complete.js.map +1 -0
  97. package/dist/concurrency.d.ts +68 -0
  98. package/dist/concurrency.d.ts.map +1 -0
  99. package/dist/concurrency.js +112 -0
  100. package/dist/concurrency.js.map +1 -0
  101. package/dist/config-override.d.ts +76 -0
  102. package/dist/config-override.d.ts.map +1 -0
  103. package/dist/config-override.js +50 -0
  104. package/dist/config-override.js.map +1 -0
  105. package/dist/config.d.ts +668 -0
  106. package/dist/config.d.ts.map +1 -0
  107. package/dist/config.js +241 -0
  108. package/dist/config.js.map +1 -0
  109. package/dist/continue-branch.d.ts +249 -0
  110. package/dist/continue-branch.d.ts.map +1 -0
  111. package/dist/continue-branch.js +389 -0
  112. package/dist/continue-branch.js.map +1 -0
  113. package/dist/cwd-section.d.ts +186 -0
  114. package/dist/cwd-section.d.ts.map +1 -0
  115. package/dist/cwd-section.js +209 -0
  116. package/dist/cwd-section.js.map +1 -0
  117. package/dist/decision-engine.d.ts +170 -0
  118. package/dist/decision-engine.d.ts.map +1 -0
  119. package/dist/decision-engine.js +136 -0
  120. package/dist/decision-engine.js.map +1 -0
  121. package/dist/detect.d.ts +17 -0
  122. package/dist/detect.d.ts.map +1 -0
  123. package/dist/detect.js +118 -0
  124. package/dist/detect.js.map +1 -0
  125. package/dist/do-autopick.d.ts +85 -0
  126. package/dist/do-autopick.d.ts.map +1 -0
  127. package/dist/do-autopick.js +112 -0
  128. package/dist/do-autopick.js.map +1 -0
  129. package/dist/do-config.d.ts +312 -0
  130. package/dist/do-config.d.ts.map +1 -0
  131. package/dist/do-config.js +358 -0
  132. package/dist/do-config.js.map +1 -0
  133. package/dist/do-remote-auto.d.ts +75 -0
  134. package/dist/do-remote-auto.d.ts.map +1 -0
  135. package/dist/do-remote-auto.js +111 -0
  136. package/dist/do-remote-auto.js.map +1 -0
  137. package/dist/do.d.ts +621 -0
  138. package/dist/do.d.ts.map +1 -0
  139. package/dist/do.js +1882 -0
  140. package/dist/do.js.map +1 -0
  141. package/dist/drop-source.d.ts +96 -0
  142. package/dist/drop-source.d.ts.map +1 -0
  143. package/dist/drop-source.js +91 -0
  144. package/dist/drop-source.js.map +1 -0
  145. package/dist/eligibility.d.ts +46 -0
  146. package/dist/eligibility.d.ts.map +1 -0
  147. package/dist/eligibility.js +34 -0
  148. package/dist/eligibility.js.map +1 -0
  149. package/dist/env-config.d.ts +51 -0
  150. package/dist/env-config.d.ts.map +1 -0
  151. package/dist/env-config.js +272 -0
  152. package/dist/env-config.js.map +1 -0
  153. package/dist/failure-cause.d.ts +70 -0
  154. package/dist/failure-cause.d.ts.map +1 -0
  155. package/dist/failure-cause.js +126 -0
  156. package/dist/failure-cause.js.map +1 -0
  157. package/dist/format.d.ts +43 -0
  158. package/dist/format.d.ts.map +1 -0
  159. package/dist/format.js +256 -0
  160. package/dist/format.js.map +1 -0
  161. package/dist/frontmatter.d.ts +208 -0
  162. package/dist/frontmatter.d.ts.map +1 -0
  163. package/dist/frontmatter.js +344 -0
  164. package/dist/frontmatter.js.map +1 -0
  165. package/dist/gate-readiness.d.ts +84 -0
  166. package/dist/gate-readiness.d.ts.map +1 -0
  167. package/dist/gate-readiness.js +103 -0
  168. package/dist/gate-readiness.js.map +1 -0
  169. package/dist/gc.d.ts +165 -0
  170. package/dist/gc.d.ts.map +1 -0
  171. package/dist/gc.js +313 -0
  172. package/dist/gc.js.map +1 -0
  173. package/dist/gh-failure.d.ts +42 -0
  174. package/dist/gh-failure.d.ts.map +1 -0
  175. package/dist/gh-failure.js +49 -0
  176. package/dist/gh-failure.js.map +1 -0
  177. package/dist/git.d.ts +75 -0
  178. package/dist/git.d.ts.map +1 -0
  179. package/dist/git.js +130 -0
  180. package/dist/git.js.map +1 -0
  181. package/dist/github.d.ts +187 -0
  182. package/dist/github.d.ts.map +1 -0
  183. package/dist/github.js +343 -0
  184. package/dist/github.js.map +1 -0
  185. package/dist/harness.d.ts +242 -0
  186. package/dist/harness.d.ts.map +1 -0
  187. package/dist/harness.js +157 -0
  188. package/dist/harness.js.map +1 -0
  189. package/dist/identity.d.ts +167 -0
  190. package/dist/identity.d.ts.map +1 -0
  191. package/dist/identity.js +231 -0
  192. package/dist/identity.js.map +1 -0
  193. package/dist/index.d.ts +147 -0
  194. package/dist/index.d.ts.map +1 -0
  195. package/dist/index.js +76 -0
  196. package/dist/index.js.map +1 -0
  197. package/dist/install-ci-branch-protection.d.ts +147 -0
  198. package/dist/install-ci-branch-protection.d.ts.map +1 -0
  199. package/dist/install-ci-branch-protection.js +166 -0
  200. package/dist/install-ci-branch-protection.js.map +1 -0
  201. package/dist/install-ci-capabilities/advance-lifecycle.d.ts +15 -0
  202. package/dist/install-ci-capabilities/advance-lifecycle.d.ts.map +1 -0
  203. package/dist/install-ci-capabilities/advance-lifecycle.js +28 -0
  204. package/dist/install-ci-capabilities/advance-lifecycle.js.map +1 -0
  205. package/dist/install-ci-capabilities/close-job.d.ts +13 -0
  206. package/dist/install-ci-capabilities/close-job.d.ts.map +1 -0
  207. package/dist/install-ci-capabilities/close-job.js +26 -0
  208. package/dist/install-ci-capabilities/close-job.js.map +1 -0
  209. package/dist/install-ci-capabilities/example-noop.d.ts +16 -0
  210. package/dist/install-ci-capabilities/example-noop.d.ts.map +1 -0
  211. package/dist/install-ci-capabilities/example-noop.js +23 -0
  212. package/dist/install-ci-capabilities/example-noop.js.map +1 -0
  213. package/dist/install-ci-capabilities/intake.d.ts +15 -0
  214. package/dist/install-ci-capabilities/intake.d.ts.map +1 -0
  215. package/dist/install-ci-capabilities/intake.js +28 -0
  216. package/dist/install-ci-capabilities/intake.js.map +1 -0
  217. package/dist/install-ci-capabilities/verify.d.ts +14 -0
  218. package/dist/install-ci-capabilities/verify.d.ts.map +1 -0
  219. package/dist/install-ci-capabilities/verify.js +27 -0
  220. package/dist/install-ci-capabilities/verify.js.map +1 -0
  221. package/dist/install-ci-core.d.ts +446 -0
  222. package/dist/install-ci-core.d.ts.map +1 -0
  223. package/dist/install-ci-core.js +760 -0
  224. package/dist/install-ci-core.js.map +1 -0
  225. package/dist/install-ci-github.d.ts +167 -0
  226. package/dist/install-ci-github.d.ts.map +1 -0
  227. package/dist/install-ci-github.js +315 -0
  228. package/dist/install-ci-github.js.map +1 -0
  229. package/dist/install-ci.d.ts +105 -0
  230. package/dist/install-ci.d.ts.map +1 -0
  231. package/dist/install-ci.js +363 -0
  232. package/dist/install-ci.js.map +1 -0
  233. package/dist/intake-event.d.ts +88 -0
  234. package/dist/intake-event.d.ts.map +1 -0
  235. package/dist/intake-event.js +66 -0
  236. package/dist/intake-event.js.map +1 -0
  237. package/dist/intake-marker.d.ts +95 -0
  238. package/dist/intake-marker.d.ts.map +1 -0
  239. package/dist/intake-marker.js +127 -0
  240. package/dist/intake-marker.js.map +1 -0
  241. package/dist/intake-triage.d.ts +48 -0
  242. package/dist/intake-triage.d.ts.map +1 -0
  243. package/dist/intake-triage.js +95 -0
  244. package/dist/intake-triage.js.map +1 -0
  245. package/dist/intake-trigger-template.d.ts +185 -0
  246. package/dist/intake-trigger-template.d.ts.map +1 -0
  247. package/dist/intake-trigger-template.js +449 -0
  248. package/dist/intake-trigger-template.js.map +1 -0
  249. package/dist/intake.d.ts +569 -0
  250. package/dist/intake.d.ts.map +1 -0
  251. package/dist/intake.js +1628 -0
  252. package/dist/intake.js.map +1 -0
  253. package/dist/integration-core.d.ts +539 -0
  254. package/dist/integration-core.d.ts.map +1 -0
  255. package/dist/integration-core.js +2195 -0
  256. package/dist/integration-core.js.map +1 -0
  257. package/dist/integrator.d.ts +343 -0
  258. package/dist/integrator.d.ts.map +1 -0
  259. package/dist/integrator.js +400 -0
  260. package/dist/integrator.js.map +1 -0
  261. package/dist/isolation.d.ts +219 -0
  262. package/dist/isolation.d.ts.map +1 -0
  263. package/dist/isolation.js +261 -0
  264. package/dist/isolation.js.map +1 -0
  265. package/dist/issue-provider.d.ts +349 -0
  266. package/dist/issue-provider.d.ts.map +1 -0
  267. package/dist/issue-provider.js +360 -0
  268. package/dist/issue-provider.js.map +1 -0
  269. package/dist/item-lock.d.ts +626 -0
  270. package/dist/item-lock.d.ts.map +1 -0
  271. package/dist/item-lock.js +1381 -0
  272. package/dist/item-lock.js.map +1 -0
  273. package/dist/item-path.d.ts +49 -0
  274. package/dist/item-path.d.ts.map +1 -0
  275. package/dist/item-path.js +66 -0
  276. package/dist/item-path.js.map +1 -0
  277. package/dist/ledger-lint.d.ts +129 -0
  278. package/dist/ledger-lint.d.ts.map +1 -0
  279. package/dist/ledger-lint.js +249 -0
  280. package/dist/ledger-lint.js.map +1 -0
  281. package/dist/ledger-read.d.ts +357 -0
  282. package/dist/ledger-read.d.ts.map +1 -0
  283. package/dist/ledger-read.js +442 -0
  284. package/dist/ledger-read.js.map +1 -0
  285. package/dist/ledger-write.d.ts +330 -0
  286. package/dist/ledger-write.d.ts.map +1 -0
  287. package/dist/ledger-write.js +411 -0
  288. package/dist/ledger-write.js.map +1 -0
  289. package/dist/lifecycle-gather.d.ts +30 -0
  290. package/dist/lifecycle-gather.d.ts.map +1 -0
  291. package/dist/lifecycle-gather.js +205 -0
  292. package/dist/lifecycle-gather.js.map +1 -0
  293. package/dist/lifecycle-pools.d.ts +180 -0
  294. package/dist/lifecycle-pools.d.ts.map +1 -0
  295. package/dist/lifecycle-pools.js +78 -0
  296. package/dist/lifecycle-pools.js.map +1 -0
  297. package/dist/merge-question-surfacer.d.ts +166 -0
  298. package/dist/merge-question-surfacer.d.ts.map +1 -0
  299. package/dist/merge-question-surfacer.js +297 -0
  300. package/dist/merge-question-surfacer.js.map +1 -0
  301. package/dist/mint-adr.d.ts +126 -0
  302. package/dist/mint-adr.d.ts.map +1 -0
  303. package/dist/mint-adr.js +257 -0
  304. package/dist/mint-adr.js.map +1 -0
  305. package/dist/mirror-pool-scan.d.ts +125 -0
  306. package/dist/mirror-pool-scan.d.ts.map +1 -0
  307. package/dist/mirror-pool-scan.js +104 -0
  308. package/dist/mirror-pool-scan.js.map +1 -0
  309. package/dist/needs-attention.d.ts +341 -0
  310. package/dist/needs-attention.d.ts.map +1 -0
  311. package/dist/needs-attention.js +900 -0
  312. package/dist/needs-attention.js.map +1 -0
  313. package/dist/orphan-sidecar.d.ts +79 -0
  314. package/dist/orphan-sidecar.d.ts.map +1 -0
  315. package/dist/orphan-sidecar.js +71 -0
  316. package/dist/orphan-sidecar.js.map +1 -0
  317. package/dist/output.d.ts +48 -0
  318. package/dist/output.d.ts.map +1 -0
  319. package/dist/output.js +66 -0
  320. package/dist/output.js.map +1 -0
  321. package/dist/pi-harness.d.ts +179 -0
  322. package/dist/pi-harness.d.ts.map +1 -0
  323. package/dist/pi-harness.js +342 -0
  324. package/dist/pi-harness.js.map +1 -0
  325. package/dist/placement.d.ts +99 -0
  326. package/dist/placement.d.ts.map +1 -0
  327. package/dist/placement.js +67 -0
  328. package/dist/placement.js.map +1 -0
  329. package/dist/prd-to-spec.d.ts +329 -0
  330. package/dist/prd-to-spec.d.ts.map +1 -0
  331. package/dist/prd-to-spec.js +706 -0
  332. package/dist/prd-to-spec.js.map +1 -0
  333. package/dist/prepare.d.ts +121 -0
  334. package/dist/prepare.d.ts.map +1 -0
  335. package/dist/prepare.js +140 -0
  336. package/dist/prepare.js.map +1 -0
  337. package/dist/prompt.d.ts +363 -0
  338. package/dist/prompt.d.ts.map +1 -0
  339. package/dist/prompt.js +499 -0
  340. package/dist/prompt.js.map +1 -0
  341. package/dist/protocol/ADR-FORMAT.md +47 -0
  342. package/dist/protocol/CLAIM-PROTOCOL.md +217 -0
  343. package/dist/protocol/REVIEW-PROTOCOL.md +119 -0
  344. package/dist/protocol/SURFACE-PROTOCOL.md +121 -0
  345. package/dist/protocol/TASKING-PROTOCOL.md +122 -0
  346. package/dist/protocol/WORK-CONTRACT.md +276 -0
  347. package/dist/protocol/spec-template.md +71 -0
  348. package/dist/protocol/task-template.md +65 -0
  349. package/dist/readiness.d.ts +66 -0
  350. package/dist/readiness.d.ts.map +1 -0
  351. package/dist/readiness.js +36 -0
  352. package/dist/readiness.js.map +1 -0
  353. package/dist/reap-branches.d.ts +102 -0
  354. package/dist/reap-branches.d.ts.map +1 -0
  355. package/dist/reap-branches.js +149 -0
  356. package/dist/reap-branches.js.map +1 -0
  357. package/dist/recover-isolated.d.ts +72 -0
  358. package/dist/recover-isolated.d.ts.map +1 -0
  359. package/dist/recover-isolated.js +188 -0
  360. package/dist/recover-isolated.js.map +1 -0
  361. package/dist/registry.d.ts +172 -0
  362. package/dist/registry.d.ts.map +1 -0
  363. package/dist/registry.js +296 -0
  364. package/dist/registry.js.map +1 -0
  365. package/dist/repo-config.d.ts +201 -0
  366. package/dist/repo-config.d.ts.map +1 -0
  367. package/dist/repo-config.js +414 -0
  368. package/dist/repo-config.js.map +1 -0
  369. package/dist/repo-key.d.ts +20 -0
  370. package/dist/repo-key.d.ts.map +1 -0
  371. package/dist/repo-key.js +68 -0
  372. package/dist/repo-key.js.map +1 -0
  373. package/dist/repo-mirror.d.ts +177 -0
  374. package/dist/repo-mirror.d.ts.map +1 -0
  375. package/dist/repo-mirror.js +271 -0
  376. package/dist/repo-mirror.js.map +1 -0
  377. package/dist/retry-backoff.d.ts +90 -0
  378. package/dist/retry-backoff.d.ts.map +1 -0
  379. package/dist/retry-backoff.js +98 -0
  380. package/dist/retry-backoff.js.map +1 -0
  381. package/dist/review-gate.d.ts +173 -0
  382. package/dist/review-gate.d.ts.map +1 -0
  383. package/dist/review-gate.js +261 -0
  384. package/dist/review-gate.js.map +1 -0
  385. package/dist/review-verdict.d.ts +149 -0
  386. package/dist/review-verdict.d.ts.map +1 -0
  387. package/dist/review-verdict.js +332 -0
  388. package/dist/review-verdict.js.map +1 -0
  389. package/dist/run.d.ts +221 -0
  390. package/dist/run.d.ts.map +1 -0
  391. package/dist/run.js +963 -0
  392. package/dist/run.js.map +1 -0
  393. package/dist/scan.d.ts +308 -0
  394. package/dist/scan.d.ts.map +1 -0
  395. package/dist/scan.js +374 -0
  396. package/dist/scan.js.map +1 -0
  397. package/dist/select-order.d.ts +75 -0
  398. package/dist/select-order.d.ts.map +1 -0
  399. package/dist/select-order.js +108 -0
  400. package/dist/select-order.js.map +1 -0
  401. package/dist/select-priority.d.ts +188 -0
  402. package/dist/select-priority.d.ts.map +1 -0
  403. package/dist/select-priority.js +80 -0
  404. package/dist/select-priority.js.map +1 -0
  405. package/dist/select.d.ts +25 -0
  406. package/dist/select.d.ts.map +1 -0
  407. package/dist/select.js +43 -0
  408. package/dist/select.js.map +1 -0
  409. package/dist/session-path.d.ts +36 -0
  410. package/dist/session-path.d.ts.map +1 -0
  411. package/dist/session-path.js +129 -0
  412. package/dist/session-path.js.map +1 -0
  413. package/dist/sidecar-apply.d.ts +83 -0
  414. package/dist/sidecar-apply.d.ts.map +1 -0
  415. package/dist/sidecar-apply.js +111 -0
  416. package/dist/sidecar-apply.js.map +1 -0
  417. package/dist/sidecar.d.ts +245 -0
  418. package/dist/sidecar.d.ts.map +1 -0
  419. package/dist/sidecar.js +481 -0
  420. package/dist/sidecar.js.map +1 -0
  421. package/dist/slug-namespace.d.ts +204 -0
  422. package/dist/slug-namespace.d.ts.map +1 -0
  423. package/dist/slug-namespace.js +229 -0
  424. package/dist/slug-namespace.js.map +1 -0
  425. package/dist/spec-complete.d.ts +44 -0
  426. package/dist/spec-complete.d.ts.map +1 -0
  427. package/dist/spec-complete.js +69 -0
  428. package/dist/spec-complete.js.map +1 -0
  429. package/dist/start.d.ts +97 -0
  430. package/dist/start.d.ts.map +1 -0
  431. package/dist/start.js +633 -0
  432. package/dist/start.js.map +1 -0
  433. package/dist/status.d.ts +199 -0
  434. package/dist/status.d.ts.map +1 -0
  435. package/dist/status.js +228 -0
  436. package/dist/status.js.map +1 -0
  437. package/dist/surface-gate.d.ts +162 -0
  438. package/dist/surface-gate.d.ts.map +1 -0
  439. package/dist/surface-gate.js +206 -0
  440. package/dist/surface-gate.js.map +1 -0
  441. package/dist/surface-persist.d.ts +86 -0
  442. package/dist/surface-persist.d.ts.map +1 -0
  443. package/dist/surface-persist.js +129 -0
  444. package/dist/surface-persist.js.map +1 -0
  445. package/dist/tasker-review-loop.d.ts +249 -0
  446. package/dist/tasker-review-loop.d.ts.map +1 -0
  447. package/dist/tasker-review-loop.js +369 -0
  448. package/dist/tasker-review-loop.js.map +1 -0
  449. package/dist/tasking-eligibility.d.ts +74 -0
  450. package/dist/tasking-eligibility.d.ts.map +1 -0
  451. package/dist/tasking-eligibility.js +52 -0
  452. package/dist/tasking-eligibility.js.map +1 -0
  453. package/dist/tasking-lock.d.ts +111 -0
  454. package/dist/tasking-lock.d.ts.map +1 -0
  455. package/dist/tasking-lock.js +256 -0
  456. package/dist/tasking-lock.js.map +1 -0
  457. package/dist/tasking.d.ts +275 -0
  458. package/dist/tasking.d.ts.map +1 -0
  459. package/dist/tasking.js +951 -0
  460. package/dist/tasking.js.map +1 -0
  461. package/dist/triage-gate.d.ts +127 -0
  462. package/dist/triage-gate.d.ts.map +1 -0
  463. package/dist/triage-gate.js +139 -0
  464. package/dist/triage-gate.js.map +1 -0
  465. package/dist/triage-persist.d.ts +163 -0
  466. package/dist/triage-persist.d.ts.map +1 -0
  467. package/dist/triage-persist.js +387 -0
  468. package/dist/triage-persist.js.map +1 -0
  469. package/dist/verdict-json.d.ts +32 -0
  470. package/dist/verdict-json.d.ts.map +1 -0
  471. package/dist/verdict-json.js +74 -0
  472. package/dist/verdict-json.js.map +1 -0
  473. package/dist/verify-workflow-template.d.ts +60 -0
  474. package/dist/verify-workflow-template.d.ts.map +1 -0
  475. package/dist/verify-workflow-template.js +126 -0
  476. package/dist/verify-workflow-template.js.map +1 -0
  477. package/dist/verify.d.ts +60 -0
  478. package/dist/verify.d.ts.map +1 -0
  479. package/dist/verify.js +62 -0
  480. package/dist/verify.js.map +1 -0
  481. package/dist/watch-session.d.ts +112 -0
  482. package/dist/watch-session.d.ts.map +1 -0
  483. package/dist/watch-session.js +347 -0
  484. package/dist/watch-session.js.map +1 -0
  485. package/dist/work-layout.d.ts +198 -0
  486. package/dist/work-layout.d.ts.map +1 -0
  487. package/dist/work-layout.js +217 -0
  488. package/dist/work-layout.js.map +1 -0
  489. package/dist/work-on.d.ts +154 -0
  490. package/dist/work-on.d.ts.map +1 -0
  491. package/dist/work-on.js +387 -0
  492. package/dist/work-on.js.map +1 -0
  493. package/dist/workspace.d.ts +224 -0
  494. package/dist/workspace.d.ts.map +1 -0
  495. package/dist/workspace.js +325 -0
  496. package/dist/workspace.js.map +1 -0
  497. package/package.json +46 -2
  498. package/src/advance-ci-template.ts +203 -0
  499. package/src/advance-classify.ts +197 -0
  500. package/src/advance-drivers.ts +414 -0
  501. package/src/advance-isolated.ts +432 -0
  502. package/src/advance-lifecycle-template.ts +791 -0
  503. package/src/advance-loop-driver.ts +745 -0
  504. package/src/advance-treeless-publish.ts +177 -0
  505. package/src/advance.ts +1564 -0
  506. package/src/advancing-lock.ts +988 -0
  507. package/src/agent-launch.ts +137 -0
  508. package/src/agent-stop.ts +361 -0
  509. package/src/apply-decide.ts +242 -0
  510. package/src/apply-merge-action.ts +502 -0
  511. package/src/apply-persist.ts +518 -0
  512. package/src/arbiter.ts +372 -0
  513. package/src/brand.ts +111 -0
  514. package/src/buildable-body.ts +196 -0
  515. package/src/categorise.ts +158 -0
  516. package/src/claim-cas.ts +513 -0
  517. package/src/cli-spinner.ts +225 -0
  518. package/src/cli.ts +4379 -0
  519. package/src/close-job-template.ts +236 -0
  520. package/src/close-job.ts +319 -0
  521. package/src/complete.ts +1379 -0
  522. package/src/concurrency.ts +151 -0
  523. package/src/config-override.ts +116 -0
  524. package/src/config.ts +883 -0
  525. package/src/continue-branch.ts +542 -0
  526. package/src/cwd-section.ts +392 -0
  527. package/src/decision-engine.ts +272 -0
  528. package/src/detect.ts +124 -0
  529. package/src/do-autopick.ts +223 -0
  530. package/src/do-config.ts +589 -0
  531. package/src/do-remote-auto.ts +197 -0
  532. package/src/do.ts +2623 -0
  533. package/src/drop-source.ts +194 -0
  534. package/src/eligibility.ts +79 -0
  535. package/src/env-config.ts +305 -0
  536. package/src/failure-cause.ts +142 -0
  537. package/src/format.ts +313 -0
  538. package/src/frontmatter.ts +477 -0
  539. package/src/gate-readiness.ts +147 -0
  540. package/src/gc.ts +510 -0
  541. package/src/gh-failure.ts +53 -0
  542. package/src/git.ts +186 -0
  543. package/src/github.ts +468 -0
  544. package/src/harness.ts +355 -0
  545. package/src/identity.ts +322 -0
  546. package/src/index.ts +785 -0
  547. package/src/install-ci-branch-protection.ts +255 -0
  548. package/src/install-ci-capabilities/advance-lifecycle.ts +34 -0
  549. package/src/install-ci-capabilities/close-job.ts +32 -0
  550. package/src/install-ci-capabilities/example-noop.ts +24 -0
  551. package/src/install-ci-capabilities/intake.ts +34 -0
  552. package/src/install-ci-capabilities/verify.ts +33 -0
  553. package/src/install-ci-core.ts +1088 -0
  554. package/src/install-ci-github.ts +376 -0
  555. package/src/install-ci.ts +552 -0
  556. package/src/intake-event.ts +102 -0
  557. package/src/intake-marker.ts +195 -0
  558. package/src/intake-triage.ts +138 -0
  559. package/src/intake-trigger-template.ts +591 -0
  560. package/src/intake.ts +2445 -0
  561. package/src/integration-core.ts +3065 -0
  562. package/src/integrator.ts +771 -0
  563. package/src/isolation.ts +484 -0
  564. package/src/issue-provider.ts +733 -0
  565. package/src/item-lock.ts +1858 -0
  566. package/src/item-path.ts +75 -0
  567. package/src/ledger-lint.ts +332 -0
  568. package/src/ledger-read.ts +924 -0
  569. package/src/ledger-write.ts +865 -0
  570. package/src/lifecycle-gather.ts +298 -0
  571. package/src/lifecycle-pools.ts +250 -0
  572. package/src/merge-question-surfacer.ts +496 -0
  573. package/src/mint-adr.ts +362 -0
  574. package/src/mirror-pool-scan.ts +240 -0
  575. package/src/needs-attention.ts +1506 -0
  576. package/src/orphan-sidecar.ts +150 -0
  577. package/src/output.ts +89 -0
  578. package/src/pi-harness.ts +403 -0
  579. package/src/placement.ts +131 -0
  580. package/src/prd-to-spec.ts +1059 -0
  581. package/src/prepare.ts +230 -0
  582. package/src/prompt.ts +763 -0
  583. package/src/readiness.ts +98 -0
  584. package/src/reap-branches.ts +278 -0
  585. package/src/recover-isolated.ts +276 -0
  586. package/src/registry.ts +475 -0
  587. package/src/repo-config.ts +550 -0
  588. package/src/repo-key.ts +74 -0
  589. package/src/repo-mirror.ts +367 -0
  590. package/src/retry-backoff.ts +130 -0
  591. package/src/review-gate.ts +389 -0
  592. package/src/review-verdict.ts +422 -0
  593. package/src/run.ts +1430 -0
  594. package/src/scan.ts +611 -0
  595. package/src/select-order.ts +143 -0
  596. package/src/select-priority.ts +266 -0
  597. package/src/select.ts +62 -0
  598. package/src/session-path.ts +153 -0
  599. package/src/sidecar-apply.ts +216 -0
  600. package/src/sidecar.ts +700 -0
  601. package/src/slug-namespace.ts +367 -0
  602. package/src/spec-complete.ts +118 -0
  603. package/src/start.ts +974 -0
  604. package/src/status.ts +441 -0
  605. package/src/surface-gate.ts +337 -0
  606. package/src/surface-persist.ts +241 -0
  607. package/src/tasker-review-loop.ts +671 -0
  608. package/src/tasking-eligibility.ts +114 -0
  609. package/src/tasking-lock.ts +416 -0
  610. package/src/tasking.ts +1437 -0
  611. package/src/triage-gate.ts +248 -0
  612. package/src/triage-persist.ts +570 -0
  613. package/src/verdict-json.ts +73 -0
  614. package/src/verify-workflow-template.ts +159 -0
  615. package/src/verify.ts +123 -0
  616. package/src/watch-session.ts +397 -0
  617. package/src/work-layout.ts +262 -0
  618. package/src/work-on.ts +660 -0
  619. package/src/workspace.ts +502 -0
@@ -0,0 +1,342 @@
1
+ import { spawn, spawnSync } from 'node:child_process';
2
+ import { existsSync, readFileSync } from 'node:fs';
3
+ import { NullHarness, pidAlive, registerHarness, } from './harness.js';
4
+ import { generateSessionPath } from './session-path.js';
5
+ import { lastAssistantText } from './watch-session.js';
6
+ /**
7
+ * The **pi** harness adapter (ADR §5) — the first real agent harness
8
+ * `dorfl` drives. It fulfils the harness seam introduced by
9
+ * `agent-workspaces` (`./harness.ts`): launch a job's work-agent command in its
10
+ * worktree, and report liveness from **pi-native signals**.
11
+ *
12
+ * Two design commitments from the task + ADR §5, both encoded here:
13
+ *
14
+ * 1. **Invocation** is the standard work-agent prompt (the constant wrapper +
15
+ * the task's `## Prompt`, assembled by `./prompt.ts`) fed to the pi CLI on
16
+ * stdin, running non-interactively (`--print`) inside the job worktree.
17
+ * 2. **Liveness** is reported from the **PID** (process alive?) PLUS a pointer
18
+ * to the pi **session file** (real activity + an audit trail) — explicitly
19
+ * **NOT filesystem mtime**: a live agent can think for minutes without
20
+ * writing any files, so mtime would mistake a thinking agent for a dead one.
21
+ *
22
+ * ## Session location: `--session <full-path>` (task `session-path-pi-default`)
23
+ *
24
+ * The adapter passes a **deterministic FULL session-FILE path** as `--session
25
+ * <path>` (NOT `--session-dir <dir>`). The caller GENERATES that path once
26
+ * (before launch, so `do --watch` can tail the known path) via {@link
27
+ * generateSessionPath} and threads it in as `LaunchInput.session`; when omitted,
28
+ * the adapter generates a default for its own cwd. pi creates+writes the session
29
+ * at exactly that path (it CREATES a non-existent `--session` file) and
30
+ * `--session` takes precedence over `--session-dir` (verified vs pinned pi
31
+ * source). The default lands under pi's per-cwd sessions folder, so the
32
+ * pi-remote dashboard sees the session and the in-place checkout stays clean.
33
+ * The arg is ABSOLUTE and ends `.jsonl` — required, else pi treats it as a
34
+ * session-ID lookup and exits 1 (see {@link generateSessionPath}).
35
+ *
36
+ * pi specifics stay BEHIND this adapter; the core (`run`, `status`, `do`) talks
37
+ * only to the `Harness` interface. Where running real pi in CI is impractical,
38
+ * the pi CLI is stubbed (see `pi-harness.test.ts`) via the injectable `piBin`.
39
+ *
40
+ * ## Seam contract (what an adapter promises the core)
41
+ *
42
+ * - `launch(input)` runs the work-agent command for ONE job in `input.dir`
43
+ * (the worktree), feeding `input.prompt` to the agent. It returns
44
+ * `{ok, record, detail?}`: `ok` iff the agent completed successfully, and a
45
+ * `record` to persist in `.dorfl-job.json` carrying the **liveness
46
+ * anchor** (`pid`) plus the pi `session` FILE path. The core treats the call
47
+ * as blocking (it runs the test gate immediately after).
48
+ * - `isAlive(record)` answers liveness FROM THE RECORD'S ANCHOR (PID/session),
49
+ * never mtime, so a separate `status`/`do` process can re-derive liveness
50
+ * from a fresh process WITHOUT re-launching the agent.
51
+ */
52
+ /** The default pi CLI binary name (resolved on `PATH`). */
53
+ export const DEFAULT_PI_BIN = 'pi';
54
+ /**
55
+ * The pi adapter. Invocation: `pi [--model <model>] --print --session
56
+ * <full-path>.jsonl [extra]` run in the worktree with the work-agent prompt on
57
+ * stdin. The model is passed NATIVELY as `--model <model>` when set (ADR §13 —
58
+ * the routing intent dorfl controls); auth/keys stay pi's job, never
59
+ * dorfl's. Liveness: the PID is the authoritative "is it running?"
60
+ * signal; the recorded `session` file is the activity + audit pointer surfaced
61
+ * alongside it. NEVER mtime (ADR §5).
62
+ */
63
+ export class PiHarness {
64
+ adapter = 'pi';
65
+ piBin;
66
+ extraArgs;
67
+ constructor(options = {}) {
68
+ this.piBin = options.piBin ?? DEFAULT_PI_BIN;
69
+ this.extraArgs = options.extraArgs ?? [];
70
+ }
71
+ /**
72
+ * Resolve the full session-FILE path for a launch. The CALLER normally
73
+ * generates this (via {@link generateSessionPath}) and passes it in
74
+ * `input.session` so the watcher knows it BEFORE launch; when omitted (e.g. a
75
+ * direct adapter call), generate a default under pi's per-cwd folder from the
76
+ * launch dir. Either way the result is absolute and ends `.jsonl`.
77
+ */
78
+ resolveSessionFile(input) {
79
+ return (input.session ?? generateSessionPath({ cwd: input.dir, id: input.slug }));
80
+ }
81
+ /** Build the pi argv: `[--model m] [extra] --print --session <file>`. */
82
+ buildArgs(input, sessionFile) {
83
+ // The model ROUTING intent (ADR §13): when set, pass it NATIVELY as
84
+ // `--model <model>`. dorfl only chooses the model; pi owns auth/keys.
85
+ const modelArgs = input.model !== undefined && input.model !== ''
86
+ ? ['--model', input.model]
87
+ : [];
88
+ // Non-interactive (`--print`): pi processes the prompt and exits. We pass
89
+ // the FULL session FILE path (`--session`, never `--session-dir`): pi
90
+ // creates+writes it there, it is visible to the dashboard, and nothing
91
+ // lands in the checkout. The operator's `extraArgs` still layer on.
92
+ return [
93
+ ...modelArgs,
94
+ ...this.extraArgs,
95
+ '--print',
96
+ '--session',
97
+ sessionFile,
98
+ ];
99
+ }
100
+ launch(input) {
101
+ const sessionFile = this.resolveSessionFile(input);
102
+ const args = this.buildArgs(input, sessionFile);
103
+ const result = spawnSync(this.piBin, args, {
104
+ // Spawn pi with cwd = the repo/worktree dir so the NEW session's header
105
+ // `cwd` groups it correctly in the dashboard (invariant #3) — the folder
106
+ // does NOT imply the repo.
107
+ cwd: input.dir,
108
+ encoding: 'utf8',
109
+ input: input.prompt,
110
+ env: input.env ?? process.env,
111
+ maxBuffer: 64 * 1024 * 1024,
112
+ });
113
+ if (result.error) {
114
+ throw new Error(`failed to spawn pi (${this.piBin}): ${result.error.message}`);
115
+ }
116
+ // Record the pi child's PID (the liveness anchor) + the exact session FILE
117
+ // path pi used (the pi-native activity + audit trail). Liveness later reads
118
+ // these — NOT a filesystem mtime (ADR §5).
119
+ const record = {
120
+ adapter: 'pi',
121
+ pid: result.pid,
122
+ command: [this.piBin, ...args].join(' '),
123
+ session: sessionFile,
124
+ };
125
+ const status = result.status ?? -1;
126
+ return {
127
+ ok: status === 0,
128
+ record,
129
+ detail: status === 0 ? undefined : (result.stderr ?? '').trim(),
130
+ // The agent's ANSWER (task `harness-agent-output`): the LAST assistant
131
+ // turn's text read from the session `.jsonl` pi just wrote — NOT piped
132
+ // stdout (which is drained). Shares `watch-session.ts`'s reader.
133
+ output: readLastAssistantText(sessionFile),
134
+ };
135
+ }
136
+ /**
137
+ * The ASYNC twin of {@link launch} — IDENTICAL semantics (same `--print
138
+ * --session <file>` invocation, same prompt on stdin, output still CAPTURED,
139
+ * same `LaunchResult` shape: PID anchor + session pointer + ok/detail), but
140
+ * launched NON-BLOCKING with `spawn` instead of the synchronous `spawnSync`.
141
+ * This is the one structural carve-out the `do --watch` observer needs (task
142
+ * `do-watch`): `spawnSync` blocks the event loop until pi exits, so NOTHING
143
+ * could tail the growing session `.jsonl` concurrently. `launchAsync` runs pi
144
+ * alongside the tailer; the WHOLE launch delta is `spawnSync` → `spawn`. The
145
+ * prompt is still fed on stdin and stdout/stderr are still captured; we read
146
+ * the `.jsonl` LOG, never piped stdout.
147
+ *
148
+ * ## Resolve on `exit`, NOT `close` (runner-hang fix)
149
+ *
150
+ * The promise resolves on the child's **`exit`** event (pi itself terminated),
151
+ * NOT `close`. `close` fires only once EVERY stdio pipe of the child is closed
152
+ * — which includes pipes INHERITED by any grandchild pi spawned (an MCP server,
153
+ * a model proxy, a subshell). If such a grandchild OUTLIVES pi holding the
154
+ * inherited stdout/stderr write end, `close` never fires and this promise never
155
+ * resolves — the `advance --watch` surface/triage/apply leg then finishes its
156
+ * work but its awaited launch hangs forever, burning a CI runner (and one of the
157
+ * `max-parallel` slots) until cancelled. `exit` fires the instant pi exits, so
158
+ * we key completion off pi's OWN death, not its descendants'. We still read the
159
+ * agent's answer from the `.jsonl` (final once pi exited, independent of
160
+ * stdout), then DESTROY our end of the stdio pipes so a leaked grandchild's
161
+ * inherited FDs release what they can. A lingering grandchild may still hold an
162
+ * OS pipe end open (keeping the event loop non-empty); the CLI verbs that call
163
+ * this path `process.exit(code)` after the awaited result, which is the
164
+ * belt-and-suspenders backstop bounding any such residual leak.
165
+ */
166
+ launchAsync(input) {
167
+ const sessionFile = this.resolveSessionFile(input);
168
+ const args = this.buildArgs(input, sessionFile);
169
+ const record = {
170
+ adapter: 'pi',
171
+ command: [this.piBin, ...args].join(' '),
172
+ session: sessionFile,
173
+ };
174
+ return new Promise((resolve, reject) => {
175
+ const child = spawn(this.piBin, args, {
176
+ // Same as `launch`: spawn in the repo/worktree dir so the session
177
+ // header `cwd` groups the dashboard correctly (invariant #3).
178
+ cwd: input.dir,
179
+ env: input.env ?? process.env,
180
+ stdio: ['pipe', 'pipe', 'pipe'],
181
+ });
182
+ record.pid = child.pid; // the liveness anchor, recorded like spawnSync.
183
+ let stderr = '';
184
+ child.stderr?.on('data', (chunk) => {
185
+ stderr += chunk.toString('utf8');
186
+ });
187
+ // Output is CAPTURED (not piped through) — `--watch` reads the .jsonl log,
188
+ // not stdout. We drain stdout so the pipe never fills and stalls pi.
189
+ child.stdout?.on('data', () => { });
190
+ // Guard so `exit` and a late `error` never double-settle the promise.
191
+ let settled = false;
192
+ child.on('error', (err) => {
193
+ if (settled) {
194
+ return;
195
+ }
196
+ settled = true;
197
+ reject(new Error(`failed to spawn pi (${this.piBin}): ${err.message}`));
198
+ });
199
+ // Resolve on `exit` (pi itself terminated), NOT `close`: `close` waits for
200
+ // EVERY child stdio pipe to close, including any INHERITED by a grandchild
201
+ // pi spawned that outlives it — which would hang this promise forever (see
202
+ // the doc-comment above). Then destroy our stdio ends to release the pipes.
203
+ child.on('exit', (code) => {
204
+ if (settled) {
205
+ return;
206
+ }
207
+ settled = true;
208
+ // Release our end of the stdio pipes so a leaked grandchild's inherited
209
+ // FDs stop keeping our streams referenced; `unref` the child handle too.
210
+ child.stdout?.destroy();
211
+ child.stderr?.destroy();
212
+ child.stdin?.destroy();
213
+ child.unref?.();
214
+ const status = code ?? -1;
215
+ resolve({
216
+ ok: status === 0,
217
+ record,
218
+ detail: status === 0 ? undefined : stderr.trim(),
219
+ // Read the agent's ANSWER from the `.jsonl` at `exit` — the same
220
+ // last-assistant-text read `launch` does at return (task
221
+ // `harness-agent-output`); the process has exited so the log is final.
222
+ output: readLastAssistantText(sessionFile),
223
+ });
224
+ });
225
+ // Feed the same prepared prompt on stdin, then close it (pi reads to EOF).
226
+ if (input.prompt !== undefined) {
227
+ child.stdin?.write(input.prompt);
228
+ }
229
+ child.stdin?.end();
230
+ });
231
+ }
232
+ /**
233
+ * Launch pi INTERACTIVELY (task `agent-interactive-launch`, decision #2): a
234
+ * FOREGROUND human session in `input.dir`. The whole delta from {@link launch}
235
+ * is the stdio contract:
236
+ *
237
+ * - **NO `--print`** — a real interactive session the human types into (the
238
+ * autonomous form is `pi --print …`, prompt on stdin, captured).
239
+ * - **`stdio: 'inherit'`** — the human's terminal IS pi's terminal (foreground).
240
+ * - **NO piped prompt** — the human drives; nothing is fed on stdin.
241
+ * - **`--model <model>`** still flows in when set (ADR §13: the resolved
242
+ * routing pins the human's starting model; they may switch inside pi).
243
+ * - **`--session <path>`** is STILL passed so the human session is recorded /
244
+ * dashboard-visible (audit trail), exactly as the autonomous path records it.
245
+ *
246
+ * It BLOCKS in the foreground until the human exits (`spawnSync` + inherited
247
+ * stdio), then returns their exit code. It is NOT a tracked job (decision #3):
248
+ * no `.dorfl-job.json`, no PID/liveness record, no gate — there is
249
+ * nothing to capture, so it returns only the exit code.
250
+ */
251
+ launchInteractive(input) {
252
+ const sessionFile = this.resolveSessionFile({
253
+ dir: input.dir,
254
+ slug: input.slug,
255
+ command: '',
256
+ session: input.session,
257
+ });
258
+ // The model ROUTING intent (ADR §13): when set, pass it NATIVELY as
259
+ // `--model <model>`. dorfl only chooses the model; pi owns auth/keys.
260
+ const modelArgs = input.model !== undefined && input.model !== ''
261
+ ? ['--model', input.model]
262
+ : [];
263
+ // NO `--print` (a real foreground session), but STILL `--session <path>` so
264
+ // the human session is recorded + dashboard-visible. The operator's
265
+ // `extraArgs` still layer on.
266
+ const args = [...modelArgs, ...this.extraArgs, '--session', sessionFile];
267
+ const result = spawnSync(this.piBin, args, {
268
+ // Run in the onboarded working tree so the session header `cwd` groups it
269
+ // correctly in the dashboard (invariant #3) and the human starts there.
270
+ cwd: input.dir,
271
+ // INHERIT the human's stdio: their terminal IS pi's terminal (foreground,
272
+ // interactive) — the opposite of the captured autonomous launch.
273
+ stdio: 'inherit',
274
+ env: input.env ?? process.env,
275
+ });
276
+ if (result.error) {
277
+ throw new Error(`failed to spawn pi (${this.piBin}): ${result.error.message}`);
278
+ }
279
+ return { exitCode: result.status ?? -1 };
280
+ }
281
+ isAlive(record) {
282
+ return pidAlive(record.pid);
283
+ }
284
+ /**
285
+ * The recorded pi session-FILE pointer for a job — the pi-native activity +
286
+ * audit trail surfaced alongside PID liveness. `undefined` when the record has
287
+ * no session pointer (e.g. a non-pi or legacy record). Existence on disk is
288
+ * reported separately so callers can distinguish "recorded but gone" from
289
+ * "never recorded".
290
+ */
291
+ sessionPointer(record) {
292
+ return record.session;
293
+ }
294
+ }
295
+ /**
296
+ * Does a job record carry a live pi session file on disk? Combines the recorded
297
+ * pointer with an `existsSync` check. This is the pi-native "is there an audit
298
+ * trail to look at?" signal — distinct from PID liveness, and STILL not mtime
299
+ * (we check existence, never modification time).
300
+ */
301
+ export function piSessionExists(record) {
302
+ return record.session !== undefined && existsSync(record.session);
303
+ }
304
+ /**
305
+ * Read the LAST assistant message's text from the pi session `.jsonl` at
306
+ * `sessionFile` — the agent's final ANSWER, surfaced as `LaunchResult.output`
307
+ * (task `harness-agent-output`). Called by BOTH `launch` (at return) and
308
+ * `launchAsync` (at `close`), AFTER pi has exited so the log is complete.
309
+ *
310
+ * It REUSES `watch-session.ts`'s {@link lastAssistantText} (one `.jsonl` parser,
311
+ * not two). An absent file (pi never wrote it) yields `undefined`, as does a log
312
+ * with no assistant text — a read error is never thrown back into the launch.
313
+ */
314
+ function readLastAssistantText(sessionFile) {
315
+ let jsonl;
316
+ try {
317
+ jsonl = readFileSync(sessionFile, 'utf8');
318
+ }
319
+ catch {
320
+ return undefined; // no session log on disk — no answer to surface.
321
+ }
322
+ return lastAssistantText(jsonl);
323
+ }
324
+ // Register the pi adapter so `status`/`do`/`gc` resolve liveness for `pi` jobs
325
+ // to THIS adapter (PID + session pointer) rather than the null fallback. A
326
+ // default-configured instance is sufficient for liveness (the binary/extra args
327
+ // only matter for `launch`, which the core does via an explicit instance).
328
+ registerHarness(new PiHarness());
329
+ /**
330
+ * Build the harness that LAUNCHES jobs for a run, from config (ADR §5): `pi`
331
+ * ⇒ the pi adapter (invoking `config.piBin`); anything else ⇒ the null adapter
332
+ * (shelling out to `agentCmd`). This is the single place the core turns the
333
+ * declared `harness` selector into a concrete adapter, keeping pi specifics
334
+ * behind the seam.
335
+ */
336
+ export function createHarness(options) {
337
+ if (options.harness === 'pi') {
338
+ return new PiHarness({ piBin: options.piBin });
339
+ }
340
+ return new NullHarness();
341
+ }
342
+ //# sourceMappingURL=pi-harness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-harness.js","sourceRoot":"","sources":["../src/pi-harness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * **The shared STAGING/POOL placement resolver** (prd
3
+ * `staging-pool-position-gate-and-trust-model`, task
4
+ * `runner-deterministic-slice-placement-policy-and-precedence`, governing ADR
5
+ * `placement-is-runner-deterministic-humanonly-is-agent-judgement`).
6
+ *
7
+ * Pure function from UNFORGEABLE inputs to a staging-vs-pool destination:
8
+ *
9
+ * explicit operator flag > untrusted-origin forces STAGING >
10
+ * configured default > built-in
11
+ *
12
+ * It is the POSITIONAL twin of the untrusted-origin BUILD-propose rule in
13
+ * `integration-core.ts` (which decides MODE: `propose` vs `merge`): the same
14
+ * `originTrust:` stamp + the same "explicit operator override beats the trust
15
+ * force" shape, reused here to decide POSITION (which folder the runner lands
16
+ * the emitted ledger files in). The agent cannot influence either — both
17
+ * resolve runner-side from the stamped frontmatter + the resolved policy + the
18
+ * operator's explicit flag.
19
+ *
20
+ * LIFECYCLE-GENERIC. The folder names + the configured-default value are
21
+ * PARAMETERS (`slots`, `configuredDefault`), so the same resolver serves the
22
+ * TASK lifecycle (`tasksLandIn`: `pre-backlog`/`ready` — the POOL value was
23
+ * renamed `'backlog'` → `'todo'` → `'ready'`, ADR
24
+ * `rename-task-pool-folder-todo-to-ready`) AND the SPEC-
25
+ * placement lifecycle (`specsLandIn`: `pre-proposed`/`ready`) without forking. A future
26
+ * lifecycle (e.g. intake's lone-task) plugs its own `slots` in and reuses the
27
+ * exact precedence — no second implementation.
28
+ */
29
+ /**
30
+ * Which side of the staging/pool split the runner chose. The CALLER maps this
31
+ * onto the lifecycle's concrete folder name via {@link PlacementSlots}.
32
+ *
33
+ * - `'staging'` — land in the staging area (tasks: `pre-backlog/`; prds:
34
+ * `prds/proposed/`). Not in the agent pool; a human/runner promotion is needed to make
35
+ * the item eligible. Review-without-PR review surface.
36
+ * - `'pool'` — land directly in the agent-eligible pool (tasks: `tasks/ready/`;
37
+ * prds: `prds/ready/`). The trusted-fast-path landing.
38
+ */
39
+ export type PlacementSide = 'staging' | 'pool';
40
+ /**
41
+ * The two folder names a lifecycle uses for its staging/pool split. Supplied by
42
+ * the caller so this resolver stays lifecycle-generic (the TASK caller passes
43
+ * `{staging: 'pre-backlog', pool: 'tasks/ready'}`; the PRD-placement caller passes
44
+ * `{staging: 'prds/proposed', pool: 'prds/ready'}`).
45
+ */
46
+ export interface PlacementSlots {
47
+ staging: string;
48
+ pool: string;
49
+ }
50
+ /** Inputs to {@link resolvePlacement}, in the precedence chain's order. */
51
+ export interface ResolvePlacementInput {
52
+ /**
53
+ * The operator's EXPLICIT override (the TOP of the chain) — when set, it
54
+ * wins over the untrusted-origin force AND the configured default. Mirrors
55
+ * `integration-core.ts`'s `explicitMerge` "operator is present; CLI always
56
+ * wins, no special force-key" shape (the untrusted-origin trust signal
57
+ * gates pool entry, not the mode in this case). Unset (`undefined`) ⇒ this
58
+ * rung is skipped and the next one applies.
59
+ */
60
+ explicit?: PlacementSide;
61
+ /**
62
+ * The source's stamped `originTrust:` frontmatter (`trusted` | `untrusted` |
63
+ * absent ⇒ trusted by default). When `untrusted`, the resolver FORCES
64
+ * `staging` even on a "land in pool" repo — the positional analogue of the
65
+ * existing `untrusted-origin-forces-build-propose` rule. Unset / `trusted`
66
+ * ⇒ this rung is skipped (zero behaviour change for the normal path).
67
+ */
68
+ originTrust?: 'trusted' | 'untrusted';
69
+ /**
70
+ * The repo's resolved configured DEFAULT landing (`tasksLandIn` /
71
+ * `specsLandIn`). Caller resolves it like the existing `taskingIntegration`
72
+ * (flag > env > per-repo > global > built-in) and passes the result; this
73
+ * resolver just consumes it.
74
+ */
75
+ configuredDefault?: PlacementSide;
76
+ }
77
+ /** The resolved choice + which precedence rung won (for honest reporting). */
78
+ export interface PlacementResult {
79
+ choice: PlacementSide;
80
+ reason: 'explicit' | 'untrusted-origin' | 'configured-default' | 'built-in';
81
+ }
82
+ /**
83
+ * Resolve the staging-vs-pool placement from unforgeable inputs, via the fixed
84
+ * precedence chain:
85
+ *
86
+ * explicit > untrusted-origin ⇒ staging > configured default > built-in
87
+ *
88
+ * Pure: no I/O, no env reads — the caller resolves config + reads the
89
+ * frontmatter and passes both in. Reused by every lifecycle (task + prd
90
+ * placement + future intake variants) so a precedence change touches ONE place.
91
+ */
92
+ export declare function resolvePlacement(input: ResolvePlacementInput): PlacementResult;
93
+ /**
94
+ * Map a resolved {@link PlacementSide} onto the lifecycle's concrete folder
95
+ * name. The caller passes its lifecycle slots; this is sugar so the call site
96
+ * does not re-`if`-ladder the side ↔ folder mapping.
97
+ */
98
+ export declare function placementFolder(slots: PlacementSlots, choice: PlacementSide): string;
99
+ //# sourceMappingURL=placement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"placement.d.ts","sourceRoot":"","sources":["../src/placement.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH;;;;;;;;;GASG;AACH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,MAAM,CAAC;AAE/C;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACb;AAED,2EAA2E;AAC3E,MAAM,WAAW,qBAAqB;IACrC;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC;IACtC;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,aAAa,CAAC;CAClC;AAED,8EAA8E;AAC9E,MAAM,WAAW,eAAe;IAC/B,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,UAAU,GAAG,kBAAkB,GAAG,oBAAoB,GAAG,UAAU,CAAC;CAC5E;AAWD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC/B,KAAK,EAAE,qBAAqB,GAC1B,eAAe,CAWjB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC9B,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,aAAa,GACnB,MAAM,CAER"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * **The shared STAGING/POOL placement resolver** (prd
3
+ * `staging-pool-position-gate-and-trust-model`, task
4
+ * `runner-deterministic-slice-placement-policy-and-precedence`, governing ADR
5
+ * `placement-is-runner-deterministic-humanonly-is-agent-judgement`).
6
+ *
7
+ * Pure function from UNFORGEABLE inputs to a staging-vs-pool destination:
8
+ *
9
+ * explicit operator flag > untrusted-origin forces STAGING >
10
+ * configured default > built-in
11
+ *
12
+ * It is the POSITIONAL twin of the untrusted-origin BUILD-propose rule in
13
+ * `integration-core.ts` (which decides MODE: `propose` vs `merge`): the same
14
+ * `originTrust:` stamp + the same "explicit operator override beats the trust
15
+ * force" shape, reused here to decide POSITION (which folder the runner lands
16
+ * the emitted ledger files in). The agent cannot influence either — both
17
+ * resolve runner-side from the stamped frontmatter + the resolved policy + the
18
+ * operator's explicit flag.
19
+ *
20
+ * LIFECYCLE-GENERIC. The folder names + the configured-default value are
21
+ * PARAMETERS (`slots`, `configuredDefault`), so the same resolver serves the
22
+ * TASK lifecycle (`tasksLandIn`: `pre-backlog`/`ready` — the POOL value was
23
+ * renamed `'backlog'` → `'todo'` → `'ready'`, ADR
24
+ * `rename-task-pool-folder-todo-to-ready`) AND the SPEC-
25
+ * placement lifecycle (`specsLandIn`: `pre-proposed`/`ready`) without forking. A future
26
+ * lifecycle (e.g. intake's lone-task) plugs its own `slots` in and reuses the
27
+ * exact precedence — no second implementation.
28
+ */
29
+ /**
30
+ * The BUILT-IN floor (the LOWEST rung): land in STAGING. Conservative — a new
31
+ * lifecycle that has not configured a landing yet stays gated by a human/runner
32
+ * promotion, never silently auto-eligible. The tracer task
33
+ * `pre-backlog-staging-folder-and-promote-step-a` also lands staged, so this
34
+ * preserves zero behaviour change for repos that do not opt into a default.
35
+ */
36
+ const BUILT_IN_FLOOR = 'staging';
37
+ /**
38
+ * Resolve the staging-vs-pool placement from unforgeable inputs, via the fixed
39
+ * precedence chain:
40
+ *
41
+ * explicit > untrusted-origin ⇒ staging > configured default > built-in
42
+ *
43
+ * Pure: no I/O, no env reads — the caller resolves config + reads the
44
+ * frontmatter and passes both in. Reused by every lifecycle (task + prd
45
+ * placement + future intake variants) so a precedence change touches ONE place.
46
+ */
47
+ export function resolvePlacement(input) {
48
+ if (input.explicit !== undefined) {
49
+ return { choice: input.explicit, reason: 'explicit' };
50
+ }
51
+ if (input.originTrust === 'untrusted') {
52
+ return { choice: 'staging', reason: 'untrusted-origin' };
53
+ }
54
+ if (input.configuredDefault !== undefined) {
55
+ return { choice: input.configuredDefault, reason: 'configured-default' };
56
+ }
57
+ return { choice: BUILT_IN_FLOOR, reason: 'built-in' };
58
+ }
59
+ /**
60
+ * Map a resolved {@link PlacementSide} onto the lifecycle's concrete folder
61
+ * name. The caller passes its lifecycle slots; this is sugar so the call site
62
+ * does not re-`if`-ladder the side ↔ folder mapping.
63
+ */
64
+ export function placementFolder(slots, choice) {
65
+ return choice === 'staging' ? slots.staging : slots.pool;
66
+ }
67
+ //# sourceMappingURL=placement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"placement.js","sourceRoot":"","sources":["../src/placement.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AA2DH;;;;;;GAMG;AACH,MAAM,cAAc,GAAkB,SAAS,CAAC;AAEhD;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAC/B,KAA4B;IAE5B,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,EAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAC,CAAC;IACrD,CAAC;IACD,IAAI,KAAK,CAAC,WAAW,KAAK,WAAW,EAAE,CAAC;QACvC,OAAO,EAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,kBAAkB,EAAC,CAAC;IACxD,CAAC;IACD,IAAI,KAAK,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;QAC3C,OAAO,EAAC,MAAM,EAAE,KAAK,CAAC,iBAAiB,EAAE,MAAM,EAAE,oBAAoB,EAAC,CAAC;IACxE,CAAC;IACD,OAAO,EAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,EAAC,CAAC;AACrD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC9B,KAAqB,EACrB,MAAqB;IAErB,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;AAC1D,CAAC"}