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,193 @@
1
+ import { reportReadyData } from "./report-ready.js";
2
+ import { reportMetric, } from "./report-statistics.js";
3
+ function overlaps(run, window) {
4
+ return run.start < window.end && (run.end ?? window.end) > window.start;
5
+ }
6
+ function busyShare(input, window) {
7
+ const queue = input.queue;
8
+ const runs = input.runs;
9
+ if (queue === null || runs === null)
10
+ return null;
11
+ const active = runs.filter((run) => overlaps(run, window));
12
+ if (active.some((run) => run.workflowId === null))
13
+ return null;
14
+ const own = active.filter((run) => run.workflowId === queue.workflowId);
15
+ const milliseconds = own.reduce((sum, run) => sum +
16
+ Math.max(0, Math.min(run.end ?? window.end, window.end) -
17
+ Math.max(run.start, window.start)), 0);
18
+ return {
19
+ at: window.start,
20
+ value: milliseconds / (queue.lanes * (window.end - window.start)),
21
+ evidence: {
22
+ workflowId: queue.workflowId,
23
+ lanes: queue.lanes,
24
+ runIds: own.map((run) => run.runId),
25
+ },
26
+ };
27
+ }
28
+ function peakRuns(runs, window) {
29
+ const points = runs
30
+ .filter((run) => overlaps(run, window) && (run.end === null || run.end > run.start))
31
+ .flatMap((run) => [
32
+ { at: Math.max(run.start, window.start), change: 1 },
33
+ { at: Math.min(run.end ?? window.end, window.end), change: -1 },
34
+ ])
35
+ .toSorted((a, b) => a.at - b.at || a.change - b.change);
36
+ let active = 0;
37
+ let peak = 0;
38
+ let peakAt = window.start;
39
+ for (const point of points) {
40
+ active += point.change;
41
+ if (active <= peak)
42
+ continue;
43
+ peak = active;
44
+ peakAt = point.at;
45
+ }
46
+ const runIds = runs
47
+ .filter((run) => run.start <= peakAt && (run.end ?? window.end) > peakAt)
48
+ .map((run) => run.runId);
49
+ return { at: window.start, value: peak, evidence: { runIds } };
50
+ }
51
+ function streaks(completions, window) {
52
+ const ended = completions
53
+ .filter((event) => event.at < window.end)
54
+ .toSorted((a, b) => a.at - b.at || a.sequence - b.sequence);
55
+ let current = [];
56
+ let inWindow = [];
57
+ let longest = [];
58
+ for (const event of ended) {
59
+ current = event.outcome === "completed" ? [] : [...current, event.runId];
60
+ if (event.at < window.start)
61
+ continue;
62
+ inWindow = event.outcome === "completed" ? [] : [...inWindow, event.runId];
63
+ if (inWindow.length > longest.length)
64
+ longest = inWindow;
65
+ }
66
+ return { current, longest };
67
+ }
68
+ function windowData(input, window) {
69
+ const busy = input.flow === undefined ? null : busyShare(input.flow, window);
70
+ const peak = input.flow?.runs == null ? null : peakRuns(input.flow.runs, window);
71
+ const streak = input.completions === null ? null : streaks(input.completions, window);
72
+ const waits = reportReadyData({ tickets: input.ready.tickets, flow: input.flow }, window);
73
+ return {
74
+ "flow.busyLaneShare": busy === null ? null : [busy],
75
+ "flow.peakActiveRuns": peak === null ? null : [peak],
76
+ "flow.unsuccessfulStreak.current": streak === null
77
+ ? null
78
+ : [
79
+ {
80
+ at: window.start,
81
+ value: streak.current.length,
82
+ evidence: { runIds: streak.current },
83
+ },
84
+ ],
85
+ "flow.unsuccessfulStreak.longest": streak === null
86
+ ? null
87
+ : [
88
+ {
89
+ at: window.start,
90
+ value: streak.longest.length,
91
+ evidence: { runIds: streak.longest },
92
+ },
93
+ ],
94
+ "flow.idleLaneHoursWithReadyTicket": waits.idle,
95
+ "flow.readyWaitHours.dependency": waits.dependency,
96
+ "flow.readyWaitHours.noLane": waits.noLane,
97
+ };
98
+ }
99
+ function sampleWindows(window) {
100
+ return [
101
+ window,
102
+ ...Array.from({ length: 7 }, (_, index) => ({
103
+ ...window,
104
+ start: window.start - (index + 1) * 86_400_000,
105
+ end: window.start - index * 86_400_000,
106
+ })),
107
+ ];
108
+ }
109
+ function metricWindow(name, input) {
110
+ const { window, ready } = input;
111
+ if (!name.includes("ReadyTicket") && !name.includes("readyWaitHours"))
112
+ return window;
113
+ const origin = ready.observedSince;
114
+ if (name.endsWith("dependency"))
115
+ return { ...window, observedSince: origin };
116
+ const observedSince = origin === null || window.observedSince === null
117
+ ? null
118
+ : Math.max(origin, window.observedSince);
119
+ return { ...window, observedSince };
120
+ }
121
+ function sampledMetrics(input, window) {
122
+ const windows = sampleWindows(window);
123
+ const samples = windows.map((sample) => windowData(input, sample));
124
+ const metrics = {};
125
+ for (const name of Object.keys(samples[0] ?? {})) {
126
+ const current = samples[0]?.[name];
127
+ const data = current == null
128
+ ? null
129
+ : samples.flatMap((sample, index) => sample[name] ?? [
130
+ {
131
+ at: windows[index]?.start ?? window.start,
132
+ value: null,
133
+ evidence: {},
134
+ },
135
+ ]);
136
+ metrics[name] = reportMetric({
137
+ data,
138
+ window: metricWindow(name, { window, ready: input.ready }),
139
+ aggregation: name.includes("Hours") ? "count" : "median",
140
+ });
141
+ }
142
+ return metrics;
143
+ }
144
+ function workflowIds(input) {
145
+ const flow = input ?? { runs: [], queue: null, skips: [], workflows: [] };
146
+ const queue = flow.queue === null ? [] : [flow.queue.workflowId];
147
+ return new Set([
148
+ ...(flow.workflows ?? []),
149
+ ...(flow.skips ?? []).map((skip) => skip.workflowId),
150
+ ...(flow.runs ?? []).flatMap((run) => run.workflowId === null ? [] : [run.workflowId]),
151
+ ...queue,
152
+ ]);
153
+ }
154
+ function skipMetrics(input, window) {
155
+ const workflows = workflowIds(input);
156
+ const metrics = {
157
+ "flow.scheduleSkips": reportMetric({
158
+ data: input?.skips == null
159
+ ? null
160
+ : input.skips.map((skip) => ({
161
+ at: skip.at,
162
+ value: 1,
163
+ evidence: {
164
+ workflowId: skip.workflowId,
165
+ sequence: skip.sequence,
166
+ },
167
+ })),
168
+ window,
169
+ aggregation: "count",
170
+ }),
171
+ };
172
+ for (const workflowId of workflows)
173
+ metrics[`flow.scheduleSkips.${workflowId}`] = reportMetric({
174
+ data: input?.skips == null
175
+ ? null
176
+ : input.skips
177
+ .filter((skip) => skip.workflowId === workflowId)
178
+ .map((skip) => ({
179
+ at: skip.at,
180
+ value: 1,
181
+ evidence: { workflowId, sequence: skip.sequence },
182
+ })),
183
+ window,
184
+ aggregation: "count",
185
+ });
186
+ return metrics;
187
+ }
188
+ export function reportFlowMetrics(input, window) {
189
+ return {
190
+ ...sampledMetrics(input, window),
191
+ ...skipMetrics(input.flow, window),
192
+ };
193
+ }
@@ -0,0 +1,67 @@
1
+ import type { Fields } from "./protocol.ts";
2
+ import { type ReportDatum, type ReportWindow } from "./report-statistics.ts";
3
+ export interface ReportOperatorInput {
4
+ readonly effects: readonly Fields[] | null;
5
+ readonly pulls: readonly ReportDatum[] | null;
6
+ readonly labels: readonly ReportDatum[] | null;
7
+ }
8
+ export declare function reportOperatorMetrics(input: ReportOperatorInput, window: ReportWindow): {
9
+ merges: {
10
+ evidence: Readonly<Record<string, unknown>>[];
11
+ mark?: string;
12
+ status: string;
13
+ value: number | null;
14
+ comparisonValue: number | null;
15
+ baseline: {
16
+ evidence: Readonly<Record<string, unknown>>[];
17
+ history: string;
18
+ days: number;
19
+ median: null;
20
+ band: null;
21
+ } | {
22
+ evidence: Readonly<Record<string, unknown>>[];
23
+ history: string;
24
+ days: number;
25
+ median: number;
26
+ band: null;
27
+ } | {
28
+ evidence: Readonly<Record<string, unknown>>[];
29
+ history: string;
30
+ days: number;
31
+ median: number;
32
+ band: {
33
+ low: number;
34
+ high: number;
35
+ };
36
+ };
37
+ };
38
+ labelChanges: {
39
+ evidence: Readonly<Record<string, unknown>>[];
40
+ mark?: string;
41
+ status: string;
42
+ value: number | null;
43
+ comparisonValue: number | null;
44
+ baseline: {
45
+ evidence: Readonly<Record<string, unknown>>[];
46
+ history: string;
47
+ days: number;
48
+ median: null;
49
+ band: null;
50
+ } | {
51
+ evidence: Readonly<Record<string, unknown>>[];
52
+ history: string;
53
+ days: number;
54
+ median: number;
55
+ band: null;
56
+ } | {
57
+ evidence: Readonly<Record<string, unknown>>[];
58
+ history: string;
59
+ days: number;
60
+ median: number;
61
+ band: {
62
+ low: number;
63
+ high: number;
64
+ };
65
+ };
66
+ };
67
+ };
@@ -0,0 +1,25 @@
1
+ import { reportOperatorEffects } from "./report-effects.js";
2
+ import { reportMetric, } from "./report-statistics.js";
3
+ export function reportOperatorMetrics(input, window) {
4
+ const merges = reportOperatorEffects(input.effects, "merge");
5
+ const labels = reportOperatorEffects(input.effects, "label");
6
+ return {
7
+ merges: reportMetric({
8
+ data: merges === null || input.pulls === null
9
+ ? null
10
+ : input.pulls.filter((pull) => !merges.some((effect) => effect.at < window.end &&
11
+ effect.number === pull.evidence["pullRequest"])),
12
+ window,
13
+ aggregation: "count",
14
+ }),
15
+ labelChanges: reportMetric({
16
+ data: labels === null || input.labels === null
17
+ ? null
18
+ : input.labels.filter((event) => !labels.some((effect) => effect.at < window.end &&
19
+ effect.number === event.evidence["issue"] &&
20
+ Math.abs(effect.at - event.at) <= 120_000)),
21
+ window,
22
+ aggregation: "count",
23
+ }),
24
+ };
25
+ }
@@ -0,0 +1,221 @@
1
+ import type { Fields } from "./protocol.ts";
2
+ import { type ReportDatum, type ReportWindow } from "./report-statistics.ts";
3
+ export interface QualityJob {
4
+ readonly id: number;
5
+ readonly runId: number;
6
+ readonly commit: string;
7
+ readonly name: string;
8
+ readonly attempt: number;
9
+ readonly at: number;
10
+ readonly conclusion: string | null;
11
+ }
12
+ export declare function reportFailureData(input: {
13
+ readonly jobs: readonly QualityJob[];
14
+ readonly names: Readonly<Record<number, readonly string[]>>;
15
+ }): {
16
+ flaky: ReportDatum[];
17
+ real: ReportDatum[];
18
+ };
19
+ export interface ReportQualityData {
20
+ readonly effects?: readonly Fields[] | null;
21
+ readonly daemonObservedSince?: number | null;
22
+ readonly reopened?: readonly ReportDatum[] | null;
23
+ readonly reverts?: readonly ReportDatum[] | null;
24
+ readonly jobLogs?: {
25
+ readonly read: number;
26
+ readonly notRead: number;
27
+ readonly limit: number;
28
+ readonly maximumBytes: number;
29
+ } | null;
30
+ readonly mainFirstPass?: readonly ReportDatum[] | null;
31
+ readonly failures?: {
32
+ readonly flaky: readonly ReportDatum[];
33
+ readonly real: readonly ReportDatum[];
34
+ } | null;
35
+ }
36
+ export declare function reportQualityMetrics(input: ReportQualityData, window: ReportWindow): {
37
+ reviewScore: {
38
+ [k: string]: {
39
+ evidence: Readonly<Record<string, unknown>>[];
40
+ mark?: string;
41
+ status: string;
42
+ value: number | null;
43
+ comparisonValue: number | null;
44
+ baseline: {
45
+ evidence: Readonly<Record<string, unknown>>[];
46
+ history: string;
47
+ days: number;
48
+ median: null;
49
+ band: null;
50
+ } | {
51
+ evidence: Readonly<Record<string, unknown>>[];
52
+ history: string;
53
+ days: number;
54
+ median: number;
55
+ band: null;
56
+ } | {
57
+ evidence: Readonly<Record<string, unknown>>[];
58
+ history: string;
59
+ days: number;
60
+ median: number;
61
+ band: {
62
+ low: number;
63
+ high: number;
64
+ };
65
+ };
66
+ };
67
+ };
68
+ reopenedTickets: {
69
+ evidence: Readonly<Record<string, unknown>>[];
70
+ mark?: string;
71
+ status: string;
72
+ value: number | null;
73
+ comparisonValue: number | null;
74
+ baseline: {
75
+ evidence: Readonly<Record<string, unknown>>[];
76
+ history: string;
77
+ days: number;
78
+ median: null;
79
+ band: null;
80
+ } | {
81
+ evidence: Readonly<Record<string, unknown>>[];
82
+ history: string;
83
+ days: number;
84
+ median: number;
85
+ band: null;
86
+ } | {
87
+ evidence: Readonly<Record<string, unknown>>[];
88
+ history: string;
89
+ days: number;
90
+ median: number;
91
+ band: {
92
+ low: number;
93
+ high: number;
94
+ };
95
+ };
96
+ };
97
+ revertedPullRequests: {
98
+ evidence: Readonly<Record<string, unknown>>[];
99
+ mark?: string;
100
+ status: string;
101
+ value: number | null;
102
+ comparisonValue: number | null;
103
+ baseline: {
104
+ evidence: Readonly<Record<string, unknown>>[];
105
+ history: string;
106
+ days: number;
107
+ median: null;
108
+ band: null;
109
+ } | {
110
+ evidence: Readonly<Record<string, unknown>>[];
111
+ history: string;
112
+ days: number;
113
+ median: number;
114
+ band: null;
115
+ } | {
116
+ evidence: Readonly<Record<string, unknown>>[];
117
+ history: string;
118
+ days: number;
119
+ median: number;
120
+ band: {
121
+ low: number;
122
+ high: number;
123
+ };
124
+ };
125
+ };
126
+ jobLogs: {
127
+ readonly read: number;
128
+ readonly notRead: number;
129
+ readonly limit: number;
130
+ readonly maximumBytes: number;
131
+ } | {
132
+ status: string;
133
+ };
134
+ mainFirstPassShare: {
135
+ evidence: Readonly<Record<string, unknown>>[];
136
+ mark?: string;
137
+ status: string;
138
+ value: number | null;
139
+ comparisonValue: number | null;
140
+ baseline: {
141
+ evidence: Readonly<Record<string, unknown>>[];
142
+ history: string;
143
+ days: number;
144
+ median: null;
145
+ band: null;
146
+ } | {
147
+ evidence: Readonly<Record<string, unknown>>[];
148
+ history: string;
149
+ days: number;
150
+ median: number;
151
+ band: null;
152
+ } | {
153
+ evidence: Readonly<Record<string, unknown>>[];
154
+ history: string;
155
+ days: number;
156
+ median: number;
157
+ band: {
158
+ low: number;
159
+ high: number;
160
+ };
161
+ };
162
+ };
163
+ flakyFailures: {
164
+ evidence: Readonly<Record<string, unknown>>[];
165
+ mark?: string;
166
+ status: string;
167
+ value: number | null;
168
+ comparisonValue: number | null;
169
+ baseline: {
170
+ evidence: Readonly<Record<string, unknown>>[];
171
+ history: string;
172
+ days: number;
173
+ median: null;
174
+ band: null;
175
+ } | {
176
+ evidence: Readonly<Record<string, unknown>>[];
177
+ history: string;
178
+ days: number;
179
+ median: number;
180
+ band: null;
181
+ } | {
182
+ evidence: Readonly<Record<string, unknown>>[];
183
+ history: string;
184
+ days: number;
185
+ median: number;
186
+ band: {
187
+ low: number;
188
+ high: number;
189
+ };
190
+ };
191
+ };
192
+ realFailures: {
193
+ evidence: Readonly<Record<string, unknown>>[];
194
+ mark?: string;
195
+ status: string;
196
+ value: number | null;
197
+ comparisonValue: number | null;
198
+ baseline: {
199
+ evidence: Readonly<Record<string, unknown>>[];
200
+ history: string;
201
+ days: number;
202
+ median: null;
203
+ band: null;
204
+ } | {
205
+ evidence: Readonly<Record<string, unknown>>[];
206
+ history: string;
207
+ days: number;
208
+ median: number;
209
+ band: null;
210
+ } | {
211
+ evidence: Readonly<Record<string, unknown>>[];
212
+ history: string;
213
+ days: number;
214
+ median: number;
215
+ band: {
216
+ low: number;
217
+ high: number;
218
+ };
219
+ };
220
+ };
221
+ };
@@ -0,0 +1,94 @@
1
+ import { reportReviewScores } from "./report-effects.js";
2
+ import { reportMetric, } from "./report-statistics.js";
3
+ function later(left, right) {
4
+ if (left.runId === right.runId)
5
+ return left.attempt > right.attempt;
6
+ return left.at > right.at;
7
+ }
8
+ export function reportFailureData(input) {
9
+ const groups = new Map();
10
+ for (const job of input.jobs) {
11
+ const key = JSON.stringify([job.commit, job.name]);
12
+ const group = groups.get(key) ?? [];
13
+ group.push(job);
14
+ groups.set(key, group);
15
+ }
16
+ const flaky = [];
17
+ const real = [];
18
+ for (const jobs of groups.values()) {
19
+ const failed = jobs.filter((job) => job.conclusion === "failure");
20
+ const passed = jobs.filter((job) => job.conclusion === "success");
21
+ const flakyJobs = failed.filter((job) => passed.some((success) => later(success, job)));
22
+ const realJobs = failed.filter((job) => !passed.some((success) => later(success, job)));
23
+ const successes = passed.filter((job) => flakyJobs.some((failure) => later(job, failure)));
24
+ flaky.push(...failureDatum({
25
+ failed: flakyJobs,
26
+ passed: successes,
27
+ names: input.names,
28
+ }));
29
+ real.push(...failureDatum({ failed: realJobs, passed: [], names: input.names }));
30
+ }
31
+ return { flaky, real };
32
+ }
33
+ export function reportQualityMetrics(input, window) {
34
+ const reviewScore = reviewMetrics(input, window);
35
+ return {
36
+ reviewScore,
37
+ reopenedTickets: reportMetric({
38
+ data: input.reopened ?? null,
39
+ window,
40
+ aggregation: "count",
41
+ }),
42
+ revertedPullRequests: reportMetric({
43
+ data: input.reverts ?? null,
44
+ window,
45
+ aggregation: "count",
46
+ }),
47
+ jobLogs: input.jobLogs ?? { status: "unavailable" },
48
+ mainFirstPassShare: reportMetric({
49
+ data: input.mainFirstPass ?? null,
50
+ window,
51
+ aggregation: "mean",
52
+ }),
53
+ flakyFailures: reportMetric({
54
+ data: input.failures?.flaky ?? null,
55
+ window,
56
+ aggregation: "distinct",
57
+ }),
58
+ realFailures: reportMetric({
59
+ data: input.failures?.real ?? null,
60
+ window,
61
+ aggregation: "distinct",
62
+ }),
63
+ };
64
+ }
65
+ function reviewMetrics(input, window) {
66
+ const rounds = reportReviewScores(input.effects ?? null);
67
+ const reviewScore = Object.fromEntries(Object.entries(rounds ?? { round1: null }).map(([key, data]) => [
68
+ key,
69
+ reportMetric({
70
+ data,
71
+ window: { ...window, observedSince: input.daemonObservedSince ?? null },
72
+ aggregation: "median",
73
+ }),
74
+ ]));
75
+ return reviewScore;
76
+ }
77
+ function failureDatum(input) {
78
+ return input.failed.map((failed) => {
79
+ const passed = input.passed.filter((job) => later(job, failed));
80
+ const jobs = [failed, ...passed];
81
+ return {
82
+ at: failed.at,
83
+ value: 1,
84
+ key: JSON.stringify([failed.commit, failed.name]),
85
+ evidence: {
86
+ commit: failed.commit,
87
+ jobName: failed.name,
88
+ testNames: input.names[failed.id] ?? ["unknown"],
89
+ jobIds: jobs.map((job) => job.id),
90
+ runIds: [...new Set(jobs.map((job) => job.runId))],
91
+ },
92
+ };
93
+ });
94
+ }
@@ -0,0 +1,23 @@
1
+ import type { ReportFlow, ReportReadyTicket } from "./report-flow-types.ts";
2
+ import type { ReportDatum, ReportWindow } from "./report-statistics.ts";
3
+ interface ReadyInput {
4
+ readonly tickets: readonly ReportReadyTicket[] | null;
5
+ readonly flow: ReportFlow | undefined;
6
+ }
7
+ export declare function reportReadyData(input: ReadyInput, window: ReportWindow): {
8
+ dependency: null;
9
+ noLane: null;
10
+ idle: null;
11
+ } | {
12
+ dependency: ReportDatum[];
13
+ noLane: ReportDatum[] | null;
14
+ idle: {
15
+ at: number;
16
+ value: number;
17
+ evidence: {
18
+ issues: number[];
19
+ runIds: string[];
20
+ };
21
+ }[] | null;
22
+ };
23
+ export {};