ralph-starter 0.0.1 → 0.1.1-beta.1

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 (382) hide show
  1. package/README.md +707 -17
  2. package/dist/auth/browser.d.ts +10 -0
  3. package/dist/auth/browser.d.ts.map +1 -0
  4. package/dist/auth/browser.js +56 -0
  5. package/dist/auth/browser.js.map +1 -0
  6. package/dist/auth/index.d.ts +5 -0
  7. package/dist/auth/index.d.ts.map +1 -0
  8. package/dist/auth/index.js +5 -0
  9. package/dist/auth/index.js.map +1 -0
  10. package/dist/auth/oauth-server.d.ts +20 -0
  11. package/dist/auth/oauth-server.d.ts.map +1 -0
  12. package/dist/auth/oauth-server.js +168 -0
  13. package/dist/auth/oauth-server.js.map +1 -0
  14. package/dist/auth/pkce.d.ts +46 -0
  15. package/dist/auth/pkce.d.ts.map +1 -0
  16. package/dist/auth/pkce.js +57 -0
  17. package/dist/auth/pkce.js.map +1 -0
  18. package/dist/auth/providers/base.d.ts +52 -0
  19. package/dist/auth/providers/base.d.ts.map +1 -0
  20. package/dist/auth/providers/base.js +70 -0
  21. package/dist/auth/providers/base.js.map +1 -0
  22. package/dist/auth/providers/index.d.ts +23 -0
  23. package/dist/auth/providers/index.d.ts.map +1 -0
  24. package/dist/auth/providers/index.js +39 -0
  25. package/dist/auth/providers/index.js.map +1 -0
  26. package/dist/auth/providers/linear.d.ts +37 -0
  27. package/dist/auth/providers/linear.d.ts.map +1 -0
  28. package/dist/auth/providers/linear.js +46 -0
  29. package/dist/auth/providers/linear.js.map +1 -0
  30. package/dist/auth/providers/notion.d.ts +36 -0
  31. package/dist/auth/providers/notion.d.ts.map +1 -0
  32. package/dist/auth/providers/notion.js +75 -0
  33. package/dist/auth/providers/notion.js.map +1 -0
  34. package/dist/auth/providers/todoist.d.ts +29 -0
  35. package/dist/auth/providers/todoist.d.ts.map +1 -0
  36. package/dist/auth/providers/todoist.js +40 -0
  37. package/dist/auth/providers/todoist.js.map +1 -0
  38. package/dist/automation/git.d.ts +15 -0
  39. package/dist/automation/git.d.ts.map +1 -0
  40. package/dist/automation/git.js +73 -0
  41. package/dist/automation/git.js.map +1 -0
  42. package/dist/cli.d.ts +3 -0
  43. package/dist/cli.d.ts.map +1 -0
  44. package/dist/cli.js +192 -19
  45. package/dist/cli.js.map +1 -0
  46. package/dist/commands/auth.d.ts +14 -0
  47. package/dist/commands/auth.d.ts.map +1 -0
  48. package/dist/commands/auth.js +243 -0
  49. package/dist/commands/auth.js.map +1 -0
  50. package/dist/commands/check.d.ts +12 -0
  51. package/dist/commands/check.d.ts.map +1 -0
  52. package/dist/commands/check.js +124 -0
  53. package/dist/commands/check.js.map +1 -0
  54. package/dist/commands/config.d.ts +13 -0
  55. package/dist/commands/config.d.ts.map +1 -0
  56. package/dist/commands/config.js +374 -0
  57. package/dist/commands/config.js.map +1 -0
  58. package/dist/commands/init.d.ts +31 -0
  59. package/dist/commands/init.d.ts.map +1 -0
  60. package/dist/commands/init.js +353 -0
  61. package/dist/commands/init.js.map +1 -0
  62. package/dist/commands/integrations.d.ts +17 -0
  63. package/dist/commands/integrations.d.ts.map +1 -0
  64. package/dist/commands/integrations.js +193 -0
  65. package/dist/commands/integrations.js.map +1 -0
  66. package/dist/commands/plan.d.ts +5 -0
  67. package/dist/commands/plan.d.ts.map +1 -0
  68. package/dist/commands/plan.js +80 -0
  69. package/dist/commands/plan.js.map +1 -0
  70. package/dist/commands/run.d.ts +26 -0
  71. package/dist/commands/run.d.ts.map +1 -0
  72. package/dist/commands/run.js +351 -0
  73. package/dist/commands/run.js.map +1 -0
  74. package/dist/commands/scaffold.d.ts +9 -0
  75. package/dist/commands/scaffold.d.ts.map +1 -0
  76. package/dist/commands/scaffold.js +128 -0
  77. package/dist/commands/scaffold.js.map +1 -0
  78. package/dist/commands/setup.d.ts +12 -0
  79. package/dist/commands/setup.d.ts.map +1 -0
  80. package/dist/commands/setup.js +27 -0
  81. package/dist/commands/setup.js.map +1 -0
  82. package/dist/commands/skill.d.ts +6 -0
  83. package/dist/commands/skill.d.ts.map +1 -0
  84. package/dist/commands/skill.js +151 -0
  85. package/dist/commands/skill.js.map +1 -0
  86. package/dist/commands/source.d.ts +17 -0
  87. package/dist/commands/source.d.ts.map +1 -0
  88. package/dist/commands/source.js +173 -0
  89. package/dist/commands/source.js.map +1 -0
  90. package/dist/config/manager.d.ts +70 -0
  91. package/dist/config/manager.d.ts.map +1 -0
  92. package/dist/config/manager.js +227 -0
  93. package/dist/config/manager.js.map +1 -0
  94. package/dist/index.d.ts +26 -0
  95. package/dist/index.d.ts.map +1 -0
  96. package/dist/index.js +27 -2
  97. package/dist/index.js.map +1 -0
  98. package/dist/integrations/_template/auth.d.ts +29 -0
  99. package/dist/integrations/_template/auth.d.ts.map +1 -0
  100. package/dist/integrations/_template/auth.js +42 -0
  101. package/dist/integrations/_template/auth.js.map +1 -0
  102. package/dist/integrations/_template/index.d.ts +8 -0
  103. package/dist/integrations/_template/index.d.ts.map +1 -0
  104. package/dist/integrations/_template/index.js +8 -0
  105. package/dist/integrations/_template/index.js.map +1 -0
  106. package/dist/integrations/_template/source.d.ts +34 -0
  107. package/dist/integrations/_template/source.d.ts.map +1 -0
  108. package/dist/integrations/_template/source.js +124 -0
  109. package/dist/integrations/_template/source.js.map +1 -0
  110. package/dist/integrations/base.d.ts +158 -0
  111. package/dist/integrations/base.d.ts.map +1 -0
  112. package/dist/integrations/base.js +109 -0
  113. package/dist/integrations/base.js.map +1 -0
  114. package/dist/integrations/github/index.d.ts +8 -0
  115. package/dist/integrations/github/index.d.ts.map +1 -0
  116. package/dist/integrations/github/index.js +8 -0
  117. package/dist/integrations/github/index.js.map +1 -0
  118. package/dist/integrations/github/source.d.ts +26 -0
  119. package/dist/integrations/github/source.d.ts.map +1 -0
  120. package/dist/integrations/github/source.js +190 -0
  121. package/dist/integrations/github/source.js.map +1 -0
  122. package/dist/integrations/index.d.ts +37 -0
  123. package/dist/integrations/index.d.ts.map +1 -0
  124. package/dist/integrations/index.js +71 -0
  125. package/dist/integrations/index.js.map +1 -0
  126. package/dist/integrations/linear/auth.d.ts +37 -0
  127. package/dist/integrations/linear/auth.d.ts.map +1 -0
  128. package/dist/integrations/linear/auth.js +45 -0
  129. package/dist/integrations/linear/auth.js.map +1 -0
  130. package/dist/integrations/linear/index.d.ts +9 -0
  131. package/dist/integrations/linear/index.d.ts.map +1 -0
  132. package/dist/integrations/linear/index.js +9 -0
  133. package/dist/integrations/linear/index.js.map +1 -0
  134. package/dist/integrations/linear/source.d.ts +26 -0
  135. package/dist/integrations/linear/source.d.ts.map +1 -0
  136. package/dist/integrations/linear/source.js +248 -0
  137. package/dist/integrations/linear/source.js.map +1 -0
  138. package/dist/integrations/notion/index.d.ts +8 -0
  139. package/dist/integrations/notion/index.d.ts.map +1 -0
  140. package/dist/integrations/notion/index.js +8 -0
  141. package/dist/integrations/notion/index.js.map +1 -0
  142. package/dist/integrations/notion/source.d.ts +53 -0
  143. package/dist/integrations/notion/source.d.ts.map +1 -0
  144. package/dist/integrations/notion/source.js +463 -0
  145. package/dist/integrations/notion/source.js.map +1 -0
  146. package/dist/llm/api.d.ts +29 -0
  147. package/dist/llm/api.d.ts.map +1 -0
  148. package/dist/llm/api.js +152 -0
  149. package/dist/llm/api.js.map +1 -0
  150. package/dist/llm/index.d.ts +7 -0
  151. package/dist/llm/index.d.ts.map +1 -0
  152. package/dist/llm/index.js +7 -0
  153. package/dist/llm/index.js.map +1 -0
  154. package/dist/llm/providers.d.ts +24 -0
  155. package/dist/llm/providers.d.ts.map +1 -0
  156. package/dist/llm/providers.js +51 -0
  157. package/dist/llm/providers.js.map +1 -0
  158. package/dist/loop/__tests__/agents.test.d.ts +2 -0
  159. package/dist/loop/__tests__/agents.test.d.ts.map +1 -0
  160. package/dist/loop/__tests__/agents.test.js +183 -0
  161. package/dist/loop/__tests__/agents.test.js.map +1 -0
  162. package/dist/loop/__tests__/circuit-breaker.test.d.ts +2 -0
  163. package/dist/loop/__tests__/circuit-breaker.test.d.ts.map +1 -0
  164. package/dist/loop/__tests__/circuit-breaker.test.js +161 -0
  165. package/dist/loop/__tests__/circuit-breaker.test.js.map +1 -0
  166. package/dist/loop/__tests__/cost-tracker.test.d.ts +2 -0
  167. package/dist/loop/__tests__/cost-tracker.test.d.ts.map +1 -0
  168. package/dist/loop/__tests__/cost-tracker.test.js +200 -0
  169. package/dist/loop/__tests__/cost-tracker.test.js.map +1 -0
  170. package/dist/loop/__tests__/rate-limiter.test.d.ts +2 -0
  171. package/dist/loop/__tests__/rate-limiter.test.d.ts.map +1 -0
  172. package/dist/loop/__tests__/rate-limiter.test.js +198 -0
  173. package/dist/loop/__tests__/rate-limiter.test.js.map +1 -0
  174. package/dist/loop/__tests__/validation.test.d.ts +2 -0
  175. package/dist/loop/__tests__/validation.test.d.ts.map +1 -0
  176. package/dist/loop/__tests__/validation.test.js +234 -0
  177. package/dist/loop/__tests__/validation.test.js.map +1 -0
  178. package/dist/loop/agents.d.ts +26 -0
  179. package/dist/loop/agents.d.ts.map +1 -0
  180. package/dist/loop/agents.js +188 -0
  181. package/dist/loop/agents.js.map +1 -0
  182. package/dist/loop/circuit-breaker.d.ts +61 -0
  183. package/dist/loop/circuit-breaker.d.ts.map +1 -0
  184. package/dist/loop/circuit-breaker.js +143 -0
  185. package/dist/loop/circuit-breaker.js.map +1 -0
  186. package/dist/loop/cost-tracker.d.ts +90 -0
  187. package/dist/loop/cost-tracker.d.ts.map +1 -0
  188. package/dist/loop/cost-tracker.js +229 -0
  189. package/dist/loop/cost-tracker.js.map +1 -0
  190. package/dist/loop/estimator.d.ts +20 -0
  191. package/dist/loop/estimator.d.ts.map +1 -0
  192. package/dist/loop/estimator.js +123 -0
  193. package/dist/loop/estimator.js.map +1 -0
  194. package/dist/loop/executor.d.ts +44 -0
  195. package/dist/loop/executor.d.ts.map +1 -0
  196. package/dist/loop/executor.js +646 -0
  197. package/dist/loop/executor.js.map +1 -0
  198. package/dist/loop/progress.d.ts +34 -0
  199. package/dist/loop/progress.d.ts.map +1 -0
  200. package/dist/loop/progress.js +186 -0
  201. package/dist/loop/progress.js.map +1 -0
  202. package/dist/loop/rate-limiter.d.ts +71 -0
  203. package/dist/loop/rate-limiter.d.ts.map +1 -0
  204. package/dist/loop/rate-limiter.js +151 -0
  205. package/dist/loop/rate-limiter.js.map +1 -0
  206. package/dist/loop/semantic-analyzer.d.ts +33 -0
  207. package/dist/loop/semantic-analyzer.d.ts.map +1 -0
  208. package/dist/loop/semantic-analyzer.js +153 -0
  209. package/dist/loop/semantic-analyzer.js.map +1 -0
  210. package/dist/loop/skills.d.ts +29 -0
  211. package/dist/loop/skills.d.ts.map +1 -0
  212. package/dist/loop/skills.js +174 -0
  213. package/dist/loop/skills.js.map +1 -0
  214. package/dist/loop/step-detector.d.ts +17 -0
  215. package/dist/loop/step-detector.d.ts.map +1 -0
  216. package/dist/loop/step-detector.js +280 -0
  217. package/dist/loop/step-detector.js.map +1 -0
  218. package/dist/loop/task-counter.d.ts +41 -0
  219. package/dist/loop/task-counter.d.ts.map +1 -0
  220. package/dist/loop/task-counter.js +99 -0
  221. package/dist/loop/task-counter.js.map +1 -0
  222. package/dist/loop/validation.d.ts +28 -0
  223. package/dist/loop/validation.d.ts.map +1 -0
  224. package/dist/loop/validation.js +138 -0
  225. package/dist/loop/validation.js.map +1 -0
  226. package/dist/mcp/core/init.d.ts +15 -0
  227. package/dist/mcp/core/init.d.ts.map +1 -0
  228. package/dist/mcp/core/init.js +272 -0
  229. package/dist/mcp/core/init.js.map +1 -0
  230. package/dist/mcp/core/plan.d.ts +15 -0
  231. package/dist/mcp/core/plan.d.ts.map +1 -0
  232. package/dist/mcp/core/plan.js +90 -0
  233. package/dist/mcp/core/plan.js.map +1 -0
  234. package/dist/mcp/core/run.d.ts +26 -0
  235. package/dist/mcp/core/run.d.ts.map +1 -0
  236. package/dist/mcp/core/run.js +114 -0
  237. package/dist/mcp/core/run.js.map +1 -0
  238. package/dist/mcp/prompts.d.ts +10 -0
  239. package/dist/mcp/prompts.d.ts.map +1 -0
  240. package/dist/mcp/prompts.js +163 -0
  241. package/dist/mcp/prompts.js.map +1 -0
  242. package/dist/mcp/resources.d.ts +16 -0
  243. package/dist/mcp/resources.d.ts.map +1 -0
  244. package/dist/mcp/resources.js +114 -0
  245. package/dist/mcp/resources.js.map +1 -0
  246. package/dist/mcp/server.d.ts +10 -0
  247. package/dist/mcp/server.d.ts.map +1 -0
  248. package/dist/mcp/server.js +73 -0
  249. package/dist/mcp/server.js.map +1 -0
  250. package/dist/mcp/tools.d.ts +15 -0
  251. package/dist/mcp/tools.d.ts.map +1 -0
  252. package/dist/mcp/tools.js +316 -0
  253. package/dist/mcp/tools.js.map +1 -0
  254. package/dist/presets/index.d.ts +36 -0
  255. package/dist/presets/index.d.ts.map +1 -0
  256. package/dist/presets/index.js +236 -0
  257. package/dist/presets/index.js.map +1 -0
  258. package/dist/setup/agent-detector.d.ts +57 -0
  259. package/dist/setup/agent-detector.d.ts.map +1 -0
  260. package/dist/setup/agent-detector.js +170 -0
  261. package/dist/setup/agent-detector.js.map +1 -0
  262. package/dist/setup/index.d.ts +7 -0
  263. package/dist/setup/index.d.ts.map +1 -0
  264. package/dist/setup/index.js +7 -0
  265. package/dist/setup/index.js.map +1 -0
  266. package/dist/setup/llm-tester.d.ts +33 -0
  267. package/dist/setup/llm-tester.d.ts.map +1 -0
  268. package/dist/setup/llm-tester.js +105 -0
  269. package/dist/setup/llm-tester.js.map +1 -0
  270. package/dist/setup/wizard.d.ts +19 -0
  271. package/dist/setup/wizard.d.ts.map +1 -0
  272. package/dist/setup/wizard.js +313 -0
  273. package/dist/setup/wizard.js.map +1 -0
  274. package/dist/sources/__tests__/file.test.d.ts +2 -0
  275. package/dist/sources/__tests__/file.test.d.ts.map +1 -0
  276. package/dist/sources/__tests__/file.test.js +126 -0
  277. package/dist/sources/__tests__/file.test.js.map +1 -0
  278. package/dist/sources/__tests__/github.test.d.ts +2 -0
  279. package/dist/sources/__tests__/github.test.d.ts.map +1 -0
  280. package/dist/sources/__tests__/github.test.js +157 -0
  281. package/dist/sources/__tests__/github.test.js.map +1 -0
  282. package/dist/sources/base.d.ts +72 -0
  283. package/dist/sources/base.d.ts.map +1 -0
  284. package/dist/sources/base.js +127 -0
  285. package/dist/sources/base.js.map +1 -0
  286. package/dist/sources/builtin/file.d.ts +21 -0
  287. package/dist/sources/builtin/file.d.ts.map +1 -0
  288. package/dist/sources/builtin/file.js +129 -0
  289. package/dist/sources/builtin/file.js.map +1 -0
  290. package/dist/sources/builtin/github-scraper.d.ts +65 -0
  291. package/dist/sources/builtin/github-scraper.d.ts.map +1 -0
  292. package/dist/sources/builtin/github-scraper.js +324 -0
  293. package/dist/sources/builtin/github-scraper.js.map +1 -0
  294. package/dist/sources/builtin/pdf.d.ts +24 -0
  295. package/dist/sources/builtin/pdf.d.ts.map +1 -0
  296. package/dist/sources/builtin/pdf.js +174 -0
  297. package/dist/sources/builtin/pdf.js.map +1 -0
  298. package/dist/sources/builtin/url.d.ts +47 -0
  299. package/dist/sources/builtin/url.d.ts.map +1 -0
  300. package/dist/sources/builtin/url.js +429 -0
  301. package/dist/sources/builtin/url.js.map +1 -0
  302. package/dist/sources/config.d.ts +72 -0
  303. package/dist/sources/config.d.ts.map +1 -0
  304. package/dist/sources/config.js +215 -0
  305. package/dist/sources/config.js.map +1 -0
  306. package/dist/sources/index.d.ts +47 -0
  307. package/dist/sources/index.d.ts.map +1 -0
  308. package/dist/sources/index.js +210 -0
  309. package/dist/sources/index.js.map +1 -0
  310. package/dist/sources/integrations/github.d.ts +24 -0
  311. package/dist/sources/integrations/github.d.ts.map +1 -0
  312. package/dist/sources/integrations/github.js +193 -0
  313. package/dist/sources/integrations/github.js.map +1 -0
  314. package/dist/sources/integrations/linear.d.ts +18 -0
  315. package/dist/sources/integrations/linear.d.ts.map +1 -0
  316. package/dist/sources/integrations/linear.js +197 -0
  317. package/dist/sources/integrations/linear.js.map +1 -0
  318. package/dist/sources/integrations/notion.d.ts +39 -0
  319. package/dist/sources/integrations/notion.d.ts.map +1 -0
  320. package/dist/sources/integrations/notion.js +343 -0
  321. package/dist/sources/integrations/notion.js.map +1 -0
  322. package/dist/sources/integrations/todoist.d.ts +18 -0
  323. package/dist/sources/integrations/todoist.d.ts.map +1 -0
  324. package/dist/sources/integrations/todoist.js +154 -0
  325. package/dist/sources/integrations/todoist.js.map +1 -0
  326. package/dist/sources/types.d.ts +106 -0
  327. package/dist/sources/types.d.ts.map +1 -0
  328. package/dist/sources/types.js +9 -0
  329. package/dist/sources/types.js.map +1 -0
  330. package/dist/ui/index.d.ts +3 -0
  331. package/dist/ui/index.d.ts.map +1 -0
  332. package/dist/ui/index.js +3 -0
  333. package/dist/ui/index.js.map +1 -0
  334. package/dist/ui/progress-renderer.d.ts +54 -0
  335. package/dist/ui/progress-renderer.d.ts.map +1 -0
  336. package/dist/ui/progress-renderer.js +118 -0
  337. package/dist/ui/progress-renderer.js.map +1 -0
  338. package/dist/ui/shimmer.d.ts +16 -0
  339. package/dist/ui/shimmer.d.ts.map +1 -0
  340. package/dist/ui/shimmer.js +31 -0
  341. package/dist/ui/shimmer.js.map +1 -0
  342. package/dist/wizard/ascii-art.d.ts +93 -0
  343. package/dist/wizard/ascii-art.d.ts.map +1 -0
  344. package/dist/wizard/ascii-art.js +378 -0
  345. package/dist/wizard/ascii-art.js.map +1 -0
  346. package/dist/wizard/idea-prompts.d.ts +18 -0
  347. package/dist/wizard/idea-prompts.d.ts.map +1 -0
  348. package/dist/wizard/idea-prompts.js +154 -0
  349. package/dist/wizard/idea-prompts.js.map +1 -0
  350. package/dist/wizard/idea-ui.d.ts +34 -0
  351. package/dist/wizard/idea-ui.d.ts.map +1 -0
  352. package/dist/wizard/idea-ui.js +225 -0
  353. package/dist/wizard/idea-ui.js.map +1 -0
  354. package/dist/wizard/ideas.d.ts +27 -0
  355. package/dist/wizard/ideas.d.ts.map +1 -0
  356. package/dist/wizard/ideas.js +511 -0
  357. package/dist/wizard/ideas.js.map +1 -0
  358. package/dist/wizard/index.d.ts +11 -0
  359. package/dist/wizard/index.d.ts.map +1 -0
  360. package/dist/wizard/index.js +472 -0
  361. package/dist/wizard/index.js.map +1 -0
  362. package/dist/wizard/llm.d.ts +14 -0
  363. package/dist/wizard/llm.d.ts.map +1 -0
  364. package/dist/wizard/llm.js +420 -0
  365. package/dist/wizard/llm.js.map +1 -0
  366. package/dist/wizard/prompts.d.ts +75 -0
  367. package/dist/wizard/prompts.d.ts.map +1 -0
  368. package/dist/wizard/prompts.js +455 -0
  369. package/dist/wizard/prompts.js.map +1 -0
  370. package/dist/wizard/spec-generator.d.ts +14 -0
  371. package/dist/wizard/spec-generator.d.ts.map +1 -0
  372. package/dist/wizard/spec-generator.js +200 -0
  373. package/dist/wizard/spec-generator.js.map +1 -0
  374. package/dist/wizard/types.d.ts +53 -0
  375. package/dist/wizard/types.d.ts.map +1 -0
  376. package/dist/wizard/types.js +10 -0
  377. package/dist/wizard/types.js.map +1 -0
  378. package/dist/wizard/ui.d.ts +57 -0
  379. package/dist/wizard/ui.d.ts.map +1 -0
  380. package/dist/wizard/ui.js +211 -0
  381. package/dist/wizard/ui.js.map +1 -0
  382. package/package.json +67 -8
