cloving 1.3.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 (396) hide show
  1. package/README.md +235 -206
  2. package/dist/src/agent-harness-shell.d.ts +2 -1
  3. package/dist/src/agent-harness-shell.js +8 -5
  4. package/dist/src/authority/command-wait-checks.d.ts +8 -0
  5. package/dist/src/authority/command-wait-checks.js +88 -0
  6. package/dist/src/authority/command-wait-results.d.ts +15 -0
  7. package/dist/src/authority/command-wait-results.js +73 -0
  8. package/dist/src/authority/command-wait-view.d.ts +21 -0
  9. package/dist/src/authority/command-wait-view.js +34 -0
  10. package/dist/src/authority/command-waits.d.ts +39 -0
  11. package/dist/src/authority/command-waits.js +97 -0
  12. package/dist/src/authority/commands.js +22 -1
  13. package/dist/src/authority/dispatch-decision.d.ts +8 -0
  14. package/dist/src/authority/dispatch-decision.js +26 -1
  15. package/dist/src/authority/effect-requests.js +6 -3
  16. package/dist/src/authority/effect-results.js +4 -2
  17. package/dist/src/authority/history-state.d.ts +2 -0
  18. package/dist/src/authority/history-state.js +13 -1
  19. package/dist/src/authority/instants.d.ts +1 -0
  20. package/dist/src/authority/instants.js +21 -0
  21. package/dist/src/authority/reduction-state.d.ts +2 -0
  22. package/dist/src/authority/reduction-state.js +5 -0
  23. package/dist/src/authority/reduction.js +24 -0
  24. package/dist/src/authority/status-input.d.ts +2 -0
  25. package/dist/src/authority/status.d.ts +2 -0
  26. package/dist/src/authority/status.js +1 -0
  27. package/dist/src/authority/stop-sequence.d.ts +1 -0
  28. package/dist/src/authority/stop-sequence.js +2 -1
  29. package/dist/src/authority/transitions.d.ts +6 -4
  30. package/dist/src/authority/transitions.js +7 -0
  31. package/dist/src/broker/actor/authority-queries.d.ts +2 -1
  32. package/dist/src/broker/actor/authority-queries.js +14 -5
  33. package/dist/src/broker/actor/authority-receipts.js +1 -1
  34. package/dist/src/broker/actor/authority-settings.js +2 -2
  35. package/dist/src/broker/actor/authority-upgrades.d.ts +19 -2
  36. package/dist/src/broker/actor/authority-upgrades.js +7 -2
  37. package/dist/src/broker/actor/delivery-intents.js +2 -0
  38. package/dist/src/broker/actor/effect-delivery.d.ts +1 -1
  39. package/dist/src/broker/actor/effect-delivery.js +15 -2
  40. package/dist/src/broker/actor/effect-plan.js +11 -2
  41. package/dist/src/broker/actor/effect-queries.d.ts +4 -0
  42. package/dist/src/broker/actor/effect-queries.js +9 -1
  43. package/dist/src/broker/actor/effect-turn.js +2 -0
  44. package/dist/src/broker/actor/stop-plan.js +9 -3
  45. package/dist/src/broker/actor/stop-turn.d.ts +2 -0
  46. package/dist/src/broker/actor/stop-turn.js +24 -11
  47. package/dist/src/broker/actor/turn-draft.d.ts +1 -0
  48. package/dist/src/broker/actor/turn-draft.js +4 -0
  49. package/dist/src/broker/actor/turn-state.js +5 -1
  50. package/dist/src/broker/authority-admission.js +60 -0
  51. package/dist/src/broker/authority-restore.d.ts +2 -0
  52. package/dist/src/broker/authority-restore.js +35 -1
  53. package/dist/src/broker/command-wait-restore.d.ts +31 -0
  54. package/dist/src/broker/command-wait-restore.js +86 -0
  55. package/dist/src/broker/decision-restore.d.ts +1 -1
  56. package/dist/src/broker/decision-restore.js +1 -0
  57. package/dist/src/broker/effect-upgrade.d.ts +2 -0
  58. package/dist/src/broker/effect-upgrade.js +8 -2
  59. package/dist/src/cli/arguments.d.ts +13 -0
  60. package/dist/src/cli/arguments.js +42 -3
  61. package/dist/src/cli/chat-stores.d.ts +2 -0
  62. package/dist/src/cli/chat-stores.js +113 -0
  63. package/dist/src/cli/client.d.ts +4 -1
  64. package/dist/src/cli/client.js +9 -3
  65. package/dist/src/cli/command-requests.d.ts +17 -0
  66. package/dist/src/cli/command-requests.js +43 -0
  67. package/dist/src/cli/command-waits.d.ts +9 -0
  68. package/dist/src/cli/command-waits.js +51 -0
  69. package/dist/src/cli/commands.js +14 -41
  70. package/dist/src/cli/config-file.d.ts +2 -2
  71. package/dist/src/cli/config-file.js +4 -2
  72. package/dist/src/cli/doctor-workflows.d.ts +5 -2
  73. package/dist/src/cli/doctor-workflows.js +12 -7
  74. package/dist/src/cli/doctor.js +6 -9
  75. package/dist/src/cli/harness-probes.d.ts +2 -0
  76. package/dist/src/cli/harness-probes.js +1 -1
  77. package/dist/src/cli/harness-processes.d.ts +6 -0
  78. package/dist/src/cli/harness-processes.js +36 -0
  79. package/dist/src/cli/init-command.d.ts +9 -0
  80. package/dist/src/cli/init-command.js +52 -0
  81. package/dist/src/cli/init-prompt-command.d.ts +10 -0
  82. package/dist/src/cli/init-prompt-command.js +145 -0
  83. package/dist/src/cli/init-prompt.d.ts +35 -0
  84. package/dist/src/cli/init-prompt.js +74 -0
  85. package/dist/src/cli/init-selection.d.ts +13 -0
  86. package/dist/src/cli/init-selection.js +75 -0
  87. package/dist/src/cli/main.d.ts +2 -0
  88. package/dist/src/cli/main.js +37 -7
  89. package/dist/src/cli/mcp-server.d.ts +1 -0
  90. package/dist/src/cli/mcp-server.js +156 -0
  91. package/dist/src/cli/mcp-tools.d.ts +15 -0
  92. package/dist/src/cli/mcp-tools.js +80 -0
  93. package/dist/src/cli/render.d.ts +1 -1
  94. package/dist/src/cli/render.js +17 -30
  95. package/dist/src/cli/report-ci-jobs.d.ts +23 -0
  96. package/dist/src/cli/report-ci-jobs.js +103 -0
  97. package/dist/src/cli/report-ci-usage.d.ts +9 -0
  98. package/dist/src/cli/report-ci-usage.js +185 -0
  99. package/dist/src/cli/report-ci.d.ts +13 -0
  100. package/dist/src/cli/report-ci.js +74 -0
  101. package/dist/src/cli/report-closures.d.ts +6 -0
  102. package/dist/src/cli/report-closures.js +97 -0
  103. package/dist/src/cli/report-flow.d.ts +7 -0
  104. package/dist/src/cli/report-flow.js +122 -0
  105. package/dist/src/cli/report-github-reader.d.ts +29 -0
  106. package/dist/src/cli/report-github-reader.js +157 -0
  107. package/dist/src/cli/report-github.d.ts +15 -8
  108. package/dist/src/cli/report-github.js +131 -150
  109. package/dist/src/cli/report-operator.d.ts +3 -0
  110. package/dist/src/cli/report-operator.js +40 -0
  111. package/dist/src/cli/report-ready.d.ts +3 -0
  112. package/dist/src/cli/report-ready.js +96 -0
  113. package/dist/src/cli/report-text.d.ts +9 -0
  114. package/dist/src/cli/report-text.js +33 -0
  115. package/dist/src/cli/report.d.ts +1 -0
  116. package/dist/src/cli/report.js +104 -27
  117. package/dist/src/cli/runtime-arguments.d.ts +2 -1
  118. package/dist/src/cli/runtime-arguments.js +7 -2
  119. package/dist/src/cli/schedule-arguments.d.ts +14 -0
  120. package/dist/src/cli/schedule-arguments.js +26 -0
  121. package/dist/src/cli/schedule-render.d.ts +22 -0
  122. package/dist/src/cli/schedule-render.js +73 -0
  123. package/dist/src/cli/terminal-text.d.ts +3 -0
  124. package/dist/src/cli/terminal-text.js +28 -0
  125. package/dist/src/cli/usage-render.d.ts +1 -0
  126. package/dist/src/cli/usage-render.js +28 -1
  127. package/dist/src/cli/usage.d.ts +1 -1
  128. package/dist/src/cli/usage.js +50 -7
  129. package/dist/src/cli/watch-actions.js +2 -2
  130. package/dist/src/cli/watch-board-view.js +19 -2
  131. package/dist/src/cli/watch-board.d.ts +4 -2
  132. package/dist/src/cli/watch-board.js +53 -43
  133. package/dist/src/cli/watch-card-forms.d.ts +1 -1
  134. package/dist/src/cli/watch-card-forms.js +11 -10
  135. package/dist/src/cli/watch-client.d.ts +1 -1
  136. package/dist/src/cli/watch-client.js +2 -11
  137. package/dist/src/cli/watch-header-view.d.ts +0 -5
  138. package/dist/src/cli/watch-header-view.js +8 -20
  139. package/dist/src/cli/watch-model.d.ts +4 -1
  140. package/dist/src/cli/watch-model.js +17 -11
  141. package/dist/src/cli/watch-page.js +12 -14
  142. package/dist/src/cli/watch-phases.d.ts +12 -3
  143. package/dist/src/cli/watch-phases.js +68 -11
  144. package/dist/src/cli/watch-pr-board.js +1 -1
  145. package/dist/src/cli/watch-pr-command.d.ts +1 -0
  146. package/dist/src/cli/watch-pull-request.js +18 -8
  147. package/dist/src/cli/watch-reads.d.ts +2 -0
  148. package/dist/src/cli/watch-reads.js +17 -16
  149. package/dist/src/cli/watch-render.d.ts +14 -0
  150. package/dist/src/cli/watch-run-input.d.ts +0 -1
  151. package/dist/src/cli/watch-run-input.js +0 -13
  152. package/dist/src/cli/watch-server.js +6 -6
  153. package/dist/src/cli/watch-view.d.ts +0 -3
  154. package/dist/src/cli/watch-view.js +13 -13
  155. package/dist/src/cli.js +59 -5
  156. package/dist/src/command-wait.d.ts +4 -0
  157. package/dist/src/command-wait.js +45 -0
  158. package/dist/src/configuration-change.d.ts +7 -0
  159. package/dist/src/configuration-change.js +14 -0
  160. package/dist/src/configuration-schema.d.ts +9 -0
  161. package/dist/src/configuration-schema.js +6 -2
  162. package/dist/src/daemon/attachment-file.d.ts +6 -0
  163. package/dist/src/daemon/attachment-file.js +86 -0
  164. package/dist/src/daemon/attachments.d.ts +14 -0
  165. package/dist/src/daemon/attachments.js +17 -0
  166. package/dist/src/daemon/claude-recovery.d.ts +50 -0
  167. package/dist/src/daemon/claude-recovery.js +204 -0
  168. package/dist/src/daemon/claude-stream.d.ts +27 -0
  169. package/dist/src/daemon/claude-stream.js +63 -0
  170. package/dist/src/daemon/claude-turn.d.ts +11 -25
  171. package/dist/src/daemon/claude-turn.js +64 -81
  172. package/dist/src/daemon/claude-worker.d.ts +2 -1
  173. package/dist/src/daemon/claude-worker.js +124 -122
  174. package/dist/src/daemon/daemon-adapters.d.ts +2 -0
  175. package/dist/src/daemon/daemon-adapters.js +26 -2
  176. package/dist/src/daemon/daemon-loops.d.ts +3 -1
  177. package/dist/src/daemon/daemon-loops.js +3 -1
  178. package/dist/src/daemon/daemon.js +14 -6
  179. package/dist/src/daemon/github-attach.d.ts +2 -0
  180. package/dist/src/daemon/github-attach.js +149 -0
  181. package/dist/src/daemon/github-ci-filters.d.ts +6 -0
  182. package/dist/src/daemon/github-ci-filters.js +138 -0
  183. package/dist/src/daemon/github-ci-workflows.d.ts +10 -0
  184. package/dist/src/daemon/github-ci-workflows.js +148 -0
  185. package/dist/src/daemon/github-ci.js +22 -4
  186. package/dist/src/daemon/github-issue-methods.d.ts +2 -0
  187. package/dist/src/daemon/github-issue-methods.js +37 -2
  188. package/dist/src/daemon/github-merge-call.d.ts +2 -1
  189. package/dist/src/daemon/github-merge-call.js +10 -3
  190. package/dist/src/daemon/github-merge.js +52 -24
  191. package/dist/src/daemon/github-methods.js +12 -2
  192. package/dist/src/daemon/github-operation.d.ts +4 -0
  193. package/dist/src/daemon/github-operation.js +6 -0
  194. package/dist/src/daemon/github-worker.d.ts +4 -0
  195. package/dist/src/daemon/github-worker.js +6 -0
  196. package/dist/src/daemon/issue-queue.d.ts +1 -1
  197. package/dist/src/daemon/issue-queue.js +16 -11
  198. package/dist/src/daemon/notify-events.d.ts +6 -0
  199. package/dist/src/daemon/notify-events.js +84 -0
  200. package/dist/src/daemon/notify-journal.js +1 -1
  201. package/dist/src/daemon/notify-message.d.ts +4 -1
  202. package/dist/src/daemon/notify-message.js +36 -0
  203. package/dist/src/daemon/notify.d.ts +1 -1
  204. package/dist/src/daemon/notify.js +5 -77
  205. package/dist/src/daemon/operation-journal.d.ts +1 -0
  206. package/dist/src/daemon/queue-status.d.ts +9 -3
  207. package/dist/src/daemon/queue-status.js +17 -4
  208. package/dist/src/daemon/resume-index-lock.d.ts +13 -0
  209. package/dist/src/daemon/resume-index-lock.js +160 -0
  210. package/dist/src/daemon/resume-worktree.d.ts +7 -0
  211. package/dist/src/daemon/resume-worktree.js +29 -0
  212. package/dist/src/daemon/retrying-turn.d.ts +2 -12
  213. package/dist/src/daemon/retrying-turn.js +98 -172
  214. package/dist/src/daemon/schedule-control.d.ts +26 -0
  215. package/dist/src/daemon/schedule-control.js +110 -0
  216. package/dist/src/daemon/schedule-journal.d.ts +2 -15
  217. package/dist/src/daemon/schedule-journal.js +67 -4
  218. package/dist/src/daemon/ticket-registration.d.ts +2 -7
  219. package/dist/src/daemon/ticket-registration.js +15 -81
  220. package/dist/src/daemon/turn-attempt-journal.d.ts +38 -0
  221. package/dist/src/daemon/turn-attempt-journal.js +136 -0
  222. package/dist/src/daemon/turn-attempts.d.ts +47 -0
  223. package/dist/src/daemon/turn-attempts.js +166 -0
  224. package/dist/src/daemon/turn-report.d.ts +8 -1
  225. package/dist/src/daemon/turn-report.js +39 -0
  226. package/dist/src/daemon/work-tree.d.ts +9 -0
  227. package/dist/src/daemon/work-tree.js +20 -0
  228. package/dist/src/daemon/worker-profile.d.ts +8 -0
  229. package/dist/src/daemon/worker-profile.js +40 -0
  230. package/dist/src/daemon/workflow-schedules.d.ts +3 -0
  231. package/dist/src/daemon/workflow-schedules.js +98 -45
  232. package/dist/src/daemon/worktree-processes.d.ts +9 -0
  233. package/dist/src/daemon/worktree-processes.js +151 -0
  234. package/dist/src/doctor-report.d.ts +3 -5
  235. package/dist/src/doctor-report.js +6 -13
  236. package/dist/src/harness-start.d.ts +15 -0
  237. package/dist/src/harness-start.js +37 -0
  238. package/dist/src/host/command-wait.d.ts +38 -0
  239. package/dist/src/host/command-wait.js +115 -0
  240. package/dist/src/host/start-delivery.d.ts +5 -7
  241. package/dist/src/host/start-delivery.js +3 -15
  242. package/dist/src/host/step-bridge-host.d.ts +2 -0
  243. package/dist/src/host/step-bridge-host.js +21 -0
  244. package/dist/src/operation-identity.d.ts +1 -0
  245. package/dist/src/operation-identity.js +4 -0
  246. package/dist/src/private-config.schema.json +40 -0
  247. package/dist/src/project-config.schema.json +40 -0
  248. package/dist/src/project-settings.d.ts +2 -2
  249. package/dist/src/project-settings.js +3 -1
  250. package/dist/src/queue-spend.d.ts +4 -0
  251. package/dist/src/queue-spend.js +21 -0
  252. package/dist/src/relay/relay-service.d.ts +3 -0
  253. package/dist/src/relay/relay-service.js +5 -3
  254. package/dist/src/report-ci.d.ts +164 -0
  255. package/dist/src/report-ci.js +32 -0
  256. package/dist/src/report-effects.d.ts +15 -0
  257. package/dist/src/report-effects.js +212 -0
  258. package/dist/src/report-flow-types.d.ts +38 -0
  259. package/dist/src/report-flow-types.js +7 -0
  260. package/dist/src/report-flow.d.ts +43 -0
  261. package/dist/src/report-flow.js +193 -0
  262. package/dist/src/report-operator.d.ts +67 -0
  263. package/dist/src/report-operator.js +25 -0
  264. package/dist/src/report-quality.d.ts +221 -0
  265. package/dist/src/report-quality.js +94 -0
  266. package/dist/src/report-ready.d.ts +23 -0
  267. package/dist/src/report-ready.js +117 -0
  268. package/dist/src/report-statistics.d.ts +2 -1
  269. package/dist/src/report-statistics.js +40 -4
  270. package/dist/src/report.d.ts +588 -47
  271. package/dist/src/report.js +156 -41
  272. package/dist/src/schedule-progress.d.ts +33 -0
  273. package/dist/src/schedule-progress.js +45 -0
  274. package/dist/src/service/active-tickets.js +6 -6
  275. package/dist/src/service/command-waits.d.ts +34 -0
  276. package/dist/src/service/command-waits.js +86 -0
  277. package/dist/src/service/expiry.js +2 -0
  278. package/dist/src/service/gateway.js +3 -1
  279. package/dist/src/service/queue-spend.d.ts +6 -0
  280. package/dist/src/service/queue-spend.js +68 -0
  281. package/dist/src/service/replies.d.ts +8 -1
  282. package/dist/src/service/replies.js +11 -0
  283. package/dist/src/service/run-handlers.js +22 -2
  284. package/dist/src/service/run-metadata.d.ts +15 -1
  285. package/dist/src/service/run-metadata.js +93 -8
  286. package/dist/src/service/service.d.ts +4 -0
  287. package/dist/src/service/service.js +8 -8
  288. package/dist/src/service/submission-handler.js +18 -4
  289. package/dist/src/service/worker-port.js +9 -1
  290. package/dist/src/service/worker-totals.d.ts +2 -0
  291. package/dist/src/service/worker-totals.js +1 -1
  292. package/dist/src/step-bridge.d.ts +20 -0
  293. package/dist/src/steps/command-wait.d.ts +12 -0
  294. package/dist/src/steps/command-wait.js +26 -0
  295. package/dist/src/steps/open-decision-wait.d.ts +2 -0
  296. package/dist/src/steps/{decision-gate.js → open-decision-wait.js} +0 -7
  297. package/dist/src/steps/review-by-person.js +4 -1
  298. package/dist/src/steps/wait-for-command.d.ts +3 -0
  299. package/dist/src/steps/wait-for-command.js +17 -0
  300. package/dist/src/steps/wait-for-decision.js +1 -1
  301. package/dist/src/storage/command-wait-rows.d.ts +30 -0
  302. package/dist/src/storage/command-wait-rows.js +96 -0
  303. package/dist/src/storage/decision-snapshots.d.ts +8 -1
  304. package/dist/src/storage/decision-snapshots.js +15 -1
  305. package/dist/src/storage/domain-changes.d.ts +2 -0
  306. package/dist/src/storage/domain-changes.js +3 -0
  307. package/dist/src/storage/domain-schema.d.ts +13 -1
  308. package/dist/src/storage/domain-schema.js +31 -4
  309. package/dist/src/storage/effect-schema.d.ts +1 -0
  310. package/dist/src/storage/effect-schema.js +5 -0
  311. package/dist/src/testing-requests.d.ts +15 -0
  312. package/dist/src/testing-requests.js +93 -0
  313. package/dist/src/testing.d.ts +4 -10
  314. package/dist/src/testing.js +33 -86
  315. package/dist/src/worker-usage.d.ts +1 -0
  316. package/dist/src/worker-usage.js +3 -0
  317. package/dist/src/workflow-candidate.d.ts +1 -0
  318. package/dist/src/workflow-candidate.js +12 -1
  319. package/dist/src/workflow-contracts.d.ts +1 -0
  320. package/dist/src/workflow-contracts.js +9 -2
  321. package/dist/src/workflow-discovery.d.ts +2 -13
  322. package/dist/src/workflow-discovery.js +1 -13
  323. package/dist/src/workflow-refusals.js +0 -1
  324. package/dist/src/workflows.d.ts +1 -1
  325. package/dist/src/workflows.js +1 -1
  326. package/dist/tools/red-green-command.d.ts +1 -0
  327. package/dist/tools/red-green-command.js +174 -0
  328. package/dist/tools/red-green-process.d.ts +10 -0
  329. package/dist/tools/red-green-process.js +59 -0
  330. package/dist/tools/self-host-processes.d.ts +2 -0
  331. package/dist/tools/self-host-processes.js +32 -13
  332. package/dist/tools/self-host-project.js +13 -78
  333. package/dist/tools/self-host-runtime.js +1 -1
  334. package/dist/tools/self-host.js +42 -10
  335. package/dist/tools/template-command.d.ts +1 -0
  336. package/dist/tools/template-command.js +160 -0
  337. package/dist/tools/template-copy.d.ts +11 -0
  338. package/dist/tools/template-copy.js +130 -0
  339. package/dist/tools/template-files.d.ts +17 -0
  340. package/dist/tools/template-files.js +74 -0
  341. package/dist/tools/workflow-bundles.js +1 -0
  342. package/dist/tools/workflow-candidate-counts.js +2 -2
  343. package/dist/tools/workflow-candidate-shape.d.ts +3 -0
  344. package/dist/tools/workflow-candidate-shape.js +90 -0
  345. package/dist/tools/workflow-candidate-source.js +15 -1
  346. package/dist/tools/workflow-candidate-syntax.d.ts +2 -2
  347. package/dist/tools/workflow-candidate-syntax.js +24 -94
  348. package/dist/tools/workflow-command.js +1 -2
  349. package/dist/tools/workflow-folders.d.ts +2 -3
  350. package/dist/tools/workflow-folders.js +1 -1
  351. package/package.json +16 -8
  352. package/templates/develop/README.md +12 -0
  353. package/templates/develop/develop/flow-tests.ts +37 -0
  354. package/templates/develop/develop/pull.ts +5 -1
  355. package/templates/develop/develop/refusal-tests.ts +77 -0
  356. package/templates/develop/develop/turn.ts +2 -1
  357. package/templates/idea-to-issue/README.md +27 -0
  358. package/templates/idea-to-issue/idea-to-issue/effects.ts +52 -0
  359. package/templates/idea-to-issue/idea-to-issue/leave.ts +10 -0
  360. package/templates/idea-to-issue/idea-to-issue/next.ts +29 -0
  361. package/templates/idea-to-issue/idea-to-issue/post-person.ts +18 -0
  362. package/templates/idea-to-issue/idea-to-issue/post.ts +50 -0
  363. package/templates/idea-to-issue/idea-to-issue/queue.ts +27 -0
  364. package/templates/idea-to-issue/idea-to-issue/review.ts +42 -0
  365. package/templates/idea-to-issue/idea-to-issue/scenarios.ts +50 -0
  366. package/templates/idea-to-issue/idea-to-issue/turn.ts +40 -0
  367. package/templates/idea-to-issue/idea-to-issue.declaration.json +16 -0
  368. package/templates/idea-to-issue/idea-to-issue.test.ts +79 -0
  369. package/templates/idea-to-issue/idea-to-issue.ts +49 -0
  370. package/templates/idea-to-issue/template.json +81 -0
  371. package/templates/review-day/README.md +97 -0
  372. package/templates/review-day/review-day/critique.ts +58 -0
  373. package/templates/review-day/review-day/decision.ts +29 -0
  374. package/templates/review-day/review-day/facts.ts +69 -0
  375. package/templates/review-day/review-day/label.ts +29 -0
  376. package/templates/review-day/review-day/next.ts +28 -0
  377. package/templates/review-day/review-day/post.ts +27 -0
  378. package/templates/review-day/review-day/report.ts +98 -0
  379. package/templates/review-day/review-day/rules.ts +12 -0
  380. package/templates/review-day/review-day/scenarios.ts +76 -0
  381. package/templates/review-day/review-day/turn.ts +73 -0
  382. package/templates/review-day/review-day.declaration.json +16 -0
  383. package/templates/review-day/review-day.test.ts +362 -0
  384. package/templates/review-day/review-day.ts +37 -0
  385. package/templates/review-day/template.json +56 -0
  386. package/dist/src/cli/watch-start-view.d.ts +0 -18
  387. package/dist/src/cli/watch-start-view.js +0 -77
  388. package/dist/src/steps/decision-gate.d.ts +0 -3
  389. package/dist/workflows/develop-prd.d.ts +0 -7
  390. package/dist/workflows/develop-prd.js +0 -165
  391. package/dist/workflows/develop-ticket.d.ts +0 -9
  392. package/dist/workflows/develop-ticket.js +0 -207
  393. package/dist/workflows/issue-labels.d.ts +0 -16
  394. package/dist/workflows/issue-labels.js +0 -70
  395. package/dist/workflows/ticket-prompts.d.ts +0 -35
  396. package/dist/workflows/ticket-prompts.js +0 -147
