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,236 @@
1
+ /**
2
+ * Tests for FastAPI analyzer
3
+ */
4
+ import { describe, it, expect, beforeAll } from 'vitest';
5
+ import { FastAPIAnalyzer } from '../../src/generators/fastapi-analyzer.js';
6
+ import { FileContent } from '../../src/generators/types.js';
7
+ import { promises as fs } from 'fs';
8
+ import path from 'path';
9
+
10
+ describe('FastAPIAnalyzer', () => {
11
+ let analyzer: FastAPIAnalyzer;
12
+ let fixtureFiles: FileContent[];
13
+
14
+ beforeAll(async () => {
15
+ analyzer = new FastAPIAnalyzer();
16
+
17
+ // Load fixture files
18
+ const fixturesPath = path.join(__dirname, '../../../tests/fixtures/fastapi-app');
19
+
20
+ const mainContent = await fs.readFile(
21
+ path.join(fixturesPath, 'main.py'),
22
+ 'utf-8'
23
+ );
24
+ const adminContent = await fs.readFile(
25
+ path.join(fixturesPath, 'routes/admin.py'),
26
+ 'utf-8'
27
+ );
28
+
29
+ fixtureFiles = [
30
+ { path: 'main.py', content: mainContent, language: 'python' },
31
+ { path: 'routes/admin.py', content: adminContent, language: 'python' },
32
+ ];
33
+ });
34
+
35
+ describe('canAnalyze', () => {
36
+ it('should detect FastAPI code', () => {
37
+ const files: FileContent[] = [
38
+ { path: 'main.py', content: 'from fastapi import FastAPI\napp = FastAPI()' },
39
+ ];
40
+ expect(analyzer.canAnalyze(files)).toBe(true);
41
+ });
42
+
43
+ it('should detect Flask code', () => {
44
+ const files: FileContent[] = [
45
+ { path: 'app.py', content: 'from flask import Flask\napp = Flask(__name__)' },
46
+ ];
47
+ expect(analyzer.canAnalyze(files)).toBe(true);
48
+ });
49
+
50
+ it('should detect FastAPI decorators', () => {
51
+ const files: FileContent[] = [
52
+ { path: 'routes.py', content: '@app.get("/users")\nasync def get_users():' },
53
+ ];
54
+ expect(analyzer.canAnalyze(files)).toBe(true);
55
+ });
56
+
57
+ it('should not match non-Python API code', () => {
58
+ const files: FileContent[] = [
59
+ { path: 'utils.py', content: 'def helper():\n return 42' },
60
+ ];
61
+ expect(analyzer.canAnalyze(files)).toBe(false);
62
+ });
63
+ });
64
+
65
+ describe('analyze', () => {
66
+ it('should extract routes from FastAPI files', async () => {
67
+ const result = await analyzer.analyze(fixtureFiles);
68
+
69
+ expect(result.framework).toBe('fastapi');
70
+ expect(result.routes.length).toBeGreaterThan(0);
71
+ expect(result.filesAnalyzed.length).toBeGreaterThan(0);
72
+ });
73
+
74
+ it('should extract user routes', async () => {
75
+ const result = await analyzer.analyze(fixtureFiles);
76
+
77
+ const userRoutes = result.routes.filter(r => r.path.includes('/users'));
78
+ expect(userRoutes.length).toBeGreaterThan(0);
79
+
80
+ // Check GET /users exists
81
+ const listUsersRoute = userRoutes.find(
82
+ r => r.method === 'get' && r.path === '/users'
83
+ );
84
+ expect(listUsersRoute).toBeDefined();
85
+ expect(listUsersRoute?.tags).toContain('Users');
86
+ });
87
+
88
+ it('should extract path parameters', async () => {
89
+ const result = await analyzer.analyze(fixtureFiles);
90
+
91
+ const getUserByIdRoute = result.routes.find(
92
+ r => r.method === 'get' && r.path === '/users/{user_id}'
93
+ );
94
+
95
+ expect(getUserByIdRoute).toBeDefined();
96
+ expect(getUserByIdRoute?.pathParameters).toHaveLength(1);
97
+ expect(getUserByIdRoute?.pathParameters[0].name).toBe('user_id');
98
+ });
99
+
100
+ it('should extract Pydantic models as schemas', async () => {
101
+ const result = await analyzer.analyze(fixtureFiles);
102
+
103
+ expect(Object.keys(result.schemas).length).toBeGreaterThan(0);
104
+ expect(result.schemas['UserCreate']).toBeDefined();
105
+ expect(result.schemas['UserResponse']).toBeDefined();
106
+ });
107
+
108
+ it('should extract query parameters', async () => {
109
+ const result = await analyzer.analyze(fixtureFiles);
110
+
111
+ const listUsersRoute = result.routes.find(
112
+ r => r.method === 'get' && r.path === '/users'
113
+ );
114
+
115
+ expect(listUsersRoute?.queryParameters.length).toBeGreaterThan(0);
116
+ const skipParam = listUsersRoute?.queryParameters.find(p => p.name === 'skip');
117
+ expect(skipParam).toBeDefined();
118
+ });
119
+
120
+ it('should detect deprecated endpoints', async () => {
121
+ const result = await analyzer.analyze(fixtureFiles);
122
+
123
+ const deprecatedRoute = result.routes.find(
124
+ r => r.path.includes('/maintenance')
125
+ );
126
+
127
+ expect(deprecatedRoute?.deprecated).toBe(true);
128
+ });
129
+
130
+ it('should extract admin routes', async () => {
131
+ const result = await analyzer.analyze(fixtureFiles);
132
+
133
+ const adminRoutes = result.routes.filter(r => r.path.includes('/admin'));
134
+ expect(adminRoutes.length).toBeGreaterThan(0);
135
+ });
136
+ });
137
+
138
+ describe('inline code analysis', () => {
139
+ it('should parse FastAPI decorator patterns', async () => {
140
+ const files: FileContent[] = [
141
+ {
142
+ path: 'api.py',
143
+ content: `
144
+ from fastapi import FastAPI
145
+
146
+ app = FastAPI()
147
+
148
+ @app.get("/items")
149
+ async def list_items():
150
+ """List all items."""
151
+ return []
152
+
153
+ @app.post("/items", status_code=201)
154
+ async def create_item(item: dict):
155
+ """Create a new item."""
156
+ return item
157
+
158
+ @app.delete("/items/{item_id}")
159
+ async def delete_item(item_id: str):
160
+ """Delete an item."""
161
+ pass
162
+ `,
163
+ language: 'python',
164
+ },
165
+ ];
166
+
167
+ const result = await analyzer.analyze(files);
168
+
169
+ expect(result.routes.length).toBe(3);
170
+ expect(result.routes.map(r => r.method)).toContain('get');
171
+ expect(result.routes.map(r => r.method)).toContain('post');
172
+ expect(result.routes.map(r => r.method)).toContain('delete');
173
+ });
174
+
175
+ it('should extract docstrings as descriptions', async () => {
176
+ const files: FileContent[] = [
177
+ {
178
+ path: 'api.py',
179
+ content: `
180
+ from fastapi import FastAPI
181
+ app = FastAPI()
182
+
183
+ @app.get("/test")
184
+ async def test_endpoint():
185
+ """
186
+ This is a test endpoint.
187
+
188
+ It returns a simple message.
189
+ """
190
+ return {"message": "test"}
191
+ `,
192
+ language: 'python',
193
+ },
194
+ ];
195
+
196
+ const result = await analyzer.analyze(files);
197
+
198
+ expect(result.routes[0].summary).toBeDefined();
199
+ });
200
+ });
201
+
202
+ describe('Pydantic model parsing', () => {
203
+ it('should parse Pydantic models correctly', async () => {
204
+ const files: FileContent[] = [
205
+ {
206
+ path: 'models.py',
207
+ content: `
208
+ from pydantic import BaseModel
209
+ from typing import Optional, List
210
+
211
+ class Item(BaseModel):
212
+ name: str
213
+ price: float
214
+ tags: List[str] = []
215
+ description: Optional[str] = None
216
+
217
+ @app.post("/items")
218
+ async def create_item(item: Item):
219
+ return item
220
+ `,
221
+ language: 'python',
222
+ },
223
+ ];
224
+
225
+ const result = await analyzer.analyze(files);
226
+
227
+ expect(result.schemas['Item']).toBeDefined();
228
+ const itemSchema = result.schemas['Item'];
229
+ expect(itemSchema.type).toBe('object');
230
+ expect(itemSchema.properties?.name).toBeDefined();
231
+ expect(itemSchema.properties?.price).toBeDefined();
232
+ expect(itemSchema.required).toContain('name');
233
+ expect(itemSchema.required).toContain('price');
234
+ });
235
+ });
236
+ });
@@ -0,0 +1,273 @@
1
+ /**
2
+ * Tests for Next.js analyzer
3
+ */
4
+ import { describe, it, expect, beforeAll } from 'vitest';
5
+ import { NextJSAnalyzer } from '../../src/generators/nextjs-analyzer.js';
6
+ import { FileContent } from '../../src/generators/types.js';
7
+ import { promises as fs } from 'fs';
8
+ import path from 'path';
9
+
10
+ describe('NextJSAnalyzer', () => {
11
+ let analyzer: NextJSAnalyzer;
12
+ let fixtureFiles: FileContent[];
13
+
14
+ beforeAll(async () => {
15
+ analyzer = new NextJSAnalyzer();
16
+
17
+ // Load fixture files
18
+ const fixturesPath = path.join(__dirname, '../../../tests/fixtures/nextjs-app');
19
+
20
+ const usersRouteContent = await fs.readFile(
21
+ path.join(fixturesPath, 'app/api/users/route.ts'),
22
+ 'utf-8'
23
+ );
24
+ const userByIdRouteContent = await fs.readFile(
25
+ path.join(fixturesPath, 'app/api/users/[id]/route.ts'),
26
+ 'utf-8'
27
+ );
28
+ const postsRouteContent = await fs.readFile(
29
+ path.join(fixturesPath, 'app/api/posts/route.ts'),
30
+ 'utf-8'
31
+ );
32
+ const healthContent = await fs.readFile(
33
+ path.join(fixturesPath, 'pages/api/health.ts'),
34
+ 'utf-8'
35
+ );
36
+
37
+ fixtureFiles = [
38
+ { path: 'app/api/users/route.ts', content: usersRouteContent, language: 'typescript' },
39
+ { path: 'app/api/users/[id]/route.ts', content: userByIdRouteContent, language: 'typescript' },
40
+ { path: 'app/api/posts/route.ts', content: postsRouteContent, language: 'typescript' },
41
+ { path: 'pages/api/health.ts', content: healthContent, language: 'typescript' },
42
+ ];
43
+ });
44
+
45
+ describe('canAnalyze', () => {
46
+ it('should detect Next.js App Router API routes', () => {
47
+ const files: FileContent[] = [
48
+ {
49
+ path: 'app/api/users/route.ts',
50
+ content: "import { NextRequest, NextResponse } from 'next/server';",
51
+ },
52
+ ];
53
+ expect(analyzer.canAnalyze(files)).toBe(true);
54
+ });
55
+
56
+ it('should detect Next.js Pages Router API routes', () => {
57
+ const files: FileContent[] = [
58
+ {
59
+ path: 'pages/api/hello.ts',
60
+ content: 'export default function handler(req, res) {}',
61
+ },
62
+ ];
63
+ expect(analyzer.canAnalyze(files)).toBe(true);
64
+ });
65
+
66
+ it('should not match non-API files', () => {
67
+ const files: FileContent[] = [
68
+ {
69
+ path: 'app/page.tsx',
70
+ content: 'export default function Page() { return <div>Hello</div>; }',
71
+ },
72
+ ];
73
+ expect(analyzer.canAnalyze(files)).toBe(false);
74
+ });
75
+ });
76
+
77
+ describe('analyze', () => {
78
+ it('should extract routes from Next.js files', async () => {
79
+ const result = await analyzer.analyze(fixtureFiles);
80
+
81
+ expect(result.framework).toBe('nextjs');
82
+ expect(result.routes.length).toBeGreaterThan(0);
83
+ expect(result.filesAnalyzed.length).toBeGreaterThan(0);
84
+ });
85
+
86
+ it('should extract user routes from App Router', async () => {
87
+ const result = await analyzer.analyze(fixtureFiles);
88
+
89
+ const userRoutes = result.routes.filter(r => r.path.includes('/users'));
90
+ expect(userRoutes.length).toBeGreaterThan(0);
91
+
92
+ // Check GET /api/users exists
93
+ const getUsersRoute = userRoutes.find(
94
+ r => r.method === 'get' && r.path === '/api/users'
95
+ );
96
+ expect(getUsersRoute).toBeDefined();
97
+ });
98
+
99
+ it('should extract dynamic route parameters', async () => {
100
+ const result = await analyzer.analyze(fixtureFiles);
101
+
102
+ const getUserByIdRoute = result.routes.find(
103
+ r => r.method === 'get' && r.path.includes('/users/{id}')
104
+ );
105
+
106
+ expect(getUserByIdRoute).toBeDefined();
107
+ expect(getUserByIdRoute?.pathParameters).toHaveLength(1);
108
+ expect(getUserByIdRoute?.pathParameters[0].name).toBe('id');
109
+ });
110
+
111
+ it('should extract multiple HTTP methods from same route file', async () => {
112
+ const result = await analyzer.analyze(fixtureFiles);
113
+
114
+ const usersRoutes = result.routes.filter(r =>
115
+ r.path === '/api/users' && r.sourceFile.includes('app/api/users/route.ts')
116
+ );
117
+
118
+ expect(usersRoutes.length).toBe(2); // GET and POST
119
+ expect(usersRoutes.map(r => r.method)).toContain('get');
120
+ expect(usersRoutes.map(r => r.method)).toContain('post');
121
+ });
122
+
123
+ it('should extract query parameters from searchParams usage', async () => {
124
+ const result = await analyzer.analyze(fixtureFiles);
125
+
126
+ const getUsersRoute = result.routes.find(
127
+ r => r.method === 'get' && r.path === '/api/users'
128
+ );
129
+
130
+ expect(getUsersRoute?.queryParameters.length).toBeGreaterThan(0);
131
+ });
132
+
133
+ it('should detect header parameters', async () => {
134
+ const result = await analyzer.analyze(fixtureFiles);
135
+
136
+ const createPostRoute = result.routes.find(
137
+ r => r.method === 'post' && r.path.includes('/posts')
138
+ );
139
+
140
+ expect(createPostRoute?.headerParameters.length).toBeGreaterThan(0);
141
+ expect(
142
+ createPostRoute?.headerParameters.some(p => p.name.toLowerCase() === 'authorization')
143
+ ).toBe(true);
144
+ });
145
+
146
+ it('should handle Pages Router routes', async () => {
147
+ const result = await analyzer.analyze(fixtureFiles);
148
+
149
+ const healthRoute = result.routes.find(r => r.path.includes('/health'));
150
+ expect(healthRoute).toBeDefined();
151
+ });
152
+ });
153
+
154
+ describe('inline code analysis', () => {
155
+ it('should parse export async function patterns', async () => {
156
+ const files: FileContent[] = [
157
+ {
158
+ path: 'app/api/items/route.ts',
159
+ content: `
160
+ import { NextRequest, NextResponse } from 'next/server';
161
+
162
+ export async function GET(request: NextRequest) {
163
+ return NextResponse.json({ items: [] });
164
+ }
165
+
166
+ export async function POST(request: NextRequest) {
167
+ const body = await request.json();
168
+ return NextResponse.json(body, { status: 201 });
169
+ }
170
+ `,
171
+ language: 'typescript',
172
+ },
173
+ ];
174
+
175
+ const result = await analyzer.analyze(files);
176
+
177
+ expect(result.routes.length).toBe(2);
178
+ expect(result.routes.map(r => r.method)).toContain('get');
179
+ expect(result.routes.map(r => r.method)).toContain('post');
180
+ });
181
+
182
+ it('should parse export const arrow function patterns', async () => {
183
+ const files: FileContent[] = [
184
+ {
185
+ path: 'app/api/data/route.ts',
186
+ content: `
187
+ import { NextResponse } from 'next/server';
188
+
189
+ export const GET = async () => {
190
+ return NextResponse.json({ data: [] });
191
+ };
192
+
193
+ export const PUT = async (request) => {
194
+ return NextResponse.json({});
195
+ };
196
+ `,
197
+ language: 'typescript',
198
+ },
199
+ ];
200
+
201
+ const result = await analyzer.analyze(files);
202
+
203
+ expect(result.routes.length).toBe(2);
204
+ expect(result.routes.map(r => r.method)).toContain('get');
205
+ expect(result.routes.map(r => r.method)).toContain('put');
206
+ });
207
+ });
208
+
209
+ describe('path conversion', () => {
210
+ it('should convert [param] to {param}', async () => {
211
+ const files: FileContent[] = [
212
+ {
213
+ path: 'app/api/users/[userId]/posts/[postId]/route.ts',
214
+ content: `
215
+ export async function GET() {
216
+ return Response.json({});
217
+ }
218
+ `,
219
+ language: 'typescript',
220
+ },
221
+ ];
222
+
223
+ const result = await analyzer.analyze(files);
224
+
225
+ expect(result.routes[0].openApiPath).toBe('/api/users/{userId}/posts/{postId}');
226
+ });
227
+
228
+ it('should handle catch-all routes', async () => {
229
+ const files: FileContent[] = [
230
+ {
231
+ path: 'app/api/[...slug]/route.ts',
232
+ content: `
233
+ export async function GET() {
234
+ return Response.json({});
235
+ }
236
+ `,
237
+ language: 'typescript',
238
+ },
239
+ ];
240
+
241
+ const result = await analyzer.analyze(files);
242
+
243
+ expect(result.routes[0].openApiPath).toBe('/api/{slug}');
244
+ });
245
+ });
246
+
247
+ describe('response inference', () => {
248
+ it('should extract status codes from NextResponse.json', async () => {
249
+ const files: FileContent[] = [
250
+ {
251
+ path: 'app/api/test/route.ts',
252
+ content: `
253
+ import { NextResponse } from 'next/server';
254
+
255
+ export async function POST() {
256
+ if (error) {
257
+ return NextResponse.json({ error: 'Bad request' }, { status: 400 });
258
+ }
259
+ return NextResponse.json({ id: '123' }, { status: 201 });
260
+ }
261
+ `,
262
+ language: 'typescript',
263
+ },
264
+ ];
265
+
266
+ const result = await analyzer.analyze(files);
267
+
268
+ const route = result.routes[0];
269
+ expect(route.responses.some(r => r.statusCode === 201)).toBe(true);
270
+ expect(route.responses.some(r => r.statusCode === 400)).toBe(true);
271
+ });
272
+ });
273
+ });