cloving 1.2.0 → 1.4.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 (752) hide show
  1. package/README.md +700 -331
  2. package/dist/src/agent-harness-shell.d.ts +13 -0
  3. package/dist/src/agent-harness-shell.js +93 -0
  4. package/dist/src/agent-harness-versions.d.ts +8 -0
  5. package/dist/src/agent-harness-versions.js +49 -0
  6. package/dist/src/agent-harnesses.d.ts +4 -0
  7. package/dist/src/agent-harnesses.js +13 -0
  8. package/dist/src/authority/command-wait-checks.d.ts +8 -0
  9. package/dist/src/authority/command-wait-checks.js +88 -0
  10. package/dist/src/authority/command-wait-results.d.ts +15 -0
  11. package/dist/src/authority/command-wait-results.js +73 -0
  12. package/dist/src/authority/command-wait-view.d.ts +21 -0
  13. package/dist/src/authority/command-wait-view.js +34 -0
  14. package/dist/src/authority/command-waits.d.ts +39 -0
  15. package/dist/src/authority/command-waits.js +97 -0
  16. package/dist/src/authority/commands.d.ts +1 -0
  17. package/dist/src/authority/commands.js +46 -5
  18. package/dist/src/authority/dispatch-decision.d.ts +8 -0
  19. package/dist/src/authority/dispatch-decision.js +26 -1
  20. package/dist/src/authority/effect-requests.js +6 -3
  21. package/dist/src/authority/effect-results.js +4 -2
  22. package/dist/src/authority/gate-reduction.d.ts +1 -0
  23. package/dist/src/authority/gate-reduction.js +18 -3
  24. package/dist/src/authority/gates.d.ts +2 -1
  25. package/dist/src/authority/gates.js +5 -1
  26. package/dist/src/authority/history-state.d.ts +2 -0
  27. package/dist/src/authority/history-state.js +13 -1
  28. package/dist/src/authority/instants.d.ts +1 -0
  29. package/dist/src/authority/instants.js +21 -0
  30. package/dist/src/authority/operations.js +1 -1
  31. package/dist/src/authority/reduction-state.d.ts +2 -0
  32. package/dist/src/authority/reduction-state.js +5 -0
  33. package/dist/src/authority/reduction.d.ts +1 -1
  34. package/dist/src/authority/reduction.js +30 -1
  35. package/dist/src/authority/status-input.d.ts +3 -1
  36. package/dist/src/authority/status.d.ts +3 -0
  37. package/dist/src/authority/status.js +28 -3
  38. package/dist/src/authority/stop-sequence.d.ts +1 -0
  39. package/dist/src/authority/stop-sequence.js +2 -1
  40. package/dist/src/authority/transitions.d.ts +7 -5
  41. package/dist/src/authority/transitions.js +13 -0
  42. package/dist/src/broker/actor/authority-delivery.js +1 -0
  43. package/dist/src/broker/actor/authority-queries.d.ts +9 -2
  44. package/dist/src/broker/actor/authority-queries.js +29 -5
  45. package/dist/src/broker/actor/authority-receipts.js +11 -1
  46. package/dist/src/broker/actor/authority-session.js +2 -2
  47. package/dist/src/broker/actor/authority-settings.js +4 -0
  48. package/dist/src/broker/actor/authority-upgrades.d.ts +19 -2
  49. package/dist/src/broker/actor/authority-upgrades.js +7 -2
  50. package/dist/src/broker/actor/delivery-intents.d.ts +2 -1
  51. package/dist/src/broker/actor/delivery-intents.js +6 -4
  52. package/dist/src/broker/actor/effect-delivery.d.ts +1 -1
  53. package/dist/src/broker/actor/effect-delivery.js +18 -2
  54. package/dist/src/broker/actor/effect-plan.js +11 -2
  55. package/dist/src/broker/actor/effect-queries.d.ts +5 -0
  56. package/dist/src/broker/actor/effect-queries.js +16 -1
  57. package/dist/src/broker/actor/effect-turn.js +2 -0
  58. package/dist/src/broker/actor/pin-check.js +1 -1
  59. package/dist/src/broker/actor/stop-plan.js +10 -4
  60. package/dist/src/broker/actor/stop-turn.d.ts +2 -0
  61. package/dist/src/broker/actor/stop-turn.js +24 -11
  62. package/dist/src/broker/actor/turn-draft.d.ts +1 -0
  63. package/dist/src/broker/actor/turn-draft.js +4 -0
  64. package/dist/src/broker/actor/turn-state.js +6 -2
  65. package/dist/src/broker/authority-admission.js +80 -7
  66. package/dist/src/broker/authority-restore.d.ts +2 -0
  67. package/dist/src/broker/authority-restore.js +36 -1
  68. package/dist/src/broker/command-wait-restore.d.ts +31 -0
  69. package/dist/src/broker/command-wait-restore.js +86 -0
  70. package/dist/src/broker/decision-restore.d.ts +1 -1
  71. package/dist/src/broker/decision-restore.js +5 -4
  72. package/dist/src/broker/effect-upgrade.d.ts +2 -0
  73. package/dist/src/broker/effect-upgrade.js +8 -2
  74. package/dist/src/broker/socket-address.d.ts +3 -1
  75. package/dist/src/broker/socket-address.js +2 -2
  76. package/dist/src/cli/arguments.d.ts +22 -11
  77. package/dist/src/cli/arguments.js +73 -104
  78. package/dist/src/cli/chat-stores.d.ts +2 -0
  79. package/dist/src/cli/chat-stores.js +113 -0
  80. package/dist/src/cli/client.d.ts +4 -1
  81. package/dist/src/cli/client.js +9 -3
  82. package/dist/src/cli/command-effects.d.ts +7 -0
  83. package/dist/src/cli/command-effects.js +39 -0
  84. package/dist/src/cli/command-requests.d.ts +17 -0
  85. package/dist/src/cli/command-requests.js +43 -0
  86. package/dist/src/cli/command-waits.d.ts +9 -0
  87. package/dist/src/cli/command-waits.js +51 -0
  88. package/dist/src/cli/commands.js +21 -41
  89. package/dist/src/cli/config-arguments.d.ts +11 -0
  90. package/dist/src/cli/config-arguments.js +59 -0
  91. package/dist/src/cli/config-command.d.ts +2 -0
  92. package/dist/src/cli/config-command.js +105 -0
  93. package/dist/src/cli/config-file.d.ts +3 -0
  94. package/dist/src/cli/config-file.js +52 -0
  95. package/dist/src/cli/config-lock.d.ts +7 -0
  96. package/dist/src/cli/config-lock.js +61 -0
  97. package/dist/src/cli/config-notice.d.ts +5 -0
  98. package/dist/src/cli/config-notice.js +46 -0
  99. package/dist/src/cli/doctor-github.d.ts +9 -0
  100. package/dist/src/cli/doctor-github.js +138 -0
  101. package/dist/src/cli/doctor-harness.d.ts +13 -0
  102. package/dist/src/cli/doctor-harness.js +242 -0
  103. package/dist/src/cli/doctor-local.d.ts +18 -0
  104. package/dist/src/cli/doctor-local.js +77 -0
  105. package/dist/src/cli/doctor-runtime.d.ts +15 -0
  106. package/dist/src/cli/doctor-runtime.js +176 -0
  107. package/dist/src/cli/doctor-service.d.ts +1 -0
  108. package/dist/src/cli/doctor-service.js +11 -0
  109. package/dist/src/cli/doctor-workflows.d.ts +6 -0
  110. package/dist/src/cli/doctor-workflows.js +50 -0
  111. package/dist/src/cli/doctor.d.ts +15 -0
  112. package/dist/src/cli/doctor.js +187 -0
  113. package/dist/src/cli/github-ci-progress.d.ts +8 -0
  114. package/dist/src/cli/github-ci-progress.js +83 -0
  115. package/dist/src/cli/github-retry.d.ts +6 -0
  116. package/dist/src/cli/github-retry.js +47 -0
  117. package/dist/src/cli/harness-probes.d.ts +24 -0
  118. package/dist/src/cli/harness-probes.js +183 -0
  119. package/dist/src/cli/harness-processes.d.ts +6 -0
  120. package/dist/src/cli/harness-processes.js +36 -0
  121. package/dist/src/cli/init-command.d.ts +9 -0
  122. package/dist/src/cli/init-command.js +52 -0
  123. package/dist/src/cli/init-prompt-command.d.ts +10 -0
  124. package/dist/src/cli/init-prompt-command.js +145 -0
  125. package/dist/src/cli/init-prompt.d.ts +35 -0
  126. package/dist/src/cli/init-prompt.js +74 -0
  127. package/dist/src/cli/init-selection.d.ts +13 -0
  128. package/dist/src/cli/init-selection.js +75 -0
  129. package/dist/src/cli/main.d.ts +9 -1
  130. package/dist/src/cli/main.js +69 -61
  131. package/dist/src/cli/mcp-server.d.ts +1 -0
  132. package/dist/src/cli/mcp-server.js +156 -0
  133. package/dist/src/cli/mcp-tools.d.ts +15 -0
  134. package/dist/src/cli/mcp-tools.js +80 -0
  135. package/dist/src/cli/phone-arguments.d.ts +14 -0
  136. package/dist/src/cli/phone-arguments.js +37 -0
  137. package/dist/src/cli/phone-client.d.ts +2 -0
  138. package/dist/src/cli/phone-client.js +32 -0
  139. package/dist/src/cli/phone-command.d.ts +13 -0
  140. package/dist/src/cli/phone-command.js +101 -0
  141. package/dist/src/cli/probe-command.d.ts +36 -0
  142. package/dist/src/cli/probe-command.js +59 -0
  143. package/dist/src/cli/project-settings.d.ts +4 -0
  144. package/dist/src/cli/project-settings.js +33 -0
  145. package/dist/src/cli/render.d.ts +2 -1
  146. package/dist/src/cli/render.js +57 -54
  147. package/dist/src/cli/report-ci-jobs.d.ts +23 -0
  148. package/dist/src/cli/report-ci-jobs.js +103 -0
  149. package/dist/src/cli/report-ci-usage.d.ts +9 -0
  150. package/dist/src/cli/report-ci-usage.js +185 -0
  151. package/dist/src/cli/report-ci.d.ts +13 -0
  152. package/dist/src/cli/report-ci.js +74 -0
  153. package/dist/src/cli/report-closures.d.ts +6 -0
  154. package/dist/src/cli/report-closures.js +97 -0
  155. package/dist/src/cli/report-flow.d.ts +7 -0
  156. package/dist/src/cli/report-flow.js +122 -0
  157. package/dist/src/cli/report-github-reader.d.ts +29 -0
  158. package/dist/src/cli/report-github-reader.js +157 -0
  159. package/dist/src/cli/report-github.d.ts +25 -0
  160. package/dist/src/cli/report-github.js +181 -0
  161. package/dist/src/cli/report-operator.d.ts +3 -0
  162. package/dist/src/cli/report-operator.js +40 -0
  163. package/dist/src/cli/report-ready.d.ts +3 -0
  164. package/dist/src/cli/report-ready.js +96 -0
  165. package/dist/src/cli/report-text.d.ts +9 -0
  166. package/dist/src/cli/report-text.js +33 -0
  167. package/dist/src/cli/report.d.ts +18 -0
  168. package/dist/src/cli/report.js +269 -0
  169. package/dist/src/cli/repository-arguments.d.ts +5 -0
  170. package/dist/src/cli/repository-arguments.js +34 -0
  171. package/dist/src/cli/runtime-arguments.d.ts +6 -1
  172. package/dist/src/cli/runtime-arguments.js +22 -2
  173. package/dist/src/cli/runtime-directory.d.ts +6 -2
  174. package/dist/src/cli/runtime-directory.js +72 -14
  175. package/dist/src/cli/schedule-arguments.d.ts +14 -0
  176. package/dist/src/cli/schedule-arguments.js +26 -0
  177. package/dist/src/cli/schedule-render.d.ts +22 -0
  178. package/dist/src/cli/schedule-render.js +73 -0
  179. package/dist/src/cli/terminal-text.d.ts +3 -0
  180. package/dist/src/cli/terminal-text.js +28 -0
  181. package/dist/src/cli/toolchain.d.ts +2 -0
  182. package/dist/src/cli/toolchain.js +22 -2
  183. package/dist/src/cli/usage-render.d.ts +6 -0
  184. package/dist/src/cli/usage-render.js +67 -1
  185. package/dist/src/cli/usage.d.ts +3 -3
  186. package/dist/src/cli/usage.js +119 -50
  187. package/dist/src/cli/watch-actions.d.ts +2 -0
  188. package/dist/src/cli/watch-actions.js +6 -6
  189. package/dist/src/cli/watch-board-view.d.ts +1 -1
  190. package/dist/src/cli/watch-board-view.js +27 -4
  191. package/dist/src/cli/watch-board.d.ts +4 -2
  192. package/dist/src/cli/watch-board.js +58 -35
  193. package/dist/src/cli/watch-card-forms.d.ts +1 -1
  194. package/dist/src/cli/watch-card-forms.js +13 -12
  195. package/dist/src/cli/watch-client.d.ts +1 -1
  196. package/dist/src/cli/watch-client.js +7 -11
  197. package/dist/src/cli/watch-header-view.d.ts +22 -0
  198. package/dist/src/cli/watch-header-view.js +104 -0
  199. package/dist/src/cli/watch-model.d.ts +4 -1
  200. package/dist/src/cli/watch-model.js +34 -15
  201. package/dist/src/cli/watch-page.js +57 -23
  202. package/dist/src/cli/watch-phases.d.ts +12 -3
  203. package/dist/src/cli/watch-phases.js +68 -11
  204. package/dist/src/cli/watch-phone-client.d.ts +1 -0
  205. package/dist/src/cli/watch-phone-client.js +84 -0
  206. package/dist/src/cli/watch-phone-view.d.ts +56 -0
  207. package/dist/src/cli/watch-phone-view.js +113 -0
  208. package/dist/src/cli/watch-phone.d.ts +5 -0
  209. package/dist/src/cli/watch-phone.js +53 -0
  210. package/dist/src/cli/watch-pr-board.js +1 -1
  211. package/dist/src/cli/watch-pr-command.d.ts +1 -0
  212. package/dist/src/cli/watch-pull-request.d.ts +3 -1
  213. package/dist/src/cli/watch-pull-request.js +22 -8
  214. package/dist/src/cli/watch-reads.d.ts +2 -0
  215. package/dist/src/cli/watch-reads.js +17 -16
  216. package/dist/src/cli/watch-render.d.ts +23 -1
  217. package/dist/src/cli/watch-run-input.d.ts +0 -1
  218. package/dist/src/cli/watch-run-input.js +0 -13
  219. package/dist/src/cli/watch-server.js +29 -11
  220. package/dist/src/cli/watch-turn.d.ts +4 -1
  221. package/dist/src/cli/watch-turn.js +37 -1
  222. package/dist/src/cli/watch-usage.js +5 -1
  223. package/dist/src/cli/watch-view.d.ts +4 -21
  224. package/dist/src/cli/watch-view.js +26 -118
  225. package/dist/src/cli.js +165 -28
  226. package/dist/src/command-settings.d.ts +16 -0
  227. package/dist/src/command-settings.js +42 -0
  228. package/dist/src/command-wait.d.ts +4 -0
  229. package/dist/src/command-wait.js +45 -0
  230. package/dist/src/configuration-change.d.ts +18 -0
  231. package/dist/src/configuration-change.js +76 -0
  232. package/dist/src/configuration-display.d.ts +21 -0
  233. package/dist/src/configuration-display.js +69 -0
  234. package/dist/src/configuration-schema.d.ts +58 -0
  235. package/dist/src/configuration-schema.js +163 -0
  236. package/dist/src/daemon/attachment-file.d.ts +6 -0
  237. package/dist/src/daemon/attachment-file.js +86 -0
  238. package/dist/src/daemon/attachments.d.ts +14 -0
  239. package/dist/src/daemon/attachments.js +17 -0
  240. package/dist/src/daemon/claude-recovery.d.ts +50 -0
  241. package/dist/src/daemon/claude-recovery.js +204 -0
  242. package/dist/src/daemon/claude-stream.d.ts +27 -0
  243. package/dist/src/daemon/claude-stream.js +63 -0
  244. package/dist/src/daemon/claude-turn.d.ts +18 -18
  245. package/dist/src/daemon/claude-turn.js +151 -105
  246. package/dist/src/daemon/claude-worker.d.ts +5 -4
  247. package/dist/src/daemon/claude-worker.js +149 -158
  248. package/dist/src/daemon/command-journal.d.ts +5 -0
  249. package/dist/src/daemon/command-journal.js +50 -0
  250. package/dist/src/daemon/command-process.d.ts +28 -0
  251. package/dist/src/daemon/command-process.js +164 -0
  252. package/dist/src/daemon/command-worker.d.ts +19 -0
  253. package/dist/src/daemon/command-worker.js +182 -0
  254. package/dist/src/daemon/cursor-stream.d.ts +4 -0
  255. package/dist/src/daemon/cursor-stream.js +154 -0
  256. package/dist/src/daemon/daemon-adapters.d.ts +60 -0
  257. package/dist/src/daemon/daemon-adapters.js +126 -0
  258. package/dist/src/daemon/daemon-loops.d.ts +16 -0
  259. package/dist/src/daemon/daemon-loops.js +41 -0
  260. package/dist/src/daemon/daemon.d.ts +2 -33
  261. package/dist/src/daemon/daemon.js +133 -131
  262. package/dist/src/daemon/declared-input.d.ts +3 -0
  263. package/dist/src/daemon/declared-input.js +9 -0
  264. package/dist/src/daemon/delivery-router.js +1 -1
  265. package/dist/src/daemon/gemini-stream.d.ts +4 -0
  266. package/dist/src/daemon/gemini-stream.js +129 -0
  267. package/dist/src/daemon/github-attach.d.ts +2 -0
  268. package/dist/src/daemon/github-attach.js +149 -0
  269. package/dist/src/daemon/github-ci-filters.d.ts +6 -0
  270. package/dist/src/daemon/github-ci-filters.js +138 -0
  271. package/dist/src/daemon/github-ci-rerun.d.ts +26 -0
  272. package/dist/src/daemon/github-ci-rerun.js +92 -0
  273. package/dist/src/daemon/github-ci-workflows.d.ts +10 -0
  274. package/dist/src/daemon/github-ci-workflows.js +148 -0
  275. package/dist/src/daemon/github-ci.js +109 -10
  276. package/dist/src/daemon/github-issue-methods.d.ts +2 -0
  277. package/dist/src/daemon/github-issue-methods.js +37 -2
  278. package/dist/src/daemon/github-merge-call.d.ts +4 -1
  279. package/dist/src/daemon/github-merge-call.js +10 -3
  280. package/dist/src/daemon/github-merge.js +58 -26
  281. package/dist/src/daemon/github-methods.js +22 -2
  282. package/dist/src/daemon/github-operation.d.ts +5 -0
  283. package/dist/src/daemon/github-operation.js +6 -0
  284. package/dist/src/daemon/github-retry.js +8 -44
  285. package/dist/src/daemon/github-worker.d.ts +4 -0
  286. package/dist/src/daemon/github-worker.js +6 -0
  287. package/dist/src/daemon/issue-queue.d.ts +1 -0
  288. package/dist/src/daemon/issue-queue.js +16 -34
  289. package/dist/src/daemon/notify-events.d.ts +6 -0
  290. package/dist/src/daemon/notify-events.js +84 -0
  291. package/dist/src/daemon/notify-journal.js +1 -1
  292. package/dist/src/daemon/notify-message.d.ts +4 -1
  293. package/dist/src/daemon/notify-message.js +36 -0
  294. package/dist/src/daemon/notify.d.ts +1 -1
  295. package/dist/src/daemon/notify.js +7 -78
  296. package/dist/src/daemon/opencode-stream.d.ts +5 -0
  297. package/dist/src/daemon/opencode-stream.js +87 -0
  298. package/dist/src/daemon/operation-journal.d.ts +1 -0
  299. package/dist/src/daemon/queue-status.d.ts +10 -0
  300. package/dist/src/daemon/queue-status.js +51 -0
  301. package/dist/src/daemon/resume-index-lock.d.ts +13 -0
  302. package/dist/src/daemon/resume-index-lock.js +160 -0
  303. package/dist/src/daemon/resume-worktree.d.ts +7 -0
  304. package/dist/src/daemon/resume-worktree.js +29 -0
  305. package/dist/src/daemon/retry-worktree.d.ts +18 -0
  306. package/dist/src/daemon/retry-worktree.js +139 -0
  307. package/dist/src/daemon/retrying-turn.d.ts +2 -10
  308. package/dist/src/daemon/retrying-turn.js +145 -141
  309. package/dist/src/daemon/schedule-control.d.ts +26 -0
  310. package/dist/src/daemon/schedule-control.js +110 -0
  311. package/dist/src/daemon/schedule-journal.d.ts +6 -0
  312. package/dist/src/daemon/schedule-journal.js +120 -0
  313. package/dist/src/daemon/text-output.d.ts +18 -0
  314. package/dist/src/daemon/text-output.js +44 -0
  315. package/dist/src/daemon/ticket-registration.d.ts +7 -14
  316. package/dist/src/daemon/ticket-registration.js +93 -114
  317. package/dist/src/daemon/turn-attempt-journal.d.ts +38 -0
  318. package/dist/src/daemon/turn-attempt-journal.js +136 -0
  319. package/dist/src/daemon/turn-attempts.d.ts +47 -0
  320. package/dist/src/daemon/turn-attempts.js +166 -0
  321. package/dist/src/daemon/turn-command.d.ts +10 -0
  322. package/dist/src/daemon/turn-command.js +33 -0
  323. package/dist/src/daemon/turn-report.d.ts +25 -0
  324. package/dist/src/daemon/turn-report.js +118 -0
  325. package/dist/src/daemon/work-tree.d.ts +11 -1
  326. package/dist/src/daemon/work-tree.js +35 -12
  327. package/dist/src/daemon/worker-profile.d.ts +8 -0
  328. package/dist/src/daemon/worker-profile.js +40 -0
  329. package/dist/src/daemon/workflow-generations.d.ts +32 -0
  330. package/dist/src/daemon/workflow-generations.js +57 -0
  331. package/dist/src/daemon/workflow-replay.d.ts +16 -0
  332. package/dist/src/daemon/workflow-replay.js +58 -0
  333. package/dist/src/daemon/workflow-schedules.d.ts +30 -0
  334. package/dist/src/daemon/workflow-schedules.js +238 -0
  335. package/dist/src/daemon/worktree-processes.d.ts +9 -0
  336. package/dist/src/daemon/worktree-processes.js +151 -0
  337. package/dist/src/decision-wait.d.ts +1 -0
  338. package/dist/src/decision-wait.js +3 -0
  339. package/dist/src/delivery-backoff.d.ts +1 -0
  340. package/dist/src/delivery-backoff.js +3 -0
  341. package/dist/src/doctor-report.d.ts +22 -0
  342. package/dist/src/doctor-report.js +63 -0
  343. package/dist/src/execution-pin.d.ts +5 -0
  344. package/dist/src/execution-pin.js +67 -4
  345. package/dist/src/grok-result.d.ts +12 -0
  346. package/dist/src/grok-result.js +61 -0
  347. package/dist/src/harness-defaults.d.ts +35 -0
  348. package/dist/src/harness-defaults.js +121 -0
  349. package/dist/src/harness-start.d.ts +15 -0
  350. package/dist/src/harness-start.js +37 -0
  351. package/dist/src/host/command-wait.d.ts +38 -0
  352. package/dist/src/host/command-wait.js +115 -0
  353. package/dist/src/host/decision-resume.d.ts +35 -0
  354. package/dist/src/host/decision-resume.js +86 -0
  355. package/dist/src/host/gate-bridge.d.ts +48 -0
  356. package/dist/src/host/gate-bridge.js +124 -0
  357. package/dist/src/host/run-wait.d.ts +26 -0
  358. package/dist/src/host/run-wait.js +37 -0
  359. package/dist/src/host/start-delivery.d.ts +6 -8
  360. package/dist/src/host/start-delivery.js +13 -18
  361. package/dist/src/host/step-bridge-host.d.ts +8 -20
  362. package/dist/src/host/step-bridge-host.js +65 -58
  363. package/dist/src/merge-request.d.ts +19 -0
  364. package/dist/src/merge-request.js +32 -0
  365. package/dist/src/operation-identity.d.ts +1 -0
  366. package/dist/src/operation-identity.js +4 -0
  367. package/dist/src/phone/canonical-json.d.ts +1 -0
  368. package/dist/src/phone/canonical-json.js +16 -0
  369. package/dist/src/phone/phone-link.d.ts +7 -0
  370. package/dist/src/phone/phone-link.js +21 -0
  371. package/dist/src/phone/qr-data.d.ts +8 -0
  372. package/dist/src/phone/qr-data.js +133 -0
  373. package/dist/src/phone/qr-matrix.d.ts +6 -0
  374. package/dist/src/phone/qr-matrix.js +175 -0
  375. package/dist/src/phone/qr-penalty.d.ts +3 -0
  376. package/dist/src/phone/qr-penalty.js +67 -0
  377. package/dist/src/phone/qr-picture.d.ts +5 -0
  378. package/dist/src/phone/qr-picture.js +24 -0
  379. package/dist/src/private-config.schema.json +303 -0
  380. package/dist/src/project-config.schema.json +105 -0
  381. package/dist/src/project-settings.d.ts +19 -0
  382. package/dist/src/project-settings.js +133 -0
  383. package/dist/src/queue-spend.d.ts +4 -0
  384. package/dist/src/queue-spend.js +21 -0
  385. package/dist/src/relay/answer-check.d.ts +24 -0
  386. package/dist/src/relay/answer-check.js +145 -0
  387. package/dist/src/relay/answer-inbox.d.ts +15 -0
  388. package/dist/src/relay/answer-inbox.js +173 -0
  389. package/dist/src/relay/daemon-keys.d.ts +16 -0
  390. package/dist/src/relay/daemon-keys.js +75 -0
  391. package/dist/src/relay/decision-check.d.ts +3 -0
  392. package/dist/src/relay/decision-check.js +77 -0
  393. package/dist/src/relay/decision-close.d.ts +6 -0
  394. package/dist/src/relay/decision-close.js +72 -0
  395. package/dist/src/relay/decision-envelopes.d.ts +29 -0
  396. package/dist/src/relay/decision-envelopes.js +93 -0
  397. package/dist/src/relay/decision-watch.d.ts +14 -0
  398. package/dist/src/relay/decision-watch.js +68 -0
  399. package/dist/src/relay/envelope-post.d.ts +8 -0
  400. package/dist/src/relay/envelope-post.js +71 -0
  401. package/dist/src/relay/envelope.d.ts +28 -0
  402. package/dist/src/relay/envelope.js +53 -0
  403. package/dist/src/relay/hpke.d.ts +25 -0
  404. package/dist/src/relay/hpke.js +108 -0
  405. package/dist/src/relay/pairing-checks.d.ts +42 -0
  406. package/dist/src/relay/pairing-checks.js +172 -0
  407. package/dist/src/relay/pairing-follow.d.ts +8 -0
  408. package/dist/src/relay/pairing-follow.js +95 -0
  409. package/dist/src/relay/pairing-session.d.ts +29 -0
  410. package/dist/src/relay/pairing-session.js +87 -0
  411. package/dist/src/relay/phone-delivery.d.ts +51 -0
  412. package/dist/src/relay/phone-delivery.js +139 -0
  413. package/dist/src/relay/phone-devices.d.ts +36 -0
  414. package/dist/src/relay/phone-devices.js +46 -0
  415. package/dist/src/relay/phone-inbox.d.ts +18 -0
  416. package/dist/src/relay/phone-inbox.js +17 -0
  417. package/dist/src/relay/phone-operations.d.ts +18 -0
  418. package/dist/src/relay/phone-operations.js +121 -0
  419. package/dist/src/relay/phone-outbox.d.ts +21 -0
  420. package/dist/src/relay/phone-outbox.js +25 -0
  421. package/dist/src/relay/phone-socket.d.ts +6 -0
  422. package/dist/src/relay/phone-socket.js +63 -0
  423. package/dist/src/relay/relay-control.d.ts +7 -0
  424. package/dist/src/relay/relay-control.js +24 -0
  425. package/dist/src/relay/relay-files.d.ts +2 -0
  426. package/dist/src/relay/relay-files.js +23 -0
  427. package/dist/src/relay/relay-heartbeat.d.ts +17 -0
  428. package/dist/src/relay/relay-heartbeat.js +81 -0
  429. package/dist/src/relay/relay-http.d.ts +14 -0
  430. package/dist/src/relay/relay-http.js +63 -0
  431. package/dist/src/relay/relay-registration.d.ts +15 -0
  432. package/dist/src/relay/relay-registration.js +63 -0
  433. package/dist/src/relay/relay-service.d.ts +28 -0
  434. package/dist/src/relay/relay-service.js +218 -0
  435. package/dist/src/relay/relay-store.d.ts +48 -0
  436. package/dist/src/relay/relay-store.js +131 -0
  437. package/dist/src/relay/sealed-post.d.ts +25 -0
  438. package/dist/src/relay/sealed-post.js +52 -0
  439. package/dist/src/relay.d.ts +1 -0
  440. package/dist/src/relay.js +8 -0
  441. package/dist/src/report-ci.d.ts +164 -0
  442. package/dist/src/report-ci.js +32 -0
  443. package/dist/src/report-effects.d.ts +15 -0
  444. package/dist/src/report-effects.js +212 -0
  445. package/dist/src/report-flow-types.d.ts +38 -0
  446. package/dist/src/report-flow-types.js +7 -0
  447. package/dist/src/report-flow.d.ts +43 -0
  448. package/dist/src/report-flow.js +193 -0
  449. package/dist/src/report-operator.d.ts +67 -0
  450. package/dist/src/report-operator.js +25 -0
  451. package/dist/src/report-quality.d.ts +221 -0
  452. package/dist/src/report-quality.js +94 -0
  453. package/dist/src/report-ready.d.ts +23 -0
  454. package/dist/src/report-ready.js +117 -0
  455. package/dist/src/report-statistics.d.ts +51 -0
  456. package/dist/src/report-statistics.js +106 -0
  457. package/dist/src/report.d.ts +712 -0
  458. package/dist/src/report.js +234 -0
  459. package/dist/src/repository-identity.d.ts +4 -0
  460. package/dist/src/repository-identity.js +4 -0
  461. package/dist/src/review-subject.d.ts +41 -0
  462. package/dist/src/review-subject.js +91 -0
  463. package/dist/src/run-wait.d.ts +23 -0
  464. package/dist/src/run-wait.js +20 -0
  465. package/dist/src/schedule-progress.d.ts +33 -0
  466. package/dist/src/schedule-progress.js +45 -0
  467. package/dist/src/service/active-tickets.d.ts +4 -0
  468. package/dist/src/service/active-tickets.js +49 -0
  469. package/dist/src/service/command-effects.d.ts +4 -0
  470. package/dist/src/service/command-effects.js +16 -0
  471. package/dist/src/service/command-waits.d.ts +34 -0
  472. package/dist/src/service/command-waits.js +86 -0
  473. package/dist/src/service/decision-handler.d.ts +4 -0
  474. package/dist/src/service/decision-handler.js +39 -4
  475. package/dist/src/service/expiry.js +2 -0
  476. package/dist/src/service/gateway.js +21 -4
  477. package/dist/src/service/queue-spend.d.ts +6 -0
  478. package/dist/src/service/queue-spend.js +68 -0
  479. package/dist/src/service/registry.d.ts +16 -3
  480. package/dist/src/service/registry.js +34 -3
  481. package/dist/src/service/replies.d.ts +16 -1
  482. package/dist/src/service/replies.js +23 -0
  483. package/dist/src/service/run-handlers.js +35 -56
  484. package/dist/src/service/run-metadata.d.ts +22 -0
  485. package/dist/src/service/run-metadata.js +138 -0
  486. package/dist/src/service/run-waits.d.ts +3 -0
  487. package/dist/src/service/run-waits.js +41 -0
  488. package/dist/src/service/service.d.ts +22 -2
  489. package/dist/src/service/service.js +29 -13
  490. package/dist/src/service/submission-handler.d.ts +0 -1
  491. package/dist/src/service/submission-handler.js +22 -36
  492. package/dist/src/service/worker-port.d.ts +1 -0
  493. package/dist/src/service/worker-port.js +9 -1
  494. package/dist/src/service/worker-totals.d.ts +2 -0
  495. package/dist/src/service/worker-totals.js +9 -24
  496. package/dist/src/step-bridge.d.ts +43 -0
  497. package/dist/src/steps/command-wait.d.ts +12 -0
  498. package/dist/src/steps/command-wait.js +26 -0
  499. package/dist/src/steps/merge-by-person.d.ts +2 -0
  500. package/dist/src/steps/merge-by-person.js +18 -0
  501. package/dist/src/steps/merge-when-green.d.ts +2 -0
  502. package/dist/src/steps/merge-when-green.js +62 -0
  503. package/dist/src/steps/open-decision-wait.d.ts +2 -0
  504. package/dist/src/steps/open-decision-wait.js +8 -0
  505. package/dist/src/steps/review-by-agent.d.ts +5 -0
  506. package/dist/src/steps/review-by-agent.js +124 -0
  507. package/dist/src/steps/review-by-person.d.ts +4 -0
  508. package/dist/src/steps/review-by-person.js +19 -0
  509. package/dist/src/steps/review-subject.d.ts +2 -0
  510. package/dist/src/steps/review-subject.js +11 -0
  511. package/dist/src/steps/run-command.d.ts +2 -0
  512. package/dist/src/steps/run-command.js +15 -0
  513. package/dist/src/steps/sleep.d.ts +3 -0
  514. package/dist/src/steps/sleep.js +19 -0
  515. package/dist/src/steps/wait-for-command.d.ts +3 -0
  516. package/dist/src/steps/wait-for-command.js +17 -0
  517. package/dist/src/steps/wait-for-decision.d.ts +2 -0
  518. package/dist/src/steps/wait-for-decision.js +71 -0
  519. package/dist/src/steps/wait-for-run.d.ts +5 -0
  520. package/dist/src/steps/wait-for-run.js +9 -0
  521. package/dist/src/storage/command-wait-rows.d.ts +30 -0
  522. package/dist/src/storage/command-wait-rows.js +96 -0
  523. package/dist/src/storage/decision-snapshots.d.ts +9 -1
  524. package/dist/src/storage/decision-snapshots.js +22 -2
  525. package/dist/src/storage/domain-changes.d.ts +2 -0
  526. package/dist/src/storage/domain-changes.js +3 -0
  527. package/dist/src/storage/domain-schema.d.ts +13 -1
  528. package/dist/src/storage/domain-schema.js +31 -4
  529. package/dist/src/storage/effect-schema.d.ts +1 -0
  530. package/dist/src/storage/effect-schema.js +5 -0
  531. package/dist/src/submission.d.ts +4 -0
  532. package/dist/src/submission.js +6 -2
  533. package/dist/src/testing-requests.d.ts +15 -0
  534. package/dist/src/testing-requests.js +93 -0
  535. package/dist/src/testing.d.ts +23 -0
  536. package/dist/src/testing.js +211 -0
  537. package/dist/src/ticket-status-stream.d.ts +9 -0
  538. package/dist/src/ticket-status-stream.js +94 -0
  539. package/dist/src/token-prices.d.ts +12 -4
  540. package/dist/src/token-prices.js +15 -2
  541. package/dist/src/turn-profile.d.ts +1 -0
  542. package/dist/src/turn-profile.js +8 -1
  543. package/dist/src/worker-usage.d.ts +17 -0
  544. package/dist/src/worker-usage.js +60 -0
  545. package/dist/src/workflow-admission.d.ts +5 -0
  546. package/dist/src/workflow-candidate.d.ts +8 -2
  547. package/dist/src/workflow-candidate.js +59 -6
  548. package/dist/src/workflow-contracts.d.ts +1 -0
  549. package/dist/src/workflow-contracts.js +9 -2
  550. package/dist/src/workflow-declaration.d.ts +21 -3
  551. package/dist/src/workflow-declaration.js +77 -9
  552. package/dist/src/workflow-discovery.d.ts +3 -13
  553. package/dist/src/workflow-discovery.js +5 -14
  554. package/dist/src/workflow-refusals.js +3 -1
  555. package/dist/src/workflow-schedule.d.ts +22 -0
  556. package/dist/src/workflow-schedule.js +53 -0
  557. package/dist/src/workflows.d.ts +12 -2
  558. package/dist/src/workflows.js +9 -1
  559. package/dist/tools/admit-workflow.d.ts +1 -0
  560. package/dist/tools/admit-workflow.js +18 -5
  561. package/dist/tools/doctor-adoption.d.ts +1 -0
  562. package/dist/tools/doctor-adoption.js +11 -0
  563. package/dist/tools/project-configuration.d.ts +4 -0
  564. package/dist/tools/project-configuration.js +47 -0
  565. package/dist/tools/red-green-command.d.ts +1 -0
  566. package/dist/tools/red-green-command.js +174 -0
  567. package/dist/tools/red-green-process.d.ts +10 -0
  568. package/dist/tools/red-green-process.js +59 -0
  569. package/dist/tools/self-host-processes.d.ts +3 -0
  570. package/dist/tools/self-host-processes.js +63 -33
  571. package/dist/tools/self-host-project.d.ts +4 -0
  572. package/dist/tools/self-host-project.js +42 -60
  573. package/dist/tools/self-host-runtime.d.ts +16 -0
  574. package/dist/tools/self-host-runtime.js +60 -0
  575. package/dist/tools/self-host-workflows.d.ts +1 -0
  576. package/dist/tools/self-host-workflows.js +36 -1
  577. package/dist/tools/self-host.js +128 -71
  578. package/dist/tools/template-command.d.ts +1 -0
  579. package/dist/tools/template-command.js +160 -0
  580. package/dist/tools/template-copy.d.ts +11 -0
  581. package/dist/tools/template-copy.js +130 -0
  582. package/dist/tools/template-files.d.ts +17 -0
  583. package/dist/tools/template-files.js +74 -0
  584. package/dist/tools/workflow-bundles.js +1 -0
  585. package/dist/tools/workflow-candidate-counts.d.ts +6 -2
  586. package/dist/tools/workflow-candidate-counts.js +31 -16
  587. package/dist/tools/workflow-candidate-fields.d.ts +5 -0
  588. package/dist/tools/workflow-candidate-fields.js +24 -0
  589. package/dist/tools/workflow-candidate-helper-counts.d.ts +10 -0
  590. package/dist/tools/workflow-candidate-helper-counts.js +129 -0
  591. package/dist/tools/workflow-candidate-program.d.ts +2 -0
  592. package/dist/tools/workflow-candidate-program.js +36 -8
  593. package/dist/tools/workflow-candidate-shape.d.ts +3 -0
  594. package/dist/tools/workflow-candidate-shape.js +90 -0
  595. package/dist/tools/workflow-candidate-source.js +92 -16
  596. package/dist/tools/workflow-candidate-syntax.d.ts +9 -3
  597. package/dist/tools/workflow-candidate-syntax.js +83 -109
  598. package/dist/tools/workflow-command.d.ts +1 -0
  599. package/dist/tools/workflow-command.js +142 -0
  600. package/dist/tools/workflow-folder-capture.d.ts +1 -0
  601. package/dist/tools/workflow-folder-capture.js +47 -2
  602. package/dist/tools/workflow-folders.d.ts +18 -3
  603. package/dist/tools/workflow-folders.js +60 -7
  604. package/dist/tools/workflow-test-hook.d.ts +7 -0
  605. package/dist/tools/workflow-test-hook.js +16 -0
  606. package/dist/tools/workflow-test-loader.d.ts +1 -0
  607. package/dist/tools/workflow-test-loader.js +10 -0
  608. package/package.json +60 -10
  609. package/templates/develop/README.md +90 -0
  610. package/templates/develop/develop/accept.ts +11 -0
  611. package/templates/develop/develop/flow-tests.ts +394 -0
  612. package/templates/develop/develop/local.ts +40 -0
  613. package/templates/develop/develop/option-tests.ts +174 -0
  614. package/templates/develop/develop/partial-choice.ts +29 -0
  615. package/templates/develop/develop/partial.ts +28 -0
  616. package/templates/develop/develop/pull.ts +156 -0
  617. package/templates/develop/develop/queue-partial.ts +39 -0
  618. package/templates/develop/develop/refusal-tests.ts +251 -0
  619. package/templates/develop/develop/report.ts +156 -0
  620. package/templates/develop/develop/round.ts +40 -0
  621. package/templates/develop/develop/scenarios.ts +87 -0
  622. package/templates/develop/develop/turn.ts +68 -0
  623. package/templates/develop/develop.declaration.json +24 -0
  624. package/templates/develop/develop.test.ts +287 -0
  625. package/templates/develop/develop.ts +30 -0
  626. package/templates/develop/template.json +153 -0
  627. package/templates/idea-to-issue/README.md +27 -0
  628. package/templates/idea-to-issue/idea-to-issue/effects.ts +52 -0
  629. package/templates/idea-to-issue/idea-to-issue/leave.ts +10 -0
  630. package/templates/idea-to-issue/idea-to-issue/next.ts +29 -0
  631. package/templates/idea-to-issue/idea-to-issue/post-person.ts +18 -0
  632. package/templates/idea-to-issue/idea-to-issue/post.ts +50 -0
  633. package/templates/idea-to-issue/idea-to-issue/queue.ts +27 -0
  634. package/templates/idea-to-issue/idea-to-issue/review.ts +42 -0
  635. package/templates/idea-to-issue/idea-to-issue/scenarios.ts +50 -0
  636. package/templates/idea-to-issue/idea-to-issue/turn.ts +40 -0
  637. package/templates/idea-to-issue/idea-to-issue.declaration.json +16 -0
  638. package/templates/idea-to-issue/idea-to-issue.test.ts +79 -0
  639. package/templates/idea-to-issue/idea-to-issue.ts +49 -0
  640. package/templates/idea-to-issue/template.json +81 -0
  641. package/templates/review-day/README.md +97 -0
  642. package/templates/review-day/review-day/critique.ts +58 -0
  643. package/templates/review-day/review-day/decision.ts +29 -0
  644. package/templates/review-day/review-day/facts.ts +69 -0
  645. package/templates/review-day/review-day/label.ts +29 -0
  646. package/templates/review-day/review-day/next.ts +28 -0
  647. package/templates/review-day/review-day/post.ts +27 -0
  648. package/templates/review-day/review-day/report.ts +98 -0
  649. package/templates/review-day/review-day/rules.ts +12 -0
  650. package/templates/review-day/review-day/scenarios.ts +76 -0
  651. package/templates/review-day/review-day/turn.ts +73 -0
  652. package/templates/review-day/review-day.declaration.json +16 -0
  653. package/templates/review-day/review-day.test.ts +362 -0
  654. package/templates/review-day/review-day.ts +37 -0
  655. package/templates/review-day/template.json +56 -0
  656. package/dist/src/chats/analysis-batches.d.ts +0 -42
  657. package/dist/src/chats/analysis-batches.js +0 -97
  658. package/dist/src/chats/analysis-checkpoint.d.ts +0 -29
  659. package/dist/src/chats/analysis-checkpoint.js +0 -31
  660. package/dist/src/chats/analysis-contract.d.ts +0 -80
  661. package/dist/src/chats/analysis-contract.js +0 -16
  662. package/dist/src/chats/analysis-data.d.ts +0 -3
  663. package/dist/src/chats/analysis-data.js +0 -85
  664. package/dist/src/chats/analysis-input.d.ts +0 -18
  665. package/dist/src/chats/analysis-input.js +0 -97
  666. package/dist/src/chats/analysis-links.d.ts +0 -2
  667. package/dist/src/chats/analysis-links.js +0 -25
  668. package/dist/src/chats/analysis-merge.d.ts +0 -16
  669. package/dist/src/chats/analysis-merge.js +0 -134
  670. package/dist/src/chats/analysis-prompt.d.ts +0 -18
  671. package/dist/src/chats/analysis-prompt.js +0 -42
  672. package/dist/src/chats/analysis-proposal.d.ts +0 -4
  673. package/dist/src/chats/analysis-proposal.js +0 -41
  674. package/dist/src/chats/analysis-provenance.d.ts +0 -4
  675. package/dist/src/chats/analysis-provenance.js +0 -99
  676. package/dist/src/chats/analysis-shape.d.ts +0 -4
  677. package/dist/src/chats/analysis-shape.js +0 -235
  678. package/dist/src/chats/analysis.d.ts +0 -3
  679. package/dist/src/chats/analysis.js +0 -42
  680. package/dist/src/chats/corpus-input.d.ts +0 -5
  681. package/dist/src/chats/corpus-input.js +0 -288
  682. package/dist/src/chats/destination.d.ts +0 -4
  683. package/dist/src/chats/destination.js +0 -96
  684. package/dist/src/chats/import.d.ts +0 -15
  685. package/dist/src/chats/import.js +0 -243
  686. package/dist/src/chats/input-file.d.ts +0 -3
  687. package/dist/src/chats/input-file.js +0 -32
  688. package/dist/src/chats/normalize.d.ts +0 -29
  689. package/dist/src/chats/normalize.js +0 -155
  690. package/dist/src/chats/previous-import.d.ts +0 -5
  691. package/dist/src/chats/previous-import.js +0 -34
  692. package/dist/src/chats/reader.d.ts +0 -21
  693. package/dist/src/chats/reader.js +0 -118
  694. package/dist/src/chats/redact-import.d.ts +0 -14
  695. package/dist/src/chats/redact-import.js +0 -141
  696. package/dist/src/chats/redaction.d.ts +0 -41
  697. package/dist/src/chats/redaction.js +0 -161
  698. package/dist/src/chats/reference-mapping.d.ts +0 -16
  699. package/dist/src/chats/reference-mapping.js +0 -153
  700. package/dist/src/chats/revision-input.d.ts +0 -3
  701. package/dist/src/chats/revision-input.js +0 -180
  702. package/dist/src/chats/revision.d.ts +0 -48
  703. package/dist/src/chats/revision.js +0 -94
  704. package/dist/src/chats/selection.d.ts +0 -25
  705. package/dist/src/chats/selection.js +0 -109
  706. package/dist/src/chats/source.d.ts +0 -23
  707. package/dist/src/chats/source.js +0 -135
  708. package/dist/src/chats/structure.d.ts +0 -57
  709. package/dist/src/chats/structure.js +0 -216
  710. package/dist/src/chats/workflow-generation-projection.d.ts +0 -8
  711. package/dist/src/chats/workflow-generation-projection.js +0 -75
  712. package/dist/src/chats/workflow-generation-source.d.ts +0 -25
  713. package/dist/src/chats/workflow-generation-source.js +0 -124
  714. package/dist/src/chats/workflow-generation-text.d.ts +0 -23
  715. package/dist/src/chats/workflow-generation-text.js +0 -74
  716. package/dist/src/chats/workflow-generation.d.ts +0 -69
  717. package/dist/src/chats/workflow-generation.js +0 -142
  718. package/dist/src/cli/watch-start-view.d.ts +0 -18
  719. package/dist/src/cli/watch-start-view.js +0 -77
  720. package/dist/src/daemon/analysis-launch.d.ts +0 -5
  721. package/dist/src/daemon/analysis-launch.js +0 -81
  722. package/dist/src/daemon/analysis-token.d.ts +0 -6
  723. package/dist/src/daemon/analysis-token.js +0 -88
  724. package/dist/src/daemon/analysis-worker.d.ts +0 -20
  725. package/dist/src/daemon/analysis-worker.js +0 -271
  726. package/dist/src/daemon/chats-batch-binding.d.ts +0 -23
  727. package/dist/src/daemon/chats-batch-binding.js +0 -99
  728. package/dist/src/daemon/chats-capture.d.ts +0 -18
  729. package/dist/src/daemon/chats-capture.js +0 -194
  730. package/dist/src/daemon/chats-checkpoints.d.ts +0 -41
  731. package/dist/src/daemon/chats-checkpoints.js +0 -186
  732. package/dist/src/daemon/chats-files.d.ts +0 -42
  733. package/dist/src/daemon/chats-files.js +0 -252
  734. package/dist/src/daemon/chats-follow-up.d.ts +0 -38
  735. package/dist/src/daemon/chats-follow-up.js +0 -180
  736. package/dist/src/daemon/chats-question.d.ts +0 -15
  737. package/dist/src/daemon/chats-question.js +0 -93
  738. package/dist/src/daemon/chats-worker.d.ts +0 -13
  739. package/dist/src/daemon/chats-worker.js +0 -201
  740. package/dist/src/steps/decision-gate.d.ts +0 -2
  741. package/dist/src/steps/decision-gate.js +0 -8
  742. package/dist/workflows/analyze-chats.d.ts +0 -15
  743. package/dist/workflows/analyze-chats.declaration.json +0 -22
  744. package/dist/workflows/analyze-chats.js +0 -250
  745. package/dist/workflows/develop-prd.d.ts +0 -7
  746. package/dist/workflows/develop-prd.js +0 -165
  747. package/dist/workflows/develop-ticket.d.ts +0 -9
  748. package/dist/workflows/develop-ticket.js +0 -207
  749. package/dist/workflows/issue-labels.d.ts +0 -16
  750. package/dist/workflows/issue-labels.js +0 -70
  751. package/dist/workflows/ticket-prompts.d.ts +0 -35
  752. package/dist/workflows/ticket-prompts.js +0 -143
