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,497 @@
1
+ /**
2
+ * @fileoverview Unit tests for Java extractor
3
+ */
4
+
5
+ import { describe, it, expect, beforeEach } from 'vitest';
6
+ import { JavaExtractor } from '../extractors/java-extractor';
7
+
8
+ describe('JavaExtractor', () => {
9
+ let extractor: JavaExtractor;
10
+
11
+ beforeEach(() => {
12
+ extractor = new JavaExtractor();
13
+ });
14
+
15
+ describe('extract', () => {
16
+ describe('Spring Boot endpoints', () => {
17
+ it('should extract @GetMapping endpoints', async () => {
18
+ const code = `
19
+ package com.example.controller;
20
+
21
+ import org.springframework.web.bind.annotation.*;
22
+
23
+ @RestController
24
+ @RequestMapping("/api")
25
+ public class UserController {
26
+
27
+ @GetMapping("/users/{id}")
28
+ public User getUser(@PathVariable String id) {
29
+ return userService.findById(id);
30
+ }
31
+ }
32
+ `;
33
+
34
+ const tools = await extractor.extract(code, 'UserController.java');
35
+
36
+ expect(tools.length).toBeGreaterThan(0);
37
+ const tool = tools.find(t => t.name.includes('get_api_users'));
38
+ expect(tool).toBeDefined();
39
+ expect(tool?.inputSchema.properties).toHaveProperty('id');
40
+ });
41
+
42
+ it('should extract @PostMapping with @RequestBody', async () => {
43
+ const code = `
44
+ package com.example.controller;
45
+
46
+ import org.springframework.web.bind.annotation.*;
47
+
48
+ @RestController
49
+ public class UserController {
50
+
51
+ @PostMapping("/users")
52
+ public User createUser(@RequestBody CreateUserDto dto) {
53
+ return userService.create(dto);
54
+ }
55
+ }
56
+ `;
57
+
58
+ const tools = await extractor.extract(code, 'UserController.java');
59
+
60
+ expect(tools.length).toBeGreaterThan(0);
61
+ const tool = tools.find(t => t.name.includes('post_users'));
62
+ expect(tool).toBeDefined();
63
+ expect(tool?.inputSchema.properties).toHaveProperty('dto');
64
+ });
65
+
66
+ it('should extract @RequestMapping with method attribute', async () => {
67
+ const code = `
68
+ package com.example.controller;
69
+
70
+ import org.springframework.web.bind.annotation.*;
71
+
72
+ @RestController
73
+ public class ItemController {
74
+
75
+ @RequestMapping(value = "/items", method = RequestMethod.GET)
76
+ public List<Item> listItems() {
77
+ return itemService.findAll();
78
+ }
79
+ }
80
+ `;
81
+
82
+ const tools = await extractor.extract(code, 'ItemController.java');
83
+
84
+ expect(tools.length).toBeGreaterThan(0);
85
+ expect(tools.some(t => t.name.includes('get_items'))).toBe(true);
86
+ });
87
+
88
+ it('should handle @RequestParam', async () => {
89
+ const code = `
90
+ package com.example.controller;
91
+
92
+ import org.springframework.web.bind.annotation.*;
93
+
94
+ @RestController
95
+ public class SearchController {
96
+
97
+ @GetMapping("/search")
98
+ public List<Result> search(
99
+ @RequestParam String query,
100
+ @RequestParam(required = false) Integer limit
101
+ ) {
102
+ return searchService.search(query, limit);
103
+ }
104
+ }
105
+ `;
106
+
107
+ const tools = await extractor.extract(code, 'SearchController.java');
108
+
109
+ const tool = tools.find(t => t.name.includes('search'));
110
+ expect(tool).toBeDefined();
111
+ expect(tool?.inputSchema.properties).toHaveProperty('query');
112
+ expect(tool?.inputSchema.required).toContain('query');
113
+ });
114
+
115
+ it('should combine class and method level paths', async () => {
116
+ const code = `
117
+ package com.example.controller;
118
+
119
+ import org.springframework.web.bind.annotation.*;
120
+
121
+ @RestController
122
+ @RequestMapping("/api/v1")
123
+ public class ProductController {
124
+
125
+ @GetMapping("/products")
126
+ public List<Product> listProducts() {
127
+ return productService.findAll();
128
+ }
129
+ }
130
+ `;
131
+
132
+ const tools = await extractor.extract(code, 'ProductController.java');
133
+
134
+ const tool = tools.find(t => t.name.includes('api'));
135
+ expect(tool).toBeDefined();
136
+ // Path should be combined: /api/v1/products
137
+ });
138
+
139
+ it('should extract multiple mapping annotations', async () => {
140
+ const code = `
141
+ package com.example.controller;
142
+
143
+ import org.springframework.web.bind.annotation.*;
144
+
145
+ @RestController
146
+ @RequestMapping("/api")
147
+ public class CrudController {
148
+
149
+ @GetMapping("/items")
150
+ public List<Item> list() { return null; }
151
+
152
+ @GetMapping("/items/{id}")
153
+ public Item get(@PathVariable Long id) { return null; }
154
+
155
+ @PostMapping("/items")
156
+ public Item create(@RequestBody Item item) { return null; }
157
+
158
+ @PutMapping("/items/{id}")
159
+ public Item update(@PathVariable Long id, @RequestBody Item item) { return null; }
160
+
161
+ @DeleteMapping("/items/{id}")
162
+ public void delete(@PathVariable Long id) { }
163
+ }
164
+ `;
165
+
166
+ const tools = await extractor.extract(code, 'CrudController.java');
167
+
168
+ expect(tools.length).toBe(5);
169
+ });
170
+ });
171
+
172
+ describe('JAX-RS endpoints', () => {
173
+ it('should extract JAX-RS @Path and @GET', async () => {
174
+ const code = `
175
+ package com.example.resource;
176
+
177
+ import javax.ws.rs.*;
178
+
179
+ @Path("/users")
180
+ public class UserResource {
181
+
182
+ @GET
183
+ @Path("/{id}")
184
+ public User getUser(@PathParam("id") String id) {
185
+ return userService.findById(id);
186
+ }
187
+ }
188
+ `;
189
+
190
+ const tools = await extractor.extract(code, 'UserResource.java');
191
+
192
+ expect(tools.length).toBeGreaterThan(0);
193
+ const tool = tools.find(t => t.name.includes('users'));
194
+ expect(tool).toBeDefined();
195
+ expect(tool?.inputSchema.properties).toHaveProperty('id');
196
+ });
197
+
198
+ it('should extract @QueryParam', async () => {
199
+ const code = `
200
+ package com.example.resource;
201
+
202
+ import javax.ws.rs.*;
203
+
204
+ @Path("/search")
205
+ public class SearchResource {
206
+
207
+ @GET
208
+ public List<Result> search(
209
+ @QueryParam("q") String query,
210
+ @QueryParam("page") Integer page
211
+ ) {
212
+ return searchService.search(query, page);
213
+ }
214
+ }
215
+ `;
216
+
217
+ const tools = await extractor.extract(code, 'SearchResource.java');
218
+
219
+ const tool = tools.find(t => t.name.includes('search'));
220
+ expect(tool?.inputSchema.properties).toHaveProperty('query');
221
+ expect(tool?.inputSchema.properties).toHaveProperty('page');
222
+ });
223
+
224
+ it('should extract @POST with request body', async () => {
225
+ const code = `
226
+ package com.example.resource;
227
+
228
+ import javax.ws.rs.*;
229
+
230
+ @Path("/items")
231
+ public class ItemResource {
232
+
233
+ @POST
234
+ public Item createItem(CreateItemDto dto) {
235
+ return itemService.create(dto);
236
+ }
237
+ }
238
+ `;
239
+
240
+ const tools = await extractor.extract(code, 'ItemResource.java');
241
+
242
+ expect(tools.some(t => t.name.includes('post'))).toBe(true);
243
+ });
244
+ });
245
+
246
+ describe('Micronaut endpoints', () => {
247
+ it('should extract Micronaut @Controller routes', async () => {
248
+ const code = `
249
+ package com.example.controller;
250
+
251
+ import io.micronaut.http.annotation.*;
252
+
253
+ @Controller("/api")
254
+ public class ApiController {
255
+
256
+ @Get("/health")
257
+ public String health() {
258
+ return "OK";
259
+ }
260
+
261
+ @Post("/data")
262
+ public Data saveData(@Body DataDto dto) {
263
+ return dataService.save(dto);
264
+ }
265
+ }
266
+ `;
267
+
268
+ const tools = await extractor.extract(code, 'ApiController.java');
269
+
270
+ expect(tools.length).toBeGreaterThan(0);
271
+ expect(tools.some(t => t.name.includes('health'))).toBe(true);
272
+ expect(tools.some(t => t.name.includes('data'))).toBe(true);
273
+ });
274
+ });
275
+
276
+ describe('Public methods with Javadoc', () => {
277
+ it('should extract public methods with Javadoc', async () => {
278
+ const code = `
279
+ package com.example.service;
280
+
281
+ public class CalculatorService {
282
+
283
+ /**
284
+ * Adds two numbers together.
285
+ *
286
+ * @param a First number
287
+ * @param b Second number
288
+ * @return Sum of a and b
289
+ */
290
+ public int add(int a, int b) {
291
+ return a + b;
292
+ }
293
+ }
294
+ `;
295
+
296
+ const tools = await extractor.extract(code, 'CalculatorService.java');
297
+
298
+ expect(tools.length).toBeGreaterThan(0);
299
+ const tool = tools.find(t => t.name === 'add');
300
+ expect(tool).toBeDefined();
301
+ expect(tool?.description).toContain('Adds two numbers');
302
+ });
303
+
304
+ it('should parse @param tags', async () => {
305
+ const code = `
306
+ package com.example.service;
307
+
308
+ public class UserService {
309
+
310
+ /**
311
+ * Find a user by their email address.
312
+ *
313
+ * @param email The email address to search for
314
+ * @return The user if found
315
+ * @throws UserNotFoundException if no user exists
316
+ */
317
+ public User findByEmail(String email) {
318
+ return userRepository.findByEmail(email);
319
+ }
320
+ }
321
+ `;
322
+
323
+ const tools = await extractor.extract(code, 'UserService.java');
324
+
325
+ const tool = tools.find(t => t.name.includes('email') || t.name === 'find_by_email');
326
+ if (tool) {
327
+ expect(tool.inputSchema.properties.email?.description).toContain('email');
328
+ }
329
+ });
330
+
331
+ it('should skip methods without Javadoc', async () => {
332
+ const code = `
333
+ package com.example.service;
334
+
335
+ public class Service {
336
+
337
+ // Simple comment, not Javadoc
338
+ public void methodWithoutJavadoc() {
339
+ }
340
+
341
+ /**
342
+ * This method has Javadoc.
343
+ */
344
+ public void methodWithJavadoc() {
345
+ }
346
+ }
347
+ `;
348
+
349
+ const tools = await extractor.extract(code, 'Service.java');
350
+
351
+ // Should only have the method with Javadoc
352
+ expect(tools.every(t => t.name !== 'method_without_javadoc')).toBe(true);
353
+ });
354
+
355
+ it('should skip annotated endpoints in public method extraction', async () => {
356
+ const code = `
357
+ package com.example.controller;
358
+
359
+ import org.springframework.web.bind.annotation.*;
360
+
361
+ @RestController
362
+ public class Controller {
363
+
364
+ /**
365
+ * Get all items.
366
+ */
367
+ @GetMapping("/items")
368
+ public List<Item> getItems() {
369
+ return items;
370
+ }
371
+ }
372
+ `;
373
+
374
+ const tools = await extractor.extract(code, 'Controller.java');
375
+
376
+ // Should not have duplicate tools for the same method
377
+ const itemTools = tools.filter(t => t.name.includes('items') || t.name === 'get_items');
378
+ expect(itemTools.length).toBeLessThanOrEqual(1);
379
+ });
380
+ });
381
+
382
+ describe('Type conversion', () => {
383
+ it('should convert Java types to JSON schema types', async () => {
384
+ const code = `
385
+ package com.example.service;
386
+
387
+ public class TypeService {
388
+
389
+ /**
390
+ * Process various types.
391
+ */
392
+ public void process(
393
+ String name,
394
+ int count,
395
+ Integer nullableCount,
396
+ boolean enabled,
397
+ List<String> items,
398
+ Map<String, Object> config
399
+ ) {
400
+ }
401
+ }
402
+ `;
403
+
404
+ const tools = await extractor.extract(code, 'TypeService.java');
405
+
406
+ const tool = tools.find(t => t.name === 'process');
407
+ if (tool) {
408
+ expect(tool.inputSchema.properties.name?.type).toBe('string');
409
+ expect(tool.inputSchema.properties.count?.type).toBe('integer');
410
+ expect(tool.inputSchema.properties.enabled?.type).toBe('boolean');
411
+ expect(tool.inputSchema.properties.items?.type).toBe('array');
412
+ expect(tool.inputSchema.properties.config?.type).toBe('object');
413
+ }
414
+ });
415
+
416
+ it('should handle generic types', async () => {
417
+ const code = `
418
+ package com.example.service;
419
+
420
+ public class GenericService {
421
+
422
+ /**
423
+ * Get optional value.
424
+ */
425
+ public void processOptional(Optional<String> value) {
426
+ }
427
+ }
428
+ `;
429
+
430
+ const tools = await extractor.extract(code, 'GenericService.java');
431
+
432
+ const tool = tools.find(t => t.name.includes('optional') || t.name === 'process_optional');
433
+ if (tool) {
434
+ // Optional<String> should be converted to string
435
+ expect(tool.inputSchema.properties.value?.type).toBe('string');
436
+ }
437
+ });
438
+ });
439
+
440
+ describe('Path parameter extraction', () => {
441
+ it('should extract path parameters from Spring', async () => {
442
+ const code = `
443
+ package com.example.controller;
444
+
445
+ import org.springframework.web.bind.annotation.*;
446
+
447
+ @RestController
448
+ public class Controller {
449
+
450
+ @GetMapping("/users/{userId}/posts/{postId}")
451
+ public Post getPost(
452
+ @PathVariable String userId,
453
+ @PathVariable String postId
454
+ ) {
455
+ return null;
456
+ }
457
+ }
458
+ `;
459
+
460
+ const tools = await extractor.extract(code, 'Controller.java');
461
+
462
+ const tool = tools[0];
463
+ expect(tool?.inputSchema.properties).toHaveProperty('userId');
464
+ expect(tool?.inputSchema.properties).toHaveProperty('postId');
465
+ expect(tool?.inputSchema.required).toContain('userId');
466
+ expect(tool?.inputSchema.required).toContain('postId');
467
+ });
468
+
469
+ it('should extract path parameters from JAX-RS', async () => {
470
+ const code = `
471
+ package com.example.resource;
472
+
473
+ import javax.ws.rs.*;
474
+
475
+ @Path("/orders/{orderId}")
476
+ public class OrderResource {
477
+
478
+ @GET
479
+ @Path("/items/{itemId}")
480
+ public Item getItem(
481
+ @PathParam("orderId") String orderId,
482
+ @PathParam("itemId") String itemId
483
+ ) {
484
+ return null;
485
+ }
486
+ }
487
+ `;
488
+
489
+ const tools = await extractor.extract(code, 'OrderResource.java');
490
+
491
+ const tool = tools[0];
492
+ expect(tool?.inputSchema.properties).toHaveProperty('orderId');
493
+ expect(tool?.inputSchema.properties).toHaveProperty('itemId');
494
+ });
495
+ });
496
+ });
497
+ });