@promptwheel/cli 0.6.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 (530) hide show
  1. package/README.md +215 -0
  2. package/dist/bin/promptwheel.d.ts +17 -0
  3. package/dist/bin/promptwheel.d.ts.map +1 -0
  4. package/dist/bin/promptwheel.js +90 -0
  5. package/dist/bin/promptwheel.js.map +1 -0
  6. package/dist/commands/auto-auth.d.ts +26 -0
  7. package/dist/commands/auto-auth.d.ts.map +1 -0
  8. package/dist/commands/auto-auth.js +216 -0
  9. package/dist/commands/auto-auth.js.map +1 -0
  10. package/dist/commands/auto-ci-mode.d.ts +9 -0
  11. package/dist/commands/auto-ci-mode.d.ts.map +1 -0
  12. package/dist/commands/auto-ci-mode.js +176 -0
  13. package/dist/commands/auto-ci-mode.js.map +1 -0
  14. package/dist/commands/solo-analytics.d.ts +6 -0
  15. package/dist/commands/solo-analytics.d.ts.map +1 -0
  16. package/dist/commands/solo-analytics.js +267 -0
  17. package/dist/commands/solo-analytics.js.map +1 -0
  18. package/dist/commands/solo-auto.d.ts +6 -0
  19. package/dist/commands/solo-auto.d.ts.map +1 -0
  20. package/dist/commands/solo-auto.js +135 -0
  21. package/dist/commands/solo-auto.js.map +1 -0
  22. package/dist/commands/solo-daemon.d.ts +12 -0
  23. package/dist/commands/solo-daemon.d.ts.map +1 -0
  24. package/dist/commands/solo-daemon.js +177 -0
  25. package/dist/commands/solo-daemon.js.map +1 -0
  26. package/dist/commands/solo-exec.d.ts +6 -0
  27. package/dist/commands/solo-exec.d.ts.map +1 -0
  28. package/dist/commands/solo-exec.js +656 -0
  29. package/dist/commands/solo-exec.js.map +1 -0
  30. package/dist/commands/solo-inspect.d.ts +6 -0
  31. package/dist/commands/solo-inspect.d.ts.map +1 -0
  32. package/dist/commands/solo-inspect.js +765 -0
  33. package/dist/commands/solo-inspect.js.map +1 -0
  34. package/dist/commands/solo-lifecycle.d.ts +6 -0
  35. package/dist/commands/solo-lifecycle.d.ts.map +1 -0
  36. package/dist/commands/solo-lifecycle.js +226 -0
  37. package/dist/commands/solo-lifecycle.js.map +1 -0
  38. package/dist/commands/solo-nudge.d.ts +6 -0
  39. package/dist/commands/solo-nudge.d.ts.map +1 -0
  40. package/dist/commands/solo-nudge.js +49 -0
  41. package/dist/commands/solo-nudge.js.map +1 -0
  42. package/dist/commands/solo-qa.d.ts +6 -0
  43. package/dist/commands/solo-qa.d.ts.map +1 -0
  44. package/dist/commands/solo-qa.js +253 -0
  45. package/dist/commands/solo-qa.js.map +1 -0
  46. package/dist/commands/solo-trajectory.d.ts +6 -0
  47. package/dist/commands/solo-trajectory.d.ts.map +1 -0
  48. package/dist/commands/solo-trajectory.js +268 -0
  49. package/dist/commands/solo-trajectory.js.map +1 -0
  50. package/dist/commands/solo.d.ts +11 -0
  51. package/dist/commands/solo.d.ts.map +1 -0
  52. package/dist/commands/solo.js +52 -0
  53. package/dist/commands/solo.js.map +1 -0
  54. package/dist/index.d.ts +18 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +18 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/lib/artifacts.d.ts +136 -0
  59. package/dist/lib/artifacts.d.ts.map +1 -0
  60. package/dist/lib/artifacts.js +147 -0
  61. package/dist/lib/artifacts.js.map +1 -0
  62. package/dist/lib/codebase-index.d.ts +5 -0
  63. package/dist/lib/codebase-index.d.ts.map +1 -0
  64. package/dist/lib/codebase-index.js +5 -0
  65. package/dist/lib/codebase-index.js.map +1 -0
  66. package/dist/lib/cycle-context.d.ts +62 -0
  67. package/dist/lib/cycle-context.d.ts.map +1 -0
  68. package/dist/lib/cycle-context.js +141 -0
  69. package/dist/lib/cycle-context.js.map +1 -0
  70. package/dist/lib/daemon-fork.d.ts +39 -0
  71. package/dist/lib/daemon-fork.d.ts.map +1 -0
  72. package/dist/lib/daemon-fork.js +164 -0
  73. package/dist/lib/daemon-fork.js.map +1 -0
  74. package/dist/lib/daemon-notifier.d.ts +29 -0
  75. package/dist/lib/daemon-notifier.d.ts.map +1 -0
  76. package/dist/lib/daemon-notifier.js +147 -0
  77. package/dist/lib/daemon-notifier.js.map +1 -0
  78. package/dist/lib/daemon.d.ts +75 -0
  79. package/dist/lib/daemon.d.ts.map +1 -0
  80. package/dist/lib/daemon.js +265 -0
  81. package/dist/lib/daemon.js.map +1 -0
  82. package/dist/lib/dedup-memory.d.ts +46 -0
  83. package/dist/lib/dedup-memory.d.ts.map +1 -0
  84. package/dist/lib/dedup-memory.js +190 -0
  85. package/dist/lib/dedup-memory.js.map +1 -0
  86. package/dist/lib/dedup.d.ts +37 -0
  87. package/dist/lib/dedup.d.ts.map +1 -0
  88. package/dist/lib/dedup.js +85 -0
  89. package/dist/lib/dedup.js.map +1 -0
  90. package/dist/lib/display-adapter-log.d.ts +26 -0
  91. package/dist/lib/display-adapter-log.d.ts.map +1 -0
  92. package/dist/lib/display-adapter-log.js +63 -0
  93. package/dist/lib/display-adapter-log.js.map +1 -0
  94. package/dist/lib/display-adapter-spinner.d.ts +28 -0
  95. package/dist/lib/display-adapter-spinner.d.ts.map +1 -0
  96. package/dist/lib/display-adapter-spinner.js +93 -0
  97. package/dist/lib/display-adapter-spinner.js.map +1 -0
  98. package/dist/lib/display-adapter-tui.d.ts +32 -0
  99. package/dist/lib/display-adapter-tui.d.ts.map +1 -0
  100. package/dist/lib/display-adapter-tui.js +77 -0
  101. package/dist/lib/display-adapter-tui.js.map +1 -0
  102. package/dist/lib/display-adapter.d.ts +40 -0
  103. package/dist/lib/display-adapter.d.ts.map +1 -0
  104. package/dist/lib/display-adapter.js +9 -0
  105. package/dist/lib/display-adapter.js.map +1 -0
  106. package/dist/lib/doctor.d.ts +45 -0
  107. package/dist/lib/doctor.d.ts.map +1 -0
  108. package/dist/lib/doctor.js +382 -0
  109. package/dist/lib/doctor.js.map +1 -0
  110. package/dist/lib/exclusion-index.d.ts +50 -0
  111. package/dist/lib/exclusion-index.d.ts.map +1 -0
  112. package/dist/lib/exclusion-index.js +249 -0
  113. package/dist/lib/exclusion-index.js.map +1 -0
  114. package/dist/lib/exec.d.ts +24 -0
  115. package/dist/lib/exec.d.ts.map +1 -0
  116. package/dist/lib/exec.js +295 -0
  117. package/dist/lib/exec.js.map +1 -0
  118. package/dist/lib/execution-backends/claude.d.ts +27 -0
  119. package/dist/lib/execution-backends/claude.d.ts.map +1 -0
  120. package/dist/lib/execution-backends/claude.js +161 -0
  121. package/dist/lib/execution-backends/claude.js.map +1 -0
  122. package/dist/lib/execution-backends/codex.d.ts +28 -0
  123. package/dist/lib/execution-backends/codex.d.ts.map +1 -0
  124. package/dist/lib/execution-backends/codex.js +216 -0
  125. package/dist/lib/execution-backends/codex.js.map +1 -0
  126. package/dist/lib/execution-backends/index.d.ts +10 -0
  127. package/dist/lib/execution-backends/index.d.ts.map +1 -0
  128. package/dist/lib/execution-backends/index.js +9 -0
  129. package/dist/lib/execution-backends/index.js.map +1 -0
  130. package/dist/lib/execution-backends/kimi.d.ts +25 -0
  131. package/dist/lib/execution-backends/kimi.d.ts.map +1 -0
  132. package/dist/lib/execution-backends/kimi.js +76 -0
  133. package/dist/lib/execution-backends/kimi.js.map +1 -0
  134. package/dist/lib/execution-backends/types.d.ts +38 -0
  135. package/dist/lib/execution-backends/types.d.ts.map +1 -0
  136. package/dist/lib/execution-backends/types.js +5 -0
  137. package/dist/lib/execution-backends/types.js.map +1 -0
  138. package/dist/lib/failure-classifier.d.ts +11 -0
  139. package/dist/lib/failure-classifier.d.ts.map +1 -0
  140. package/dist/lib/failure-classifier.js +24 -0
  141. package/dist/lib/failure-classifier.js.map +1 -0
  142. package/dist/lib/file-cooldown.d.ts +9 -0
  143. package/dist/lib/file-cooldown.d.ts.map +1 -0
  144. package/dist/lib/file-cooldown.js +75 -0
  145. package/dist/lib/file-cooldown.js.map +1 -0
  146. package/dist/lib/formulas.d.ts +52 -0
  147. package/dist/lib/formulas.d.ts.map +1 -0
  148. package/dist/lib/formulas.js +123 -0
  149. package/dist/lib/formulas.js.map +1 -0
  150. package/dist/lib/git.d.ts +9 -0
  151. package/dist/lib/git.d.ts.map +1 -0
  152. package/dist/lib/git.js +60 -0
  153. package/dist/lib/git.js.map +1 -0
  154. package/dist/lib/goals.d.ts +59 -0
  155. package/dist/lib/goals.d.ts.map +1 -0
  156. package/dist/lib/goals.js +216 -0
  157. package/dist/lib/goals.js.map +1 -0
  158. package/dist/lib/guidelines.d.ts +32 -0
  159. package/dist/lib/guidelines.d.ts.map +1 -0
  160. package/dist/lib/guidelines.js +102 -0
  161. package/dist/lib/guidelines.js.map +1 -0
  162. package/dist/lib/learnings.d.ts +65 -0
  163. package/dist/lib/learnings.d.ts.map +1 -0
  164. package/dist/lib/learnings.js +193 -0
  165. package/dist/lib/learnings.js.map +1 -0
  166. package/dist/lib/logger.d.ts +17 -0
  167. package/dist/lib/logger.d.ts.map +1 -0
  168. package/dist/lib/logger.js +42 -0
  169. package/dist/lib/logger.js.map +1 -0
  170. package/dist/lib/meta-learnings.d.ts +27 -0
  171. package/dist/lib/meta-learnings.d.ts.map +1 -0
  172. package/dist/lib/meta-learnings.js +270 -0
  173. package/dist/lib/meta-learnings.js.map +1 -0
  174. package/dist/lib/metrics.d.ts +48 -0
  175. package/dist/lib/metrics.d.ts.map +1 -0
  176. package/dist/lib/metrics.js +107 -0
  177. package/dist/lib/metrics.js.map +1 -0
  178. package/dist/lib/openai-local-execution.d.ts +29 -0
  179. package/dist/lib/openai-local-execution.d.ts.map +1 -0
  180. package/dist/lib/openai-local-execution.js +282 -0
  181. package/dist/lib/openai-local-execution.js.map +1 -0
  182. package/dist/lib/project-metadata/csharp.d.ts +6 -0
  183. package/dist/lib/project-metadata/csharp.d.ts.map +1 -0
  184. package/dist/lib/project-metadata/csharp.js +19 -0
  185. package/dist/lib/project-metadata/csharp.js.map +1 -0
  186. package/dist/lib/project-metadata/elixir.d.ts +6 -0
  187. package/dist/lib/project-metadata/elixir.d.ts.map +1 -0
  188. package/dist/lib/project-metadata/elixir.js +23 -0
  189. package/dist/lib/project-metadata/elixir.js.map +1 -0
  190. package/dist/lib/project-metadata/go.d.ts +6 -0
  191. package/dist/lib/project-metadata/go.d.ts.map +1 -0
  192. package/dist/lib/project-metadata/go.js +30 -0
  193. package/dist/lib/project-metadata/go.js.map +1 -0
  194. package/dist/lib/project-metadata/index.d.ts +13 -0
  195. package/dist/lib/project-metadata/index.d.ts.map +1 -0
  196. package/dist/lib/project-metadata/index.js +111 -0
  197. package/dist/lib/project-metadata/index.js.map +1 -0
  198. package/dist/lib/project-metadata/java.d.ts +6 -0
  199. package/dist/lib/project-metadata/java.d.ts.map +1 -0
  200. package/dist/lib/project-metadata/java.js +37 -0
  201. package/dist/lib/project-metadata/java.js.map +1 -0
  202. package/dist/lib/project-metadata/node.d.ts +6 -0
  203. package/dist/lib/project-metadata/node.d.ts.map +1 -0
  204. package/dist/lib/project-metadata/node.js +135 -0
  205. package/dist/lib/project-metadata/node.js.map +1 -0
  206. package/dist/lib/project-metadata/php.d.ts +6 -0
  207. package/dist/lib/project-metadata/php.d.ts.map +1 -0
  208. package/dist/lib/project-metadata/php.js +29 -0
  209. package/dist/lib/project-metadata/php.js.map +1 -0
  210. package/dist/lib/project-metadata/python.d.ts +6 -0
  211. package/dist/lib/project-metadata/python.d.ts.map +1 -0
  212. package/dist/lib/project-metadata/python.js +79 -0
  213. package/dist/lib/project-metadata/python.js.map +1 -0
  214. package/dist/lib/project-metadata/ruby.d.ts +6 -0
  215. package/dist/lib/project-metadata/ruby.d.ts.map +1 -0
  216. package/dist/lib/project-metadata/ruby.js +38 -0
  217. package/dist/lib/project-metadata/ruby.js.map +1 -0
  218. package/dist/lib/project-metadata/rust.d.ts +6 -0
  219. package/dist/lib/project-metadata/rust.d.ts.map +1 -0
  220. package/dist/lib/project-metadata/rust.js +33 -0
  221. package/dist/lib/project-metadata/rust.js.map +1 -0
  222. package/dist/lib/project-metadata/swift.d.ts +6 -0
  223. package/dist/lib/project-metadata/swift.d.ts.map +1 -0
  224. package/dist/lib/project-metadata/swift.js +19 -0
  225. package/dist/lib/project-metadata/swift.js.map +1 -0
  226. package/dist/lib/project-metadata/types.d.ts +37 -0
  227. package/dist/lib/project-metadata/types.d.ts.map +1 -0
  228. package/dist/lib/project-metadata/types.js +5 -0
  229. package/dist/lib/project-metadata/types.js.map +1 -0
  230. package/dist/lib/proposal-review.d.ts +9 -0
  231. package/dist/lib/proposal-review.d.ts.map +1 -0
  232. package/dist/lib/proposal-review.js +9 -0
  233. package/dist/lib/proposal-review.js.map +1 -0
  234. package/dist/lib/providers/claude.d.ts +6 -0
  235. package/dist/lib/providers/claude.d.ts.map +1 -0
  236. package/dist/lib/providers/claude.js +21 -0
  237. package/dist/lib/providers/claude.js.map +1 -0
  238. package/dist/lib/providers/codex.d.ts +6 -0
  239. package/dist/lib/providers/codex.d.ts.map +1 -0
  240. package/dist/lib/providers/codex.js +26 -0
  241. package/dist/lib/providers/codex.js.map +1 -0
  242. package/dist/lib/providers/index.d.ts +22 -0
  243. package/dist/lib/providers/index.d.ts.map +1 -0
  244. package/dist/lib/providers/index.js +39 -0
  245. package/dist/lib/providers/index.js.map +1 -0
  246. package/dist/lib/providers/kimi.d.ts +6 -0
  247. package/dist/lib/providers/kimi.d.ts.map +1 -0
  248. package/dist/lib/providers/kimi.js +22 -0
  249. package/dist/lib/providers/kimi.js.map +1 -0
  250. package/dist/lib/providers/openai-local.d.ts +8 -0
  251. package/dist/lib/providers/openai-local.d.ts.map +1 -0
  252. package/dist/lib/providers/openai-local.js +30 -0
  253. package/dist/lib/providers/openai-local.js.map +1 -0
  254. package/dist/lib/providers/types.d.ts +37 -0
  255. package/dist/lib/providers/types.d.ts.map +1 -0
  256. package/dist/lib/providers/types.js +5 -0
  257. package/dist/lib/providers/types.js.map +1 -0
  258. package/dist/lib/qa-stats.d.ts +113 -0
  259. package/dist/lib/qa-stats.d.ts.map +1 -0
  260. package/dist/lib/qa-stats.js +311 -0
  261. package/dist/lib/qa-stats.js.map +1 -0
  262. package/dist/lib/retention.d.ts +125 -0
  263. package/dist/lib/retention.d.ts.map +1 -0
  264. package/dist/lib/retention.js +767 -0
  265. package/dist/lib/retention.js.map +1 -0
  266. package/dist/lib/run-history.d.ts +52 -0
  267. package/dist/lib/run-history.d.ts.map +1 -0
  268. package/dist/lib/run-history.js +116 -0
  269. package/dist/lib/run-history.js.map +1 -0
  270. package/dist/lib/run-state.d.ts +129 -0
  271. package/dist/lib/run-state.d.ts.map +1 -0
  272. package/dist/lib/run-state.js +312 -0
  273. package/dist/lib/run-state.js.map +1 -0
  274. package/dist/lib/scope.d.ts +8 -0
  275. package/dist/lib/scope.d.ts.map +1 -0
  276. package/dist/lib/scope.js +8 -0
  277. package/dist/lib/scope.js.map +1 -0
  278. package/dist/lib/scout-prompt-builder.d.ts +22 -0
  279. package/dist/lib/scout-prompt-builder.d.ts.map +1 -0
  280. package/dist/lib/scout-prompt-builder.js +97 -0
  281. package/dist/lib/scout-prompt-builder.js.map +1 -0
  282. package/dist/lib/sectors.d.ts +21 -0
  283. package/dist/lib/sectors.d.ts.map +1 -0
  284. package/dist/lib/sectors.js +96 -0
  285. package/dist/lib/sectors.js.map +1 -0
  286. package/dist/lib/selection.d.ts +35 -0
  287. package/dist/lib/selection.d.ts.map +1 -0
  288. package/dist/lib/selection.js +110 -0
  289. package/dist/lib/selection.js.map +1 -0
  290. package/dist/lib/session-report.d.ts +26 -0
  291. package/dist/lib/session-report.d.ts.map +1 -0
  292. package/dist/lib/session-report.js +143 -0
  293. package/dist/lib/session-report.js.map +1 -0
  294. package/dist/lib/solo-auto-between-cycles.d.ts +10 -0
  295. package/dist/lib/solo-auto-between-cycles.d.ts.map +1 -0
  296. package/dist/lib/solo-auto-between-cycles.js +577 -0
  297. package/dist/lib/solo-auto-between-cycles.js.map +1 -0
  298. package/dist/lib/solo-auto-execute.d.ts +22 -0
  299. package/dist/lib/solo-auto-execute.d.ts.map +1 -0
  300. package/dist/lib/solo-auto-execute.js +530 -0
  301. package/dist/lib/solo-auto-execute.js.map +1 -0
  302. package/dist/lib/solo-auto-filter.d.ts +14 -0
  303. package/dist/lib/solo-auto-filter.d.ts.map +1 -0
  304. package/dist/lib/solo-auto-filter.js +311 -0
  305. package/dist/lib/solo-auto-filter.js.map +1 -0
  306. package/dist/lib/solo-auto-finalize.d.ts +6 -0
  307. package/dist/lib/solo-auto-finalize.d.ts.map +1 -0
  308. package/dist/lib/solo-auto-finalize.js +242 -0
  309. package/dist/lib/solo-auto-finalize.js.map +1 -0
  310. package/dist/lib/solo-auto-init-qa.d.ts +23 -0
  311. package/dist/lib/solo-auto-init-qa.d.ts.map +1 -0
  312. package/dist/lib/solo-auto-init-qa.js +183 -0
  313. package/dist/lib/solo-auto-init-qa.js.map +1 -0
  314. package/dist/lib/solo-auto-planning.d.ts +40 -0
  315. package/dist/lib/solo-auto-planning.d.ts.map +1 -0
  316. package/dist/lib/solo-auto-planning.js +171 -0
  317. package/dist/lib/solo-auto-planning.js.map +1 -0
  318. package/dist/lib/solo-auto-scout.d.ts +18 -0
  319. package/dist/lib/solo-auto-scout.d.ts.map +1 -0
  320. package/dist/lib/solo-auto-scout.js +269 -0
  321. package/dist/lib/solo-auto-scout.js.map +1 -0
  322. package/dist/lib/solo-auto-state.d.ts +20 -0
  323. package/dist/lib/solo-auto-state.d.ts.map +1 -0
  324. package/dist/lib/solo-auto-state.js +859 -0
  325. package/dist/lib/solo-auto-state.js.map +1 -0
  326. package/dist/lib/solo-auto-types.d.ts +197 -0
  327. package/dist/lib/solo-auto-types.d.ts.map +1 -0
  328. package/dist/lib/solo-auto-types.js +11 -0
  329. package/dist/lib/solo-auto-types.js.map +1 -0
  330. package/dist/lib/solo-auto-utils.d.ts +23 -0
  331. package/dist/lib/solo-auto-utils.d.ts.map +1 -0
  332. package/dist/lib/solo-auto-utils.js +53 -0
  333. package/dist/lib/solo-auto-utils.js.map +1 -0
  334. package/dist/lib/solo-auto.d.ts +25 -0
  335. package/dist/lib/solo-auto.d.ts.map +1 -0
  336. package/dist/lib/solo-auto.js +345 -0
  337. package/dist/lib/solo-auto.js.map +1 -0
  338. package/dist/lib/solo-ci.d.ts +84 -0
  339. package/dist/lib/solo-ci.d.ts.map +1 -0
  340. package/dist/lib/solo-ci.js +306 -0
  341. package/dist/lib/solo-ci.js.map +1 -0
  342. package/dist/lib/solo-config.d.ts +242 -0
  343. package/dist/lib/solo-config.d.ts.map +1 -0
  344. package/dist/lib/solo-config.js +354 -0
  345. package/dist/lib/solo-config.js.map +1 -0
  346. package/dist/lib/solo-cycle-formula.d.ts +36 -0
  347. package/dist/lib/solo-cycle-formula.d.ts.map +1 -0
  348. package/dist/lib/solo-cycle-formula.js +90 -0
  349. package/dist/lib/solo-cycle-formula.js.map +1 -0
  350. package/dist/lib/solo-git.d.ts +87 -0
  351. package/dist/lib/solo-git.d.ts.map +1 -0
  352. package/dist/lib/solo-git.js +365 -0
  353. package/dist/lib/solo-git.js.map +1 -0
  354. package/dist/lib/solo-hints.d.ts +32 -0
  355. package/dist/lib/solo-hints.d.ts.map +1 -0
  356. package/dist/lib/solo-hints.js +98 -0
  357. package/dist/lib/solo-hints.js.map +1 -0
  358. package/dist/lib/solo-prompt-builder.d.ts +12 -0
  359. package/dist/lib/solo-prompt-builder.d.ts.map +1 -0
  360. package/dist/lib/solo-prompt-builder.js +53 -0
  361. package/dist/lib/solo-prompt-builder.js.map +1 -0
  362. package/dist/lib/solo-qa-retry.d.ts +43 -0
  363. package/dist/lib/solo-qa-retry.d.ts.map +1 -0
  364. package/dist/lib/solo-qa-retry.js +125 -0
  365. package/dist/lib/solo-qa-retry.js.map +1 -0
  366. package/dist/lib/solo-remote.d.ts +14 -0
  367. package/dist/lib/solo-remote.d.ts.map +1 -0
  368. package/dist/lib/solo-remote.js +48 -0
  369. package/dist/lib/solo-remote.js.map +1 -0
  370. package/dist/lib/solo-session-summary.d.ts +52 -0
  371. package/dist/lib/solo-session-summary.d.ts.map +1 -0
  372. package/dist/lib/solo-session-summary.js +188 -0
  373. package/dist/lib/solo-session-summary.js.map +1 -0
  374. package/dist/lib/solo-stdin.d.ts +33 -0
  375. package/dist/lib/solo-stdin.d.ts.map +1 -0
  376. package/dist/lib/solo-stdin.js +299 -0
  377. package/dist/lib/solo-stdin.js.map +1 -0
  378. package/dist/lib/solo-ticket-qa.d.ts +19 -0
  379. package/dist/lib/solo-ticket-qa.d.ts.map +1 -0
  380. package/dist/lib/solo-ticket-qa.js +68 -0
  381. package/dist/lib/solo-ticket-qa.js.map +1 -0
  382. package/dist/lib/solo-ticket-types.d.ts +146 -0
  383. package/dist/lib/solo-ticket-types.d.ts.map +1 -0
  384. package/dist/lib/solo-ticket-types.js +26 -0
  385. package/dist/lib/solo-ticket-types.js.map +1 -0
  386. package/dist/lib/solo-ticket.d.ts +12 -0
  387. package/dist/lib/solo-ticket.d.ts.map +1 -0
  388. package/dist/lib/solo-ticket.js +192 -0
  389. package/dist/lib/solo-ticket.js.map +1 -0
  390. package/dist/lib/solo-utils.d.ts +130 -0
  391. package/dist/lib/solo-utils.d.ts.map +1 -0
  392. package/dist/lib/solo-utils.js +277 -0
  393. package/dist/lib/solo-utils.js.map +1 -0
  394. package/dist/lib/spindle/failure-patterns.d.ts +15 -0
  395. package/dist/lib/spindle/failure-patterns.d.ts.map +1 -0
  396. package/dist/lib/spindle/failure-patterns.js +22 -0
  397. package/dist/lib/spindle/failure-patterns.js.map +1 -0
  398. package/dist/lib/spindle/format.d.ts +9 -0
  399. package/dist/lib/spindle/format.d.ts.map +1 -0
  400. package/dist/lib/spindle/format.js +37 -0
  401. package/dist/lib/spindle/format.js.map +1 -0
  402. package/dist/lib/spindle/index.d.ts +33 -0
  403. package/dist/lib/spindle/index.d.ts.map +1 -0
  404. package/dist/lib/spindle/index.js +231 -0
  405. package/dist/lib/spindle/index.js.map +1 -0
  406. package/dist/lib/spindle/oscillation.d.ts +17 -0
  407. package/dist/lib/spindle/oscillation.d.ts.map +1 -0
  408. package/dist/lib/spindle/oscillation.js +96 -0
  409. package/dist/lib/spindle/oscillation.js.map +1 -0
  410. package/dist/lib/spindle/repetition.d.ts +16 -0
  411. package/dist/lib/spindle/repetition.d.ts.map +1 -0
  412. package/dist/lib/spindle/repetition.js +52 -0
  413. package/dist/lib/spindle/repetition.js.map +1 -0
  414. package/dist/lib/spindle/similarity.d.ts +14 -0
  415. package/dist/lib/spindle/similarity.d.ts.map +1 -0
  416. package/dist/lib/spindle/similarity.js +58 -0
  417. package/dist/lib/spindle/similarity.js.map +1 -0
  418. package/dist/lib/spindle/types.d.ts +97 -0
  419. package/dist/lib/spindle/types.d.ts.map +1 -0
  420. package/dist/lib/spindle/types.js +46 -0
  421. package/dist/lib/spindle/types.js.map +1 -0
  422. package/dist/lib/spinner.d.ts +41 -0
  423. package/dist/lib/spinner.d.ts.map +1 -0
  424. package/dist/lib/spinner.js +186 -0
  425. package/dist/lib/spinner.js.map +1 -0
  426. package/dist/lib/taste-profile.d.ts +26 -0
  427. package/dist/lib/taste-profile.d.ts.map +1 -0
  428. package/dist/lib/taste-profile.js +121 -0
  429. package/dist/lib/taste-profile.js.map +1 -0
  430. package/dist/lib/ticket-steps/index.d.ts +14 -0
  431. package/dist/lib/ticket-steps/index.d.ts.map +1 -0
  432. package/dist/lib/ticket-steps/index.js +13 -0
  433. package/dist/lib/ticket-steps/index.js.map +1 -0
  434. package/dist/lib/ticket-steps/step-agent.d.ts +6 -0
  435. package/dist/lib/ticket-steps/step-agent.d.ts.map +1 -0
  436. package/dist/lib/ticket-steps/step-agent.js +122 -0
  437. package/dist/lib/ticket-steps/step-agent.js.map +1 -0
  438. package/dist/lib/ticket-steps/step-cleanup.d.ts +6 -0
  439. package/dist/lib/ticket-steps/step-cleanup.d.ts.map +1 -0
  440. package/dist/lib/ticket-steps/step-cleanup.js +11 -0
  441. package/dist/lib/ticket-steps/step-cleanup.js.map +1 -0
  442. package/dist/lib/ticket-steps/step-commit.d.ts +6 -0
  443. package/dist/lib/ticket-steps/step-commit.d.ts.map +1 -0
  444. package/dist/lib/ticket-steps/step-commit.js +31 -0
  445. package/dist/lib/ticket-steps/step-commit.js.map +1 -0
  446. package/dist/lib/ticket-steps/step-pr.d.ts +6 -0
  447. package/dist/lib/ticket-steps/step-pr.d.ts.map +1 -0
  448. package/dist/lib/ticket-steps/step-pr.js +38 -0
  449. package/dist/lib/ticket-steps/step-pr.js.map +1 -0
  450. package/dist/lib/ticket-steps/step-push.d.ts +6 -0
  451. package/dist/lib/ticket-steps/step-push.d.ts.map +1 -0
  452. package/dist/lib/ticket-steps/step-push.js +35 -0
  453. package/dist/lib/ticket-steps/step-push.js.map +1 -0
  454. package/dist/lib/ticket-steps/step-qa.d.ts +6 -0
  455. package/dist/lib/ticket-steps/step-qa.d.ts.map +1 -0
  456. package/dist/lib/ticket-steps/step-qa.js +300 -0
  457. package/dist/lib/ticket-steps/step-qa.js.map +1 -0
  458. package/dist/lib/ticket-steps/step-scope.d.ts +6 -0
  459. package/dist/lib/ticket-steps/step-scope.d.ts.map +1 -0
  460. package/dist/lib/ticket-steps/step-scope.js +121 -0
  461. package/dist/lib/ticket-steps/step-scope.js.map +1 -0
  462. package/dist/lib/ticket-steps/step-spindle.d.ts +9 -0
  463. package/dist/lib/ticket-steps/step-spindle.d.ts.map +1 -0
  464. package/dist/lib/ticket-steps/step-spindle.js +160 -0
  465. package/dist/lib/ticket-steps/step-spindle.js.map +1 -0
  466. package/dist/lib/ticket-steps/step-worktree.d.ts +6 -0
  467. package/dist/lib/ticket-steps/step-worktree.d.ts.map +1 -0
  468. package/dist/lib/ticket-steps/step-worktree.js +157 -0
  469. package/dist/lib/ticket-steps/step-worktree.js.map +1 -0
  470. package/dist/lib/ticket-steps/types.d.ts +70 -0
  471. package/dist/lib/ticket-steps/types.d.ts.map +1 -0
  472. package/dist/lib/ticket-steps/types.js +8 -0
  473. package/dist/lib/ticket-steps/types.js.map +1 -0
  474. package/dist/lib/tool-command-map.d.ts +11 -0
  475. package/dist/lib/tool-command-map.d.ts.map +1 -0
  476. package/dist/lib/tool-command-map.js +24 -0
  477. package/dist/lib/tool-command-map.js.map +1 -0
  478. package/dist/lib/trajectory-generate.d.ts +24 -0
  479. package/dist/lib/trajectory-generate.d.ts.map +1 -0
  480. package/dist/lib/trajectory-generate.js +163 -0
  481. package/dist/lib/trajectory-generate.js.map +1 -0
  482. package/dist/lib/trajectory.d.ts +20 -0
  483. package/dist/lib/trajectory.d.ts.map +1 -0
  484. package/dist/lib/trajectory.js +104 -0
  485. package/dist/lib/trajectory.js.map +1 -0
  486. package/dist/lib/trigger-config.d.ts +12 -0
  487. package/dist/lib/trigger-config.d.ts.map +1 -0
  488. package/dist/lib/trigger-config.js +37 -0
  489. package/dist/lib/trigger-config.js.map +1 -0
  490. package/dist/lib/update-check.d.ts +28 -0
  491. package/dist/lib/update-check.d.ts.map +1 -0
  492. package/dist/lib/update-check.js +178 -0
  493. package/dist/lib/update-check.js.map +1 -0
  494. package/dist/lib/wave-scheduling.d.ts +18 -0
  495. package/dist/lib/wave-scheduling.d.ts.map +1 -0
  496. package/dist/lib/wave-scheduling.js +29 -0
  497. package/dist/lib/wave-scheduling.js.map +1 -0
  498. package/dist/tui/app.d.ts +17 -0
  499. package/dist/tui/app.d.ts.map +1 -0
  500. package/dist/tui/app.js +139 -0
  501. package/dist/tui/app.js.map +1 -0
  502. package/dist/tui/index.d.ts +10 -0
  503. package/dist/tui/index.d.ts.map +1 -0
  504. package/dist/tui/index.js +9 -0
  505. package/dist/tui/index.js.map +1 -0
  506. package/dist/tui/poller.d.ts +42 -0
  507. package/dist/tui/poller.d.ts.map +1 -0
  508. package/dist/tui/poller.js +62 -0
  509. package/dist/tui/poller.js.map +1 -0
  510. package/dist/tui/screens/auto.d.ts +85 -0
  511. package/dist/tui/screens/auto.d.ts.map +1 -0
  512. package/dist/tui/screens/auto.js +440 -0
  513. package/dist/tui/screens/auto.js.map +1 -0
  514. package/dist/tui/screens/overview.d.ts +9 -0
  515. package/dist/tui/screens/overview.d.ts.map +1 -0
  516. package/dist/tui/screens/overview.js +189 -0
  517. package/dist/tui/screens/overview.js.map +1 -0
  518. package/dist/tui/state.d.ts +93 -0
  519. package/dist/tui/state.d.ts.map +1 -0
  520. package/dist/tui/state.js +169 -0
  521. package/dist/tui/state.js.map +1 -0
  522. package/dist/tui/ticket-output-buffer.d.ts +23 -0
  523. package/dist/tui/ticket-output-buffer.d.ts.map +1 -0
  524. package/dist/tui/ticket-output-buffer.js +60 -0
  525. package/dist/tui/ticket-output-buffer.js.map +1 -0
  526. package/dist/tui/types.d.ts +18 -0
  527. package/dist/tui/types.d.ts.map +1 -0
  528. package/dist/tui/types.js +5 -0
  529. package/dist/tui/types.js.map +1 -0
  530. package/package.json +70 -0
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Step 2: Run the execution agent (Claude, Codex, etc.)
3
+ */
4
+ import { writeJsonArtifact } from '../artifacts.js';
5
+ import { ClaudeExecutionBackend } from '../execution-backends/index.js';
6
+ import { buildTicketPrompt } from '../solo-prompt-builder.js';
7
+ import { cleanupWorktree } from '../solo-git.js';
8
+ import { loadTriggerRules } from '../trigger-config.js';
9
+ import { analyzeTrace, computeLiveness, } from '@promptwheel/core/trace/shared';
10
+ export async function run(ctx) {
11
+ const { ticket, repoRoot, worktreePath, baseDir, opts, startTime, onProgress } = ctx;
12
+ const { runId, verbose, timeoutMs } = opts;
13
+ await ctx.markStep('agent', 'started');
14
+ const prompt = buildTicketPrompt(ticket, opts.guidelinesContext, opts.learningsContext, opts.metadataContext, { confidence: opts.confidence, complexity: opts.complexity });
15
+ ctx.execBackend = opts.executionBackend ?? new ClaudeExecutionBackend();
16
+ const claudeResult = await ctx.execBackend.run({
17
+ worktreePath,
18
+ prompt,
19
+ timeoutMs,
20
+ verbose,
21
+ onProgress,
22
+ onRawOutput: opts.onRawOutput,
23
+ });
24
+ // Save agent artifact
25
+ const agentArtifactPath = writeJsonArtifact({
26
+ baseDir,
27
+ type: 'executions',
28
+ id: runId,
29
+ data: {
30
+ runId,
31
+ ticketId: ticket.id,
32
+ prompt,
33
+ stdout: claudeResult.stdout,
34
+ stderr: claudeResult.stderr,
35
+ exitCode: claudeResult.exitCode,
36
+ timedOut: claudeResult.timedOut,
37
+ durationMs: claudeResult.durationMs,
38
+ },
39
+ });
40
+ ctx.artifactPaths.execution = agentArtifactPath;
41
+ if (!claudeResult.success) {
42
+ await ctx.markStep('agent', 'failed', {
43
+ errorMessage: claudeResult.error ?? 'Agent execution failed',
44
+ metadata: { artifactPath: agentArtifactPath },
45
+ });
46
+ await ctx.skipRemaining(2, 'Agent failed');
47
+ await cleanupWorktree(repoRoot, worktreePath);
48
+ const baseError = claudeResult.error ?? 'Claude execution failed';
49
+ const errorParts = [
50
+ claudeResult.timedOut ? 'Agent timed out' : 'Agent execution failed',
51
+ ` ${baseError}`,
52
+ '',
53
+ ];
54
+ if (claudeResult.timedOut) {
55
+ errorParts.push('The agent exceeded its time limit.');
56
+ errorParts.push('Consider breaking down the ticket into smaller tasks.');
57
+ }
58
+ errorParts.push(`To retry: promptwheel solo run ${ticket.id}`);
59
+ errorParts.push(`Execution logs: ${agentArtifactPath}`);
60
+ const result = {
61
+ success: false,
62
+ durationMs: Date.now() - startTime,
63
+ error: errorParts.join('\n'),
64
+ failureReason: claudeResult.timedOut ? 'timeout' : 'agent_error',
65
+ artifacts: { ...ctx.artifactPaths },
66
+ };
67
+ await ctx.saveRunSummary(result);
68
+ return { continue: false, result };
69
+ }
70
+ await ctx.markStep('agent', 'success', {
71
+ metadata: { artifactPath: agentArtifactPath, durationMs: claudeResult.durationMs },
72
+ });
73
+ // Store stdout on context for spindle check
74
+ ctx.agentStdout = claudeResult.stdout;
75
+ // Run trace analysis if stream-json events are available
76
+ if (claudeResult.traceEvents && claudeResult.traceEvents.length > 0) {
77
+ try {
78
+ const triggerRules = loadTriggerRules(ctx.repoRoot);
79
+ // Build full analysis using real timestamps for liveness
80
+ const traceAnalysis = analyzeTrace(claudeResult.stdout, triggerRules);
81
+ // Override liveness with real timestamps when available
82
+ if (claudeResult.traceTimestamps && claudeResult.traceTimestamps.length > 1) {
83
+ traceAnalysis.liveness = computeLiveness(claudeResult.traceEvents, claudeResult.traceTimestamps);
84
+ }
85
+ ctx.traceAnalysis = traceAnalysis;
86
+ // Save trace artifact
87
+ writeJsonArtifact({
88
+ baseDir: ctx.baseDir,
89
+ type: 'traces',
90
+ id: runId,
91
+ data: traceAnalysis,
92
+ });
93
+ // Feed stall signal into spindle state
94
+ if (traceAnalysis.liveness.max_gap_ms > 60_000) {
95
+ ctx.spindleState.iterationsSinceChange = Math.max(ctx.spindleState.iterationsSinceChange, Math.floor(traceAnalysis.liveness.max_gap_ms / 30_000));
96
+ }
97
+ // Check for abort triggers
98
+ const abortAlert = traceAnalysis.alerts.find(a => a.action === 'abort');
99
+ if (abortAlert) {
100
+ await ctx.markStep('agent', 'failed', {
101
+ errorMessage: `Trigger abort: ${abortAlert.message}`,
102
+ });
103
+ await ctx.skipRemaining(2, 'Trigger abort');
104
+ await cleanupWorktree(repoRoot, worktreePath);
105
+ const result = {
106
+ success: false,
107
+ durationMs: Date.now() - startTime,
108
+ error: `Trigger abort: ${abortAlert.message}`,
109
+ failureReason: 'agent_error',
110
+ artifacts: { ...ctx.artifactPaths },
111
+ };
112
+ await ctx.saveRunSummary(result);
113
+ return { continue: false, result };
114
+ }
115
+ }
116
+ catch {
117
+ // Non-fatal: trace analysis failure should not block execution
118
+ }
119
+ }
120
+ return { continue: true };
121
+ }
122
+ //# sourceMappingURL=step-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-agent.js","sourceRoot":"","sources":["../../../src/lib/ticket-steps/step-agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Step 8: Cleanup — remove the worktree.
3
+ */
4
+ import type { TicketContext, StepResult } from './types.js';
5
+ export declare function run(ctx: TicketContext): Promise<StepResult>;
6
+ //# sourceMappingURL=step-cleanup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-cleanup.d.ts","sourceRoot":"","sources":["../../../src/lib/ticket-steps/step-cleanup.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE5D,wBAAsB,GAAG,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,CAMjE"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Step 8: Cleanup — remove the worktree.
3
+ */
4
+ import { cleanupWorktree } from '../solo-git.js';
5
+ export async function run(ctx) {
6
+ await ctx.markStep('cleanup', 'started');
7
+ await cleanupWorktree(ctx.repoRoot, ctx.worktreePath);
8
+ await ctx.markStep('cleanup', 'success');
9
+ return { continue: true };
10
+ }
11
+ //# sourceMappingURL=step-cleanup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-cleanup.js","sourceRoot":"","sources":["../../../src/lib/ticket-steps/step-cleanup.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjD,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,GAAkB;IAC1C,MAAM,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACzC,MAAM,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;IACtD,MAAM,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAEzC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Step 4: Commit changes — stage and commit agent's work.
3
+ */
4
+ import type { TicketContext, StepResult } from './types.js';
5
+ export declare function run(ctx: TicketContext): Promise<StepResult>;
6
+ //# sourceMappingURL=step-commit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-commit.d.ts","sourceRoot":"","sources":["../../../src/lib/ticket-steps/step-commit.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE5D,wBAAsB,GAAG,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,CA8BjE"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Step 4: Commit changes — stage and commit agent's work.
3
+ */
4
+ import { writeJsonArtifact } from '../artifacts.js';
5
+ import { gitExec, gitExecFile } from '../solo-git.js';
6
+ export async function run(ctx) {
7
+ const { ticket, worktreePath, baseDir, opts, statusOutput, changedFiles } = ctx;
8
+ await ctx.markStep('commit', 'started');
9
+ const diffOutput = await gitExec('git diff HEAD', {
10
+ cwd: worktreePath,
11
+ maxBuffer: 10 * 1024 * 1024,
12
+ });
13
+ const diffArtifactPath = writeJsonArtifact({
14
+ baseDir,
15
+ type: 'diffs',
16
+ id: opts.runId,
17
+ data: {
18
+ runId: opts.runId,
19
+ ticketId: ticket.id,
20
+ diff: diffOutput,
21
+ filesChanged: statusOutput.split('\n').length,
22
+ changedFiles,
23
+ },
24
+ });
25
+ ctx.artifactPaths.diff = diffArtifactPath;
26
+ await gitExec('git add -A', { cwd: worktreePath });
27
+ await gitExecFile('git', ['commit', '-m', ticket.title], { cwd: worktreePath });
28
+ await ctx.markStep('commit', 'success', { metadata: { diffArtifactPath } });
29
+ return { continue: true };
30
+ }
31
+ //# sourceMappingURL=step-commit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-commit.js","sourceRoot":"","sources":["../../../src/lib/ticket-steps/step-commit.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAGtD,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,GAAkB;IAC1C,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC;IAEhF,MAAM,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAExC,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,eAAe,EAAE;QAChD,GAAG,EAAE,YAAY;QACjB,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;KAC5B,CAAC,CAAC;IAEH,MAAM,gBAAgB,GAAG,iBAAiB,CAAC;QACzC,OAAO;QACP,IAAI,EAAE,OAAO;QACb,EAAE,EAAE,IAAI,CAAC,KAAK;QACd,IAAI,EAAE;YACJ,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,IAAI,EAAE,UAAU;YAChB,YAAY,EAAE,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM;YAC7C,YAAY;SACb;KACF,CAAC,CAAC;IACH,GAAG,CAAC,aAAa,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAE1C,MAAM,OAAO,CAAC,YAAY,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,CAAC;IACnD,MAAM,WAAW,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,CAAC;IAEhF,MAAM,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAC;IAE5E,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Step 7: Create PR — push branch and create a pull request.
3
+ */
4
+ import type { TicketContext, StepResult } from './types.js';
5
+ export declare function run(ctx: TicketContext): Promise<StepResult>;
6
+ //# sourceMappingURL=step-pr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-pr.d.ts","sourceRoot":"","sources":["../../../src/lib/ticket-steps/step-pr.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE5D,wBAAsB,GAAG,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,CAoCjE"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Step 7: Create PR — push branch and create a pull request.
3
+ */
4
+ import { gitExecFile } from '../solo-git.js';
5
+ export async function run(ctx) {
6
+ const { ticket, worktreePath, branchName, opts, config, onProgress } = ctx;
7
+ const { createPr, draftPr = false } = opts;
8
+ if (opts.skipPr) {
9
+ await ctx.markStep('pr', 'skipped', { errorMessage: 'Skipped (milestone mode)' });
10
+ return { continue: true };
11
+ }
12
+ if (createPr) {
13
+ await ctx.markStep('pr', 'started');
14
+ try {
15
+ const { assertPushSafe: assertPrSafe } = await import('../solo-remote.js');
16
+ await assertPrSafe(worktreePath, config?.allowedRemote);
17
+ const prBody = `## Summary\n\n${ticket.description ?? ticket.title}\n\n---\n_Created by PromptWheel_`;
18
+ const ghArgs = ['pr', 'create', '--title', ticket.title, '--body', prBody, '--head', branchName];
19
+ if (draftPr)
20
+ ghArgs.push('--draft');
21
+ const prOutput = (await gitExecFile('gh', ghArgs, { cwd: worktreePath })).trim();
22
+ const urlMatch = prOutput.match(/https:\/\/github\.com\/[^\s]+/);
23
+ ctx.prUrl = urlMatch ? urlMatch[0] : undefined;
24
+ await ctx.markStep('pr', 'success', { metadata: { prUrl: ctx.prUrl } });
25
+ }
26
+ catch (prError) {
27
+ await ctx.markStep('pr', 'failed', {
28
+ errorMessage: prError instanceof Error ? prError.message : String(prError),
29
+ });
30
+ onProgress(`PR creation failed: ${prError instanceof Error ? prError.message : prError}`);
31
+ }
32
+ }
33
+ else {
34
+ await ctx.markStep('pr', 'skipped', { errorMessage: 'Not requested' });
35
+ }
36
+ return { continue: true };
37
+ }
38
+ //# sourceMappingURL=step-pr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-pr.js","sourceRoot":"","sources":["../../../src/lib/ticket-steps/step-pr.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,GAAkB;IAC1C,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC;IAC3E,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC;IAE3C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,0BAA0B,EAAE,CAAC,CAAC;QAClF,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAEpC,IAAI,CAAC;YACH,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;YAC3E,MAAM,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;YACxD,MAAM,MAAM,GAAG,iBAAiB,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,KAAK,mCAAmC,CAAC;YACtG,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;YACjG,IAAI,OAAO;gBAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAEpC,MAAM,QAAQ,GAAG,CAAC,MAAM,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAEjF,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACjE,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAE/C,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC1E,CAAC;QAAC,OAAO,OAAO,EAAE,CAAC;YACjB,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE;gBACjC,YAAY,EAAE,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;aAC3E,CAAC,CAAC;YACH,UAAU,CAAC,uBAAuB,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,eAAe,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Step 5: Push branch to remote.
3
+ */
4
+ import type { TicketContext, StepResult } from './types.js';
5
+ export declare function run(ctx: TicketContext): Promise<StepResult>;
6
+ //# sourceMappingURL=step-push.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-push.d.ts","sourceRoot":"","sources":["../../../src/lib/ticket-steps/step-push.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE5D,wBAAsB,GAAG,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,CAgCjE"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Step 5: Push branch to remote.
3
+ */
4
+ import { gitExec, cleanupWorktree } from '../solo-git.js';
5
+ export async function run(ctx) {
6
+ const { repoRoot, worktreePath, branchName, opts, startTime, config } = ctx;
7
+ if (opts.skipPush) {
8
+ await ctx.markStep('push', 'skipped', { errorMessage: 'Skipped (milestone mode)' });
9
+ return { continue: true };
10
+ }
11
+ await ctx.markStep('push', 'started');
12
+ try {
13
+ const { assertPushSafe } = await import('../solo-remote.js');
14
+ await assertPushSafe(worktreePath, config?.allowedRemote);
15
+ await gitExec(`git push -u origin "${branchName}"`, { cwd: worktreePath });
16
+ await ctx.markStep('push', 'success');
17
+ }
18
+ catch (pushError) {
19
+ await ctx.markStep('push', 'failed', {
20
+ errorMessage: pushError instanceof Error ? pushError.message : String(pushError),
21
+ });
22
+ await ctx.skipRemaining(5, 'Push failed');
23
+ await cleanupWorktree(repoRoot, worktreePath);
24
+ const result = {
25
+ success: false,
26
+ branchName,
27
+ durationMs: Date.now() - startTime,
28
+ error: `Push failed: ${pushError instanceof Error ? pushError.message : pushError}`,
29
+ };
30
+ await ctx.saveRunSummary(result);
31
+ return { continue: false, result };
32
+ }
33
+ return { continue: true };
34
+ }
35
+ //# sourceMappingURL=step-push.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-push.js","sourceRoot":"","sources":["../../../src/lib/ticket-steps/step-push.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAG1D,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,GAAkB;IAC1C,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IAE5E,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,0BAA0B,EAAE,CAAC,CAAC;QACpF,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAEtC,IAAI,CAAC;QACH,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC7D,MAAM,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;QAC1D,MAAM,OAAO,CAAC,uBAAuB,UAAU,GAAG,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,CAAC;QAC3E,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,SAAS,EAAE,CAAC;QACnB,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE;YACnC,YAAY,EAAE,SAAS,YAAY,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;SACjF,CAAC,CAAC;QACH,MAAM,GAAG,CAAC,aAAa,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;QAC1C,MAAM,eAAe,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG;YACb,OAAO,EAAE,KAAK;YACd,UAAU;YACV,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;YAClC,KAAK,EAAE,gBAAgB,SAAS,YAAY,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE;SACpF,CAAC;QACF,MAAM,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACjC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACrC,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Step 6: Run QA — execute quality assurance commands and handle retries.
3
+ */
4
+ import type { TicketContext, StepResult } from './types.js';
5
+ export declare function run(ctx: TicketContext): Promise<StepResult>;
6
+ //# sourceMappingURL=step-qa.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-qa.d.ts","sourceRoot":"","sources":["../../../src/lib/ticket-steps/step-qa.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmBH,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE5D,wBAAsB,GAAG,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,CAgUjE"}
@@ -0,0 +1,300 @@
1
+ /**
2
+ * Step 6: Run QA — execute quality assurance commands and handle retries.
3
+ */
4
+ import * as path from 'node:path';
5
+ import { runQa, getQaRunDetails, } from '@promptwheel/core/services';
6
+ import { projects } from '@promptwheel/core/repos';
7
+ import { createExecRunner } from '../exec.js';
8
+ import { createLogger } from '../logger.js';
9
+ import { normalizeQaConfig } from '../solo-utils.js';
10
+ import { parseChangedFiles, checkScopeViolations } from '../scope.js';
11
+ import { gitExec, gitExecFile } from '../solo-git.js';
12
+ import { recordCommandFailure } from '../spindle/index.js';
13
+ import { buildTicketPrompt } from '../solo-prompt-builder.js';
14
+ import { isTestFailure, extractTestFilesFromQaOutput } from '../solo-qa-retry.js';
15
+ import { recordQaCommandResult } from '../qa-stats.js';
16
+ import { recordQualitySignal } from '../run-state.js';
17
+ export async function run(ctx) {
18
+ const { ticket, repoRoot, worktreePath, config, adapter, opts, startTime, branchName, onProgress, qaBaseline, spindleState, baselineFiles, execBackend } = ctx;
19
+ const { skipQa } = opts;
20
+ if (skipQa || !config?.qa?.commands?.length) {
21
+ await ctx.markStep('qa', 'skipped', { errorMessage: skipQa ? 'Skipped by flag' : 'No QA configured' });
22
+ return { continue: true };
23
+ }
24
+ await ctx.markStep('qa', 'started');
25
+ const qaConfig = normalizeQaConfig(config);
26
+ // Filter out pre-existing failures
27
+ let effectiveQaConfig = qaConfig;
28
+ const skippedCommands = [];
29
+ if (qaBaseline) {
30
+ const passingCommands = qaConfig.commands.filter(cmd => {
31
+ if (qaBaseline.get(cmd.name) === false) {
32
+ skippedCommands.push(cmd.name);
33
+ return false;
34
+ }
35
+ return true;
36
+ });
37
+ if (skippedCommands.length > 0) {
38
+ onProgress(`QA: skipping ${skippedCommands.length} pre-existing failure(s): ${skippedCommands.join(', ')}`);
39
+ effectiveQaConfig = { ...qaConfig, commands: passingCommands };
40
+ }
41
+ }
42
+ // If all commands were pre-existing failures, skip QA entirely
43
+ if (effectiveQaConfig.commands.length === 0) {
44
+ onProgress('QA: all commands were pre-existing failures — skipping');
45
+ await ctx.markStep('qa', 'success', {
46
+ metadata: { allPreExisting: true, skippedCommands },
47
+ });
48
+ return { continue: true };
49
+ }
50
+ const exec = createExecRunner({
51
+ defaultMaxLogBytes: qaConfig.artifacts.maxLogBytes,
52
+ defaultTailBytes: qaConfig.artifacts.tailBytes,
53
+ });
54
+ const logger = createLogger({ quiet: true });
55
+ const project = await projects.ensureForRepo(adapter, {
56
+ name: path.basename(repoRoot),
57
+ rootPath: repoRoot,
58
+ });
59
+ const qaResult = await runQa({ db: adapter, exec, logger }, {
60
+ projectId: project.id,
61
+ repoRoot: worktreePath,
62
+ config: effectiveQaConfig,
63
+ });
64
+ if (qaResult.status !== 'success') {
65
+ const failedStep = qaResult.failedAt?.stepName ?? 'unknown step';
66
+ await ctx.markStep('qa', 'failed', {
67
+ errorMessage: `QA failed at ${failedStep}`,
68
+ metadata: { qaRunId: qaResult.runId },
69
+ });
70
+ recordQualitySignal(repoRoot, 'qa_fail');
71
+ await ctx.skipRemaining(6, 'QA failed');
72
+ recordCommandFailure(spindleState, failedStep, `QA failed at ${failedStep}`);
73
+ const errorParts = [`QA failed at: ${failedStep}`];
74
+ const qaDetails = await getQaRunDetails(adapter, qaResult.runId);
75
+ if (qaDetails) {
76
+ const failedStepInfo = qaDetails.steps.find(s => s.name === failedStep && s.status === 'failed');
77
+ if (failedStepInfo) {
78
+ const errorOutput = failedStepInfo.stderrTail || failedStepInfo.stdoutTail;
79
+ if (errorOutput) {
80
+ const truncated = errorOutput.length > 500
81
+ ? '...' + errorOutput.slice(-497)
82
+ : errorOutput;
83
+ errorParts.push('');
84
+ errorParts.push('Error output:');
85
+ errorParts.push(truncated.split('\n').map(l => ` ${l}`).join('\n'));
86
+ }
87
+ if (failedStepInfo.errorMessage) {
88
+ errorParts.push('');
89
+ errorParts.push(`Error: ${failedStepInfo.errorMessage}`);
90
+ }
91
+ }
92
+ // Record per-command QA stats on failure path
93
+ try {
94
+ for (const step of qaDetails.steps) {
95
+ recordQaCommandResult(repoRoot, step.name, {
96
+ passed: step.status === 'success',
97
+ durationMs: step.durationMs ?? 0,
98
+ timedOut: (step.signal === 'SIGTERM') || false,
99
+ skippedPreExisting: false,
100
+ });
101
+ }
102
+ for (const name of skippedCommands) {
103
+ recordQaCommandResult(repoRoot, name, {
104
+ passed: false,
105
+ durationMs: 0,
106
+ timedOut: false,
107
+ skippedPreExisting: true,
108
+ });
109
+ }
110
+ }
111
+ catch {
112
+ // Non-fatal
113
+ }
114
+ }
115
+ // QA retry with test-fix scope expansion
116
+ const failedStepName = qaResult.failedAt?.stepName;
117
+ if (opts.qaRetryWithTestFix && isTestFailure(failedStepName)) {
118
+ onProgress('QA test failure — retrying with test files in scope...');
119
+ let qaErrorOutput = '';
120
+ if (qaDetails) {
121
+ const failedStepInfo = qaDetails.steps.find(s => s.name === failedStepName && s.status === 'failed');
122
+ if (failedStepInfo) {
123
+ qaErrorOutput = (failedStepInfo.stderrTail || '') + '\n' + (failedStepInfo.stdoutTail || '');
124
+ }
125
+ }
126
+ const testFiles = extractTestFilesFromQaOutput(qaErrorOutput);
127
+ if (testFiles.length > 0) {
128
+ const expandedPaths = [...new Set([...ticket.allowedPaths, ...testFiles])];
129
+ const retryPrompt = [
130
+ `Your changes broke these tests. Fix the tests to match the new behavior. Do NOT revert your changes.`,
131
+ '',
132
+ 'Failed test files:',
133
+ ...testFiles.map(f => `- ${f}`),
134
+ '',
135
+ 'Error output:',
136
+ qaErrorOutput.slice(-2000),
137
+ ].join('\n');
138
+ const fullRetryPrompt = buildTicketPrompt({ ...ticket, allowedPaths: expandedPaths }, opts.guidelinesContext, opts.learningsContext, opts.metadataContext) + '\n\n' + retryPrompt;
139
+ try {
140
+ const retryResult = await execBackend.run({
141
+ worktreePath,
142
+ prompt: fullRetryPrompt,
143
+ timeoutMs: opts.timeoutMs,
144
+ verbose: opts.verbose,
145
+ onProgress,
146
+ onRawOutput: opts.onRawOutput,
147
+ });
148
+ if (retryResult.success) {
149
+ // Re-validate scope
150
+ const retryStatusOutput = (await gitExec('git status --porcelain', {
151
+ cwd: worktreePath,
152
+ })).trim();
153
+ const retryAllFiles = parseChangedFiles(retryStatusOutput);
154
+ const retryChangedFiles = baselineFiles.size > 0
155
+ ? retryAllFiles.filter(f => !baselineFiles.has(f))
156
+ : retryAllFiles;
157
+ const retryViolations = checkScopeViolations(retryChangedFiles, expandedPaths, ticket.forbiddenPaths);
158
+ if (retryViolations.length > 0) {
159
+ const violatedFiles = retryViolations.map(v => v.file).join(', ');
160
+ errorParts.push('');
161
+ errorParts.push(`(QA retry created scope violations: ${violatedFiles})`);
162
+ errorParts.push(`Worktree preserved for inspection: ${worktreePath}`);
163
+ const result = {
164
+ success: false,
165
+ branchName,
166
+ durationMs: Date.now() - startTime,
167
+ error: errorParts.join('\n'),
168
+ failureReason: 'scope_violation',
169
+ };
170
+ await ctx.saveRunSummary(result);
171
+ return { continue: false, result };
172
+ }
173
+ // Re-commit
174
+ await gitExec('git add -A', { cwd: worktreePath });
175
+ try {
176
+ await gitExecFile('git', ['commit', '-m', `fix: update tests for ${ticket.title}`], { cwd: worktreePath });
177
+ }
178
+ catch {
179
+ // No new changes to commit — that's fine
180
+ }
181
+ // Re-run QA
182
+ const retryQaResult = await runQa({ db: adapter, exec, logger }, { projectId: project.id, repoRoot: worktreePath, config: effectiveQaConfig });
183
+ if (retryQaResult.status === 'success') {
184
+ onProgress('QA retry succeeded after fixing tests');
185
+ await ctx.markStep('qa', 'success', { metadata: { qaRunId: retryQaResult.runId, qaRetried: true } });
186
+ recordQualitySignal(repoRoot, 'qa_pass');
187
+ return { continue: true };
188
+ }
189
+ else {
190
+ errorParts.push('');
191
+ errorParts.push('(QA retry with test-fix also failed)');
192
+ errorParts.push(`To retry: promptwheel solo run ${ticket.id}`);
193
+ errorParts.push(`Worktree preserved for inspection: ${worktreePath}`);
194
+ const result = {
195
+ success: false,
196
+ branchName,
197
+ durationMs: Date.now() - startTime,
198
+ error: errorParts.join('\n'),
199
+ failureReason: 'qa_failed',
200
+ };
201
+ await ctx.saveRunSummary(result);
202
+ return { continue: false, result };
203
+ }
204
+ }
205
+ else {
206
+ errorParts.push('');
207
+ errorParts.push('(QA retry agent execution failed)');
208
+ errorParts.push(`To retry: promptwheel solo run ${ticket.id}`);
209
+ errorParts.push(`Worktree preserved for inspection: ${worktreePath}`);
210
+ const result = {
211
+ success: false,
212
+ branchName,
213
+ durationMs: Date.now() - startTime,
214
+ error: errorParts.join('\n'),
215
+ failureReason: 'qa_failed',
216
+ };
217
+ await ctx.saveRunSummary(result);
218
+ return { continue: false, result };
219
+ }
220
+ }
221
+ catch {
222
+ errorParts.push('');
223
+ errorParts.push(`To retry: promptwheel solo run ${ticket.id}`);
224
+ errorParts.push(`Worktree preserved for inspection: ${worktreePath}`);
225
+ const result = {
226
+ success: false,
227
+ branchName,
228
+ durationMs: Date.now() - startTime,
229
+ error: errorParts.join('\n'),
230
+ failureReason: 'qa_failed',
231
+ };
232
+ await ctx.saveRunSummary(result);
233
+ return { continue: false, result };
234
+ }
235
+ }
236
+ else {
237
+ errorParts.push('');
238
+ errorParts.push(`To retry: promptwheel solo run ${ticket.id}`);
239
+ errorParts.push(`Worktree preserved for inspection: ${worktreePath}`);
240
+ const result = {
241
+ success: false,
242
+ branchName,
243
+ durationMs: Date.now() - startTime,
244
+ error: errorParts.join('\n'),
245
+ failureReason: 'qa_failed',
246
+ };
247
+ await ctx.saveRunSummary(result);
248
+ return { continue: false, result };
249
+ }
250
+ }
251
+ else {
252
+ errorParts.push('');
253
+ errorParts.push(`To retry: promptwheel solo run ${ticket.id}`);
254
+ errorParts.push(`Worktree preserved for inspection: ${worktreePath}`);
255
+ const result = {
256
+ success: false,
257
+ branchName,
258
+ durationMs: Date.now() - startTime,
259
+ error: errorParts.join('\n'),
260
+ failureReason: 'qa_failed',
261
+ };
262
+ await ctx.saveRunSummary(result);
263
+ return { continue: false, result };
264
+ }
265
+ }
266
+ await ctx.markStep('qa', 'success', {
267
+ metadata: {
268
+ qaRunId: qaResult.runId,
269
+ ...(skippedCommands.length > 0 ? { skippedPreExisting: skippedCommands } : {}),
270
+ },
271
+ });
272
+ recordQualitySignal(repoRoot, 'qa_pass');
273
+ // Record per-command QA stats
274
+ try {
275
+ const qaStatsDetails = await getQaRunDetails(adapter, qaResult.runId);
276
+ if (qaStatsDetails) {
277
+ for (const step of qaStatsDetails.steps) {
278
+ recordQaCommandResult(repoRoot, step.name, {
279
+ passed: step.status === 'success',
280
+ durationMs: step.durationMs ?? 0,
281
+ timedOut: (step.signal === 'SIGTERM') || false,
282
+ skippedPreExisting: false,
283
+ });
284
+ }
285
+ }
286
+ for (const name of skippedCommands) {
287
+ recordQaCommandResult(repoRoot, name, {
288
+ passed: false,
289
+ durationMs: 0,
290
+ timedOut: false,
291
+ skippedPreExisting: true,
292
+ });
293
+ }
294
+ }
295
+ catch {
296
+ // Non-fatal
297
+ }
298
+ return { continue: true };
299
+ }
300
+ //# sourceMappingURL=step-qa.js.map