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,367 @@
1
+ import {ledgerRead, type LedgerReadStrategy} from './ledger-read.js';
2
+
3
+ /**
4
+ * The **§3a slug-namespace resolver** (`docs/adr/command-surface-and-
5
+ * journeys.md` §3a). A spec and a task can share a slug (e.g. spec `auto-slice`),
6
+ * and `do` spans BOTH namespaces (build a task OR task a spec), so a bare slug
7
+ * is ambiguous. This module is the pure resolver that turns a CLI slug argument
8
+ * into a resolved target, plus the guard the TASK-ONLY commands use to reject a
9
+ * `spec:` argument.
10
+ *
11
+ * | input | resolves to | on collision (a task AND a spec share `<slug>`) |
12
+ * | ---------------- | --------------- | ----------------------------------------------- |
13
+ * | `<slug>` (bare) | the **task** | **ERROR** — "use task:<slug> or spec:<slug>" |
14
+ * | `task:<slug>` | the task | always unambiguous |
15
+ * | `spec:<slug>` | the spec | always unambiguous |
16
+ *
17
+ * The two load-bearing rules:
18
+ *
19
+ * - **Bare `<slug>` is human convenience ONLY.** It resolves to the task, but
20
+ * ONLY after a cheap cross-namespace existence check confirms NO spec shares
21
+ * the slug; on a collision it ERRORS loudly (it never silently guesses). CI /
22
+ * automation MUST use explicit prefixes (collision-proof across time).
23
+ * - **Task-only commands** (`claim`, `start`, `resume`, `complete`, `prompt`,
24
+ * `requeue`, `work-on`) accept bare (= task) + `task:` and **reject `spec:`**
25
+ * with a clear "operates on tasks, not specs" error.
26
+ *
27
+ * It is PURE: no git, no mutation, no side effects beyond the two cheap EXISTENCE
28
+ * reads (task through the existing read seam; spec through the seam's
29
+ * `resolveSpecExistence` spec reader — the single shared spec read path the later
30
+ * tasking / `do spec:` work reuses).
31
+ *
32
+ * This mirrors the field-level namespace split the contract already makes (task
33
+ * `blockedBy` resolves against tasks; spec `taskedAfter` against specs); the
34
+ * `task:`/`spec:` prefixes are the command-line form of that one rule.
35
+ */
36
+
37
+ /**
38
+ * The namespaces a slug can name. `task`/`spec` are the §3a pair that `do` spans;
39
+ * `observation` is the NEW namespace the `advance` verb adds (spec `advance-loop`,
40
+ * task `advance-verb-resolver`) so `advance obs:<slug>` can name an observation to
41
+ * triage. The `do`-family resolvers (`resolveSlug`, `resolveTaskOnlyArg`)
42
+ * deliberately do NOT span `observation` — only the `advance` resolver does (see
43
+ * {@link resolveAdvanceArg}).
44
+ *
45
+ * HARD CUTOVER (spec `prd-to-spec-vocabulary-cutover-and-migration-command`,
46
+ * contract step): the legacy `'prd'` member is GONE — the parent-spec namespace
47
+ * is `'spec'` only. A `prd:<slug>` arg no longer parses to a namespace (it falls
48
+ * through to a bare literal slug), and a `work/prd-<slug>` branch ref no longer
49
+ * parses. No back-compat alias (the clean-break stance).
50
+ */
51
+ export type SlugNamespace = 'task' | 'spec' | 'observation';
52
+
53
+ /**
54
+ * The PRODUCER axis (ORTHOGONAL to {@link SlugNamespace}): WHICH lifecycle
55
+ * created the branch, when that matters for collision isolation. `'intake'` is
56
+ * the only producer today — an `intake N` run that CREATES a brand-new backlog
57
+ * item (`work/backlog/<slug>.md`) or spec (`work/specs/<slug>.md`). Its branch is a
58
+ * short-lived "create the item" branch, a SEPARATE lifecycle from the later
59
+ * claim→build→complete of `do task:<slug>` — so it gets its own branch ref and
60
+ * never reuses (or is reused by) the build branch for the same slug. Absent for
61
+ * the build/tasking paths (the common case), which carry no producer prefix.
62
+ */
63
+ export type BranchProducer = 'intake';
64
+
65
+ /**
66
+ * The **ONE** construction of the work-BRANCH ref from the namespaced identity.
67
+ * The branch ref is the last identity to join the `<type>-<slug>` scheme the
68
+ * advance sidecar filename (`work/questions/<type>-<slug>.md`) and the
69
+ * lock entry already use — so a spec `<slug>` and a task `<slug>`
70
+ * sharing a slug NEVER collide on the arbiter branch (the structural bug this
71
+ * fixes: `intake`, `do task:<slug>`, and `do spec:<slug>` all built on the SAME
72
+ * un-namespaced `work/<slug>` branch).
73
+ *
74
+ * Spelling: `work/<type>-<slug>` (i.e. `work/task-<slug>`, `work/spec-<slug>`),
75
+ * matching the lock-entry + sidecar-filename `<type>-<slug>` form EXACTLY. The
76
+ * optional {@link BranchProducer} prefixes it (`work/<producer>-<type>-<slug>`,
77
+ * e.g. `work/intake-task-<slug>`, `work/intake-spec-<slug>`) so a branch that
78
+ * CREATES an item (intake) never collides with the branch that later BUILDS the
79
+ * same-slug task. One consistent rule, not a second derivation. EVERY site
80
+ * that builds or reads a work-branch ref MUST call this (or
81
+ * {@link parseWorkBranchRef}); none may hand-build `work/${slug}`.
82
+ */
83
+ export function workBranchRef(
84
+ namespace: SlugNamespace,
85
+ slug: string,
86
+ opts?: {producer?: BranchProducer},
87
+ ): string {
88
+ const producer = opts?.producer;
89
+ return producer === undefined
90
+ ? `work/${namespace}-${slug}`
91
+ : `work/${producer}-${namespace}-${slug}`;
92
+ }
93
+
94
+ /**
95
+ * The inverse of {@link workBranchRef}: parse a namespaced work-branch ref back
96
+ * into its `{producer?, namespace, slug}`. Returns `undefined` for any ref that
97
+ * is NOT a `work/[<producer>-]<type>-<slug>` branch (e.g. `main`, a detached
98
+ * HEAD, or — after the clean breaking cutover — a pre-rename `work/slice-<slug>`
99
+ * / `work/prd-<slug>` ref or an un-namespaced `work/<slug>`). This is how
100
+ * `complete`/`integration` recover the type carried IN the branch name they are
101
+ * already standing on, rather than re-deriving it inconsistently. The regex
102
+ * anchors the optional producer prefix BEFORE the type alternation, so
103
+ * `work/intake-task-foo` resolves to
104
+ * `{producer:'intake', namespace:'task', slug:'foo'}` (the `slug` never
105
+ * swallows the `intake-`/`task-` prefixes). The old `slice`/`brief`/`prd` types
106
+ * are NOT in the alternation, so a pre-rename `work/prd-foo` ref returns
107
+ * `undefined` (the clean-break stance: no migration-window alias).
108
+ */
109
+ export function parseWorkBranchRef(
110
+ branch: string,
111
+ ):
112
+ | {producer?: BranchProducer; namespace: SlugNamespace; slug: string}
113
+ | undefined {
114
+ // HARD CUTOVER (spec `prd-to-spec-vocabulary-cutover-and-migration-command`,
115
+ // contract step): the type alternation is `task|spec` ONLY — the legacy `prd`
116
+ // token is GONE, so a pre-rename `work/prd-<slug>` ref returns `undefined` (no
117
+ // migration-window alias; the clean-break stance).
118
+ const match = /^work\/(?:(intake)-)?(task|spec)-(.+)$/.exec(branch);
119
+ if (!match) {
120
+ return undefined;
121
+ }
122
+ const producer = match[1] as BranchProducer | undefined;
123
+ const result: {
124
+ producer?: BranchProducer;
125
+ namespace: SlugNamespace;
126
+ slug: string;
127
+ } = {namespace: match[2] as SlugNamespace, slug: match[3]};
128
+ if (producer !== undefined) {
129
+ result.producer = producer;
130
+ }
131
+ return result;
132
+ }
133
+
134
+ /** A slug argument's parsed namespace + bare slug (before any existence check). */
135
+ export interface ParsedSlugArg {
136
+ /**
137
+ * `'task'` / `'spec'` when an explicit prefix was given; `undefined` for a
138
+ * bare slug (the namespace is then resolved by the cross-namespace check).
139
+ */
140
+ explicit: SlugNamespace | undefined;
141
+ /** The bare slug with any `task:`/`spec:` prefix stripped. */
142
+ slug: string;
143
+ }
144
+
145
+ /** A fully-resolved slug target: which namespace it names + the bare slug. */
146
+ export interface ResolvedSlug {
147
+ namespace: SlugNamespace;
148
+ slug: string;
149
+ /** Whether the caller wrote an explicit `task:`/`spec:` prefix. */
150
+ explicit: boolean;
151
+ }
152
+
153
+ /** The explicit-prefix forms the resolver understands. */
154
+ const TASK_PREFIX = 'task:';
155
+ /**
156
+ * The parent-spec namespace prefix: `spec:<slug>` → `{explicit: 'spec'}`. HARD
157
+ * CUTOVER (spec `prd-to-spec-vocabulary-cutover-and-migration-command`): the
158
+ * legacy `prd:` prefix is GONE — a `prd:<slug>` arg falls through to a bare
159
+ * literal slug (no namespace), the clean-break stance.
160
+ */
161
+ const SPEC_PREFIX = 'spec:';
162
+ /**
163
+ * The observation namespace's prefixes: the short `obs:` CLI alias and the
164
+ * canonical `observation:` long form both parse to the `observation` namespace.
165
+ * Only the `advance` resolver acts on this namespace; `do` rejects it.
166
+ */
167
+ const OBS_PREFIX = 'obs:';
168
+ const OBSERVATION_PREFIX = 'observation:';
169
+
170
+ /**
171
+ * Raised when a slug argument cannot be resolved: an ambiguous bare slug
172
+ * (collision across namespaces), or a `spec:` argument handed to a task-only
173
+ * command. Carries a clear, human-resolvable message.
174
+ */
175
+ export class SlugResolutionError extends Error {
176
+ constructor(message: string) {
177
+ super(message);
178
+ this.name = 'SlugResolutionError';
179
+ }
180
+ }
181
+
182
+ /**
183
+ * Split a raw CLI slug argument into its explicit namespace (if any) + the bare
184
+ * slug. PURE string work, no existence check: `task:foo` → explicit task,
185
+ * `spec:foo` → explicit spec, `foo` → bare (`explicit: undefined`). The prefix
186
+ * match is case-sensitive and exact (`task:`/`spec:`); a slug like `tasked` is
187
+ * NOT a prefix and stays bare. HARD CUTOVER: the legacy `prd:` prefix is not a
188
+ * namespace prefix anymore — `prd:foo` stays a bare literal slug.
189
+ */
190
+ export function parseSlugArg(arg: string): ParsedSlugArg {
191
+ if (arg.startsWith(TASK_PREFIX)) {
192
+ return {explicit: 'task', slug: arg.slice(TASK_PREFIX.length)};
193
+ }
194
+ if (arg.startsWith(SPEC_PREFIX)) {
195
+ return {explicit: 'spec', slug: arg.slice(SPEC_PREFIX.length)};
196
+ }
197
+ if (arg.startsWith(OBSERVATION_PREFIX)) {
198
+ return {
199
+ explicit: 'observation',
200
+ slug: arg.slice(OBSERVATION_PREFIX.length),
201
+ };
202
+ }
203
+ if (arg.startsWith(OBS_PREFIX)) {
204
+ return {explicit: 'observation', slug: arg.slice(OBS_PREFIX.length)};
205
+ }
206
+ return {explicit: undefined, slug: arg};
207
+ }
208
+
209
+ /** What the resolver needs to perform the existence checks. */
210
+ export interface ResolveSlugInput {
211
+ /** The raw CLI slug argument (bare, `task:<slug>`, or `spec:<slug>`). */
212
+ arg: string;
213
+ /** The repo working-tree root whose `work/` namespaces to read. */
214
+ repoPath: string;
215
+ /**
216
+ * The read seam to resolve existence through (task via `resolveLocalState`,
217
+ * spec via `resolveSpecExistence`). Defaults to the active {@link ledgerRead};
218
+ * injectable for tests.
219
+ */
220
+ read?: LedgerReadStrategy;
221
+ }
222
+
223
+ /** Does a TASK named `slug` exist (backlog or in-progress) in this repo? */
224
+ function taskExists(
225
+ read: LedgerReadStrategy,
226
+ repoPath: string,
227
+ slug: string,
228
+ ): boolean {
229
+ // The task side resolves THROUGH the existing read seam — its local-tree
230
+ // method already parses the task-pool slugs (frontmatter, falling back
231
+ // to filename). An in-progress task is ALSO a task (a claimed one); the
232
+ // local state's backlog covers the up-for-grabs case, which is what a bare
233
+ // `<slug>` collision check needs.
234
+ const state = read.resolveLocalState({repoPath});
235
+ return state.ready.some((item) => item.slug === slug);
236
+ }
237
+
238
+ /** Does a spec named `slug` exist (ready or being tasked) in this repo? */
239
+ function specExists(
240
+ read: LedgerReadStrategy,
241
+ repoPath: string,
242
+ slug: string,
243
+ ): boolean {
244
+ return read.resolveSpecExistence({repoPath, slug}).exists;
245
+ }
246
+
247
+ /**
248
+ * Resolve a raw slug argument (`do`'s cross-namespace path) into its namespace +
249
+ * bare slug, per ADR §3a:
250
+ *
251
+ * - `task:<slug>` → `{namespace: 'task'}` — always unambiguous (no check).
252
+ * - `spec:<slug>` → `{namespace: 'spec'}` — always unambiguous (no check).
253
+ * - `<slug>` (bare) → the **task**, but ONLY after confirming no spec shares the
254
+ * slug. On a collision (both a task AND a spec named `<slug>` exist) it throws
255
+ * {@link SlugResolutionError} — loud, immediate, human-resolvable. It NEVER
256
+ * silently guesses.
257
+ *
258
+ * Explicit prefixes skip the existence check entirely (they are collision-proof
259
+ * by construction); only the bare path pays the cheap cross-namespace read.
260
+ */
261
+ export function resolveSlug(input: ResolveSlugInput): ResolvedSlug {
262
+ const read = input.read ?? ledgerRead;
263
+ const parsed = parseSlugArg(input.arg);
264
+
265
+ if (parsed.explicit === 'observation') {
266
+ // `do` spans the task/prd namespaces ONLY (build a task OR task a prd).
267
+ // The `observation` namespace is `advance`'s alone (triage). Reject it here
268
+ // rather than let a `do obs:<slug>` resolve into a namespace `do` cannot act
269
+ // on — point the human at the verb that owns it.
270
+ throw new SlugResolutionError(
271
+ `'${input.arg}' names an observation, which \`do\` does not act on. ` +
272
+ `Use \`advance obs:${parsed.slug}\` to triage it.`,
273
+ );
274
+ }
275
+ if (parsed.explicit !== undefined) {
276
+ // Explicit prefix: unambiguous by construction. No existence check.
277
+ return {namespace: parsed.explicit, slug: parsed.slug, explicit: true};
278
+ }
279
+
280
+ // Bare slug: resolve to the task, but ONLY after the cross-namespace check.
281
+ // A task/spec collision is a loud ERROR — never a silent guess.
282
+ if (specExists(read, input.repoPath, parsed.slug)) {
283
+ throw new SlugResolutionError(
284
+ `'${parsed.slug}' is ambiguous: both a task and a spec share that slug. ` +
285
+ `Use \`task:${parsed.slug}\` or \`spec:${parsed.slug}\` to disambiguate.`,
286
+ );
287
+ }
288
+ return {namespace: 'task', slug: parsed.slug, explicit: false};
289
+ }
290
+
291
+ /**
292
+ * Resolve a slug argument for the `advance` verb (prd `advance-loop`, task
293
+ * `advance-verb-resolver`). `advance` is the SIBLING top-level verb (NOT a `do`
294
+ * subcommand) that reuses this SAME shared `prefix:arg` resolver, EXTENDED with
295
+ * the `observation` namespace `do` does not span:
296
+ *
297
+ * - `task:<slug>` → `{namespace: 'task'}` — unambiguous (no check).
298
+ * - `spec:<slug>` → `{namespace: 'spec'}` — unambiguous (no check).
299
+ * - `obs:<slug>` /
300
+ * `observation:<slug>` → `{namespace: 'observation'}` — unambiguous (no check).
301
+ * - `<slug>` (bare) → the **task**, but ONLY after the SAME cheap
302
+ * cross-namespace check `do` makes (no spec shares the slug); on a task/spec
303
+ * collision it throws {@link SlugResolutionError}, never silently guessing.
304
+ *
305
+ * The bare-slug cross-check is intentionally IDENTICAL to {@link resolveSlug}'s
306
+ * (bare = task, error on a task/spec collision) — the "bare slug = task"
307
+ * ergonomic is preserved exactly as `do` has it. An observation is NEVER reached
308
+ * by a bare slug; it must be named explicitly (`obs:<slug>`), because the bare
309
+ * path stays the task/spec two-namespace check (an observation sharing a slug
310
+ * does not make a bare slug ambiguous — a human typing a bare slug means the
311
+ * task, as everywhere else).
312
+ */
313
+ export function resolveAdvanceArg(input: ResolveSlugInput): ResolvedSlug {
314
+ const read = input.read ?? ledgerRead;
315
+ const parsed = parseSlugArg(input.arg);
316
+
317
+ if (parsed.explicit !== undefined) {
318
+ // Explicit prefix (task / spec / observation): unambiguous by construction.
319
+ return {namespace: parsed.explicit, slug: parsed.slug, explicit: true};
320
+ }
321
+
322
+ // Bare slug: the SAME task/spec cross-namespace check `do` makes — bare = task,
323
+ // a task/spec collision is a loud ERROR, never a silent guess.
324
+ if (specExists(read, input.repoPath, parsed.slug)) {
325
+ throw new SlugResolutionError(
326
+ `'${parsed.slug}' is ambiguous: both a task and a spec share that slug. ` +
327
+ `Use \`task:${parsed.slug}\` or \`spec:${parsed.slug}\` to disambiguate.`,
328
+ );
329
+ }
330
+ return {namespace: 'task', slug: parsed.slug, explicit: false};
331
+ }
332
+
333
+ /**
334
+ * Resolve a slug argument for a TASK-ONLY command (`claim`, `start`, `resume`,
335
+ * `complete`, `prompt`, `requeue`, `work-on`). These operate on tasks, not specs,
336
+ * so:
337
+ *
338
+ * - `spec:<slug>` is REJECTED with a clear "operates on tasks, not specs" error.
339
+ * - `task:<slug>` is accepted (the explicit alias) → the bare slug.
340
+ * - `<slug>` (bare) is accepted (= the task). A task-only command does NOT
341
+ * need the cross-namespace collision check: a bare slug here ALWAYS means the
342
+ * task (there is no spec ambiguity, because the spec namespace is rejected
343
+ * outright), so it resolves straight to the task slug.
344
+ *
345
+ * Returns the bare task slug to feed the existing task machinery (claim CAS,
346
+ * start, …). PURE: it touches no files (no existence read needed — `spec:` is
347
+ * rejected on the prefix alone, bare/`task:` resolve to the task slug).
348
+ */
349
+ export function resolveTaskOnlyArg(arg: string): string {
350
+ const parsed = parseSlugArg(arg);
351
+ if (parsed.explicit === 'spec') {
352
+ throw new SlugResolutionError(
353
+ `this command operates on tasks, not specs — '${arg}' names a spec. ` +
354
+ `Drop the \`spec:\` prefix to act on the task, or use \`do ${arg}\` ` +
355
+ `to task the spec.`,
356
+ );
357
+ }
358
+ if (parsed.explicit === 'observation') {
359
+ throw new SlugResolutionError(
360
+ `this command operates on tasks, not observations — '${arg}' names an ` +
361
+ `observation. Use \`advance obs:${parsed.slug}\` to triage it.`,
362
+ );
363
+ }
364
+ // Bare or `task:` → the task slug. (A bare slug on a task-only command is
365
+ // unambiguously the task; the prd namespace is unreachable here.)
366
+ return parsed.slug;
367
+ }
@@ -0,0 +1,118 @@
1
+ import {readdirSync, readFileSync} from 'node:fs';
2
+ import {basename, join} from 'node:path';
3
+ import {parseFrontmatter} from './frontmatter.js';
4
+ import {
5
+ TASK_LIFECYCLE_FOLDERS,
6
+ type TaskLifecycleFolder,
7
+ workFolderPath,
8
+ workItemRel,
9
+ isWorkItemFile,
10
+ } from './work-layout.js';
11
+
12
+ /**
13
+ * The read-only **"is this spec complete?"** core query (prd `issue-intake`, US #8 —
14
+ * the closure-linkage half). Given a spec slug + a `work/` tree, a spec is COMPLETE
15
+ * iff there is **≥1 task carrying `spec:<slug>`** AND **all such tasks reside in
16
+ * `work/done/`**. Pure `work/`-folder logic — no seam, no git, no `gh`, no mutation.
17
+ *
18
+ * This is the LINKAGE the intake engine emits for CI to ACT on: a spec fans out to N
19
+ * tasks = N PRs whose tasks carry `spec:` ONLY (no `Refs #N` keyword is emitted),
20
+ * and the issue is closed by CI's merge-to-main JOB that runs THIS query +
21
+ * `closeIssue`. That close JOB is `runner-in-ci`'s — NOT
22
+ * built here; this module exposes ONLY the query for the job to call. The issue
23
+ * number lives ONLY on the spec (`issue:`); tasks link via `task.spec: → spec`, so
24
+ * this query keys on the SAME `spec:` field that hop uses.
25
+ *
26
+ * It is a `work/`-FOLDER RESIDENCE scan keyed on the parsed `spec:` field — NOT the
27
+ * claim ledger (`ledger-read.ts` resolves claim-STATE, a different concern). It
28
+ * reuses {@link parseFrontmatter} (the `spec:` field) rather than hand-rolling a YAML
29
+ * parse, and scans the task lifecycle folders directly: `work/tasks/ready/`,
30
+ * `work/in-progress/`, `work/needs-attention/`, and `work/done/`. A task that has
31
+ * NOT yet landed in `work/done/` (still in backlog / in-progress / needs-attention)
32
+ * means the spec is not yet complete.
33
+ */
34
+
35
+ /** The task lifecycle folders a `prd:<slug>` task can reside in. */
36
+ const TASK_FOLDERS = TASK_LIFECYCLE_FOLDERS;
37
+
38
+ /** Where a task resides — the folder name under `work/`. */
39
+ type TaskFolder = TaskLifecycleFolder;
40
+
41
+ /** What the query needs: which repo's `work/` tree to scan + which spec slug. */
42
+ export interface SpecCompleteInput {
43
+ /** The repo working-tree root whose `work/` task folders to scan. */
44
+ repoPath: string;
45
+ /** The spec slug to check (matched against each task's frontmatter `spec:`). */
46
+ slug: string;
47
+ }
48
+
49
+ /** One task carrying `spec:<slug>`, with the folder it resides in. */
50
+ export interface SpecTask {
51
+ /** Filename within `work/<folder>/` (e.g. `add-quiet-flag.md`). */
52
+ file: string;
53
+ /** The task's resolved slug (frontmatter `slug:`, falling back to filename). */
54
+ slug: string;
55
+ /** Which task folder it resides in. */
56
+ folder: TaskFolder;
57
+ }
58
+
59
+ /**
60
+ * The result of the "is this spec complete?" query. {@link complete} is the
61
+ * load-bearing verdict; {@link tasks} surfaces the matched set (with residence)
62
+ * so a caller can explain the verdict if it wants to.
63
+ */
64
+ export interface SpecCompleteResult {
65
+ /**
66
+ * `true` iff ≥1 task carries `spec:<slug>` AND every such task resides in
67
+ * `work/done/`. `false` when no task carries the slug (≥1 is REQUIRED) OR when
68
+ * any matching task is still outside `work/done/`.
69
+ */
70
+ complete: boolean;
71
+ /** Every task carrying `spec:<slug>`, across all task folders, sorted by slug. */
72
+ tasks: SpecTask[];
73
+ }
74
+
75
+ /** List the `.md` filenames in `<repoPath>/work/<folder>/`, sorted; `[]` if absent. */
76
+ function listMarkdown(repoPath: string, folder: TaskFolder): string[] {
77
+ const dir = workFolderPath(repoPath, folder);
78
+ let entries: string[];
79
+ try {
80
+ entries = readdirSync(dir);
81
+ } catch {
82
+ return [];
83
+ }
84
+ return entries.filter((name) => isWorkItemFile(name)).sort();
85
+ }
86
+
87
+ /**
88
+ * Is this spec COMPLETE? Read-only: scan the task lifecycle folders, parse each
89
+ * task's `spec:` via {@link parseFrontmatter}, keep those whose `spec:` equals
90
+ * `slug`, and return COMPLETE iff that set is NON-EMPTY and EVERY member resides in
91
+ * `work/done/`. Touches no git, no network, no mutation — a pure `work/`-folder
92
+ * residence scan keyed on the parsed `spec:` field.
93
+ */
94
+ export function isSpecComplete(input: SpecCompleteInput): SpecCompleteResult {
95
+ const {repoPath, slug} = input;
96
+ const tasks: SpecTask[] = [];
97
+ for (const folder of TASK_FOLDERS) {
98
+ for (const file of listMarkdown(repoPath, folder)) {
99
+ const content = readFileSync(
100
+ join(repoPath, workItemRel(folder, file)),
101
+ 'utf8',
102
+ );
103
+ const fm = parseFrontmatter(content);
104
+ if (fm.spec === slug) {
105
+ tasks.push({
106
+ file,
107
+ slug: fm.slug ?? basename(file, '.md'),
108
+ folder,
109
+ });
110
+ }
111
+ }
112
+ }
113
+ tasks.sort((a, b) => a.slug.localeCompare(b.slug));
114
+
115
+ // COMPLETE iff ≥1 such task AND every one of them is in `work/done/`.
116
+ const complete = tasks.length > 0 && tasks.every((s) => s.folder === 'done');
117
+ return {complete, tasks};
118
+ }