github-to-mcp-monorepo 1.0.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 (388) hide show
  1. package/.env.example +8 -0
  2. package/.github/CODEOWNERS +6 -0
  3. package/.husky/pre-commit +1 -0
  4. package/.nvmrc +1 -0
  5. package/.prettierignore +5 -0
  6. package/.prettierrc +7 -0
  7. package/.vscode/settings.json +4 -0
  8. package/ARCHITECTURE.md +1429 -0
  9. package/CHANGELOG.md +167 -0
  10. package/CONTRIBUTING.md +327 -0
  11. package/LICENSE +201 -0
  12. package/README.md +1028 -0
  13. package/SECURITY.md +248 -0
  14. package/VISUAL_GUIDE.md +437 -0
  15. package/apps/vscode/IMPLEMENTATION.md +480 -0
  16. package/apps/vscode/README.md +248 -0
  17. package/apps/vscode/package.json +381 -0
  18. package/apps/vscode/resources/icon.png +0 -0
  19. package/apps/vscode/resources/icon.svg +5 -0
  20. package/apps/vscode/src/commands/browseRegistry.ts +211 -0
  21. package/apps/vscode/src/commands/configureClaudeDesktop.ts +332 -0
  22. package/apps/vscode/src/commands/convert.ts +82 -0
  23. package/apps/vscode/src/commands/convertCurrentRepo.ts +109 -0
  24. package/apps/vscode/src/commands/convertFromUrl.ts +138 -0
  25. package/apps/vscode/src/commands/index.ts +121 -0
  26. package/apps/vscode/src/commands/validate.ts +197 -0
  27. package/apps/vscode/src/extension.ts +464 -0
  28. package/apps/vscode/src/global.d.ts +36 -0
  29. package/apps/vscode/src/test/extension.test.ts +73 -0
  30. package/apps/vscode/src/utils/file-generator.ts +529 -0
  31. package/apps/vscode/src/utils/github-api.ts +335 -0
  32. package/apps/vscode/src/utils/index.ts +29 -0
  33. package/apps/vscode/src/utils/mcp-config.ts +334 -0
  34. package/apps/vscode/src/utils/storage.ts +87 -0
  35. package/apps/vscode/src/views/McpServersTreeView.ts +160 -0
  36. package/apps/vscode/src/views/OutputChannelView.ts +195 -0
  37. package/apps/vscode/src/views/StatusBarItem.ts +251 -0
  38. package/apps/vscode/src/views/ToolsExplorerView.ts +314 -0
  39. package/apps/vscode/src/views/historyProvider.ts +75 -0
  40. package/apps/vscode/src/views/index.ts +12 -0
  41. package/apps/vscode/src/views/resultsPanel.ts +330 -0
  42. package/apps/vscode/src/webviews/ConversionPanel.ts +350 -0
  43. package/apps/vscode/src/webviews/ToolDetailsPanel.ts +448 -0
  44. package/apps/vscode/src/webviews/index.ts +9 -0
  45. package/apps/vscode/src/webviews/webview-ui/styles.ts +492 -0
  46. package/apps/vscode/tsconfig.json +20 -0
  47. package/apps/web/PLAYGROUND_GUIDE.md +499 -0
  48. package/apps/web/README.md +505 -0
  49. package/apps/web/app/api/convert/route.ts +100 -0
  50. package/apps/web/app/api/convert/stream/route.ts +198 -0
  51. package/apps/web/app/api/deploy/route.ts +157 -0
  52. package/apps/web/app/api/edge/route.ts +308 -0
  53. package/apps/web/app/api/export-docker/route.ts +284 -0
  54. package/apps/web/app/api/generate-openapi/route.ts +119 -0
  55. package/apps/web/app/api/mcp/[serverId]/route.ts +263 -0
  56. package/apps/web/app/api/playground/connect/route.ts +143 -0
  57. package/apps/web/app/api/playground/disconnect/route.ts +78 -0
  58. package/apps/web/app/api/playground/execute/route.ts +135 -0
  59. package/apps/web/app/api/playground/sessions/route.ts +103 -0
  60. package/apps/web/app/api/playground/tools/route.ts +117 -0
  61. package/apps/web/app/api/playground/v2/connect/route.ts +96 -0
  62. package/apps/web/app/api/playground/v2/disconnect/route.ts +88 -0
  63. package/apps/web/app/api/playground/v2/health/route.ts +80 -0
  64. package/apps/web/app/api/playground/v2/prompts/route.ts +160 -0
  65. package/apps/web/app/api/playground/v2/resources/route.ts +159 -0
  66. package/apps/web/app/api/playground/v2/sessions/route.ts +184 -0
  67. package/apps/web/app/api/playground/v2/tools/route.ts +167 -0
  68. package/apps/web/app/api/stream/route.ts +232 -0
  69. package/apps/web/app/batch/BatchConvertClient.tsx +190 -0
  70. package/apps/web/app/batch/page.tsx +37 -0
  71. package/apps/web/app/convert/page.tsx +269 -0
  72. package/apps/web/app/dashboard/page.tsx +380 -0
  73. package/apps/web/app/globals.css +622 -0
  74. package/apps/web/app/layout.tsx +120 -0
  75. package/apps/web/app/manifest.ts +31 -0
  76. package/apps/web/app/opengraph-image.tsx +112 -0
  77. package/apps/web/app/page.old.tsx +924 -0
  78. package/apps/web/app/page.tsx +77 -0
  79. package/apps/web/app/playground/page.tsx +306 -0
  80. package/apps/web/app/playground/v2/error.tsx +163 -0
  81. package/apps/web/app/playground/v2/layout.tsx +58 -0
  82. package/apps/web/app/playground/v2/loading.tsx +152 -0
  83. package/apps/web/app/playground/v2/page.tsx +644 -0
  84. package/apps/web/app/playground/v2/providers.tsx +214 -0
  85. package/apps/web/app/playground/v2/use-shortcuts.ts +209 -0
  86. package/apps/web/app/playground/v2/use-url-state.ts +296 -0
  87. package/apps/web/app/providers.tsx +22 -0
  88. package/apps/web/app/sitemap.ts +32 -0
  89. package/apps/web/app/twitter-image.tsx +112 -0
  90. package/apps/web/components/BranchSelector.tsx +401 -0
  91. package/apps/web/components/ClaudeConfigExport.tsx +226 -0
  92. package/apps/web/components/Features.tsx +84 -0
  93. package/apps/web/components/Footer.tsx +119 -0
  94. package/apps/web/components/GenerationProgress.tsx +248 -0
  95. package/apps/web/components/GithubUrlInput.tsx +483 -0
  96. package/apps/web/components/Header.tsx +175 -0
  97. package/apps/web/components/Hero.tsx +117 -0
  98. package/apps/web/components/HowItWorks.tsx +119 -0
  99. package/apps/web/components/InstallBanner.tsx +158 -0
  100. package/apps/web/components/Logo.tsx +116 -0
  101. package/apps/web/components/ParticleBackground.tsx +105 -0
  102. package/apps/web/components/Playground.tsx +472 -0
  103. package/apps/web/components/PlaygroundToolTester.tsx +410 -0
  104. package/apps/web/components/ProductCards.tsx +179 -0
  105. package/apps/web/components/SplitView.tsx +194 -0
  106. package/apps/web/components/ToolFilter.tsx +260 -0
  107. package/apps/web/components/ToolList.tsx +325 -0
  108. package/apps/web/components/batch/BatchConvert.tsx +785 -0
  109. package/apps/web/components/batch/index.ts +7 -0
  110. package/apps/web/components/convert/ConfigTabs.tsx +230 -0
  111. package/apps/web/components/convert/ConversionResult.tsx +482 -0
  112. package/apps/web/components/convert/InlinePlayground.tsx +259 -0
  113. package/apps/web/components/convert/LoadingSteps.tsx +311 -0
  114. package/apps/web/components/convert/OneClickInstall.tsx +224 -0
  115. package/apps/web/components/convert/ToolCard.tsx +189 -0
  116. package/apps/web/components/convert/TryInPlayground.tsx +242 -0
  117. package/apps/web/components/convert/index.ts +12 -0
  118. package/apps/web/components/deploy/DeployButton.tsx +369 -0
  119. package/apps/web/components/deploy/index.ts +7 -0
  120. package/apps/web/components/docker/DockerExport.tsx +690 -0
  121. package/apps/web/components/docker/index.ts +7 -0
  122. package/apps/web/components/install/OneClickInstall.tsx +676 -0
  123. package/apps/web/components/install/index.ts +7 -0
  124. package/apps/web/components/playground/CapabilityTabs.tsx +150 -0
  125. package/apps/web/components/playground/ConnectionStatusV2.tsx +322 -0
  126. package/apps/web/components/playground/EmptyStates.tsx +305 -0
  127. package/apps/web/components/playground/ExecutionLog.tsx +260 -0
  128. package/apps/web/components/playground/ExecutionLogV2.tsx +378 -0
  129. package/apps/web/components/playground/JsonViewer.tsx +388 -0
  130. package/apps/web/components/playground/PlaygroundLayout.tsx +244 -0
  131. package/apps/web/components/playground/PromptsPanel.tsx +385 -0
  132. package/apps/web/components/playground/ResourcesPanel.tsx +378 -0
  133. package/apps/web/components/playground/SchemaForm.tsx +477 -0
  134. package/apps/web/components/playground/ServerStatus.tsx +151 -0
  135. package/apps/web/components/playground/ShareButton.tsx +239 -0
  136. package/apps/web/components/playground/ToolsPanel.tsx +309 -0
  137. package/apps/web/components/playground/TransportConfigurator.tsx +563 -0
  138. package/apps/web/components/playground/index.ts +74 -0
  139. package/apps/web/components/playground/types.ts +202 -0
  140. package/apps/web/components/streaming/StreamingProgress.tsx +441 -0
  141. package/apps/web/components/streaming/index.ts +7 -0
  142. package/apps/web/components/ui/badge.tsx +42 -0
  143. package/apps/web/components/ui/button.tsx +88 -0
  144. package/apps/web/components/ui/card.tsx +75 -0
  145. package/apps/web/components/ui/code-block.tsx +122 -0
  146. package/apps/web/components/ui/index.ts +12 -0
  147. package/apps/web/components/ui/input.tsx +55 -0
  148. package/apps/web/components/ui/tabs.tsx +61 -0
  149. package/apps/web/hooks/index.ts +85 -0
  150. package/apps/web/hooks/types.ts +1173 -0
  151. package/apps/web/hooks/use-conversion.ts +133 -0
  152. package/apps/web/hooks/use-execution-history.ts +376 -0
  153. package/apps/web/hooks/use-generation-progress.ts +147 -0
  154. package/apps/web/hooks/use-local-storage.ts +88 -0
  155. package/apps/web/hooks/use-mcp-client.ts +623 -0
  156. package/apps/web/hooks/use-mcp-connection.ts +500 -0
  157. package/apps/web/hooks/use-mcp-execution.ts +282 -0
  158. package/apps/web/hooks/use-mcp-prompts.ts +441 -0
  159. package/apps/web/hooks/use-mcp-resources.ts +430 -0
  160. package/apps/web/hooks/use-mcp-tools.ts +540 -0
  161. package/apps/web/hooks/use-playground-store.ts +299 -0
  162. package/apps/web/hooks/use-playground.ts +184 -0
  163. package/apps/web/hooks/use-streaming-conversion.ts +227 -0
  164. package/apps/web/hooks/useBatchConversion.ts +271 -0
  165. package/apps/web/hooks/useDockerConfig.ts +161 -0
  166. package/apps/web/hooks/usePlatformDetection.ts +80 -0
  167. package/apps/web/hooks/useStreaming.ts +199 -0
  168. package/apps/web/lib/api/errors.ts +386 -0
  169. package/apps/web/lib/api/index.ts +137 -0
  170. package/apps/web/lib/api/logger.ts +187 -0
  171. package/apps/web/lib/api/middleware.ts +364 -0
  172. package/apps/web/lib/api/openapi.ts +977 -0
  173. package/apps/web/lib/api/session-manager.ts +594 -0
  174. package/apps/web/lib/api/types.ts +433 -0
  175. package/apps/web/lib/api/validation.ts +523 -0
  176. package/apps/web/lib/constants.ts +114 -0
  177. package/apps/web/lib/mcp/client.ts +1137 -0
  178. package/apps/web/lib/mcp/events.ts +651 -0
  179. package/apps/web/lib/mcp/index.ts +347 -0
  180. package/apps/web/lib/mcp/logger.ts +428 -0
  181. package/apps/web/lib/mcp/metrics.ts +703 -0
  182. package/apps/web/lib/mcp/retry.ts +616 -0
  183. package/apps/web/lib/mcp/session-manager.ts +779 -0
  184. package/apps/web/lib/mcp/transports.ts +988 -0
  185. package/apps/web/lib/mcp/types.ts +594 -0
  186. package/apps/web/lib/mcp-client-enhanced.ts +871 -0
  187. package/apps/web/lib/mcp-client.ts +778 -0
  188. package/apps/web/lib/mcp-errors.ts +489 -0
  189. package/apps/web/lib/mcp-sandbox.ts +593 -0
  190. package/apps/web/lib/mcp-testing.ts +428 -0
  191. package/apps/web/lib/mcp-types.ts +448 -0
  192. package/apps/web/lib/playground-store.tsx +1147 -0
  193. package/apps/web/lib/utils.ts +439 -0
  194. package/apps/web/next-env.d.ts +5 -0
  195. package/apps/web/next.config.js +23 -0
  196. package/apps/web/package.json +55 -0
  197. package/apps/web/postcss.config.js +6 -0
  198. package/apps/web/public/.well-known/ai-plugin.json +17 -0
  199. package/apps/web/public/logo.svg +6 -0
  200. package/apps/web/public/robots.txt +22 -0
  201. package/apps/web/public/schema.json +27 -0
  202. package/apps/web/tailwind.config.js +26 -0
  203. package/apps/web/tailwind.config.ts +123 -0
  204. package/apps/web/tsconfig.json +20 -0
  205. package/apps/web/types/deploy.ts +139 -0
  206. package/apps/web/types/index.ts +247 -0
  207. package/apps/web/vercel.json +39 -0
  208. package/eslint.config.mjs +23 -0
  209. package/llms.txt +102 -0
  210. package/mkdocs/docs/api/core.md +318 -0
  211. package/mkdocs/docs/api/index.md +128 -0
  212. package/mkdocs/docs/api/mcp-server.md +301 -0
  213. package/mkdocs/docs/api/openapi-parser.md +254 -0
  214. package/mkdocs/docs/assets/logo.svg +7 -0
  215. package/mkdocs/docs/changelog.md +118 -0
  216. package/mkdocs/docs/cli/generate.md +148 -0
  217. package/mkdocs/docs/cli/index.md +52 -0
  218. package/mkdocs/docs/cli/inspect.md +164 -0
  219. package/mkdocs/docs/cli/serve.md +136 -0
  220. package/mkdocs/docs/concepts/classification.md +254 -0
  221. package/mkdocs/docs/concepts/how-it-works.md +299 -0
  222. package/mkdocs/docs/concepts/index.md +77 -0
  223. package/mkdocs/docs/concepts/mcp-protocol.md +362 -0
  224. package/mkdocs/docs/concepts/tool-types.md +382 -0
  225. package/mkdocs/docs/contributing/architecture.md +262 -0
  226. package/mkdocs/docs/contributing/development.md +245 -0
  227. package/mkdocs/docs/contributing/index.md +73 -0
  228. package/mkdocs/docs/contributing/testing.md +320 -0
  229. package/mkdocs/docs/getting-started/configuration.md +235 -0
  230. package/mkdocs/docs/getting-started/index.md +54 -0
  231. package/mkdocs/docs/getting-started/installation.md +145 -0
  232. package/mkdocs/docs/getting-started/quickstart.md +160 -0
  233. package/mkdocs/docs/guides/batch.md +375 -0
  234. package/mkdocs/docs/guides/claude-desktop.md +227 -0
  235. package/mkdocs/docs/guides/cursor.md +188 -0
  236. package/mkdocs/docs/guides/custom-tools.md +367 -0
  237. package/mkdocs/docs/guides/index.md +78 -0
  238. package/mkdocs/docs/guides/private-repos.md +221 -0
  239. package/mkdocs/docs/guides/vscode.md +247 -0
  240. package/mkdocs/docs/index.md +175 -0
  241. package/mkdocs/docs/reference/config.md +223 -0
  242. package/mkdocs/docs/reference/env.md +192 -0
  243. package/mkdocs/docs/reference/index.md +102 -0
  244. package/mkdocs/docs/reference/tools.md +309 -0
  245. package/mkdocs/docs/stylesheets/extra.css +231 -0
  246. package/mkdocs/mkdocs.yml +204 -0
  247. package/mkdocs/overrides/.gitkeep +1 -0
  248. package/mkdocs/overrides/main.html +7 -0
  249. package/mkdocs/python-deps.txt +7 -0
  250. package/mkdocs/vercel.json +11 -0
  251. package/package.json +63 -0
  252. package/packages/core/package.json +61 -0
  253. package/packages/core/src/__tests__/bitbucket-client.test.ts +366 -0
  254. package/packages/core/src/__tests__/cli.test.ts +235 -0
  255. package/packages/core/src/__tests__/code-extractor.test.ts +378 -0
  256. package/packages/core/src/__tests__/docker-generator.test.ts +255 -0
  257. package/packages/core/src/__tests__/github-client.test.ts +390 -0
  258. package/packages/core/src/__tests__/gitlab-client.test.ts +319 -0
  259. package/packages/core/src/__tests__/go-extractor.test.ts +351 -0
  260. package/packages/core/src/__tests__/graphql-extractor.test.ts +330 -0
  261. package/packages/core/src/__tests__/java-extractor.test.ts +497 -0
  262. package/packages/core/src/__tests__/plugins.test.ts +467 -0
  263. package/packages/core/src/__tests__/readme-extractor.test.ts +258 -0
  264. package/packages/core/src/__tests__/redis-cache.test.ts +307 -0
  265. package/packages/core/src/__tests__/rust-extractor.test.ts +252 -0
  266. package/packages/core/src/__tests__/streaming.test.ts +251 -0
  267. package/packages/core/src/additional-extractors.ts +333 -0
  268. package/packages/core/src/cache/cache-interface.ts +179 -0
  269. package/packages/core/src/cache/index.ts +210 -0
  270. package/packages/core/src/cache/redis-cache.ts +291 -0
  271. package/packages/core/src/cache/upstash-cache.ts +379 -0
  272. package/packages/core/src/cache.ts +251 -0
  273. package/packages/core/src/cli.ts +822 -0
  274. package/packages/core/src/code-extractor.ts +696 -0
  275. package/packages/core/src/docker-generator.ts +470 -0
  276. package/packages/core/src/edge-compatible.ts +491 -0
  277. package/packages/core/src/extractors/go-extractor.ts +791 -0
  278. package/packages/core/src/extractors/index.ts +9 -0
  279. package/packages/core/src/extractors/java-extractor.ts +937 -0
  280. package/packages/core/src/extractors/rust-extractor.ts +744 -0
  281. package/packages/core/src/github-client.ts +319 -0
  282. package/packages/core/src/go-generator.ts +356 -0
  283. package/packages/core/src/graphql-extractor.ts +358 -0
  284. package/packages/core/src/index.ts +797 -0
  285. package/packages/core/src/langchain-exporter.ts +617 -0
  286. package/packages/core/src/language-parsers.ts +1114 -0
  287. package/packages/core/src/mcp-introspector.ts +279 -0
  288. package/packages/core/src/monorepo-detector.ts +378 -0
  289. package/packages/core/src/plugins/index.ts +370 -0
  290. package/packages/core/src/plugins/registry.ts +404 -0
  291. package/packages/core/src/plugins/types.ts +215 -0
  292. package/packages/core/src/providers/base-provider.ts +246 -0
  293. package/packages/core/src/providers/bitbucket-client.ts +464 -0
  294. package/packages/core/src/providers/gitlab-client.ts +388 -0
  295. package/packages/core/src/providers/index.ts +176 -0
  296. package/packages/core/src/python-generator.ts +260 -0
  297. package/packages/core/src/queue/index.ts +100 -0
  298. package/packages/core/src/queue/memory-queue.ts +445 -0
  299. package/packages/core/src/queue/redis-queue.ts +578 -0
  300. package/packages/core/src/queue/types.ts +251 -0
  301. package/packages/core/src/readme-extractor.ts +409 -0
  302. package/packages/core/src/schema-generator.ts +638 -0
  303. package/packages/core/src/streaming.ts +999 -0
  304. package/packages/core/src/types.ts +289 -0
  305. package/packages/core/tsconfig.json +9 -0
  306. package/packages/core/tsup.config.ts +25 -0
  307. package/packages/mcp-server/README.md +297 -0
  308. package/packages/mcp-server/package.json +55 -0
  309. package/packages/mcp-server/src/__tests__/mcp-server.test.ts +177 -0
  310. package/packages/mcp-server/src/__tests__/tools.test.ts +217 -0
  311. package/packages/mcp-server/src/index.ts +1206 -0
  312. package/packages/mcp-server/src/prompts/index.ts +601 -0
  313. package/packages/mcp-server/src/tools/export-docker.ts +362 -0
  314. package/packages/mcp-server/src/tools/generate-openapi.ts +162 -0
  315. package/packages/mcp-server/src/tools/monitor-mcp-server.ts +448 -0
  316. package/packages/mcp-server/src/tools/stream-convert.ts +398 -0
  317. package/packages/mcp-server/src/tools/test-mcp-tool.ts +531 -0
  318. package/packages/mcp-server/tsconfig.json +12 -0
  319. package/packages/mcp-server/tsup.config.ts +14 -0
  320. package/packages/openapi-parser/package-lock.json +3028 -0
  321. package/packages/openapi-parser/package.json +41 -0
  322. package/packages/openapi-parser/src/analyzer.ts +700 -0
  323. package/packages/openapi-parser/src/asyncapi-parser.ts +475 -0
  324. package/packages/openapi-parser/src/cli.ts +302 -0
  325. package/packages/openapi-parser/src/generator.ts +570 -0
  326. package/packages/openapi-parser/src/generators/express-analyzer.ts +649 -0
  327. package/packages/openapi-parser/src/generators/fastapi-analyzer.ts +960 -0
  328. package/packages/openapi-parser/src/generators/index.ts +200 -0
  329. package/packages/openapi-parser/src/generators/nextjs-analyzer.ts +768 -0
  330. package/packages/openapi-parser/src/generators/openapi-builder.ts +527 -0
  331. package/packages/openapi-parser/src/generators/types.ts +298 -0
  332. package/packages/openapi-parser/src/graphql-parser.ts +462 -0
  333. package/packages/openapi-parser/src/grpc-parser.ts +649 -0
  334. package/packages/openapi-parser/src/har-parser.ts +723 -0
  335. package/packages/openapi-parser/src/index.ts +635 -0
  336. package/packages/openapi-parser/src/insomnia-parser.ts +614 -0
  337. package/packages/openapi-parser/src/parser.ts +231 -0
  338. package/packages/openapi-parser/src/postman-parser.ts +611 -0
  339. package/packages/openapi-parser/src/ref-resolver.ts +313 -0
  340. package/packages/openapi-parser/src/transformer.ts +459 -0
  341. package/packages/openapi-parser/tests/generators/express.test.ts +209 -0
  342. package/packages/openapi-parser/tests/generators/fastapi.test.ts +236 -0
  343. package/packages/openapi-parser/tests/generators/nextjs.test.ts +273 -0
  344. package/packages/openapi-parser/tests/parsers.test.ts +847 -0
  345. package/packages/openapi-parser/tsconfig.json +9 -0
  346. package/packages/openapi-parser/tsup.config.ts +11 -0
  347. package/packages/registry/package.json +59 -0
  348. package/packages/registry/src/cli.ts +456 -0
  349. package/packages/registry/src/index.ts +44 -0
  350. package/packages/registry/src/popular/github.json +47 -0
  351. package/packages/registry/src/popular/index.ts +55 -0
  352. package/packages/registry/src/popular/linear.json +42 -0
  353. package/packages/registry/src/popular/notion.json +42 -0
  354. package/packages/registry/src/popular/openai.json +40 -0
  355. package/packages/registry/src/popular/resend.json +38 -0
  356. package/packages/registry/src/popular/slack.json +42 -0
  357. package/packages/registry/src/popular/stripe.json +163 -0
  358. package/packages/registry/src/popular/supabase.json +42 -0
  359. package/packages/registry/src/popular/twilio.json +40 -0
  360. package/packages/registry/src/popular/vercel.json +40 -0
  361. package/packages/registry/src/registry.ts +492 -0
  362. package/packages/registry/src/storage.ts +334 -0
  363. package/packages/registry/src/types.ts +275 -0
  364. package/packages/registry/src/updater.ts +208 -0
  365. package/packages/registry/tsconfig.json +10 -0
  366. package/packages/registry/tsup.config.ts +11 -0
  367. package/pnpm-workspace.yaml +3 -0
  368. package/scripts/build-docs.sh +16 -0
  369. package/server.json +9 -0
  370. package/templates/Dockerfile.python.template +60 -0
  371. package/templates/Dockerfile.typescript.template +60 -0
  372. package/templates/docker-compose.template.yml +68 -0
  373. package/tests/fixtures/express-app/index.js +34 -0
  374. package/tests/fixtures/express-app/routes/posts.js +43 -0
  375. package/tests/fixtures/express-app/routes/users.js +58 -0
  376. package/tests/fixtures/fastapi-app/main.py +125 -0
  377. package/tests/fixtures/fastapi-app/routes/admin.py +42 -0
  378. package/tests/fixtures/graphql/simple-schema.graphql +65 -0
  379. package/tests/fixtures/mocks/github-api-responses.json +63 -0
  380. package/tests/fixtures/nextjs-app/app/api/posts/route.ts +55 -0
  381. package/tests/fixtures/nextjs-app/app/api/users/[id]/route.ts +63 -0
  382. package/tests/fixtures/nextjs-app/app/api/users/route.ts +44 -0
  383. package/tests/fixtures/nextjs-app/pages/api/health.ts +28 -0
  384. package/tests/fixtures/openapi/petstore.yaml +179 -0
  385. package/tests/integration/langchain-export.test.ts +405 -0
  386. package/tests/integration/openapi-conversion.test.ts +221 -0
  387. package/tsconfig.json +18 -0
  388. package/vitest.config.ts +32 -0
