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,75 @@
1
+ import {existsSync} from 'node:fs';
2
+ import {join} from 'node:path';
3
+ import {workItemRel} from './work-layout.js';
4
+ import {resolveSidecarIdentity, type SidecarType} from './sidecar.js';
5
+ import type {WorkFolderKey} from './work-layout.js';
6
+
7
+ /**
8
+ * The NEUTRAL identity-keyed item-path resolver (task
9
+ * `agentic-apply-retire-disposition-vocabulary`) — extracted OUT of the hot
10
+ * `apply-persist.ts` so it is a STABLE, OWNED seam re-exported from the package
11
+ * index. The apply rung imports it from here; the sibling CLI verb
12
+ * (`direct-delete-question-cli-helper`) and the orphan-sidecar gc sweep
13
+ * (`orphan-sidecar-gc-sweep`) reuse the SAME resolver WITHOUT importing the
14
+ * rewritten hot file (the file-orthogonality fix: keeping it in `apply-persist.ts`
15
+ * would force those tasks into a stale-read coupling on a file this task rewrites).
16
+ *
17
+ * It is the symmetric twin of `sidecarPathFor`: where the sidecar path is derived
18
+ * from `(type, slug)`, the item path is RESOLVED by scanning the lifecycle folders
19
+ * the type may rest in (the identity is the source of truth; the folder is not).
20
+ */
21
+
22
+ /**
23
+ * The lifecycle folders an item may rest in at APPLY-write-time, BY TYPE — the
24
+ * scan set for {@link resolveItemPathByIdentity}. Includes the STAGING folders
25
+ * (`tasks-backlog`, `prds-proposed`) on purpose: a concurrent `promote` may have
26
+ * just `git mv`'d the item from staging into the pool between an apply's CAPTURE
27
+ * and WRITE, and the apply must resolve to the post-move path — the whole point of
28
+ * folder-agnostic apply (F3a of prd `staging-surface-and-apply-promote-safety`).
29
+ * Terminal-only folders (`cancelled`, `prds-dropped`, `needs-attention`) are NOT
30
+ * here — once an item has reached a terminal, the apply is OVER, and a re-resolve
31
+ * into a terminal would mean the item has effectively vanished from the active
32
+ * lifecycle (callers handle that as the clean-exit `vanished` outcome).
33
+ */
34
+ export const APPLY_LIFECYCLE_FOLDERS: Record<
35
+ SidecarType,
36
+ readonly WorkFolderKey[]
37
+ > = {
38
+ task: ['tasks-backlog', 'tasks-ready', 'in-progress', 'done'],
39
+ // `spec` rests in the parent-spec regime folders (a `spec:<slug>` identity
40
+ // resolves against these).
41
+ spec: ['specs-proposed', 'specs-ready', 'specs-tasked'],
42
+ observation: ['observations'],
43
+ };
44
+
45
+ /**
46
+ * Resolve the item's CURRENT on-disk path by IDENTITY — the apply-side
47
+ * folder-agnostic resolver, the symmetric twin of `sidecarPathFor`. Mirrors the
48
+ * sidecar's identity-keyed resolution shape: the path is derived from the
49
+ * `(type, slug)` identity at WRITE-TIME, never from a captured `ItemPath`.
50
+ *
51
+ * Scans the lifecycle folders the type may rest in ({@link APPLY_LIFECYCLE_FOLDERS}),
52
+ * including STAGING, and returns the FIRST match (one slug per type, so there is at
53
+ * most one). Returns `undefined` when the item file is GONE between capture and
54
+ * write (a concurrent `promote` to a terminal, a human delete, or a sibling triage
55
+ * move) — the apply rung then exits CLEAN (no commit, no ghost file), routed as the
56
+ * `vanished` outcome.
57
+ *
58
+ * This is the F3a fix from prd `staging-surface-and-apply-promote-safety`: the
59
+ * sidecar is already identity-keyed and folder-agnostic; the item path is now the
60
+ * same. A concurrent `promote` that `git mv`'d the item out from under a captured
61
+ * path can no longer cause a stale-path write.
62
+ */
63
+ export function resolveItemPathByIdentity(
64
+ cwd: string,
65
+ item: string,
66
+ ): string | undefined {
67
+ const {type, slug} = resolveSidecarIdentity(item);
68
+ for (const folder of APPLY_LIFECYCLE_FOLDERS[type]) {
69
+ const rel = workItemRel(folder, `${slug}.md`);
70
+ if (existsSync(join(cwd, rel))) {
71
+ return rel;
72
+ }
73
+ }
74
+ return undefined;
75
+ }
@@ -0,0 +1,332 @@
1
+ import {readdirSync, readFileSync} from 'node:fs';
2
+ import {basename, join} from 'node:path';
3
+ import {parseFrontmatter} from './frontmatter.js';
4
+ import {run} from './git.js';
5
+ import {
6
+ LEDGER_STATUS_FOLDERS,
7
+ type LedgerStatusFolder,
8
+ workFolderName,
9
+ workFolderPath,
10
+ workFolderPrefix,
11
+ isWorkItemFile,
12
+ } from './work-layout.js';
13
+
14
+ /**
15
+ * The **one-slug-one-folder LINT** over the `work/` lifecycle ledger (prd
16
+ * `ledger-integrity`, story 3 — the READ-side belt-and-suspenders for defect 1).
17
+ *
18
+ * `work/` IS the ledger: a task's STATUS is the FOLDER its single `.md` lives in
19
+ * (WORK-CONTRACT.md rule "status = the folder", no index, one file per item). The
20
+ * invariant the integration core ENFORCES on every transition
21
+ * (`integration-core.ts` `readArbiterLedgerPlacement`, task
22
+ * `atomic-done-move-one-slug-one-folder`) is that a slug rests in EXACTLY ONE
23
+ * status folder. This module is its READER: a derived check that lists every
24
+ * status folder and surfaces any slug present in MORE THAN ONE — so a PRE-EXISTING
25
+ * orphan (e.g. the one hand-cleaned in `279b542`, PR #86) is DISCOVERABLE and a
26
+ * drive isn't misled into "recovering" an already-done task.
27
+ *
28
+ * It NEVER fixes the corruption: it WARNS (in `status`/`scan`) and REPORTS (the
29
+ * `gc`-style sweep, {@link sweepLedgerDuplicates}); a HUMAN resolves the
30
+ * duplicate (keep the canonical copy, delete the stale one). This mirrors the
31
+ * capture-bucket contract's "the agent never auto-deletes a signal" and the
32
+ * integration core's "fail loud over silent-clean where ambiguous".
33
+ *
34
+ * Consistent with the integration core's enforcement (which derives placement
35
+ * from the arbiter on demand, no index), the lint DERIVES the duplicate set by
36
+ * listing folder residence — there is no shared index to consult.
37
+ */
38
+
39
+ /**
40
+ * The `work/` STATUS folders a task's ledger file can rest in — the
41
+ * one-slug-one-folder set this lint is asserted over (WORK-CONTRACT.md
42
+ * "status = the folder"). After the capstone cut-over (task
43
+ * `cutover-retire-slicing-advancing-markers-and-trim-folder-sets`, prd
44
+ * `ledger-status-per-item-lock-refs`; ADR `ledger-status-on-per-item-lock-refs`)
45
+ * the ONLY `work/` moves on `main` are the DURABLE RESTING transitions, so a
46
+ * task's ledger file can rest only in the DURABLE set: the pool `backlog/`, the
47
+ * terminal `done/`, and the task regime's PER-REGIME "won't-proceed" terminal
48
+ * `tasks/cancelled/` (the per-regime split of the previous shared `dropped/`, prd
49
+ * `folder-taxonomy-reorg-and-rename` US #10; the specific REASON lives in the item
50
+ * BODY as a `reason:` value). The prd regime's terminal `prds/dropped/` is a
51
+ * SEPARATE namespace and is NOT a task-status folder. The transient
52
+ * `in-progress`/`needs-attention`/`tasking`/
53
+ * `advancing` are GONE from `main`'s tree — they are per-item lock-ref state
54
+ * (`in-progress` = lock held active, `needs-attention` = lock held stuck), read
55
+ * via `dorfl status` / `gc --ledger`'s lock report, NOT an `ls`-able folder.
56
+ *
57
+ * Shares `integration-core.ts`'s `LEDGER_STATUS_FOLDERS` (`backlog`/`done`/
58
+ * `cancelled`). A read-side lint surfaces a slug that ends up in `tasks/cancelled/`
59
+ * AND another status folder, so the lint covers all three.
60
+ *
61
+ * The capture buckets (`ideas`/`observations`/`findings`) and the prd-flow folders
62
+ * (`prds/ready`/`prds/tasked`) are NOT task-status folders (WORK-CONTRACT.md: the buckets
63
+ * are "exempt from status = folder"; the prd folders carry prds, a separate
64
+ * namespace) — they are deliberately EXCLUDED so a slug that legitimately has both
65
+ * a task and a same-named note/prd is never a false positive.
66
+ */
67
+ export {LEDGER_STATUS_FOLDERS, type LedgerStatusFolder} from './work-layout.js';
68
+
69
+ /**
70
+ * Lifecycle precedence used to pick the CANDIDATE CANONICAL folder of a duplicate
71
+ * (the one the human most likely wants to KEEP — the most-advanced lifecycle
72
+ * stage). `done/` is the canonical destination of the done-move (it wins, matching
73
+ * the integration core's "candidate `done/` destination"); the earlier stages
74
+ * rank below it. This is ONLY a suggestion for the human — the lint NEVER deletes
75
+ * the others; it just names the likely keeper.
76
+ */
77
+ const CANONICAL_PRECEDENCE: readonly LedgerStatusFolder[] = [
78
+ 'done',
79
+ 'cancelled',
80
+ 'tasks-ready',
81
+ ];
82
+
83
+ /** One slug found in more than one status folder — the corruption to surface. */
84
+ export interface DuplicateSlug {
85
+ /** The slug present in multiple status folders. */
86
+ slug: string;
87
+ /** The status folders it appears in (sorted, lifecycle order). */
88
+ folders: LedgerStatusFolder[];
89
+ /**
90
+ * The CANDIDATE canonical folder a human most likely wants to keep (the
91
+ * most-advanced lifecycle stage among {@link folders}). A SUGGESTION only — the
92
+ * lint never acts on it.
93
+ */
94
+ candidateCanonical: LedgerStatusFolder;
95
+ }
96
+
97
+ /**
98
+ * Detect every slug present in MORE THAN ONE status folder, from a per-folder map
99
+ * of the slugs each holds. PURE (no I/O) so it is trivially testable and shared by
100
+ * both the local-tree and ref-tree readers. Returns the duplicates sorted by slug,
101
+ * each carrying the folders it appears in (lifecycle-ordered) and the candidate
102
+ * canonical folder. An empty result ⇒ a clean ledger.
103
+ */
104
+ export function detectDuplicateSlugs(
105
+ slugsByFolder: ReadonlyMap<LedgerStatusFolder, ReadonlySet<string>>,
106
+ ): DuplicateSlug[] {
107
+ const foldersBySlug = new Map<string, LedgerStatusFolder[]>();
108
+ for (const folder of LEDGER_STATUS_FOLDERS) {
109
+ const slugs = slugsByFolder.get(folder);
110
+ if (slugs === undefined) {
111
+ continue;
112
+ }
113
+ for (const slug of slugs) {
114
+ const list = foldersBySlug.get(slug) ?? [];
115
+ list.push(folder);
116
+ foldersBySlug.set(slug, list);
117
+ }
118
+ }
119
+
120
+ const duplicates: DuplicateSlug[] = [];
121
+ for (const [slug, folders] of foldersBySlug) {
122
+ if (folders.length < 2) {
123
+ continue;
124
+ }
125
+ const ordered = orderByLifecycle(folders);
126
+ duplicates.push({
127
+ slug,
128
+ folders: ordered,
129
+ candidateCanonical: ordered[0],
130
+ });
131
+ }
132
+ return duplicates.sort((a, b) => a.slug.localeCompare(b.slug));
133
+ }
134
+
135
+ /** Sort folders by lifecycle precedence (most-advanced stage first). */
136
+ function orderByLifecycle(
137
+ folders: readonly LedgerStatusFolder[],
138
+ ): LedgerStatusFolder[] {
139
+ return [...folders].sort(
140
+ (a, b) => CANONICAL_PRECEDENCE.indexOf(a) - CANONICAL_PRECEDENCE.indexOf(b),
141
+ );
142
+ }
143
+
144
+ // --- Resolving slug→folder placement from the two real read sources ----------
145
+
146
+ /** List the `.md` slugs in `<repoPath>/work/<folder>/` (frontmatter `slug:`, else filename). */
147
+ function readLocalFolderSlugs(
148
+ repoPath: string,
149
+ folder: LedgerStatusFolder,
150
+ ): Set<string> {
151
+ const dir = workFolderPath(repoPath, folder);
152
+ const slugs = new Set<string>();
153
+ let entries: string[];
154
+ try {
155
+ entries = readdirSync(dir);
156
+ } catch {
157
+ return slugs; // missing folder ⇒ nothing there
158
+ }
159
+ for (const file of entries) {
160
+ if (!isWorkItemFile(file)) {
161
+ continue;
162
+ }
163
+ const content = readFileSync(join(dir, file), 'utf8');
164
+ const fm = parseFrontmatter(content);
165
+ slugs.add(fm.slug ?? basename(file, '.md'));
166
+ }
167
+ return slugs;
168
+ }
169
+
170
+ /**
171
+ * Resolve the per-folder slug placement of a LOCAL working tree's `work/` ledger
172
+ * (offline `readdirSync`). The duplicate set is then {@link detectDuplicateSlugs}.
173
+ */
174
+ export function resolveLocalPlacement(
175
+ repoPath: string,
176
+ ): Map<LedgerStatusFolder, Set<string>> {
177
+ const placement = new Map<LedgerStatusFolder, Set<string>>();
178
+ for (const folder of LEDGER_STATUS_FOLDERS) {
179
+ placement.set(folder, readLocalFolderSlugs(repoPath, folder));
180
+ }
181
+ return placement;
182
+ }
183
+
184
+ /** Detect duplicate slugs across the status folders of a LOCAL working tree. */
185
+ export function lintLocalLedger(repoPath: string): DuplicateSlug[] {
186
+ return detectDuplicateSlugs(resolveLocalPlacement(repoPath));
187
+ }
188
+
189
+ /** List the `.md` slugs in `<ref>:work/<folder>/` on a committed tree (bare-mirror or any ref). */
190
+ function readRefFolderSlugs(
191
+ ref: string,
192
+ cwd: string,
193
+ folder: LedgerStatusFolder,
194
+ env: NodeJS.ProcessEnv | undefined,
195
+ ): Set<string> {
196
+ const slugs = new Set<string>();
197
+ const tree = run(
198
+ 'git',
199
+ ['ls-tree', '--name-only', `${ref}:work/${workFolderName(folder)}`],
200
+ cwd,
201
+ {env},
202
+ );
203
+ if (tree.status !== 0) {
204
+ return slugs; // folder absent on this ref ⇒ nothing there
205
+ }
206
+ for (const name of tree.stdout.split('\n')) {
207
+ const file = name.trim();
208
+ if (!isWorkItemFile(file)) {
209
+ continue;
210
+ }
211
+ // The ledger names each file after its slug (claim/done moves do); reading
212
+ // the blob to confirm frontmatter `slug:` would cost an extra `git show` per
213
+ // file, and the duplicate set is keyed on the filename the transition wrote.
214
+ slugs.add(file.slice(0, -'.md'.length));
215
+ }
216
+ return slugs;
217
+ }
218
+
219
+ /**
220
+ * Resolve the per-folder slug placement from a committed `work/` tree on a git REF
221
+ * (a BARE hub mirror's `main`, or any ref), via `git ls-tree` — the only mechanism
222
+ * that works against a bare repo (no working tree), the SAME one the read seam's
223
+ * mirror method uses. `cwd` is the repo the `git -C <cwd>` commands run in (the
224
+ * mirror itself).
225
+ */
226
+ export function resolveRefPlacement(
227
+ ref: string,
228
+ cwd: string,
229
+ env: NodeJS.ProcessEnv | undefined,
230
+ ): Map<LedgerStatusFolder, Set<string>> {
231
+ const placement = new Map<LedgerStatusFolder, Set<string>>();
232
+ for (const folder of LEDGER_STATUS_FOLDERS) {
233
+ placement.set(folder, readRefFolderSlugs(ref, cwd, folder, env));
234
+ }
235
+ return placement;
236
+ }
237
+
238
+ /** Detect duplicate slugs across the status folders of a committed ledger ref. */
239
+ export function lintRefLedger(
240
+ ref: string,
241
+ cwd: string,
242
+ env: NodeJS.ProcessEnv | undefined,
243
+ ): DuplicateSlug[] {
244
+ return detectDuplicateSlugs(resolveRefPlacement(ref, cwd, env));
245
+ }
246
+
247
+ // --- Formatting (the loud WARNING + the gc-style REPORT) ---------------------
248
+
249
+ /**
250
+ * Format the one-slug-one-folder WARNING lines for a set of duplicates — the LOUD
251
+ * surface `status`/`scan` print when the ledger is corrupt. Each line names the
252
+ * slug AND the folders it appears in (never a silent pass). Empty input ⇒ no
253
+ * lines (a clean ledger is silent here).
254
+ */
255
+ export function formatDuplicateWarnings(
256
+ duplicates: readonly DuplicateSlug[],
257
+ ): string[] {
258
+ if (duplicates.length === 0) {
259
+ return [];
260
+ }
261
+ const lines = [
262
+ `!! one-slug-one-folder VIOLATED: ${duplicates.length} slug(s) in more than ` +
263
+ 'one work/ status folder (a corrupt ledger — a human must resolve each):',
264
+ ];
265
+ for (const dup of duplicates) {
266
+ const where = dup.folders.map((f) => workFolderPrefix(f)).join(', ');
267
+ lines.push(
268
+ ` ${dup.slug}: in ${where} ` +
269
+ `(candidate canonical: ${workFolderPrefix(dup.candidateCanonical)})`,
270
+ );
271
+ }
272
+ return lines;
273
+ }
274
+
275
+ /** The result of the `gc`-style ledger sweep — a REPORT, never a deletion. */
276
+ export interface LedgerSweepResult {
277
+ /** Every slug present in more than one status folder (empty ⇒ clean ledger). */
278
+ duplicates: DuplicateSlug[];
279
+ }
280
+
281
+ /**
282
+ * The `gc`-STYLE ledger SWEEP (prd story 3's belt-and-suspenders): on demand,
283
+ * REPORT every slug present in more than one status folder of a LOCAL `work/`
284
+ * ledger, naming the folders and the CANDIDATE canonical folder — and NEVER
285
+ * auto-delete. A human confirms the cleanup (keep the canonical copy, delete the
286
+ * stale one), exactly like the manual `279b542` cleanup. This is a `gc`-style
287
+ * sweep (it surveys + reports a hazard for a human to act on), but it is a
288
+ * SEPARATE surface from the worktree reaper `gc` (`gc.ts`), which reaps job
289
+ * worktrees under `<workspacesDir>/work/*` — a DIFFERENT `work/` (the execution
290
+ * substrate, not the lifecycle ledger). Mixing the two would conflate the two
291
+ * meanings of `work/`; the read seam already keeps the worktree `gc` out of the
292
+ * ledger read.
293
+ */
294
+ export function sweepLedgerDuplicates(repoPath: string): LedgerSweepResult {
295
+ return {
296
+ duplicates: lintLocalLedger(repoPath),
297
+ };
298
+ }
299
+
300
+ /**
301
+ * Format the `gc`-style ledger sweep REPORT for the terminal: one block per
302
+ * duplicate (slug, the folders it appears in, the candidate canonical folder, and
303
+ * the explicit "resolved by a HUMAN, never auto-deleted" note), or a clean line
304
+ * when there is nothing to report. The transient lock surface (held/stuck/orphaned
305
+ * per-item locks, incl. the advance holds that used to be `work/advancing/`
306
+ * markers) is the SEPARATE unified-lock report (`reportItemLocks` /
307
+ * `formatItemLockReport`, cleared via `release-lock`), not this folder lint.
308
+ */
309
+ export function formatLedgerSweep(result: LedgerSweepResult): string {
310
+ const {duplicates} = result;
311
+ if (duplicates.length === 0) {
312
+ return 'Ledger clean: every slug is in exactly one work/ status folder.';
313
+ }
314
+ const lines: string[] = [];
315
+ lines.push(
316
+ `Ledger SWEEP: ${duplicates.length} slug(s) present in more than one work/ ` +
317
+ 'status folder (REPORT only — a human resolves each; NEVER auto-deleted):',
318
+ );
319
+ for (const dup of duplicates) {
320
+ lines.push(` ${dup.slug}`);
321
+ lines.push(
322
+ ` in: ${dup.folders.map((f) => workFolderPrefix(f)).join(', ')}`,
323
+ );
324
+ lines.push(
325
+ ` candidate canonical: ${workFolderPrefix(dup.candidateCanonical)}`,
326
+ );
327
+ lines.push(
328
+ ' resolve: keep the canonical copy, delete the stale one(s), then re-run.',
329
+ );
330
+ }
331
+ return lines.join('\n');
332
+ }