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,362 @@
1
+ import {readFileSync} from 'node:fs';
2
+ import {join} from 'node:path';
3
+ import {run, type RunResult} from './git.js';
4
+ import {
5
+ createItemThroughCas,
6
+ type CasContentionBudget,
7
+ type CreateItemThroughCasResult,
8
+ } from './advancing-lock.js';
9
+ import {resolveSidecarIdentity, sidecarPathFor} from './sidecar.js';
10
+
11
+ /**
12
+ * The **ADR-MINT route** (prd
13
+ * `agentic-question-resolution-retire-disposition-vocabulary` US #2, task
14
+ * `agentic-apply-mint-adr-route`) — the SIBLING of {@link
15
+ * import('./triage-persist.js').promoteObservation}, for the agentic apply
16
+ * `mint-adr` verdict.
17
+ *
18
+ * Why a SIBLING and not an `adr` artifact type on `promoteObservation`
19
+ * (recorded `## Decisions`): `promoteObservation` is `work/`-folder-SHAPED — it
20
+ * targets `work/tasks/ready` / `work/prds/proposed` via `workItemRel`, and builds
21
+ * a task/prd body (a `## What to build` / `## Problem Statement` lead + an
22
+ * `## Open questions` block, with `needsAnswers` carried). An ADR is DIFFERENT in
23
+ * EVERY one of those: it lives in `docs/adr/` (OUTSIDE the work board, so the
24
+ * `work/`-layout path builder does not fit), it carries NO `needsAnswers`/open-
25
+ * questions block (an ADR records a SETTLED decision, the antithesis of an open
26
+ * question), and its body is the ADR-FORMAT shape (a context/decision/why record).
27
+ * Forking the body+target branch inside `promoteObservation` would make that
28
+ * function mean two unrelated things; a sibling that REUSES the shared CAS-create
29
+ * primitive (and nothing else) is the cleaner seam.
30
+ *
31
+ * It REUSES the keystone's guarantees verbatim, because both go through the SAME
32
+ * {@link createItemThroughCas} primitive (the new-item-creation CAS from
33
+ * `advancing-lock-borrow`): the source observation + its answered sidecar are
34
+ * `git rm`-ed IN THE SAME atomic commit as the ADR create (delete-on-promote),
35
+ * and a CAS LOSER — which never reaches the commit — backs off WITHOUT deleting
36
+ * the source (left intact for a retry). The ONLY differences from
37
+ * `promoteObservation` are the TARGET path (`docs/adr/<slug>.md`) and the BODY
38
+ * shape (the ADR record).
39
+ */
40
+
41
+ function gitSoft(
42
+ args: string[],
43
+ cwd: string,
44
+ env: NodeJS.ProcessEnv | undefined,
45
+ ): RunResult {
46
+ return run('git', args, cwd, {env});
47
+ }
48
+
49
+ function resolveBy(cwd: string, env: NodeJS.ProcessEnv | undefined): string {
50
+ const name = gitSoft(['config', 'user.name'], cwd, env);
51
+ if (name.status === 0 && name.stdout.trim() !== '') {
52
+ return name.stdout.trim();
53
+ }
54
+ const e = env ?? process.env;
55
+ return e.USER ?? e.USERNAME ?? '';
56
+ }
57
+
58
+ /** Read the observation body from the tree (committed) then the working file. */
59
+ function readItem(
60
+ cwd: string,
61
+ itemPath: string,
62
+ env: NodeJS.ProcessEnv | undefined,
63
+ ): string {
64
+ const show = gitSoft(['show', `:${itemPath}`], cwd, env);
65
+ if (show.status === 0) {
66
+ return show.stdout;
67
+ }
68
+ try {
69
+ return readFileSync(join(cwd, itemPath), 'utf8');
70
+ } catch {
71
+ throw new MintAdrError(
72
+ `cannot read observation body for '${itemPath}' (the ADR-mint route needs the item file)`,
73
+ );
74
+ }
75
+ }
76
+
77
+ /** Raised for usage errors (an empty slug, an unreadable observation). */
78
+ export class MintAdrError extends Error {
79
+ constructor(message: string) {
80
+ super(message);
81
+ this.name = 'MintAdrError';
82
+ }
83
+ }
84
+
85
+ /**
86
+ * The repo-relative `docs/adr/` home for minted ADRs. ADRs live OUTSIDE the
87
+ * `work/` governance tree (so they are NOT in `work-layout.ts`'s registry); this
88
+ * is the single literal the route roots its target on. `docs/adr/` is created
89
+ * lazily by {@link createItemThroughCas} (it `mkdir -p`s the target's dirname).
90
+ */
91
+ export const ADR_DIR_REL = 'docs/adr';
92
+
93
+ /** The repo-relative path of a minted ADR file: `docs/adr/<slug>.md`. */
94
+ export function adrItemRel(slug: string): string {
95
+ return `${ADR_DIR_REL}/${slug}.md`;
96
+ }
97
+
98
+ export interface MintAdrOptions {
99
+ /** Working clone/worktree the mint runs in. */
100
+ cwd: string;
101
+ /** The namespaced source identity (`observation:<slug>`). */
102
+ item: string;
103
+ /** The source item file path RELATIVE to `cwd` (e.g. `work/notes/observations/foo.md`). */
104
+ itemPath: string;
105
+ /**
106
+ * The ADR slug to draft. Defaults to the source observation's own slug, so the
107
+ * minted ADR is `docs/adr/<obs-slug>.md`. The CAS is keyed on the new ADR's
108
+ * PATH, so a same-slug ADR race ⇒ the loser fails the CAS and backs off.
109
+ */
110
+ adrSlug?: string;
111
+ /**
112
+ * The ADR's short title (the `# {title}` heading line). Defaults to the slug
113
+ * when absent.
114
+ */
115
+ adrTitle?: string;
116
+ /**
117
+ * The ADR's content — the markdown AFTER the frontmatter (the
118
+ * context/decision/why record). When omitted, a SELF-CONTAINED body is built
119
+ * FROM the source observation + its answered question(s) (see
120
+ * {@link buildAdrBody}), so the decision's WHY is carried in and the source is
121
+ * safely deletable.
122
+ */
123
+ adrBody?: string;
124
+ /**
125
+ * The answered question(s) + answers the decision rests on, carried into the
126
+ * built body's Context/Decision when no explicit `adrBody` is supplied (so the
127
+ * minted ADR is self-contained even without an agent-drafted body).
128
+ */
129
+ answers?: {question: string; answer: string}[];
130
+ /** Name of the arbiter remote (`--arbiter`). Defaults to `origin`. */
131
+ arbiter?: string;
132
+ /** Advisory committer id for the commit subject. Defaults to git user.name. */
133
+ by?: string;
134
+ /** Environment for child git processes. */
135
+ env?: NodeJS.ProcessEnv;
136
+ /** Show the intended CAS push without mutating the arbiter (`--dry-run`). */
137
+ dryRun?: boolean;
138
+ /**
139
+ * The CAS CONTENTION-RETRY BUDGET (jittered inter-retry delay + widened
140
+ * attempt / wall-clock envelope). Threaded through to
141
+ * {@link createItemThroughCas}. The lifecycle driver passes
142
+ * `LIFECYCLE_CAS_CONTENTION` here so a propose-tick FAN-OUT of parallel
143
+ * `mint-adr` legs desynchronises and DRAINS instead of thrashing to `contended`.
144
+ * Absent ⇒ the interactive default (3 retries, no delay).
145
+ */
146
+ contention?: CasContentionBudget;
147
+ /** Sink for human-readable progress notes. */
148
+ note?: (message: string) => void;
149
+ }
150
+
151
+ export interface MintAdrResult {
152
+ /**
153
+ * `minted` (the ADR landed via the CAS + the observation+sidecar were deleted
154
+ * in the SAME commit), `lost` (the same-slug ADR race was lost — the loser backs
155
+ * off, observation left INTACT), or `contended` (the CAS push kept failing).
156
+ * Maps onto the claim-CAS exit codes.
157
+ */
158
+ outcome: 'minted' | 'lost' | 'contended' | 'usage-error';
159
+ exitCode: 0 | 1 | 2 | 3;
160
+ /** The new ADR's path (relative to repo root) on a WIN. */
161
+ adrPath?: string;
162
+ /** A human-readable summary. */
163
+ message: string;
164
+ }
165
+
166
+ /**
167
+ * Mint a NEW, SELF-CONTAINED ADR FROM an answered observation (the agentic apply
168
+ * `mint-adr` verdict, US #2): CAS-create `docs/adr/<slug>.md` keyed on the new
169
+ * ADR's identity (its path), with the source observation + its answered sidecar
170
+ * `git rm`-ed IN THE SAME atomic commit. The mint is ONE commit (create + delete).
171
+ *
172
+ * The minted body is built FROM the source + the answered question(s) (see
173
+ * {@link buildAdrBody}) so an engineer can read the decision's WHY from the ADR
174
+ * ALONE — that self-containment is the PRECONDITION for the same-commit deletion
175
+ * of the source. An agent-drafted `adrBody` (when present) is used verbatim.
176
+ *
177
+ * The CAS-create is the new-item-creation helper ({@link createItemThroughCas}):
178
+ * a same-slug ADR race needs NO special case — exactly one creator lands the
179
+ * file, the LOSER fails the CAS (exit 2) and backs off WITHOUT deleting the
180
+ * source (so a retry can re-mint). The source (+ its sidecar) is deleted ONLY on a
181
+ * WIN, riding the winning creator's commit.
182
+ */
183
+ export async function mintAdr(options: MintAdrOptions): Promise<MintAdrResult> {
184
+ const {cwd, item, itemPath, env} = options;
185
+ const note = options.note ?? (() => {});
186
+
187
+ const {slug: obsSlug} = resolveSidecarIdentity(item);
188
+ const adrSlug = (options.adrSlug ?? obsSlug).trim();
189
+ if (adrSlug === '') {
190
+ return {
191
+ outcome: 'usage-error',
192
+ exitCode: 1,
193
+ message: `mint-adr ${item}: empty ADR slug — cannot draft an ADR`,
194
+ };
195
+ }
196
+
197
+ const adrPath = adrItemRel(adrSlug);
198
+ const by = options.by || resolveBy(cwd, env);
199
+ const title = (options.adrTitle ?? adrSlug).trim() || adrSlug;
200
+ const content =
201
+ options.adrBody !== undefined && options.adrBody.trim() !== ''
202
+ ? renderAdrFile(adrSlug, title, options.adrBody.trim())
203
+ : buildAdrBody({
204
+ slug: adrSlug,
205
+ title,
206
+ observation: readItem(cwd, itemPath, env),
207
+ answers: options.answers ?? [],
208
+ });
209
+
210
+ // The source note + its answered sidecar `git rm` IN THE SAME create commit
211
+ // (mint = ONE atomic commit). A CAS LOSER never reaches the commit, so it
212
+ // leaves both INTACT for a retry (the loser-backs-off guarantee, over deletion).
213
+ const sidecarPath = sidecarPathFor(item);
214
+
215
+ const created: CreateItemThroughCasResult = await createItemThroughCas({
216
+ path: adrPath,
217
+ content,
218
+ deletePaths: [itemPath, sidecarPath],
219
+ cwd,
220
+ arbiter: options.arbiter,
221
+ by,
222
+ dryRun: options.dryRun,
223
+ env,
224
+ note,
225
+ ...(options.contention !== undefined
226
+ ? {contention: options.contention}
227
+ : {}),
228
+ });
229
+ if (created.exitCode !== 0) {
230
+ const message =
231
+ `mint-adr ${item}: the new ADR ${adrPath} ${created.outcome} the ` +
232
+ `create CAS (${created.message}) — backing off, the observation is left ` +
233
+ 'intact for a retry.';
234
+ note(message);
235
+ return {
236
+ outcome: created.outcome === 'lost' ? 'lost' : 'contended',
237
+ exitCode: created.exitCode,
238
+ message,
239
+ };
240
+ }
241
+
242
+ const message =
243
+ `minted ${item} → CREATED ${adrPath} (via the CAS) + DELETED the ` +
244
+ 'observation + its sidecar in the same commit.';
245
+ note(message);
246
+ return {outcome: 'minted', exitCode: 0, adrPath, message};
247
+ }
248
+
249
+ /**
250
+ * Build a SELF-CONTAINED ADR file FROM an answered observation + its answer(s),
251
+ * in the repo's existing `docs/adr/` shape (recorded `## Decisions`): a `---`
252
+ * frontmatter fence (`title` / `status: accepted` / `created`) then a
253
+ * `# ADR: {title}` heading and the three ADR-FORMAT sections — **Context**
254
+ * (the source signal that prompted the decision), **Decision** (what was decided,
255
+ * from the human's answer), and **Why** (the rationale the answer carries). The
256
+ * decision's WHY is carried IN (the answer prose), so the ADR reads alone — the
257
+ * precondition for deleting the source in the same commit.
258
+ *
259
+ * The mechanism prose of the observation (everything before its first
260
+ * `## Open questions` heading, frontmatter dropped) seeds Context; the
261
+ * question(s)+answer(s) seed Decision + Why. When no answers are threaded the
262
+ * Decision/Why fall back to the observation's prose so the file is never empty.
263
+ */
264
+ export function buildAdrBody(input: {
265
+ slug: string;
266
+ title: string;
267
+ observation: string;
268
+ answers: {question: string; answer: string}[];
269
+ }): string {
270
+ const context = mechanismOf(input.observation).trim();
271
+ const decisionLines: string[] = [];
272
+ const whyLines: string[] = [];
273
+ for (const {question, answer} of input.answers) {
274
+ const q = question.trim();
275
+ const a = answer.trim();
276
+ if (q !== '' || a !== '') {
277
+ decisionLines.push(`- **${q || '(question)'}** — ${a || '(no answer)'}`);
278
+ if (a !== '') {
279
+ whyLines.push(a);
280
+ }
281
+ }
282
+ }
283
+ const body: string[] = [
284
+ '## Context',
285
+ '',
286
+ context === ''
287
+ ? '(no source context was carried from the observation.)'
288
+ : context,
289
+ '',
290
+ '## Decision',
291
+ '',
292
+ decisionLines.length > 0
293
+ ? decisionLines.join('\n')
294
+ : '(the decision is recorded in the source context above.)',
295
+ '',
296
+ '## Why',
297
+ '',
298
+ whyLines.length > 0
299
+ ? whyLines.join('\n\n')
300
+ : 'The decision follows directly from the answered question(s) above; the source signal is preserved in this ADR (the note itself leaves by deletion, git history is the archive).',
301
+ '',
302
+ ];
303
+ return renderAdrFile(input.slug, input.title, body.join('\n'));
304
+ }
305
+
306
+ /**
307
+ * Wrap an ADR `body` (the markdown AFTER the frontmatter) in the repo's existing
308
+ * ADR file shape: a `---` frontmatter fence (`title` / `status: accepted` /
309
+ * `created`) then a `# ADR: {title}` heading, then the body. Mirrors the existing
310
+ * `docs/adr/*.md` convention (slug-named files with a frontmatter block), NOT the
311
+ * `NNNN-` numeric prefix the ADR-FORMAT template shows — the repo's LIVE
312
+ * convention wins (recorded `## Decisions`).
313
+ */
314
+ function renderAdrFile(slug: string, title: string, body: string): string {
315
+ const date = new Date().toISOString().slice(0, 10);
316
+ return [
317
+ '---',
318
+ `title: ${title}`,
319
+ 'status: accepted',
320
+ `created: ${date}`,
321
+ '---',
322
+ '',
323
+ `# ADR: ${title}`,
324
+ '',
325
+ body.replace(/\s*$/, ''),
326
+ '',
327
+ ].join('\n');
328
+ }
329
+
330
+ /**
331
+ * The observation's mechanism PROSE: everything before its first
332
+ * `## Open questions` heading, with the frontmatter fence dropped. An ADR records
333
+ * a SETTLED decision, so an observation's open-questions scoping is deliberately
334
+ * NOT carried into the ADR body (unlike a promoted task/prd, which keeps the
335
+ * open questions live) — the answered question(s) ARE the decision.
336
+ */
337
+ function mechanismOf(observation: string): string {
338
+ const body = stripFrontmatter(observation);
339
+ const lines = body.split('\n');
340
+ const startIdx = lines.findIndex((l) => /^##\s+Open questions\b/i.test(l));
341
+ if (startIdx === -1) {
342
+ return body;
343
+ }
344
+ return lines.slice(0, startIdx).join('\n');
345
+ }
346
+
347
+ /** Strip a leading `---\n…\n---` frontmatter fence, returning the body. */
348
+ function stripFrontmatter(content: string): string {
349
+ const normalized = content.replace(/\r\n/g, '\n').replace(/^\uFEFF/, '');
350
+ if (!normalized.startsWith('---\n')) {
351
+ return normalized;
352
+ }
353
+ const lines = normalized.split('\n');
354
+ const closing = lines.indexOf('---', 1);
355
+ if (closing === -1) {
356
+ return normalized;
357
+ }
358
+ return lines
359
+ .slice(closing + 1)
360
+ .join('\n')
361
+ .replace(/^\n+/, '');
362
+ }
@@ -0,0 +1,240 @@
1
+ import type {Config} from './config.js';
2
+ import {ledgerRead, type LedgerReadStrategy} from './ledger-read.js';
3
+ import {resolveRepoConfigFromMirror} from './repo-mirror.js';
4
+ import {
5
+ scoreItems,
6
+ scoreSpecs,
7
+ toScannedLifecycle,
8
+ type ScannedItem,
9
+ type ScanReport,
10
+ type RepoReport,
11
+ } from './scan.js';
12
+ import {
13
+ taskableSpecs,
14
+ type SpecCandidate,
15
+ type SelectedLifecyclePools,
16
+ } from './select-priority.js';
17
+ import {gatherLifecycleMirror} from './lifecycle-gather.js';
18
+ import type {LifecyclePoolGates} from './lifecycle-pools.js';
19
+ import {heldTaskSlugs} from './item-lock.js';
20
+
21
+ /**
22
+ * The MIRROR-SIDE eligible-pool scan — the isolated counterpart to
23
+ * `do-autopick`'s in-place pool scan ({@link performDoAuto}). It enumerates the
24
+ * SAME two pools (eligible TASKS + taskable PRDS) but reads a BARE hub mirror's
25
+ * committed `main` ref (`git ls-tree`/`git show`), NOT a working checkout.
26
+ *
27
+ * This is the ONE reusable enumeration unit the prd's FOLD-IN note demands: BOTH
28
+ * the `run` loop driver's isolated+parallel auto-pick AND the one-shot/CI
29
+ * `advance --remote -n` / the CI matrix consume it, so the `-n`/auto-pick rungs
30
+ * (both `do` and `advance`, both `run`-loop and one-shot) all call the SAME scan.
31
+ * A standalone `do --remote -n` then falls out as a thin caller — the scan is NOT
32
+ * invented twice (the existing inline `-n`×`--remote` REFUSAL in `cli.ts` is the
33
+ * placeholder this scan replaces; removing the refusal is the driver/caller's job).
34
+ *
35
+ * It only ENUMERATES the pool — it never claims, builds, or runs anything. `-n`
36
+ * stays ALWAYS SEQUENTIAL (US #25): the selection layer ({@link selectPrioritised})
37
+ * orders + counts; parallelism comes only from `run`'s concurrent loop or the CI
38
+ * matrix, never from this scan or from `-n`.
39
+ *
40
+ * It is the MIRROR-ref counterpart of `do-autopick`'s in-place scan, reusing the
41
+ * exact predicates rather than re-deriving them:
42
+ *
43
+ * - **tasks** — {@link scoreItems} (the SAME eligibility scoring the in-place
44
+ * `scanRepoPaths`/registry `scan` use) over the mirror's `work/backlog` +
45
+ * `work/done` read via {@link LedgerReadStrategy.resolveMirrorState}.
46
+ * - **taskable prds** — {@link taskableSpecs} (`autoslice-gate`'s predicate)
47
+ * over the mirror's `work/prds/ready` + `work/prds/tasked` read via the mirror-ref
48
+ * {@link LedgerReadStrategy.resolveMirrorSpecPool}.
49
+ *
50
+ * Per-repo policy parity: a bare mirror has no checked-out `.dorfl.json`,
51
+ * but the COMMITTED one is reachable on `main` (the `do --remote` per-repo seam).
52
+ * We layer it via {@link resolveRepoConfigFromMirror} so the same logical `work/`
53
+ * state yields the SAME `autoBuild`/`autoTask` decision an in-place checkout
54
+ * would — that is what makes the mirror scan PARITY-equal to the in-place one.
55
+ */
56
+
57
+ /** What {@link scanMirrorPool} needs: which bare mirror + the global config. */
58
+ export interface ScanMirrorPoolOptions {
59
+ /** The bare hub mirror directory (`<workspacesDir>/repos/<key>.git`). */
60
+ mirrorPath: string;
61
+ /**
62
+ * The global + default config layer. The repo's COMMITTED `.dorfl.json`
63
+ * (read from the mirror's `main`) is layered on top, so `autoBuild`/`autoTask`
64
+ * resolve per-repo exactly as the in-place scan resolves them from the checkout.
65
+ */
66
+ config: Config;
67
+ /**
68
+ * The mirror-LOCAL ref whose `work/` tree to read (default `main`). A bare hub
69
+ * mirror's `main` is a LOCAL branch — never `origin/main`.
70
+ */
71
+ ref?: string;
72
+ /**
73
+ * Override the read seam (tests inject a stub). Defaults to the active
74
+ * {@link ledgerRead} — the SAME seam the in-place scan reads through.
75
+ */
76
+ read?: LedgerReadStrategy;
77
+ /**
78
+ * Sink for a non-fatal per-repo-config read warning. The scan must never error
79
+ * out on a config-read fault — it falls back to global + default (the
80
+ * no-per-repo behaviour) and warns. (Fetch-first freshness is the CALLER's job,
81
+ * exactly as it is for the registry `scan`; this reads the already-fetched ref.)
82
+ */
83
+ warn?: (message: string) => void;
84
+ env?: NodeJS.ProcessEnv;
85
+ /**
86
+ * The LIFECYCLE-POOL create-gates (task `advance-autopick-lifecycle-pools`),
87
+ * the internal hook the gate tasks will wire to `observationTriage` /
88
+ * `surfaceBlockers`. INTERIM, born OFF: omitted ⇒ BOTH create-gates OFF, so the
89
+ * mirror-side triage + surface sub-pools contribute NOTHING (the apply sub-pool
90
+ * is always-on). The mirror enumeration mirrors the in-place one exactly.
91
+ */
92
+ lifecycleGates?: LifecyclePoolGates;
93
+ /**
94
+ * The per-machine config-override map (ADR
95
+ * `per-machine-config-override-layer`), threaded into the mirror-side per-repo
96
+ * resolution so the override applies to the autopick pool scan. Default: empty.
97
+ */
98
+ override?: import('./config-override.js').ConfigOverrideMap;
99
+ }
100
+
101
+ /**
102
+ * The enumerated mirror-side pool — the isolated counterpart of `do-autopick`'s
103
+ * two pools. Both drivers feed `report` + `prds` into the SAME
104
+ * {@link selectPrioritised} (the loop driver takes all; the one-shot/CI driver
105
+ * bounds by a SEQUENTIAL `count`).
106
+ */
107
+ export interface MirrorPoolScanResult {
108
+ /**
109
+ * The task pool as a one-repo {@link ScanReport} (the mirror is the single
110
+ * repo), scored through {@link scoreItems} — the SAME shape
111
+ * {@link selectPrioritised} consumes for the in-place scan, so the task
112
+ * selection is byte-identical to `run`'s.
113
+ */
114
+ report: ScanReport;
115
+ /** Every scanned task (eligible or not), in scan order. */
116
+ tasks: ScannedItem[];
117
+ /** Just the eligible subset of {@link tasks} (convenience for assertions/callers). */
118
+ eligibleTasks: ScannedItem[];
119
+ /**
120
+ * The TASKABLE SPEC pool — already filtered through `taskableSpecs`
121
+ * (`autoslice-gate`'s predicate). In declaration order; the selection layer
122
+ * does not re-gate it.
123
+ */
124
+ specs: SpecCandidate[];
125
+ /**
126
+ * The LIFECYCLE pools (task `advance-autopick-lifecycle-pools`): untriaged
127
+ * observations (triage), `needsAnswers`-blocked items with no all-answered
128
+ * sidecar (surface), and answered-sidecar items (apply). Built through the SAME
129
+ * shared {@link buildLifecyclePools} unit the in-place caller uses (NOT a second
130
+ * enumeration), so the in-place + mirror-side selections AGREE. The create-gates
131
+ * default OFF (interim); apply is always present. The drivers feed this straight
132
+ * into {@link selectPrioritised}'s `lifecycle` slot.
133
+ */
134
+ lifecycle: SelectedLifecyclePools;
135
+ }
136
+
137
+ /**
138
+ * Run the mirror-side eligible-pool scan over a single bare hub mirror. Reads
139
+ * both pools from its committed `main`, scores/filters them through the EXACT
140
+ * in-place predicates, and returns the shape both drivers consume.
141
+ */
142
+ export async function scanMirrorPool(
143
+ options: ScanMirrorPoolOptions,
144
+ ): Promise<MirrorPoolScanResult> {
145
+ const {mirrorPath, config, ref = 'main', env} = options;
146
+ const read = options.read ?? ledgerRead;
147
+ const warn = options.warn;
148
+
149
+ // Per-repo policy parity: layer the COMMITTED `.dorfl.json` from the
150
+ // mirror's `main` (the `do --remote` per-repo seam) onto global. Never fatal —
151
+ // a config-less repo or a read fault falls back to global + default.
152
+ let repoConfig: Config;
153
+ try {
154
+ repoConfig = resolveRepoConfigFromMirror({
155
+ mirrorPath,
156
+ global: config,
157
+ env,
158
+ override: options.override,
159
+ });
160
+ } catch (err) {
161
+ const reason = err instanceof Error ? err.message : String(err);
162
+ warn?.(
163
+ `could not read the target repo's config from ${mirrorPath}/main; ` +
164
+ `resolving from global + default. ${reason}`,
165
+ );
166
+ repoConfig = config;
167
+ }
168
+
169
+ // Pool 1 — eligible TASKS from the bare mirror's `work/backlog`+`work/done`,
170
+ // scored through the EXACT same `scoreItems` the in-place/registry scans use.
171
+ const state = await read.resolveMirrorState({mirrorPath, ref, env});
172
+ const counts = {totalItems: 0, totalEligible: 0};
173
+ // HELD-SLUG SUBTRACTION (prd `ledger-status-per-item-lock-refs` US #15): a bare
174
+ // hub mirror's arbiter is its `origin`; read the held lock refs from there and
175
+ // exclude those slugs from the enumerated `backlog/` pool. Non-fatal (empty set
176
+ // on any fault) and redundant-but-harmless while the body still moves — wired now
177
+ // so task #9 needs no reader change. Freshness (fetch-first) is the CALLER's job
178
+ // for the pool ref, exactly as it is for the config read; `heldTaskSlugs` does
179
+ // its own lock-ref fetch.
180
+ const heldSlugs = await heldTaskSlugs(mirrorPath, 'origin', env);
181
+ const items = scoreItems(state, repoConfig.autoBuild, counts, heldSlugs);
182
+ // Pool 2 — TASKABLE PRDS from the bare mirror's `work/prds/ready`+`work/prds/tasked`,
183
+ // filtered through `autoslice-gate`'s predicate (NOT reinvented). Read FIRST so
184
+ // we can populate the `specs[]` companion of `items[]` on the RepoReport below.
185
+ const pool = await read.resolveMirrorSpecPool({mirrorPath, ref, env});
186
+ const specs = taskableSpecs({
187
+ candidates: pool.specs.map((p) => ({
188
+ repoPath: mirrorPath,
189
+ slug: p.slug,
190
+ humanOnly: p.humanOnly,
191
+ needsAnswers: p.needsAnswers,
192
+ taskedAfter: p.taskedAfter,
193
+ })),
194
+ taskedSlugs: pool.taskedSlugs,
195
+ autoTask: repoConfig.autoTask,
196
+ });
197
+ // The one-slug-one-folder LINT is a HUMAN-FACING surface (`scan`/`status`); this
198
+ // mirror-side pool scan exists only to SCORE the task/prd candidate pools for
199
+ // autonomous selection, never to render a dashboard, so it carries an empty lint
200
+ // (the duplicate surface is the user-facing `scan`/`status`, per the task). The
201
+ // `specs[]` companion of `items[]` is filled via the SAME `scoreSpecs` helper
202
+ // `scan`/`scanRepoPaths` call — so the propose-matrix `jq` (`repos[].specs[] |
203
+ // select(.eligibility.eligible)`) sees the same shape on every surface.
204
+ // Pools 3 + 4 — the LIFECYCLE pools, gathered from the SAME mirror `main` (the
205
+ // `needsAnswers` backlog/prds + their sidecars + `work/notes/observations/`) and built
206
+ // through the SHARED enumeration unit the in-place caller uses — so the in-place
207
+ // + mirror-side selections AGREE. Create-gates default OFF (interim); apply
208
+ // (consume) is always present.
209
+ const lifecycle = await gatherLifecycleMirror({
210
+ mirrorPath,
211
+ ref,
212
+ read,
213
+ gates: options.lifecycleGates,
214
+ env,
215
+ });
216
+
217
+ const repo: RepoReport = {
218
+ path: mirrorPath,
219
+ items,
220
+ specs: scoreSpecs(mirrorPath, pool, repoConfig.autoTask),
221
+ // The propose-matrix lifecycle pool on this mirror's `RepoReport` — the SAME
222
+ // `gatherLifecycleMirror` result projected onto the `scan --json` shape, so
223
+ // the dashboard/matrix surface agrees with the selection scoring below.
224
+ lifecycle: toScannedLifecycle(lifecycle),
225
+ ledgerDuplicates: [],
226
+ };
227
+ const report: ScanReport = {
228
+ repos: [repo],
229
+ totalItems: counts.totalItems,
230
+ totalEligible: counts.totalEligible,
231
+ };
232
+
233
+ return {
234
+ report,
235
+ tasks: items,
236
+ eligibleTasks: items.filter((i) => i.eligibility.eligible),
237
+ specs,
238
+ lifecycle,
239
+ };
240
+ }