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,518 @@
1
+ import {existsSync, readFileSync} from 'node:fs';
2
+ import {join} from 'node:path';
3
+ import {run, type RunResult} from './git.js';
4
+ import {applyAtomic, type ApplyAtomicResult} from './sidecar-apply.js';
5
+ import {
6
+ allAnswered,
7
+ appendQuestions,
8
+ parseSidecar,
9
+ sidecarPathFor,
10
+ type NewQuestion,
11
+ type SidecarEntry,
12
+ type SidecarModel,
13
+ } from './sidecar.js';
14
+ import {
15
+ APPLY_LIFECYCLE_FOLDERS,
16
+ resolveItemPathByIdentity,
17
+ } from './item-path.js';
18
+
19
+ /**
20
+ * The engine-owned APPLY PERSIST (prd `advance-loop`, task `advance-rung-apply`;
21
+ * AGENTIC apply, task `agentic-apply-retire-disposition-vocabulary`) — the half of
22
+ * the APPLY rung the ENGINE owns. On `classify=apply` (ALL sidecar entries
23
+ * answered), it applies the HUMAN's answers to the item ATOMICALLY (item body +
24
+ * sidecar in ONE commit, via the sidecar contract's {@link applyAtomic}), then
25
+ * EITHER:
26
+ *
27
+ * - **append / re-pause** — when the apply has NEW questions to ask: append
28
+ * `qN+1…`, stay `needsAnswers:true`, re-pause (the "all answered?" flips back
29
+ * to false); OR
30
+ * - **discharge by deletion** — when the caller decided the SOURCE should leave
31
+ * by deletion (`discharge` set): `git rm` the source + sidecar in a STANDALONE
32
+ * revertible commit, the reason in the commit message (git history is the
33
+ * archive); OR
34
+ * - **resolve fully** (the default) — clear `needsAnswers` + DELETE the sidecar
35
+ * in the SAME atomic commit (the invariant `needsAnswers:false ⟺ no active
36
+ * sidecar`); the item advances toward build by its normal lifecycle.
37
+ *
38
+ * **The disposition vocabulary is GONE** (task
39
+ * `agentic-apply-retire-disposition-vocabulary`): the apply rung no longer reads a
40
+ * per-entry `disposition=` token, no longer runs a most-decisive picker, and has
41
+ * no `keep`/`triaged:keep` resting state. A sidecar entry is BINARY (no-answer |
42
+ * answered); what to DO with a fully-answered OBSERVATION is decided by the
43
+ * AGENTIC apply decision in the advance tick (`advance.ts` `applyRung` over the
44
+ * shared `decide` engine), which then routes here (re-pause / discharge / via
45
+ * `promoteObservation` for a mint). A signal is still-open, acted-on, or deleted
46
+ * — there is no \"retain as resolved\" state.
47
+ *
48
+ * The work-item (task/prd) terminal MOVES (`tasks/cancelled`, `prds/dropped`) and
49
+ * the `needs-attention/` LIFECYCLE state are a SEPARATE lifecycle concern (a
50
+ * task/prd is dropped by its own lifecycle, not by a question answer) — they are
51
+ * NOT routed from here any more (they were the removed disposition vocabulary).
52
+ *
53
+ * It is the SIBLING of {@link import('./surface-persist.js').persistSurfacedQuestions}:
54
+ * that is the SURFACE rung's one-commit primitive (append-or-create + set
55
+ * `needsAnswers`); this is the APPLY rung's (apply answers + resolve / re-pause /
56
+ * discharge). Kept file-orthogonal so the rung bodies land in different tasks.
57
+ *
58
+ * **NEVER invents an answer (US #4).** The apply rung applies ONLY what the human
59
+ * authored — the recorded `answer:` text. It does NOT fill, guess, or author an
60
+ * answer; a SUBSET-answered sidecar is not even classified `apply` (the classifier
61
+ * NO-OPs), so this is only ever called with a fully-answered sidecar. **ALWAYS
62
+ * allowed (no gate)** — applying a human's answer is never gated, even with every
63
+ * autonomy flag off (the engine, not this module, enforces the no-gate
64
+ * sequencing).
65
+ *
66
+ * Like the surface persist, this is the LOCAL one-commit primitive over a working
67
+ * tree (the throwaway-git-repo test pattern). The `advancing` CAS lock that makes
68
+ * it WINNER-ONLY is held by `performAdvance` BEFORE this is called; this module
69
+ * does NOT race the arbiter — that is the lock's job.
70
+ */
71
+
72
+ // Re-export the extracted neutral resolver so existing importers of
73
+ // `apply-persist.ts` keep working (the resolver now LIVES in `item-path.ts`, a
74
+ // non-hot module the sibling CLI / gc-sweep tasks import without touching this
75
+ // rewritten file).
76
+ export {APPLY_LIFECYCLE_FOLDERS, resolveItemPathByIdentity};
77
+
78
+ /** Marker that opens the applied-answers record in an item body. */
79
+ const APPLIED_HEADING = '## Applied answers';
80
+
81
+ /**
82
+ * The STRUCTURAL fence the templates wrap the transient open-questions block in
83
+ * — an HTML-comment marker pair, mirroring the existing `<!-- dorfl-…
84
+ * -->` style in `sidecar.ts`. Apply's reconcile (full-resolution route only)
85
+ * strips everything between the OPEN and CLOSE markers (inclusive) when it folds
86
+ * answers in and clears `needsAnswers`, so the resolved item body reads as
87
+ * resolved (no leftover "these are still open" prose above `## Applied answers`).
88
+ *
89
+ * The strip is STRUCTURAL (marker-pair based), NOT a heading-text regex — the
90
+ * prd's D1 decision: a `## Open questions` heading match would be fragile to
91
+ * author wording (`## Open questions (clear needsAnswers when resolved)` vs.
92
+ * `## Open questions`). Items authored WITHOUT the markers are left untouched
93
+ * (backward compat — no marker ⇒ nothing to strip ⇒ identical bytes).
94
+ *
95
+ * The sibling task `templates-mark-transient-open-questions-block` introduces
96
+ * the markers in the prd/task templates; this task exports the constants so
97
+ * the two tasks agree on the literal byte sequence.
98
+ */
99
+ export const OPEN_QUESTIONS_MARKER_OPEN = '<!-- open-questions -->';
100
+ export const OPEN_QUESTIONS_MARKER_CLOSE = '<!-- /open-questions -->';
101
+
102
+ export interface ApplyAnsweredQuestionsOptions {
103
+ /** Working clone/worktree the apply commits in. */
104
+ cwd: string;
105
+ /** The namespaced item identity (`task:foo` / `prd:bar` / `observation:baz`). */
106
+ item: string;
107
+ /**
108
+ * The item file path RELATIVE to `cwd` (e.g. `work/backlog/foo.md`). The
109
+ * sidecar path is derived from the identity, NOT from this path (identity-keyed,
110
+ * folder-agnostic). The apply rewrites THIS file + the sidecar and commits them
111
+ * together.
112
+ */
113
+ itemPath: string;
114
+ /**
115
+ * NEW follow-up questions the apply has (the agentic `ask-follow-up` verdict, or
116
+ * a caller-supplied batch). When non-empty, the apply APPENDS them (`qN+1…`,
117
+ * never mutating an answered entry) and RE-PAUSES (`needsAnswers:true` stays) —
118
+ * the "all answered?" flips back to false. Empty/omitted ⇒ resolve the item (or
119
+ * discharge it, when `discharge` is set).
120
+ */
121
+ appendQuestions?: NewQuestion[];
122
+ /**
123
+ * DISCHARGE the SOURCE by DELETION (the agentic `delete-source` verdict, or a
124
+ * direct discharge): instead of resolving in place, `git rm` the source + its
125
+ * answered sidecar in a STANDALONE revertible commit, the `reason` recorded in
126
+ * the commit message (git history is the archive). Fires DIRECT (no
127
+ * preview/confirm — decision 12). Mutually exclusive with `appendQuestions`
128
+ * (re-pause and discharge cannot both happen on one apply); when both are given
129
+ * the re-pause wins (you cannot discharge a source you are still asking about).
130
+ */
131
+ discharge?: {reason: string};
132
+ /** Advisory committer id for the commit subject. Defaults to git user.name. */
133
+ by?: string;
134
+ /** Environment for child git processes. */
135
+ env?: NodeJS.ProcessEnv;
136
+ /** Sink for human-readable progress notes. */
137
+ note?: (message: string) => void;
138
+ }
139
+
140
+ /** The terminal an apply reached. */
141
+ export type ApplyTerminal =
142
+ /** Resolved fully: needsAnswers cleared + sidecar deleted (the default). */
143
+ | 'resolved'
144
+ /** New questions appended; stayed needsAnswers:true and re-paused. */
145
+ | 'repaused'
146
+ /**
147
+ * The SOURCE was DISCHARGED BY DELETION (the agentic `delete-source` verdict, or
148
+ * a direct discharge): the source (+ its answered sidecar) were `git rm`-ed in a
149
+ * STANDALONE revertible commit, the reason recorded in the commit message (git
150
+ * history = archive). A discharged item leaves by being GONE — there is no
151
+ * resting marker. This is the apply rung applying the human's RATIFIED answer
152
+ * (human-authored, not a unilateral agent destruction of a live signal).
153
+ */
154
+ | 'deleted'
155
+ /**
156
+ * The item file was GONE by the time apply tried to write (a concurrent
157
+ * promote/terminal-move/delete between capture and write). Apply exited
158
+ * CLEAN: no commit, no ghost file at the stale path. The matching benign
159
+ * skip the surface/triage rungs already use (`advance.ts` `vanishedSkip`),
160
+ * extended into the apply rung by the F3a folder-agnostic resolver.
161
+ */
162
+ | 'vanished';
163
+
164
+ export interface ApplyAnsweredQuestionsResult {
165
+ /** The terminal the apply reached. */
166
+ outcome: ApplyTerminal;
167
+ /** The commit sha the apply produced. */
168
+ commit?: string;
169
+ /** The sidecar path (relative to `cwd`) the apply touched. */
170
+ sidecarPath: string;
171
+ /** The item path (relative to `cwd`) after the apply. */
172
+ itemPath: string;
173
+ /** A human-readable summary. */
174
+ message: string;
175
+ }
176
+
177
+ /** Raised for usage errors (a missing repo, an unreadable item, a subset apply). */
178
+ export class ApplyPersistError extends Error {
179
+ constructor(message: string) {
180
+ super(message);
181
+ this.name = 'ApplyPersistError';
182
+ }
183
+ }
184
+
185
+ function gitSoft(
186
+ args: string[],
187
+ cwd: string,
188
+ env: NodeJS.ProcessEnv | undefined,
189
+ ): RunResult {
190
+ return run('git', args, cwd, {env});
191
+ }
192
+
193
+ function gitHard(
194
+ args: string[],
195
+ cwd: string,
196
+ env: NodeJS.ProcessEnv | undefined,
197
+ ): RunResult {
198
+ const result = run('git', args, cwd, {env});
199
+ if (result.status !== 0) {
200
+ throw new ApplyPersistError(
201
+ `git ${args.join(' ')} failed (exit ${result.status}): ${result.stderr.trim()}`,
202
+ );
203
+ }
204
+ return result;
205
+ }
206
+
207
+ function resolveBy(cwd: string, env: NodeJS.ProcessEnv | undefined): string {
208
+ const name = gitSoft(['config', 'user.name'], cwd, env);
209
+ if (name.status === 0 && name.stdout.trim() !== '') {
210
+ return name.stdout.trim();
211
+ }
212
+ const e = env ?? process.env;
213
+ return e.USER ?? e.USERNAME ?? '';
214
+ }
215
+
216
+ /** Read the item body from the tree (committed) then the working-tree file. */
217
+ function readItem(
218
+ itemAbs: string,
219
+ cwd: string,
220
+ itemPath: string,
221
+ env: NodeJS.ProcessEnv | undefined,
222
+ ): string {
223
+ const show = gitSoft(['show', `:${itemPath}`], cwd, env);
224
+ if (show.status === 0) {
225
+ return show.stdout;
226
+ }
227
+ try {
228
+ return readFileSync(itemAbs, 'utf8');
229
+ } catch {
230
+ throw new ApplyPersistError(
231
+ `cannot read item body for '${itemPath}' (the apply rung needs the item file)`,
232
+ );
233
+ }
234
+ }
235
+
236
+ /** Read + parse the existing sidecar (from the working file). */
237
+ function readSidecar(
238
+ cwd: string,
239
+ item: string,
240
+ ): {model: SidecarModel; path: string} {
241
+ const path = sidecarPathFor(item);
242
+ const abs = join(cwd, path);
243
+ if (!existsSync(abs)) {
244
+ throw new ApplyPersistError(
245
+ `no sidecar at ${path} for ${item} — the apply rung needs an answered sidecar`,
246
+ );
247
+ }
248
+ return {model: parseSidecar(readFileSync(abs, 'utf8')), path};
249
+ }
250
+
251
+ /**
252
+ * Render the applied-answers record appended to the item body. PURELY the human's
253
+ * recorded answers (verbatim) under a dated heading — NEVER an invented or
254
+ * paraphrased answer. Append-only (a prior record stays); the body is the durable
255
+ * home of what the human decided.
256
+ */
257
+ function appliedAnswersBlock(entries: SidecarEntry[]): string {
258
+ const date = new Date().toISOString().slice(0, 10);
259
+ const lines: string[] = ['', `${APPLIED_HEADING} ${date}`, ''];
260
+ for (const entry of entries) {
261
+ lines.push(`### ${entry.id}: ${entry.question.trim()}`);
262
+ lines.push('');
263
+ lines.push(entry.answer.trim());
264
+ lines.push('');
265
+ }
266
+ return lines.join('\n');
267
+ }
268
+
269
+ /** Append the applied-answers record to an item body (append-only). */
270
+ function withAppliedAnswers(body: string, entries: SidecarEntry[]): string {
271
+ const base = body.replace(/\s*$/, '');
272
+ return `${base}\n${appliedAnswersBlock(entries)}`;
273
+ }
274
+
275
+ /**
276
+ * Strip ALL marker-fenced open-questions blocks from an item body — the FULL
277
+ * RESOLUTION reconcile step (prd `apply-reconciles-stale-open-questions`,
278
+ * decisions D1 / D3). Removes each `<!-- open-questions -->` … `<!--
279
+ * /open-questions -->` pair (markers included) plus the blank lines that
280
+ * flanked it, so the answers in `## Applied answers` no longer sit beneath a
281
+ * stale "these are still open" section.
282
+ *
283
+ * Behavioural choices (recorded in the done note):
284
+ * - strips EVERY well-formed marker pair, not just the first (an authoring
285
+ * template may legitimately fence more than one transient block — e.g.
286
+ * open-questions plus an autonomy-note — and partial strips would re-create
287
+ * the same drift the reconcile exists to prevent);
288
+ * - FAIL-SAFE on a malformed fence (a lone opener with no matching closer):
289
+ * the regex simply doesn't match, the body is returned unchanged. A
290
+ * fail-loud throw would block the apply commit on a template authoring bug;
291
+ * leaving the body intact preserves the answer-application invariant and
292
+ * surfaces the stale block to a human reviewer instead;
293
+ * - collapses runs of 3+ newlines down to 2 after a strip, so removing a
294
+ * block doesn't leave a triple-blank gap between the surrounding paragraphs.
295
+ *
296
+ * Called ONLY from the full-resolution path. The re-pause path (follow-up
297
+ * questions appended, `needsAnswers` stays true) NEVER calls this — the
298
+ * open-questions block is still legitimately open there (D3).
299
+ */
300
+ function stripOpenQuestionsBlocks(body: string): string {
301
+ const escOpen = OPEN_QUESTIONS_MARKER_OPEN.replace(
302
+ /[.*+?^${}()|[\]\\]/g,
303
+ '\\$&',
304
+ );
305
+ const escClose = OPEN_QUESTIONS_MARKER_CLOSE.replace(
306
+ /[.*+?^${}()|[\]\\]/g,
307
+ '\\$&',
308
+ );
309
+ const re = new RegExp(
310
+ `\\n*[ \\t]*${escOpen}[\\s\\S]*?${escClose}[ \\t]*\\n*`,
311
+ 'g',
312
+ );
313
+ if (!re.test(body)) return body;
314
+ return body.replace(re, '\n\n').replace(/\n{3,}/g, '\n\n');
315
+ }
316
+
317
+ /**
318
+ * Apply a FULLY-ANSWERED sidecar's answers to its item ATOMICALLY, then route it.
319
+ * The keystone APPLY rung the advance engine dispatches into once the classifier
320
+ * said `apply` (all entries answered) AND the `advancing` lock was won.
321
+ *
322
+ * The decision (the human's recorded intent + the caller's routing — NEVER an
323
+ * invention):
324
+ *
325
+ * 1. **append / re-pause** — `appendQuestions` is non-empty: append `qN+1…`,
326
+ * keep `needsAnswers:true`, re-pause (one commit, body + sidecar).
327
+ * 2. **discharge by deletion** — `discharge` is set (the `delete-source`
328
+ * verdict): `git rm` the source + sidecar in a standalone revertible commit,
329
+ * the reason in the commit message.
330
+ * 3. **resolve fully** (the default) — clear `needsAnswers` + delete the sidecar
331
+ * in ONE commit; the item advances toward build by its normal lifecycle.
332
+ */
333
+ export function applyAnsweredQuestions(
334
+ options: ApplyAnsweredQuestionsOptions,
335
+ ): ApplyAnsweredQuestionsResult {
336
+ const {cwd, item, itemPath: capturedItemPath, env} = options;
337
+ const note = options.note ?? (() => {});
338
+
339
+ if (gitSoft(['rev-parse', '--git-dir'], cwd, env).status !== 0) {
340
+ throw new ApplyPersistError('not inside a git repository');
341
+ }
342
+
343
+ const {model, path: sidecarPath} = readSidecar(cwd, item);
344
+
345
+ // FOLDER-AGNOSTIC at WRITE-TIME (F3a, prd
346
+ // `staging-surface-and-apply-promote-safety`): re-resolve the item's CURRENT
347
+ // path by IDENTITY, mirroring the sidecar's already-folder-agnostic
348
+ // resolution. The captured `itemPath` is ADVISORY — a concurrent `promote`
349
+ // (`tasks/backlog → tasks/ready`, `prds/proposed → prds/ready`) may have
350
+ // moved the item between capture and now, and we MUST write the post-move
351
+ // path, never the stale one. If the item has vanished entirely, exit CLEAN
352
+ // (no commit, no ghost file) — the matching benign skip the surface/triage
353
+ // rungs already use.
354
+ const resolvedItemPath = resolveItemPathByIdentity(cwd, item);
355
+ if (resolvedItemPath === undefined) {
356
+ const message =
357
+ `apply ${item}: item file is gone (captured '${capturedItemPath}' is ` +
358
+ `stale and no current path resolves by identity) — exiting clean (no ` +
359
+ `commit), the apply rung does not recreate a vanished item.`;
360
+ note(message);
361
+ return {
362
+ outcome: 'vanished',
363
+ sidecarPath,
364
+ itemPath: capturedItemPath,
365
+ message,
366
+ };
367
+ }
368
+ const itemPath = resolvedItemPath;
369
+
370
+ // NEVER invent an answer: the apply only ever runs on a FULLY-answered sidecar
371
+ // (the classifier NO-OPs a subset). Assert the boundary so a mis-call is loud,
372
+ // not a silent invention of an answer for an unanswered entry.
373
+ if (!allAnswered(model)) {
374
+ throw new ApplyPersistError(
375
+ `refusing to apply ${item}: the sidecar has unanswered entries — a subset ` +
376
+ 'is a classifier NO-OP, never an apply (the rung NEVER invents an answer)',
377
+ );
378
+ }
379
+
380
+ const itemAbs = join(cwd, itemPath);
381
+ const baseBody = readItem(itemAbs, cwd, itemPath, env);
382
+ const by = options.by || resolveBy(cwd, env);
383
+
384
+ // (1) APPEND / RE-PAUSE: the apply has new questions. Append them (`qN+1…`,
385
+ // never mutating an answered entry), stay needsAnswers:true, re-pause. Re-pause
386
+ // WINS over a discharge — you cannot discharge a source you are still asking
387
+ // about.
388
+ const followups = options.appendQuestions ?? [];
389
+ if (followups.length > 0) {
390
+ const repaused = appendQuestions(model, followups);
391
+ const result: ApplyAtomicResult = applyAtomic({
392
+ cwd,
393
+ itemPath,
394
+ itemBody: withAppliedAnswers(baseBody, model.entries),
395
+ sidecar: repaused,
396
+ mode: 'repause',
397
+ by,
398
+ env,
399
+ note,
400
+ });
401
+ const message = `applied ${item} + appended ${followups.length} new question(s) → re-paused (needsAnswers:true).`;
402
+ note(message);
403
+ return {
404
+ outcome: 'repaused',
405
+ commit: result.commit,
406
+ sidecarPath,
407
+ itemPath,
408
+ message,
409
+ };
410
+ }
411
+
412
+ // (2) DISCHARGE BY DELETION: the caller decided the source should leave by
413
+ // deletion (the `delete-source` verdict). `git rm` the source + sidecar in a
414
+ // STANDALONE revertible commit, the reason in the commit message (git history =
415
+ // archive). DIRECT — no preview/confirm (decision 12); the human's answer is
416
+ // the source of truth.
417
+ if (options.discharge !== undefined) {
418
+ return dischargeByDeletion({
419
+ cwd,
420
+ item,
421
+ itemPath,
422
+ reason: options.discharge.reason,
423
+ sidecarPath,
424
+ by,
425
+ env,
426
+ note,
427
+ });
428
+ }
429
+
430
+ // (3) RESOLVE FULLY (the default): clear needsAnswers + delete the sidecar in
431
+ // ONE commit. Full-resolution reconcile (D1): strip the now-stale marker-fenced
432
+ // open-questions block(s) so the resolved body reads as resolved. Backward
433
+ // compatible — no marker ⇒ identical bytes. The re-pause path above is
434
+ // deliberately untouched (D3): its open-questions block is still open.
435
+ const reconciledBody = stripOpenQuestionsBlocks(baseBody);
436
+ const resolvedBody = withAppliedAnswers(reconciledBody, model.entries);
437
+ const result = applyAtomic({
438
+ cwd,
439
+ itemPath,
440
+ itemBody: resolvedBody,
441
+ sidecar: model,
442
+ mode: 'resolve',
443
+ by,
444
+ env,
445
+ note,
446
+ });
447
+ const message = `applied ${item} → resolved (needsAnswers cleared, sidecar deleted).`;
448
+ note(message);
449
+ return {
450
+ outcome: 'resolved',
451
+ commit: result.commit,
452
+ sidecarPath,
453
+ itemPath,
454
+ message,
455
+ };
456
+ }
457
+
458
+ interface DischargeInput {
459
+ cwd: string;
460
+ item: string;
461
+ itemPath: string;
462
+ /** The human's discharge reason (their answer text), recorded in the commit message. */
463
+ reason: string;
464
+ sidecarPath: string;
465
+ by: string;
466
+ env: NodeJS.ProcessEnv | undefined;
467
+ note: (m: string) => void;
468
+ }
469
+
470
+ /**
471
+ * DISCHARGE a source by DELETION (the `delete-source` verdict, US #5/#11): `git
472
+ * rm` the source AND its answered sidecar in ONE STANDALONE commit, the human's
473
+ * discharge reason recorded in the commit MESSAGE (git history is the archive).
474
+ * There is no spawned artifact for a discharge, so the deletion is a standalone
475
+ * commit (a `mint`, by contrast, rides the new artifact's create commit through
476
+ * `promoteObservation`).
477
+ *
478
+ * A discharged item leaves by being GONE — no resting body marker, no `triaged:`
479
+ * stamp (the resting-state machinery is retired; an item is still-open, acted-on,
480
+ * or deleted). This is the apply rung applying the human's RATIFIED answer (the
481
+ * deletion is human-authored), and it is git-recoverable (a single revertible
482
+ * commit) — a wrong inference is never catastrophic.
483
+ */
484
+ function dischargeByDeletion(
485
+ input: DischargeInput,
486
+ ): ApplyAnsweredQuestionsResult {
487
+ const {cwd, item, itemPath, reason, sidecarPath, by, env, note} = input;
488
+ // `git rm` the source. The sidecar may not exist in every path; rm it too when
489
+ // present, so the discharge leaves no answered-sidecar residue. Both ride ONE
490
+ // commit.
491
+ const rmPaths = [itemPath];
492
+ if (existsSync(join(cwd, sidecarPath))) {
493
+ rmPaths.push(sidecarPath);
494
+ }
495
+ gitHard(['rm', '--quiet', '--', ...rmPaths], cwd, env);
496
+ const reasonLine = reason.trim() === '' ? '(no reason given)' : reason.trim();
497
+ const subject = `advance: ${item} → deleted (by ${by})`;
498
+ const messageBody =
499
+ `Discharged by deletion (the human's ratified answer authors it; ` +
500
+ `git history is the archive).\n\nreason: ${reasonLine}`;
501
+ gitHard(['commit', '--quiet', '-m', subject, '-m', messageBody], cwd, env);
502
+ const commit = gitHard(['rev-parse', 'HEAD'], cwd, env).stdout.trim();
503
+ const message =
504
+ `applied ${item} → deleted (source git rm-ed in a standalone commit; reason ` +
505
+ 'in the commit message, git history is the archive).';
506
+ note(message);
507
+ return {
508
+ outcome: 'deleted',
509
+ commit,
510
+ sidecarPath,
511
+ itemPath,
512
+ message,
513
+ };
514
+ }
515
+
516
+ // Re-export the heading constant the tests assert against, so the byte-level
517
+ // marker stays in one place.
518
+ export {APPLIED_HEADING};