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
@@ -0,0 +1,97 @@
1
+ import { record } from "../protocol.js";
2
+ import { identity, rows, timestamp, } from "./report-github-reader.js";
3
+ async function issueNumbers(reader, since) {
4
+ const result = [];
5
+ const seen = new Set();
6
+ for (let page = 1;; page += 1) {
7
+ const values = rows(await reader.read(`issues?state=all&since=${encodeURIComponent(since)}&per_page=100&page=${String(page)}`, [
8
+ "--jq",
9
+ 'map({number, html_url, closed_at, state, state_reason} + (if has("pull_request") then {pull_request: {}} else {} end))',
10
+ ]));
11
+ for (const row of values) {
12
+ if (Object.hasOwn(row, "pull_request"))
13
+ continue;
14
+ const number = identity(row, {
15
+ repository: reader.repository,
16
+ kind: "issues",
17
+ });
18
+ if (seen.has(number))
19
+ throw new Error("response");
20
+ seen.add(number);
21
+ result.push(number);
22
+ }
23
+ if (values.length < 100)
24
+ return result;
25
+ }
26
+ }
27
+ async function closureEvents(reader, issue) {
28
+ const result = [];
29
+ const seen = new Set();
30
+ for (let page = 1;; page += 1) {
31
+ const values = rows(await reader.read(`issues/${String(issue)}/events?per_page=100&page=${String(page)}`));
32
+ const signature = JSON.stringify(values);
33
+ if (seen.has(signature))
34
+ throw new Error("response");
35
+ seen.add(signature);
36
+ for (const event of values.filter((item) => ["closed", "reopened"].includes(String(item["event"]))))
37
+ result.push(await withCloseReason(reader, event));
38
+ if (values.length < 100)
39
+ return result;
40
+ }
41
+ }
42
+ function historyData(events, issue) {
43
+ const completed = [];
44
+ const reopened = [];
45
+ let completedAt = null;
46
+ for (const event of events.toSorted((left, right) => timestamp(left["created_at"]) - timestamp(right["created_at"]))) {
47
+ const at = timestamp(event["created_at"]);
48
+ const evidence = {
49
+ issue,
50
+ ...(event["id"] === undefined ? {} : { eventId: event["id"] }),
51
+ };
52
+ if (event["event"] === "reopened" &&
53
+ completedAt !== null &&
54
+ completedAt <= at)
55
+ reopened.push({ at, value: 1, evidence: { ...evidence, completedAt } });
56
+ if (event["event"] === "reopened")
57
+ continue;
58
+ if (!["completed", "not_planned", "duplicate"].includes(String(event["state_reason"])))
59
+ throw new Error("response");
60
+ if (event["state_reason"] !== "completed")
61
+ continue;
62
+ completedAt = at;
63
+ completed.push({ at, value: 1, evidence });
64
+ }
65
+ return { completed, reopened };
66
+ }
67
+ export async function readClosureHistory(reader, since) {
68
+ const completed = [];
69
+ const reopened = [];
70
+ for (const issue of await issueNumbers(reader, since)) {
71
+ const history = historyData(await closureEvents(reader, issue), issue);
72
+ completed.push(...history.completed);
73
+ reopened.push(...history.reopened);
74
+ }
75
+ return { completed, reopened };
76
+ }
77
+ async function withCloseReason(reader, event) {
78
+ if (event["event"] !== "closed" || typeof event["state_reason"] === "string")
79
+ return event;
80
+ const nodeId = event["node_id"];
81
+ if (typeof nodeId !== "string")
82
+ throw new Error("response");
83
+ return {
84
+ ...event,
85
+ state_reason: nodeReason(await reader.readNode(nodeId), nodeId),
86
+ };
87
+ }
88
+ function nodeReason(value, nodeId) {
89
+ const response = record(value);
90
+ const node = record(record(response?.["data"])?.["node"]);
91
+ if (response?.["errors"] !== undefined ||
92
+ node === undefined ||
93
+ node["id"] !== nodeId ||
94
+ typeof node["stateReason"] !== "string")
95
+ throw new Error("response");
96
+ return node["stateReason"].toLowerCase();
97
+ }
@@ -0,0 +1,7 @@
1
+ import { type Fields } from "../protocol.ts";
2
+ import type { ReportFlow, ReportCompletion } from "../report-flow-types.ts";
3
+ export declare function readReportFlow(runtime: string, input: {
4
+ readonly events: readonly Fields[] | null;
5
+ readonly start: number;
6
+ readonly completions: readonly ReportCompletion[] | null;
7
+ }): Promise<ReportFlow>;
@@ -0,0 +1,122 @@
1
+ import { record } from "../protocol.js";
2
+ import { send } from "./client.js";
3
+ function queueOf(value) {
4
+ const queue = record(value);
5
+ const workflowId = queue?.["workflowId"];
6
+ const lanes = queue?.["lanes"];
7
+ return typeof workflowId === "string" &&
8
+ workflowId !== "" &&
9
+ typeof lanes === "number" &&
10
+ Number.isSafeInteger(lanes) &&
11
+ lanes > 0
12
+ ? { workflowId, lanes }
13
+ : null;
14
+ }
15
+ async function overview(runtime) {
16
+ const reply = await send(runtime, {
17
+ operation: "status",
18
+ parameters: { limit: 1 },
19
+ });
20
+ if (reply.kind === "error")
21
+ throw new Error("report-overview-unavailable");
22
+ const workflows = reply.result["workflows"];
23
+ return {
24
+ queue: queueOf(reply.result["queue"]),
25
+ workflows: Array.isArray(workflows)
26
+ ? workflows.filter((id) => typeof id === "string")
27
+ : [],
28
+ };
29
+ }
30
+ async function workflowIds(runtime, runIds) {
31
+ const identities = new Map();
32
+ for (let offset = 0; offset < runIds.length; offset += 500) {
33
+ const batch = runIds.slice(offset, offset + 500);
34
+ try {
35
+ const reply = await send(runtime, {
36
+ operation: "status",
37
+ parameters: { metadata: "workflows", runIds: batch },
38
+ });
39
+ if (reply.kind === "error")
40
+ continue;
41
+ appendWorkflowIds(identities, {
42
+ runIds: batch,
43
+ values: reply.result["runs"],
44
+ });
45
+ }
46
+ catch {
47
+ continue;
48
+ }
49
+ }
50
+ return identities;
51
+ }
52
+ function appendWorkflowIds(identities, batch) {
53
+ const { values, runIds } = batch;
54
+ if (!Array.isArray(values) || values.length !== runIds.length)
55
+ return;
56
+ const rows = values.map((value) => record(value));
57
+ if (rows.some((row, index) => row?.["runId"] !== runIds[index]))
58
+ return;
59
+ for (const row of rows) {
60
+ const id = row?.["workflowId"];
61
+ identities.set(String(row?.["runId"]), typeof id === "string" && id !== "" ? id : null);
62
+ }
63
+ }
64
+ function skipsOf(events) {
65
+ if (events === null)
66
+ return null;
67
+ const skips = [];
68
+ for (const event of events.filter((event) => event["type"] === "schedule.skipped")) {
69
+ const id = record(event["payload"])?.["workflowId"];
70
+ const at = Date.parse(String(event["recordedAt"]));
71
+ const sequence = event["sequence"];
72
+ if (typeof id !== "string" ||
73
+ id === "" ||
74
+ !Number.isFinite(at) ||
75
+ typeof sequence !== "number" ||
76
+ !Number.isSafeInteger(sequence) ||
77
+ sequence < 1)
78
+ return null;
79
+ skips.push({ workflowId: id, at, sequence });
80
+ }
81
+ return skips;
82
+ }
83
+ function runsOf(input) {
84
+ const runs = [];
85
+ const ended = new Map((input.completions ?? []).map((event) => [event.runId, event.at]));
86
+ const seen = new Set();
87
+ for (const event of input.events.filter((event) => event["type"] === "run.started")) {
88
+ const runId = event["runId"];
89
+ const at = Date.parse(String(event["recordedAt"]));
90
+ if (typeof runId !== "string" ||
91
+ !Number.isFinite(at) ||
92
+ seen.has(runId) ||
93
+ (ended.get(runId) ?? at) < at)
94
+ return null;
95
+ seen.add(runId);
96
+ runs.push({
97
+ runId,
98
+ workflowId: null,
99
+ start: at,
100
+ end: ended.get(runId) ?? null,
101
+ });
102
+ }
103
+ return runs.filter((run) => (run.end ?? Infinity) > input.start);
104
+ }
105
+ export async function readReportFlow(runtime, input) {
106
+ const settings = await overview(runtime).catch(() => ({
107
+ queue: null,
108
+ workflows: [],
109
+ }));
110
+ const runs = input.events === null ? null : runsOf({ ...input, events: input.events });
111
+ const identities = await workflowIds(runtime, (runs ?? []).map((run) => run.runId));
112
+ return {
113
+ ...settings,
114
+ skips: skipsOf(input.events),
115
+ runs: runs === null
116
+ ? null
117
+ : runs.map((run) => ({
118
+ ...run,
119
+ workflowId: identities.get(run.runId) ?? null,
120
+ })),
121
+ };
122
+ }
@@ -0,0 +1,29 @@
1
+ import { type Fields } from "../protocol.ts";
2
+ import type { WatchPrSettings } from "./watch-pr-settings.ts";
3
+ import { type PrRepository } from "./watch-pr-identity.ts";
4
+ export interface GithubReportInput {
5
+ readonly since: string;
6
+ readonly settings?: WatchPrSettings;
7
+ readonly retryMilliseconds?: number;
8
+ }
9
+ export declare function reportSource(result: PromiseSettledResult<unknown>): {
10
+ status: string;
11
+ reason?: never;
12
+ } | {
13
+ status: string;
14
+ reason: string;
15
+ };
16
+ export declare function rows(value: unknown): readonly Fields[];
17
+ export declare function identity(row: Fields, context: {
18
+ readonly repository: PrRepository;
19
+ readonly kind: "issues" | "pull";
20
+ }): number;
21
+ export declare function timestamp(value: unknown): number;
22
+ export interface Reader {
23
+ readonly repository: PrRepository;
24
+ readonly readNode: (nodeId: string) => Promise<unknown>;
25
+ readonly readLog: (endpoint: string) => Promise<string>;
26
+ readonly read: (endpoint: string, flags?: readonly string[]) => Promise<unknown>;
27
+ }
28
+ export declare function repositoryReader(input: GithubReportInput): Promise<Reader>;
29
+ export declare function issueTimeline(reader: Pick<Reader, "read">, issue: number): Promise<Fields[]>;
@@ -0,0 +1,157 @@
1
+ import { record } from "../protocol.js";
2
+ import { githubRetry } from "./github-retry.js";
3
+ import { prRepository } from "./watch-pr-identity.js";
4
+ export function reportSource(result) {
5
+ if (result.status === "fulfilled")
6
+ return { status: "available" };
7
+ const reason = result.reason instanceof Error &&
8
+ result.reason.message === "github-network-failed"
9
+ ? "github-network-failed"
10
+ : "read-failed";
11
+ return { status: "unavailable", reason };
12
+ }
13
+ function commandOf(value) {
14
+ const command = JSON.parse(value ?? '["gh"]');
15
+ if (!Array.isArray(command) ||
16
+ command.length === 0 ||
17
+ !command.every((part) => typeof part === "string" && part !== "" && !part.includes("\0")))
18
+ throw new Error("configuration");
19
+ return command.map(String);
20
+ }
21
+ export function rows(value) {
22
+ if (!Array.isArray(value))
23
+ throw new Error("response");
24
+ return value.map((item) => {
25
+ const row = record(item);
26
+ if (row === undefined)
27
+ throw new Error("response");
28
+ return row;
29
+ });
30
+ }
31
+ export function identity(row, context) {
32
+ const { repository, kind } = context;
33
+ const number = row["number"];
34
+ const url = row["html_url"];
35
+ if (typeof number !== "number" ||
36
+ !Number.isSafeInteger(number) ||
37
+ number <= 0 ||
38
+ typeof url !== "string" ||
39
+ url.toLowerCase() !==
40
+ `https://${repository.host}/${repository.owner}/${repository.repository}/${kind}/${String(number)}`)
41
+ throw new Error("identity");
42
+ return number;
43
+ }
44
+ export function timestamp(value) {
45
+ if (typeof value !== "string" || !Number.isFinite(Date.parse(value)))
46
+ throw new Error("response");
47
+ return Date.parse(value);
48
+ }
49
+ export async function repositoryReader(input) {
50
+ const settings = input.settings;
51
+ if (settings?.repository === undefined)
52
+ throw new Error("configuration");
53
+ const command = commandOf(settings.githubCommand);
54
+ const signal = AbortSignal.timeout(120_000);
55
+ const origin = await settings.execute({
56
+ command: ["git", "config", "--local", "--get-all", "remote.origin.url"],
57
+ directory: settings.repository,
58
+ signal,
59
+ });
60
+ const repository = origin.status === 0 && origin.errorCode === null
61
+ ? prRepository(origin.stdout)
62
+ : null;
63
+ if (repository === null)
64
+ throw new Error("identity");
65
+ const timelines = new Map();
66
+ return {
67
+ repository,
68
+ readNode: (nodeId) => readEndpoint(input, {
69
+ repository,
70
+ command,
71
+ endpoint: "",
72
+ flags: [
73
+ "-f",
74
+ `query=query{node(id:${JSON.stringify(nodeId)}){id ... on ClosedEvent{stateReason}}}`,
75
+ ],
76
+ format: "graphql",
77
+ }),
78
+ readLog: async (endpoint) => String(await readEndpoint(input, {
79
+ repository,
80
+ command,
81
+ endpoint,
82
+ flags: [],
83
+ format: "text",
84
+ })),
85
+ read: (endpoint, flags = []) => {
86
+ const key = JSON.stringify([endpoint, flags]);
87
+ const cached = timelines.get(key);
88
+ if (cached !== undefined)
89
+ return cached;
90
+ const reading = readEndpoint(input, {
91
+ repository,
92
+ command,
93
+ endpoint,
94
+ flags,
95
+ });
96
+ timelines.set(key, reading);
97
+ return reading;
98
+ },
99
+ };
100
+ }
101
+ async function readEndpoint(input, request) {
102
+ const settings = input.settings;
103
+ if (settings?.repository === undefined)
104
+ throw new Error("configuration");
105
+ const { repository, command, endpoint, flags } = request;
106
+ const directory = settings.repository;
107
+ const signal = AbortSignal.timeout(120_000);
108
+ const output = await githubRetry({
109
+ signal,
110
+ pollMilliseconds: input.retryMilliseconds ?? 30_000,
111
+ action: async () => {
112
+ const output = await settings.execute({
113
+ outputBytes: request.format === "text" ? 2 * 1024 * 1024 : 1024 * 1024,
114
+ directory,
115
+ signal,
116
+ command: [
117
+ ...command,
118
+ "api",
119
+ "--method",
120
+ request.format === "graphql" ? "POST" : "GET",
121
+ "--hostname",
122
+ repository.host,
123
+ request.format === "graphql"
124
+ ? "graphql"
125
+ : `repos/${repository.owner}/${repository.repository}${endpoint === "" ? "" : `/${endpoint}`}`,
126
+ ...flags,
127
+ ],
128
+ });
129
+ if (output.status !== 0 || output.errorCode !== null)
130
+ throw Object.assign(new Error("github-call-failed"), {
131
+ status: Number(/\(HTTP (\d{3})\)/.exec(output.stderr)?.[1]),
132
+ detail: output.stderr,
133
+ });
134
+ return output.stdout;
135
+ },
136
+ });
137
+ if (request.format === "text")
138
+ return Buffer.from(output)
139
+ .subarray(0, 2 * 1024 * 1024)
140
+ .toString("utf8");
141
+ const parsed = JSON.parse(output);
142
+ return parsed;
143
+ }
144
+ export async function issueTimeline(reader, issue) {
145
+ const result = [];
146
+ const seen = new Set();
147
+ for (let page = 1;; page += 1) {
148
+ const values = rows(await reader.read(`issues/${String(issue)}/timeline?per_page=100&page=${String(page)}`));
149
+ const signature = JSON.stringify(values);
150
+ if (seen.has(signature))
151
+ throw new Error("response");
152
+ seen.add(signature);
153
+ result.push(...values);
154
+ if (values.length < 100)
155
+ return result;
156
+ }
157
+ }
@@ -1,18 +1,25 @@
1
+ import { readCiJobs } from "./report-ci-jobs.ts";
2
+ import { reportFailureData } from "../report-quality.ts";
3
+ import type { ReportCiData } from "../report-ci.ts";
1
4
  import type { ReportDatum } from "../report-statistics.ts";