@@ -0,0 +1,60 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { link, mkdir, readdir, rm, writeFile } from "node:fs/promises";
3
+ import { dirname, join } from "node:path";
4
+ import { readRetainedWorkflowBundle } from "./workflow-bundles.js";
5
+ export async function selectRuntimeDirectory(input) {
6
+ const { runtime, repository, legacyRuntime, adoptionRecord } = input;
7
+ if (legacyRuntime === undefined ||
8
+ adoptionRecord === undefined ||
9
+ runtime === legacyRuntime)
10
+ return { runtime, note: "" };
11
+ const directory = join(dirname(legacyRuntime), "workflow-bundles");
12
+ if (!(await belongsToRepository(directory, repository)))
13
+ return {
14
+ runtime,
15
+ note: `Legacy runtime ${legacyRuntime} was not adopted: retained bundles are absent, damaged or belong to another repository.`,
16
+ };
17
+ return { runtime: legacyRuntime, note: "", adoptionRecord };
18
+ }
19
+ export async function adoptRuntimeDirectory(input) {
20
+ const selected = await selectRuntimeDirectory(input);
21
+ const adoptionRecord = selected.adoptionRecord;
22
+ if (adoptionRecord === undefined)
23
+ return { runtime: selected.runtime, note: selected.note };
24
+ const { repository } = input;
25
+ const legacyRuntime = selected.runtime;
26
+ await mkdir(dirname(adoptionRecord), { recursive: true, mode: 0o700 });
27
+ const contents = JSON.stringify({
28
+ schemaVersion: 1,
29
+ repository,
30
+ runtimeDirectory: legacyRuntime,
31
+ });
32
+ const temporary = `${adoptionRecord}.${randomUUID()}.tmp`;
33
+ try {
34
+ await writeFile(temporary, contents, {
35
+ flag: "wx",
36
+ mode: 0o600,
37
+ flush: true,
38
+ });
39
+ await link(temporary, adoptionRecord);
40
+ }
41
+ finally {
42
+ await rm(temporary, { force: true });
43
+ }
44
+ return { runtime: legacyRuntime, note: "" };
45
+ }
46
+ async function belongsToRepository(directory, repository) {
47
+ try {
48
+ const ids = (await readdir(directory)).filter((id) => id !== ".history" && id !== "node_modules");
49
+ if (ids.length === 0)
50
+ return false;
51
+ for (const id of ids)
52
+ if ((await readRetainedWorkflowBundle({ directory, repository, id }))
53
+ .kind !== "available")
54
+ return false;
55
+ return true;
56
+ }
57
+ catch {
58
+ return false;
59
+ }
60
+ }
@@ -12,4 +12,5 @@ interface HostManifest {
12
12
  export declare function workflowFiles(directory: string): Promise<string[]>;
13
13
  export declare function workflowDeclarations(directory: string, manifests: Readonly<Record<string, HostManifest>>): Promise<readonly DeclaredWorkflow[]>;
14
14
  export declare function workflowManifests(compiled: WorkflowManifest, declarations?: readonly DeclaredWorkflow[]): Readonly<Record<string, HostManifest>>;
15
+ export declare function workflowBundleLoader(): string;
15
16
  export {};
@@ -6,7 +6,8 @@ export async function workflowFiles(directory) {
6
6
  return entries
7
7
  .filter((entry) => entry.isFile() &&
8
8
  /\.(?:ts|js)$/.test(entry.name) &&
9
- !entry.name.endsWith(".d.ts"))
9
+ !entry.name.endsWith(".d.ts") &&
10
+ !entry.name.endsWith(".test.ts"))
10
11
  .map((entry) => entry.name)
11
12
  .sort();
12
13
  }
