@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,765 @@
1
+ /**
2
+ * Solo inspect commands: scout, status, history, formulas, export, artifacts, approve
3
+ */
4
+ import * as path from 'node:path';
5
+ import * as fs from 'node:fs';
6
+ import chalk from 'chalk';
7
+ import { scoutRepo, approveProposals, } from '@promptwheel/core/services';
8
+ import { projects, tickets, runs } from '@promptwheel/core/repos';
9
+ import { createGitService } from '../lib/git.js';
10
+ import { writeJsonArtifact, getLatestArtifact, getAllArtifacts, getArtifactsForRun, getArtifactByRunId, } from '../lib/artifacts.js';
11
+ import { parseSelection } from '../lib/selection.js';
12
+ import { getPromptwheelDir, getDbPath, isInitialized, initSolo, getAdapter, createScoutDeps, formatProgress, displayProposal, } from '../lib/solo-config.js';
13
+ import { formatDuration, formatRelativeTime, } from '../lib/solo-utils.js';
14
+ export function registerInspectCommands(solo) {
15
+ /**
16
+ * solo scout - Scan codebase and create tickets
17
+ */
18
+ solo
19
+ .command('scout [path]')
20
+ .description('Scan a codebase and create improvement tickets')
21
+ .option('-v, --verbose', 'Show detailed output')
22
+ .option('-q, --quiet', 'Suppress non-essential output')
23
+ .option('--json', 'Output as JSON')
24
+ .option('-s, --scope <pattern>', 'Glob pattern for files to scan', 'src/**')
25
+ .option('-t, --types <categories>', 'Comma-separated categories: refactor,docs,test,perf,security')
26
+ .option('-m, --max <count>', 'Maximum proposals to generate', '10')
27
+ .option('-c, --min-confidence <percent>', 'Minimum confidence threshold', '50')
28
+ .option('--model <model>', 'Model to use: haiku, sonnet, opus', 'opus')
29
+ .option('--auto-approve', 'Automatically create tickets for all proposals')
30
+ .option('--dry-run', 'Show proposals without saving')
31
+ .option('--max-files <count>', 'Maximum files to scan (default: 500)')
32
+ .action(async (targetPath, options) => {
33
+ const isJsonMode = options.json;
34
+ const isQuiet = options.quiet || isJsonMode;
35
+ const scope = targetPath ?? options.scope ?? 'src/**';
36
+ if (!isQuiet) {
37
+ console.log(chalk.blue('🔍 PromptWheel Solo Scout'));
38
+ console.log();
39
+ }
40
+ const git = createGitService();
41
+ const repoRoot = await git.findRepoRoot('.');
42
+ if (!repoRoot) {
43
+ if (isJsonMode) {
44
+ console.log(JSON.stringify({ success: false, error: 'Not a git repository' }));
45
+ }
46
+ else {
47
+ console.error(chalk.red('✗ Not a git repository'));
48
+ console.error(' Run this command from within a git repository');
49
+ }
50
+ process.exit(1);
51
+ }
52
+ if (!isInitialized(repoRoot)) {
53
+ if (!isQuiet) {
54
+ console.log(chalk.gray('Initializing local state...'));
55
+ }
56
+ await initSolo(repoRoot);
57
+ }
58
+ if (!isQuiet) {
59
+ console.log(chalk.gray(`Project: ${path.basename(repoRoot)}`));
60
+ console.log(chalk.gray(`Scope: ${scope}`));
61
+ console.log();
62
+ }
63
+ const adapter = await getAdapter(repoRoot);
64
+ const deps = createScoutDeps(adapter, options);
65
+ try {
66
+ const types = options.types?.split(',').map(t => t.trim());
67
+ const maxProposals = parseInt(options.max || '10', 10);
68
+ const minConfidence = parseInt(options.minConfidence || '50', 10);
69
+ const model = (options.model || 'opus');
70
+ const maxFiles = options.maxFiles ? parseInt(options.maxFiles, 10) : undefined;
71
+ const controller = new AbortController();
72
+ process.on('SIGINT', () => {
73
+ if (!isQuiet) {
74
+ console.log(chalk.yellow('\n\nAborting scan...'));
75
+ }
76
+ controller.abort();
77
+ });
78
+ let lastProgress = '';
79
+ const scoutOptions = {
80
+ path: repoRoot,
81
+ scope,
82
+ types,
83
+ maxProposals,
84
+ minConfidence,
85
+ model,
86
+ signal: controller.signal,
87
+ autoApprove: options.autoApprove && !options.dryRun,
88
+ onProgress: (progress) => {
89
+ if (!isQuiet) {
90
+ const formatted = formatProgress(progress);
91
+ if (formatted !== lastProgress) {
92
+ process.stdout.write(`\r${formatted.padEnd(80)}`);
93
+ lastProgress = formatted;
94
+ }
95
+ }
96
+ },
97
+ ...(maxFiles !== undefined && { maxFiles }),
98
+ };
99
+ const result = await scoutRepo(deps, scoutOptions);
100
+ if (!isQuiet) {
101
+ process.stdout.write('\r' + ' '.repeat(80) + '\r');
102
+ }
103
+ let proposalsArtifactPath = null;
104
+ if (result.proposals.length > 0) {
105
+ proposalsArtifactPath = writeJsonArtifact({
106
+ baseDir: getPromptwheelDir(repoRoot),
107
+ type: 'proposals',
108
+ id: result.run.id,
109
+ data: {
110
+ runId: result.run.id,
111
+ projectId: result.project.id,
112
+ projectName: result.project.name,
113
+ createdAt: new Date().toISOString(),
114
+ proposals: result.proposals,
115
+ },
116
+ });
117
+ }
118
+ if (isJsonMode) {
119
+ const output = {
120
+ success: result.success,
121
+ project: path.basename(repoRoot),
122
+ scannedFiles: result.scannedFiles,
123
+ durationMs: result.durationMs,
124
+ proposals: result.proposals.map(p => ({
125
+ title: p.title,
126
+ category: p.category,
127
+ description: p.description,
128
+ files: p.files,
129
+ estimated_complexity: p.estimated_complexity,
130
+ confidence: p.confidence,
131
+ })),
132
+ tickets: result.tickets.map(t => ({
133
+ id: t.id,
134
+ title: t.title,
135
+ status: t.status,
136
+ })),
137
+ errors: result.errors,
138
+ };
139
+ console.log(JSON.stringify(output, null, 2));
140
+ return;
141
+ }
142
+ if (!result.success) {
143
+ console.error(chalk.red('✗ Scout failed'));
144
+ for (const error of result.errors) {
145
+ console.error(chalk.red(` ${error}`));
146
+ }
147
+ process.exit(1);
148
+ }
149
+ console.log(chalk.green(`✓ Scanned ${result.scannedFiles} files in ` +
150
+ `${(result.durationMs / 1000).toFixed(1)}s`));
151
+ if (result.proposals.length === 0) {
152
+ console.log(chalk.yellow('\nNo improvement opportunities found.'));
153
+ console.log(chalk.gray('Try broadening your scope or lowering the confidence threshold.'));
154
+ return;
155
+ }
156
+ console.log(chalk.blue(`\nFound ${result.proposals.length} proposals:`));
157
+ for (let i = 0; i < result.proposals.length; i++) {
158
+ displayProposal(result.proposals[i], i);
159
+ }
160
+ if (options.dryRun) {
161
+ console.log(chalk.yellow('\n--dry-run: Proposals not saved'));
162
+ return;
163
+ }
164
+ if (result.tickets.length > 0) {
165
+ console.log(chalk.green(`\n✓ Created ${result.tickets.length} tickets`));
166
+ console.log(chalk.gray(` IDs: ${result.tickets.map(t => t.id).join(', ')}`));
167
+ }
168
+ else if (!options.autoApprove && result.proposals.length > 0) {
169
+ console.log(chalk.blue('\nNext steps:'));
170
+ console.log(' promptwheel solo approve 1-3 # Approve proposals 1-3');
171
+ console.log(' promptwheel solo approve all # Approve all proposals');
172
+ if (proposalsArtifactPath) {
173
+ console.log(chalk.gray(`\n Proposals saved: ${proposalsArtifactPath}`));
174
+ }
175
+ }
176
+ if (result.errors.length > 0) {
177
+ console.log(chalk.yellow('\nWarnings:'));
178
+ for (const error of result.errors) {
179
+ console.log(chalk.yellow(` ${error}`));
180
+ }
181
+ }
182
+ }
183
+ finally {
184
+ await adapter.close();
185
+ }
186
+ });
187
+ /**
188
+ * solo status - Show current state
189
+ */
190
+ solo
191
+ .command('status')
192
+ .description('Show local state and active tickets')
193
+ .option('-v, --verbose', 'Show detailed output')
194
+ .option('--json', 'Output as JSON')
195
+ .action(async (options) => {
196
+ const git = createGitService();
197
+ const repoRoot = await git.findRepoRoot(process.cwd());
198
+ if (!repoRoot) {
199
+ if (options.json) {
200
+ console.log(JSON.stringify({ error: 'Not a git repository' }));
201
+ }
202
+ else {
203
+ console.error(chalk.red('✗ Not a git repository'));
204
+ }
205
+ process.exit(1);
206
+ }
207
+ const dbPath = getDbPath(repoRoot);
208
+ const adapter = await getAdapter(repoRoot);
209
+ try {
210
+ const projectList = await projects.list(adapter);
211
+ if (options.json) {
212
+ const output = {
213
+ dbPath,
214
+ projects: [],
215
+ };
216
+ for (const project of projectList) {
217
+ const counts = await tickets.countByStatus(adapter, project.id);
218
+ const summary = await runs.getSummary(adapter, project.id);
219
+ let lastExecuteCompletionOutcome = null;
220
+ if (summary.lastExecute?.id) {
221
+ const fullRun = await runs.getById(adapter, summary.lastExecute.id);
222
+ if (fullRun?.metadata?.completionOutcome) {
223
+ lastExecuteCompletionOutcome = fullRun.metadata.completionOutcome;
224
+ }
225
+ }
226
+ output.projects.push({
227
+ id: project.id,
228
+ name: project.name,
229
+ ticketCounts: counts,
230
+ lastScout: summary.lastScout ? {
231
+ ...summary.lastScout,
232
+ completedAt: summary.lastScout.completedAt?.toISOString() ?? null,
233
+ } : null,
234
+ lastQa: summary.lastQa ? {
235
+ ...summary.lastQa,
236
+ completedAt: summary.lastQa.completedAt?.toISOString() ?? null,
237
+ } : null,
238
+ lastExecute: summary.lastExecute ? {
239
+ ...summary.lastExecute,
240
+ completedAt: summary.lastExecute.completedAt?.toISOString() ?? null,
241
+ completionOutcome: lastExecuteCompletionOutcome,
242
+ } : null,
243
+ activeRuns: summary.activeRuns,
244
+ });
245
+ }
246
+ // Add wheel data to JSON output
247
+ try {
248
+ const { readRunState: readRS, getQualityRate: getQR } = await import('../lib/run-state.js');
249
+ const { loadQaStats: loadQS } = await import('../lib/qa-stats.js');
250
+ const { loadLearnings: loadL } = await import('../lib/learnings.js');
251
+ const rs = readRS(repoRoot);
252
+ const qaS = loadQS(repoRoot);
253
+ const allL = loadL(repoRoot, 0);
254
+ output.wheel = {
255
+ qualityRate: getQR(repoRoot),
256
+ qualitySignals: rs.qualitySignals ?? null,
257
+ disabledCommands: qaS.disabledCommands,
258
+ processInsights: allL.filter(l => l.source.type === 'process_insight').length,
259
+ qaCommands: Object.fromEntries(Object.entries(qaS.commands).map(([k, v]) => [k, {
260
+ successRate: v.totalRuns > 0 ? v.successes / v.totalRuns : -1,
261
+ avgDurationMs: v.avgDurationMs,
262
+ totalRuns: v.totalRuns,
263
+ }])),
264
+ };
265
+ }
266
+ catch {
267
+ // Non-fatal
268
+ }
269
+ console.log(JSON.stringify(output, null, 2));
270
+ return;
271
+ }
272
+ console.log(chalk.blue('📊 PromptWheel Solo Status'));
273
+ console.log();
274
+ console.log(chalk.gray(`Database: ${dbPath}`));
275
+ console.log();
276
+ console.log(`Projects: ${projectList.length}`);
277
+ if (projectList.length === 0) {
278
+ console.log(chalk.yellow('\nNo projects found. Run: promptwheel solo scout .'));
279
+ return;
280
+ }
281
+ for (const project of projectList) {
282
+ console.log();
283
+ console.log(chalk.bold(project.name));
284
+ const summary = await runs.getSummary(adapter, project.id);
285
+ if (summary.lastScout) {
286
+ const scout = summary.lastScout;
287
+ const statusColor = scout.status === 'success' ? chalk.green :
288
+ scout.status === 'failure' ? chalk.red : chalk.yellow;
289
+ const timeAgo = scout.completedAt ? formatRelativeTime(scout.completedAt) : 'running';
290
+ console.log();
291
+ console.log(` ${chalk.cyan('Last Scout:')}`);
292
+ console.log(` ${statusColor(scout.status)} | ${timeAgo}`);
293
+ console.log(` ${scout.scannedFiles} files scanned, ${scout.proposalCount} proposals, ${scout.ticketCount} tickets`);
294
+ if (scout.durationMs > 0) {
295
+ console.log(` Duration: ${formatDuration(scout.durationMs)}`);
296
+ }
297
+ }
298
+ if (summary.lastQa) {
299
+ const qa = summary.lastQa;
300
+ const statusColor = qa.status === 'success' ? chalk.green :
301
+ qa.status === 'failure' ? chalk.red : chalk.yellow;
302
+ const timeAgo = qa.completedAt ? formatRelativeTime(qa.completedAt) : 'running';
303
+ const passFailText = `${qa.stepsPassed} passed, ${qa.stepsFailed} failed`;
304
+ console.log();
305
+ console.log(` ${chalk.cyan('Last QA:')}`);
306
+ console.log(` ${statusColor(qa.status)} | ${timeAgo}`);
307
+ console.log(` ${passFailText}`);
308
+ if (qa.durationMs > 0) {
309
+ console.log(` Duration: ${formatDuration(qa.durationMs)}`);
310
+ }
311
+ }
312
+ if (summary.lastExecute) {
313
+ const exec = summary.lastExecute;
314
+ const baseDir = getPromptwheelDir(repoRoot);
315
+ let spindleInfo = null;
316
+ if (exec.status === 'failure' && exec.id) {
317
+ const spindleArtifact = getArtifactByRunId(baseDir, exec.id, 'spindle');
318
+ if (spindleArtifact) {
319
+ const data = spindleArtifact.data;
320
+ spindleInfo = {
321
+ reason: data.reason,
322
+ artifactPath: spindleArtifact.path,
323
+ };
324
+ }
325
+ }
326
+ let completionOutcome = null;
327
+ if (exec.status === 'success' && exec.id) {
328
+ const fullRun = await runs.getById(adapter, exec.id);
329
+ if (fullRun?.metadata?.completionOutcome) {
330
+ completionOutcome = fullRun.metadata.completionOutcome;
331
+ }
332
+ }
333
+ const isNoChangesNeeded = completionOutcome === 'no_changes_needed';
334
+ const isSpindleFailure = exec.status === 'failure' && spindleInfo?.reason;
335
+ const statusColor = exec.status === 'success' ? chalk.green :
336
+ isSpindleFailure ? chalk.yellow :
337
+ exec.status === 'failure' ? chalk.red : chalk.yellow;
338
+ const timeAgo = exec.completedAt ? formatRelativeTime(exec.completedAt) : 'running';
339
+ console.log();
340
+ console.log(` ${chalk.cyan('Last Execute:')}`);
341
+ if (isSpindleFailure) {
342
+ console.log(` ${statusColor('failed')} (Spindle: ${spindleInfo.reason}) | ${timeAgo}`);
343
+ console.log(chalk.gray(` See artifacts: ${spindleInfo.artifactPath}`));
344
+ }
345
+ else if (isNoChangesNeeded) {
346
+ console.log(` ${statusColor('success')} (no changes needed) | ${timeAgo}`);
347
+ }
348
+ else {
349
+ console.log(` ${statusColor(exec.status)} | ${timeAgo}`);
350
+ }
351
+ if (exec.ticketId) {
352
+ console.log(` Ticket: ${exec.ticketId}`);
353
+ }
354
+ if (exec.branchName) {
355
+ console.log(` Branch: ${exec.branchName}`);
356
+ }
357
+ if (exec.prUrl) {
358
+ console.log(` PR: ${chalk.cyan(exec.prUrl)}`);
359
+ }
360
+ if (exec.durationMs > 0) {
361
+ console.log(` Duration: ${formatDuration(exec.durationMs)}`);
362
+ }
363
+ }
364
+ const counts = await tickets.countByStatus(adapter, project.id);
365
+ const total = Object.values(counts).reduce((a, b) => a + b, 0);
366
+ console.log();
367
+ console.log(` ${chalk.cyan('Tickets:')}`);
368
+ if (total === 0) {
369
+ console.log(chalk.gray(' No tickets'));
370
+ }
371
+ else {
372
+ for (const [status, count] of Object.entries(counts)) {
373
+ if (count === 0)
374
+ continue;
375
+ const color = status === 'done' ? chalk.green :
376
+ status === 'blocked' || status === 'aborted' ? chalk.red :
377
+ status === 'in_progress' || status === 'leased' ? chalk.yellow :
378
+ chalk.gray;
379
+ console.log(` ${color(status)}: ${count}`);
380
+ }
381
+ }
382
+ if (summary.activeRuns > 0) {
383
+ console.log(` ${chalk.cyan('active runs')}: ${summary.activeRuns}`);
384
+ }
385
+ }
386
+ // Wheel health section
387
+ try {
388
+ const { readRunState, getQualityRate } = await import('../lib/run-state.js');
389
+ const { loadQaStats } = await import('../lib/qa-stats.js');
390
+ const { loadLearnings } = await import('../lib/learnings.js');
391
+ const rs = readRunState(repoRoot);
392
+ const qualityRate = getQualityRate(repoRoot);
393
+ const qaStats = loadQaStats(repoRoot);
394
+ const allLearnings = loadLearnings(repoRoot, 0);
395
+ const qs = rs.qualitySignals;
396
+ const qualityPct = Math.round(qualityRate * 100);
397
+ const processInsights = allLearnings.filter(l => l.source.type === 'process_insight');
398
+ const originalConf = 20;
399
+ const confDelta = rs.effectiveMinConfidence !== undefined
400
+ ? rs.effectiveMinConfidence - originalConf : 0;
401
+ console.log();
402
+ console.log(` ${chalk.cyan('Wheel:')}`);
403
+ if (qs && qs.totalTickets > 0) {
404
+ const qaStr = (qs.qaPassed + qs.qaFailed) > 0
405
+ ? `${qs.qaPassed}/${qs.qaPassed + qs.qaFailed}`
406
+ : 'untested';
407
+ console.log(` Quality rate: ${qualityPct}% (first-pass: ${qs.firstPassSuccess}/${qs.totalTickets}, QA: ${qaStr})`);
408
+ }
409
+ else {
410
+ console.log(chalk.gray(' Quality rate: 100% (no data)'));
411
+ }
412
+ console.log(` Confidence: ${originalConf + confDelta} (original: ${originalConf}${confDelta !== 0 ? `, delta: ${confDelta > 0 ? '+' : ''}${confDelta}` : ''})`);
413
+ if (qaStats.disabledCommands.length > 0) {
414
+ console.log(` Disabled commands: ${qaStats.disabledCommands.map(d => d.name).join(', ')}`);
415
+ }
416
+ else {
417
+ console.log(' Disabled commands: none');
418
+ }
419
+ console.log(` Meta-learnings: ${processInsights.length} process insights`);
420
+ const cmdEntries = Object.values(qaStats.commands);
421
+ if (cmdEntries.length > 0) {
422
+ console.log(' QA command stats:');
423
+ for (const s of cmdEntries) {
424
+ const rate = s.totalRuns > 0 ? Math.round(s.successes / s.totalRuns * 100) : null;
425
+ const rateStr = rate !== null ? `${rate}% success` : 'no data';
426
+ const avgStr = s.totalRuns > 0
427
+ ? (s.avgDurationMs >= 1000 ? `avg ${(s.avgDurationMs / 1000).toFixed(1)}s` : `avg ${s.avgDurationMs}ms`)
428
+ : '';
429
+ console.log(` ${s.name}: ${rateStr}${avgStr ? `, ${avgStr}` : ''} (${s.totalRuns} runs)`);
430
+ }
431
+ }
432
+ if (options.json) {
433
+ // Wheel section for JSON mode is handled via output.wheel below
434
+ }
435
+ }
436
+ catch {
437
+ // Non-fatal — wheel data may not exist yet
438
+ }
439
+ }
440
+ finally {
441
+ await adapter.close();
442
+ }
443
+ });
444
+ /**
445
+ * solo history - View auto run history
446
+ */
447
+ solo
448
+ .command('history')
449
+ .description('View auto run history')
450
+ .option('-n, --limit <n>', 'Number of entries to show', '10')
451
+ .option('--json', 'Output as JSON')
452
+ .action(async (options) => {
453
+ const { readRunHistory, formatHistoryEntry } = await import('../lib/run-history.js');
454
+ const git = createGitService();
455
+ const repoRoot = await git.findRepoRoot(process.cwd());
456
+ const entries = readRunHistory(repoRoot || undefined, parseInt(options.limit || '10', 10));
457
+ if (entries.length === 0) {
458
+ console.log(chalk.gray('No history yet. Run `promptwheel solo auto` to get started.'));
459
+ return;
460
+ }
461
+ if (options.json) {
462
+ console.log(JSON.stringify(entries, null, 2));
463
+ return;
464
+ }
465
+ console.log(chalk.bold(`Run History (${entries.length} entries):\n`));
466
+ for (const entry of entries) {
467
+ console.log(formatHistoryEntry(entry));
468
+ console.log();
469
+ }
470
+ });
471
+ /**
472
+ * solo formulas - List available formulas
473
+ */
474
+ solo
475
+ .command('formulas')
476
+ .description('List available auto formulas')
477
+ .action(async () => {
478
+ const { listFormulas } = await import('../lib/formulas.js');
479
+ const git = createGitService();
480
+ const repoRoot = await git.findRepoRoot(process.cwd());
481
+ const formulas = listFormulas(repoRoot || undefined);
482
+ if (formulas.length === 0) {
483
+ console.log(chalk.gray('No formulas available'));
484
+ return;
485
+ }
486
+ console.log(chalk.bold('Available formulas:\n'));
487
+ for (const formula of formulas) {
488
+ const tags = formula.tags?.length ? chalk.gray(` [${formula.tags.join(', ')}]`) : '';
489
+ console.log(` ${chalk.cyan(formula.name)}${tags}`);
490
+ console.log(` ${formula.description}`);
491
+ if (formula.categories?.length) {
492
+ console.log(chalk.gray(` Categories: ${formula.categories.join(', ')}`));
493
+ }
494
+ if (formula.minConfidence) {
495
+ console.log(chalk.gray(` Min confidence: ${formula.minConfidence}%`));
496
+ }
497
+ console.log();
498
+ }
499
+ console.log(chalk.gray('Usage: promptwheel solo auto --formula <name>'));
500
+ console.log(chalk.gray('Custom: Create .promptwheel/formulas/<name>.yaml'));
501
+ });
502
+ /**
503
+ * solo export - Export state for debugging
504
+ */
505
+ solo
506
+ .command('export')
507
+ .description('Export local state for debugging or migration')
508
+ .option('-o, --output <file>', 'Output file', 'promptwheel-export.json')
509
+ .action(async (options) => {
510
+ const git = createGitService();
511
+ const repoRoot = await git.findRepoRoot(process.cwd());
512
+ if (!repoRoot) {
513
+ console.error(chalk.red('✗ Not a git repository'));
514
+ process.exit(1);
515
+ }
516
+ const adapter = await getAdapter(repoRoot);
517
+ try {
518
+ const projectList = await projects.list(adapter);
519
+ const data = {
520
+ exportedAt: new Date().toISOString(),
521
+ version: 1,
522
+ projects: [],
523
+ };
524
+ for (const project of projectList) {
525
+ const projectTickets = await tickets.listByProject(adapter, project.id);
526
+ const projectRuns = await runs.listByProject(adapter, project.id);
527
+ data.projects.push({
528
+ ...project,
529
+ tickets: projectTickets,
530
+ runs: projectRuns,
531
+ });
532
+ }
533
+ fs.writeFileSync(options.output, JSON.stringify(data, null, 2));
534
+ console.log(chalk.green(`✓ Exported to ${options.output}`));
535
+ }
536
+ finally {
537
+ await adapter.close();
538
+ }
539
+ });
540
+ /**
541
+ * solo artifacts - List and view run artifacts
542
+ */
543
+ solo
544
+ .command('artifacts')
545
+ .description('List and view run artifacts')
546
+ .option('--run <runId>', 'Show artifacts for a specific run')
547
+ .option('--type <type>', 'Filter by artifact type (proposals, executions, diffs, runs, violations)')
548
+ .option('--show <path>', 'Display contents of a specific artifact file')
549
+ .option('--json', 'Output in JSON format')
550
+ .action(async (options) => {
551
+ const repoRoot = process.cwd();
552
+ const baseDir = getPromptwheelDir(repoRoot);
553
+ const artifactsDir = path.join(baseDir, 'artifacts');
554
+ if (options.show) {
555
+ const filePath = options.show.startsWith('/') ? options.show : path.join(process.cwd(), options.show);
556
+ if (!fs.existsSync(filePath)) {
557
+ console.error(chalk.red(`Artifact not found: ${filePath}`));
558
+ process.exit(1);
559
+ }
560
+ const content = fs.readFileSync(filePath, 'utf-8');
561
+ if (options.json) {
562
+ console.log(content);
563
+ }
564
+ else {
565
+ console.log(chalk.cyan(`\n─── ${path.basename(filePath)} ───\n`));
566
+ try {
567
+ const data = JSON.parse(content);
568
+ console.log(JSON.stringify(data, null, 2));
569
+ }
570
+ catch {
571
+ console.log(content);
572
+ }
573
+ }
574
+ return;
575
+ }
576
+ if (options.run) {
577
+ const artifacts = getArtifactsForRun(baseDir, options.run);
578
+ const found = Object.entries(artifacts).filter(([, v]) => v !== null);
579
+ if (options.json) {
580
+ console.log(JSON.stringify({
581
+ runId: options.run,
582
+ artifacts: Object.fromEntries(found.map(([type, artifact]) => [type, artifact?.path])),
583
+ }, null, 2));
584
+ return;
585
+ }
586
+ if (found.length === 0) {
587
+ console.log(chalk.yellow(`No artifacts found for run: ${options.run}`));
588
+ return;
589
+ }
590
+ console.log(chalk.cyan(`\nArtifacts for run ${options.run}:\n`));
591
+ for (const [type, artifact] of found) {
592
+ if (artifact) {
593
+ console.log(` ${chalk.bold(type)}: ${artifact.path}`);
594
+ }
595
+ }
596
+ console.log();
597
+ return;
598
+ }
599
+ if (!fs.existsSync(artifactsDir)) {
600
+ console.log(chalk.yellow('No artifacts found. Run a ticket to generate artifacts.'));
601
+ return;
602
+ }
603
+ const allArtifacts = getAllArtifacts(baseDir);
604
+ const types = options.type
605
+ ? [options.type]
606
+ : ['runs', 'executions', 'diffs', 'violations', 'proposals', 'spindle'];
607
+ if (options.json) {
608
+ const output = {};
609
+ for (const type of types) {
610
+ output[type] = allArtifacts[type] ?? [];
611
+ }
612
+ console.log(JSON.stringify(output, null, 2));
613
+ return;
614
+ }
615
+ let totalCount = 0;
616
+ for (const type of types) {
617
+ const artifacts = allArtifacts[type] ?? [];
618
+ if (artifacts.length === 0)
619
+ continue;
620
+ console.log(chalk.cyan(`\n${type.toUpperCase()} (${artifacts.length}):`));
621
+ for (const artifact of artifacts.slice(0, 10)) {
622
+ const date = new Date(artifact.timestamp).toISOString().slice(0, 19).replace('T', ' ');
623
+ console.log(` ${chalk.gray(date)} ${artifact.id}`);
624
+ console.log(` ${chalk.dim(artifact.path)}`);
625
+ totalCount++;
626
+ }
627
+ if (artifacts.length > 10) {
628
+ console.log(chalk.dim(` ... and ${artifacts.length - 10} more`));
629
+ }
630
+ }
631
+ if (totalCount === 0) {
632
+ console.log(chalk.yellow('No artifacts found. Run a ticket to generate artifacts.'));
633
+ }
634
+ else {
635
+ console.log(chalk.dim(`\nUse --show <path> to view an artifact, or --run <id> to see all artifacts for a run.\n`));
636
+ }
637
+ });
638
+ /**
639
+ * solo approve - Convert proposals to tickets
640
+ */
641
+ solo
642
+ .command('approve <selection>')
643
+ .description('Approve proposals and create tickets')
644
+ .addHelpText('after', `
645
+ Selection formats:
646
+ 1 Single proposal (1-indexed)
647
+ 1,3,5 Multiple specific proposals
648
+ 1-3 Range of proposals
649
+ 1-3,5,7 Mixed selection
650
+ all All proposals
651
+
652
+ Examples:
653
+ promptwheel solo approve 1 # Approve first proposal
654
+ promptwheel solo approve 1-3 # Approve proposals 1, 2, 3
655
+ promptwheel solo approve all # Approve all proposals
656
+ `)
657
+ .option('-v, --verbose', 'Show detailed output')
658
+ .option('--json', 'Output as JSON')
659
+ .action(async (selection, options) => {
660
+ const isJsonMode = options.json;
661
+ const git = createGitService();
662
+ const repoRoot = await git.findRepoRoot(process.cwd());
663
+ if (!repoRoot) {
664
+ if (isJsonMode) {
665
+ console.log(JSON.stringify({ success: false, error: 'Not a git repository' }));
666
+ }
667
+ else {
668
+ console.error(chalk.red('✗ Not a git repository'));
669
+ }
670
+ process.exit(1);
671
+ }
672
+ const baseDir = getPromptwheelDir(repoRoot);
673
+ const artifact = getLatestArtifact(baseDir, 'proposals');
674
+ if (!artifact) {
675
+ if (isJsonMode) {
676
+ console.log(JSON.stringify({
677
+ success: false,
678
+ error: 'No proposals found. Run: promptwheel solo scout .',
679
+ }));
680
+ }
681
+ else {
682
+ console.error(chalk.red('✗ No proposals found'));
683
+ console.log(chalk.gray(' Run: promptwheel solo scout .'));
684
+ }
685
+ process.exit(1);
686
+ }
687
+ const { proposals } = artifact.data;
688
+ if (proposals.length === 0) {
689
+ if (isJsonMode) {
690
+ console.log(JSON.stringify({ success: false, error: 'No proposals in artifact' }));
691
+ }
692
+ else {
693
+ console.error(chalk.red('✗ No proposals in artifact'));
694
+ }
695
+ process.exit(1);
696
+ }
697
+ let selectedIndices;
698
+ try {
699
+ selectedIndices = parseSelection(selection, proposals.length);
700
+ }
701
+ catch (err) {
702
+ if (isJsonMode) {
703
+ console.log(JSON.stringify({
704
+ success: false,
705
+ error: err instanceof Error ? err.message : String(err),
706
+ }));
707
+ }
708
+ else {
709
+ console.error(chalk.red(`✗ Invalid selection: ${err instanceof Error ? err.message : err}`));
710
+ console.log(chalk.gray(` Valid range: 1-${proposals.length}`));
711
+ }
712
+ process.exit(1);
713
+ }
714
+ if (selectedIndices.length === 0) {
715
+ if (isJsonMode) {
716
+ console.log(JSON.stringify({ success: false, error: 'No proposals selected' }));
717
+ }
718
+ else {
719
+ console.error(chalk.red('✗ No proposals selected'));
720
+ console.log(chalk.gray(` Valid range: 1-${proposals.length}`));
721
+ }
722
+ process.exit(1);
723
+ }
724
+ const selectedProposals = selectedIndices.map(i => proposals[i]);
725
+ if (!isJsonMode) {
726
+ console.log(chalk.blue('📋 PromptWheel Solo Approve'));
727
+ console.log();
728
+ console.log(`Selected ${selectedProposals.length} proposal(s):`);
729
+ for (const idx of selectedIndices) {
730
+ const p = proposals[idx];
731
+ console.log(` ${chalk.bold(idx + 1)}. ${p.title}`);
732
+ }
733
+ console.log();
734
+ }
735
+ const adapter = await getAdapter(repoRoot);
736
+ try {
737
+ const deps = createScoutDeps(adapter, options);
738
+ const createdTickets = await approveProposals(deps, artifact.data.projectId, selectedProposals);
739
+ if (isJsonMode) {
740
+ console.log(JSON.stringify({
741
+ success: true,
742
+ tickets: createdTickets.map(t => ({
743
+ id: t.id,
744
+ title: t.title,
745
+ status: t.status,
746
+ })),
747
+ }));
748
+ }
749
+ else {
750
+ console.log(chalk.green(`✓ Created ${createdTickets.length} ticket(s)`));
751
+ for (const t of createdTickets) {
752
+ console.log(` ${chalk.gray(t.id)} ${t.title}`);
753
+ }
754
+ console.log();
755
+ console.log(chalk.blue('Next steps:'));
756
+ console.log(` promptwheel solo run ${createdTickets[0]?.id} # Run a ticket`);
757
+ console.log(' promptwheel solo status # View all tickets');
758
+ }
759
+ }
760
+ finally {
761
+ await adapter.close();
762
+ }
763
+ });
764
+ }
765
+ //# sourceMappingURL=solo-inspect.js.map