@@ -0,0 +1,420 @@
1
+ import chalk from 'chalk';
2
+ import { getConfiguredLLM, getLLMModel } from '../config/manager.js';
3
+ import { callLLM, PROVIDERS } from '../llm/index.js';
4
+ import { detectBestAgent, runAgent } from '../loop/agents.js';
5
+ import { RalphAnimator } from './ascii-art.js';
6
+ // Timeout for agent calls (60 seconds - agents take longer)
7
+ const AGENT_TIMEOUT_MS = 60000;
8
+ /**
9
+ * Wrap a promise with a timeout
10
+ */
11
+ function withTimeout(promise, timeoutMs, message) {
12
+ return Promise.race([
13
+ promise,
14
+ new Promise((_, reject) => setTimeout(() => reject(new Error(message)), timeoutMs)),
15
+ ]);
16
+ }
17
+ /**
18
+ * Parse JSONL stream output from Claude Code to extract text content.
19
+ * Claude Code's stream-json format emits one JSON object per line.
20
+ * We look for:
21
+ * 1. "type": "result" -> contains the final response in "result" field
22
+ * 2. "type": "assistant" -> contains message content with text blocks
23
+ */
24
+ function parseStreamJsonOutput(output) {
25
+ const lines = output.split('\n').filter(Boolean);
26
+ let resultText = '';
27
+ let assistantText = '';
28
+ for (const line of lines) {
29
+ try {
30
+ const parsed = JSON.parse(line);
31
+ // Check for result event (contains final summary)
32
+ if (parsed.type === 'result' && parsed.result) {
33
+ resultText = parsed.result;
34
+ }
35
+ // Check for assistant message (contains actual response content)
36
+ if (parsed.type === 'assistant' && parsed.message?.content) {
37
+ for (const block of parsed.message.content) {
38
+ if (block.type === 'text' && typeof block.text === 'string') {
39
+ assistantText += block.text;
40
+ }
41
+ }
42
+ }
43
+ }
44
+ catch {
45
+ // Ignore non-JSON lines
46
+ }
47
+ }
48
+ // Prefer result text if available, fall back to assistant text
49
+ return resultText || assistantText;
50
+ }
51
+ /**
52
+ * Extract JSON object from text (handles markdown code blocks and plain JSON)
53
+ */
54
+ function extractJsonFromText(text) {
55
+ // First, try to find JSON in markdown code blocks
56
+ const codeBlockMatch = text.match(/```(?:json)?\s*(\{[\s\S]*?\})\s*```/);
57
+ if (codeBlockMatch) {
58
+ return codeBlockMatch[1];
59
+ }
60
+ // Fall back to raw JSON match
61
+ const jsonMatch = text.match(/\{[\s\S]*\}/);
62
+ return jsonMatch ? jsonMatch[0] : null;
63
+ }
64
+ const REFINEMENT_PROMPT = `You are a product analyst helping to refine a project idea.
65
+ Given a user's project idea, analyze it and return a JSON response.
66
+
67
+ User's idea: "{IDEA}"
68
+
69
+ Return ONLY valid JSON (no markdown, no explanation) in this exact format:
70
+ {
71
+ "projectName": "suggested-name-in-kebab-case",
72
+ "projectDescription": "A one-sentence description of what this project does",
73
+ "projectType": "web|api|cli|mobile|library|automation",
74
+ "suggestedStack": {
75
+ "frontend": "react|nextjs|vue|svelte|astro|remix|vanilla|react-native|expo|null",
76
+ "backend": "nodejs|express|fastify|hono|python|django|flask|fastapi|go|gin|rust|null",
77
+ "database": "sqlite|postgres|mysql|mongodb|redis|supabase|firebase|prisma|drizzle|null",
78
+ "styling": "tailwind|css|scss|styled-components|null",
79
+ "language": "typescript|javascript|python|go|rust"
80
+ },
81
+ "coreFeatures": ["feature1", "feature2", "feature3"],
82
+ "suggestedFeatures": ["additional-feature1", "additional-feature2"],
83
+ "estimatedComplexity": "prototype|mvp|full"
84
+ }
85
+
86
+ Guidelines:
87
+ - projectName should be short, memorable, and lowercase with hyphens
88
+ - Choose the most appropriate projectType based on the idea
89
+ - CRITICAL: If the user mentions ANY specific technology, framework, library, or tool, you MUST use it exactly as specified. This applies to:
90
+ - Frontend: Astro, Next.js, Vue, Svelte, React, Remix, etc.
91
+ - Backend: Express, Fastify, Hono, Django, Flask, FastAPI, Gin, etc.
92
+ - Database: PostgreSQL, MySQL, MongoDB, Supabase, Firebase, Prisma, Drizzle, etc.
93
+ - Styling: Tailwind, SCSS, styled-components, etc.
94
+ - Language: TypeScript, Python, Go, Rust, etc.
95
+ - NEVER substitute a user-specified technology with a different one
96
+ - Only suggest defaults when the user doesn't specify (e.g., TypeScript + React for unspecified web apps)
97
+ - coreFeatures are essential features implied by the idea
98
+ - suggestedFeatures are nice-to-haves that would enhance the project
99
+ - estimatedComplexity is based on scope (prototype=hours, mvp=day, full=days/weeks)`;
100
+ /**
101
+ * Refine user's idea using LLM (hybrid approach)
102
+ * Priority: Claude Code CLI (no API key needed) > Direct API > Template fallback
103
+ * @param spinner - Optional spinner to stop before streaming output
104
+ */
105
+ export async function refineIdea(idea, spinner) {
106
+ // 1. Try Claude Code agent FIRST (most frictionless - no API key needed!)
107
+ const agent = await detectBestAgent();
108
+ if (agent) {
109
+ try {
110
+ // Stop spinner before showing loading animation
111
+ if (spinner) {
112
+ spinner.stop();
113
+ console.log();
114
+ }
115
+ // Use loading animation while agent works
116
+ const animator = new RalphAnimator();
117
+ animator.start('Analyzing your idea...');
118
+ try {
119
+ const result = await refineViaAgentWithAnimator(idea, agent, animator);
120
+ animator.stop(chalk.green('✓ Idea analyzed!'));
121
+ return result;
122
+ }
123
+ catch (_error) {
124
+ animator.stop(chalk.red('✗ Could not analyze idea'));
125
+ // Fall through to API
126
+ }
127
+ }
128
+ catch (_error) {
129
+ // Fall through to API - silent fallback
130
+ }
131
+ }
132
+ // 2. Try direct API if key available (supports Anthropic, OpenAI, OpenRouter)
133
+ const llmConfig = getConfiguredLLM();
134
+ if (llmConfig) {
135
+ try {
136
+ return await refineViaApi(idea, llmConfig.provider, llmConfig.apiKey);
137
+ }
138
+ catch (_error) {
139
+ // Fall through to template - silent fallback
140
+ }
141
+ }
142
+ // 3. Ultimate fallback: template-based suggestions
143
+ return getTemplateSuggestions(idea);
144
+ }
145
+ /**
146
+ * Refine via LLM API (supports multiple providers)
147
+ */
148
+ async function refineViaApi(idea, provider, apiKey) {
149
+ const prompt = REFINEMENT_PROMPT.replace('{IDEA}', idea);
150
+ const model = getLLMModel() || PROVIDERS[provider].defaultModel;
151
+ const response = await callLLM(provider, apiKey, {
152
+ prompt,
153
+ maxTokens: 1024,
154
+ model,
155
+ });
156
+ // Parse JSON from response
157
+ const jsonMatch = response.content.match(/\{[\s\S]*\}/);
158
+ if (!jsonMatch) {
159
+ throw new Error('No JSON in response');
160
+ }
161
+ return JSON.parse(jsonMatch[0]);
162
+ }
163
+ /**
164
+ * Refine via Claude Code agent
165
+ */
166
+ async function _refineViaAgent(idea, agent) {
167
+ const prompt = REFINEMENT_PROMPT.replace('{IDEA}', idea);
168
+ // NOTE: Don't use maxTurns:1 - it's too restrictive and causes "Reached max turns" error
169
+ const result = await withTimeout(runAgent(agent, {
170
+ task: prompt,
171
+ cwd: process.cwd(),
172
+ auto: true,
173
+ // Don't stream - Ralph animation provides visual feedback
174
+ // No maxTurns - let agent complete naturally
175
+ }), AGENT_TIMEOUT_MS, `Agent timed out after ${AGENT_TIMEOUT_MS / 1000}s`);
176
+ if (result.exitCode !== 0) {
177
+ throw new Error('Agent failed');
178
+ }
179
+ // Parse JSONL stream output to extract text content
180
+ const textContent = parseStreamJsonOutput(result.output);
181
+ // Extract JSON from the text content
182
+ const jsonText = extractJsonFromText(textContent || result.output);
183
+ if (!jsonText) {
184
+ throw new Error('No JSON in agent output');
185
+ }
186
+ return JSON.parse(jsonText);
187
+ }
188
+ /**
189
+ * Detect status message from JSONL event
190
+ */
191
+ function getStatusFromEvent(parsed) {
192
+ // System events
193
+ if (parsed.type === 'system') {
194
+ if (parsed.subtype === 'init')
195
+ return 'Starting up...';
196
+ return null;
197
+ }
198
+ // Assistant is thinking/responding
199
+ if (parsed.type === 'assistant') {
200
+ const content = parsed.message?.content;
201
+ if (content && Array.isArray(content)) {
202
+ for (const block of content) {
203
+ // Tool use - show what tool is being used
204
+ if (block.type === 'tool_use') {
205
+ const toolName = block.name?.toLowerCase() || '';
206
+ if (toolName.includes('read'))
207
+ return 'Reading files...';
208
+ if (toolName.includes('write') || toolName.includes('edit'))
209
+ return 'Writing...';
210
+ if (toolName.includes('glob') || toolName.includes('grep'))
211
+ return 'Searching...';
212
+ if (toolName.includes('bash'))
213
+ return 'Running command...';
214
+ if (toolName.includes('task'))
215
+ return 'Processing...';
216
+ return `Using ${block.name}...`;
217
+ }
218
+ // Text content - Claude is thinking
219
+ if (block.type === 'text') {
220
+ return 'Thinking...';
221
+ }
222
+ }
223
+ }
224
+ return 'Thinking...';
225
+ }
226
+ // User/tool result
227
+ if (parsed.type === 'user') {
228
+ return 'Processing result...';
229
+ }
230
+ // Result event
231
+ if (parsed.type === 'result') {
232
+ return 'Finishing up...';
233
+ }
234
+ return null;
235
+ }
236
+ /**
237
+ * Refine via Claude Code agent with streaming output to animator
238
+ */
239
+ async function refineViaAgentWithAnimator(idea, agent, animator) {
240
+ const prompt = REFINEMENT_PROMPT.replace('{IDEA}', idea);
241
+ const result = await withTimeout(runAgent(agent, {
242
+ task: prompt,
243
+ cwd: process.cwd(),
244
+ auto: true,
245
+ onOutput: (line) => {
246
+ // Parse JSONL lines to update status message
247
+ try {
248
+ const parsed = JSON.parse(line);
249
+ // Update animator message based on event type
250
+ const status = getStatusFromEvent(parsed);
251
+ if (status) {
252
+ animator.updateMessage(status);
253
+ }
254
+ }
255
+ catch {
256
+ // Not JSON - ignore
257
+ }
258
+ },
259
+ }), AGENT_TIMEOUT_MS, `Agent timed out after ${AGENT_TIMEOUT_MS / 1000}s`);
260
+ if (result.exitCode !== 0) {
261
+ throw new Error('Agent failed');
262
+ }
263
+ // Parse JSONL stream output to extract text content
264
+ const textContent = parseStreamJsonOutput(result.output);
265
+ // Extract JSON from the text content
266
+ const jsonText = extractJsonFromText(textContent || result.output);
267
+ if (!jsonText) {
268
+ throw new Error('No JSON in agent output');
269
+ }
270
+ return JSON.parse(jsonText);
271
+ }
272
+ /**
273
+ * Template-based fallback when no LLM available
274
+ */
275
+ function getTemplateSuggestions(idea) {
276
+ const lowerIdea = idea.toLowerCase();
277
+ // Detect project type from keywords
278
+ let projectType = 'web';
279
+ if (lowerIdea.includes('api') || lowerIdea.includes('backend') || lowerIdea.includes('server')) {
280
+ projectType = 'api';
281
+ }
282
+ else if (lowerIdea.includes('cli') ||
283
+ lowerIdea.includes('command line') ||
284
+ lowerIdea.includes('terminal')) {
285
+ projectType = 'cli';
286
+ }
287
+ else if (lowerIdea.includes('mobile') ||
288
+ lowerIdea.includes('ios') ||
289
+ lowerIdea.includes('android')) {
290
+ projectType = 'mobile';
291
+ }
292
+ else if (lowerIdea.includes('library') ||
293
+ lowerIdea.includes('package') ||
294
+ lowerIdea.includes('sdk')) {
295
+ projectType = 'library';
296
+ }
297
+ else if (lowerIdea.includes('script') ||
298
+ lowerIdea.includes('automate') ||
299
+ lowerIdea.includes('bot')) {
300
+ projectType = 'automation';
301
+ }
302
+ // Generate project name from idea
303
+ const projectName = idea
304
+ .toLowerCase()
305
+ .replace(/^(a|an|the)\s+/i, '')
306
+ .replace(/[^a-z0-9\s]/g, '')
307
+ .trim()
308
+ .split(/\s+/)
309
+ .slice(0, 3)
310
+ .join('-');
311
+ // Detect specific technologies from idea
312
+ const detectTech = (patterns) => {
313
+ for (const [pattern, value] of patterns) {
314
+ if (lowerIdea.includes(pattern))
315
+ return value;
316
+ }
317
+ return undefined;
318
+ };
319
+ const detectedFrontend = detectTech([
320
+ ['astro', 'astro'],
321
+ ['nextjs', 'nextjs'],
322
+ ['next.js', 'nextjs'],
323
+ ['remix', 'remix'],
324
+ ['vue', 'vue'],
325
+ ['svelte', 'svelte'],
326
+ ['react native', 'react-native'],
327
+ ['expo', 'expo'],
328
+ ]);
329
+ const detectedBackend = detectTech([
330
+ ['express', 'express'],
331
+ ['fastify', 'fastify'],
332
+ ['hono', 'hono'],
333
+ ['django', 'django'],
334
+ ['flask', 'flask'],
335
+ ['fastapi', 'fastapi'],
336
+ ['gin', 'gin'],
337
+ ]);
338
+ const detectedDatabase = detectTech([
339
+ ['supabase', 'supabase'],
340
+ ['firebase', 'firebase'],
341
+ ['prisma', 'prisma'],
342
+ ['drizzle', 'drizzle'],
343
+ ['postgres', 'postgres'],
344
+ ['postgresql', 'postgres'],
345
+ ['mysql', 'mysql'],
346
+ ['mongodb', 'mongodb'],
347
+ ['mongo', 'mongodb'],
348
+ ['redis', 'redis'],
349
+ ]);
350
+ const detectedStyling = detectTech([
351
+ ['tailwind', 'tailwind'],
352
+ ['styled-components', 'styled-components'],
353
+ ['scss', 'scss'],
354
+ ['sass', 'scss'],
355
+ ]);
356
+ const detectedLanguage = detectTech([
357
+ ['typescript', 'typescript'],
358
+ ['python', 'python'],
359
+ ['golang', 'go'],
360
+ [' go ', 'go'],
361
+ ['rust', 'rust'],
362
+ ]);
363
+ // Suggest stack based on type and detected tech
364
+ const suggestedStack = {};
365
+ if (projectType === 'web') {
366
+ suggestedStack.frontend = detectedFrontend || 'react';
367
+ suggestedStack.backend =
368
+ detectedBackend || (detectedFrontend === 'astro' ? undefined : 'nodejs');
369
+ suggestedStack.database =
370
+ detectedDatabase || (detectedFrontend === 'astro' ? undefined : 'sqlite');
371
+ }
372
+ else if (projectType === 'api') {
373
+ suggestedStack.backend = detectedBackend || 'nodejs';
374
+ suggestedStack.database = detectedDatabase || 'postgres';
375
+ }
376
+ else if (projectType === 'mobile') {
377
+ suggestedStack.frontend = detectedFrontend || 'expo';
378
+ suggestedStack.backend = detectedBackend || 'nodejs';
379
+ }
380
+ else if (projectType === 'cli') {
381
+ suggestedStack.language = detectedLanguage || 'typescript';
382
+ }
383
+ // Add detected styling and language if found
384
+ if (detectedStyling)
385
+ suggestedStack.styling = detectedStyling;
386
+ if (detectedLanguage)
387
+ suggestedStack.language = detectedLanguage;
388
+ // Common features based on type
389
+ const typeFeatures = {
390
+ web: ['User interface', 'Data persistence', 'Responsive design'],
391
+ api: ['REST endpoints', 'Input validation', 'Error handling'],
392
+ cli: ['Help command', 'Configuration file', 'Progress indicators'],
393
+ mobile: ['Navigation', 'Data storage', 'User interface'],
394
+ library: ['TypeScript support', 'Documentation', 'Tests'],
395
+ automation: ['Error handling', 'Logging', 'Configuration'],
396
+ };
397
+ return {
398
+ projectName: projectName || 'my-project',
399
+ projectDescription: idea,
400
+ projectType,
401
+ suggestedStack,
402
+ coreFeatures: typeFeatures[projectType] || [],
403
+ suggestedFeatures: ['Dark mode', 'Error notifications', 'Loading states'],
404
+ estimatedComplexity: 'mvp',
405
+ };
406
+ }
407
+ /**
408
+ * Check if LLM refinement is available
409
+ * Priority: Claude Code agent (no API key needed) > API key configured
410
+ */
411
+ export async function isLlmAvailable() {
412
+ // Check for Claude Code agent first (most frictionless)
413
+ const agent = await detectBestAgent();
414
+ if (agent)
415
+ return true;
416
+ // Check for API key
417
+ const llmConfig = getConfiguredLLM();
418
+ return llmConfig !== null;
419
+ }
420
+ //# sourceMappingURL=llm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.js","sourceRoot":"","sources":["../../src/wizard/llm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ import type { ProjectInfo } from '../commands/init.js';
2
+ import type { Complexity, ProjectType, TechStack } from './types.js';
3
+ /**
4
+ * Ask if user has an idea or needs help brainstorming
5
+ * @param isExistingProject - If true, show option to improve existing project
6
+ * @param isRalphProject - If true (and isExistingProject), project has Ralph files
7
+ */
8
+ export declare function askHasIdea(options?: {
9
+ isExistingProject?: boolean;
10
+ isRalphProject?: boolean;
11
+ }): Promise<'has_idea' | 'need_help' | 'improve_existing'>;
12
+ /**
13
+ * Ask how user wants to improve existing project
14
+ */
15
+ export type ImproveAction = 'prompt' | 'analyze';
16
+ export declare function askImproveAction(): Promise<ImproveAction>;
17
+ /**
18
+ * Ask for improvement instructions
19
+ */
20
+ export declare function askImprovementPrompt(): Promise<string>;
21
+ /**
22
+ * Ask for the user's idea
23
+ */
24
+ export declare function askForIdea(): Promise<string>;
25
+ /**
26
+ * Ask for project type if not detected
27
+ */
28
+ export declare function askForProjectType(suggestedType?: ProjectType): Promise<ProjectType>;
29
+ /**
30
+ * Ask for tech stack preferences
31
+ */
32
+ export declare function askForTechStack(projectType: ProjectType, suggestedStack?: TechStack): Promise<TechStack>;
33
+ /**
34
+ * Ask user to select features
35
+ */
36
+ export declare function askForFeatures(coreFeatures: string[], suggestedFeatures: string[]): Promise<string[]>;
37
+ /**
38
+ * Ask for project complexity
39
+ */
40
+ export declare function askForComplexity(suggestedComplexity?: Complexity): Promise<Complexity>;
41
+ /**
42
+ * Confirm the refined plan
43
+ */
44
+ export declare function confirmPlan(): Promise<'proceed' | 'modify' | 'restart'>;
45
+ /**
46
+ * Ask what to modify
47
+ */
48
+ export declare function askWhatToModify(): Promise<'type' | 'stack' | 'features' | 'complexity'>;
49
+ /**
50
+ * Ask for execution options
51
+ */
52
+ export declare function askExecutionOptions(): Promise<{
53
+ autoRun: boolean;
54
+ autoCommit: boolean;
55
+ }>;
56
+ /**
57
+ * Ask for working directory
58
+ */
59
+ export declare function askWorkingDirectory(suggestedName: string): Promise<string>;
60
+ /**
61
+ * Ask what to do when an existing project is detected
62
+ */
63
+ export type ExistingProjectAction = 'enhance' | 'subfolder' | 'different';
64
+ export declare function askExistingProjectAction(projectInfo: ProjectInfo): Promise<ExistingProjectAction>;
65
+ /**
66
+ * Ask what to do when a Ralph Playbook is detected
67
+ */
68
+ export type RalphPlaybookAction = 'continue' | 'fresh' | 'different';
69
+ export declare function askRalphPlaybookAction(): Promise<RalphPlaybookAction>;
70
+ /**
71
+ * Ask what action to take when continuing on an existing Ralph project
72
+ */
73
+ export type ContinueAction = 'run' | 'plan' | 'add_spec';
74
+ export declare function askContinueAction(): Promise<ContinueAction>;
75
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/wizard/prompts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAErE;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,OAAO,CAAC,EAAE;IACzC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,OAAO,CAAC,UAAU,GAAG,WAAW,GAAG,kBAAkB,CAAC,CA+BzD;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEjD,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC,CAwB/D;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC,CAY5D;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAWlD;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,aAAa,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CA8BzF;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,WAAW,EACxB,cAAc,CAAC,EAAE,SAAS,GACzB,OAAO,CAAC,SAAS,CAAC,CAgHpB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,YAAY,EAAE,MAAM,EAAE,EACtB,iBAAiB,EAAE,MAAM,EAAE,GAC1B,OAAO,CAAC,MAAM,EAAE,CAAC,CAoBnB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,mBAAmB,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAmC5F;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC,CAe7E;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,YAAY,CAAC,CAgB7F;AAED;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC;IACnD,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;CACrB,CAAC,CAqCD;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiBhF;AAED;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,CAAC;AAE1E,wBAAsB,wBAAwB,CAC5C,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,qBAAqB,CAAC,CA+BhC;AAED;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG,OAAO,GAAG,WAAW,CAAC;AAErE,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,mBAAmB,CAAC,CA4B3E;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,UAAU,CAAC;AAEzD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,cAAc,CAAC,CA4BjE"}