@@ -76,3 +77,37 @@ export function workflowManifests(compiled, declarations = []) {
76
77
  });
77
78
  }));
78
79
  }
80
+ export function workflowBundleLoader() {
81
+ return `
82
+ import { AsyncLocalStorage } from "node:async_hooks";
83
+ import { pathToFileURL } from "node:url";
84
+ const bundleRegistries = new AsyncLocalStorage();
85
+ const registryKeys = ["@workflow/core//registeredSteps", "workflow-class-registry"].map(Symbol.for);
86
+ for (const key of registryKeys) {
87
+ let current = globalThis[key] ?? new Map();
88
+ Object.defineProperty(globalThis, key, {
89
+ configurable: true,
90
+ get: () => bundleRegistries.getStore()?.get(key) ?? current,
91
+ set: (value) => {
92
+ const scope = bundleRegistries.getStore();
93
+ if (scope === undefined) current = value;
94
+ else scope.set(key, value);
95
+ },
96
+ });
97
+ }
98
+ const loadedBundles = new Map();
99
+ const loadWorkflowBundle = (directory) => {
100
+ const known = loadedBundles.get(directory);
101
+ if (known !== undefined) return known;
102
+ const scope = new Map(registryKeys.map((key) => [key, new Map()]));
103
+ const loaded = bundleRegistries.run(scope, async () => {
104
+ const workflows = await import(pathToFileURL(directory + "/artifacts/client.mjs").href);
105
+ const { POST } = await import(pathToFileURL(directory + "/artifacts/flow.mjs").href);
106
+ if (typeof POST !== "function") throw new Error("pinned-workflow-unavailable");
107
+ return { workflows, handler: (request) => bundleRegistries.run(scope, () => POST(request)) };
108
+ });
109
+ loadedBundles.set(directory, loaded);
110
+ return loaded;
111
+ };
112
+ `;
113
+ }
@@ -1,77 +1,75 @@
1
+ import { turnHarness, harnessDefaults, nativeHarness, } from "../src/harness-defaults.js";
2
+ import { absoluteWorkflowFolder } from "../src/project-settings.js";
3
+ import { projectConfiguration, projectRoot, topLevel, } from "./project-configuration.js";
1
4
  import { isProfilesFile } from "../src/turn-profile.js";
