ralph-starter 0.0.1 → 0.1.1-beta.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 (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 +376 -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 +59 -8
@@ -0,0 +1,243 @@
1
+ import crypto from 'node:crypto';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { getRandomPort, openBrowser } from '../auth/browser.js';
5
+ import { getCallbackUrl, startOAuthServer } from '../auth/oauth-server.js';
6
+ import { generatePKCE } from '../auth/pkce.js';
7
+ import { getProvider, getProviderNames } from '../auth/providers/index.js';
8
+ import { deleteSourceCredential, getSourceCredentials, getSourcesConfigPath, setSourceCredential, } from '../sources/config.js';
9
+ /**
10
+ * Auth command - Browser-based OAuth authentication for integrations
11
+ *
12
+ * Usage:
13
+ * ralph-starter auth <service> Start OAuth flow for a service
14
+ * ralph-starter auth --list Show auth status for all services
15
+ * ralph-starter auth --logout <service> Remove credentials for a service
16
+ */
17
+ export async function authCommand(service, options) {
18
+ // Handle --list
19
+ if (options.list) {
20
+ await showAuthStatus();
21
+ return;
22
+ }
23
+ // Handle --logout
24
+ if (options.logout) {
25
+ await logoutService(options.logout);
26
+ return;
27
+ }
28
+ // No service specified - show help
29
+ if (!service) {
30
+ showAuthHelp();
31
+ return;
32
+ }
33
+ // Start OAuth flow for the service
34
+ await startOAuthFlow(service);
35
+ }
36
+ /**
37
+ * Show authentication status for all services
38
+ */
39
+ async function showAuthStatus() {
40
+ console.log(chalk.bold('\nAuthentication Status'));
41
+ console.log(chalk.dim(`Credentials stored in: ${getSourcesConfigPath()}\n`));
42
+ const providers = getProviderNames();
43
+ for (const name of providers) {
44
+ const provider = getProvider(name);
45
+ if (!provider)
46
+ continue;
47
+ const credentials = getSourceCredentials(name);
48
+ const hasToken = credentials?.token || credentials?.apiKey;
49
+ const isConfigured = checkProviderConfigured(provider);
50
+ const authMethod = provider.supportsPKCE ? 'Browser OAuth (PKCE)' : 'Manual API key';
51
+ if (hasToken) {
52
+ console.log(` ${chalk.green('✓')} ${chalk.bold(provider.displayName)} - Authenticated`);
53
+ }
54
+ else if (isConfigured && provider.supportsPKCE) {
55
+ // PKCE provider with client_id configured - ready for browser auth
56
+ console.log(` ${chalk.yellow('○')} ${chalk.bold(provider.displayName)} - ${authMethod}`);
57
+ console.log(chalk.dim(` Run: ralph-starter auth ${name}`));
58
+ }
59
+ else if (provider.supportsPKCE && !isConfigured) {
60
+ // PKCE provider but no client_id - needs env var
61
+ console.log(` ${chalk.dim('○')} ${chalk.bold(provider.displayName)} - ${authMethod} (not configured)`);
62
+ console.log(chalk.dim(` Set RALPH_${name.toUpperCase()}_CLIENT_ID env var`));
63
+ }
64
+ else {
65
+ // Non-PKCE provider - manual API key only
66
+ console.log(` ${chalk.dim('○')} ${chalk.bold(provider.displayName)} - ${authMethod}`);
67
+ console.log(chalk.dim(` Run: ralph-starter config set ${name}.apiKey <your-key>`));
68
+ console.log(chalk.dim(` Get key: ${getApiKeyUrl(name)}`));
69
+ }
70
+ }
71
+ console.log();
72
+ }
73
+ /**
74
+ * Logout from a service (remove credentials)
75
+ */
76
+ async function logoutService(service) {
77
+ const provider = getProvider(service);
78
+ if (!provider) {
79
+ console.error(chalk.red(`Unknown service: ${service}`));
80
+ console.error(chalk.dim(`\nAvailable services: ${getProviderNames().join(', ')}`));
81
+ process.exit(1);
82
+ }
83
+ // Delete token and apiKey
84
+ const deletedToken = deleteSourceCredential(service, 'token');
85
+ const deletedApiKey = deleteSourceCredential(service, 'apiKey');
86
+ if (deletedToken || deletedApiKey) {
87
+ console.log(chalk.green(`✓ Logged out from ${provider.displayName}`));
88
+ }
89
+ else {
90
+ console.log(chalk.yellow(`No credentials found for ${provider.displayName}`));
91
+ }
92
+ }
93
+ /**
94
+ * Start the OAuth flow for a service
95
+ */
96
+ async function startOAuthFlow(service) {
97
+ const provider = getProvider(service);
98
+ if (!provider) {
99
+ console.error(chalk.red(`Unknown service: ${service}`));
100
+ console.error(chalk.dim(`\nAvailable services: ${getProviderNames().join(', ')}`));
101
+ process.exit(1);
102
+ }
103
+ // Check if this provider supports browser OAuth
104
+ if (!provider.supportsPKCE) {
105
+ console.log(chalk.yellow(`\n${provider.displayName} doesn't support browser OAuth.`));
106
+ console.log(chalk.dim('\nUse manual API key configuration instead:'));
107
+ console.log(chalk.cyan(` ralph-starter config set ${service}.apiKey <your-api-key>`));
108
+ console.log(chalk.dim(`\nGet your API key from: ${getApiKeyUrl(service)}`));
109
+ return;
110
+ }
111
+ // Check if OAuth is configured for this provider
112
+ if (!checkProviderConfigured(provider)) {
113
+ console.error(chalk.red(`OAuth not configured for ${provider.displayName}`));
114
+ console.error(chalk.dim('\nTo enable browser OAuth, set this environment variable:'));
115
+ console.error(chalk.cyan(` RALPH_${service.toUpperCase()}_CLIENT_ID=<your-client-id>`));
116
+ console.error(chalk.dim('\nOr use manual API key configuration:'));
117
+ console.error(chalk.cyan(` ralph-starter config set ${service}.apiKey <your-api-key>`));
118
+ console.error(chalk.dim(`\nGet API keys from: ${getApiKeyUrl(service)}`));
119
+ process.exit(1);
120
+ }
121
+ console.log();
122
+ console.log(chalk.bold(`Authenticating with ${provider.displayName}...`));
123
+ // Get a random port for the callback server
124
+ const port = getRandomPort();
125
+ const redirectUri = getCallbackUrl(port);
126
+ // Generate state for CSRF protection
127
+ const state = crypto.randomBytes(16).toString('hex');
128
+ // Generate PKCE challenge
129
+ const pkce = generatePKCE();
130
+ // Build authorization URL with PKCE
131
+ const authUrl = provider.buildAuthUrl(redirectUri, state, pkce.challenge);
132
+ console.log(chalk.dim(`Opening browser for authorization...`));
133
+ console.log(chalk.dim(`Using PKCE for secure authentication`));
134
+ console.log();
135
+ // Start the callback server
136
+ const serverPromise = startOAuthServer({
137
+ port,
138
+ timeoutMs: 5 * 60 * 1000, // 5 minutes
139
+ });
140
+ // Open browser to authorization URL
141
+ try {
142
+ await openBrowser(authUrl);
143
+ }
144
+ catch (_error) {
145
+ console.log(chalk.yellow('Could not open browser automatically.'));
146
+ console.log(chalk.dim('Please open this URL manually:'));
147
+ console.log();
148
+ console.log(chalk.cyan(authUrl));
149
+ console.log();
150
+ }
151
+ // Wait for callback
152
+ const spinner = ora('Waiting for authorization...').start();
153
+ try {
154
+ const result = await serverPromise;
155
+ // Verify state
156
+ if (result.state !== state) {
157
+ spinner.fail('State mismatch - possible CSRF attack');
158
+ process.exit(1);
159
+ }
160
+ spinner.text = 'Exchanging code for token...';
161
+ // Exchange code for token with PKCE verifier
162
+ const tokens = await provider.exchangeCode(result.code, redirectUri, pkce.verifier);
163
+ // Save the token
164
+ setSourceCredential(service, 'token', tokens.accessToken);
165
+ if (tokens.refreshToken) {
166
+ setSourceCredential(service, 'refreshToken', tokens.refreshToken);
167
+ }
168
+ spinner.succeed(chalk.green(`Successfully authenticated with ${provider.displayName}!`));
169
+ console.log();
170
+ console.log(chalk.dim('You can now use this integration:'));
171
+ console.log(chalk.cyan(` ralph-starter run --from ${service} --project <id>`));
172
+ console.log();
173
+ }
174
+ catch (error) {
175
+ spinner.fail(chalk.red('Authentication failed'));
176
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
177
+ console.error(chalk.dim(errorMessage));
178
+ process.exit(1);
179
+ }
180
+ }
181
+ /**
182
+ * Check if a provider has OAuth configured
183
+ */
184
+ function checkProviderConfigured(provider) {
185
+ const p = provider;
186
+ return p.isConfigured?.() ?? !!(provider.clientId && provider.clientSecret);
187
+ }
188
+ /**
189
+ * Get the URL where users can get API keys for a service
190
+ */
191
+ function getApiKeyUrl(service) {
192
+ const urls = {
193
+ notion: 'https://www.notion.so/my-integrations',
194
+ linear: 'https://linear.app/settings/api',
195
+ todoist: 'https://todoist.com/prefs/integrations',
196
+ github: 'https://github.com/settings/tokens',
197
+ };
198
+ return urls[service] || "the service's developer settings";
199
+ }
200
+ /**
201
+ * Show auth command help
202
+ */
203
+ function showAuthHelp() {
204
+ console.log(`
205
+ ${chalk.bold('ralph-starter auth')} - Authentication for integrations
206
+
207
+ ${chalk.bold('Usage:')}
208
+ ralph-starter auth <service> Start OAuth flow (for supported services)
209
+ ralph-starter auth --list Show authentication status
210
+ ralph-starter auth --logout <service> Remove credentials for a service
211
+
212
+ ${chalk.bold('Services:')}
213
+ ${chalk.green('linear')} - Browser OAuth (PKCE) - just run: ralph-starter auth linear
214
+ ${chalk.yellow('notion')} - Manual API key required
215
+ ${chalk.yellow('todoist')} - Manual API key required
216
+
217
+ ${chalk.bold('Examples:')}
218
+ ${chalk.dim('# Linear - browser OAuth (seamless!)')}
219
+ ralph-starter auth linear
220
+
221
+ ${chalk.dim('# Notion/Todoist - manual API key')}
222
+ ralph-starter config set notion.apiKey <your-key>
223
+ ralph-starter config set todoist.apiKey <your-key>
224
+
225
+ ${chalk.dim('# Check status')}
226
+ ralph-starter auth --list
227
+
228
+ ${chalk.bold('Browser OAuth Setup (Linear):')}
229
+ Linear supports PKCE, so you just need a client ID:
230
+ RALPH_LINEAR_CLIENT_ID=<client-id>
231
+
232
+ Get it from: https://linear.app/settings/api/applications
233
+
234
+ ${chalk.bold('Manual API Keys (Notion, Todoist):')}
235
+ These services require manual API key configuration:
236
+
237
+ ${chalk.dim('Notion:')} https://www.notion.so/my-integrations
238
+ ${chalk.dim('Todoist:')} https://todoist.com/prefs/integrations
239
+
240
+ Then run: ralph-starter config set <service>.apiKey <key>
241
+ `);
242
+ }
243
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Check command for ralph-starter
3
+ * Verifies configuration and tests LLM connection
4
+ */
5
+ export interface CheckCommandOptions {
6
+ verbose?: boolean;
7
+ }
8
+ /**
9
+ * Run the check command
10
+ */
11
+ export declare function checkCommand(options: CheckCommandOptions): Promise<void>;
12
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAYD;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+G9E"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Check command for ralph-starter
3
+ * Verifies configuration and tests LLM connection
4
+ */
5
+ import chalk from 'chalk';
6
+ import ora from 'ora';
7
+ import { getConfiguredLLM, readConfig } from '../config/manager.js';
8
+ import { PROVIDERS } from '../llm/index.js';
9
+ import { isClaudeCodeAvailable, testClaudeCodeConnection } from '../setup/agent-detector.js';
10
+ import { testApiConnection } from '../setup/llm-tester.js';
11
+ /**
12
+ * Mask an API key for display
13
+ */
14
+ function maskKey(key) {
15
+ if (key.length <= 8) {
16
+ return '*'.repeat(key.length);
17
+ }
18
+ return key.slice(0, 4) + '*'.repeat(key.length - 8) + key.slice(-4);
19
+ }
20
+ /**
21
+ * Run the check command
22
+ */
23
+ export async function checkCommand(options) {
24
+ console.log();
25
+ console.log(chalk.bold('Checking ralph-starter configuration...'));
26
+ console.log();
27
+ const _config = readConfig();
28
+ let hasLLM = false;
29
+ let usesClaudeCode = false;
30
+ // Step 1: Check for Claude Code CLI (highest priority)
31
+ console.log(chalk.dim(' Detecting LLM...'));
32
+ const claudeCheck = await isClaudeCodeAvailable();
33
+ if (claudeCheck.available) {
34
+ const version = claudeCheck.version ? `v${claudeCheck.version}` : '';
35
+ console.log(chalk.green(` ✓ Claude Code CLI found ${version}`));
36
+ if (options.verbose && claudeCheck.executablePath) {
37
+ console.log(chalk.dim(` Path: ${claudeCheck.executablePath}`));
38
+ }
39
+ hasLLM = true;
40
+ usesClaudeCode = true;
41
+ }
42
+ else {
43
+ console.log(chalk.dim(' ✗ Claude Code CLI not found'));
44
+ }
45
+ // Step 2: Check for API key configuration
46
+ const llmConfig = getConfiguredLLM();
47
+ if (llmConfig) {
48
+ const providerName = PROVIDERS[llmConfig.provider].displayName;
49
+ // Determine source of key
50
+ const envVar = PROVIDERS[llmConfig.provider].envVar;
51
+ const fromEnv = process.env[envVar] === llmConfig.apiKey;
52
+ const source = fromEnv ? 'environment' : 'config file';
53
+ console.log(chalk.green(` ✓ API Key configured (${providerName})`));
54
+ console.log(chalk.dim(` Key: ${maskKey(llmConfig.apiKey)} (from ${source})`));
55
+ hasLLM = true;
56
+ }
57
+ else if (!usesClaudeCode) {
58
+ console.log(chalk.yellow(' ✗ No API key configured'));
59
+ }
60
+ // Step 3: Test connection
61
+ if (!hasLLM) {
62
+ console.log();
63
+ console.log(chalk.red(' No LLM available!'));
64
+ console.log();
65
+ console.log(chalk.bold(' To get started, either:'));
66
+ console.log(chalk.dim(' 1. Install Claude Code: https://claude.ai/code'));
67
+ console.log(chalk.dim(' 2. Run setup wizard: ralph-starter setup'));
68
+ console.log(chalk.dim(' 3. Set API key: export ANTHROPIC_API_KEY=your-key'));
69
+ console.log();
70
+ process.exit(1);
71
+ }
72
+ console.log();
73
+ const spinner = ora('Testing connection...').start();
74
+ let testResult;
75
+ if (usesClaudeCode) {
76
+ // Test Claude Code connection
77
+ const result = await testClaudeCodeConnection();
78
+ testResult = {
79
+ success: result.success,
80
+ responseTime: result.responseTime,
81
+ error: result.error,
82
+ provider: 'Claude Code CLI',
83
+ };
84
+ }
85
+ else if (llmConfig) {
86
+ // Test API connection
87
+ const result = await testApiConnection(llmConfig.provider, llmConfig.apiKey);
88
+ testResult = {
89
+ success: result.success,
90
+ responseTime: result.responseTime,
91
+ error: result.error,
92
+ provider: PROVIDERS[llmConfig.provider].displayName,
93
+ };
94
+ }
95
+ if (testResult?.success) {
96
+ const time = testResult.responseTime ? ` (${testResult.responseTime}ms)` : '';
97
+ spinner.succeed(`Response received${time}`);
98
+ }
99
+ else {
100
+ spinner.fail(`Connection failed: ${testResult?.error || 'Unknown error'}`);
101
+ console.log();
102
+ console.log(chalk.yellow(' The connection test failed. This could mean:'));
103
+ console.log(chalk.dim(' • API key is invalid or expired'));
104
+ console.log(chalk.dim(' • Network connectivity issues'));
105
+ console.log(chalk.dim(' • Claude Code is not authenticated'));
106
+ console.log();
107
+ console.log(chalk.dim(' Try running: ralph-starter setup'));
108
+ console.log();
109
+ process.exit(1);
110
+ }
111
+ // Summary
112
+ console.log();
113
+ console.log(`${chalk.green.bold(' All checks passed!')} You're ready to go.`);
114
+ console.log();
115
+ const usingProvider = usesClaudeCode
116
+ ? 'Claude Code CLI (no API key needed)'
117
+ : llmConfig?.provider
118
+ ? `${PROVIDERS[llmConfig.provider].displayName} API`
119
+ : 'Unknown provider';
120
+ console.log(chalk.dim(` Using: ${usingProvider}`));
121
+ console.log(chalk.dim(" Run 'ralph-starter' to launch the wizard."));
122
+ console.log();
123
+ }
124
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAC7F,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAM3D;;GAEG;AACH,SAAS,OAAO,CAAC,GAAW;IAC1B,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACpB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACtE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAA4B;IAC7D,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,cAAc,GAAG,KAAK,CAAC;IAE3B,uDAAuD;IACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAE7C,MAAM,WAAW,GAAG,MAAM,qBAAqB,EAAE,CAAC;IAElD,IAAI,WAAW,CAAC,SAAS,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,6BAA6B,OAAO,EAAE,CAAC,CAAC,CAAC;QACjE,IAAI,OAAO,CAAC,OAAO,IAAI,WAAW,CAAC,cAAc,EAAE,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,WAAW,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;QACpE,CAAC;QACD,MAAM,GAAG,IAAI,CAAC;QACd,cAAc,GAAG,IAAI,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,0CAA0C;IAC1C,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAC;IAErC,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,YAAY,GAAG,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC;QAE/D,0BAA0B;QAC1B,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;QACpD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,MAAM,CAAC;QACzD,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC;QAEvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,2BAA2B,YAAY,GAAG,CAAC,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,MAAM,GAAG,CAAC,CAAC,CAAC;QACjF,MAAM,GAAG,IAAI,CAAC;IAChB,CAAC;SAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,0BAA0B;IAC1B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC,CAAC;QAChF,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,MAAM,OAAO,GAAG,GAAG,CAAC,uBAAuB,CAAC,CAAC,KAAK,EAAE,CAAC;IAErD,IAAI,UAAU,CAAC;IACf,IAAI,cAAc,EAAE,CAAC;QACnB,8BAA8B;QAC9B,MAAM,MAAM,GAAG,MAAM,wBAAwB,EAAE,CAAC;QAChD,UAAU,GAAG;YACX,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,QAAQ,EAAE,iBAA0B;SACrC,CAAC;IACJ,CAAC;SAAM,IAAI,SAAS,EAAE,CAAC;QACrB,sBAAsB;QACtB,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QAC7E,UAAU,GAAG;YACX,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,QAAQ,EAAE,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,WAAW;SACpD,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,EAAE,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9E,OAAO,CAAC,OAAO,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC,sBAAsB,UAAU,EAAE,KAAK,IAAI,eAAe,EAAE,CAAC,CAAC;QAC3E,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gDAAgD,CAAC,CAAC,CAAC;QAC5E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,UAAU;IACV,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,sBAAsB,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,MAAM,aAAa,GAAG,cAAc;QAClC,CAAC,CAAC,qCAAqC;QACvC,CAAC,CAAC,SAAS,EAAE,QAAQ;YACnB,CAAC,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,WAAW,MAAM;YACpD,CAAC,CAAC,kBAAkB,CAAC;IAEzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,aAAa,EAAE,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
@@ -0,0 +1,13 @@
1
+ export type ConfigCommandOptions = {};
2
+ /**
3
+ * Config command - manage source credentials and settings
4
+ *
5
+ * Usage:
6
+ * ralph-starter config list - List all configured sources
7
+ * ralph-starter config get <source> - Show config for a source
8
+ * ralph-starter config set <source>.<key> <value> - Set a config value
9
+ * ralph-starter config delete <source>.<key> - Delete a config value
10
+ * ralph-starter config delete <source> - Delete all config for a source
11
+ */
12
+ export declare function configCommand(action: string, args: string[], _options?: ConfigCommandOptions): Promise<void>;
13
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAoBA,MAAM,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEtC;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAAE,EACd,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAmEf"}