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,404 @@
1
+ /**
2
+ * @fileoverview Plugin registry for managing extractor plugins
3
+ * @copyright Copyright (c) 2024-2026 nirholas
4
+ * @license MIT
5
+ */
6
+
7
+ import {
8
+ ExtractorPlugin,
9
+ PluginRegistryEntry,
10
+ PluginLoadResult,
11
+ PluginFactory,
12
+ PluginEvent,
13
+ PluginEventHandler
14
+ } from './types';
15
+ import * as path from 'path';
16
+ import * as fs from 'fs/promises';
17
+
18
+ /**
19
+ * Plugin registry that manages loading, storing, and accessing plugins
20
+ */
21
+ export class PluginRegistry {
22
+ private plugins: Map<string, PluginRegistryEntry> = new Map();
23
+ private eventHandlers: Set<PluginEventHandler> = new Set();
24
+
25
+ /**
26
+ * Register a plugin from an ExtractorPlugin instance
27
+ */
28
+ register(plugin: ExtractorPlugin, config: Record<string, any> = {}): void {
29
+ const entry: PluginRegistryEntry = {
30
+ plugin,
31
+ config,
32
+ enabled: true,
33
+ source: 'inline',
34
+ loadedAt: new Date()
35
+ };
36
+
37
+ this.plugins.set(plugin.metadata.id, entry);
38
+
39
+ // Call onRegister hook
40
+ plugin.hooks?.onRegister?.();
41
+
42
+ this.emit({
43
+ type: 'registered',
44
+ pluginId: plugin.metadata.id,
45
+ timestamp: new Date(),
46
+ data: { name: plugin.metadata.name, version: plugin.metadata.version }
47
+ });
48
+ }
49
+
50
+ /**
51
+ * Unregister a plugin by ID
52
+ */
53
+ async unregister(pluginId: string): Promise<boolean> {
54
+ const entry = this.plugins.get(pluginId);
55
+ if (!entry) {
56
+ return false;
57
+ }
58
+
59
+ // Call onUnregister hook
60
+ await entry.plugin.hooks?.onUnregister?.();
61
+
62
+ this.plugins.delete(pluginId);
63
+
64
+ this.emit({
65
+ type: 'unregistered',
66
+ pluginId,
67
+ timestamp: new Date()
68
+ });
69
+
70
+ return true;
71
+ }
72
+
73
+ /**
74
+ * Load a plugin from an npm package
75
+ */
76
+ async loadFromNpm(packageName: string, config: Record<string, any> = {}): Promise<PluginLoadResult> {
77
+ try {
78
+ // Dynamic import of the npm package
79
+ const module = await import(packageName);
80
+
81
+ // Check for default export or plugin factory
82
+ let plugin: ExtractorPlugin;
83
+
84
+ if (typeof module.default === 'function') {
85
+ // Plugin factory
86
+ plugin = (module.default as PluginFactory)(config);
87
+ } else if (typeof module.default === 'object' && module.default.metadata) {
88
+ // Direct plugin export
89
+ plugin = module.default;
90
+ } else if (typeof module.createPlugin === 'function') {
91
+ // Named factory export
92
+ plugin = module.createPlugin(config);
93
+ } else {
94
+ throw new Error(`Package ${packageName} does not export a valid plugin`);
95
+ }
96
+
97
+ const entry: PluginRegistryEntry = {
98
+ plugin,
99
+ config,
100
+ enabled: true,
101
+ source: 'npm',
102
+ loadedAt: new Date()
103
+ };
104
+
105
+ this.plugins.set(plugin.metadata.id, entry);
106
+ plugin.hooks?.onRegister?.();
107
+
108
+ this.emit({
109
+ type: 'registered',
110
+ pluginId: plugin.metadata.id,
111
+ timestamp: new Date(),
112
+ data: { source: 'npm', package: packageName }
113
+ });
114
+
115
+ return {
116
+ success: true,
117
+ plugin,
118
+ source: 'npm'
119
+ };
120
+ } catch (error) {
121
+ return {
122
+ success: false,
123
+ error: error instanceof Error ? error : new Error(String(error)),
124
+ source: 'npm'
125
+ };
126
+ }
127
+ }
128
+
129
+ /**
130
+ * Load a plugin from a local file
131
+ */
132
+ async loadFromFile(filePath: string, config: Record<string, any> = {}): Promise<PluginLoadResult> {
133
+ try {
134
+ const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(process.cwd(), filePath);
135
+
136
+ // Check file exists
137
+ await fs.access(absolutePath);
138
+
139
+ // Dynamic import
140
+ const module = await import(absolutePath);
141
+
142
+ let plugin: ExtractorPlugin;
143
+
144
+ if (typeof module.default === 'function') {
145
+ plugin = (module.default as PluginFactory)(config);
146
+ } else if (typeof module.default === 'object' && module.default.metadata) {
147
+ plugin = module.default;
148
+ } else if (typeof module.createPlugin === 'function') {
149
+ plugin = module.createPlugin(config);
150
+ } else {
151
+ throw new Error(`File ${filePath} does not export a valid plugin`);
152
+ }
153
+
154
+ const entry: PluginRegistryEntry = {
155
+ plugin,
156
+ config,
157
+ enabled: true,
158
+ source: 'local',
159
+ loadedAt: new Date()
160
+ };
161
+
162
+ this.plugins.set(plugin.metadata.id, entry);
163
+ plugin.hooks?.onRegister?.();
164
+
165
+ this.emit({
166
+ type: 'registered',
167
+ pluginId: plugin.metadata.id,
168
+ timestamp: new Date(),
169
+ data: { source: 'local', file: filePath }
170
+ });
171
+
172
+ return {
173
+ success: true,
174
+ plugin,
175
+ source: 'local'
176
+ };
177
+ } catch (error) {
178
+ return {
179
+ success: false,
180
+ error: error instanceof Error ? error : new Error(String(error)),
181
+ source: 'local'
182
+ };
183
+ }
184
+ }
185
+
186
+ /**
187
+ * Load all plugins from a directory
188
+ */
189
+ async loadFromDirectory(dirPath: string, config: Record<string, any> = {}): Promise<PluginLoadResult[]> {
190
+ const results: PluginLoadResult[] = [];
191
+
192
+ try {
193
+ const absolutePath = path.isAbsolute(dirPath) ? dirPath : path.resolve(process.cwd(), dirPath);
194
+ const entries = await fs.readdir(absolutePath, { withFileTypes: true });
195
+
196
+ for (const entry of entries) {
197
+ if (entry.isFile() && (entry.name.endsWith('.js') || entry.name.endsWith('.ts') || entry.name.endsWith('.mjs'))) {
198
+ const filePath = path.join(absolutePath, entry.name);
199
+ const result = await this.loadFromFile(filePath, config);
200
+ results.push(result);
201
+ } else if (entry.isDirectory()) {
202
+ // Check for index file in directory
203
+ const indexPath = path.join(absolutePath, entry.name, 'index.js');
204
+ try {
205
+ await fs.access(indexPath);
206
+ const result = await this.loadFromFile(indexPath, config);
207
+ results.push(result);
208
+ } catch {
209
+ // No index file, skip directory
210
+ }
211
+ }
212
+ }
213
+ } catch (error) {
214
+ results.push({
215
+ success: false,
216
+ error: error instanceof Error ? error : new Error(String(error)),
217
+ source: 'local'
218
+ });
219
+ }
220
+
221
+ return results;
222
+ }
223
+
224
+ /**
225
+ * Get a plugin by ID
226
+ */
227
+ get(pluginId: string): ExtractorPlugin | undefined {
228
+ return this.plugins.get(pluginId)?.plugin;
229
+ }
230
+
231
+ /**
232
+ * Get a plugin entry by ID
233
+ */
234
+ getEntry(pluginId: string): PluginRegistryEntry | undefined {
235
+ return this.plugins.get(pluginId);
236
+ }
237
+
238
+ /**
239
+ * Check if a plugin is registered
240
+ */
241
+ has(pluginId: string): boolean {
242
+ return this.plugins.has(pluginId);
243
+ }
244
+
245
+ /**
246
+ * Enable a plugin
247
+ */
248
+ enable(pluginId: string): boolean {
249
+ const entry = this.plugins.get(pluginId);
250
+ if (!entry) return false;
251
+
252
+ entry.enabled = true;
253
+
254
+ this.emit({
255
+ type: 'enabled',
256
+ pluginId,
257
+ timestamp: new Date()
258
+ });
259
+
260
+ return true;
261
+ }
262
+
263
+ /**
264
+ * Disable a plugin
265
+ */
266
+ disable(pluginId: string): boolean {
267
+ const entry = this.plugins.get(pluginId);
268
+ if (!entry) return false;
269
+
270
+ entry.enabled = false;
271
+
272
+ this.emit({
273
+ type: 'disabled',
274
+ pluginId,
275
+ timestamp: new Date()
276
+ });
277
+
278
+ return true;
279
+ }
280
+
281
+ /**
282
+ * List all registered plugins
283
+ */
284
+ list(): Array<{ id: string; name: string; version: string; enabled: boolean; source: string }> {
285
+ return Array.from(this.plugins.entries()).map(([id, entry]) => ({
286
+ id,
287
+ name: entry.plugin.metadata.name,
288
+ version: entry.plugin.metadata.version,
289
+ enabled: entry.enabled,
290
+ source: entry.source
291
+ }));
292
+ }
293
+
294
+ /**
295
+ * Get all enabled plugins
296
+ */
297
+ getEnabled(): ExtractorPlugin[] {
298
+ return Array.from(this.plugins.values())
299
+ .filter(entry => entry.enabled)
300
+ .map(entry => entry.plugin);
301
+ }
302
+
303
+ /**
304
+ * Get all plugins
305
+ */
306
+ getAll(): ExtractorPlugin[] {
307
+ return Array.from(this.plugins.values()).map(entry => entry.plugin);
308
+ }
309
+
310
+ /**
311
+ * Update plugin configuration
312
+ */
313
+ updateConfig(pluginId: string, config: Record<string, any>): boolean {
314
+ const entry = this.plugins.get(pluginId);
315
+ if (!entry) return false;
316
+
317
+ // Validate config against schema if available
318
+ if (entry.plugin.configSchema) {
319
+ for (const schema of entry.plugin.configSchema) {
320
+ if (schema.required && !(schema.name in config)) {
321
+ throw new Error(`Missing required config option: ${schema.name}`);
322
+ }
323
+ if (schema.name in config && schema.validate) {
324
+ if (!schema.validate(config[schema.name])) {
325
+ throw new Error(`Invalid value for config option: ${schema.name}`);
326
+ }
327
+ }
328
+ }
329
+ }
330
+
331
+ entry.config = { ...entry.config, ...config };
332
+ return true;
333
+ }
334
+
335
+ /**
336
+ * Get plugin configuration
337
+ */
338
+ getConfig(pluginId: string): Record<string, any> | undefined {
339
+ return this.plugins.get(pluginId)?.config;
340
+ }
341
+
342
+ /**
343
+ * Subscribe to plugin events
344
+ */
345
+ on(handler: PluginEventHandler): () => void {
346
+ this.eventHandlers.add(handler);
347
+ return () => this.eventHandlers.delete(handler);
348
+ }
349
+
350
+ /**
351
+ * Emit a plugin event
352
+ */
353
+ private emit(event: PluginEvent): void {
354
+ for (const handler of this.eventHandlers) {
355
+ try {
356
+ handler(event);
357
+ } catch {
358
+ // Ignore handler errors
359
+ }
360
+ }
361
+ }
362
+
363
+ /**
364
+ * Clear all plugins
365
+ */
366
+ async clear(): Promise<void> {
367
+ for (const [id, entry] of this.plugins) {
368
+ await entry.plugin.hooks?.onUnregister?.();
369
+ this.emit({
370
+ type: 'unregistered',
371
+ pluginId: id,
372
+ timestamp: new Date()
373
+ });
374
+ }
375
+ this.plugins.clear();
376
+ }
377
+
378
+ /**
379
+ * Get registry statistics
380
+ */
381
+ stats(): {
382
+ total: number;
383
+ enabled: number;
384
+ disabled: number;
385
+ bySource: Record<string, number>;
386
+ } {
387
+ const entries = Array.from(this.plugins.values());
388
+ const bySource: Record<string, number> = {};
389
+
390
+ for (const entry of entries) {
391
+ bySource[entry.source] = (bySource[entry.source] || 0) + 1;
392
+ }
393
+
394
+ return {
395
+ total: entries.length,
396
+ enabled: entries.filter(e => e.enabled).length,
397
+ disabled: entries.filter(e => !e.enabled).length,
398
+ bySource
399
+ };
400
+ }
401
+ }
402
+
403
+ // Default registry instance
404
+ export const defaultRegistry = new PluginRegistry();
@@ -0,0 +1,215 @@
1
+ /**
2
+ * @fileoverview Plugin system type definitions
3
+ * @copyright Copyright (c) 2024-2026 nirholas
4
+ * @license MIT
5
+ */
6
+
7
+ import { ExtractedTool, GithubToMcpOptions, RepoClassification } from '../types';
8
+
9
+ /**
10
+ * Repository context passed to plugins
11
+ */
12
+ export interface PluginRepoContext {
13
+ /** Repository owner */
14
+ owner: string;
15
+ /** Repository name */
16
+ repo: string;
17
+ /** Repository URL */
18
+ url: string;
19
+ /** Repository classification */
20
+ classification: RepoClassification;
21
+ /** Repository metadata */
22
+ metadata: {
23
+ stars: number;
24
+ language: string;
25
+ license?: string;
26
+ description?: string;
27
+ };
28
+ /** README content if available */
29
+ readme?: string;
30
+ /** GitHub token for API access */
31
+ githubToken?: string;
32
+ }
33
+
34
+ /**
35
+ * File content for plugin processing
36
+ */
37
+ export interface PluginFileContent {
38
+ path: string;
39
+ content: string;
40
+ language: string;
41
+ }
42
+
43
+ /**
44
+ * Plugin detection result
45
+ */
46
+ export interface PluginDetectionResult {
47
+ /** Whether the plugin should process this repo */
48
+ shouldProcess: boolean;
49
+ /** Confidence level (0-1) */
50
+ confidence: number;
51
+ /** Reason for the decision */
52
+ reason: string;
53
+ /** Specific files that triggered detection */
54
+ matchedFiles?: string[];
55
+ }
56
+
57
+ /**
58
+ * Plugin extraction result
59
+ */
60
+ export interface PluginExtractionResult {
61
+ /** Extracted tools */
62
+ tools: ExtractedTool[];
63
+ /** Source files processed */
64
+ sourceFiles: string[];
65
+ /** Any warnings during extraction */
66
+ warnings?: string[];
67
+ /** Plugin-specific metadata */
68
+ metadata?: Record<string, any>;
69
+ }
70
+
71
+ /**
72
+ * Plugin lifecycle hooks
73
+ */
74
+ export interface PluginHooks {
75
+ /** Called when the plugin is registered */
76
+ onRegister?: () => void | Promise<void>;
77
+ /** Called when the plugin is unregistered */
78
+ onUnregister?: () => void | Promise<void>;
79
+ /** Called before extraction begins */
80
+ beforeExtract?: (context: PluginRepoContext) => void | Promise<void>;
81
+ /** Called after extraction completes */
82
+ afterExtract?: (result: PluginExtractionResult) => void | Promise<void>;
83
+ }
84
+
85
+ /**
86
+ * Plugin configuration schema
87
+ */
88
+ export interface PluginConfigSchema {
89
+ /** Configuration option name */
90
+ name: string;
91
+ /** Option type */
92
+ type: 'string' | 'number' | 'boolean' | 'array' | 'object';
93
+ /** Description of the option */
94
+ description: string;
95
+ /** Default value */
96
+ default?: any;
97
+ /** Whether the option is required */
98
+ required?: boolean;
99
+ /** Validation function */
100
+ validate?: (value: any) => boolean;
101
+ }
102
+
103
+ /**
104
+ * Plugin metadata
105
+ */
106
+ export interface PluginMetadata {
107
+ /** Unique plugin identifier */
108
+ id: string;
109
+ /** Human-readable name */
110
+ name: string;
111
+ /** Plugin version (semver) */
112
+ version: string;
113
+ /** Plugin description */
114
+ description: string;
115
+ /** Plugin author */
116
+ author?: string;
117
+ /** Plugin homepage/repository */
118
+ homepage?: string;
119
+ /** License */
120
+ license?: string;
121
+ /** Tags for categorization */
122
+ tags?: string[];
123
+ /** Minimum core version required */
124
+ minCoreVersion?: string;
125
+ }
126
+
127
+ /**
128
+ * Main plugin interface that extractors must implement
129
+ */
130
+ export interface ExtractorPlugin {
131
+ /** Plugin metadata */
132
+ metadata: PluginMetadata;
133
+
134
+ /** Configuration schema */
135
+ configSchema?: PluginConfigSchema[];
136
+
137
+ /** Lifecycle hooks */
138
+ hooks?: PluginHooks;
139
+
140
+ /**
141
+ * Detect if this plugin should process the repository
142
+ * @param context Repository context
143
+ * @param files List of files in the repository
144
+ */
145
+ detect(context: PluginRepoContext, files: string[]): Promise<PluginDetectionResult>;
146
+
147
+ /**
148
+ * Extract tools from the repository
149
+ * @param context Repository context
150
+ * @param getFile Function to get file content
151
+ * @param config Plugin configuration
152
+ */
153
+ extract(
154
+ context: PluginRepoContext,
155
+ getFile: (path: string) => Promise<string | null>,
156
+ config?: Record<string, any>
157
+ ): Promise<PluginExtractionResult>;
158
+ }
159
+
160
+ /**
161
+ * Plugin factory function type
162
+ */
163
+ export type PluginFactory = (options?: Record<string, any>) => ExtractorPlugin;
164
+
165
+ /**
166
+ * Plugin loader result
167
+ */
168
+ export interface PluginLoadResult {
169
+ success: boolean;
170
+ plugin?: ExtractorPlugin;
171
+ error?: Error;
172
+ source: 'npm' | 'local' | 'inline';
173
+ }
174
+
175
+ /**
176
+ * Plugin registry entry
177
+ */
178
+ export interface PluginRegistryEntry {
179
+ plugin: ExtractorPlugin;
180
+ config: Record<string, any>;
181
+ enabled: boolean;
182
+ source: 'npm' | 'local' | 'inline';
183
+ loadedAt: Date;
184
+ }
185
+
186
+ /**
187
+ * Plugin manager configuration
188
+ */
189
+ export interface PluginManagerConfig {
190
+ /** Directory to search for local plugins */
191
+ pluginDir?: string;
192
+ /** Auto-load plugins from pluginDir */
193
+ autoLoad?: boolean;
194
+ /** Enable verbose logging */
195
+ verbose?: boolean;
196
+ /** Plugin execution timeout in ms */
197
+ timeout?: number;
198
+ /** Run plugins in parallel */
199
+ parallel?: boolean;
200
+ }
201
+
202
+ /**
203
+ * Event emitted by plugin manager
204
+ */
205
+ export interface PluginEvent {
206
+ type: 'registered' | 'unregistered' | 'enabled' | 'disabled' | 'error' | 'extraction-start' | 'extraction-complete';
207
+ pluginId: string;
208
+ timestamp: Date;
209
+ data?: any;
210
+ }
211
+
212
+ /**
213
+ * Plugin event handler
214
+ */
215
+ export type PluginEventHandler = (event: PluginEvent) => void;