5
+ import { parseCommands, parseCommandSeconds, } from "../src/command-settings.js";
2
6
  import { parseFallbackModels, parseTokenPrices, } from "../src/token-prices.js";
3
- import { execFileSync } from "node:child_process";
4
- import { readFile, realpath, writeFile } from "node:fs/promises";
7
+ import { readFile, writeFile } from "node:fs/promises";
5
8
  import { homedir } from "node:os";
6
9
  import { dirname, extname, join, resolve } from "node:path";
7
10
  import { pathToFileURL } from "node:url";
8
11
  import { preparedProject, } from "./self-host-project.js";
9
12
  import { selfUpdateMilliseconds } from "./self-update-host.js";
10
13
  import { hostedPrograms } from "./self-host-processes.js";
14
+ import { workflowBundleLoader } from "./self-host-workflows.js";
15
+ import { adoptRuntimeDirectory } from "./self-host-runtime.js";
16
+ import { parseSchedulesSetting } from "../src/workflow-schedule.js";
17
+ import { checkSubmission } from "../src/submission.js";
11
18
  const product = resolve(import.meta.dirname, "..");
12
19
  const flags = process.argv.slice(2);
13
20
  function flag(name) {
14
- const index = flags.lastIndexOf(name);
15
- return index === -1 ? undefined : flags[index + 1];
16
- }
17
- function topLevel(given) {
18
- try {
19
- return execFileSync("git", ["-C", given, "rev-parse", "--show-toplevel"], {
20
- encoding: "utf8",
21
- stdio: ["ignore", "pipe", "ignore"],
22
- }).trim();
23
- }
24
- catch {
25
- return given;
26
- }
21
+ const index = flags.findLastIndex((argument) => argument === name || argument.startsWith(`${name}=`));
22
+ const argument = flags[index];
23
+ return argument === name
24
+ ? flags[index + 1]
25
+ : argument?.slice(name.length + 1);
27
26
  }