@@ -0,0 +1,388 @@
1
+ /**
2
+ * @fileoverview GitLab API client implementing BaseProvider
3
+ * @copyright Copyright (c) 2024-2026 nirholas
4
+ * @license MIT
5
+ */
6
+
7
+ import {
8
+ AbstractProvider,
9
+ ProviderConfig,
10
+ ProviderRepoMetadata,
11
+ CodeSearchResult,
12
+ FileTreeItem,
13
+ SearchOptions,
14
+ RateLimitInfo
15
+ } from './base-provider';
16
+ import type { RepoMetadata, FileContent, ApiSpec } from '../types';
17
+
18
+ /**
19
+ * GitLab API response interfaces
20
+ */
21
+ interface GitLabProject {
22
+ id: number;
23
+ name: string;
24
+ name_with_namespace: string;
25
+ path: string;
26
+ path_with_namespace: string;
27
+ description: string | null;
28
+ default_branch: string;
29
+ star_count: number;
30
+ forks_count: number;
31
+ open_issues_count: number;
32
+ created_at: string;
33
+ last_activity_at: string;
34
+ topics: string[];
35
+ license?: {
36
+ key: string;
37
+ name: string;
38
+ };
39
+ }
40
+
41
+ interface GitLabFile {
42
+ file_name: string;
43
+ file_path: string;
44
+ size: number;
45
+ encoding: string;
46
+ content: string;
47
+ content_sha256: string;
48
+ ref: string;
49
+ blob_id: string;
50
+ commit_id: string;
51
+ }
52
+
53
+ interface GitLabTreeItem {
54
+ id: string;
55
+ name: string;
56
+ type: 'tree' | 'blob';
57
+ path: string;
58
+ mode: string;
59
+ }
60
+
61
+ interface GitLabSearchResult {
62
+ basename: string;
63
+ data: string;
64
+ path: string;
65
+ filename: string;
66
+ id: string;
67
+ ref: string;
68
+ startline: number;
69
+ project_id: number;
70
+ }
71
+
72
+ /**
73
+ * GitLab provider implementation
74
+ */
75
+ export class GitLabClient extends AbstractProvider {
76
+ readonly name = 'gitlab';
77
+ private baseUrl: string;
78
+
79
+ constructor(config: ProviderConfig = {}) {
80
+ super(config);
81
+ this.baseUrl = config.baseUrl || 'https://gitlab.com/api/v4';
82
+ }
83
+
84
+ /**
85
+ * Parse GitLab URL to extract owner and repo
86
+ */
87
+ parseUrl(url: string): RepoMetadata {
88
+ // Handle URLs with groups (namespaces can be nested)
89
+ // Format: gitlab.com/group/subgroup/project
90
+ // Or with tree: gitlab.com/group/project/-/tree/branch/path
91
+
92
+ // Extract base path (remove tree/blob parts)
93
+ const treeMatch = url.match(/gitlab\.com\/(.+?)\/-\/(?:tree|blob)\/([^\/]+)(?:\/(.*))?$/);
94
+ if (treeMatch) {
95
+ const projectPath = treeMatch[1];
96
+ const pathParts = projectPath.split('/');
97
+ const repo = pathParts.pop() || '';
98
+ const owner = pathParts.join('/');
99
+
100
+ return {
101
+ owner,
102
+ repo,
103
+ branch: treeMatch[2],
104
+ path: treeMatch[3]
105
+ };
106
+ }
107
+
108
+ // Simple format: gitlab.com/owner/repo or gitlab.com/group/subgroup/repo
109
+ const simpleMatch = url.match(/gitlab\.com\/(.+?)(?:\.git)?(?:\?|#|$)/);
110
+ if (simpleMatch) {
111
+ const projectPath = simpleMatch[1].replace(/\/$/, '');
112
+ const pathParts = projectPath.split('/');
113
+ const repo = pathParts.pop() || '';
114
+ const owner = pathParts.join('/');
115
+
116
+ return {
117
+ owner,
118
+ repo,
119
+ branch: 'main'
120
+ };
121
+ }
122
+
123
+ throw new Error(`Invalid GitLab URL: ${url}`);
124
+ }
125
+
126
+ /**
127
+ * Get project ID from owner/repo (GitLab uses project IDs or URL-encoded paths)
128
+ */
129
+ private encodeProjectPath(owner: string, repo: string): string {
130
+ return encodeURIComponent(`${owner}/${repo}`);
131
+ }
132
+
133
+ /**
134
+ * Get repository metadata
135
+ */
136
+ async getRepoMetadata(owner: string, repo: string): Promise<ProviderRepoMetadata> {
137
+ const projectPath = this.encodeProjectPath(owner, repo);
138
+ const url = `${this.baseUrl}/projects/${projectPath}`;
139
+
140
+ const response = await this.fetchWithTimeout(url, {
141
+ headers: {
142
+ ...this.getAuthHeader(),
143
+ 'Content-Type': 'application/json'
144
+ }
145
+ });
146
+
147
+ if (!response.ok) {
148
+ throw new Error(`GitLab API error: ${response.status} ${response.statusText}`);
149
+ }
150
+
151
+ const project = await response.json() as GitLabProject;
152
+
153
+ return {
154
+ stars: project.star_count,
155
+ language: 'unknown', // GitLab doesn't return primary language in project API
156
+ license: project.license?.key,
157
+ description: project.description || undefined,
158
+ defaultBranch: project.default_branch,
159
+ forksCount: project.forks_count,
160
+ openIssuesCount: project.open_issues_count,
161
+ createdAt: project.created_at,
162
+ updatedAt: project.last_activity_at,
163
+ topics: project.topics
164
+ };
165
+ }
166
+
167
+ /**
168
+ * Get README content
169
+ */
170
+ async getReadme(owner: string, repo: string, branch?: string): Promise<string | null> {
171
+ for (const filename of this.readmeFileNames) {
172
+ const file = await this.getFile(owner, repo, filename, branch);
173
+ if (file) {
174
+ return file.content;
175
+ }
176
+ }
177
+ return null;
178
+ }
179
+
180
+ /**
181
+ * Get file content
182
+ */
183
+ async getFile(owner: string, repo: string, path: string, branch?: string): Promise<FileContent | null> {
184
+ const projectPath = this.encodeProjectPath(owner, repo);
185
+ const encodedPath = encodeURIComponent(path);
186
+ const ref = branch || 'main';
187
+
188
+ const url = `${this.baseUrl}/projects/${projectPath}/repository/files/${encodedPath}?ref=${ref}`;
189
+
190
+ try {
191
+ const response = await this.fetchWithTimeout(url, {
192
+ headers: {
193
+ ...this.getAuthHeader(),
194
+ 'Content-Type': 'application/json'
195
+ }
196
+ });
197
+
198
+ if (!response.ok) {
199
+ return null;
200
+ }
201
+
202
+ const file = await response.json() as GitLabFile;
203
+
204
+ // Decode content based on encoding
205
+ let content = file.content;
206
+ if (file.encoding === 'base64') {
207
+ content = Buffer.from(file.content, 'base64').toString('utf-8');
208
+ }
209
+
210
+ return {
211
+ path: file.file_path,
212
+ content,
213
+ type: 'file',
214
+ sha: file.blob_id
215
+ };
216
+ } catch (error) {
217
+ return null;
218
+ }
219
+ }
220
+
221
+ /**
222
+ * List files in a directory
223
+ */
224
+ async listFiles(owner: string, repo: string, path: string = '', branch?: string): Promise<FileTreeItem[]> {
225
+ const projectPath = this.encodeProjectPath(owner, repo);
226
+ const ref = branch || 'main';
227
+
228
+ let url = `${this.baseUrl}/projects/${projectPath}/repository/tree?ref=${ref}`;
229
+ if (path) {
230
+ url += `&path=${encodeURIComponent(path)}`;
231
+ }
232
+
233
+ try {
234
+ const response = await this.fetchWithTimeout(url, {
235
+ headers: {
236
+ ...this.getAuthHeader(),
237
+ 'Content-Type': 'application/json'
238
+ }
239
+ });
240
+
241
+ if (!response.ok) {
242
+ return [];
243
+ }
244
+
245
+ const items = await response.json() as GitLabTreeItem[];
246
+
247
+ return items.map(item => ({
248
+ path: item.path,
249
+ type: item.type === 'tree' ? 'dir' : 'file',
250
+ sha: item.id
251
+ }));
252
+ } catch (error) {
253
+ return [];
254
+ }
255
+ }
256
+
257
+ /**
258
+ * Search for code in the repository
259
+ */
260
+ async searchCode(owner: string, repo: string, query: string, options: SearchOptions = {}): Promise<CodeSearchResult[]> {
261
+ const projectPath = this.encodeProjectPath(owner, repo);
262
+ const maxResults = options.maxResults || 20;
263
+
264
+ const url = `${this.baseUrl}/projects/${projectPath}/search?scope=blobs&search=${encodeURIComponent(query)}&per_page=${maxResults}`;
265
+
266
+ try {
267
+ const response = await this.fetchWithTimeout(url, {
268
+ headers: {
269
+ ...this.getAuthHeader(),
270
+ 'Content-Type': 'application/json'
271
+ }
272
+ });
273
+
274
+ if (!response.ok) {
275
+ return [];
276
+ }
277
+
278
+ const results = await response.json() as GitLabSearchResult[];
279
+
280
+ return results
281
+ .filter(result => {
282
+ // Filter by extensions if specified
283
+ if (options.extensions && options.extensions.length > 0) {
284
+ const ext = result.filename.split('.').pop() || '';
285
+ if (!options.extensions.includes(ext)) {
286
+ return false;
287
+ }
288
+ }
289
+
290
+ // Filter by paths if specified
291
+ if (options.paths && options.paths.length > 0) {
292
+ if (!options.paths.some(p => result.path.startsWith(p))) {
293
+ return false;
294
+ }
295
+ }
296
+
297
+ return true;
298
+ })
299
+ .map(result => ({
300
+ path: result.path,
301
+ content: result.data,
302
+ matchedLines: [{
303
+ lineNumber: result.startline,
304
+ content: result.data
305
+ }],
306
+ sha: result.id
307
+ }));
308
+ } catch (error) {
309
+ return [];
310
+ }
311
+ }
312
+
313
+ /**
314
+ * Find API specification files
315
+ */
316
+ async findApiSpecs(owner: string, repo: string, branch?: string): Promise<ApiSpec[]> {
317
+ const specs: ApiSpec[] = [];
318
+
319
+ for (const location of this.apiSpecLocations) {
320
+ const file = await this.getFile(owner, repo, location, branch);
321
+ if (file) {
322
+ try {
323
+ const spec = this.parseSpec(file.content, location);
324
+ if (spec) {
325
+ specs.push(spec);
326
+ }
327
+ } catch (error) {
328
+ // Not a valid spec, continue
329
+ }
330
+ }
331
+ }
332
+
333
+ return specs;
334
+ }
335
+
336
+ /**
337
+ * Parse API spec content
338
+ */
339
+ private parseSpec(content: string, path: string): ApiSpec | null {
340
+ try {
341
+ const spec = JSON.parse(content);
342
+
343
+ let type: 'openapi' | 'swagger' = 'openapi';
344
+ let version = '3.0.0';
345
+
346
+ if (spec.swagger) {
347
+ type = 'swagger';
348
+ version = spec.swagger;
349
+ } else if (spec.openapi) {
350
+ type = 'openapi';
351
+ version = spec.openapi;
352
+ }
353
+
354
+ return { type, version, spec, path };
355
+ } catch {
356
+ // Not JSON, might be YAML - would need yaml parser
357
+ return null;
358
+ }
359
+ }
360
+
361
+ /**
362
+ * Get rate limit information
363
+ */
364
+ async getRateLimit(): Promise<RateLimitInfo> {
365
+ // GitLab returns rate limit info in response headers
366
+ // This is a simplified implementation
367
+ const url = `${this.baseUrl}/projects?per_page=1`;
368
+
369
+ const response = await this.fetchWithTimeout(url, {
370
+ headers: this.getAuthHeader()
371
+ });
372
+
373
+ const remaining = parseInt(response.headers.get('RateLimit-Remaining') || '0', 10);
374
+ const limit = parseInt(response.headers.get('RateLimit-Limit') || '0', 10);
375
+ const reset = parseInt(response.headers.get('RateLimit-Reset') || '0', 10);
376
+
377
+ return {
378
+ remaining,
379
+ limit,
380
+ reset: new Date(reset * 1000)
381
+ };
382
+ }
383
+ }
384
+
385
+ // Export singleton factory
386
+ export function createGitLabClient(config?: ProviderConfig): GitLabClient {
387
+ return new GitLabClient(config);
388
+ }
@@ -0,0 +1,176 @@
1
+ /**
2
+ * @fileoverview Git provider exports and factory
3
+ * @copyright Copyright (c) 2024-2026 nirholas
4
+ * @license MIT
5
+ */
6
+
7
+ export {
8
+ BaseProvider,
9
+ AbstractProvider,
10
+ ProviderConfig,
11
+ ProviderRepoMetadata,
12
+ CodeSearchResult,
13
+ FileTreeItem,
14
+ SearchOptions,
15
+ RateLimitInfo,
16
+ detectProvider
17
+ } from './base-provider';
18
+
19
+ export { GitLabClient, createGitLabClient } from './gitlab-client';
20
+ export { BitbucketClient, createBitbucketClient } from './bitbucket-client';
21
+
22
+ import type { BaseProvider, ProviderConfig } from './base-provider';
23
+ import { detectProvider } from './base-provider';
24
+ import { GitLabClient } from './gitlab-client';
25
+ import { BitbucketClient } from './bitbucket-client';
26
+ import { GithubClient } from '../github-client';
27
+
28
+ /**
29
+ * Extended GitHub client that implements BaseProvider interface
30
+ */
31
+ class GitHubProviderAdapter implements BaseProvider {
32
+ readonly name = 'github';
33
+ private client: GithubClient;
34
+
35
+ constructor(config: ProviderConfig = {}) {
36
+ this.client = new GithubClient(config.token);
37
+ }
38
+
39
+ parseUrl(url: string) {
40
+ return this.client.parseGithubUrl(url);
41
+ }
42
+
43
+ async getRepoMetadata(owner: string, repo: string) {
44
+ const metadata = await this.client.getRepoMetadata(owner, repo);
45
+ return {
46
+ stars: metadata.stars,
47
+ language: metadata.language,
48
+ license: metadata.license,
49
+ description: metadata.description,
50
+ defaultBranch: metadata.defaultBranch
51
+ };
52
+ }
53
+
54
+ async getReadme(owner: string, repo: string, branch?: string) {
55
+ return this.client.getReadme(owner, repo, branch);
56
+ }
57
+
58
+ async getFile(owner: string, repo: string, path: string, branch?: string) {
59
+ return this.client.getFileContent(owner, repo, path, branch);
60
+ }
61
+
62
+ async listFiles(owner: string, repo: string, path?: string, branch?: string) {
63
+ const files = await this.client.listDirectory(owner, repo, path || '', branch);
64
+ return files.map(f => ({
65
+ path: f.path,
66
+ type: f.type as 'file' | 'dir',
67
+ sha: f.sha
68
+ }));
69
+ }
70
+
71
+ async searchCode(owner: string, repo: string, query: string, options?: { maxResults?: number }) {
72
+ const pattern = new RegExp(query, 'gi');
73
+ const files = await this.client.searchFiles(owner, repo, pattern, 3);
74
+ return files.slice(0, options?.maxResults || 20).map(f => ({
75
+ path: f.path,
76
+ content: f.content,
77
+ sha: f.sha
78
+ }));
79
+ }
80
+
81
+ async findApiSpecs(owner: string, repo: string, branch?: string) {
82
+ return this.client.findApiSpecs(owner, repo, branch);
83
+ }
84
+
85
+ async getRateLimit() {
86
+ return this.client.getRateLimit();
87
+ }
88
+ }
89
+
90
+ export { GitHubProviderAdapter };
91
+
92
+ /**
93
+ * Provider factory configuration
94
+ */
95
+ export interface ProviderFactoryConfig {
96
+ github?: ProviderConfig;
97
+ gitlab?: ProviderConfig;
98
+ bitbucket?: ProviderConfig;
99
+ }
100
+
101
+ /**
102
+ * Provider factory - creates the appropriate provider based on URL or type
103
+ */
104
+ export class ProviderFactory {
105
+ private configs: ProviderFactoryConfig;
106
+ private providers: Map<string, BaseProvider> = new Map();
107
+
108
+ constructor(configs: ProviderFactoryConfig = {}) {
109
+ this.configs = configs;
110
+ }
111
+
112
+ /**
113
+ * Get a provider by name
114
+ */
115
+ getProvider(name: 'github' | 'gitlab' | 'bitbucket'): BaseProvider {
116
+ if (this.providers.has(name)) {
117
+ return this.providers.get(name)!;
118
+ }
119
+
120
+ let provider: BaseProvider;
121
+
122
+ switch (name) {
123
+ case 'github':
124
+ provider = new GitHubProviderAdapter(this.configs.github);
125
+ break;
126
+ case 'gitlab':
127
+ provider = new GitLabClient(this.configs.gitlab);
128
+ break;
129
+ case 'bitbucket':
130
+ provider = new BitbucketClient(this.configs.bitbucket);
131
+ break;
132
+ default:
133
+ throw new Error(`Unknown provider: ${name}`);
134
+ }
135
+
136
+ this.providers.set(name, provider);
137
+ return provider;
138
+ }
139
+
140
+ /**
141
+ * Get provider from URL (auto-detect)
142
+ */
143
+ getProviderFromUrl(url: string): BaseProvider {
144
+ const providerType = detectProvider(url);
145
+
146
+ if (providerType === 'unknown') {
147
+ throw new Error(`Unable to detect git provider from URL: ${url}`);
148
+ }
149
+
150
+ return this.getProvider(providerType);
151
+ }
152
+
153
+ /**
154
+ * Parse URL and get provider info
155
+ */
156
+ parseUrl(url: string): { provider: BaseProvider; metadata: ReturnType<BaseProvider['parseUrl']> } {
157
+ const provider = this.getProviderFromUrl(url);
158
+ const metadata = provider.parseUrl(url);
159
+ return { provider, metadata };
160
+ }
161
+ }
162
+
163
+ /**
164
+ * Create a provider factory with the given configuration
165
+ */
166
+ export function createProviderFactory(configs?: ProviderFactoryConfig): ProviderFactory {
167
+ return new ProviderFactory(configs);
168
+ }
169
+
170
+ /**
171
+ * Quick utility to get the appropriate provider for a URL
172
+ */
173
+ export function getProviderForUrl(url: string, configs?: ProviderFactoryConfig): BaseProvider {
174
+ const factory = new ProviderFactory(configs);
175
+ return factory.getProviderFromUrl(url);
176
+ }