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,227 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import chalk from 'chalk';
5
+ import inquirer from 'inquirer';
6
+ import { detectProviderFromEnv, getProviderKeyFromEnv, PROVIDER_NAMES, PROVIDERS, } from '../llm/index.js';
7
+ const CONFIG_DIR = join(homedir(), '.ralph-starter');
8
+ const CONFIG_FILE = join(CONFIG_DIR, 'config.json');
9
+ export function ensureConfigDir() {
10
+ if (!existsSync(CONFIG_DIR)) {
11
+ mkdirSync(CONFIG_DIR, { recursive: true });
12
+ }
13
+ }
14
+ export function readConfig() {
15
+ ensureConfigDir();
16
+ if (!existsSync(CONFIG_FILE)) {
17
+ return {};
18
+ }
19
+ try {
20
+ const content = readFileSync(CONFIG_FILE, 'utf-8');
21
+ return JSON.parse(content);
22
+ }
23
+ catch {
24
+ return {};
25
+ }
26
+ }
27
+ export function writeConfig(config) {
28
+ ensureConfigDir();
29
+ writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));
30
+ }
31
+ export async function getApiKey() {
32
+ // 1. Check CLI flag (handled by caller)
33
+ // 2. Check environment variable
34
+ if (process.env.ANTHROPIC_API_KEY) {
35
+ return process.env.ANTHROPIC_API_KEY;
36
+ }
37
+ // 3. Check config file
38
+ const config = readConfig();
39
+ if (config.apiKey) {
40
+ return config.apiKey;
41
+ }
42
+ // 4. Prompt user
43
+ return promptForApiKey();
44
+ }
45
+ export async function promptForApiKey() {
46
+ console.log();
47
+ console.log(chalk.yellow('No API key found.'));
48
+ console.log(chalk.dim('You can get one at: https://console.anthropic.com/'));
49
+ console.log();
50
+ const { apiKey } = await inquirer.prompt([
51
+ {
52
+ type: 'password',
53
+ name: 'apiKey',
54
+ message: 'Enter your Anthropic API key:',
55
+ mask: '*',
56
+ },
57
+ ]);
58
+ if (!apiKey) {
59
+ return null;
60
+ }
61
+ const { save } = await inquirer.prompt([
62
+ {
63
+ type: 'confirm',
64
+ name: 'save',
65
+ message: 'Save this API key for future use?',
66
+ default: true,
67
+ },
68
+ ]);
69
+ if (save) {
70
+ const config = readConfig();
71
+ config.apiKey = apiKey;
72
+ writeConfig(config);
73
+ console.log(chalk.green(`API key saved to ${CONFIG_FILE}`));
74
+ }
75
+ return apiKey;
76
+ }
77
+ export async function isClaudeCliInstalled() {
78
+ try {
79
+ const { execa } = await import('execa');
80
+ await execa('claude', ['--version']);
81
+ return true;
82
+ }
83
+ catch {
84
+ return false;
85
+ }
86
+ }
87
+ /**
88
+ * Get the configured LLM provider
89
+ * Priority: config file > auto-detect from env > default (anthropic)
90
+ */
91
+ export function getLLMProvider() {
92
+ const config = readConfig();
93
+ // Check explicit config
94
+ if (config.llm?.provider) {
95
+ return config.llm.provider;
96
+ }
97
+ // Auto-detect from environment
98
+ const detected = detectProviderFromEnv();
99
+ if (detected) {
100
+ return detected;
101
+ }
102
+ // Default to anthropic
103
+ return 'anthropic';
104
+ }
105
+ /**
106
+ * Get API key for a specific provider
107
+ * Priority: env var > config file providers.X.apiKey > legacy apiKey (for anthropic)
108
+ */
109
+ export function getLLMApiKey(provider) {
110
+ // Check environment variable first
111
+ const envKey = getProviderKeyFromEnv(provider);
112
+ if (envKey) {
113
+ return envKey;
114
+ }
115
+ // Check config file
116
+ const config = readConfig();
117
+ // Check new providers.X.apiKey format
118
+ const providerKey = config.providers?.[provider]?.apiKey;
119
+ if (providerKey) {
120
+ return providerKey;
121
+ }
122
+ // Legacy: check apiKey for anthropic
123
+ if (provider === 'anthropic' && config.apiKey) {
124
+ return config.apiKey;
125
+ }
126
+ return null;
127
+ }
128
+ /**
129
+ * Get API key silently (no prompt) - for wizard use
130
+ * Returns provider and key, or null if none available
131
+ */
132
+ export function getConfiguredLLM() {
133
+ // Try configured provider first
134
+ const config = readConfig();
135
+ if (config.llm?.provider) {
136
+ const key = getLLMApiKey(config.llm.provider);
137
+ if (key) {
138
+ return { provider: config.llm.provider, apiKey: key };
139
+ }
140
+ }
141
+ // Auto-detect from environment
142
+ for (const provider of PROVIDER_NAMES) {
143
+ const key = getLLMApiKey(provider);
144
+ if (key) {
145
+ return { provider, apiKey: key };
146
+ }
147
+ }
148
+ return null;
149
+ }
150
+ /**
151
+ * Set LLM provider in config
152
+ */
153
+ export function setLLMProvider(provider) {
154
+ const config = readConfig();
155
+ config.llm = { ...config.llm, provider };
156
+ writeConfig(config);
157
+ }
158
+ /**
159
+ * Set API key for a provider
160
+ */
161
+ export function setLLMApiKey(provider, apiKey) {
162
+ const config = readConfig();
163
+ if (!config.providers) {
164
+ config.providers = {};
165
+ }
166
+ config.providers[provider] = { apiKey };
167
+ writeConfig(config);
168
+ }
169
+ /**
170
+ * Get configured model for LLM
171
+ */
172
+ export function getLLMModel() {
173
+ const config = readConfig();
174
+ return config.llm?.model || config.defaultModel || null;
175
+ }
176
+ /**
177
+ * Interactive prompt for LLM provider selection and API key
178
+ */
179
+ export async function promptForLLMSetup() {
180
+ console.log();
181
+ console.log(chalk.yellow('No LLM API key configured.'));
182
+ console.log();
183
+ // Provider selection
184
+ const { provider } = await inquirer.prompt([
185
+ {
186
+ type: 'list',
187
+ name: 'provider',
188
+ message: 'Choose your LLM provider:',
189
+ choices: PROVIDER_NAMES.map((p) => ({
190
+ name: PROVIDERS[p].displayName,
191
+ value: p,
192
+ })),
193
+ },
194
+ ]);
195
+ const providerConfig = PROVIDERS[provider];
196
+ console.log();
197
+ console.log(chalk.dim(`Get your API key at: ${providerConfig.consoleUrl}`));
198
+ console.log();
199
+ // API key input
200
+ const { apiKey } = await inquirer.prompt([
201
+ {
202
+ type: 'password',
203
+ name: 'apiKey',
204
+ message: `Enter your ${providerConfig.displayName} API key:`,
205
+ mask: '*',
206
+ },
207
+ ]);
208
+ if (!apiKey) {
209
+ return null;
210
+ }
211
+ // Save option
212
+ const { save } = await inquirer.prompt([
213
+ {
214
+ type: 'confirm',
215
+ name: 'save',
216
+ message: 'Save this configuration for future use?',
217
+ default: true,
218
+ },
219
+ ]);
220
+ if (save) {
221
+ setLLMProvider(provider);
222
+ setLLMApiKey(provider, apiKey);
223
+ console.log(chalk.green(`Configuration saved to ${CONFIG_FILE}`));
224
+ }
225
+ return { provider: provider, apiKey };
226
+ }
227
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export declare const version = "0.1.0";
2
+ export declare const name = "ralph-starter";
3
+ export { createPullRequest, gitCommit, gitPush, isGitRepo } from './automation/git.js';
4
+ export { configCommand } from './commands/config.js';
5
+ export { initCommand } from './commands/init.js';
6
+ export { planCommand } from './commands/plan.js';
7
+ export { runCommand } from './commands/run.js';
8
+ export { skillCommand } from './commands/skill.js';
9
+ export { sourceCommand } from './commands/source.js';
10
+ export { getApiKey, readConfig, writeConfig } from './config/manager.js';
11
+ export type { Agent, AgentType } from './loop/agents.js';
12
+ export { detectAvailableAgents, detectBestAgent } from './loop/agents.js';
13
+ export { runLoop } from './loop/executor.js';
14
+ export { detectValidationCommands, runAllValidations, runValidation } from './loop/validation.js';
15
+ export type { InitCoreOptions, InitCoreResult } from './mcp/core/init.js';
16
+ export { initCore } from './mcp/core/init.js';
17
+ export type { PlanCoreOptions, PlanCoreResult } from './mcp/core/plan.js';
18
+ export { planCore } from './mcp/core/plan.js';
19
+ export type { RunCoreOptions, RunCoreResult } from './mcp/core/run.js';
20
+ export { runCore } from './mcp/core/run.js';
21
+ export { createMcpServer, startMcpServer } from './mcp/server.js';
22
+ export { detectSource, fetchFromSource, getAllSources, getSource, getSourceHelp, getSourcesInfo, testSource, } from './sources/index.js';
23
+ export type { InputSource, SourceInfo, SourceOptions, SourceResult } from './sources/types.js';
24
+ export { runIdeaMode, runWizard } from './wizard/index.js';
25
+ export type { IdeaContext, IdeaDiscoveryMethod, IdeaSuggestion } from './wizard/types.js';
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,OAAO,UAAU,CAAC;AAC/B,eAAO,MAAM,IAAI,kBAAkB,CAAC;AAGpC,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACzE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAE1E,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAClG,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAElE,OAAO,EACL,YAAY,EACZ,eAAe,EACf,aAAa,EACb,SAAS,EACT,aAAa,EACb,cAAc,EACd,UAAU,GACX,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE/F,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/index.js CHANGED
@@ -1,3 +1,28 @@
1
- // ralph-starter - AI-powered project scaffolder for Claude Code loops
2
- export const version = '0.0.1';
1
+ // ralph-starter - Ralph Wiggum made easy
2
+ export const version = '0.1.0';
3
3
  export const name = 'ralph-starter';