@@ -1,11 +1,13 @@
1
- import { configuration } from "./configuration-schema.js";
1
+ import { configuration, } from "./configuration-schema.js";
2
2
  export const settingVariables = {
3
3
  "checks.beforeMerge": "CLOVING_CHECK_COMMAND",
4
4
  "checks.required": "CLOVING_REQUIRED_CHECKS",
5
+ "checks.redGreen": "CLOVING_RED_GREEN",
5
6
  "tickets.command": "CLOVING_TICKET_COMMAND",
6
7
  "tickets.nextCommand": "CLOVING_NEXT_COMMAND",
7
8
  "queue.everySeconds": "CLOVING_QUEUE_SECONDS",
8
9
  "queue.lanes": "CLOVING_QUEUE_LANES",
10
+ "queue.dailySpendLimitUsd": "CLOVING_QUEUE_DAILY_SPEND_USD",
9
11
  "harness.name": "CLOVING_WORKER",
10
12
  fallbackModels: "CLOVING_FALLBACK_MODELS",
11
13
  tokenPrices: "CLOVING_TOKEN_PRICES",
@@ -0,0 +1,4 @@
1
+ export declare function queueSpending(costs: readonly number[], limitUsd: number): {
2
+ readonly spentUsd: number;
3
+ readonly holding: boolean;
4
+ };
@@ -0,0 +1,21 @@
1
+ function decimal(value) {
2
+ const [mantissa = "0", exponent = "0"] = String(value).split("e");
3
+ const fraction = mantissa.split(".")[1]?.length ?? 0;
4
+ return {
5
+ units: BigInt(mantissa.replace(".", "")),
6
+ exponent: Number(exponent) - fraction,
7
+ };
8
+ }
9
+ function scaled(value, exponent) {
10
+ return value.units * 10n ** BigInt(value.exponent - exponent);
11
+ }
12
+ export function queueSpending(costs, limitUsd) {
13
+ const prices = costs.map(decimal);
14
+ const limit = decimal(limitUsd);
15
+ const exponent = prices.reduce((smallest, price) => Math.min(smallest, price.exponent), limit.exponent);
16
+ const total = prices.reduce((sum, price) => sum + scaled(price, exponent), 0n);
17
+ return {
18
+ spentUsd: Number(`${String(total)}e${String(exponent)}`),
19
+ holding: total * 100n >= scaled(limit, exponent) * 85n,
20
+ };
21
+ }
@@ -1,5 +1,7 @@
1
+ import type { Reply } from "../protocol.ts";
1
2
  import { type InboxTiming } from "./answer-inbox.ts";
2
3
  import { type WatchTiming } from "./decision-watch.ts";
4
+ import { type OperationState } from "./phone-operations.ts";
3
5
  import { type HeartbeatTiming } from "./relay-heartbeat.ts";
4
6
  export interface RelayPaths {
5
7
  readonly runtimeDirectory: string;
@@ -16,6 +18,7 @@ export interface RelayOptions extends RelayPaths {
16
18
  export interface Relay {
17
19
  readonly close: () => Promise<void>;
18
20
  }
21
+ export declare function phoneState(relay: OperationState): Promise<Reply>;
19
22
  export declare function computerName(name: string): string;
20
23
  export declare function startRelay(options: RelayOptions): Promise<Relay>;
21
24
  export interface RelayProgram {
@@ -41,15 +41,17 @@ function pairingView(open) {
41
41
  },
42
42
  };
43
43
  }
44
- async function phoneState(relay) {
45
- const link = await readLink(relay.context.phoneDirectory);
44
+ export async function phoneState(relay) {
45
+ const stored = await readLink(relay.context.phoneDirectory);
46
+ const lost = relay.registration.lost;
47
+ const link = lost ? undefined : stored;
46
48
  return result({
47
49
  registered: link !== undefined,
48
50
  daemonId: link?.daemonId ?? null,
49
51
  origin: link?.origin ?? null,
50
52
  pairing: pairingView(relay.sessions.current()),
51
53
  refusal: relay.sessions.refusal(),
52
- reason: relay.registration.lost ? "registration-lost" : null,
54
+ reason: lost ? "registration-lost" : null,
53
55
  devices: (await relay.store.devices()).map((device) => ({
54
56
  deviceId: device.deviceId,
55
57
  name: device.name,
@@ -0,0 +1,164 @@
1
+ import { type ReportDatum, type ReportWindow } from "./report-statistics.ts";
2
+ export declare const runnerKinds: readonly ["localMacos", "localLinux", "hostedMacos", "hostedLinux"];
3
+ export type RunnerKind = (typeof runnerKinds)[number];
4
+ export type RunnerData = Readonly<Record<RunnerKind, readonly ReportDatum[]>>;
5
+ export interface ReportCiData {
6
+ readonly jobMinutes: RunnerData | null;
7
+ readonly jobLimitShare: RunnerData | null;
8
+ readonly runnerWaitMinutes: RunnerData | null;
9
+ readonly timeouts: readonly ReportDatum[] | null;
10
+ readonly reruns: readonly ReportDatum[] | null;
11
+ }
12
+ export declare function reportCiMetrics(input: ReportCiData | undefined, window: ReportWindow): {
13
+ jobMinutes: {
14
+ [k: string]: {
15
+ evidence: Readonly<Record<string, unknown>>[];
16
+ mark?: string;
17
+ status: string;
18
+ value: number | null;
19
+ comparisonValue: number | null;
20
+ baseline: {
21
+ evidence: Readonly<Record<string, unknown>>[];
22
+ history: string;
23
+ days: number;
24
+ median: null;
25
+ band: null;
26
+ } | {
27
+ evidence: Readonly<Record<string, unknown>>[];
28
+ history: string;
29
+ days: number;
30
+ median: number;
31
+ band: null;
32
+ } | {
33
+ evidence: Readonly<Record<string, unknown>>[];
34
+ history: string;
35
+ days: number;
36
+ median: number;
37
+ band: {
38
+ low: number;
39
+ high: number;
40
+ };
41
+ };
42
+ };
43
+ };
44
+ jobLimitShare: {
45
+ [k: string]: {
46
+ evidence: Readonly<Record<string, unknown>>[];
47
+ mark?: string;
48
+ status: string;
49
+ value: number | null;
50
+ comparisonValue: number | null;
51
+ baseline: {
52
+ evidence: Readonly<Record<string, unknown>>[];
53
+ history: string;
54
+ days: number;
55
+ median: null;
56
+ band: null;
57
+ } | {
58
+ evidence: Readonly<Record<string, unknown>>[];
59
+ history: string;
60
+ days: number;
61
+ median: number;
62
+ band: null;
63
+ } | {
64
+ evidence: Readonly<Record<string, unknown>>[];
65
+ history: string;
66
+ days: number;
67
+ median: number;
68
+ band: {
69
+ low: number;
70
+ high: number;
71
+ };
72
+ };
73
+ };
74
+ };
75
+ runnerWaitMinutes: {
76
+ [k: string]: {
77
+ evidence: Readonly<Record<string, unknown>>[];
78
+ mark?: string;
79
+ status: string;
80
+ value: number | null;
81
+ comparisonValue: number | null;
82
+ baseline: {
83
+ evidence: Readonly<Record<string, unknown>>[];
84
+ history: string;
85
+ days: number;
86
+ median: null;
87
+ band: null;
88
+ } | {
89
+ evidence: Readonly<Record<string, unknown>>[];
90
+ history: string;
91
+ days: number;
92
+ median: number;
93
+ band: null;
94
+ } | {
95
+ evidence: Readonly<Record<string, unknown>>[];
96
+ history: string;
97
+ days: number;
98
+ median: number;
99
+ band: {
100
+ low: number;
101
+ high: number;
102
+ };
103
+ };
104
+ };
105
+ };
106
+ timeouts: {
107
+ evidence: Readonly<Record<string, unknown>>[];
108
+ mark?: string;
109
+ status: string;
110
+ value: number | null;
111
+ comparisonValue: number | null;
112
+ baseline: {
113
+ evidence: Readonly<Record<string, unknown>>[];
114
+ history: string;
115
+ days: number;
116
+ median: null;
117
+ band: null;
118
+ } | {
119
+ evidence: Readonly<Record<string, unknown>>[];
120
+ history: string;
121
+ days: number;
122
+ median: number;
123
+ band: null;
124
+ } | {
125
+ evidence: Readonly<Record<string, unknown>>[];
126
+ history: string;
127
+ days: number;
128
+ median: number;
129
+ band: {
130
+ low: number;
131
+ high: number;
132
+ };
133
+ };
134
+ };
135
+ reruns: {
136
+ evidence: Readonly<Record<string, unknown>>[];
137
+ mark?: string;
138
+ status: string;
139
+ value: number | null;
140
+ comparisonValue: number | null;
141
+ baseline: {
142
+ evidence: Readonly<Record<string, unknown>>[];
143
+ history: string;
144
+ days: number;
145
+ median: null;
146
+ band: null;
147
+ } | {
148
+ evidence: Readonly<Record<string, unknown>>[];
149
+ history: string;
150
+ days: number;
151
+ median: number;
152
+ band: null;
153
+ } | {
154
+ evidence: Readonly<Record<string, unknown>>[];
155
+ history: string;
156
+ days: number;
157
+ median: number;
158
+ band: {
159
+ low: number;
160
+ high: number;
161
+ };
162
+ };
163
+ };
164
+ };
@@ -0,0 +1,32 @@
1
+ import { reportMetric, } from "./report-statistics.js";
2
+ export const runnerKinds = [
3
+ "localMacos",
4
+ "localLinux",
5
+ "hostedMacos",
6
+ "hostedLinux",
7
+ ];
8
+ export function reportCiMetrics(input, window) {
9
+ const runners = (data) => Object.fromEntries(runnerKinds.map((kind) => [
10
+ kind,
11
+ reportMetric({
12
+ data: data?.[kind] ?? null,
13
+ window,
14
+ aggregation: "median",
15
+ }),
16
+ ]));
17
+ return {
18
+ jobMinutes: runners(input?.jobMinutes),
19
+ jobLimitShare: runners(input?.jobLimitShare),
20
+ runnerWaitMinutes: runners(input?.runnerWaitMinutes),
21
+ timeouts: reportMetric({
22
+ data: input?.timeouts ?? null,
23
+ window,
24
+ aggregation: "count",
25
+ }),
26
+ reruns: reportMetric({
27
+ data: input?.reruns ?? null,
28
+ window,
29
+ aggregation: "count",
30
+ }),
31
+ };
32
+ }
@@ -0,0 +1,15 @@
1
+ import { type Fields } from "./protocol.ts";
2
+ import type { ReportDatum } from "./report-statistics.ts";
3
+ export declare function reportFixRounds(events: readonly Fields[] | null): ReportDatum[] | null;
4
+ export declare function reportPhaseTimes(events: readonly Fields[] | null, method: string): ReportDatum[] | null;
5
+ export declare function reportEffectData(events: readonly Fields[] | null): {
6
+ fixRounds: ReportDatum[] | null;
7
+ workerTurn: ReportDatum[] | null;
8
+ codeReview: ReportDatum[] | null;
9
+ merge: ReportDatum[] | null;
10
+ };
11
+ export declare function reportReviewScores(events: readonly Fields[] | null): Record<string, ReportDatum[]> | null;
12
+ export declare function reportOperatorEffects(events: readonly Fields[] | null, method: "merge" | "label"): {
13
+ number: number;
14
+ at: number;
15
+ }[] | null;
@@ -0,0 +1,212 @@
1
+ import { record } from "./protocol.js";
2
+ function payloadOf(event) {
3
+ return record(event["payload"]) ?? {};
4
+ }
5
+ function resultOf(value) {
6
+ const parsed = typeof value === "string" ? JSON.parse(value) : value;
7
+ const result = record(parsed);
8
+ if (result === undefined)
9
+ throw new Error("invalid-report-effect-result");
10
+ return result;
11
+ }
12
+ function requestsOf(events) {
13
+ const requests = new Map();
14
+ for (const event of events) {
15
+ if (event["type"] !== "effect.requested")
16
+ continue;
17
+ const key = effectKey(event);
18
+ if (!requests.has(key))
19
+ requests.set(key, event);
20
+ }
21
+ return requests;
22
+ }
23
+ function effectKey(event) {
24
+ return JSON.stringify([event["runId"], payloadOf(event)["operationId"]]);
25
+ }
26
+ function pairsOf(events, requests) {
27
+ return events.flatMap((report) => {
28
+ if (report["type"] !== "effect.reported")
29
+ return [];
30
+ const request = requests.get(effectKey(report));
31
+ if (request === undefined)
32
+ throw new Error("missing-report-effect-request");
33
+ return [{ request, report }];
34
+ });
35
+ }
36
+ function historyOf(events) {
37
+ if (events === null)
38
+ return null;
39
+ try {
40
+ const requests = requestsOf(events);
41
+ const runs = new Map();
42
+ for (const request of requests.values()) {
43
+ const runId = request["runId"];
44
+ if (typeof runId !== "string")
45
+ throw new Error("invalid-report-run-id");
46
+ const own = runs.get(runId) ?? [];
47
+ own.push(request);
48
+ runs.set(runId, own);
49
+ }
50
+ return { pairs: pairsOf(events, requests), runs };
51
+ }
52
+ catch {
53
+ return null;
54
+ }
55
+ }
56
+ function fixRoundDatum(pair, requests) {
57
+ const { request, report } = pair;
58
+ const payload = payloadOf(report);
59
+ if (payloadOf(request)["method"] !== "merge" ||
60
+ payload["outcome"] !== "completed")
61
+ return [];
62
+ const result = resultOf(payload["result"]);
63
+ if (!mergedResult(result["merged"]))
64
+ return [];
65
+ const own = requests;
66
+ const opened = own.find((item) => payloadOf(item)["method"] === "open-pr");
67
+ const rounds = opened === undefined
68
+ ? null
69
+ : own.filter((item) => payloadOf(item)["method"] === "run-turn" &&
70
+ Number(item["sequence"]) > Number(opened["sequence"]) &&
71
+ Number(item["sequence"]) < Number(report["sequence"])).length;
72
+ return [
73
+ {
74
+ at: Number(report["at"]),
75
+ value: rounds,
76
+ evidence: {
77
+ runId: report["runId"],
78
+ pullRequest: result["number"] ?? resultOf(payloadOf(request)["payload"])["number"],
79
+ operationId: payload["operationId"],
80
+ fixRounds: rounds,
81
+ },
82
+ },
83
+ ];
84
+ }
85
+ function fixRounds(history) {
86
+ if (history === null)
87
+ return null;
88
+ try {
89
+ return history.pairs.flatMap((pair) => {
90
+ const runId = pair.report["runId"];
91
+ if (typeof runId !== "string")
92
+ throw new Error("invalid-report-run-id");
93
+ return fixRoundDatum(pair, history.runs.get(runId) ?? []);
94
+ });
95
+ }
96
+ catch {
97
+ return null;
98
+ }
99
+ }
100
+ function phaseTimes(history, method) {
101
+ if (history === null)
102
+ return null;
103
+ return history.pairs.flatMap(({ request, report }) => {
104
+ if (payloadOf(request)["method"] !== method)
105
+ return [];
106
+ const at = Number(report["at"]);
107
+ const minutes = (at - Number(request["at"])) / 60_000;
108
+ return [
109
+ {
110
+ at,
111
+ value: Number.isFinite(minutes) && minutes >= 0 ? minutes : null,
112
+ evidence: {
113
+ runId: report["runId"],
114
+ operationId: payloadOf(report)["operationId"],
115
+ },
116
+ },
117
+ ];
118
+ });
119
+ }
120
+ export function reportFixRounds(events) {
121
+ return fixRounds(historyOf(events));
122
+ }
123
+ export function reportPhaseTimes(events, method) {
124
+ return phaseTimes(historyOf(events), method);
125
+ }
126
+ export function reportEffectData(events) {
127
+ const history = historyOf(events);
128
+ return {
129
+ fixRounds: fixRounds(history),
130
+ workerTurn: phaseTimes(history, "run-turn"),
131
+ codeReview: phaseTimes(history, "wait-review"),
132
+ merge: phaseTimes(history, "merge"),
133
+ };
134
+ }
135
+ function mergedResult(value) {
136
+ return (value === true ||
137
+ (typeof value === "string" && /^[a-f0-9]{40}$/i.test(value)));
138
+ }
139
+ export function reportReviewScores(events) {
140
+ const history = historyOf(events);
141
+ if (history === null)
142
+ return null;
143
+ const rounds = { round1: [] };
144
+ for (const { request, report } of history.pairs) {
145
+ if (payloadOf(request)["method"] !== "wait-review")
146
+ continue;
147
+ const own = history.runs.get(String(request["runId"])) ?? [];
148
+ const round = own.filter((event) => payloadOf(event)["method"] === "wait-review" &&
149
+ Number(event["sequence"]) <= Number(request["sequence"])).length;
150
+ const key = `round${String(round)}`;
151
+ const data = rounds[key] ?? [];
152
+ const score = reviewScoreOf(report);
153
+ data.push({
154
+ at: Number(report["at"]),
155
+ value: score,
156
+ evidence: {
157
+ runId: report["runId"],
158
+ operationId: payloadOf(report)["operationId"],
159
+ sequence: report["sequence"],
160
+ round,
161
+ score,
162
+ },
163
+ });
164
+ rounds[key] = data;
165
+ }
166
+ return rounds;
167
+ }
168
+ function reviewScoreOf(report) {
169
+ let score = null;
170
+ try {
171
+ const result = resultOf(payloadOf(report)["result"]);
172
+ const value = result["score"];
173
+ if (payloadOf(report)["outcome"] === "completed" &&
174
+ typeof value === "number" &&
175
+ Number.isFinite(value) &&
176
+ value >= 0 &&
177
+ value <= 5)
178
+ score = value;
179
+ }
180
+ catch {
181
+ score = null;
182
+ }
183
+ return score;
184
+ }
185
+ export function reportOperatorEffects(events, method) {
186
+ const history = historyOf(events);
187
+ if (history === null)
188
+ return null;
189
+ try {
190
+ return history.pairs.flatMap(({ request, report }) => {
191
+ const requested = payloadOf(request);
192
+ const reported = payloadOf(report);
193
+ if (requested["method"] !== method)
194
+ return [];
195
+ if (method === "merge" &&
196
+ (reported["outcome"] !== "completed" ||
197
+ !mergedResult(resultOf(reported["result"])["merged"])))
198
+ return [];
199
+ const number = resultOf(requested["payload"])["number"];
200
+ const at = Number(report["at"]);
201
+ if (typeof number !== "number" ||
202
+ !Number.isSafeInteger(number) ||
203
+ number < 1 ||
204
+ !Number.isFinite(at))
205
+ throw new Error("invalid-report-effect");
206
+ return [{ number, at }];
207
+ });
208
+ }
209
+ catch {
210
+ return null;
211
+ }
212
+ }
@@ -0,0 +1,38 @@
1
+ export declare const reportOutcomes: readonly ["completed", "partial", "blocked", "failed", "cancelled"];
2
+ export type ReportOutcome = (typeof reportOutcomes)[number];
3
+ export interface ReportCompletion {
4
+ readonly runId: string;
5
+ readonly sequence: number;
6
+ readonly at: number;
7
+ readonly outcome: ReportOutcome;
8
+ }
9
+ export interface ReportFlowRun {
10
+ readonly runId: string;
11
+ readonly workflowId: string | null;
12
+ readonly start: number;
13
+ readonly end: number | null;
14
+ }
15
+ export interface ReportFlow {
16
+ readonly queue: {
17
+ readonly workflowId: string;
18
+ readonly lanes: number;
19
+ } | null;
20
+ readonly runs: readonly ReportFlowRun[] | null;
21
+ readonly workflows?: readonly string[];
22
+ readonly skips?: readonly {
23
+ readonly workflowId: string;
24
+ readonly at: number;
25
+ readonly sequence: number;
26
+ }[] | null;
27
+ }
28
+ export interface ReportReadyTicket {
29
+ readonly issue: number;
30
+ readonly intervals: readonly {
31
+ readonly start: number;
32
+ readonly end: number | null;
33
+ }[];
34
+ readonly dependencies: readonly {
35
+ readonly issue: number;
36
+ readonly closedAt: number | null;
37
+ }[];
38
+ }
@@ -0,0 +1,7 @@
1
+ export const reportOutcomes = [
2
+ "completed",
3
+ "partial",
4
+ "blocked",
5
+ "failed",
6
+ "cancelled",
7
+ ];
@@ -0,0 +1,43 @@
1
+ import type { ReportCompletion, ReportFlow, ReportReadyTicket } from "./report-flow-types.ts";
2
+ import { type ReportWindow } from "./report-statistics.ts";
3
+ interface FlowInput {
4
+ readonly flow: ReportFlow | undefined;
5
+ readonly completions: readonly ReportCompletion[] | null;
6
+ readonly ready: ReadyInput;
7
+ }
8
+ interface ReadyInput {
9
+ readonly tickets: readonly ReportReadyTicket[] | null;
10
+ readonly observedSince: number | null;
11
+ }
12
+ export declare function reportFlowMetrics(input: FlowInput, window: ReportWindow): {
13
+ [x: string]: {
14
+ evidence: Readonly<Record<string, unknown>>[];
15
+ mark?: string;
16
+ status: string;
17
+ value: number | null;
18
+ comparisonValue: number | null;
19
+ baseline: {
20
+ evidence: Readonly<Record<string, unknown>>[];
21
+ history: string;
22
+ days: number;
23
+ median: null;
24
+ band: null;
25
+ } | {
26
+ evidence: Readonly<Record<string, unknown>>[];
27
+ history: string;
28
+ days: number;
29
+ median: number;
30
+ band: null;
31
+ } | {
32
+ evidence: Readonly<Record<string, unknown>>[];
33
+ history: string;
34
+ days: number;
35
+ median: number;
36
+ band: {
37
+ low: number;
38
+ high: number;
39
+ };
40
+ };
41
+ };
42
+ };
43
+ export {};