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,313 @@
1
+ /**
2
+ * Setup Wizard for ralph-starter
3
+ * Interactive setup to configure LLM providers and agents
4
+ */
5
+ import chalk from 'chalk';
6
+ import inquirer from 'inquirer';
7
+ import ora from 'ora';
8
+ import { getConfiguredLLM, readConfig, writeConfig } from '../config/manager.js';
9
+ import { getProviderKeyFromEnv, PROVIDER_NAMES, PROVIDERS, } from '../llm/index.js';
10
+ import { detectAllAgents } from './agent-detector.js';
11
+ import { testApiConnection, testClaudeCode } from './llm-tester.js';
12
+ /**
13
+ * Show setup banner
14
+ */
15
+ function showBanner() {
16
+ console.log();
17
+ console.log(chalk.cyan(' ╭─────────────────────────────────────────╮'));
18
+ console.log(chalk.cyan(' │') +
19
+ chalk.bold.white(' ralph-starter Setup Wizard ') +
20
+ chalk.cyan('│'));
21
+ console.log(chalk.cyan(' │') + chalk.dim(" Let's get you configured! ") + chalk.cyan('│'));
22
+ console.log(chalk.cyan(' ╰─────────────────────────────────────────╯'));
23
+ console.log();
24
+ }
25
+ /**
26
+ * Step 1: Detect installed agents
27
+ */
28
+ async function stepDetectAgents() {
29
+ console.log(chalk.bold('Step 1: Detecting Installed Agents'));
30
+ console.log();
31
+ const spinner = ora('Scanning for AI coding agents...').start();
32
+ const agents = await detectAllAgents();
33
+ spinner.stop();
34
+ for (const agent of agents) {
35
+ if (agent.available) {
36
+ const version = agent.version ? `v${agent.version}` : '';
37
+ console.log(chalk.green(` ✓ ${agent.name} ${version}`));
38
+ if (agent.executablePath) {
39
+ console.log(chalk.dim(` ${agent.executablePath}`));
40
+ }
41
+ }
42
+ else {
43
+ console.log(chalk.dim(` ✗ ${agent.name} not found`));
44
+ }
45
+ }
46
+ console.log();
47
+ const claudeAvailable = agents.some((a) => a.id === 'claude' && a.available);
48
+ return { agents, claudeAvailable };
49
+ }
50
+ /**
51
+ * Step 2: Configure LLM provider
52
+ */
53
+ async function stepConfigureLLM(claudeAvailable) {
54
+ console.log(chalk.bold('Step 2: Configure LLM Provider'));
55
+ console.log();
56
+ // If Claude Code is available, offer to use it
57
+ if (claudeAvailable) {
58
+ console.log(chalk.green(' ✓ Claude Code CLI detected!'));
59
+ console.log(chalk.dim(' No API key needed - uses your Claude Code authentication.'));
60
+ console.log();
61
+ const { useClaudeCode } = await inquirer.prompt([
62
+ {
63
+ type: 'confirm',
64
+ name: 'useClaudeCode',
65
+ message: 'Use Claude Code CLI? (recommended - no API key needed)',
66
+ default: true,
67
+ },
68
+ ]);
69
+ if (useClaudeCode) {
70
+ return { usesClaudeCode: true };
71
+ }
72
+ }
73
+ // Check for existing API keys in environment
74
+ for (const providerName of PROVIDER_NAMES) {
75
+ const envKey = getProviderKeyFromEnv(providerName);
76
+ if (envKey) {
77
+ console.log(chalk.green(` ✓ Found ${PROVIDERS[providerName].envVar} in environment`));
78
+ console.log();
79
+ const { useEnvKey } = await inquirer.prompt([
80
+ {
81
+ type: 'confirm',
82
+ name: 'useEnvKey',
83
+ message: `Use ${PROVIDERS[providerName].displayName} from environment?`,
84
+ default: true,
85
+ },
86
+ ]);
87
+ if (useEnvKey) {
88
+ return { usesClaudeCode: false, provider: providerName, apiKey: envKey };
89
+ }
90
+ }
91
+ }
92
+ // Check for existing config
93
+ const existingConfig = getConfiguredLLM();
94
+ if (existingConfig) {
95
+ console.log(chalk.green(` ✓ Found existing ${PROVIDERS[existingConfig.provider].displayName} configuration`));
96
+ console.log();
97
+ const { useExisting } = await inquirer.prompt([
98
+ {
99
+ type: 'confirm',
100
+ name: 'useExisting',
101
+ message: 'Use existing configuration?',
102
+ default: true,
103
+ },
104
+ ]);
105
+ if (useExisting) {
106
+ return {
107
+ usesClaudeCode: false,
108
+ provider: existingConfig.provider,
109
+ apiKey: existingConfig.apiKey,
110
+ };
111
+ }
112
+ }
113
+ // No existing config - prompt for provider and key
114
+ console.log();
115
+ const { provider } = await inquirer.prompt([
116
+ {
117
+ type: 'list',
118
+ name: 'provider',
119
+ message: 'Choose your LLM provider:',
120
+ choices: PROVIDER_NAMES.map((p) => ({
121
+ name: `${PROVIDERS[p].displayName}`,
122
+ value: p,
123
+ })),
124
+ },
125
+ ]);
126
+ const providerConfig = PROVIDERS[provider];
127
+ console.log();
128
+ console.log(chalk.dim(`Get your API key at: ${providerConfig.consoleUrl}`));
129
+ console.log();
130
+ const { apiKey } = await inquirer.prompt([
131
+ {
132
+ type: 'password',
133
+ name: 'apiKey',
134
+ message: `Enter your ${providerConfig.displayName} API key:`,
135
+ mask: '*',
136
+ validate: (input) => {
137
+ if (!input || input.trim().length === 0) {
138
+ return 'API key is required';
139
+ }
140
+ return true;
141
+ },
142
+ },
143
+ ]);
144
+ return { usesClaudeCode: false, provider: provider, apiKey };
145
+ }
146
+ /**
147
+ * Step 3: Test connection
148
+ */
149
+ async function stepTestConnection(options) {
150
+ console.log();
151
+ console.log(chalk.bold('Step 3: Testing Connection'));
152
+ console.log();
153
+ const spinner = ora('Testing connection...').start();
154
+ let result;
155
+ if (options.usesClaudeCode) {
156
+ result = await testClaudeCode();
157
+ }
158
+ else if (options.provider && options.apiKey) {
159
+ result = await testApiConnection(options.provider, options.apiKey);
160
+ }
161
+ else {
162
+ spinner.fail('No LLM configured');
163
+ return false;
164
+ }
165
+ if (result.success) {
166
+ const time = result.responseTime ? ` (${result.responseTime}ms)` : '';
167
+ spinner.succeed(`Connection successful${time}`);
168
+ if (result.details) {
169
+ console.log(chalk.dim(` ${result.details}`));
170
+ }
171
+ return true;
172
+ }
173
+ else {
174
+ spinner.fail(`Connection failed: ${result.error}`);
175
+ return false;
176
+ }
177
+ }
178
+ /**
179
+ * Step 4: Save configuration
180
+ */
181
+ async function stepSaveConfig(options) {
182
+ console.log();
183
+ console.log(chalk.bold('Step 4: Saving Configuration'));
184
+ console.log();
185
+ const config = readConfig();
186
+ // Set agent preference
187
+ config.agent = {
188
+ default: options.usesClaudeCode ? 'claude' : options.selectedAgent || 'claude',
189
+ usesClaudeCodeCLI: options.usesClaudeCode,
190
+ };
191
+ // Set LLM config if using API
192
+ if (!options.usesClaudeCode && options.provider) {
193
+ config.llm = { provider: options.provider };
194
+ // Ask to save API key
195
+ const { saveKey } = await inquirer.prompt([
196
+ {
197
+ type: 'confirm',
198
+ name: 'saveKey',
199
+ message: 'Save API key to config file?',
200
+ default: true,
201
+ },
202
+ ]);
203
+ if (saveKey && options.apiKey) {
204
+ if (!config.providers) {
205
+ config.providers = {};
206
+ }
207
+ config.providers[options.provider] = { apiKey: options.apiKey };
208
+ }
209
+ }
210
+ // Mark setup as complete
211
+ config.setupCompleted = true;
212
+ config.setupVersion = '1.0';
213
+ writeConfig(config);
214
+ console.log(chalk.green(' ✓ Configuration saved'));
215
+ }
216
+ /**
217
+ * Step 5: Show success message
218
+ */
219
+ function showSuccess(options) {
220
+ console.log();
221
+ console.log(chalk.cyan(' ╭─────────────────────────────────────────╮'));
222
+ console.log(chalk.cyan(' │') +
223
+ chalk.bold.green(' Setup Complete! ') +
224
+ chalk.cyan('│'));
225
+ console.log(`${chalk.cyan(' │')} ${chalk.cyan('│')}`);
226
+ if (options.usesClaudeCode) {
227
+ console.log(`${chalk.cyan(' │')} Using: Claude Code CLI ${chalk.cyan('│')}`);
228
+ console.log(chalk.cyan(' │') + chalk.dim(' No API key needed ') + chalk.cyan('│'));
229
+ }
230
+ else if (options.provider) {
231
+ const name = PROVIDERS[options.provider].displayName;
232
+ const padding = ' '.repeat(Math.max(0, 25 - name.length));
233
+ console.log(`${chalk.cyan(' │')} Provider: ${name}${padding}${chalk.cyan('│')}`);
234
+ }
235
+ console.log(`${chalk.cyan(' │')} ${chalk.cyan('│')}`);
236
+ console.log(chalk.cyan(' ╰─────────────────────────────────────────╯'));
237
+ console.log();
238
+ console.log(chalk.bold(' Next steps:'));
239
+ console.log(chalk.dim(' • ralph-starter Launch wizard to build a project'));
240
+ console.log(chalk.dim(' • ralph-starter ideas Brainstorm project ideas'));
241
+ console.log(chalk.dim(' • ralph-starter check Verify configuration'));
242
+ console.log();
243
+ }
244
+ /**
245
+ * Run the full setup wizard
246
+ */
247
+ export async function runSetupWizard(options) {
248
+ showBanner();
249
+ // Check if already configured (unless --force)
250
+ if (!options?.force) {
251
+ const config = readConfig();
252
+ if (config.setupCompleted) {
253
+ console.log(chalk.yellow(' Setup has already been completed.'));
254
+ console.log(chalk.dim(' Run with --force to reconfigure.'));
255
+ console.log();
256
+ const { proceed } = await inquirer.prompt([
257
+ {
258
+ type: 'confirm',
259
+ name: 'proceed',
260
+ message: 'Continue anyway?',
261
+ default: false,
262
+ },
263
+ ]);
264
+ if (!proceed) {
265
+ return { success: true, usesClaudeCode: false };
266
+ }
267
+ console.log();
268
+ }
269
+ }
270
+ try {
271
+ // Step 1: Detect agents
272
+ const { claudeAvailable } = await stepDetectAgents();
273
+ // Step 2: Configure LLM
274
+ const llmConfig = await stepConfigureLLM(claudeAvailable);
275
+ // Step 3: Test connection
276
+ const testPassed = await stepTestConnection(llmConfig);
277
+ if (!testPassed) {
278
+ console.log();
279
+ console.log(chalk.yellow(' Connection test failed. You can still save the config'));
280
+ console.log(chalk.yellow(' and try again later with: ralph-starter check'));
281
+ console.log();
282
+ const { saveAnyway } = await inquirer.prompt([
283
+ {
284
+ type: 'confirm',
285
+ name: 'saveAnyway',
286
+ message: 'Save configuration anyway?',
287
+ default: false,
288
+ },
289
+ ]);
290
+ if (!saveAnyway) {
291
+ return { success: false, usesClaudeCode: false, error: 'Connection test failed' };
292
+ }
293
+ }
294
+ // Step 4: Save configuration
295
+ await stepSaveConfig(llmConfig);
296
+ // Step 5: Show success
297
+ showSuccess(llmConfig);
298
+ return {
299
+ success: true,
300
+ usesClaudeCode: llmConfig.usesClaudeCode,
301
+ provider: llmConfig.provider,
302
+ };
303
+ }
304
+ catch (error) {
305
+ if (error.message?.includes('User force closed')) {
306
+ console.log();
307
+ console.log(chalk.dim(' Setup cancelled.'));
308
+ return { success: false, usesClaudeCode: false, error: 'Cancelled' };
309
+ }
310
+ throw error;
311
+ }
312
+ }
313
+ //# sourceMappingURL=wizard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../src/setup/wizard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=file.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.test.d.ts","sourceRoot":"","sources":["../../../src/sources/__tests__/file.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,126 @@
1
+ import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
2
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
3
+ import { FileSource } from '../builtin/file.js';
4
+ // Mock fs
5
+ vi.mock('fs', () => ({
6
+ existsSync: vi.fn(),
7
+ readFileSync: vi.fn(),
8
+ readdirSync: vi.fn(),
9
+ statSync: vi.fn(),
10
+ }));
11
+ const mockExistsSync = vi.mocked(existsSync);
12
+ const mockReadFileSync = vi.mocked(readFileSync);
13
+ const mockReaddirSync = vi.mocked(readdirSync);
14
+ const mockStatSync = vi.mocked(statSync);
15
+ describe('FileSource', () => {
16
+ let source;
17
+ beforeEach(() => {
18
+ vi.clearAllMocks();
19
+ source = new FileSource();
20
+ });
21
+ describe('isAvailable', () => {
22
+ it('should always return true', async () => {
23
+ const available = await source.isAvailable();
24
+ expect(available).toBe(true);
25
+ });
26
+ });
27
+ describe('fetch - single file', () => {
28
+ beforeEach(() => {
29
+ mockExistsSync.mockReturnValue(true);
30
+ mockStatSync.mockReturnValue({ isFile: () => true, isDirectory: () => false });
31
+ });
32
+ it('should read markdown file as-is', async () => {
33
+ mockReadFileSync.mockReturnValue('# My Spec\n\nDescription here');
34
+ const result = await source.fetch('spec.md');
35
+ expect(result.content).toBe('# My Spec\n\nDescription here');
36
+ expect(result.metadata?.extension).toBe('.md');
37
+ });
38
+ it('should wrap non-markdown files in code blocks', async () => {
39
+ mockReadFileSync.mockReturnValue('const x = 1;');
40
+ const result = await source.fetch('code.ts');
41
+ expect(result.content).toContain('```typescript');
42
+ expect(result.content).toContain('const x = 1;');
43
+ expect(result.content).toContain('```');
44
+ });
45
+ it('should detect language from extension', async () => {
46
+ const testCases = [
47
+ { ext: 'code.ts', lang: 'typescript' },
48
+ { ext: 'code.js', lang: 'javascript' },
49
+ { ext: 'code.py', lang: 'python' },
50
+ { ext: 'code.go', lang: 'go' },
51
+ { ext: 'code.json', lang: 'json' },
52
+ ];
53
+ for (const { ext, lang } of testCases) {
54
+ mockReadFileSync.mockReturnValue('content');
55
+ const result = await source.fetch(ext);
56
+ expect(result.content).toContain(`\`\`\`${lang}`);
57
+ }
58
+ });
59
+ it('should include file metadata', async () => {
60
+ mockReadFileSync.mockReturnValue('content');
61
+ const result = await source.fetch('test.md');
62
+ expect(result.metadata?.type).toBe('file');
63
+ expect(result.metadata?.size).toBe(7); // 'content'.length
64
+ });
65
+ it('should throw when file does not exist', async () => {
66
+ mockExistsSync.mockReturnValue(false);
67
+ await expect(source.fetch('nonexistent.md')).rejects.toThrow('File or directory not found');
68
+ });
69
+ });
70
+ describe('fetch - directory', () => {
71
+ beforeEach(() => {
72
+ mockExistsSync.mockReturnValue(true);
73
+ mockStatSync.mockReturnValue({ isFile: () => false, isDirectory: () => true });
74
+ });
75
+ it('should read all markdown files in directory', async () => {
76
+ mockReaddirSync.mockReturnValue(['spec1.md', 'spec2.md', 'other.js']);
77
+ mockReadFileSync
78
+ .mockReturnValueOnce('# Spec 1\nContent 1')
79
+ .mockReturnValueOnce('# Spec 2\nContent 2');
80
+ const result = await source.fetch('specs/');
81
+ expect(result.content).toContain('Spec 1');
82
+ expect(result.content).toContain('Spec 2');
83
+ expect(result.content).not.toContain('other.js');
84
+ });
85
+ it('should include text files', async () => {
86
+ mockReaddirSync.mockReturnValue(['readme.txt', 'notes.md']);
87
+ mockReadFileSync.mockReturnValueOnce('Text content').mockReturnValueOnce('Markdown content');
88
+ const result = await source.fetch('docs/');
89
+ expect(result.content).toContain('Text content');
90
+ expect(result.content).toContain('Markdown content');
91
+ });
92
+ it('should respect limit option', async () => {
93
+ mockReaddirSync.mockReturnValue(['a.md', 'b.md', 'c.md', 'd.md', 'e.md']);
94
+ mockReadFileSync.mockReturnValue('content');
95
+ const result = await source.fetch('specs/', { limit: 2 });
96
+ // Should only include 2 files
97
+ expect((result.metadata?.files).length).toBe(2);
98
+ });
99
+ it('should throw when directory has no markdown files', async () => {
100
+ mockReaddirSync.mockReturnValue(['file.js', 'file.ts']);
101
+ await expect(source.fetch('src/')).rejects.toThrow('No markdown files found');
102
+ });
103
+ it('should combine files with separators', async () => {
104
+ mockReaddirSync.mockReturnValue(['a.md', 'b.md']);
105
+ mockReadFileSync.mockReturnValueOnce('Content A').mockReturnValueOnce('Content B');
106
+ const result = await source.fetch('specs/');
107
+ expect(result.content).toContain('---');
108
+ });
109
+ it('should include directory metadata', async () => {
110
+ mockReaddirSync.mockReturnValue(['a.md']);
111
+ mockReadFileSync.mockReturnValue('content');
112
+ const result = await source.fetch('specs/');
113
+ expect(result.metadata?.type).toBe('directory');
114
+ expect(result.metadata?.files).toContain('a.md');
115
+ });
116
+ });
117
+ describe('getHelp', () => {
118
+ it('should return help text', () => {
119
+ const help = source.getHelp();
120
+ expect(help).toContain('file');
121
+ expect(help).toContain('.md');
122
+ expect(help).toContain('Markdown');
123
+ });
124
+ });
125
+ });
126
+ //# sourceMappingURL=file.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.test.js","sourceRoot":"","sources":["../../../src/sources/__tests__/file.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=github.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.test.d.ts","sourceRoot":"","sources":["../../../src/sources/__tests__/github.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,157 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import { GitHubSource } from '../integrations/github.js';
3
+ // Mock execa
4
+ vi.mock('execa', () => ({
5
+ execa: vi.fn(),
6
+ }));
7
+ import { execa } from 'execa';
8
+ const mockExeca = vi.mocked(execa);
9
+ describe('GitHubSource', () => {
10
+ let source;
11
+ beforeEach(() => {
12
+ vi.clearAllMocks();
13
+ source = new GitHubSource();
14
+ });
15
+ describe('isAvailable', () => {
16
+ it('should return true when gh CLI is available', async () => {
17
+ mockExeca.mockResolvedValueOnce({ stdout: 'Logged in', exitCode: 0 });
18
+ const available = await source.isAvailable();
19
+ expect(available).toBe(true);
20
+ expect(mockExeca).toHaveBeenCalledWith('gh', ['auth', 'status']);
21
+ });
22
+ it('should check gh CLI first', async () => {
23
+ mockExeca.mockRejectedValueOnce(new Error('gh not found'));
24
+ // Even if gh is not available, the source checks gh first
25
+ await source.isAvailable();
26
+ expect(mockExeca).toHaveBeenCalledWith('gh', ['auth', 'status']);
27
+ });
28
+ });
29
+ describe('requiresAuth', () => {
30
+ it('should return false (gh CLI handles auth)', () => {
31
+ expect(source.requiresAuth()).toBe(false);
32
+ });
33
+ });
34
+ describe('fetch', () => {
35
+ describe('via gh CLI', () => {
36
+ beforeEach(() => {
37
+ // Make gh CLI available
38
+ mockExeca.mockResolvedValueOnce({ stdout: 'Logged in', exitCode: 0 });
39
+ });
40
+ it('should fetch issues using gh CLI', async () => {
41
+ const mockIssues = [
42
+ {
43
+ number: 1,
44
+ title: 'Bug: Something broken',
45
+ body: 'Description of the bug',
46
+ state: 'open',
47
+ labels: [{ name: 'bug' }],
48
+ },
49
+ ];
50
+ mockExeca.mockResolvedValueOnce({
51
+ stdout: JSON.stringify(mockIssues),
52
+ exitCode: 0,
53
+ });
54
+ const result = await source.fetch('owner/repo');
55
+ expect(result.content).toContain('Bug: Something broken');
56
+ expect(result.content).toContain('Description of the bug');
57
+ expect(result.metadata?.issues).toBe(1);
58
+ });
59
+ it('should parse full GitHub URLs', async () => {
60
+ mockExeca.mockResolvedValueOnce({
61
+ stdout: '[]',
62
+ exitCode: 0,
63
+ });
64
+ await source.fetch('https://github.com/facebook/react');
65
+ expect(mockExeca).toHaveBeenLastCalledWith('gh', expect.arrayContaining(['-R', 'facebook/react']));
66
+ });
67
+ it('should apply label filter', async () => {
68
+ mockExeca.mockResolvedValueOnce({
69
+ stdout: '[]',
70
+ exitCode: 0,
71
+ });
72
+ await source.fetch('owner/repo', { label: 'bug' });
73
+ expect(mockExeca).toHaveBeenLastCalledWith('gh', expect.arrayContaining(['--label', 'bug']));
74
+ });
75
+ it('should apply status filter', async () => {
76
+ mockExeca.mockResolvedValueOnce({
77
+ stdout: '[]',
78
+ exitCode: 0,
79
+ });
80
+ await source.fetch('owner/repo', { status: 'closed' });
81
+ expect(mockExeca).toHaveBeenLastCalledWith('gh', expect.arrayContaining(['--state', 'closed']));
82
+ });
83
+ it('should apply limit', async () => {
84
+ mockExeca.mockResolvedValueOnce({
85
+ stdout: '[]',
86
+ exitCode: 0,
87
+ });
88
+ await source.fetch('owner/repo', { limit: 5 });
89
+ expect(mockExeca).toHaveBeenLastCalledWith('gh', expect.arrayContaining(['--limit', '5']));
90
+ });
91
+ it('should handle empty issues response', async () => {
92
+ mockExeca.mockResolvedValueOnce({
93
+ stdout: '[]',
94
+ exitCode: 0,
95
+ });
96
+ const result = await source.fetch('owner/repo');
97
+ expect(result.content).toContain('No issues found');
98
+ expect(result.metadata?.issues).toBe(0);
99
+ });
100
+ it('should format multiple issues', async () => {
101
+ const mockIssues = [
102
+ { number: 1, title: 'Issue 1', body: 'Body 1', state: 'open', labels: [] },
103
+ { number: 2, title: 'Issue 2', body: 'Body 2', state: 'open', labels: [] },
104
+ ];
105
+ mockExeca.mockResolvedValueOnce({
106
+ stdout: JSON.stringify(mockIssues),
107
+ exitCode: 0,
108
+ });
109
+ const result = await source.fetch('owner/repo');
110
+ expect(result.content).toContain('#1: Issue 1');
111
+ expect(result.content).toContain('#2: Issue 2');
112
+ expect(result.metadata?.issues).toBe(2);
113
+ });
114
+ it('should handle issues with labels', async () => {
115
+ const mockIssues = [
116
+ {
117
+ number: 1,
118
+ title: 'Bug',
119
+ body: 'Description',
120
+ state: 'open',
121
+ labels: [{ name: 'bug' }, { name: 'critical' }],
122
+ },
123
+ ];
124
+ mockExeca.mockResolvedValueOnce({
125
+ stdout: JSON.stringify(mockIssues),
126
+ exitCode: 0,
127
+ });
128
+ const result = await source.fetch('owner/repo');
129
+ expect(result.content).toContain('Labels: bug, critical');
130
+ });
131
+ it('should handle issues without body', async () => {
132
+ const mockIssues = [{ number: 1, title: 'No body', state: 'open', labels: [] }];
133
+ mockExeca.mockResolvedValueOnce({
134
+ stdout: JSON.stringify(mockIssues),
135
+ exitCode: 0,
136
+ });
137
+ const result = await source.fetch('owner/repo');
138
+ expect(result.content).toContain('No description provided');
139
+ });
140
+ });
141
+ describe('error handling', () => {
142
+ it('should throw on invalid repository format', async () => {
143
+ await expect(source.fetch('invalid')).rejects.toThrow('Invalid repository format');
144
+ });
145
+ });
146
+ });
147
+ describe('getHelp', () => {
148
+ it('should return help text', () => {
149
+ const help = source.getHelp();
150
+ expect(help).toContain('github');
151
+ expect(help).toContain('owner/repo');
152
+ expect(help).toContain('--label');
153
+ expect(help).toContain('--status');
154
+ });
155
+ });
156
+ });
157
+ //# sourceMappingURL=github.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.test.js","sourceRoot":"","sources":["../../../src/sources/__tests__/github.test.ts"],"names":[],"mappings":"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"}