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
package/src/status.ts ADDED
@@ -0,0 +1,441 @@
1
+ import {discoverJobs, type GcJob} from './gc.js';
2
+ import {resolveHarness, type Harness} from './harness.js';
3
+ // Import for the registration side-effect: ensures the `pi` adapter is in the
4
+ // harness registry so `resolveHarness` dispatches pi jobs' liveness to it.
5
+ import './pi-harness.js';
6
+ import {type JobState} from './workspace.js';
7
+ import {fetchMirrorMainOrWarn} from './repo-mirror.js';
8
+ import {formatArbiterStatus, type ArbiterStatusReport} from './arbiter.js';
9
+ import {listItemLockEntries, type LockEntry} from './item-lock.js';
10
+ import {formatCwdSection, formatLockEntryLines} from './format.js';
11
+ import type {CwdSection} from './cwd-section.js';
12
+ import {
13
+ lintRefLedger,
14
+ formatDuplicateWarnings,
15
+ type DuplicateSlug,
16
+ } from './ledger-lint.js';
17
+
18
+ /**
19
+ * `dorfl status` — the **operational dashboard of jobs** (ADR §4/§5/§12
20
+ * in `docs/adr/execution-substrate-decisions.md`). Split out of
21
+ * `agent-workspaces` so the substrate stays thin; this module owns the view.
22
+ *
23
+ * It lists the jobs under `<workspacesDir>/work/*` from their
24
+ * `.dorfl-job.json` records + worktree state, grouped by state:
25
+ *
26
+ * - **active** — `running` AND the harness reports the job still alive.
27
+ * - **failed / retained** — everything that wants a human's eye: a job the
28
+ * `needs-attention` mechanism flagged (with its reason, ADR §12), a `done`
29
+ * job whose worktree was never reaped (awaiting cleanup), or a `running`
30
+ * job whose harness reports it DEAD (crashed — the runner died mid-flight).
31
+ *
32
+ * **Liveness comes from the harness seam (PID / session), NOT filesystem mtime**
33
+ * (ADR §5): a live agent can think for minutes without writing files, so mtime
34
+ * would mistake a thinking agent for a dead one. The harness answers liveness
35
+ * from the real signal.
36
+ *
37
+ * **Fetch-first (ADR §5/§6):** the per-mirror lock-ref + one-slug-one-folder
38
+ * lint surfaces are read AFTER refreshing each registered hub mirror's `main` —
39
+ * the old "scan is always offline" framing is RETIRED (it was the roots-local
40
+ * model). A failed mirror fetch is NOT fatal: it WARNS and falls back to that
41
+ * mirror's last-known `main`. The ledger read STRATEGY is unchanged
42
+ * (`claim-ledger-vs-protected-main.md`); `status` only ensures the ref is fresh.
43
+ *
44
+ * It is strictly **read-only**: it inspects records/worktrees; it never claims,
45
+ * runs, moves, or deletes (deletion is `gc`). It reuses the `gc` `discoverJobs`
46
+ * primitive to enumerate jobs (it does NOT re-implement the work-area layout).
47
+ *
48
+ * Distinct from `scan`: `scan` answers "what work is in the *backlog* and who
49
+ * can take it"; `status` answers "what is *running / stuck / awaiting cleanup*
50
+ * right now". The retained-worktree + stuck-lock items are the "look here" set.
51
+ */
52
+
53
+ /** One job as the operational dashboard sees it (a record + its liveness). */
54
+ export interface JobStatus {
55
+ /** The work slug being processed. */
56
+ slug: string;
57
+ /** The encoded repo key the job's hub mirror was cut from. */
58
+ repo: string;
59
+ /** The work branch checked out in the worktree (`work/<slug>`). */
60
+ branch: string;
61
+ /** ISO timestamp the job worktree was created. */
62
+ startedAt: string;
63
+ /** The persisted lifecycle state. */
64
+ state: JobState;
65
+ /** Liveness FROM THE HARNESS SEAM (PID/session), never mtime (ADR §5). */
66
+ alive: boolean;
67
+ /**
68
+ * Why the job is stuck (ADR §12), when known — surfaced for the
69
+ * failed/retained group. Present for `needs-attention` jobs that recorded a
70
+ * reason; absent otherwise.
71
+ */
72
+ reason?: string;
73
+ /**
74
+ * The review-request URL (e.g. a GitHub PR) opened for this job, when a
75
+ * `propose`-mode provider opened one (ADR §6). Surfaced so the human can jump
76
+ * straight to the PR. Absent otherwise.
77
+ */
78
+ prUrl?: string;
79
+ /** Absolute path to the job worktree (for the human to look). */
80
+ dir: string;
81
+ }
82
+
83
+ /**
84
+ * One repo's PER-ITEM LOCK refs, surfaced for the dashboard (prd
85
+ * `ledger-status-per-item-lock-refs` US #8; task
86
+ * `needs-attention-as-stuck-lock-state`). The in-flight view read from the lock
87
+ * refs — held (`active` = in-progress) and stuck (`needs-attention`) entries +
88
+ * their reasons — is the SOLE stuck-state surface (the
89
+ * `work/needs-attention/` folder is retired, task
90
+ * `cutover-needs-attention-becomes-lock-stuck-recovery-surface`).
91
+ */
92
+ export interface RepoLockEntries {
93
+ /** The repo path whose lock refs were read (a hub-mirror path). */
94
+ repoPath: string;
95
+ /** The held lock entries (action × state + reason), sorted by entry. */
96
+ entries: LockEntry[];
97
+ }
98
+
99
+ /** One repo's one-slug-one-folder LINT result, surfaced for the dashboard. */
100
+ export interface RepoLedgerDuplicates {
101
+ /** The repo path whose `work/` ledger was linted (a hub-mirror path). */
102
+ repoPath: string;
103
+ /** The slugs present in more than one status folder (non-empty here). */
104
+ duplicates: DuplicateSlug[];
105
+ }
106
+
107
+ /** The operational groups `status` reports. */
108
+ export interface StatusReport {
109
+ /** Running jobs the harness reports still alive. */
110
+ active: JobStatus[];
111
+ /** Stuck (needs-attention), crashed (running-but-dead), or un-reaped (done) jobs. */
112
+ attention: JobStatus[];
113
+ /**
114
+ * The PER-ITEM LOCK in-flight view (prd `ledger-status-per-item-lock-refs` US
115
+ * #8; task `needs-attention-as-stuck-lock-state`): per registered hub mirror,
116
+ * the held lock entries read from the mirror's `refs/dorfl/lock/*` refs —
117
+ * `active` holds (in-progress) and `stuck` holds (needs-attention) + reasons.
118
+ * This is the SOLE stuck-state surface (the `work/needs-attention/` folder is
119
+ * retired, task
120
+ * `cutover-needs-attention-becomes-lock-stuck-recovery-surface`). Only repos
121
+ * WITH at least one held lock appear. Empty when no `mirrorPaths` were given or
122
+ * no locks are held. Optional so older literals stay valid; `status()` always
123
+ * populates it (possibly empty).
124
+ */
125
+ lockHeld?: RepoLockEntries[];
126
+ /**
127
+ * The one-slug-one-folder LINT (prd `ledger-integrity` story 3): per registered
128
+ * hub mirror, any slug present in MORE THAN ONE `work/` status folder (a corrupt
129
+ * ledger). Read from the mirror's bare `main` ref (the SAME `ls-tree` source the
130
+ * needs-attention surface uses). Only repos WITH a duplicate appear. `status`
131
+ * WARNS loudly about each (never a silent pass); a human resolves it. Empty when
132
+ * no `mirrorPaths` were given or every ledger is clean.
133
+ */
134
+ ledgerDuplicates?: RepoLedgerDuplicates[];
135
+ /**
136
+ * The current repo's arbiter state (folded in from the old `arbiter status`,
137
+ * ADR §1/§7): which remote, URL/path, exists/bare, main reachable, and the
138
+ * unsafe non-bare-with-main flag. Present only when the CLI resolved one (it is
139
+ * a current-checkout concern); absent for the pure job-area dashboard.
140
+ */
141
+ arbiter?: ArbiterStatusReport;
142
+ /**
143
+ * The CWD-LOCAL section (the `scan-status-read-cwd-repo` task): when `status`
144
+ * runs INSIDE a participating repo, this is that CURRENT repo read from its
145
+ * LOCAL WORKING TREE (fetch-its-arbiter-first), reported as a DISTINCT,
146
+ * separately-counted block alongside (never merged into) the registry view.
147
+ * Absent when the cwd does not participate or the caller did not resolve it.
148
+ */
149
+ cwd?: CwdSection;
150
+ }
151
+
152
+ export interface StatusOptions {
153
+ /** The execution working area to inspect (config `workspacesDir`). */
154
+ workspacesDir: string;
155
+ /**
156
+ * The harness used to answer liveness (PID/session — never mtime). When given,
157
+ * it answers liveness for EVERY job (tests inject a stub here). When omitted,
158
+ * each job's liveness is answered by the adapter that OWNS its record
159
+ * (`resolveHarness` keyed off the record's `adapter`) — so a `pi` job reports
160
+ * via the pi adapter (PID + session pointer) and a `null` job via the null
161
+ * adapter, never mtime.
162
+ */
163
+ harness?: Harness;
164
+ /**
165
+ * Hub-mirror PATHS whose lock refs + one-slug-one-folder lint to surface, read
166
+ * from each mirror's BARE `main` ref (mirrors have no working tree). The CLI
167
+ * wires these from the registry's {@link listMirrors}. `status` FETCHES each
168
+ * mirror's `main` first (ADR §5/§6 — the registry's remote is the source of
169
+ * truth); a failed fetch WARNS and falls back to last-known (never errors).
170
+ * Omitted ⇒ only the job worktrees are reported.
171
+ */
172
+ mirrorPaths?: string[];
173
+ /**
174
+ * Sink for the fetch-first fall-back warning (ADR §5/§6): when a mirror's `main`
175
+ * cannot be fetched, `status` warns through this and reads that mirror's
176
+ * last-known state. The CLI wires it to the standard `>>` stderr note.
177
+ */
178
+ warn?: (message: string) => void;
179
+ /**
180
+ * The current repo's arbiter state to fold into the dashboard (the old `arbiter
181
+ * status`, ADR §1). The CLI resolves it via `arbiterStatus` for the current
182
+ * checkout; omitted ⇒ no arbiter section.
183
+ */
184
+ arbiter?: ArbiterStatusReport;
185
+ /**
186
+ * The pre-resolved CWD-LOCAL section (the `scan-status-read-cwd-repo` task).
187
+ * The CLI resolves it via `resolveCwdSection` (cwd participation + fetch-first
188
+ * divergence + registry de-dup) and hands it here; `status` carries it onto the
189
+ * report and `formatStatus` renders it as a distinct local block. Omitted ⇒ no
190
+ * local section.
191
+ */
192
+ cwd?: CwdSection;
193
+ env?: NodeJS.ProcessEnv;
194
+ }
195
+
196
+ /**
197
+ * Build the operational status of every job under `<workspacesDir>/work/*`
198
+ * (ADR §4/§5/§12). READ-ONLY: enumerates job records via the `gc` `discoverJobs`
199
+ * primitive, asks the harness for liveness (NOT mtime), and groups each job as
200
+ * **active** (running + alive) or **failed/retained** (needs-attention, a
201
+ * crashed running-but-dead job, or a done-but-un-reaped one). Mutates nothing —
202
+ * no claim/run/move/delete.
203
+ */
204
+ export async function status(options: StatusOptions): Promise<StatusReport> {
205
+ const active: JobStatus[] = [];
206
+ const attention: JobStatus[] = [];
207
+
208
+ for (const job of discoverJobs(options.workspacesDir)) {
209
+ const view = toJobStatus(job, options.harness);
210
+ // Active iff the runner believes the job is in flight (`running`) AND the
211
+ // harness confirms it is still alive. Everything else is "look here":
212
+ // - needs-attention: the runner flagged it (gate red, conflict, …)
213
+ // - done: landed but the worktree wasn't reaped (awaiting cleanup)
214
+ // - running but NOT alive: the process died mid-flight (crashed)
215
+ if (view.state === 'running' && view.alive) {
216
+ active.push(view);
217
+ } else {
218
+ attention.push(view);
219
+ }
220
+ }
221
+
222
+ active.sort(bySlug);
223
+ attention.sort(bySlug);
224
+
225
+ // The STUCK-STATE surface is now the PER-ITEM LOCK `state: stuck` (task
226
+ // `cutover-needs-attention-becomes-lock-stuck-recovery-surface`, decision i+:
227
+ // the `needs-attention/` folder is retired — NO code reads
228
+ // `work/needs-attention/`). `status` reads the lock refs per mirror to surface
229
+ // held (`active` = in-progress) AND stuck (`needs-attention`) entries + their
230
+ // reasons/questions.
231
+ const lockHeld: RepoLockEntries[] = [];
232
+ const ledgerDuplicates: RepoLedgerDuplicates[] = [];
233
+ for (const mirrorPath of options.mirrorPaths ?? []) {
234
+ // Fetch-first (ADR §5/§6): refresh this mirror's `main` so the duplicate lint
235
+ // reflects the remote truth. Never fatal — a failed fetch WARNS and falls back
236
+ // to the mirror's last-known `main`.
237
+ fetchMirrorMainOrWarn({mirrorPath, warn: options.warn, env: options.env});
238
+ // The PER-ITEM LOCK in-flight view (prd US #8): read the mirror's lock refs to
239
+ // surface held (`active` = in-progress) and stuck (`needs-attention`) entries +
240
+ // reasons/questions. A bare hub mirror's arbiter is its `origin` (the SAME
241
+ // handle the `scan` held-slug subtraction reads). Best-effort: a fetch/read
242
+ // fault yields an EMPTY list (see {@link listItemLockEntries}), so this
243
+ // read-only view degrades to "no in-flight locks" rather than erroring.
244
+ const entries = await listItemLockEntries(
245
+ mirrorPath,
246
+ 'origin',
247
+ options.env,
248
+ );
249
+ if (entries.length > 0) {
250
+ lockHeld.push({repoPath: mirrorPath, entries});
251
+ }
252
+ // The one-slug-one-folder LINT (prd story 3): derive any slug residing in >1
253
+ // status folder from the SAME freshly-fetched `main` ref, surfaced LOUDLY.
254
+ const dups = lintRefLedger('main', mirrorPath, options.env);
255
+ if (dups.length > 0) {
256
+ ledgerDuplicates.push({repoPath: mirrorPath, duplicates: dups});
257
+ }
258
+ }
259
+ lockHeld.sort((a, b) => a.repoPath.localeCompare(b.repoPath));
260
+ ledgerDuplicates.sort((a, b) => a.repoPath.localeCompare(b.repoPath));
261
+
262
+ return {
263
+ active,
264
+ attention,
265
+ lockHeld,
266
+ ledgerDuplicates,
267
+ ...(options.arbiter ? {arbiter: options.arbiter} : {}),
268
+ ...(options.cwd ? {cwd: options.cwd} : {}),
269
+ };
270
+ }
271
+
272
+ function bySlug(a: JobStatus, b: JobStatus): number {
273
+ return a.slug.localeCompare(b.slug);
274
+ }
275
+
276
+ /**
277
+ * Project a discovered job + its harness liveness into a `JobStatus`. When no
278
+ * harness is forced (the normal case), each record's liveness is answered by the
279
+ * adapter that OWNS it (`resolveHarness`) — a pi job via the pi adapter (PID +
280
+ * session), never mtime.
281
+ */
282
+ function toJobStatus(job: GcJob, forced: Harness | undefined): JobStatus {
283
+ const record = job.record;
284
+ const harness =
285
+ forced ?? (record ? resolveHarness(record.harness) : undefined);
286
+ const alive =
287
+ record !== undefined && harness !== undefined
288
+ ? harness.isAlive(record.harness)
289
+ : false;
290
+ return {
291
+ slug: job.slug,
292
+ repo: record?.repoKey ?? '(unknown)',
293
+ branch: job.branch,
294
+ startedAt: record?.startedAt ?? '(unknown)',
295
+ state: record?.state ?? 'running',
296
+ alive,
297
+ reason: record?.reason,
298
+ prUrl: record?.prUrl,
299
+ dir: job.dir,
300
+ };
301
+ }
302
+
303
+ /**
304
+ * Render the operational status for the terminal: an **Active jobs** section and
305
+ * a **Failed / retained jobs** section, each line carrying slug, repo, branch,
306
+ * and started-at — plus, for stuck jobs, the recorded reason, and for a
307
+ * running-but-dead job a `(crashed — no longer alive)` marker.
308
+ *
309
+ * Deliberately framed in terms of **jobs** (running / stuck / awaiting cleanup),
310
+ * NOT the backlog *queue* — that is what keeps it visibly distinct from `scan`.
311
+ */
312
+ export function formatStatus(report: StatusReport): string {
313
+ const lines: string[] = [];
314
+
315
+ // The cwd-local section (the `scan-status-read-cwd-repo` task): a DISTINCT,
316
+ // separately-counted block for the CURRENT repo's working tree, ABOVE the
317
+ // job/registry dashboard (never merged into the job counts).
318
+ const cwdLines = report.cwd !== undefined ? formatCwdSection(report.cwd) : [];
319
+
320
+ const lockHeld = report.lockHeld ?? [];
321
+ const lockCount = lockHeld.reduce((sum, r) => sum + r.entries.length, 0);
322
+ const ledgerDuplicates = report.ledgerDuplicates ?? [];
323
+ const dupCount = ledgerDuplicates.reduce(
324
+ (sum, r) => sum + r.duplicates.length,
325
+ 0,
326
+ );
327
+ if (
328
+ report.active.length === 0 &&
329
+ report.attention.length === 0 &&
330
+ lockCount === 0 &&
331
+ dupCount === 0 &&
332
+ report.arbiter === undefined &&
333
+ cwdLines.length === 0
334
+ ) {
335
+ return 'No jobs running or retained (the work area is empty).';
336
+ }
337
+
338
+ if (cwdLines.length > 0) {
339
+ lines.push(...cwdLines);
340
+ lines.push('');
341
+ }
342
+
343
+ lines.push('Active jobs (running):');
344
+ if (report.active.length === 0) {
345
+ lines.push(' (none)');
346
+ } else {
347
+ for (const job of report.active) {
348
+ lines.push(formatJobLine(job));
349
+ }
350
+ }
351
+ lines.push('');
352
+
353
+ lines.push('Failed / retained jobs (look here):');
354
+ if (report.attention.length === 0) {
355
+ lines.push(' (none)');
356
+ } else {
357
+ for (const job of report.attention) {
358
+ lines.push(formatJobLine(job));
359
+ }
360
+ }
361
+
362
+ // The PER-ITEM LOCK in-flight view (prd US #8; task
363
+ // `cutover-needs-attention-becomes-lock-stuck-recovery-surface`): the held lock
364
+ // refs read from each mirror — `active` holds (in-progress) and `stuck` holds
365
+ // (needs-attention) + their reasons/questions. This is the SOLE stuck-state
366
+ // surface now (the `needs-attention/` folder is retired).
367
+ if (lockCount > 0) {
368
+ lines.push('');
369
+ lines.push('In-flight locks (refs/dorfl/lock/* — held + stuck):');
370
+ for (const repo of lockHeld) {
371
+ lines.push(` ${repo.repoPath}`);
372
+ for (const entry of repo.entries) {
373
+ // SHARED renderer (NOT a forked one) so the cwd section
374
+ // (`formatCwdSection`) presents a held/stuck item identically.
375
+ lines.push(...formatLockEntryLines(entry, ' '));
376
+ }
377
+ }
378
+ }
379
+
380
+ // The one-slug-one-folder LINT (prd `ledger-integrity` story 3): WARN LOUDLY
381
+ // about every slug residing in >1 status folder of a registered mirror's ledger
382
+ // (a corrupt ledger — never a silent pass). A human must resolve each.
383
+ if (dupCount > 0) {
384
+ lines.push('');
385
+ for (const repo of ledgerDuplicates) {
386
+ lines.push(` ${repo.repoPath}`);
387
+ for (const w of formatDuplicateWarnings(repo.duplicates)) {
388
+ lines.push(` ${w}`);
389
+ }
390
+ }
391
+ }
392
+
393
+ lines.push('');
394
+ lines.push(
395
+ `Summary: ${report.active.length} active, ${report.attention.length} failed/retained job(s)` +
396
+ (lockCount > 0 ? `, ${lockCount} in-flight lock(s)` : '') +
397
+ (dupCount > 0 ? `, ${dupCount} one-slug-one-folder violation(s)` : '') +
398
+ '.',
399
+ );
400
+
401
+ // The folded-in arbiter state (ADR §1/§7, the old `arbiter status`).
402
+ if (report.arbiter !== undefined) {
403
+ lines.push('');
404
+ lines.push(formatArbiterStatus(report.arbiter));
405
+ }
406
+
407
+ return lines.join('\n');
408
+ }
409
+
410
+ /** One `slug repo branch started-at [marker]` job line, with reason below. */
411
+ function formatJobLine(job: JobStatus): string {
412
+ const marker = jobMarker(job);
413
+ const head = ` ${job.slug} ${job.repo} ${job.branch} started ${job.startedAt}${marker}`;
414
+ const extra: string[] = [];
415
+ if (job.reason !== undefined && job.reason !== '') {
416
+ extra.push(` reason: ${job.reason}`);
417
+ }
418
+ if (job.prUrl !== undefined && job.prUrl !== '') {
419
+ extra.push(` PR: ${job.prUrl}`);
420
+ }
421
+ return extra.length > 0 ? [head, ...extra].join('\n') : head;
422
+ }
423
+
424
+ /**
425
+ * A trailing marker that explains WHY a non-active job is in the look-here group:
426
+ * a `running` job the harness reports dead is a **crashed** runner; a `done` job
427
+ * is **awaiting cleanup** (`gc` will reap it); a `needs-attention` job is
428
+ * **stuck** (its reason is rendered separately).
429
+ */
430
+ function jobMarker(job: JobStatus): string {
431
+ if (job.state === 'running' && !job.alive) {
432
+ return ' (crashed — no longer alive)';
433
+ }
434
+ if (job.state === 'done') {
435
+ return ' (done — awaiting cleanup)';
436
+ }
437
+ if (job.state === 'needs-attention') {
438
+ return ' (needs attention)';
439
+ }
440
+ return '';
441
+ }