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,485 @@
1
+ /**
2
+ * Minimal, dependency-free parser for the small subset of YAML frontmatter the
3
+ * `work/` contract uses: top-level scalar keys and string lists (inline `[a, b]`
4
+ * or block `- a` form). It deliberately does NOT implement general YAML — only
5
+ * what `work/` task frontmatter needs (slug, humanOnly, blockedBy, ...).
6
+ */
7
+
8
+ /**
9
+ * **Origin-trust PROVENANCE** (task `untrusted-origin-forces-build-propose`).
10
+ * How a prd/task was BORN and the AUTHOR-TRUST verdict at birth, stamped so the
11
+ * signal SURVIVES the prd/task merge boundary (a landed-on-`main` artifact would
12
+ * otherwise erase how it was created — the laundering gap).
13
+ *
14
+ * - `origin` — `human` (the default / unset: a human authored it locally; a local
15
+ * intake with no `--origin-trust` is ALSO this) | `issue` (the CI intake
16
+ * front-door stamped it from a public issue).
17
+ * - `originTrust` — `trusted` | `untrusted`, the `author_association` verdict at
18
+ * birth (only meaningful when `origin: issue`). UNSET ⇒ `trusted` (the normal
19
+ * human path; ZERO behaviour change). `untrusted` forces the task's BUILD
20
+ * transition to `propose` so a human reviews the becomes-code change (an
21
+ * explicit `--merge` still overrides — the operator is present).
22
+ *
23
+ * `intake.ts` does NOT resolve the trust verdict itself (the `intake.ts` ~L296
24
+ * boundary: trust is CI's POLICY); the CI shell passes it IN via `--origin-trust`.
25
+ */
26
+ export type Origin = 'human' | 'issue';
27
+ export type OriginTrust = 'trusted' | 'untrusted';
28
+
29
+ export interface Frontmatter {
30
+ /**
31
+ * How the artifact was BORN (`human`|`issue`). `undefined` when omitted
32
+ * (⇒ `human`/trusted: the normal local-author path, no behaviour change).
33
+ * Stamped `issue` by the CI intake front-door so the becomes-code checkpoint is
34
+ * not laundered at the merge boundary.
35
+ */
36
+ origin: Origin | undefined;
37
+ /**
38
+ * The author-trust verdict at birth (`trusted`|`untrusted`); only meaningful
39
+ * when `origin: issue`. `undefined` when omitted (⇒ `trusted`: the normal path,
40
+ * zero behaviour change). An `untrusted` task forces its BUILD transition to
41
+ * `propose` (overridable by an explicit `--merge`).
42
+ */
43
+ originTrust: OriginTrust | undefined;
44
+ /** Content-derived slug id (frontmatter `slug:`). */
45
+ slug: string | undefined;
46
+ /**
47
+ * Source SPEC slug (frontmatter `spec:`); the spec lives at
48
+ * `work/specs/ready/<spec>.md`. The `spec` vocabulary name for the parent-spec
49
+ * pointer (prd `prd-to-spec-vocabulary-cutover-and-migration-command`). This is
50
+ * the EXPAND-step ADDITION beside {@link prd}: `parseFrontmatter` populates BOTH
51
+ * from EITHER the `spec:` OR the `prd:` key with the SAME value, so a caller
52
+ * reading either sees the parent-spec slug. The migrate batches move `fm.prd`
53
+ * reads onto `fm.spec` one at a time; the contract task removes `prd`.
54
+ */
55
+ spec: string | undefined;
56
+ /**
57
+ * Source spec slug (frontmatter `prd:`); the spec lives at
58
+ * `work/specs/ready/<prd>.md`. The LEGACY vocabulary name for the parent-spec
59
+ * pointer, kept BESIDE {@link spec} through the expand→migrate→contract cutover
60
+ * (prd `prd-to-spec-vocabulary-cutover-and-migration-command`) so every existing
61
+ * `fm.prd` reader keeps working; populated from EITHER the `spec:` or `prd:` key.
62
+ */
63
+ prd: string | undefined;
64
+ /**
65
+ * The GitHub issue number an `intake`-emitted artifact was transformed from
66
+ * (frontmatter `issue:`). Parsed so the `issue: N` intake writes is
67
+ * MACHINE-READABLE — the close JOB (`runner-in-ci`'s) reaches it to resolve the
68
+ * issue from folder + field state. Carried on EITHER:
69
+ *
70
+ * - a **prd** (`intake`'s prd outcome) — a fanned task reaches it via
71
+ * `task.prd: → work/prds/ready/<prd>.md → prd issue:` (the number lives
72
+ * ONLY on the prd, never duplicated across the N fanned tasks); OR
73
+ * - a **lone task** (`intake`'s TASK outcome, no `prd:`) — the provider-agnostic
74
+ * closure link for a task that closes its own issue directly (replaces the old
75
+ * GitHub-only `Fixes #N` body line, which is now a deferred optimisation).
76
+ *
77
+ * INVARIANT — one closure path per task: a task uses `issue:` XOR `prd:`, never
78
+ * both. Either it closes its own issue directly (`issue:`) or it contributes to a
79
+ * prd that closes the issue (`prd:` → prd `issue:`). This is NOT enforced by a
80
+ * throwing validator (there is no frontmatter-validation layer): intake never
81
+ * emits both — its task / prd dispatch branches are mutually exclusive — so only
82
+ * a human hand-edit could produce both, and the precedence rule (`prd:` wins,
83
+ * `issue:` ignored) is the future close-job's concern (see {@link
84
+ * resolveClosingIssue}), degrading a typo to "use the prd's number" rather than
85
+ * crashing. `undefined` when omitted (every non-intake prd and most tasks).
86
+ */
87
+ issue: number | undefined;
88
+ /**
89
+ * Autonomy gate axis 1 (DECIDED). `true` when the item declares itself
90
+ * human-only (a human must drive it regardless of how complete the spec is);
91
+ * `undefined` when omitted (undeclared — most items). Present on both tasks
92
+ * and prds.
93
+ */
94
+ humanOnly: boolean | undefined;
95
+ /**
96
+ * Autonomy gate axis 2 (DISCOVERED). `true` when the item has unresolved
97
+ * questions blocking autonomous progress (the open questions live in the body);
98
+ * `undefined` when omitted. Orthogonal to `humanOnly`; present on both tasks
99
+ * and prds.
100
+ */
101
+ needsAnswers: boolean | undefined;
102
+ /**
103
+ * The triage SETTLED marker (US #30). A non-empty `triaged:` value (e.g.
104
+ * `keep` / `duplicate`) means a human (or the conservative auto-disposition)
105
+ * has SETTLED this observation, so it DROPS OUT of the triage candidate pool
106
+ * and is never re-asked. `undefined` when omitted (an UNTRIAGED observation,
107
+ * still in the pool). Carried so the lifecycle-pool enumeration
108
+ * (`advance-autopick-lifecycle-pools`) can exclude settled observations from
109
+ * the triage selection.
110
+ */
111
+ triaged: string | undefined;
112
+ /** Slugs this item is blocked by; `[]` when omitted or empty. */
113
+ blockedBy: string[];
114
+ /**
115
+ * Prd-only: slugs of prds that must already be TASKED before this prd may be
116
+ * tasked (resolved against `work/prds/tasked/` residence, NOT `done/`). `[]` when
117
+ * omitted or empty. Parsed here so the auto-tasker can read it; enforcement
118
+ * lives in the `auto-slice` capability, not in eligibility.
119
+ */
120
+ taskedAfter: string[];
121
+ /**
122
+ * The per-item override layer for the `promptGuidance` NUDGE namespace
123
+ * (task `prompt-guidance-testfirst-item-override`, prd US #5). A task or
124
+ * prd may carry one or more `promptGuidance.<member>: true | false`
125
+ * frontmatter lines to OVERRIDE the resolved repo policy for THAT ITEM only.
126
+ * Each member is `undefined` when omitted (⇒ inherit the next layer down in
127
+ * the precedence chain: per-task > per-prd > repo-resolved). The override
128
+ * is honoured at the prompt-assembly seam (`prompt.ts`); it never affects
129
+ * the `verify` gate.
130
+ *
131
+ * Parsed from the DOTTED scalar form `promptGuidance.testFirst: true`
132
+ * (single-line, mirroring the flat shape `humanOnly`/`needsAnswers` use at the
133
+ * item level). A mistyped value (e.g. `"yes"`) reads as `undefined`, the same
134
+ * silent-on-malformed behaviour the existing `humanOnly` parsing has — no
135
+ * silent coerce to true/false.
136
+ */
137
+ promptGuidance: {testFirst: boolean | undefined};
138
+ }
139
+
140
+ /**
141
+ * Extract the raw frontmatter block (the lines between the leading `---` and the
142
+ * next `---`). Returns `undefined` when the document does not start with a
143
+ * frontmatter fence.
144
+ */
145
+ function extractBlock(content: string): string | undefined {
146
+ const normalized = content.replace(/\r\n/g, '\n').replace(/^\uFEFF/, '');
147
+ if (!normalized.startsWith('---\n') && normalized !== '---') {
148
+ return undefined;
149
+ }
150
+ const lines = normalized.split('\n');
151
+ // First line is the opening fence.
152
+ const closing = lines.indexOf('---', 1);
153
+ if (closing === -1) {
154
+ return undefined;
155
+ }
156
+ return lines.slice(1, closing).join('\n');
157
+ }
158
+
159
+ /** Strip surrounding single or double quotes from a scalar token. */
160
+ function unquote(value: string): string {
161
+ const trimmed = value.trim();
162
+ if (trimmed.length >= 2) {
163
+ const first = trimmed[0];
164
+ const last = trimmed[trimmed.length - 1];
165
+ if ((first === '"' || first === "'") && last === first) {
166
+ return trimmed.slice(1, -1);
167
+ }
168
+ }
169
+ return trimmed;
170
+ }
171
+
172
+ /**
173
+ * Extract the `[...]` body of a YAML flow-style inline list, IGNORING anything
174
+ * after the matching closing `]` (notably a trailing `# comment`, the documented
175
+ * house style on `blockedBy: [] # startable now`). Quote-aware: a `]` inside a
176
+ * single/double-quoted item is data, not the list terminator. Returns the inner
177
+ * text (between the brackets), or `undefined` if no matching `]` is found
178
+ * (malformed — caller treats it as empty).
179
+ */
180
+ function inlineListInner(value: string): string | undefined {
181
+ const trimmed = value.trim();
182
+ if (trimmed[0] !== '[') {
183
+ return undefined;
184
+ }
185
+ let quote: "'" | '"' | undefined;
186
+ for (let i = 1; i < trimmed.length; i++) {
187
+ const ch = trimmed[i];
188
+ if (quote) {
189
+ if (ch === quote) {
190
+ quote = undefined;
191
+ }
192
+ continue;
193
+ }
194
+ if (ch === "'" || ch === '"') {
195
+ quote = ch;
196
+ continue;
197
+ }
198
+ if (ch === ']') {
199
+ return trimmed.slice(1, i);
200
+ }
201
+ }
202
+ return undefined;
203
+ }
204
+
205
+ function parseInlineList(value: string): string[] {
206
+ const body = inlineListInner(value);
207
+ if (body === undefined) {
208
+ return [];
209
+ }
210
+ const inner = body.trim();
211
+ if (inner === '') {
212
+ return [];
213
+ }
214
+ return inner
215
+ .split(',')
216
+ .map((item) => unquote(item))
217
+ .filter((item) => item !== '');
218
+ }
219
+
220
+ function toBoolean(value: string): boolean | undefined {
221
+ const v = unquote(value).toLowerCase();
222
+ if (v === 'true') {
223
+ return true;
224
+ }
225
+ if (v === 'false') {
226
+ return false;
227
+ }
228
+ return undefined;
229
+ }
230
+
231
+ /**
232
+ * Set (or clear) the top-level `needsAnswers:` frontmatter marker on a `work/`
233
+ * markdown document, returning the new content. Used by the tasker review→edit
234
+ * LOOP's verdict sink (`slicer-review-edit-loop`) to emit a specific uncertain
235
+ * candidate task as `needsAnswers: true` (open questions block autonomous build;
236
+ * a human must answer them). If a `needsAnswers:` line already exists it is
237
+ * REPLACED (idempotent); otherwise it is appended as the last line inside the
238
+ * frontmatter fence. A document with NO frontmatter fence gets one PREPENDED (see
239
+ * {@link setFrontmatterMarker}) — observations are born fence-less (the
240
+ * `capture-signal` skill writes prose), so the tooling-owned `needsAnswers` axis
241
+ * MUST be settable on them rather than silently dropped.
242
+ */
243
+ export function setNeedsAnswersMarker(content: string, value: boolean): string {
244
+ return setFrontmatterMarker(content, 'needsAnswers', String(value));
245
+ }
246
+
247
+ /**
248
+ * Set (or replace) a top-level scalar `<key>: <value>` frontmatter marker on a
249
+ * `work/` markdown document, returning the new content. The generalised form of
250
+ * {@link setNeedsAnswersMarker} the advance APPLY rung uses to stamp a
251
+ * `triaged: keep` marker (US #30) on an item a human answered "keep" — so a
252
+ * settled observation drops out of the candidate pool and is never re-asked. If a
253
+ * `<key>:` line already exists it is REPLACED (idempotent); otherwise it is
254
+ * appended as the last line inside the frontmatter fence.
255
+ *
256
+ * A document with NO frontmatter fence gets ONE PREPENDED carrying just this
257
+ * marker (`---\n<key>: <value>\n---\n\n<body>`). This is the load-bearing fix for
258
+ * `sidecar-without-needsAnswers`: observations are routinely created fence-less
259
+ * (the `capture-signal` skill writes free-form prose), and the OLD behaviour
260
+ * silently returned the body UNCHANGED — so `persistSurfacedQuestions` wrote the
261
+ * sidecar while the `needsAnswers:true` flag it believed it set was discarded,
262
+ * tearing the `needsAnswers ⟺ active sidecar` invariant a later tick refused to
263
+ * classify. These markers (`needsAnswers`, `triaged`) are tooling-owned axes, not
264
+ * prose, so the tool is entitled to introduce the fence it needs.
265
+ *
266
+ * The ONE remaining return-unchanged case is a MALFORMED doc that opens a fence
267
+ * (`---\n`) but never closes it: rewriting that risks corrupting hand-authored
268
+ * content, so it is left untouched (a degenerate input no writer produces).
269
+ */
270
+ export function setFrontmatterMarker(
271
+ content: string,
272
+ key: string,
273
+ value: string,
274
+ ): string {
275
+ const normalized = content.replace(/\r\n/g, '\n');
276
+ if (!normalized.startsWith('---\n')) {
277
+ // Fence-less document: PREPEND a minimal fence carrying just this marker,
278
+ // preserving the body verbatim (no leading blank between fence and body is
279
+ // collapsed — exactly one blank line separates the fence from the content).
280
+ const body = normalized.replace(/^\n+/, '');
281
+ return `---\n${key}: ${value}\n---\n\n${body}`;
282
+ }
283
+ const lines = normalized.split('\n');
284
+ const closing = lines.indexOf('---', 1);
285
+ if (closing === -1) {
286
+ // Malformed: an opening fence with no close. Leave it untouched rather than
287
+ // risk corrupting hand-authored content.
288
+ return content;
289
+ }
290
+ const pattern = new RegExp(`^${key}\\s*:`);
291
+ for (let i = 1; i < closing; i++) {
292
+ if (pattern.test(lines[i])) {
293
+ lines[i] = `${key}: ${value}`;
294
+ return lines.join('\n');
295
+ }
296
+ }
297
+ lines.splice(closing, 0, `${key}: ${value}`);
298
+ return lines.join('\n');
299
+ }
300
+
301
+ /**
302
+ * PROPAGATE the origin-trust PROVENANCE (`origin` + `originTrust`) from a SOURCE
303
+ * artifact (a prd) onto a TARGET artifact's content (an emitted task), returning
304
+ * the new content (task `untrusted-origin-forces-build-propose`). The tasker
305
+ * calls this so a task born from an untrusted-origin prd carries the stamp the
306
+ * BUILD transition reads. IDEMPOTENT: each present source field is written via
307
+ * {@link setFrontmatterMarker} (replace-or-append). When the source has NO `origin`
308
+ * (a human/local-authored prd ⇒ trusted), the target is returned UNCHANGED — the
309
+ * normal path is never stamped (zero behaviour change). When a stamp IS applied to
310
+ * a fence-less target, {@link setFrontmatterMarker} now prepends a fence to carry
311
+ * it (tasks the tasker emits always have a fence, so this is the defensive path).
312
+ */
313
+ export function propagateOrigin(
314
+ source: Pick<Frontmatter, 'origin' | 'originTrust'>,
315
+ targetContent: string,
316
+ ): string {
317
+ if (source.origin === undefined && source.originTrust === undefined) {
318
+ return targetContent;
319
+ }
320
+ let next = targetContent;
321
+ if (source.origin !== undefined) {
322
+ next = setFrontmatterMarker(next, 'origin', source.origin);
323
+ }
324
+ if (source.originTrust !== undefined) {
325
+ next = setFrontmatterMarker(next, 'originTrust', source.originTrust);
326
+ }
327
+ return next;
328
+ }
329
+
330
+ export function parseFrontmatter(content: string): Frontmatter {
331
+ const block = extractBlock(content);
332
+ const result: Frontmatter = {
333
+ origin: undefined,
334
+ originTrust: undefined,
335
+ slug: undefined,
336
+ spec: undefined,
337
+ prd: undefined,
338
+ issue: undefined,
339
+ humanOnly: undefined,
340
+ needsAnswers: undefined,
341
+ triaged: undefined,
342
+ blockedBy: [],
343
+ taskedAfter: [],
344
+ promptGuidance: {testFirst: undefined},
345
+ };
346
+ if (block === undefined) {
347
+ return result;
348
+ }
349
+
350
+ const lines = block.split('\n');
351
+ for (let i = 0; i < lines.length; i++) {
352
+ const line = lines[i];
353
+ // Skip blank lines and comments and non top-level (indented) lines; block
354
+ // list items are consumed inline below.
355
+ if (line.trim() === '' || line.trimStart().startsWith('#')) {
356
+ continue;
357
+ }
358
+ // Top-level keys are alphanumeric / `_`; the dot is allowed so the per-item
359
+ // override for the `promptGuidance` namespace can be parsed in its DOTTED
360
+ // scalar form (e.g. `promptGuidance.testFirst: true`) without introducing a
361
+ // nested-mapping parser.
362
+ const match = /^([A-Za-z0-9_.]+)\s*:\s*(.*)$/.exec(line);
363
+ if (!match) {
364
+ continue;
365
+ }
366
+ const key = match[1];
367
+ const rawValue = match[2].trim();
368
+
369
+ if (key === 'origin') {
370
+ // Provenance: how the artifact was born. Only the known values map;
371
+ // anything else (or empty) reads as undefined (⇒ the human/trusted default).
372
+ const v = unquote(rawValue).toLowerCase();
373
+ result.origin = v === 'human' || v === 'issue' ? v : undefined;
374
+ } else if (key === 'originTrust') {
375
+ // The author-trust verdict at birth. Only the known values map; anything
376
+ // else (or empty) reads as undefined (⇒ trusted, the zero-change default).
377
+ const v = unquote(rawValue).toLowerCase();
378
+ result.originTrust = v === 'trusted' || v === 'untrusted' ? v : undefined;
379
+ } else if (key === 'slug') {
380
+ result.slug = rawValue === '' ? undefined : unquote(rawValue);
381
+ } else if (key === 'spec' || key === 'prd') {
382
+ // EXPAND step (prd `prd-to-spec-vocabulary-cutover-and-migration-command`):
383
+ // the parent-spec pointer is written under EITHER the new `spec:` key or the
384
+ // legacy `prd:` key. Populate BOTH `fm.spec` and `fm.prd` with the same value
385
+ // so a caller reading either field sees it. `spec:` wins if both are present
386
+ // (the canonical key takes precedence over the legacy alias); an empty value
387
+ // on one key does NOT clobber a non-empty value already read from the other.
388
+ const value = rawValue === '' ? undefined : unquote(rawValue);
389
+ if (key === 'spec') {
390
+ // The canonical key wins: overwrite whatever `prd:` may have set.
391
+ if (value !== undefined) {
392
+ result.spec = value;
393
+ result.prd = value;
394
+ }
395
+ } else if (result.spec === undefined) {
396
+ // Legacy `prd:` only fills in when `spec:` has not already set the pair.
397
+ result.spec = value;
398
+ result.prd = value;
399
+ }
400
+ } else if (key === 'issue') {
401
+ // Integer issue link (`intake`'s prd-emit OR a lone-task emit). A
402
+ // non-integer / empty value reads as undefined (the field is absent rather
403
+ // than malformed).
404
+ const n = Number(unquote(rawValue));
405
+ result.issue =
406
+ rawValue !== '' && Number.isInteger(n) && n > 0 ? n : undefined;
407
+ } else if (key === 'promptGuidance.testFirst') {
408
+ // Per-item override for the `promptGuidance.testFirst` nudge. An empty or
409
+ // malformed value reads as `undefined` (⇒ inherit the next layer), the
410
+ // same silent-on-malformed shape `humanOnly` uses — never a silent coerce.
411
+ result.promptGuidance.testFirst =
412
+ rawValue === '' ? undefined : toBoolean(rawValue);
413
+ } else if (key === 'humanOnly') {
414
+ result.humanOnly = rawValue === '' ? undefined : toBoolean(rawValue);
415
+ } else if (key === 'needsAnswers') {
416
+ result.needsAnswers = rawValue === '' ? undefined : toBoolean(rawValue);
417
+ } else if (key === 'triaged') {
418
+ // The SETTLED marker: a non-empty value (`keep`/`duplicate`) drops the
419
+ // observation out of the triage pool. An empty value reads as undefined
420
+ // (undeclared — still untriaged).
421
+ result.triaged = rawValue === '' ? undefined : unquote(rawValue);
422
+ } else if (key === 'blockedBy' || key === 'taskedAfter') {
423
+ let list: string[];
424
+ if (rawValue.startsWith('[')) {
425
+ list = parseInlineList(rawValue);
426
+ } else if (rawValue === '') {
427
+ // Block-style list: consume following indented `- item` lines.
428
+ const items: string[] = [];
429
+ let j = i + 1;
430
+ while (j < lines.length) {
431
+ const itemMatch = /^\s+-\s*(.+)$/.exec(lines[j]);
432
+ if (!itemMatch) {
433
+ break;
434
+ }
435
+ const item = unquote(itemMatch[1]);
436
+ if (item !== '') {
437
+ items.push(item);
438
+ }
439
+ j++;
440
+ }
441
+ list = items;
442
+ i = j - 1;
443
+ } else {
444
+ list = [];
445
+ }
446
+ if (key === 'blockedBy') {
447
+ result.blockedBy = list;
448
+ } else {
449
+ result.taskedAfter = list;
450
+ }
451
+ }
452
+ }
453
+
454
+ return result;
455
+ }
456
+
457
+ /**
458
+ * Resolve, from a parsed artifact's frontmatter, HOW it closes its source issue:
459
+ * the `prd:` hop or the lone-task `issue:` field. A PURE helper for the FUTURE
460
+ * CI close-job (`runner-in-ci`'s) — it is NOT wired into intake or any reader
461
+ * today; it merely pins the one-closure-path PRECEDENCE in one place.
462
+ *
463
+ * Encodes the invariant: a task uses `issue:` XOR `prd:`. When (only a human
464
+ * hand-edit could) BOTH are present, `prd:` WINS — the close-job hops to the prd's
465
+ * `issue:` and IGNORES the task's own `issue:` (the fanned-prd path is the
466
+ * authoritative one; a lone `issue:` on a `prd:`-bearing task is a contradiction
467
+ * that degrades to "use the prd" rather than crashing).
468
+ *
469
+ * Returns:
470
+ * - `{via: 'spec', spec}` when a `spec:` is present (hop to the spec's `issue:`; the
471
+ * caller resolves the spec file to read its number);
472
+ * - `{via: 'issue', issue}` when only a lone-task `issue:` is present;
473
+ * - `undefined` when neither is present (no closure path).
474
+ */
475
+ export function resolveClosingIssue(
476
+ frontmatter: Pick<Frontmatter, 'spec' | 'issue'>,
477
+ ): {via: 'spec'; spec: string} | {via: 'issue'; issue: number} | undefined {
478
+ if (frontmatter.spec !== undefined) {
479
+ return {via: 'spec', spec: frontmatter.spec};
480
+ }
481
+ if (frontmatter.issue !== undefined) {
482
+ return {via: 'issue', issue: frontmatter.issue};
483
+ }
484
+ return undefined;
485
+ }
@@ -0,0 +1,147 @@
1
+ import {existsSync} from 'node:fs';
2
+ import {join} from 'node:path';
3
+ import {run} from './git.js';
4
+ import {resolvePrepareCommands, type PrepareConfig} from './prepare.js';
5
+
6
+ /**
7
+ * Pre-claim / pre-build startup GUARD for the fresh-worktree acceptance gate
8
+ * (task `do-fails-fast-when-acceptance-gate-statically-unrunnable`).
9
+ *
10
+ * The fresh-worktree gate (`gate-on-rebased-tip-fresh-worktree`, ON by default)
11
+ * runs `prepare` then `verify` in a CLEAN throwaway worktree with NO
12
+ * `node_modules`. If `prepare` resolves to no commands AND the repo has a
13
+ * lockfile (evidence that an install IS required), the gate will provably fail
14
+ * with "command not found" — a STATICALLY-detectable misconfiguration we can
15
+ * surface at second zero, BEFORE wasting a claim + agent build + a routed
16
+ * needs-attention.
17
+ *
18
+ * Critical non-regression: `prepare` resolving to no commands is a DELIBERATE
19
+ * no-op (`prepare.ts`: "a repo with no deps needs none; we never invent a
20
+ * default that would run `pnpm install` in a repo that has no lockfile"). So
21
+ * the guard KEYS off LOCKFILE-PRESENT evidence — never off `prepare`-unset
22
+ * alone — and a genuinely dep-free repo (no lockfile) PROCEEDS unchanged.
23
+ *
24
+ * There is NO "verify unset" case: {@link resolveVerifyCommands} substitutes
25
+ * `DEFAULT_VERIFY_COMMAND` when `verify` is unset OR all-blank, so `verify` is
26
+ * NEVER statically unrunnable-because-unset. A "verify unset → STOP" guard
27
+ * would be dead code (or fire wrongly on the default). The guard is deps-only.
28
+ *
29
+ * The guard is also gated on `freshWorktreeGate === true` for THIS invocation:
30
+ * when the gate is OFF (`--no-fresh-worktree-gate`) the acceptance gate runs in
31
+ * the agent's BUILD worktree (which HAS deps), so the throwaway-worktree
32
+ * reasoning does not apply.
33
+ */
34
+
35
+ /**
36
+ * The lockfile basenames whose presence implies an install is required. Order
37
+ * is the search order (first match wins — its basename is the one named in the
38
+ * guard message).
39
+ */
40
+ export const LOCKFILE_BASENAMES = [
41
+ 'pnpm-lock.yaml',
42
+ 'package-lock.json',
43
+ 'yarn.lock',
44
+ ] as const;
45
+
46
+ /**
47
+ * Probe `cwd` for one of {@link LOCKFILE_BASENAMES} on disk and return the
48
+ * first match (or `undefined`). The standard probe for the in-place / job-
49
+ * worktree paths where the repo is materialised on disk.
50
+ */
51
+ export function detectLockfileOnDisk(cwd: string): string | undefined {
52
+ return LOCKFILE_BASENAMES.find((name) => existsSync(join(cwd, name)));
53
+ }
54
+
55
+ /**
56
+ * Probe a BARE mirror's `main` ref via `git ls-tree` for one of
57
+ * {@link LOCKFILE_BASENAMES} and return the first match (or `undefined`). Used
58
+ * by the no-checkout `do --remote` path, which has no working tree until AFTER
59
+ * the claim; this lets the guard fire BEFORE the claim. Best-effort: a missing
60
+ * `main` ref or a failing `git ls-tree` returns `undefined` (the guard then
61
+ * stays quiet and any genuine plumbing error surfaces later as a usage error).
62
+ */
63
+ export function detectLockfileOnMirrorMain(
64
+ mirrorPath: string,
65
+ env?: NodeJS.ProcessEnv,
66
+ ): string | undefined {
67
+ const res = run(
68
+ 'git',
69
+ ['ls-tree', '--name-only', 'main', ...LOCKFILE_BASENAMES],
70
+ mirrorPath,
71
+ {env},
72
+ );
73
+ if (res.status !== 0) {
74
+ return undefined;
75
+ }
76
+ const present = new Set(
77
+ res.stdout
78
+ .split('\n')
79
+ .map((line) => line.trim())
80
+ .filter((line) => line !== ''),
81
+ );
82
+ return LOCKFILE_BASENAMES.find((name) => present.has(name));
83
+ }
84
+
85
+ export interface GatePreconditionInput {
86
+ /**
87
+ * The resolved fresh-worktree-gate flag for THIS invocation
88
+ * (flag > env > per-repo > global > default `true`). The guard ONLY fires when
89
+ * this is exactly `true` — `false`/`undefined` ⇒ the throwaway-worktree
90
+ * reasoning does not apply and the guard returns `undefined`.
91
+ */
92
+ freshWorktreeGate: boolean | undefined;
93
+ /** The resolved `prepare` config (unset / string / list). */
94
+ prepare?: PrepareConfig;
95
+ /**
96
+ * The lockfile basename probed for this repo (one of
97
+ * {@link LOCKFILE_BASENAMES}), or `undefined` for the intentional dep-free
98
+ * case. The caller picks the probe ({@link detectLockfileOnDisk} for the
99
+ * in-place / job-worktree paths, {@link detectLockfileOnMirrorMain} for the
100
+ * no-checkout `do --remote` path).
101
+ */
102
+ lockfile: string | undefined;
103
+ }
104
+
105
+ export interface GatePreconditionFailure {
106
+ /** The lockfile basename (from {@link LOCKFILE_BASENAMES}) that tripped the guard. */
107
+ lockfile: string;
108
+ /** A precise, actionable error message naming the lockfile and the two ways out. */
109
+ message: string;
110
+ }
111
+
112
+ /**
113
+ * Check the fresh-worktree-gate startup preconditions. Returns the failure
114
+ * (with a precise message) when the gate is STATICALLY unrunnable for the
115
+ * deps-only reason; returns `undefined` otherwise (proceed normally).
116
+ *
117
+ * NOTE — deps-only, not verify-presence: see the file-level doc.
118
+ */
119
+ export function checkGatePreconditions(
120
+ input: GatePreconditionInput,
121
+ ): GatePreconditionFailure | undefined {
122
+ // Gate OFF for THIS invocation ⇒ no throwaway worktree ⇒ the deps reasoning
123
+ // does not apply. (The default is ON; the guard fires when ON.)
124
+ if (input.freshWorktreeGate !== true) {
125
+ return undefined;
126
+ }
127
+ // `prepare` resolves to at least one command ⇒ the throwaway worktree will
128
+ // install (or codegen, etc.); not statically unrunnable. Covers BOTH `prepare`
129
+ // unset AND an all-blank list returning `[]` via the SAME `resolvePrepareCommands`.
130
+ if (resolvePrepareCommands(input.prepare).length > 0) {
131
+ return undefined;
132
+ }
133
+ // No lockfile ⇒ the intentional dep-free repo (the design point preserved):
134
+ // `prepare` unset is a DELIBERATE no-op and `verify` runs against a repo that
135
+ // needs no install — proceed.
136
+ if (input.lockfile === undefined) {
137
+ return undefined;
138
+ }
139
+ return {
140
+ lockfile: input.lockfile,
141
+ message:
142
+ 'the fresh-worktree gate is on but no `prepare` step is configured, ' +
143
+ `and a lockfile (${input.lockfile}) is present — the throwaway worktree ` +
144
+ 'will have no installed deps, so the gate cannot run. Add a `prepare` ' +
145
+ '(e.g. `pnpm install --frozen-lockfile`) or pass --no-fresh-worktree-gate.',
146
+ };
147
+ }