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,158 @@
1
+ /**
2
+ * Unified Integration Interface
3
+ *
4
+ * Each integration lives in a single folder with:
5
+ * - index.ts - Main export
6
+ * - source.ts - Data fetching logic
7
+ * - auth.ts - Authentication (optional, if needed)
8
+ * - README.md - Documentation
9
+ */
10
+ /**
11
+ * Result from fetching integration data
12
+ */
13
+ export interface IntegrationResult {
14
+ /** The content in markdown format */
15
+ content: string;
16
+ /** Original source identifier */
17
+ source: string;
18
+ /** Optional title extracted from source */
19
+ title?: string;
20
+ /** Metadata about the fetch */
21
+ metadata?: Record<string, unknown>;
22
+ }
23
+ /**
24
+ * Options passed to integration fetch
25
+ */
26
+ export interface IntegrationOptions {
27
+ /** Project name/ID for filtering */
28
+ project?: string;
29
+ /** Label/tag filter */
30
+ label?: string;
31
+ /** Status filter (e.g., 'open', 'in_progress') */
32
+ status?: string;
33
+ /** Maximum items to fetch */
34
+ limit?: number;
35
+ /** Custom headers for HTTP requests */
36
+ headers?: Record<string, string>;
37
+ }
38
+ /**
39
+ * Authentication methods supported by integrations
40
+ */
41
+ export type AuthMethod = 'cli' | 'api-key' | 'oauth' | 'none';
42
+ /**
43
+ * Integration info for registry
44
+ */
45
+ export interface IntegrationInfo {
46
+ /** Unique identifier */
47
+ name: string;
48
+ /** Human-readable display name */
49
+ displayName: string;
50
+ /** Short description */
51
+ description: string;
52
+ /** Authentication methods supported */
53
+ authMethods: AuthMethod[];
54
+ /** Whether integration is available (auth configured) */
55
+ available: boolean;
56
+ /** Website URL for the service */
57
+ website: string;
58
+ }
59
+ /**
60
+ * Unified Integration Interface
61
+ * All integrations (github, linear, notion, etc.) implement this
62
+ */
63
+ export interface Integration {
64
+ /** Unique identifier (e.g., 'github', 'linear') */
65
+ name: string;
66
+ /** Human-readable display name */
67
+ displayName: string;
68
+ /** Short description */
69
+ description: string;
70
+ /** Website URL */
71
+ website: string;
72
+ /** Supported authentication methods */
73
+ authMethods: AuthMethod[];
74
+ /**
75
+ * Check if this integration is available
76
+ * Returns true if at least one auth method works
77
+ */
78
+ isAvailable(): Promise<boolean>;
79
+ /**
80
+ * Check which auth method is currently configured
81
+ * Returns null if none are configured
82
+ */
83
+ getConfiguredAuthMethod(): Promise<AuthMethod | null>;
84
+ /**
85
+ * Fetch data from this integration
86
+ * @param identifier - Integration-specific identifier (repo, project, URL, etc.)
87
+ * @param options - Additional options for the fetch
88
+ */
89
+ fetch(identifier: string, options?: IntegrationOptions): Promise<IntegrationResult>;
90
+ /**
91
+ * Get help text for using this integration
92
+ */
93
+ getHelp(): string;
94
+ /**
95
+ * Get info for registry display
96
+ */
97
+ getInfo(): Promise<IntegrationInfo>;
98
+ }
99
+ /**
100
+ * Base class for integrations
101
+ * Provides common functionality
102
+ */
103
+ export declare abstract class BaseIntegration implements Integration {
104
+ abstract name: string;
105
+ abstract displayName: string;
106
+ abstract description: string;
107
+ abstract website: string;
108
+ abstract authMethods: AuthMethod[];
109
+ /**
110
+ * Check if integration is available
111
+ * Override for custom availability checks
112
+ */
113
+ isAvailable(): Promise<boolean>;
114
+ /**
115
+ * Get which auth method is configured
116
+ * Override in subclasses for custom logic
117
+ */
118
+ getConfiguredAuthMethod(): Promise<AuthMethod | null>;
119
+ /**
120
+ * Fetch data - must be implemented by subclass
121
+ */
122
+ abstract fetch(identifier: string, options?: IntegrationOptions): Promise<IntegrationResult>;
123
+ /**
124
+ * Get help text
125
+ */
126
+ abstract getHelp(): string;
127
+ /**
128
+ * Get info for registry
129
+ */
130
+ getInfo(): Promise<IntegrationInfo>;
131
+ /**
132
+ * Check if CLI tool is available
133
+ * Override in subclasses that support CLI auth
134
+ */
135
+ protected isCliAvailable(): Promise<boolean>;
136
+ /**
137
+ * Check if API key is configured
138
+ */
139
+ protected hasApiKey(): Promise<boolean>;
140
+ /**
141
+ * Check if OAuth token is stored
142
+ */
143
+ protected hasOAuthToken(): Promise<boolean>;
144
+ /**
145
+ * Get credentials from config
146
+ */
147
+ protected getCredentials(): Promise<Record<string, string | undefined> | null>;
148
+ /**
149
+ * Get API key from credentials
150
+ * @param key - The credential key to get (default: 'apiKey')
151
+ */
152
+ protected getApiKey(key?: string): Promise<string>;
153
+ /**
154
+ * Create a standardized error message
155
+ */
156
+ protected error(message: string): never;
157
+ }
158
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/integrations/base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Unified Integration Interface
3
+ *
4
+ * Each integration lives in a single folder with:
5
+ * - index.ts - Main export
6
+ * - source.ts - Data fetching logic
7
+ * - auth.ts - Authentication (optional, if needed)
8
+ * - README.md - Documentation
9
+ */
10
+ import { getSourceCredentials } from '../sources/config.js';
11
+ /**
12
+ * Base class for integrations
13
+ * Provides common functionality
14
+ */
15
+ export class BaseIntegration {
16
+ /**
17
+ * Check if integration is available
18
+ * Override for custom availability checks
19
+ */
20
+ async isAvailable() {
21
+ const method = await this.getConfiguredAuthMethod();
22
+ return method !== null;
23
+ }
24
+ /**
25
+ * Get which auth method is configured
26
+ * Override in subclasses for custom logic
27
+ */
28
+ async getConfiguredAuthMethod() {
29
+ // Check CLI first if supported
30
+ if (this.authMethods.includes('cli') && (await this.isCliAvailable())) {
31
+ return 'cli';
32
+ }
33
+ // Check API key
34
+ if (this.authMethods.includes('api-key') && (await this.hasApiKey())) {
35
+ return 'api-key';
36
+ }
37
+ // Check OAuth token
38
+ if (this.authMethods.includes('oauth') && (await this.hasOAuthToken())) {
39
+ return 'oauth';
40
+ }
41
+ // No auth needed
42
+ if (this.authMethods.includes('none')) {
43
+ return 'none';
44
+ }
45
+ return null;
46
+ }
47
+ /**
48
+ * Get info for registry
49
+ */
50
+ async getInfo() {
51
+ return {
52
+ name: this.name,
53
+ displayName: this.displayName,
54
+ description: this.description,
55
+ authMethods: this.authMethods,
56
+ available: await this.isAvailable(),
57
+ website: this.website,
58
+ };
59
+ }
60
+ // ============================================
61
+ // Protected helpers for subclasses
62
+ // ============================================
63
+ /**
64
+ * Check if CLI tool is available
65
+ * Override in subclasses that support CLI auth
66
+ */
67
+ async isCliAvailable() {
68
+ return false;
69
+ }
70
+ /**
71
+ * Check if API key is configured
72
+ */
73
+ async hasApiKey() {
74
+ const creds = await this.getCredentials();
75
+ return !!(creds?.apiKey || creds?.token);
76
+ }
77
+ /**
78
+ * Check if OAuth token is stored
79
+ */
80
+ async hasOAuthToken() {
81
+ const creds = await this.getCredentials();
82
+ return !!creds?.accessToken;
83
+ }
84
+ /**
85
+ * Get credentials from config
86
+ */
87
+ async getCredentials() {
88
+ return getSourceCredentials(this.name);
89
+ }
90
+ /**
91
+ * Get API key from credentials
92
+ * @param key - The credential key to get (default: 'apiKey')
93
+ */
94
+ async getApiKey(key = 'apiKey') {
95
+ const creds = await this.getCredentials();
96
+ const value = creds?.[key] || creds?.token || creds?.apiKey;
97
+ if (!value) {
98
+ throw new Error(`[${this.name}] No ${key} configured. Run: ralph-starter config set ${this.name}.${key} <value>`);
99
+ }
100
+ return value;
101
+ }
102
+ /**
103
+ * Create a standardized error message
104
+ */
105
+ error(message) {
106
+ throw new Error(`[${this.name}] ${message}`);
107
+ }
108
+ }
109
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/integrations/base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * GitHub Integration
3
+ *
4
+ * Fetches issues, PRs, and files from GitHub repositories.
5
+ * Uses the `gh` CLI for authentication (recommended) or API token.
6
+ */
7
+ export { GitHubIntegration } from './source.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/integrations/github/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * GitHub Integration
3
+ *
4
+ * Fetches issues, PRs, and files from GitHub repositories.
5
+ * Uses the `gh` CLI for authentication (recommended) or API token.
6
+ */
7
+ export { GitHubIntegration } from './source.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/integrations/github/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * GitHub Integration Source
3
+ *
4
+ * Fetches issues from GitHub repositories.
5
+ * Uses the `gh` CLI for authentication (if available) or falls back to API token.
6
+ */
7
+ import { type AuthMethod, BaseIntegration, type IntegrationOptions, type IntegrationResult } from '../base.js';
8
+ export declare class GitHubIntegration extends BaseIntegration {
9
+ name: string;
10
+ displayName: string;
11
+ description: string;
12
+ website: string;
13
+ authMethods: AuthMethod[];
14
+ private ghCliAvailable;
15
+ /**
16
+ * Check if gh CLI is available and authenticated
17
+ */
18
+ protected isCliAvailable(): Promise<boolean>;
19
+ fetch(identifier: string, options?: IntegrationOptions): Promise<IntegrationResult>;
20
+ private parseRepoIdentifier;
21
+ private fetchViaCli;
22
+ private fetchViaApi;
23
+ private formatIssues;
24
+ getHelp(): string;
25
+ }
26
+ //# sourceMappingURL=source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../../src/integrations/github/source.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,KAAK,UAAU,EACf,eAAe,EACf,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACvB,MAAM,YAAY,CAAC;AAUpB,qBAAa,iBAAkB,SAAQ,eAAe;IACpD,IAAI,SAAY;IAChB,WAAW,SAAY;IACvB,WAAW,SAA2C;IACtD,OAAO,SAAwB;IAG/B,WAAW,EAAE,UAAU,EAAE,CAAsB;IAE/C,OAAO,CAAC,cAAc,CAAwB;IAE9C;;OAEG;cACa,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAgB5C,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAWzF,OAAO,CAAC,mBAAmB;YAkBb,WAAW;YAuCX,WAAW;IA0CzB,OAAO,CAAC,YAAY;IAgDpB,OAAO,IAAI,MAAM;CAgClB"}
@@ -0,0 +1,190 @@
1
+ /**
2
+ * GitHub Integration Source
3
+ *
4
+ * Fetches issues from GitHub repositories.
5
+ * Uses the `gh` CLI for authentication (if available) or falls back to API token.
6
+ */
7
+ import { BaseIntegration, } from '../base.js';
8
+ export class GitHubIntegration extends BaseIntegration {
9
+ name = 'github';
10
+ displayName = 'GitHub';
11
+ description = 'Fetch issues from GitHub repositories';
12
+ website = 'https://github.com';
13
+ // CLI is preferred, API token is fallback
14
+ authMethods = ['cli', 'api-key'];
15
+ ghCliAvailable = null;
16
+ /**
17
+ * Check if gh CLI is available and authenticated
18
+ */
19
+ async isCliAvailable() {
20
+ if (this.ghCliAvailable !== null) {
21
+ return this.ghCliAvailable;
22
+ }
23
+ try {
24
+ const { execa } = await import('execa');
25
+ await execa('gh', ['auth', 'status']);
26
+ this.ghCliAvailable = true;
27
+ return true;
28
+ }
29
+ catch {
30
+ this.ghCliAvailable = false;
31
+ return false;
32
+ }
33
+ }
34
+ async fetch(identifier, options) {
35
+ const { owner, repo } = this.parseRepoIdentifier(identifier);
36
+ // Prefer CLI if available
37
+ if (await this.isCliAvailable()) {
38
+ return this.fetchViaCli(owner, repo, options);
39
+ }
40
+ return this.fetchViaApi(owner, repo, options);
41
+ }
42
+ parseRepoIdentifier(identifier) {
43
+ // Handle full GitHub URLs
44
+ if (identifier.includes('github.com')) {
45
+ const match = identifier.match(/github\.com\/([^/]+)\/([^/]+)/);
46
+ if (match) {
47
+ return { owner: match[1], repo: match[2].replace(/\.git$/, '') };
48
+ }
49
+ }
50
+ // Handle owner/repo format
51
+ if (identifier.includes('/')) {
52
+ const [owner, repo] = identifier.split('/');
53
+ return { owner, repo };
54
+ }
55
+ this.error(`Invalid repository format: ${identifier}. Use owner/repo or GitHub URL.`);
56
+ }
57
+ async fetchViaCli(owner, repo, options) {
58
+ const { execa } = await import('execa');
59
+ const args = [
60
+ 'issue',
61
+ 'list',
62
+ '-R',
63
+ `${owner}/${repo}`,
64
+ '--json',
65
+ 'number,title,body,labels,state',
66
+ ];
67
+ // Add filters
68
+ if (options?.label) {
69
+ args.push('--label', options.label);
70
+ }
71
+ if (options?.status) {
72
+ args.push('--state', options.status);
73
+ }
74
+ else {
75
+ args.push('--state', 'open');
76
+ }
77
+ if (options?.limit) {
78
+ args.push('--limit', String(options.limit));
79
+ }
80
+ else {
81
+ args.push('--limit', '20');
82
+ }
83
+ const result = await execa('gh', args);
84
+ const issues = JSON.parse(result.stdout);
85
+ return this.formatIssues(issues, owner, repo);
86
+ }
87
+ async fetchViaApi(owner, repo, options) {
88
+ const token = await this.getApiKey('token');
89
+ let url = `https://api.github.com/repos/${owner}/${repo}/issues?`;
90
+ const params = new URLSearchParams();
91
+ params.set('state', options?.status || 'open');
92
+ params.set('per_page', String(options?.limit || 20));
93
+ if (options?.label) {
94
+ params.set('labels', options.label);
95
+ }
96
+ url += params.toString();
97
+ const response = await fetch(url, {
98
+ headers: {
99
+ Authorization: `Bearer ${token}`,
100
+ Accept: 'application/vnd.github+json',
101
+ 'X-GitHub-Api-Version': '2022-11-28',
102
+ 'User-Agent': 'ralph-starter/0.1.0',
103
+ },
104
+ });
105
+ if (!response.ok) {
106
+ if (response.status === 401) {
107
+ this.error('Invalid GitHub token. Run: ralph-starter config set github.token <value>');
108
+ }
109
+ if (response.status === 404) {
110
+ this.error(`Repository not found: ${owner}/${repo}`);
111
+ }
112
+ this.error(`GitHub API error: ${response.status} ${response.statusText}`);
113
+ }
114
+ const issues = (await response.json());
115
+ return this.formatIssues(issues, owner, repo);
116
+ }
117
+ formatIssues(issues, owner, repo) {
118
+ if (issues.length === 0) {
119
+ return {
120
+ content: `# ${owner}/${repo}\n\nNo issues found matching the criteria.`,
121
+ source: `github:${owner}/${repo}`,
122
+ title: `${owner}/${repo} Issues`,
123
+ metadata: { type: 'github', issues: 0 },
124
+ };
125
+ }
126
+ const sections = [`# ${owner}/${repo} Issues\n`];
127
+ for (const issue of issues) {
128
+ const labels = issue.labels
129
+ ?.map((l) => (typeof l === 'string' ? l : l.name))
130
+ .filter(Boolean)
131
+ .join(', ');
132
+ sections.push(`## #${issue.number}: ${issue.title}`);
133
+ if (labels) {
134
+ sections.push(`*Labels: ${labels}*`);
135
+ }
136
+ sections.push('');
137
+ if (issue.body) {
138
+ sections.push(issue.body);
139
+ }
140
+ else {
141
+ sections.push('*No description provided*');
142
+ }
143
+ sections.push('\n---\n');
144
+ }
145
+ return {
146
+ content: sections.join('\n'),
147
+ source: `github:${owner}/${repo}`,
148
+ title: `${owner}/${repo} Issues`,
149
+ metadata: {
150
+ type: 'github',
151
+ owner,
152
+ repo,
153
+ issues: issues.length,
154
+ },
155
+ };
156
+ }
157
+ getHelp() {
158
+ return `
159
+ github: Fetch issues from GitHub repositories
160
+
161
+ Usage:
162
+ ralph-starter run --from github --project owner/repo
163
+ ralph-starter run --from github --project owner/repo --label bug
164
+ ralph-starter run --from github --project https://github.com/owner/repo
165
+
166
+ Options:
167
+ --project Repository in owner/repo format or GitHub URL
168
+ --label Filter by label name
169
+ --status Issue state: open, closed, all (default: open)
170
+ --limit Maximum issues to fetch (default: 20)
171
+
172
+ Authentication:
173
+ Uses 'gh' CLI if available and authenticated (recommended)
174
+ Otherwise requires: ralph-starter config set github.token <token>
175
+
176
+ Setup with gh CLI (recommended):
177
+ 1. Install: https://cli.github.com/
178
+ 2. Run: gh auth login
179
+
180
+ Setup with token:
181
+ 1. Create token at: https://github.com/settings/tokens
182
+ 2. Run: ralph-starter config set github.token <token>
183
+
184
+ Examples:
185
+ ralph-starter run --from github --project facebook/react --label "good first issue"
186
+ ralph-starter run --from github --project my-org/my-repo --status all
187
+ `.trim();
188
+ }
189
+ }
190
+ //# sourceMappingURL=source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source.js","sourceRoot":"","sources":["../../../src/integrations/github/source.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Integrations Registry
3
+ *
4
+ * Central registry for all available integrations.
5
+ * Add new integrations here after creating them.
6
+ */
7
+ import type { Integration, IntegrationInfo } from './base.js';
8
+ export type { AuthMethod, Integration, IntegrationInfo, IntegrationOptions, IntegrationResult, } from './base.js';
9
+ export { BaseIntegration } from './base.js';
10
+ /**
11
+ * Get all registered integrations
12
+ */
13
+ export declare function getAllIntegrations(): Integration[];
14
+ /**
15
+ * Get an integration by name
16
+ */
17
+ export declare function getIntegration(name: string): Integration | undefined;
18
+ /**
19
+ * Get info for all integrations
20
+ */
21
+ export declare function getIntegrationsInfo(): Promise<IntegrationInfo[]>;
22
+ /**
23
+ * Get available integrations (those with auth configured)
24
+ */
25
+ export declare function getAvailableIntegrations(): Promise<Integration[]>;
26
+ /**
27
+ * Check if an integration is available
28
+ */
29
+ export declare function isIntegrationAvailable(name: string): Promise<boolean>;
30
+ /**
31
+ * Fetch from an integration by name
32
+ */
33
+ export declare function fetchFromIntegration(name: string, identifier: string, options?: Record<string, unknown>): Promise<ReturnType<Integration['fetch']>>;
34
+ export { GitHubIntegration } from './github/index.js';
35
+ export { LinearIntegration } from './linear/index.js';
36
+ export { NotionIntegration } from './notion/index.js';
37
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/integrations/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAQ9D,YAAY,EACV,UAAU,EACV,WAAW,EACX,eAAe,EACf,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAW5C;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,WAAW,EAAE,CAElD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAEpE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAEtE;AAED;;GAEG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CASvE;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAI3E;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAO3C;AAGD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Integrations Registry
3
+ *
4
+ * Central registry for all available integrations.
5
+ * Add new integrations here after creating them.
6
+ */
7
+ // Import all integrations
8
+ import { GitHubIntegration } from './github/index.js';
9
+ import { LinearIntegration } from './linear/index.js';
10
+ import { NotionIntegration } from './notion/index.js';
11
+ export { BaseIntegration } from './base.js';
12
+ /**
13
+ * All registered integrations
14
+ */
15
+ const integrations = [
16
+ new GitHubIntegration(),
17
+ new LinearIntegration(),
18
+ new NotionIntegration(),
19
+ ];
20
+ /**
21
+ * Get all registered integrations
22
+ */
23
+ export function getAllIntegrations() {
24
+ return integrations;
25
+ }
26
+ /**
27
+ * Get an integration by name
28
+ */
29
+ export function getIntegration(name) {
30
+ return integrations.find((i) => i.name === name);
31
+ }
32
+ /**
33
+ * Get info for all integrations
34
+ */
35
+ export async function getIntegrationsInfo() {
36
+ return Promise.all(integrations.map((i) => i.getInfo()));
37
+ }
38
+ /**
39
+ * Get available integrations (those with auth configured)
40
+ */
41
+ export async function getAvailableIntegrations() {
42
+ const results = await Promise.all(integrations.map(async (i) => ({
43
+ integration: i,
44
+ available: await i.isAvailable(),
45
+ })));
46
+ return results.filter((r) => r.available).map((r) => r.integration);
47
+ }
48
+ /**
49
+ * Check if an integration is available
50
+ */
51
+ export async function isIntegrationAvailable(name) {
52
+ const integration = getIntegration(name);
53
+ if (!integration)
54
+ return false;
55
+ return integration.isAvailable();
56
+ }
57
+ /**
58
+ * Fetch from an integration by name
59
+ */
60
+ export async function fetchFromIntegration(name, identifier, options) {
61
+ const integration = getIntegration(name);
62
+ if (!integration) {
63
+ throw new Error(`Unknown integration: ${name}`);
64
+ }
65
+ return integration.fetch(identifier, options);
66
+ }
67
+ // Individual exports for direct imports
68
+ export { GitHubIntegration } from './github/index.js';
69
+ export { LinearIntegration } from './linear/index.js';
70
+ export { NotionIntegration } from './notion/index.js';
71
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/integrations/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,0BAA0B;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAUtD,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C;;GAEG;AACH,MAAM,YAAY,GAAkB;IAClC,IAAI,iBAAiB,EAAE;IACvB,IAAI,iBAAiB,EAAE;IACvB,IAAI,iBAAiB,EAAE;CACxB,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB;IAC5C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7B,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,MAAM,CAAC,CAAC,WAAW,EAAE;KACjC,CAAC,CAAC,CACJ,CAAC;IAEF,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;AACtE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAAY;IACvD,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC,WAAW;QAAE,OAAO,KAAK,CAAC;IAC/B,OAAO,WAAW,CAAC,WAAW,EAAE,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAY,EACZ,UAAkB,EAClB,OAAiC;IAEjC,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,WAAW,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC;AAED,wCAAwC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}