28
27
  const runtimeArgument = flag("--runtime");
29
28
  if (runtimeArgument === undefined)
30
29
  throw new Error("The start program needs --runtime. Use: cloving start");
31
- const runtime = resolve(runtimeArgument);
30
+ const repository = await projectRoot(flag("--repository") ?? process.cwd());
31
+ const configuration = await projectConfiguration(repository, process.env);
32
+ const environment = configuration.environment;
33
+ const selectedRuntime = await adoptRuntimeDirectory({
34
+ runtime: resolve(runtimeArgument),
35
+ repository,
36
+ legacyRuntime: flag("--legacy-runtime"),
37
+ adoptionRecord: flag("--adoption-record"),
38
+ });
39
+ const runtime = selectedRuntime.runtime;
32
40
  const directory = dirname(runtime);
33
- const repository = await realpath(topLevel(resolve(flag("--repository") ?? process.cwd())));
34
41
  const updateMilliseconds = await selfUpdateMilliseconds({
35
- seconds: process.env["CLOVING_SELF_UPDATE_SECONDS"],
42
+ seconds: environment["CLOVING_SELF_UPDATE_SECONDS"],
36
43
  repository,
37
44
  product: extname(import.meta.filename) === ".ts" ? topLevel(product) : product,
38
45
  });
