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,194 @@
1
+ import {existsSync} from 'node:fs';
2
+ import {join} from 'node:path';
3
+ import {run, type RunResult} from './git.js';
4
+ import {resolveSidecarIdentity, sidecarPathFor} from './sidecar.js';
5
+ import {resolveItemPathByIdentity} from './item-path.js';
6
+
7
+ /**
8
+ * The DIRECT-DELETE helper (prd
9
+ * `agentic-question-resolution-retire-disposition-vocabulary`, US #5/#11; task
10
+ * `direct-delete-question-cli-helper`) — the "I just want to throw this away"
11
+ * path that `git rm`s a source item AND its question sidecar (when present) in
12
+ * ONE revertible commit, the human's reason recorded in the commit MESSAGE (git
13
+ * history is the archive).
14
+ *
15
+ * It is the DIRECT human/skill/CLI action of decision 7: the human, the
16
+ * `answer-questions` skill, or the `dorfl drop` verb deletes a signal STRAIGHT —
17
+ * it does NOT round-trip through the decision engine or spawn any agent. (The
18
+ * AGENT reaching `delete-source` as a verdict is the SEPARATE engine path in
19
+ * `apply-persist.ts`'s `dischargeByDeletion`; this module is its no-engine twin.)
20
+ *
21
+ * The shape deliberately MIRRORS `apply-persist.ts`'s `dischargeByDeletion` (same
22
+ * one-commit `git rm`, same reason-in-the-message archive) but reaches it WITHOUT
23
+ * the answered-sidecar precondition, the apply rung, or any verdict: the human
24
+ * has already decided. Both the source path and the sidecar path are resolved by
25
+ * the item's namespaced IDENTITY (the single source of truth) via the SHARED
26
+ * `resolveItemPathByIdentity` / `sidecarPathFor` resolvers — NOT a captured path.
27
+ *
28
+ * Git-recoverable by construction: a single revertible commit, so a wrong delete
29
+ * is never catastrophic (US #11).
30
+ */
31
+
32
+ export interface DropSourceOptions {
33
+ /** Working clone/worktree the deletion commits in. */
34
+ cwd: string;
35
+ /**
36
+ * The namespaced item identity to delete (`task:foo` / `prd:bar` /
37
+ * `observation:baz` / `obs:baz` / a bare `<slug>` = task). Resolved to its
38
+ * on-disk path by identity, folder-agnostic.
39
+ */
40
+ item: string;
41
+ /**
42
+ * The human's reason for the deletion, recorded in the commit MESSAGE (git
43
+ * history is the archive). Empty/whitespace is recorded as "(no reason given)"
44
+ * rather than refused — the human asked to delete; the reason is documentation,
45
+ * not a gate.
46
+ */
47
+ reason?: string;
48
+ /** Advisory committer id for the commit subject. Defaults to git user.name. */
49
+ by?: string;
50
+ /** Environment for child git processes. */
51
+ env?: NodeJS.ProcessEnv;
52
+ /** Sink for human-readable progress notes. */
53
+ note?: (message: string) => void;
54
+ }
55
+
56
+ /** The terminal a drop reached. */
57
+ export type DropTerminal =
58
+ /** The source (+ its sidecar when present) were `git rm`-ed in one commit. */
59
+ | 'deleted'
60
+ /**
61
+ * No source resolved by identity in any lifecycle folder — nothing to delete.
62
+ * A clean no-op (no commit), NOT an error: the human asked to throw away
63
+ * something that is already gone, and the sidecar (if any) is the orphan-gc
64
+ * sweep's concern, not this direct verb's.
65
+ */
66
+ | 'not-found';
67
+
68
+ export interface DropSourceResult {
69
+ /** The terminal the drop reached. */
70
+ outcome: DropTerminal;
71
+ /** The canonical namespaced identity the drop acted on. */
72
+ item: string;
73
+ /** The commit sha the drop produced (only on `deleted`). */
74
+ commit?: string;
75
+ /** The source path (relative to `cwd`) that was removed (only on `deleted`). */
76
+ itemPath?: string;
77
+ /**
78
+ * The sidecar path (relative to `cwd`) that was removed, or `undefined` when
79
+ * no sidecar was present (a source with no open-question conversation).
80
+ */
81
+ sidecarPath?: string;
82
+ /** A human-readable summary. */
83
+ message: string;
84
+ }
85
+
86
+ /** Raised for usage errors (a missing repo). */
87
+ export class DropSourceError extends Error {
88
+ constructor(message: string) {
89
+ super(message);
90
+ this.name = 'DropSourceError';
91
+ }
92
+ }
93
+
94
+ function gitSoft(
95
+ args: string[],
96
+ cwd: string,
97
+ env: NodeJS.ProcessEnv | undefined,
98
+ ): RunResult {
99
+ return run('git', args, cwd, {env});
100
+ }
101
+
102
+ function gitHard(
103
+ args: string[],
104
+ cwd: string,
105
+ env: NodeJS.ProcessEnv | undefined,
106
+ ): RunResult {
107
+ const result = run('git', args, cwd, {env});
108
+ if (result.status !== 0) {
109
+ throw new DropSourceError(
110
+ `git ${args.join(' ')} failed (exit ${result.status}): ${result.stderr.trim()}`,
111
+ );
112
+ }
113
+ return result;
114
+ }
115
+
116
+ function resolveBy(cwd: string, env: NodeJS.ProcessEnv | undefined): string {
117
+ const name = gitSoft(['config', 'user.name'], cwd, env);
118
+ if (name.status === 0 && name.stdout.trim() !== '') {
119
+ return name.stdout.trim();
120
+ }
121
+ const e = env ?? process.env;
122
+ return e.USER ?? e.USERNAME ?? '';
123
+ }
124
+
125
+ /**
126
+ * DELETE a source item + its question sidecar DIRECTLY (US #5/#11): `git rm` the
127
+ * source AND its sidecar (when present) in ONE revertible commit, the human's
128
+ * `reason` recorded in the commit MESSAGE. No decision engine, no agent — the
129
+ * direct human/skill/CLI throw-it-away path.
130
+ *
131
+ * - Resolves the source by IDENTITY (`resolveItemPathByIdentity`); when it is
132
+ * already gone, returns `not-found` as a clean no-op (no commit) — deleting
133
+ * something already absent is "nothing to throw away", not a failure.
134
+ * - `git rm`s the sidecar TOO when one is present (`sidecarPathFor` →
135
+ * `existsSync`); a source with no open-question conversation simply has no
136
+ * sidecar to remove.
137
+ * - Both ride ONE commit, so the deletion is a single revertible unit (a wrong
138
+ * delete is recoverable via `git revert`).
139
+ */
140
+ export function dropSource(options: DropSourceOptions): DropSourceResult {
141
+ const {cwd, env} = options;
142
+ const note = options.note ?? (() => {});
143
+
144
+ if (gitSoft(['rev-parse', '--git-dir'], cwd, env).status !== 0) {
145
+ throw new DropSourceError('not inside a git repository');
146
+ }
147
+
148
+ // Canonicalise the identity (bare slug → task, `obs:` → observation, …) so the
149
+ // commit message + result speak the one namespaced form.
150
+ const {item} = resolveSidecarIdentity(options.item);
151
+
152
+ const itemPath = resolveItemPathByIdentity(cwd, item);
153
+ if (itemPath === undefined) {
154
+ const message =
155
+ `drop ${item}: no source item resolves by identity in any lifecycle ` +
156
+ `folder — nothing to throw away (clean no-op, no commit).`;
157
+ note(message);
158
+ return {outcome: 'not-found', item, message};
159
+ }
160
+
161
+ // `git rm` the source. The sidecar may or may not exist (only items with an
162
+ // open-question conversation have one); rm it too when present, so the drop
163
+ // leaves no orphaned sidecar. Both ride ONE commit.
164
+ const sidecarPath = sidecarPathFor(item);
165
+ const sidecarPresent = existsSync(join(cwd, sidecarPath));
166
+ const rmPaths = sidecarPresent ? [itemPath, sidecarPath] : [itemPath];
167
+ gitHard(['rm', '--quiet', '--', ...rmPaths], cwd, env);
168
+
169
+ const by = options.by || resolveBy(cwd, env);
170
+ const reasonLine =
171
+ (options.reason ?? '').trim() === ''
172
+ ? '(no reason given)'
173
+ : (options.reason ?? '').trim();
174
+ const subject = `drop: ${item} → deleted (by ${by})`;
175
+ const messageBody =
176
+ `Direct delete (the human threw it away; no engine round-trip; git ` +
177
+ `history is the archive). This is a single revertible commit.\n\n` +
178
+ `reason: ${reasonLine}`;
179
+ gitHard(['commit', '--quiet', '-m', subject, '-m', messageBody], cwd, env);
180
+ const commit = gitHard(['rev-parse', 'HEAD'], cwd, env).stdout.trim();
181
+
182
+ const message =
183
+ `dropped ${item} → deleted (source${sidecarPresent ? ' + sidecar' : ''} ` +
184
+ `git rm-ed in one revertible commit; reason in the commit message).`;
185
+ note(message);
186
+ return {
187
+ outcome: 'deleted',
188
+ item,
189
+ commit,
190
+ itemPath,
191
+ ...(sidecarPresent ? {sidecarPath} : {}),
192
+ message,
193
+ };
194
+ }
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Pure eligibility resolution. No I/O — callers pass in the two autonomy axes
3
+ * (`humanOnly`, `needsAnswers`), the item's `blockedBy` slugs, and the set of
4
+ * slugs present in the same repo's `work/done/`. Dependencies are per-repo only
5
+ * and never cross repos.
6
+ */
7
+
8
+ /**
9
+ * An autonomy gate axis. `true` ⇒ the item is gated on this axis (never
10
+ * auto-claim); `undefined`/`false` ⇒ not gated on it. Both `humanOnly` (DECIDED)
11
+ * and `needsAnswers` (DISCOVERED) share this shape and block orthogonally.
12
+ */
13
+ export type HumanOnlyGate = boolean | undefined;
14
+
15
+ export interface BlockedByResult {
16
+ /** True when every blocker is present in `work/done/`. */
17
+ satisfied: boolean;
18
+ /** Blocker slugs not yet in `work/done/`, in declaration order. */
19
+ missing: string[];
20
+ }
21
+
22
+ export interface EligibilityInput {
23
+ humanOnly: HumanOnlyGate;
24
+ needsAnswers: HumanOnlyGate;
25
+ blockedBy: string[];
26
+ /** Slugs present in this repo's `work/done/`. */
27
+ doneSlugs: Set<string>;
28
+ /** Per-repo policy: may agents auto-BUILD *undeclared* (not human-only) tasks? */
29
+ autoBuild: boolean;
30
+ }
31
+
32
+ export interface EligibilityResult {
33
+ /** Eligible now = gate passes AND all blockers satisfied. */
34
+ eligible: boolean;
35
+ /** Whether the autonomy gate alone passes (agent-claimable). */
36
+ gatePass: boolean;
37
+ blockedBy: BlockedByResult;
38
+ }
39
+
40
+ /**
41
+ * Resolve the autonomy gate: agent-claimable iff `needsAnswers` is not `true`
42
+ * AND `humanOnly` is not `true` AND the repo's `autoBuild` policy is on. Both
43
+ * axes block orthogonally and are never claimable by an agent regardless of
44
+ * policy; a human is never bound by either.
45
+ */
46
+ export function resolveGate(
47
+ humanOnly: HumanOnlyGate,
48
+ needsAnswers: HumanOnlyGate,
49
+ autoBuild: boolean,
50
+ ): boolean {
51
+ if (needsAnswers === true || humanOnly === true) {
52
+ return false;
53
+ }
54
+ return autoBuild;
55
+ }
56
+
57
+ /** Resolve `blockedBy` against the slugs present in `work/done/`. */
58
+ export function resolveBlockedBy(
59
+ blockedBy: string[],
60
+ doneSlugs: Set<string>,
61
+ ): BlockedByResult {
62
+ const missing = blockedBy.filter((slug) => !doneSlugs.has(slug));
63
+ return {satisfied: missing.length === 0, missing};
64
+ }
65
+
66
+ /** Combine the autonomy gate and `blockedBy` resolution into a verdict. */
67
+ export function resolveEligibility(input: EligibilityInput): EligibilityResult {
68
+ const gatePass = resolveGate(
69
+ input.humanOnly,
70
+ input.needsAnswers,
71
+ input.autoBuild,
72
+ );
73
+ const blockedBy = resolveBlockedBy(input.blockedBy, input.doneSlugs);
74
+ return {
75
+ eligible: gatePass && blockedBy.satisfied,
76
+ gatePass,
77
+ blockedBy,
78
+ };
79
+ }
@@ -0,0 +1,305 @@
1
+ import type {Config, PartialConfig} from './config.js';
2
+ import {brand, constantCase} from './brand.js';
3
+
4
+ /**
5
+ * The environment-variable config layer.
6
+ *
7
+ * A per-machine context (a CI job, a developer's shell) can set ANY {@link Config}
8
+ * key via an `DORFL_*` environment variable WITHOUT committing a file —
9
+ * including the host-only keys (`piBin`, `agentCmd`, …) that the per-repo
10
+ * `.dorfl.json` deliberately rejects.
11
+ *
12
+ * Env is a legitimate *per-machine source* — exactly like a CLI flag or the
13
+ * global `~/.config/dorfl/config.json` — so it is NOT subject to the
14
+ * per-repo allow/reject split (that split only governs the *committed repo
15
+ * file*). This is the sharpened host-only principle (ADR §13): host-only keys
16
+ * must come from a per-machine source (flag, env, or global file), never the
17
+ * committed repo file; env is simply the per-machine source CI actually has
18
+ * without writing a file.
19
+ *
20
+ * Resolution chain (highest wins):
21
+ *
22
+ * flag > ENV (DORFL_*) > per-repo > global > built-in default
23
+ *
24
+ * Naming: `DORFL_<SCREAMING_SNAKE(key)>` (mechanical camelCase →
25
+ * SCREAMING_SNAKE, prefixed with `DORFL_` to match the binary). E.g.
26
+ * `DORFL_AGENT_CMD`, `DORFL_PI_BIN`, `DORFL_DEFAULT_ARBITER`,
27
+ * `DORFL_PER_REPO_MAX`.
28
+ *
29
+ * Each value is coerced per the key's type and a typo/invalid value FAILS LOUDLY
30
+ * (never silently ignored) with a message naming the offending variable.
31
+ */
32
+
33
+ /**
34
+ * The shared `DORFL_` prefix on every env config variable. Derived from
35
+ * the single brand identity (`constantCase(base) + '_'`) so a rename flips the
36
+ * prefix in lockstep with the binary name (see `brand.ts`).
37
+ */
38
+ export const ENV_PREFIX = brand.envPrefix;
39
+
40
+ /** How a key's env value is coerced from its raw string. */
41
+ type Coercion =
42
+ | 'string'
43
+ | 'boolean'
44
+ | 'number'
45
+ | 'list'
46
+ | {enum: readonly string[]};
47
+
48
+ /**
49
+ * The coercion to apply per env-settable {@link Config} key. The source of truth
50
+ * for which env vars exist and how their raw strings become typed values. EVERY
51
+ * SCALAR `Config` key appears here (host-only included) — env is a per-machine
52
+ * source, so no scalar key is off-limits. Keys not listed have no env var.
53
+ *
54
+ * The lone EXCLUSION is `identity`: it is a NESTED structured object (with its
55
+ * own `auth`/`providers` sub-objects), not a scalar a single env string can
56
+ * carry. A `tokenEnv` indirection already covers the one secret a CI/per-machine
57
+ * context legitimately injects via env (the `gh` token), so there is no JSON-in-
58
+ * env hack here. The mapped type is `Partial` precisely to ALLOW this exclusion.
59
+ */
60
+ const KEY_COERCIONS: {[K in keyof Config]?: Coercion} = {
61
+ autoBuild: 'boolean',
62
+ autoTask: 'boolean',
63
+ // The observation-triage gate is a 3-state ENUM coercion (like `integration`),
64
+ // so `DORFL_OBSERVATION_TRIAGE=off|ask|auto` works and a typo FAILS
65
+ // LOUDLY naming the variable + the valid options.
66
+ observationTriage: {enum: ['off', 'ask', 'auto']},
67
+ // The merge-question SURFACER gate is a 3-state ENUM coercion (mirrors
68
+ // `observationTriage`'s shape; SEPARATE axis with a HIGHER default, prd
69
+ // `land-time-reverify-and-parallel-merge-ceiling` Story 17 / task
70
+ // `merge-questions-gate-axis`), so `DORFL_MERGE_QUESTIONS=off|ask|auto`
71
+ // works and a typo FAILS LOUDLY naming the variable + the valid options.
72
+ mergeQuestions: {enum: ['off', 'ask', 'auto']},
73
+ // The surface-blockers gate is a BOOLEAN coercion (like `autoBuild`), so
74
+ // `DORFL_SURFACE_BLOCKERS=true|false` works and a typo FAILS LOUDLY.
75
+ surfaceBlockers: 'boolean',
76
+ // `surfaceStaging` (the BOOLEAN gate-family member that widens the SURFACE
77
+ // candidate set to include STAGING — `tasks/backlog/` + `prds/proposed/` —
78
+ // not only the agent pool; prd
79
+ // `staging-surface-and-apply-promote-safety` F2) coerces as a BOOLEAN like
80
+ // `autoBuild`/`surfaceBlockers`, so `DORFL_SURFACE_STAGING=true|false`
81
+ // works and a typo FAILS LOUDLY. Resolution chain identical to the other
82
+ // gate-family members (flag > env > per-repo > global > built-in `true`).
83
+ surfaceStaging: 'boolean',
84
+ // `selectionOrder` coerces as a `'list'` (comma form
85
+ // `DORFL_SELECTION_ORDER=build,task,surface,triage`); a single-element
86
+ // list whose one entry is a preset keyword (`=drain`) is expanded by the
87
+ // resolver (`select-order.ts`). Subsumes the removed `prdsFirst` boolean.
88
+ selectionOrder: 'list',
89
+ maxParallel: 'number',
90
+ perRepoMax: 'number',
91
+ defaultArbiter: 'string',
92
+ workspacesDir: 'string',
93
+ arbitersDir: 'string',
94
+ humanWorktreesDir: 'string',
95
+ integration: {enum: ['propose', 'merge']},
96
+ // `taskingIntegration` (the per-TRANSITION TASKING override) coerces as the SAME
97
+ // `propose`/`merge` enum as `integration`, so `DORFL_TASKING_INTEGRATION`
98
+ // works and a typo FAILS LOUDLY. Unset ⇒ the tasking transition falls back to
99
+ // `integration` (the flat value). It NEVER touches the build transition or intake.
100
+ taskingIntegration: {enum: ['propose', 'merge']},
101
+ // `tasksLandIn` (the per-repo TASK-PLACEMENT default — prd
102
+ // `staging-pool-position-gate-and-trust-model` US #5) coerces as the
103
+ // `pre-backlog`/`ready` enum, so `DORFL_TASKS_LAND_IN=ready` works and a
104
+ // typo FAILS LOUDLY. Same
105
+ // precedence chain as `taskingIntegration` (flag > env > per-repo > global >
106
+ // built-in `pre-backlog`); fed into the runner-deterministic placement
107
+ // resolver (`src/placement.ts`) as the configured-default rung.
108
+ tasksLandIn: {enum: ['pre-backlog', 'ready']},
109
+ // `specsLandIn` (the per-repo SPEC-PLACEMENT default — spec
110
+ // `staging-pool-position-gate-and-trust-model` US #2/#5) coerces as the
111
+ // `pre-proposed`/`ready` enum, so `DORFL_SPECS_LAND_IN=ready` works and a typo
112
+ // FAILS LOUDLY. Same precedence chain as `tasksLandIn` (flag > env > per-repo
113
+ // > global > built-in `pre-proposed`); fed into the shared placement resolver
114
+ // (`src/placement.ts`) as the configured-default rung for the spec lifecycle.
115
+ // The legacy `prdsLandIn` key / `DORFL_PRDS_LAND_IN` env are GONE after the
116
+ // prd → spec hard cutover (clean break).
117
+ specsLandIn: {enum: ['pre-proposed', 'ready']},
118
+ // `noPR` (the PR-INTENT axis) is a BOOLEAN coercion (like `review`), so
119
+ // `DORFL_NO_PR=true|false` works and a typo FAILS LOUDLY. The removed
120
+ // `provider` override has NO env var (a stale `DORFL_PROVIDER` is ignored
121
+ // with a deprecation warning — see `envOverrides`).
122
+ noPR: 'boolean',
123
+ agentCmd: 'string',
124
+ model: 'string',
125
+ harness: {enum: ['null', 'pi']},
126
+ piBin: 'string',
127
+ sessionsDir: 'string',
128
+ // `prepare` coerces as a `'list'` (comma form
129
+ // `DORFL_PREPARE=pnpm install,git submodule update --init`), exactly
130
+ // like `verify` — the SAME precedence chain, the sibling env-prep step.
131
+ prepare: 'list',
132
+ verify: 'list',
133
+ review: 'boolean',
134
+ reviewModel: 'string',
135
+ reviewMaxRounds: 'number',
136
+ taskerLoop: 'boolean',
137
+ taskerLoopMax: 'number',
138
+ taskerLoopModel: 'string',
139
+ // `freshWorktreeGate` is a BOOLEAN coercion (like `taskerLoop`), so
140
+ // `DORFL_FRESH_WORKTREE_GATE=true|false` works and a typo FAILS LOUDLY.
141
+ freshWorktreeGate: 'boolean',
142
+ // `mergeRetries` (the cross-job merge serialiser's CAS-retry cap — prd
143
+ // `land-time-reverify-and-parallel-merge-ceiling` Story 5 / Applied Answer q1 (a))
144
+ // coerces as a NUMBER (like `reviewMaxRounds`), so `DORFL_MERGE_RETRIES=20`
145
+ // works and a typo FAILS LOUDLY. A wide-matrix CI raises it; the default
146
+ // (1000 — the C2 large liveness ceiling) stays in place when unset.
147
+ mergeRetries: 'number',
148
+ // `strictMergeApproval` (the OPT-IN strictness layered on the OQ6
149
+ // stale-approval default — prd `land-time-reverify-and-parallel-merge-ceiling`
150
+ // sidecar OQ6 / task `strict-merge-approval-gate`) coerces as a BOOLEAN
151
+ // (like `freshWorktreeGate`), so `DORFL_STRICT_MERGE_APPROVAL=true|false`
152
+ // works and a typo FAILS LOUDLY. Default OFF; ON re-surfaces the
153
+ // merge-question on a merge-base change instead of auto-landing.
154
+ strictMergeApproval: 'boolean',
155
+ // `promptGuidance` is a STRUCTURED (nested) namespace, so it has no scalar env
156
+ // var of its own — each MEMBER carries its own env var (the nested-key form
157
+ // `DORFL_PROMPT_GUIDANCE_<MEMBER>`), handled out-of-band in
158
+ // `envOverrides` below. Listing the namespace here would imply a single scalar
159
+ // `DORFL_PROMPT_GUIDANCE` env var, which is NOT how the namespace is
160
+ // shaped (each nudge member is independently resolvable).
161
+ };
162
+
163
+ /**
164
+ * The env vars for the nested members of the `promptGuidance` namespace. The
165
+ * key is the env var name (`DORFL_PROMPT_GUIDANCE_<MEMBER>`, the nested
166
+ * naming the prd specifies); the value is the (boolean) coercion. Each member
167
+ * present in env contributes `{<member>: bool}` into a single
168
+ * `promptGuidance` partial — mergeConfig replaces the whole namespace per the
169
+ * layered precedence, which is correct because EVERY member is included (env
170
+ * supplies a complete inner object whenever ANY member is set).
171
+ */
172
+ const PROMPT_GUIDANCE_ENV: Readonly<Record<string, 'boolean'>> = {
173
+ [ENV_PREFIX + 'PROMPT_GUIDANCE_TEST_FIRST']: 'boolean',
174
+ };
175
+
176
+ /** The `DORFL_*` env var name for a config key (`perRepoMax` →
177
+ * `DORFL_PER_REPO_MAX`): the brand prefix + the key in `constantCase`. */
178
+ export function envVarName(key: keyof Config): string {
179
+ return ENV_PREFIX + constantCase(key);
180
+ }
181
+
182
+ /** A raw env map (defaults to `process.env`). */
183
+ export type EnvMap = Record<string, string | undefined>;
184
+
185
+ /**
186
+ * Coerce a raw env string for one key, FAILING LOUDLY (with the offending var
187
+ * name) on invalid input: booleans accept only `true`/`false`; numbers reject
188
+ * NaN; enums must be in their union; list keys split on comma; strings verbatim.
189
+ */
190
+ function coerceValue(
191
+ varName: string,
192
+ raw: string,
193
+ coercion: Coercion,
194
+ ): unknown {
195
+ if (typeof coercion === 'object') {
196
+ // Enum: validate against the union.
197
+ if (!coercion.enum.includes(raw)) {
198
+ throw new Error(
199
+ `Invalid value for ${varName}: '${raw}'. ` +
200
+ `Expected one of: ${coercion.enum.join(', ')}.`,
201
+ );
202
+ }
203
+ return raw;
204
+ }
205
+ switch (coercion) {
206
+ case 'string':
207
+ return raw;
208
+ case 'boolean':
209
+ if (raw === 'true') {
210
+ return true;
211
+ }
212
+ if (raw === 'false') {
213
+ return false;
214
+ }
215
+ throw new Error(
216
+ `Invalid boolean for ${varName}: '${raw}'. Expected 'true' or 'false'.`,
217
+ );
218
+ case 'number': {
219
+ const n = Number(raw);
220
+ if (raw.trim() === '' || Number.isNaN(n)) {
221
+ throw new Error(
222
+ `Invalid number for ${varName}: '${raw}'. Expected a numeric value.`,
223
+ );
224
+ }
225
+ return n;
226
+ }
227
+ case 'list':
228
+ // Split on comma (cross-platform; not `:`), trimming each entry. An empty
229
+ // string ⇒ an empty list (an explicit "clear" of a list key).
230
+ return raw
231
+ .split(',')
232
+ .map((s) => s.trim())
233
+ .filter((s) => s !== '');
234
+ }
235
+ }
236
+
237
+ /**
238
+ * Read the `DORFL_*` env layer into a {@link PartialConfig}. Only vars
239
+ * actually present (and non-`undefined`) contribute, so absent env ⇒ `{}` and
240
+ * built-in floors/defaults are untouched. Each present var is coerced per its
241
+ * key's type; an invalid value throws LOUDLY naming the variable.
242
+ *
243
+ * Env may set ANY key — host-only included — because env is a per-machine
244
+ * source, NOT the committed repo file (see this module's doc + ADR §13).
245
+ */
246
+ export function envOverrides(
247
+ env: EnvMap = process.env,
248
+ warn: (message: string) => void = (m) => console.error(`>> ${m}`),
249
+ ): PartialConfig {
250
+ // A stale `DORFL_PROVIDER` (the removed provider OVERRIDE) is IGNORED with
251
+ // a one-line deprecation warning, never an error — the provider is now purely
252
+ // arbiter-derived; "suppress the PR" re-homes to `noPR` (`DORFL_NO_PR`).
253
+ const staleProvider = env[ENV_PREFIX + 'PROVIDER'];
254
+ if (staleProvider !== undefined) {
255
+ warn(
256
+ `Ignoring deprecated env var ${ENV_PREFIX}PROVIDER: the provider is now ` +
257
+ 'purely arbiter-derived (a GitHub remote ⇒ the GitHub provider, else ' +
258
+ 'none). To suppress the PR (the old `none` use), set ' +
259
+ `${ENV_PREFIX}NO_PR=true (or pass --no-pr).` +
260
+ (staleProvider === 'none'
261
+ ? ' (your `none` maps directly to NO_PR=true.)'
262
+ : ''),
263
+ );
264
+ }
265
+ const overrides: PartialConfig = {};
266
+ // Per-member env layer for the `promptGuidance` NUDGE namespace. Each member
267
+ // is INDEPENDENTLY resolvable (`DORFL_PROMPT_GUIDANCE_<MEMBER>`); a
268
+ // present env var sets that member in the partial. We merge ALL set members
269
+ // into a single inner object, then assign once — the outer mergeConfig
270
+ // REPLACES the namespace per layer, so we send a coherent partial-inner per
271
+ // env override (a missing member there reads its default from the lower
272
+ // layer's namespace, which works because env is precisely a per-machine
273
+ // SETTER, not a gate).
274
+ const promptGuidancePartial: Partial<{testFirst: boolean}> = {};
275
+ for (const [varName, coercion] of Object.entries(PROMPT_GUIDANCE_ENV)) {
276
+ const raw = env[varName];
277
+ if (raw === undefined) {
278
+ continue;
279
+ }
280
+ const value = coerceValue(varName, raw, coercion) as boolean;
281
+ if (varName === ENV_PREFIX + 'PROMPT_GUIDANCE_TEST_FIRST') {
282
+ promptGuidancePartial.testFirst = value;
283
+ }
284
+ }
285
+ if (Object.keys(promptGuidancePartial).length > 0) {
286
+ overrides.promptGuidance = {
287
+ testFirst: promptGuidancePartial.testFirst ?? false,
288
+ };
289
+ }
290
+ for (const key of Object.keys(KEY_COERCIONS) as (keyof Config)[]) {
291
+ const coercion = KEY_COERCIONS[key];
292
+ if (coercion === undefined) {
293
+ continue;
294
+ }
295
+ const varName = envVarName(key);
296
+ const raw = env[varName];
297
+ if (raw === undefined) {
298
+ continue;
299
+ }
300
+ const coerced = coerceValue(varName, raw, coercion);
301
+ // Type matches by construction: each coercion yields the key's value type.
302
+ (overrides as Record<string, unknown>)[key] = coerced;
303
+ }
304
+ return overrides;
305
+ }