4
+ // Automation
5
+ export { createPullRequest, gitCommit, gitPush, isGitRepo } from './automation/git.js';
6
+ export { configCommand } from './commands/config.js';
7
+ export { initCommand } from './commands/init.js';
8
+ export { planCommand } from './commands/plan.js';
9
+ // Commands
10
+ export { runCommand } from './commands/run.js';
11
+ export { skillCommand } from './commands/skill.js';
12
+ export { sourceCommand } from './commands/source.js';
13
+ // Config
14
+ export { getApiKey, readConfig, writeConfig } from './config/manager.js';
15
+ export { detectAvailableAgents, detectBestAgent } from './loop/agents.js';
16
+ // Loop
17
+ export { runLoop } from './loop/executor.js';
18
+ export { detectValidationCommands, runAllValidations, runValidation } from './loop/validation.js';
19
+ export { initCore } from './mcp/core/init.js';
20
+ export { planCore } from './mcp/core/plan.js';
21
+ export { runCore } from './mcp/core/run.js';
22
+ // MCP
23
+ export { createMcpServer, startMcpServer } from './mcp/server.js';
24
+ // Sources
25
+ export { detectSource, fetchFromSource, getAllSources, getSource, getSourceHelp, getSourcesInfo, testSource, } from './sources/index.js';
26
+ // Wizard
27
+ export { runIdeaMode, runWizard } from './wizard/index.js';
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAC/B,MAAM,CAAC,MAAM,IAAI,GAAG,eAAe,CAAC;AAEpC,aAAa;AACb,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,WAAW;AACX,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,SAAS;AACT,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEzE,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO;AACP,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAElG,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,MAAM;AACN,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAClE,UAAU;AACV,OAAO,EACL,YAAY,EACZ,eAAe,EACf,aAAa,EACb,SAAS,EACT,aAAa,EACb,cAAc,EACd,UAAU,GACX,MAAM,oBAAoB,CAAC;AAE5B,SAAS;AACT,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Template OAuth Provider (Optional)
3
+ *
4
+ * Only needed if your integration uses OAuth authentication.
5
+ * Delete this file if using API key or CLI authentication.
6
+ *
7
+ * To set up OAuth:
8
+ * 1. Register an OAuth app with the service
9
+ * 2. Get Client ID (and Client Secret if not using PKCE)
10
+ * 3. Configure redirect URI: http://127.0.0.1:52847/callback
11
+ */
12
+ import { BaseOAuthProvider } from '../../auth/providers/base.js';
13
+ export declare class TemplateOAuthProvider extends BaseOAuthProvider {
14
+ name: string;
15
+ displayName: string;
16
+ authorizationUrl: string;
17
+ tokenUrl: string;
18
+ scopes: string[];
19
+ clientId: string;
20
+ clientSecret: string | undefined;
21
+ supportsPKCE: boolean;
22
+ authParams: {};
23
+ /**
24
+ * Check if OAuth is configured
25
+ */
26
+ isConfigured(): boolean;
27
+ }
28
+ export declare const templateProvider: TemplateOAuthProvider;
29
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/integrations/_template/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEjE,qBAAa,qBAAsB,SAAQ,iBAAiB;IAC1D,IAAI,SAAc;IAClB,WAAW,SAAsB;IAGjC,gBAAgB,SAAyC;IACzD,QAAQ,SAAyC;IAGjD,MAAM,WAAY;IAGlB,QAAQ,SAA8C;IAGtD,YAAY,qBAA4C;IAGxD,YAAY,UAAS;IAGrB,UAAU,KAER;IAEF;;OAEG;IACH,YAAY,IAAI,OAAO;CAMxB;AAED,eAAO,MAAM,gBAAgB,uBAA8B,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Template OAuth Provider (Optional)
3
+ *
4
+ * Only needed if your integration uses OAuth authentication.
5
+ * Delete this file if using API key or CLI authentication.
6
+ *
7
+ * To set up OAuth:
8
+ * 1. Register an OAuth app with the service
9
+ * 2. Get Client ID (and Client Secret if not using PKCE)
10
+ * 3. Configure redirect URI: http://127.0.0.1:52847/callback
11
+ */
12
+ import { BaseOAuthProvider } from '../../auth/providers/base.js';
13
+ export class TemplateOAuthProvider extends BaseOAuthProvider {
14
+ name = 'template';
15
+ displayName = 'Template Service';
16
+ // OAuth endpoints - update for your service
17
+ authorizationUrl = 'https://example.com/oauth/authorize';
18
+ tokenUrl = 'https://api.example.com/oauth/token';
19
+ // Required scopes
20
+ scopes = ['read'];
21
+ // Client ID from environment variable
22
+ clientId = process.env.RALPH_TEMPLATE_CLIENT_ID || '';
23
+ // Client secret (optional if using PKCE)
24
+ clientSecret = process.env.RALPH_TEMPLATE_CLIENT_SECRET;
25
+ // Set to true if the service supports PKCE (no client secret needed)
26
+ supportsPKCE = false;
27
+ // Additional auth URL parameters (optional)
28
+ authParams = {
29
+ // prompt: 'consent',
30
+ };
31
+ /**
32
+ * Check if OAuth is configured
33
+ */
34
+ isConfigured() {
35
+ if (this.supportsPKCE) {
36
+ return !!this.clientId;
37
+ }
38
+ return !!this.clientId && !!this.clientSecret;
39
+ }
40
+ }
41
+ export const templateProvider = new TemplateOAuthProvider();
42
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/integrations/_template/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEjE,MAAM,OAAO,qBAAsB,SAAQ,iBAAiB;IAC1D,IAAI,GAAG,UAAU,CAAC;IAClB,WAAW,GAAG,kBAAkB,CAAC;IAEjC,4CAA4C;IAC5C,gBAAgB,GAAG,qCAAqC,CAAC;IACzD,QAAQ,GAAG,qCAAqC,CAAC;IAEjD,kBAAkB;IAClB,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC;IAElB,sCAAsC;IACtC,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,EAAE,CAAC;IAEtD,yCAAyC;IACzC,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC;IAExD,qEAAqE;IACrE,YAAY,GAAG,KAAK,CAAC;IAErB,4CAA4C;IAC5C,UAAU,GAAG;IACX,qBAAqB;KACtB,CAAC;IAEF;;OAEG;IACH,YAAY;QACV,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;QACzB,CAAC;QACD,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;IAChD,CAAC;CACF;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,qBAAqB,EAAE,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Template Integration
3
+ *
4
+ * Copy this folder and rename it to create a new integration.
5
+ * Replace all occurrences of "template" with your integration name.
6
+ */
7
+ export { TemplateIntegration } from './source.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/integrations/_template/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Template Integration
3
+ *
4
+ * Copy this folder and rename it to create a new integration.
5
+ * Replace all occurrences of "template" with your integration name.
6
+ */
7
+ export { TemplateIntegration } from './source.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/integrations/_template/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Template Integration Source
3
+ *
4
+ * This file contains the main data fetching logic.
5
+ * Rename this class and update all the properties.
6
+ */
7
+ import { type AuthMethod, BaseIntegration, type IntegrationOptions, type IntegrationResult } from '../base.js';
8
+ export declare class TemplateIntegration extends BaseIntegration {
9
+ name: string;
10
+ displayName: string;
11
+ description: string;
12
+ website: string;
13
+ authMethods: AuthMethod[];
14
+ /**
15
+ * Check if CLI tool is available and authenticated
16
+ * Only implement if authMethods includes 'cli'
17
+ */
18
+ protected isCliAvailable(): Promise<boolean>;
19
+ fetch(identifier: string, options?: IntegrationOptions): Promise<IntegrationResult>;
20
+ /**
21
+ * Fetch via CLI tool
22
+ */
23
+ private fetchViaCli;
24
+ /**
25
+ * Fetch via API
26
+ */
27
+ private fetchViaApi;
28
+ /**
29
+ * Format API results to markdown
30
+ */
31
+ private formatResults;
32
+ getHelp(): string;
33
+ }
34
+ //# sourceMappingURL=source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../../src/integrations/_template/source.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,KAAK,UAAU,EACf,eAAe,EACf,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACvB,MAAM,YAAY,CAAC;AAEpB,qBAAa,mBAAoB,SAAQ,eAAe;IAKtD,IAAI,SAAc;IAClB,WAAW,SAAsB;IACjC,WAAW,SAAsC;IACjD,OAAO,SAAyB;IAGhC,WAAW,EAAE,UAAU,EAAE,CAAe;IAMxC;;;OAGG;cACa,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAgB5C,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAkBzF;;OAEG;YACW,WAAW;IAazB;;OAEG;YACW,WAAW;IAyBzB;;OAEG;IACH,OAAO,CAAC,aAAa;IAqBrB,OAAO,IAAI,MAAM;CAoBlB"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Template Integration Source
3
+ *
4
+ * This file contains the main data fetching logic.
5
+ * Rename this class and update all the properties.
6
+ */
7
+ import { BaseIntegration, } from '../base.js';
8
+ export class TemplateIntegration extends BaseIntegration {
9
+ // ============================================
10
+ // Required properties - update these
11
+ // ============================================
12
+ name = 'template';
13
+ displayName = 'Template Service';
14
+ description = 'Fetch data from Template Service';
15
+ website = 'https://example.com';
16
+ // Supported auth methods: 'cli' | 'api-key' | 'oauth' | 'none'
17
+ authMethods = ['api-key'];
18
+ // ============================================
19
+ // Optional: CLI authentication
20
+ // ============================================
21
+ /**
22
+ * Check if CLI tool is available and authenticated
23
+ * Only implement if authMethods includes 'cli'
24
+ */
25
+ async isCliAvailable() {
26
+ // Example: Check if a CLI is installed and authenticated
27
+ // try {
28
+ // const { execa } = await import('execa');
29
+ // await execa('your-cli', ['auth', 'status']);
30
+ // return true;
31
+ // } catch {
32
+ // return false;
33
+ // }
34
+ return false;
35
+ }
36
+ // ============================================
37
+ // Main fetch method
38
+ // ============================================
39
+ async fetch(identifier, options) {
40
+ // Get authentication
41
+ const authMethod = await this.getConfiguredAuthMethod();
42
+ if (!authMethod) {
43
+ this.error('No authentication configured. Run: ralph-starter config set template.apiKey <key>');
44
+ }
45
+ // Fetch data based on auth method
46
+ if (authMethod === 'cli') {
47
+ return this.fetchViaCli(identifier, options);
48
+ }
49
+ return this.fetchViaApi(identifier, options);
50
+ }
51
+ /**
52
+ * Fetch via CLI tool
53
+ */
54
+ async fetchViaCli(_identifier, _options) {
55
+ // Example implementation:
56
+ // const { execa } = await import('execa');
57
+ // const result = await execa('your-cli', ['list', identifier, '--json']);
58
+ // const data = JSON.parse(result.stdout);
59
+ // return this.formatResults(data);
60
+ throw new Error('CLI fetch not implemented');
61
+ }
62
+ /**
63
+ * Fetch via API
64
+ */
65
+ async fetchViaApi(identifier, _options) {
66
+ const apiKey = await this.getApiKey();
67
+ // Example: Make API request
68
+ const response = await fetch(`https://api.example.com/data/${identifier}`, {
69
+ headers: {
70
+ Authorization: `Bearer ${apiKey}`,
71
+ Accept: 'application/json',
72
+ },
73
+ });
74
+ if (!response.ok) {
75
+ if (response.status === 401) {
76
+ this.error('Invalid API key. Run: ralph-starter config set template.apiKey <key>');
77
+ }
78
+ this.error(`API error: ${response.status} ${response.statusText}`);
79
+ }
80
+ const data = await response.json();
81
+ return this.formatResults(data, identifier);
82
+ }
83
+ /**
84
+ * Format API results to markdown
85
+ */
86
+ formatResults(data, identifier) {
87
+ const sections = [`# ${identifier}\n`];
88
+ // Format your data here
89
+ sections.push('*Add your formatting logic*');
90
+ return {
91
+ content: sections.join('\n'),
92
+ source: `template:${identifier}`,
93
+ title: identifier,
94
+ metadata: {
95
+ type: 'template',
96
+ count: data.length,
97
+ },
98
+ };
99
+ }
100
+ // ============================================
101
+ // Help text
102
+ // ============================================
103
+ getHelp() {
104
+ return `
105
+ template: Fetch data from Template Service
106
+
107
+ Usage:
108
+ ralph-starter run --from template --project "project-name"
109
+
110
+ Options:
111
+ --project Project name or identifier
112
+ --label Filter by label (optional)
113
+ --limit Maximum items to fetch (default: 20)
114
+
115
+ Setup:
116
+ 1. Get API key from: https://example.com/settings/api
117
+ 2. Run: ralph-starter config set template.apiKey <key>
118
+
119
+ Examples:
120
+ ralph-starter run --from template --project "my-project"
121
+ `.trim();
122
+ }
123
+ }
124
+ //# sourceMappingURL=source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source.js","sourceRoot":"","sources":["../../../src/integrations/_template/source.ts"],"names":[],"mappings":"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"}