39
46
  const client = flag("--client") ?? "cloving";
40
47
  const project = join(directory, "project");
41
- const concurrency = Number(process.env["CLOVING_HOST_BOUND"] ?? "8");
42
- const leaseText = process.env["CLOVING_OWNERSHIP_LEASE_SECONDS"];
48
+ const concurrency = Number(environment["CLOVING_HOST_BOUND"] ?? "8");
49
+ const leaseText = environment["CLOVING_OWNERSHIP_LEASE_SECONDS"];
43
50
  const leaseSeconds = leaseText === undefined ? undefined : Number(leaseText);
44
- const defaultCommand = [
45
- "claude",
46
- "-p",
47
- "--output-format",
48
- "stream-json",
49
- "--verbose",
50
- "--permission-mode",
51
- "acceptEdits",
52
- "--allowedTools",
53
- "Bash,Read,Edit,Write,Glob,Grep,WebSearch,WebFetch",
54
- "--max-budget-usd",
55
- "5",
56
- ];
57
- const defaultCodexCommand = [
58
- "codex",
59
- "exec",
60
- "--json",
61
- "--dangerously-bypass-approvals-and-sandbox",
62
- "--skip-git-repo-check",
63
- "-",
64
- ];
65
51
  function selectedWorker() {
66
- const worker = process.env["CLOVING_WORKER"] ?? "claude";
67
- if (worker === "claude" || worker === "codex")
68
- return worker;
69
- throw new Error(`The daemon did not start: invalid-worker: ${worker}`);
52
+ return checkedWorker(environment["CLOVING_WORKER"] ?? "claude");
53
+ }
54
+ function checkedWorker(name) {
55
+ try {
56
+ return turnHarness({
57
+ worker: name,
58
+ ...(configuration.harness === undefined
59
+ ? {}
60
+ : { harness: configuration.harness }),
61
+ }).worker;
62
+ }
63
+ catch (error) {
64
+ throw new Error(`The daemon did not start: harness-no-worker: ${name}`, {
65
+ cause: error,
66
+ });
67
+ }
70
68
  }
