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/arbiter.ts ADDED
@@ -0,0 +1,372 @@
1
+ import {existsSync, mkdirSync, readdirSync} from 'node:fs';
2
+ import {dirname, join} from 'node:path';
3
+ import {git, run} from './git.js';
4
+ import {encodeRepoKey} from './repo-mirror.js';
5
+
6
+ /**
7
+ * The **arbiter management** primitive (ADR §7 in
8
+ * `docs/adr/execution-substrate-decisions.md`): provision and inspect a local
9
+ * `--bare` arbiter — the offline source of truth the claim/integration
10
+ * protocols serialize on (`scripts/CLAIM-PROTOCOL.md`).
11
+ *
12
+ * An arbiter is **precious DATA**, not state or cache: it is the very thing the
13
+ * deletion-safety predicate (ADR §4) proves everything else safe *against*. So:
14
+ *
15
+ * - It is provisioned under a visible `~/git/` (config `arbitersDir`),
16
+ * hierarchical (`<host>/<org>/<name>.git`), reusing the workspace repo→key
17
+ * encoding (`.`→`-` per segment) — NEVER under `~/.dorfl/`, whose
18
+ * `gc`/cleanup could nuke the only copy.
19
+ * - It is created `git clone --bare`. A non-bare repo with `main` checked out
20
+ * CANNOT be an arbiter: it rejects pushes to `main` (CLAIM-PROTOCOL), which
21
+ * would silently break every claim. `init` refuses that unsafe case; `status`
22
+ * flags it.
23
+ *
24
+ * This module only **provisions/locates** the arbiter (`arbiterInit` from an
25
+ * existing working repo, `arbiterStatus`). It does NOT claim, run, or fetch —
26
+ * those consume what this provides. It reuses the `repo-mirror` repo→key
27
+ * encoding (it does NOT duplicate it).
28
+ */
29
+
30
+ /** The conventional default name for the arbiter remote in a working repo. */
31
+ export const DEFAULT_ARBITER_REMOTE = 'arbiter';
32
+
33
+ /**
34
+ * The on-disk location of the local bare arbiter for `url`:
35
+ * `<arbitersDir>/<host>/<org>/<name>.git` (hierarchical, reusing the
36
+ * `repo-mirror` repo→key encoding, with a `.git` suffix). Lives under
37
+ * `arbitersDir` (default `~/git`), NEVER `~/.dorfl` (ADR §7).
38
+ */
39
+ export function arbiterPath(arbitersDir: string, url: string): string {
40
+ return join(arbitersDir, `${encodeRepoKey(url)}.git`);
41
+ }
42
+
43
+ export interface ArbiterInitOptions {
44
+ /**
45
+ * The working repo to derive the arbiter FROM (its current contents seed the
46
+ * bare clone, and its `<remote>` is wired to point at it). Defaults to `cwd`.
47
+ */
48
+ repo?: string;
49
+ /** Working directory `repo` defaults to when omitted. Defaults to `process.cwd()`. */
50
+ cwd?: string;
51
+ /**
52
+ * Override the resolved default path (`<arbitersDir>/<key>.git`) with an
53
+ * explicit location (`--at`). Still created `--bare`.
54
+ */
55
+ at?: string;
56
+ /** Where to provision the arbiter (config `arbitersDir`, default `~/git`). */
57
+ arbitersDir?: string;
58
+ /** Name of the remote to wire in `repo` (`--remote`). Default `arbiter`. */
59
+ remote?: string;
60
+ env?: NodeJS.ProcessEnv;
61
+ /** Sink for human-readable progress notes. */
62
+ note?: (message: string) => void;
63
+ }
64
+
65
+ export interface ArbiterInitResult {
66
+ /** Absolute path to the (existing or just-created) bare arbiter. */
67
+ path: string;
68
+ /** The `file://` URL the repo's remote was wired to. */
69
+ url: string;
70
+ /** The remote name wired in the working repo. */
71
+ remote: string;
72
+ /** True iff the arbiter did not exist and was just `clone --bare`d. */
73
+ created: boolean;
74
+ /** True iff an arbiter already existed at the path (idempotent no-clobber). */
75
+ alreadyExisted: boolean;
76
+ /** True iff the arbiter is bare (always true on success — invariant). */
77
+ bare: boolean;
78
+ }
79
+
80
+ /** Raised when `init` cannot safely provision/locate an arbiter. */
81
+ export class ArbiterError extends Error {}
82
+
83
+ /**
84
+ * Provision (or locate) a local bare arbiter from a working repo and wire the
85
+ * repo's `<remote>` to it. Idempotent: an existing arbiter is detected and NOT
86
+ * clobbered (it is only re-pointed by the remote, never re-cloned). Refuses the
87
+ * unsafe case where the target is a non-bare repo with `main` checked out (which
88
+ * would reject claim pushes — CLAIM-PROTOCOL).
89
+ *
90
+ * The default path is hierarchical under `arbitersDir` (`~/git`), NEVER under
91
+ * `~/.dorfl` (ADR §7) — overridable via `at`.
92
+ */
93
+ export function arbiterInit(options: ArbiterInitOptions): ArbiterInitResult {
94
+ const env = options.env;
95
+ const note = options.note ?? (() => {});
96
+ const repo = options.repo ?? options.cwd ?? process.cwd();
97
+ const remote = options.remote ?? DEFAULT_ARBITER_REMOTE;
98
+
99
+ if (run('git', ['rev-parse', '--git-dir'], repo, {env}).status !== 0) {
100
+ throw new ArbiterError(`not inside a git repository: ${repo}`);
101
+ }
102
+
103
+ // Resolve the destination path: explicit --at, else the hierarchical default
104
+ // under arbitersDir keyed off the repo's canonical file:// URL.
105
+ const repoUrl = `file://${repo}`;
106
+ const path = options.at ?? arbiterPath(arbitersDir(options), repoUrl);
107
+ const url = `file://${path}`;
108
+
109
+ // Idempotent: an existing git repo at the path is detected, validated as bare,
110
+ // and NEVER clobbered (no re-clone). We only ensure the remote is wired.
111
+ if (pathHoldsGitRepo(path)) {
112
+ assertBare(path, env);
113
+ note(
114
+ `arbiter already exists at ${path} (not re-cloning) — ensuring remote.`,
115
+ );
116
+ wireRemote(repo, remote, url, env);
117
+ return {
118
+ path,
119
+ url,
120
+ remote,
121
+ created: false,
122
+ alreadyExisted: true,
123
+ bare: true,
124
+ };
125
+ }
126
+
127
+ // Refuse the unsafe case: --at points at an EXISTING non-bare repo (e.g. one
128
+ // with main checked out). Using it as the arbiter rejects claim pushes to
129
+ // main (CLAIM-PROTOCOL) — a silent, claim-breaking footgun.
130
+ if (existsSync(path) && pathLooksLikeWorkingTree(path)) {
131
+ assertBare(path, env); // throws with the clear non-bare message
132
+ }
133
+
134
+ // Provision: a bare clone of the working repo (its objects + main seed it).
135
+ mkdirSync(dirname(path), {recursive: true});
136
+ git(['clone', '--quiet', '--bare', repo, path], dirname(path), {env});
137
+ note(`provisioned bare arbiter at ${path}`);
138
+
139
+ // Wire the repo's <remote> to the new arbiter.
140
+ wireRemote(repo, remote, url, env);
141
+
142
+ return {path, url, remote, created: true, alreadyExisted: false, bare: true};
143
+ }
144
+
145
+ export interface ArbiterStatusOptions {
146
+ /** The working repo to inspect. Defaults to `process.cwd()`. */
147
+ cwd?: string;
148
+ /** The arbiter remote name to report on. Default `arbiter`. */
149
+ remote?: string;
150
+ env?: NodeJS.ProcessEnv;
151
+ }
152
+
153
+ export interface ArbiterStatusReport {
154
+ /** The remote name inspected. */
155
+ remote: string;
156
+ /** True iff the working repo has a remote with that name. */
157
+ configured: boolean;
158
+ /** The remote's URL, if configured. */
159
+ url?: string;
160
+ /** The local filesystem path the URL resolves to (for `file://` / local URLs). */
161
+ path?: string;
162
+ /** True iff a git repo exists at `path` (or the URL is reachable locally). */
163
+ exists: boolean;
164
+ /** True iff the arbiter is a bare repo (the safe shape). */
165
+ bare: boolean;
166
+ /** True iff `main` is reachable on the arbiter. */
167
+ mainReachable: boolean;
168
+ /**
169
+ * True iff the arbiter is in the unsafe non-bare-with-main shape: it EXISTS
170
+ * but is not bare (CLAIM-PROTOCOL warns this rejects claim pushes).
171
+ */
172
+ unsafe: boolean;
173
+ }
174
+
175
+ /**
176
+ * Read-only report of the current repo's arbiter: which remote it is, its
177
+ * URL/path, whether it exists and is bare, and whether `main` is reachable. It
178
+ * MUTATES NOTHING (no fetch, no checkout) — it reads the local remote config and
179
+ * inspects the arbiter repo in place. Flags the unsafe non-bare-with-main case
180
+ * (ADR §7 / CLAIM-PROTOCOL).
181
+ */
182
+ export function arbiterStatus(
183
+ options: ArbiterStatusOptions,
184
+ ): ArbiterStatusReport {
185
+ const env = options.env;
186
+ const cwd = options.cwd ?? process.cwd();
187
+ const remote = options.remote ?? DEFAULT_ARBITER_REMOTE;
188
+
189
+ const urlResult = run('git', ['remote', 'get-url', remote], cwd, {env});
190
+ if (urlResult.status !== 0) {
191
+ return {
192
+ remote,
193
+ configured: false,
194
+ exists: false,
195
+ bare: false,
196
+ mainReachable: false,
197
+ unsafe: false,
198
+ };
199
+ }
200
+ const url = urlResult.stdout.trim();
201
+ const path = localPathFromUrl(url);
202
+
203
+ // Only a local path can be inspected in place; a remote URL (github, ssh) is
204
+ // reported as configured but its bare-ness/reachability is not probed here.
205
+ if (path === undefined) {
206
+ return {
207
+ remote,
208
+ configured: true,
209
+ url,
210
+ exists: false,
211
+ bare: false,
212
+ mainReachable: false,
213
+ unsafe: false,
214
+ };
215
+ }
216
+
217
+ const exists = pathHoldsGitRepo(path);
218
+ if (!exists) {
219
+ return {
220
+ remote,
221
+ configured: true,
222
+ url,
223
+ path,
224
+ exists: false,
225
+ bare: false,
226
+ mainReachable: false,
227
+ unsafe: false,
228
+ };
229
+ }
230
+
231
+ const bare = isBareRepo(path, env);
232
+ const mainReachable =
233
+ run('git', ['rev-parse', '--verify', 'main'], path, {
234
+ env,
235
+ }).status === 0;
236
+
237
+ return {
238
+ remote,
239
+ configured: true,
240
+ url,
241
+ path,
242
+ exists: true,
243
+ bare,
244
+ mainReachable,
245
+ // Unsafe = it exists but is NOT bare (a working tree with main checked out
246
+ // rejects claim pushes to main — CLAIM-PROTOCOL).
247
+ unsafe: !bare,
248
+ };
249
+ }
250
+
251
+ /** Render an `arbiter status` report for the terminal. */
252
+ export function formatArbiterStatus(report: ArbiterStatusReport): string {
253
+ const lines: string[] = [];
254
+ if (!report.configured) {
255
+ lines.push(
256
+ `Arbiter: no '${report.remote}' remote configured in this repo.`,
257
+ );
258
+ lines.push(
259
+ ` Run \`dorfl arbiter init --remote ${report.remote}\` to provision one,`,
260
+ );
261
+ lines.push(' or set it manually with `git remote add`.');
262
+ return lines.join('\n');
263
+ }
264
+
265
+ lines.push(`Arbiter remote: ${report.remote}`);
266
+ lines.push(` URL: ${report.url ?? '(unknown)'}`);
267
+ if (report.path !== undefined) {
268
+ lines.push(` path: ${report.path}`);
269
+ }
270
+ lines.push(` exists: ${report.exists ? 'yes' : 'no'}`);
271
+ if (report.exists) {
272
+ lines.push(` bare: ${report.bare ? 'yes' : 'no'}`);
273
+ lines.push(
274
+ ` main: ${report.mainReachable ? 'reachable' : 'NOT reachable'}`,
275
+ );
276
+ }
277
+ if (report.unsafe) {
278
+ lines.push('');
279
+ lines.push(
280
+ ' !! UNSAFE: the arbiter is a non-bare repo (a working tree). A non-bare',
281
+ );
282
+ lines.push(
283
+ ' repo with `main` checked out REJECTS claim pushes to main',
284
+ );
285
+ lines.push(
286
+ ' (CLAIM-PROTOCOL). Re-provision a bare arbiter with `arbiter init`.',
287
+ );
288
+ } else if (report.exists && !report.mainReachable) {
289
+ lines.push('');
290
+ lines.push(
291
+ ' !! main is not reachable on the arbiter (empty or wrong repo?).',
292
+ );
293
+ }
294
+ return lines.join('\n');
295
+ }
296
+
297
+ /** Resolve the arbiters dir from options, defaulting to `~/git`. */
298
+ function arbitersDir(options: ArbiterInitOptions): string {
299
+ if (options.arbitersDir && options.arbitersDir.trim() !== '') {
300
+ return options.arbitersDir;
301
+ }
302
+ throw new ArbiterError(
303
+ 'arbiterInit requires `at` or `arbitersDir` (the CLI passes the resolved config).',
304
+ );
305
+ }
306
+
307
+ /** Add the remote if absent, else set its URL (idempotent wiring). */
308
+ function wireRemote(
309
+ repo: string,
310
+ remote: string,
311
+ url: string,
312
+ env: NodeJS.ProcessEnv | undefined,
313
+ ): void {
314
+ const existing = run('git', ['remote', 'get-url', remote], repo, {env});
315
+ if (existing.status === 0) {
316
+ git(['remote', 'set-url', remote, url], repo, {env});
317
+ } else {
318
+ git(['remote', 'add', remote, url], repo, {env});
319
+ }
320
+ }
321
+
322
+ /** Throw a clear error if the repo at `path` is not bare (the unsafe case). */
323
+ function assertBare(path: string, env: NodeJS.ProcessEnv | undefined): void {
324
+ if (!isBareRepo(path, env)) {
325
+ throw new ArbiterError(
326
+ `refusing: the arbiter at ${path} is a NON-BARE repo (a working tree). ` +
327
+ 'A non-bare repo with `main` checked out rejects claim pushes to main ' +
328
+ '(CLAIM-PROTOCOL) — it cannot serve as an arbiter. Provision a bare ' +
329
+ 'arbiter (git clone --bare) at a clean location instead.',
330
+ );
331
+ }
332
+ }
333
+
334
+ /** True iff `path` is (or contains) an initialised git repository. */
335
+ function pathHoldsGitRepo(path: string): boolean {
336
+ if (!existsSync(path)) {
337
+ return false;
338
+ }
339
+ // A bare repo IS a git dir; a non-bare repo has a `.git` entry. Either way,
340
+ // `git rev-parse --git-dir` succeeds when run inside it.
341
+ return run('git', ['rev-parse', '--git-dir'], path).status === 0;
342
+ }
343
+
344
+ /** True iff `path` exists and looks like a non-empty directory (a candidate repo). */
345
+ function pathLooksLikeWorkingTree(path: string): boolean {
346
+ try {
347
+ return readdirSync(path).length > 0;
348
+ } catch {
349
+ return false;
350
+ }
351
+ }
352
+
353
+ /** True iff the git repo at `path` is bare. */
354
+ function isBareRepo(path: string, env: NodeJS.ProcessEnv | undefined): boolean {
355
+ const result = run('git', ['rev-parse', '--is-bare-repository'], path, {env});
356
+ return result.status === 0 && result.stdout.trim() === 'true';
357
+ }
358
+
359
+ /**
360
+ * The local filesystem path a remote URL refers to, or `undefined` for a true
361
+ * remote (github/ssh/https). Handles `file://...` and a plain absolute path.
362
+ */
363
+ function localPathFromUrl(url: string): string | undefined {
364
+ const trimmed = url.trim();
365
+ if (trimmed.startsWith('file://')) {
366
+ return trimmed.slice('file://'.length);
367
+ }
368
+ if (trimmed.startsWith('/')) {
369
+ return trimmed;
370
+ }
371
+ return undefined;
372
+ }
package/src/brand.ts ADDED
@@ -0,0 +1,111 @@
1
+ /**
2
+ * The **brand / protocol identity** single source of truth (ADR-class load-
3
+ * bearing strings).
4
+ *
5
+ * dorfl's name leaks into a handful of strings that are a CONTRACT with
6
+ * the user, the filesystem, and CI — and that BREAK SILENTLY if they drift out
7
+ * of sync on a rename:
8
+ *
9
+ * - the `DORFL_` env-var prefix (a missed one is read as "unset" — the
10
+ * worst kind of failure: silent);
11
+ * - the `.dorfl.json` per-repo config filename;
12
+ * - the `~/.dorfl/` workspaces-dir default + the `dorfl` config
13
+ * dir name;
14
+ * - the `.dorfl-job.json` per-job record filename;
15
+ * - the `dorfl` binary / package name where referenced FROM CODE.
16
+ *
17
+ * This module derives EVERY one of those from a SINGLE base string ({@link BASE})
18
+ * using the same case transforms the `change-name` tool understands
19
+ * (https://github.com/wighawag/change-name — camelCase/constantCase/paramCase/…).
20
+ * Renaming the project later is then ONE edit here, not a scattered (and
21
+ * silently-breakable) find/replace across the codebase.
22
+ *
23
+ * SCOPE: only the PROTOCOL surface (where a miss BREAKS things). The ~600
24
+ * cosmetic doc/prose mentions of "dorfl" (ADRs, prds, CONTEXT.md, tasks,
25
+ * comments) are NOT indirected through this module — they should read as the real
26
+ * name and are handled at actual rebrand time by `change-name` (multi-case-aware
27
+ * recursive rename of file names + contents). The two are complementary: this
28
+ * centralizes the breakable protocol surface; `change-name` covers the cosmetic
29
+ * bulk. Likewise `package.json`'s `name`/`bin` are NOT indirected through a
30
+ * runtime constant (that is also `change-name`'s job) — {@link Brand.bin} merely
31
+ * exposes the SAME derived value for the code sites that reference the binary.
32
+ */
33
+
34
+ /**
35
+ * The ONE base identity string, in `paramCase` (the natural form of the binary
36
+ * name). Change THIS and every derived protocol form below flips in lockstep.
37
+ */
38
+ export const BASE = 'dorfl';
39
+
40
+ // --- Case transforms (the subset of `change-name`'s vocabulary we derive from).
41
+ //
42
+ // Implemented locally (no runtime dependency) but NAMED for the `change-name`
43
+ // conventions so the mapping is obvious at rebrand time. Each splits the input
44
+ // into lowercase words, then re-joins per the target case. The base is already
45
+ // `paramCase`, but we go through `words()` so a future base in any case still
46
+ // derives correctly.
47
+
48
+ /** Split an identifier (any case) into its lowercase words. */
49
+ function words(input: string): string[] {
50
+ return input
51
+ .replace(/([a-z0-9])([A-Z])/g, '$1 $2') // camelCase / PascalCase boundary
52
+ .replace(/[-_\s.]+/g, ' ') // param/snake/dot/space separators
53
+ .trim()
54
+ .toLowerCase()
55
+ .split(/\s+/)
56
+ .filter((w) => w !== '');
57
+ }
58
+
59
+ /** `dorfl` (lowercase words joined by `-`). */
60
+ export function paramCase(input: string): string {
61
+ return words(input).join('-');
62
+ }
63
+
64
+ /** `DORFL` (uppercase words joined by `_`). */
65
+ export function constantCase(input: string): string {
66
+ return words(input)
67
+ .map((w) => w.toUpperCase())
68
+ .join('_');
69
+ }
70
+
71
+ /**
72
+ * The derived brand surface. Every field is computed from {@link BASE}; none is
73
+ * an independent literal, so they can never drift apart.
74
+ */
75
+ export interface Brand {
76
+ /** The base identity string (paramCase): `dorfl`. */
77
+ readonly base: string;
78
+ /** The shared env-var prefix: `constantCase(base) + '_'` ⇒ `DORFL_`. */
79
+ readonly envPrefix: string;
80
+ /** The per-repo config filename: `.{paramCase(base)}.json` ⇒ `.dorfl.json`. */
81
+ readonly repoConfigFilename: string;
82
+ /** The workspaces-dir name (a dotfile dir): `.{paramCase(base)}` ⇒ `.dorfl`. */
83
+ readonly workdirName: string;
84
+ /** The per-job record filename: `.{paramCase(base)}-job.json` ⇒ `.dorfl-job.json`. */
85
+ readonly jobRecordFilename: string;
86
+ /** The config-dir name (under `~/.config/`): `paramCase(base)` ⇒ `dorfl`. */
87
+ readonly configDirName: string;
88
+ /** The binary / package name (paramCase): `dorfl`. */
89
+ readonly bin: string;
90
+ }
91
+
92
+ /** Derive the full {@link Brand} surface from one base string. */
93
+ export function deriveBrand(base: string): Brand {
94
+ const param = paramCase(base);
95
+ return {
96
+ base,
97
+ envPrefix: constantCase(base) + '_',
98
+ repoConfigFilename: `.${param}.json`,
99
+ workdirName: `.${param}`,
100
+ jobRecordFilename: `.${param}-job.json`,
101
+ configDirName: param,
102
+ bin: param,
103
+ };
104
+ }
105
+
106
+ /**
107
+ * The live brand surface for THIS project, derived from {@link BASE}. Import the
108
+ * fields you need (e.g. `brand.envPrefix`, `brand.workdirName`) instead of
109
+ * hardcoding the literal — that is the whole point of this module.
110
+ */
111
+ export const brand: Brand = deriveBrand(BASE);
@@ -0,0 +1,196 @@
1
+ /**
2
+ * The SINGLE owner of the buildable-task (and PRD-body) markdown SECTION SCHEMA
3
+ * (prd `centralize-buildable-task-renderer-shared-by-intake-and-promotion`, US
4
+ * #1/#4/#7). dorfl has TWO independent producers of a buildable task/PRD body —
5
+ * `intake.ts` (`renderBacklogTask`/`renderSpec`, a wrapper+fallback) and
6
+ * `triage-persist.ts` (`buildPromotedBody`, a structured renderer) — and until
7
+ * this module they each HAND-ROLLED the `## What to build` / `## Acceptance
8
+ * criteria` / `## Open questions` / `## Prompt` skeleton, so the schema could (and
9
+ * did) DRIFT apart silently (the promptless-promotion stuck-lock bug, see the
10
+ * origin observation
11
+ * `advance-promotion-builds-promptless-task-that-self-claims-stuck-2026-06-25`).
12
+ *
13
+ * This module renders only the BODY (the markdown AFTER the frontmatter fence) —
14
+ * the part both producers actually share. Each producer keeps its OWN frontmatter
15
+ * writer (intake stamps `issue:`/`originTrust:`; promotion stamps `needsAnswers:`/
16
+ * `blockedBy:`) and its OWN writer/integration mode (intake's branch+PR front
17
+ * door; promotion's triage-local CAS create) — only the section skeleton is
18
+ * centralized here.
19
+ *
20
+ * The two producers are ASYMMETRIC, and that asymmetry is expressed by the
21
+ * renderer's inputs rather than by two divergent bodies:
22
+ *
23
+ * - intake's DEFAULT-SCAFFOLD skeleton (used ONLY when the intake agent drafted
24
+ * no body) is `## What to build` + `## Acceptance criteria` + a thin default
25
+ * `## Prompt`. Reproduced by passing all three.
26
+ * - promotion's structured body is `## What to build` (the mechanism prose) +
27
+ * optional `## Open questions` + a `## Prompt` seeded (blockquoted) from the
28
+ * mechanism prose, and NO `## Acceptance criteria`. Reproduced by omitting
29
+ * `acceptanceCriteria` and passing the open-questions block + the seed prose.
30
+ *
31
+ * Symmetrically, {@link renderSpecBody} owns the FULL PRD section schema both PRD
32
+ * producers need: intake's default PRD scaffold is `## Problem Statement` +
33
+ * `## Solution` + `## User Stories` (reproduced by passing all three), while
34
+ * promotion's structured PRD body is `## Problem Statement` + optional
35
+ * `## Open questions` (reproduced by omitting `solution`/`userStories`). Each
36
+ * optional section is emitted only when its input is non-empty.
37
+ *
38
+ * `## Prompt` is TASK-ONLY: a PRD is not dispatched by `do`/`run`, so a PRD body
39
+ * carries none (the symmetric reason the task body MUST carry one — the consumer
40
+ * `extractPromptSection`/`resolveTask` in `prompt.ts` throws "has no '## Prompt'
41
+ * section" at dispatch time without it). {@link renderTaskBody} always emits a
42
+ * `## Prompt`; {@link renderSpecBody} never does.
43
+ *
44
+ * NOTE (extract-only): this module is a PURE ADDITION. Neither producer is rewired
45
+ * here — that is the two follow-on tasks (kept file-orthogonal so each proves its
46
+ * own output is byte-for-byte preserved). This task lands the renderer + its
47
+ * golden-shape test ONLY.
48
+ */
49
+
50
+ /** Blockquote a prompt SEED: each line gets a `> ` prefix (blank lines → `>`). */
51
+ function blockquote(seed: string): string {
52
+ return seed
53
+ .split('\n')
54
+ .map((line) => (line === '' ? '>' : `> ${line}`))
55
+ .join('\n');
56
+ }
57
+
58
+ export interface RenderTaskBodyInput {
59
+ /**
60
+ * The `## What to build` prose. For intake's default scaffold this is the task
61
+ * title; for promotion it is the observation's mechanism/fix prose. When empty,
62
+ * a placeholder keeps the section non-empty.
63
+ */
64
+ whatToBuild: string;
65
+ /**
66
+ * The `## Acceptance criteria` block (markdown, e.g. a `- [ ]` checklist).
67
+ * OMIT it (or pass empty) to drop the section entirely — promotion's structured
68
+ * body carries no acceptance section, intake's default scaffold does.
69
+ */
70
+ acceptanceCriteria?: string;
71
+ /**
72
+ * The `## Open questions` block (markdown). OMIT it (or pass empty) to drop the
73
+ * section — intake's default scaffold has none, a promoted observation carries
74
+ * its transcribed open questions here.
75
+ */
76
+ openQuestions?: string;
77
+ /**
78
+ * The `## Prompt` body, supplied UNQUOTED — the renderer blockquotes it (the
79
+ * `> `-prefixed shape `extractPromptSection` strips back off). This is the
80
+ * task-only dispatchability section; it is ALWAYS emitted (a placeholder seeds
81
+ * it when empty) so a rendered task never fails the missing-`## Prompt` guard.
82
+ */
83
+ prompt: string;
84
+ }
85
+
86
+ /**
87
+ * Render a buildable TASK body (the markdown AFTER the frontmatter fence). Emits,
88
+ * in order: `## What to build`, `## Acceptance criteria` (only when given),
89
+ * `## Open questions` (only when given), and ALWAYS `## Prompt` (blockquoted).
90
+ *
91
+ * The output passes `extractPromptSection`/`resolveTask` without the
92
+ * "has no '## Prompt' section" throw, because `## Prompt` is unconditional and
93
+ * never empty. The caller wraps this body with its own frontmatter.
94
+ *
95
+ * FENCE↔HEADING BOUNDARY: this renderer starts at its first heading with NO
96
+ * leading blank line — the caller's frontmatter serializer owns the single blank
97
+ * line between the closing `---` fence and this first heading (ratified in
98
+ * `docs/adr/frontmatter-owns-fence-to-heading-blank-line.md`). Do NOT add a
99
+ * leading blank here; that would reintroduce the fence-spacing drift class.
100
+ */
101
+ export function renderTaskBody(input: RenderTaskBodyInput): string {
102
+ const lines: string[] = [
103
+ '## What to build',
104
+ '',
105
+ input.whatToBuild.trim() === ''
106
+ ? '(no `## What to build` prose was supplied.)'
107
+ : input.whatToBuild.trim(),
108
+ '',
109
+ ];
110
+
111
+ const acceptance = (input.acceptanceCriteria ?? '').trim();
112
+ if (acceptance !== '') {
113
+ lines.push('## Acceptance criteria', '', acceptance, '');
114
+ }
115
+
116
+ const openQuestions = (input.openQuestions ?? '').trim();
117
+ if (openQuestions !== '') {
118
+ lines.push('## Open questions', '', openQuestions, '');
119
+ }
120
+
121
+ const seed =
122
+ input.prompt.trim() === ''
123
+ ? 'Build the task described above.'
124
+ : input.prompt.trim();
125
+ lines.push('## Prompt', '', blockquote(seed), '');
126
+
127
+ return lines.join('\n');
128
+ }
129
+
130
+ export interface RenderSpecBodyInput {
131
+ /**
132
+ * The `## Problem Statement` prose. For intake's default scaffold this is the
133
+ * issue-transform line; for promotion it is the observation's mechanism prose.
134
+ * When empty, a placeholder keeps the section non-empty.
135
+ */
136
+ problemStatement: string;
137
+ /**
138
+ * The `## Solution` prose (markdown). OMIT it (or pass empty) to drop the
139
+ * section — promotion's structured PRD body carries no Solution section, intake's
140
+ * default PRD scaffold does.
141
+ */
142
+ solution?: string;
143
+ /**
144
+ * The `## User Stories` block (markdown, e.g. a numbered list). OMIT it (or pass
145
+ * empty) to drop the section — promotion's structured PRD body carries no User
146
+ * Stories section, intake's default PRD scaffold does.
147
+ */
148
+ userStories?: string;
149
+ /**
150
+ * The `## Open questions` block (markdown). OMIT it (or pass empty) to drop the
151
+ * section. A PRD carries NO `## Prompt` (it is not dispatched).
152
+ */
153
+ openQuestions?: string;
154
+ }
155
+
156
+ /**
157
+ * Render a PRD body (the markdown AFTER the frontmatter fence). Emits, in the
158
+ * canonical order, `## Problem Statement`, then `## Solution`, `## User Stories`,
159
+ * and `## Open questions` (each only when its input is given), and NEVER a
160
+ * `## Prompt` — a PRD is a north-star doc, not a dispatchable task. The symmetric twin of
161
+ * {@link renderTaskBody}, owning the FULL SPEC section schema both producers need
162
+ * (intake's default scaffold supplies Problem Statement + Solution + User Stories;
163
+ * promotion's structured body supplies Problem Statement + optional Open
164
+ * questions) so the two artifact shapes cannot drift apart.
165
+ *
166
+ * FENCE↔HEADING BOUNDARY: same convention as {@link renderTaskBody} — no leading
167
+ * blank; the frontmatter serializer owns the `\n\n` after the closing `---` fence
168
+ * (see `docs/adr/frontmatter-owns-fence-to-heading-blank-line.md`).
169
+ */
170
+ export function renderSpecBody(input: RenderSpecBodyInput): string {
171
+ const lines: string[] = [
172
+ '## Problem Statement',
173
+ '',
174
+ input.problemStatement.trim() === ''
175
+ ? '(no `## Problem Statement` prose was supplied.)'
176
+ : input.problemStatement.trim(),
177
+ '',
178
+ ];
179
+
180
+ const solution = (input.solution ?? '').trim();
181
+ if (solution !== '') {
182
+ lines.push('## Solution', '', solution, '');
183
+ }
184
+
185
+ const userStories = (input.userStories ?? '').trim();
186
+ if (userStories !== '') {
187
+ lines.push('## User Stories', '', userStories, '');
188
+ }
189
+
190
+ const openQuestions = (input.openQuestions ?? '').trim();
191
+ if (openQuestions !== '') {
192
+ lines.push('## Open questions', '', openQuestions, '');
193
+ }
194
+
195
+ return lines.join('\n');
196
+ }