2
- import type { WatchPrSettings } from "./watch-pr-settings.ts";
5
+ import { type GithubReportInput } from "./report-github-reader.ts";
6
+ import type { ReportReadyTicket } from "../report-flow-types.ts";
3
7
  export interface ReportGithub {
8
+ readonly labels: readonly ReportDatum[] | null;
9
+ readonly ciUsage: ReportCiData | null;
10
+ readonly reopened: readonly ReportDatum[] | null;
11
+ readonly reverts: readonly ReportDatum[] | null;
12
+ readonly jobLogs: Awaited<ReturnType<typeof readCiJobs>>["jobLogs"] | null;
13
+ readonly failures: ReturnType<typeof reportFailureData> | null;
14
+ readonly mainFirstPass: readonly ReportDatum[] | null;
4
15
  readonly observedSince: number | null;
5
16
  readonly issues: readonly ReportDatum[] | null;
6
17
  readonly pulls: readonly ReportDatum[] | null;
7
- readonly sources: Readonly<Record<"issues" | "pulls" | "history", {
18
+ readonly leadTimes: readonly ReportDatum[] | null;
19
+ readonly ready: readonly ReportReadyTicket[] | null;
20
+ readonly sources: Readonly<Record<"issues" | "pulls" | "history" | "timelines" | "ready" | "ci" | "ciUsage" | "ciUsageJobs" | "ciUsageWorkflows" | "jobs" | "labels", {
8
21
  readonly status: string;
9
22
  readonly reason?: string;
10
23
  }>>;
11
24
  }
12
- interface GithubReportInput {
13
- readonly since: string;
14
- readonly settings?: WatchPrSettings;
15
- readonly retryMilliseconds?: number;
16
- }
17
25
  export declare function readReportGithub(input: GithubReportInput): Promise<ReportGithub>;
18
- export {};