71
69
  async function profilesFile() {
72
- const path = process.env["CLOVING_PROFILES"];
70
+ const path = environment["CLOVING_PROFILES"];
73
71
  if (path === undefined)
74
- return {};
72
+ return configuration.profiles;
75
73
  try {
76
74
  const value = JSON.parse(await readFile(path, "utf8"));
77
75
  if (isProfilesFile(value))
@@ -83,17 +81,28 @@ async function profilesFile() {
83
81
  throw new Error("The daemon did not start: invalid-profiles");
84
82
  }
85
83
  function queueLanes() {
86
- const value = process.env["CLOVING_QUEUE_LANES"];
84
+ const value = environment["CLOVING_QUEUE_LANES"];
87
85
  if (value === undefined)
88
86
  return 1;
89
87
  if (!/^[1-4]$/.test(value))
90
88
  throw new Error("The daemon did not start: invalid-queue-lanes");
91
- if (process.env["CLOVING_QUEUE_SECONDS"] === undefined)
89
+ if (environment["CLOVING_QUEUE_SECONDS"] === undefined)
92
90
  throw new Error("The daemon did not start: queue-lanes-needs-queue");
93
91
  return Number(value);
94
92
  }
95
- function queueInterval(commands) {
96
- const value = process.env["CLOVING_QUEUE_SECONDS"];
93
+ function queueSpendLimit() {
94
+ const value = environment["CLOVING_QUEUE_DAILY_SPEND_USD"];
95
+ if (value === undefined)
96
+ return undefined;
97
+ const limit = Number(value);
98
+ if (!Number.isFinite(limit) || limit <= 0)
99
+ throw new Error("The daemon did not start: invalid-queue-spend-limit");
100
+ if (environment["CLOVING_QUEUE_SECONDS"] === undefined)
101
+ throw new Error("The daemon did not start: queue-spend-limit-needs-queue");
102
+ return limit;
103
+ }
104
+ function queueInterval() {
105
+ const value = environment["CLOVING_QUEUE_SECONDS"];
97
106
  if (value === undefined)
98
107
  return undefined;
99
108
  const seconds = Number(value);
@@ -102,14 +111,10 @@ function queueInterval(commands) {
102
111
  seconds < 10 ||
103
112
  seconds > 3600)
104
113
  throw new Error("The daemon did not start: invalid-queue-seconds");
105
- if (!commands.nextCommand?.length)
106
- throw new Error("The daemon did not start: queue-needs-next-command");
107
- if (!commands.ticketCommand?.length)
108
- throw new Error("The daemon did not start: queue-needs-ticket-command");
109
114
  return seconds * 1000;
110
115
  }
111
116
  function listed(name) {
112
- const given = process.env[name];
117
+ const given = environment[name];
113
118
  if (given === undefined)
114
119
  return undefined;
115
120
  const list = JSON.parse(given);
@@ -121,6 +126,12 @@ function source(file) {
121
126
  return JSON.stringify(pathToFileURL(join(product, file.replace(/\.ts$/, extname(import.meta.filename)))).href);
122
127
  }
123
128
  async function launchers(commands, workflows) {
129
+ const queueEnabled = commands.queueMilliseconds !== undefined &&
130
+ workflows.declarations.some((declaration) => declaration.queue === true);
131
+ if (queueEnabled && !commands.nextCommand?.length)
132
+ throw new Error("The daemon did not start: queue-needs-next-command");
133
+ if (queueEnabled && !commands.ticketCommand?.length)
134
+ throw new Error("The daemon did not start: queue-needs-ticket-command");
124
135
  const settings = {
125
136
  ...commands,
126
137
  directory,
@@ -135,73 +146,119 @@ await import("./main.mjs");
135
146
  await writeFile(join(project, "main.mjs"), `import * as workflows from "./artifacts/client.mjs";
136
147
  import { POST } from "./artifacts/flow.mjs";
137
148
  import { startDaemon } from ${source("src/daemon/daemon.ts")};
138
- const opening = await startDaemon({ ...JSON.parse(${JSON.stringify(JSON.stringify(settings))}), workflows, handler: POST });
149
+ ${workflowBundleLoader()}
150
+ const opening = await startDaemon({ ...JSON.parse(${JSON.stringify(JSON.stringify(settings))}), workflows, handler: POST, loadBundle: loadWorkflowBundle });
139
151
  if (opening.kind !== "started") {
140
152
  process.stderr.write("The daemon did not start: " + opening.reason + ": " + opening.detail + "\\n");
141
153
  process.exit(1);
142
154
  }
143
- process.stdout.write(${JSON.stringify(guide())});
155
+ process.stdout.write(${JSON.stringify(guide(workflows))});
144
156
  const stop = async () => { await opening.daemon.close(); process.exit(0); };
145
157
  process.once("SIGINT", stop);
146
158
  process.once("SIGTERM", stop);
147
159
  `);
148
160
  }
149
- function guide() {
161
+ function runCommand(declaration) {
162
+ const { workflowId, input } = declaration;
163
+ for (const [field, value, argument] of [
164
+ ["ticket", "ticket-id", "--ticket <ticket-id>"],
165
+ ["prompt", "task text", '--prompt "<text>"'],
166
+ ]) {
167
+ const checked = checkSubmission(input, {
168
+ workflowId,
169
+ source: field,
170
+ submission: { [field]: value },
171
+ });
172
+ if (checked.kind === "valid")
173
+ return ` ${client} run ${workflowId} ${argument}`;
174
+ }
175
+ return ` ${client} run ${workflowId} --input <json-file>`;
176
+ }
177
+ function guide(workflows) {
150
178
  return [
151
179
  "Cloving runs. Stop it with Control-C.",
152
180
  `Repository: ${repository}`,
181
+ `Runtime directory: ${runtime}`,
153
182
  `Work trees: ${join(directory, "worktrees")}`,
183
+ ...(selectedRuntime.note === "" ? [] : [selectedRuntime.note]),
184
+ ...Object.entries(configuration.sources).map(([field, source]) => `${field}: ${source}`),
185
+ ...workflows.workflowRefusals.map((refusal) => `Refused workflow ${refusal.scope} ${refusal.label}: ${refusal.codes.join(", ")}`),
154
186
  "Commands for a second terminal:",
155
- ` ${client} run develop-ticket --ticket <ticket-id>`,
156
- ` ${client} run develop-issue --ticket <ticket-id>`,
157
- ` ${client} run develop-prompt --prompt "<the text of the task>"`,
158
- ` ${client} run develop-prd --prompt "<the idea>"`,
187
+ ...(workflows.declarations.length === 0
188
+ ? ["No workflow. Run: cloving init"]
189
+ : workflows.declarations.map(runCommand)),
159
190
  ` ${client} status`,
160
191
  ` ${client} questions`,
161
192
  ` ${client} watch`,
162
193
  "",
163
194
  ].join("\n");
164
195
  }
165
- const tokenPrices = parseTokenPrices(process.env["CLOVING_TOKEN_PRICES"]);
166
- const fallbackModels = parseFallbackModels(process.env["CLOVING_FALLBACK_MODELS"]);
196
+ const tokenPrices = parseTokenPrices(environment["CLOVING_TOKEN_PRICES"]);
197
+ const commands = parseCommands(environment["CLOVING_COMMANDS"]);
198
+ const commandSeconds = parseCommandSeconds(environment["CLOVING_COMMAND_SECONDS"]);
199
+ const fallbackModels = parseFallbackModels(environment["CLOVING_FALLBACK_MODELS"]);
167
200
  const profiles = await profilesFile();
201
+ const schedules = parseSchedulesSetting(environment["CLOVING_SCHEDULES"]);
168
202
  const worker = selectedWorker();
169
- const command = worker === "codex"
170
- ? (listed("CLOVING_CODEX_COMMAND") ?? defaultCodexCommand)
171
- : (listed("CLOVING_CLAUDE_COMMAND") ?? defaultCommand);
203
+ function nativeCommands() {
204
+ const names = new Set([
205
+ worker,
206
+ ...Object.values(profiles).map((profile) => checkedWorker(profile.harness ?? worker)),
207
+ ]);
208
+ return Object.fromEntries([...names].filter(nativeHarness).flatMap((name) => {
209
+ const variable = harnessDefaults(name).variable;
210
+ const command = variable === undefined ? undefined : listed(variable);
211
+ return command === undefined ? [] : [[name, command]];
212
+ }));
213
+ }
214
+ const workerCommands = nativeCommands();
215
+ const harness = configuration.harness ?? {};
216
+ const command = turnHarness({ worker, workerCommands, harness }).command;
172
217
  const nextCommand = listed("CLOVING_NEXT_COMMAND");
173
218
  const ticketCommand = listed("CLOVING_TICKET_COMMAND");
219
+ const queueDailySpendLimitUsd = queueSpendLimit();
174
220
  const lanes = queueLanes();
175
- const queueMilliseconds = queueInterval({ nextCommand, ticketCommand });
221
+ const queueMilliseconds = queueInterval();
176
222
  const manifests = await preparedProject({
177
223
  product,
178
224
  project,
179
225
  repository,
180
226
  home: homedir(),
181
- xdgConfigHome: process.env["XDG_CONFIG_HOME"],
227
+ xdgConfigHome: environment["XDG_CONFIG_HOME"],
228
+ userFolder: absoluteWorkflowFolder(environment["CLOVING_WORKFLOW_FOLDER"]),
182
229
  });
183
230
  await launchers({
231
+ commands,
232
+ commandSeconds,
233
+ schedules,
184
234
  tokenPrices,
185
235
  fallbackModels,
186
236
  worker,
237
+ workerCommands,
238
+ harness,
239
+ shell: environment["SHELL"] ?? "/bin/sh",
187
240
  profiles,
188
241
  command,
189
242
  ticketCommand,
190
243
  nextCommand,
191
244
  queueMilliseconds,
192
245
  queueLanes: lanes,
246
+ queueDailySpendLimitUsd,
193
247
  resetQueue: flags.includes("--reset-queue"),
194
248
  notifyCommand: listed("CLOVING_NOTIFY_COMMAND"),
195
249
  githubCommand: listed("CLOVING_GH_COMMAND"),
250
+ requiredChecks: listed("CLOVING_REQUIRED_CHECKS") ?? null,
196
251
  checkCommand: listed("CLOVING_CHECK_COMMAND"),
197
252
  privateTexts: listed("CLOVING_PRIVATE_TEXTS"),
198
253
  }, manifests);
199
254
  process.exitCode = await hostedPrograms({
255
+ environment,
200
256
  project,
201
257
  product,
202
258
  runtime,
203
259
  directory,
204
260
  repository,
205
261
  updateMilliseconds,
206
- watchPort: process.env["CLOVING_WATCH_PORT"] ?? "3663",
262
+ watchPort: environment["CLOVING_WATCH_PORT"] ?? "3663",
263
+ phoneRelay: environment["CLOVING_PHONE_RELAY"] ?? "on",
207
264
  });
@@ -0,0 +1 @@
1
+ export declare function templateCommand(argumentsList: readonly string[]): Promise<number>;
@@ -0,0 +1,160 @@
1
+ import { readdir, readFile, stat } from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import { dirname, join } from "node:path";
4
+ import { parseArgs } from "node:util";
5
+ import { absoluteWorkflowFolder } from "../src/project-settings.js";
6
+ import { record } from "../src/protocol.js";
7
+ import { isCandidateDeclaration } from "../src/workflow-candidate.js";
8
+ import { projectConfiguration, projectRoot } from "./project-configuration.js";
9
+ import { copyTemplate } from "./template-copy.js";
10
+ import { exportedFunctions, readTemplate, templateList, templateRoot, } from "./template-files.js";
11
+ import { userLocation } from "./workflow-folders.js";
12
+ const usage = "Usage: cloving templates list [--json]\n cloving templates show <name> [--json]\n cloving templates copy <name> [--id <workflow-id>] [--json] [--repository <directory>]\n";
13
+ function invocation(argumentsList) {
14
+ const { values, positionals } = parseArgs({
15
+ args: [...argumentsList],
16
+ allowPositionals: true,
17
+ options: {
18
+ json: { type: "boolean" },
19
+ id: { type: "string" },
20
+ repository: { type: "string" },
21
+ help: { type: "boolean", short: "h" },
22
+ },
23
+ });
24
+ const [command, name, ...extra] = positionals;
25
+ if (values.help === true)
26
+ return { ...values, command: "help", name: "" };
27
+ if (!["list", "show", "copy"].includes(command ?? ""))
28
+ throw new Error("unknown-command");
29
+ if (extra.length > 0 || (command === "list") !== (name === undefined))
30
+ throw new Error("unexpected-argument");
31
+ if (command !== "copy" && (values.id !== undefined || values.repository))
32
+ throw new Error("unexpected-option");
33
+ return { ...values, command, name: name ?? "" };
34
+ }
35
+ export async function templateCommand(argumentsList) {
36
+ let selected;
37
+ try {
38
+ selected = invocation(argumentsList);
39
+ }
40
+ catch {
41
+ process.stderr.write("invalid-invocation: " + usage);
42
+ return 2;
43
+ }
44
+ if (selected.help) {
45
+ process.stdout.write(usage);
46
+ return 0;
47
+ }
48
+ try {
49
+ const root = templateRoot();
50
+ const json = selected.json === true;
51
+ if (selected.command === "list")
52
+ return await listed(root, { json });
53
+ if (selected.command === "show")
54
+ return await shown(root, { name: selected.name, json });
55
+ return await copied(root, {
56
+ name: selected.name,
57
+ id: selected.id ?? selected.name,
58
+ json,
59
+ repository: selected.repository ?? process.cwd(),
60
+ });
61
+ }
62
+ catch (error) {
63
+ process.stderr.write((error instanceof Error ? error.message : "template-command-failed") +
64
+ "\n");
65
+ return 1;
66
+ }
67
+ }
68
+ async function listed(root, input) {
69
+ const templates = await templateList(root);
70
+ if (input.json)
71
+ process.stdout.write(JSON.stringify(templates) + "\n");
72
+ else
73
+ for (const template of templates)
74
+ process.stdout.write(`${template.name}: ${template.summary} (${String(template.points)} decision points)\n`);
75
+ return 0;
76
+ }
77
+ async function shown(root, input) {
78
+ const template = await readTemplate(root, input.name);
79
+ if (input.json) {
80
+ process.stdout.write(JSON.stringify({
81
+ template: template.description,
82
+ files: template.files,
83
+ }) + "\n");
84
+ return 0;
85
+ }
86
+ process.stdout.write(`${template.name}: ${String(template.description["summary"])}\n${pointText(template.points)}Files:\n${template.files.map((file) => ` ${file}\n`).join("")}`);
87
+ return 0;
88
+ }
89
+ async function copied(root, input) {
90
+ const repository = await projectRoot(input.repository);
91
+ const folder = join(repository, ".cloving", "workflows");
92
+ const folders = [folder, await userFolder(repository)];
93
+ const packageRoot = dirname(root);
94
+ const takenNames = await exportedFunctions([
95
+ join(packageRoot, "workflows"),
96
+ join(packageRoot, "dist", "workflows"),
97
+ ...folders,
98
+ ]);
99
+ const result = await copyTemplate({ ...input, root, folder, takenNames });
100
+ const queued = (await Promise.all(folders.map(queuedIn))).flat().sort();
101
+ if (input.json)
102
+ process.stdout.write(JSON.stringify({
103
+ workflowId: input.id,
104
+ template: input.name,
105
+ files: result.files,
106
+ queueWorkflows: queued,
107
+ }) + "\n");
108
+ else
109
+ process.stdout.write(`Copied the template ${input.name} to .cloving/workflows as the workflow ${input.id}.\nDecision points:\n${pointText(result.template.points)}Next: cloving workflows test ${input.id}\n`);
110
+ if (queued.length > 1)
111
+ process.stderr.write(`queue-workflow-conflict: ${queued.join(", ")} have "queue": true. Select "a person" for the select point of one copy: remove workflow.queue from its declaration.\n`);
112
+ return 0;
113
+ }
114
+ function pointText(points) {
115
+ return points
116
+ .map((value) => {
117
+ const point = record(value);
118
+ const options = point?.["options"];
119
+ const lines = (Array.isArray(options) ? options : []).map((option, index) => {
120
+ const fields = record(option);
121
+ return ` - ${String(fields?.["id"])}: ${String(fields?.["label"])}${index === 0 ? " (default)" : ""}\n`;
122
+ });
123
+ return ` ${String(point?.["id"])}: ${String(point?.["question"])}\n${lines.join("")}`;
124
+ })
125
+ .join("");
126
+ }
127
+ async function userFolder(repository) {
128
+ const settings = await projectConfiguration(repository, process.env);
129
+ const user = userLocation({
130
+ home: homedir(),
131
+ xdgConfigHome: process.env["XDG_CONFIG_HOME"],
132
+ userFolder: absoluteWorkflowFolder(settings.environment["CLOVING_WORKFLOW_FOLDER"]),
133
+ });
134
+ return join(user.root, ...user.parts);
135
+ }
136
+ async function queuedIn(folder) {
137
+ const names = await readdir(folder).catch(() => []);
138
+ const ids = await Promise.all(names
139
+ .filter((name) => name.endsWith(".declaration.json"))
140
+ .map((name) => queuedId(folder, name)));
141
+ return ids.flatMap((id) => (id === undefined ? [] : [id]));
142
+ }
143
+ async function queuedId(folder, name) {
144
+ const text = await readFile(join(folder, name), "utf8").catch(() => "");
145
+ let declaration;
146
+ try {
147
+ declaration = JSON.parse(text);
148
+ }
149
+ catch {
150
+ return undefined;
151
+ }
152
+ if (!isCandidateDeclaration(declaration) ||
153
+ declaration.workflow.queue !== true)
154
+ return undefined;
155
+ const source = join(folder, name.replace(/\.declaration\.json$/, ".ts"));
156
+ const entry = await stat(source).catch(() => undefined);
157
+ return entry?.isFile() === true ? declaration.workflow.workflowId : undefined;
158
+ }
159
+ if (process.argv[1] === import.meta.filename)
160
+ process.exitCode = await templateCommand(process.argv.slice(2));
@@ -0,0 +1,11 @@
1
+ import { type Template } from "./template-files.ts";
2
+ export declare function copyTemplate(input: {
3
+ readonly root: string;
4
+ readonly name: string;
5
+ readonly id: string;
6
+ readonly folder: string;
7
+ readonly takenNames: ReadonlySet<string>;
8
+ }): Promise<{
9
+ readonly template: Template;
10
+ readonly files: readonly string[];
11
+ }>;