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,676 @@
1
+ /**
2
+ * One Click Install Component - Platform-specific installation instructions
3
+ * @copyright 2024-2026 nirholas
4
+ * @license MIT
5
+ */
6
+
7
+ 'use client';
8
+
9
+ import { useState, useEffect, useMemo, useCallback } from 'react';
10
+ import { motion, AnimatePresence } from 'framer-motion';
11
+ import {
12
+ Download,
13
+ Copy,
14
+ Check,
15
+ Terminal,
16
+ Laptop,
17
+ Apple,
18
+ MonitorSmartphone,
19
+ ChevronRight,
20
+ AlertCircle,
21
+ Info,
22
+ ExternalLink,
23
+ Play,
24
+ Zap,
25
+ Package,
26
+ Settings,
27
+ Shield,
28
+ RefreshCw,
29
+ } from 'lucide-react';
30
+ import type {
31
+ InstallPlatform,
32
+ InstallInstructions,
33
+ InstallStep,
34
+ PlatformDetection,
35
+ ConversionResult,
36
+ } from '@/types';
37
+
38
+ interface OneClickInstallProps {
39
+ result: ConversionResult;
40
+ serverName?: string;
41
+ onInstallStart?: () => void;
42
+ }
43
+
44
+ const PLATFORM_ICONS: Record<InstallPlatform, typeof Laptop> = {
45
+ 'macos': Apple,
46
+ 'windows': MonitorSmartphone,
47
+ 'linux': Terminal,
48
+ 'docker': Package,
49
+ };
50
+
51
+ const PLATFORM_NAMES: Record<InstallPlatform, string> = {
52
+ 'macos': 'macOS',
53
+ 'windows': 'Windows',
54
+ 'linux': 'Linux',
55
+ 'docker': 'Docker',
56
+ };
57
+
58
+ const PLATFORM_COLORS: Record<InstallPlatform, string> = {
59
+ 'macos': 'from-gray-500/20 to-gray-600/10',
60
+ 'windows': 'from-blue-500/20 to-blue-600/10',
61
+ 'linux': 'from-orange-500/20 to-orange-600/10',
62
+ 'docker': 'from-cyan-500/20 to-cyan-600/10',
63
+ };
64
+
65
+ export default function OneClickInstall({
66
+ result,
67
+ serverName = 'mcp-server',
68
+ onInstallStart,
69
+ }: OneClickInstallProps) {
70
+ const [detectedPlatform, setDetectedPlatform] = useState<PlatformDetection | null>(null);
71
+ const [selectedPlatform, setSelectedPlatform] = useState<InstallPlatform>('macos');
72
+ const [currentStep, setCurrentStep] = useState(0);
73
+ const [copiedCommand, setCopiedCommand] = useState<string | null>(null);
74
+ const [expandedStep, setExpandedStep] = useState<number | null>(0);
75
+ const [isDetecting, setIsDetecting] = useState(true);
76
+
77
+ const sanitizedServerName = useMemo(() =>
78
+ serverName.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/--+/g, '-'),
79
+ [serverName]
80
+ );
81
+
82
+ // Detect platform on mount
83
+ useEffect(() => {
84
+ const detectPlatform = async () => {
85
+ setIsDetecting(true);
86
+
87
+ try {
88
+ // Check navigator.userAgent
89
+ const ua = navigator.userAgent.toLowerCase();
90
+ let os: InstallPlatform = 'linux';
91
+
92
+ if (ua.includes('mac')) {
93
+ os = 'macos';
94
+ } else if (ua.includes('win')) {
95
+ os = 'windows';
96
+ } else if (ua.includes('linux')) {
97
+ os = 'linux';
98
+ }
99
+
100
+ // Check for Node.js (via API endpoint if available)
101
+ let nodeVersion: string | undefined;
102
+ let npmVersion: string | undefined;
103
+ let hasDocker = false;
104
+ let hasPython = false;
105
+
106
+ // Simulate detection (in real app, would hit an API)
107
+ const detection: PlatformDetection = {
108
+ os,
109
+ arch: navigator.userAgent.includes('arm') || navigator.userAgent.includes('ARM')
110
+ ? 'arm64'
111
+ : 'x64',
112
+ nodeVersion: '20.x', // Assume modern versions
113
+ npmVersion: '10.x',
114
+ hasDocker: true,
115
+ hasPython: true,
116
+ pythonVersion: '3.11',
117
+ };
118
+
119
+ setDetectedPlatform(detection);
120
+ setSelectedPlatform(os);
121
+ } catch (error) {
122
+ console.error('Platform detection failed:', error);
123
+ setDetectedPlatform({ os: 'linux', arch: 'x64' });
124
+ setSelectedPlatform('linux');
125
+ } finally {
126
+ setIsDetecting(false);
127
+ }
128
+ };
129
+
130
+ detectPlatform();
131
+ }, []);
132
+
133
+ // Generate instructions for each platform
134
+ const instructions: Record<InstallPlatform, InstallInstructions> = useMemo(() => {
135
+ const repoUrl = result.repository.url;
136
+ const repoName = result.repository.name;
137
+
138
+ return {
139
+ macos: {
140
+ platform: 'macos',
141
+ title: 'Install on macOS',
142
+ description: 'One-click installation using Homebrew or direct download',
143
+ prerequisites: [
144
+ 'macOS 12 or later',
145
+ 'Node.js 18+ or Python 3.9+',
146
+ 'Homebrew (recommended)',
147
+ ],
148
+ steps: [
149
+ {
150
+ title: 'Install with npx (Recommended)',
151
+ description: 'Run the MCP server directly without installation',
152
+ command: `npx @github-to-mcp/${sanitizedServerName}`,
153
+ isOptional: false,
154
+ },
155
+ {
156
+ title: 'Or install globally',
157
+ description: 'Install the server for persistent use',
158
+ command: `npm install -g @github-to-mcp/${sanitizedServerName}`,
159
+ isOptional: true,
160
+ },
161
+ {
162
+ title: 'Configure Claude Desktop',
163
+ description: 'Add to your Claude configuration',
164
+ command: `# Add to ~/Library/Application Support/Claude/claude_desktop_config.json
165
+ {
166
+ "mcpServers": {
167
+ "${sanitizedServerName}": {
168
+ "command": "npx",
169
+ "args": ["@github-to-mcp/${sanitizedServerName}"]
170
+ }
171
+ }
172
+ }`,
173
+ isOptional: false,
174
+ },
175
+ {
176
+ title: 'Restart Claude Desktop',
177
+ description: 'Restart to apply changes',
178
+ command: 'killall Claude && open -a Claude',
179
+ isOptional: false,
180
+ },
181
+ ],
182
+ estimatedTime: '2 minutes',
183
+ },
184
+ windows: {
185
+ platform: 'windows',
186
+ title: 'Install on Windows',
187
+ description: 'Installation via npm or chocolatey',
188
+ prerequisites: [
189
+ 'Windows 10/11',
190
+ 'Node.js 18+ (LTS)',
191
+ 'PowerShell or Windows Terminal',
192
+ ],
193
+ steps: [
194
+ {
195
+ title: 'Install with npx (Recommended)',
196
+ description: 'Run the MCP server directly',
197
+ command: `npx @github-to-mcp/${sanitizedServerName}`,
198
+ isOptional: false,
199
+ },
200
+ {
201
+ title: 'Or install globally',
202
+ description: 'Install for persistent use',
203
+ command: `npm install -g @github-to-mcp/${sanitizedServerName}`,
204
+ isOptional: true,
205
+ },
206
+ {
207
+ title: 'Configure Claude Desktop',
208
+ description: 'Add to your Claude configuration',
209
+ command: `# Add to %APPDATA%\\Claude\\claude_desktop_config.json
210
+ {
211
+ "mcpServers": {
212
+ "${sanitizedServerName}": {
213
+ "command": "npx",
214
+ "args": ["@github-to-mcp/${sanitizedServerName}"]
215
+ }
216
+ }
217
+ }`,
218
+ isOptional: false,
219
+ },
220
+ {
221
+ title: 'Restart Claude Desktop',
222
+ description: 'Restart to apply changes',
223
+ command: 'taskkill /IM Claude.exe /F && start Claude',
224
+ isOptional: false,
225
+ },
226
+ ],
227
+ estimatedTime: '3 minutes',
228
+ },
229
+ linux: {
230
+ platform: 'linux',
231
+ title: 'Install on Linux',
232
+ description: 'Installation via npm or direct clone',
233
+ prerequisites: [
234
+ 'Ubuntu 20.04+, Debian, Fedora, or similar',
235
+ 'Node.js 18+ or Python 3.9+',
236
+ 'Terminal access',
237
+ ],
238
+ steps: [
239
+ {
240
+ title: 'Install with npx (Recommended)',
241
+ description: 'Run the MCP server directly',
242
+ command: `npx @github-to-mcp/${sanitizedServerName}`,
243
+ isOptional: false,
244
+ },
245
+ {
246
+ title: 'Or clone and build from source',
247
+ description: 'For development or customization',
248
+ command: `git clone ${repoUrl}
249
+ cd ${repoName}
250
+ npm install
251
+ npm run build`,
252
+ isOptional: true,
253
+ },
254
+ {
255
+ title: 'Configure Claude Desktop',
256
+ description: 'Add to your Claude configuration',
257
+ command: `# Add to ~/.config/Claude/claude_desktop_config.json
258
+ {
259
+ "mcpServers": {
260
+ "${sanitizedServerName}": {
261
+ "command": "npx",
262
+ "args": ["@github-to-mcp/${sanitizedServerName}"]
263
+ }
264
+ }
265
+ }`,
266
+ isOptional: false,
267
+ },
268
+ {
269
+ title: 'Run as systemd service (optional)',
270
+ description: 'For persistent background operation',
271
+ command: `# Create service file
272
+ sudo tee /etc/systemd/system/${sanitizedServerName}.service << EOF
273
+ [Unit]
274
+ Description=${sanitizedServerName} MCP Server
275
+ After=network.target
276
+
277
+ [Service]
278
+ Type=simple
279
+ User=$USER
280
+ ExecStart=/usr/bin/npx @github-to-mcp/${sanitizedServerName}
281
+ Restart=on-failure
282
+
283
+ [Install]
284
+ WantedBy=multi-user.target
285
+ EOF
286
+
287
+ sudo systemctl daemon-reload
288
+ sudo systemctl enable ${sanitizedServerName}
289
+ sudo systemctl start ${sanitizedServerName}`,
290
+ isOptional: true,
291
+ },
292
+ ],
293
+ estimatedTime: '3 minutes',
294
+ },
295
+ docker: {
296
+ platform: 'docker',
297
+ title: 'Run with Docker',
298
+ description: 'Containerized deployment for isolation',
299
+ prerequisites: [
300
+ 'Docker 20.10+',
301
+ 'Docker Compose (optional)',
302
+ ],
303
+ steps: [
304
+ {
305
+ title: 'Pull and run container',
306
+ description: 'One-command deployment',
307
+ command: `docker run -d --name ${sanitizedServerName} \\
308
+ -p 3000:3000 \\
309
+ ghcr.io/github-to-mcp/${sanitizedServerName}:latest`,
310
+ isOptional: false,
311
+ },
312
+ {
313
+ title: 'Or build from Dockerfile',
314
+ description: 'Build locally with customizations',
315
+ command: `# Using the exported Dockerfile
316
+ docker build -t ${sanitizedServerName}:latest .
317
+ docker run -d --name ${sanitizedServerName} -p 3000:3000 ${sanitizedServerName}:latest`,
318
+ isOptional: true,
319
+ },
320
+ {
321
+ title: 'Using Docker Compose',
322
+ description: 'For multi-service setups',
323
+ command: `# Using the exported docker-compose.yml
324
+ docker-compose up -d`,
325
+ isOptional: true,
326
+ },
327
+ {
328
+ title: 'Configure Claude for Docker',
329
+ description: 'Point Claude to containerized server',
330
+ command: `{
331
+ "mcpServers": {
332
+ "${sanitizedServerName}": {
333
+ "command": "docker",
334
+ "args": ["exec", "-i", "${sanitizedServerName}", "node", "dist/index.js"]
335
+ }
336
+ }
337
+ }`,
338
+ isOptional: false,
339
+ },
340
+ ],
341
+ estimatedTime: '2 minutes',
342
+ },
343
+ };
344
+ }, [result, sanitizedServerName]);
345
+
346
+ const currentInstructions = instructions[selectedPlatform];
347
+
348
+ const copyToClipboard = useCallback(async (text: string, stepIndex: number) => {
349
+ // Strip comments from command before copying
350
+ const cleanCommand = text.split('\n')
351
+ .filter(line => !line.trim().startsWith('#'))
352
+ .join('\n')
353
+ .trim();
354
+
355
+ await navigator.clipboard.writeText(cleanCommand);
356
+ setCopiedCommand(`${selectedPlatform}-${stepIndex}`);
357
+ setTimeout(() => setCopiedCommand(null), 2000);
358
+ }, [selectedPlatform]);
359
+
360
+ const handleStartInstall = useCallback(() => {
361
+ setCurrentStep(0);
362
+ setExpandedStep(0);
363
+ onInstallStart?.();
364
+ }, [onInstallStart]);
365
+
366
+ const markStepComplete = useCallback((stepIndex: number) => {
367
+ setCurrentStep(prev => Math.max(prev, stepIndex + 1));
368
+ setExpandedStep(stepIndex + 1);
369
+ }, []);
370
+
371
+ const PlatformIcon = PLATFORM_ICONS[selectedPlatform];
372
+
373
+ return (
374
+ <div className="space-y-6">
375
+ {/* Header with platform detection */}
376
+ <motion.div
377
+ initial={{ opacity: 0, y: 20 }}
378
+ animate={{ opacity: 1, y: 0 }}
379
+ className="rounded-xl border border-neutral-800 bg-neutral-900/50 backdrop-blur-xl overflow-hidden"
380
+ >
381
+ <div className={`p-6 bg-gradient-to-br ${PLATFORM_COLORS[selectedPlatform]}`}>
382
+ <div className="flex items-start justify-between">
383
+ <div className="flex items-center gap-4">
384
+ <div className="w-14 h-14 rounded-2xl bg-white/10 border border-white/20 flex items-center justify-center">
385
+ <PlatformIcon className="w-7 h-7 text-white" />
386
+ </div>
387
+ <div>
388
+ <h2 className="text-xl font-semibold text-white">
389
+ {currentInstructions.title}
390
+ </h2>
391
+ <p className="text-sm text-neutral-300 mt-1">
392
+ {currentInstructions.description}
393
+ </p>
394
+ <div className="flex items-center gap-4 mt-2 text-xs text-neutral-400">
395
+ <span className="flex items-center gap-1">
396
+ <Zap className="w-3 h-3" />
397
+ {currentInstructions.estimatedTime}
398
+ </span>
399
+ <span className="flex items-center gap-1">
400
+ <Package className="w-3 h-3" />
401
+ {result.tools.length} tools
402
+ </span>
403
+ </div>
404
+ </div>
405
+ </div>
406
+
407
+ {isDetecting ? (
408
+ <div className="flex items-center gap-2 text-sm text-neutral-400">
409
+ <RefreshCw className="w-4 h-4 animate-spin" />
410
+ Detecting...
411
+ </div>
412
+ ) : detectedPlatform && (
413
+ <div className="text-right text-sm">
414
+ <div className="text-neutral-400">Detected System</div>
415
+ <div className="text-white font-medium">
416
+ {PLATFORM_NAMES[detectedPlatform.os]} {detectedPlatform.arch}
417
+ </div>
418
+ {detectedPlatform.nodeVersion && (
419
+ <div className="text-xs text-neutral-500">
420
+ Node.js {detectedPlatform.nodeVersion}
421
+ </div>
422
+ )}
423
+ </div>
424
+ )}
425
+ </div>
426
+ </div>
427
+
428
+ {/* Platform tabs */}
429
+ <div className="p-3 border-t border-neutral-800 flex gap-2 overflow-x-auto">
430
+ {(Object.keys(instructions) as InstallPlatform[]).map((platform) => {
431
+ const Icon = PLATFORM_ICONS[platform];
432
+ const isSelected = selectedPlatform === platform;
433
+ const isDetected = detectedPlatform?.os === platform;
434
+
435
+ return (
436
+ <button
437
+ key={platform}
438
+ onClick={() => {
439
+ setSelectedPlatform(platform);
440
+ setCurrentStep(0);
441
+ setExpandedStep(0);
442
+ }}
443
+ className={`flex items-center gap-2 px-4 py-2 rounded-lg text-sm font-medium transition-colors whitespace-nowrap ${
444
+ isSelected
445
+ ? 'bg-white text-black'
446
+ : 'text-neutral-400 hover:text-white hover:bg-white/5'
447
+ }`}
448
+ >
449
+ <Icon className="w-4 h-4" />
450
+ {PLATFORM_NAMES[platform]}
451
+ {isDetected && !isSelected && (
452
+ <span className="w-1.5 h-1.5 rounded-full bg-green-400" />
453
+ )}
454
+ </button>
455
+ );
456
+ })}
457
+ </div>
458
+ </motion.div>
459
+
460
+ {/* Prerequisites */}
461
+ <motion.div
462
+ initial={{ opacity: 0, y: 20 }}
463
+ animate={{ opacity: 1, y: 0 }}
464
+ transition={{ delay: 0.1 }}
465
+ className="rounded-xl border border-neutral-800 bg-neutral-900/50 backdrop-blur-xl p-4"
466
+ >
467
+ <div className="flex items-center gap-2 mb-3">
468
+ <Settings className="w-4 h-4 text-neutral-400" />
469
+ <span className="text-sm font-medium text-white">Prerequisites</span>
470
+ </div>
471
+ <ul className="space-y-2">
472
+ {currentInstructions.prerequisites.map((prereq, index) => (
473
+ <motion.li
474
+ key={index}
475
+ initial={{ opacity: 0, x: -10 }}
476
+ animate={{ opacity: 1, x: 0 }}
477
+ transition={{ delay: index * 0.05 }}
478
+ className="flex items-center gap-2 text-sm text-neutral-400"
479
+ >
480
+ <Check className="w-4 h-4 text-green-400 flex-shrink-0" />
481
+ {prereq}
482
+ </motion.li>
483
+ ))}
484
+ </ul>
485
+ </motion.div>
486
+
487
+ {/* Installation steps */}
488
+ <motion.div
489
+ initial={{ opacity: 0, y: 20 }}
490
+ animate={{ opacity: 1, y: 0 }}
491
+ transition={{ delay: 0.2 }}
492
+ className="space-y-3"
493
+ >
494
+ {currentInstructions.steps.map((step, index) => {
495
+ const isComplete = index < currentStep;
496
+ const isActive = index === currentStep;
497
+ const isExpanded = expandedStep === index;
498
+
499
+ return (
500
+ <motion.div
501
+ key={`${selectedPlatform}-${index}`}
502
+ initial={{ opacity: 0, y: 10 }}
503
+ animate={{ opacity: 1, y: 0 }}
504
+ transition={{ delay: index * 0.05 }}
505
+ className={`rounded-xl border overflow-hidden ${
506
+ isComplete
507
+ ? 'border-green-500/30 bg-green-500/5'
508
+ : isActive
509
+ ? 'border-white/30 bg-white/5'
510
+ : 'border-neutral-800 bg-neutral-900/50'
511
+ }`}
512
+ >
513
+ <button
514
+ onClick={() => setExpandedStep(isExpanded ? null : index)}
515
+ className="w-full p-4 flex items-center gap-4 text-left"
516
+ >
517
+ <div className={`w-8 h-8 rounded-full flex items-center justify-center flex-shrink-0 ${
518
+ isComplete
519
+ ? 'bg-green-500 text-white'
520
+ : isActive
521
+ ? 'bg-white text-black'
522
+ : 'bg-white/10 text-neutral-400'
523
+ }`}>
524
+ {isComplete ? (
525
+ <Check className="w-4 h-4" />
526
+ ) : (
527
+ <span className="text-sm font-medium">{index + 1}</span>
528
+ )}
529
+ </div>
530
+
531
+ <div className="flex-1 min-w-0">
532
+ <div className="flex items-center gap-2">
533
+ <span className={`font-medium ${isComplete || isActive ? 'text-white' : 'text-neutral-300'}`}>
534
+ {step.title}
535
+ </span>
536
+ {step.isOptional && (
537
+ <span className="text-xs px-2 py-0.5 rounded-full bg-white/10 text-neutral-400">
538
+ Optional
539
+ </span>
540
+ )}
541
+ </div>
542
+ <p className="text-sm text-neutral-500 truncate">{step.description}</p>
543
+ </div>
544
+
545
+ <ChevronRight className={`w-5 h-5 text-neutral-500 transition-transform ${isExpanded ? 'rotate-90' : ''}`} />
546
+ </button>
547
+
548
+ <AnimatePresence>
549
+ {isExpanded && (
550
+ <motion.div
551
+ initial={{ height: 0, opacity: 0 }}
552
+ animate={{ height: 'auto', opacity: 1 }}
553
+ exit={{ height: 0, opacity: 0 }}
554
+ className="border-t border-neutral-800"
555
+ >
556
+ <div className="p-4 space-y-3">
557
+ <div className="relative">
558
+ <pre className="p-4 pr-12 rounded-lg bg-black border border-neutral-800 overflow-x-auto text-sm font-mono text-green-400">
559
+ <code>{step.command}</code>
560
+ </pre>
561
+ <button
562
+ onClick={() => copyToClipboard(step.command, index)}
563
+ className="absolute top-3 right-3 p-2 rounded-lg bg-white/10 hover:bg-white/20 transition-colors"
564
+ title="Copy command"
565
+ >
566
+ {copiedCommand === `${selectedPlatform}-${index}` ? (
567
+ <Check className="w-4 h-4 text-green-400" />
568
+ ) : (
569
+ <Copy className="w-4 h-4" />
570
+ )}
571
+ </button>
572
+ </div>
573
+
574
+ {step.warning && (
575
+ <div className="flex items-start gap-2 p-3 rounded-lg bg-yellow-500/10 border border-yellow-500/20">
576
+ <AlertCircle className="w-4 h-4 text-yellow-400 flex-shrink-0 mt-0.5" />
577
+ <p className="text-sm text-yellow-200">{step.warning}</p>
578
+ </div>
579
+ )}
580
+
581
+ {step.note && (
582
+ <div className="flex items-start gap-2 p-3 rounded-lg bg-blue-500/10 border border-blue-500/20">
583
+ <Info className="w-4 h-4 text-blue-400 flex-shrink-0 mt-0.5" />
584
+ <p className="text-sm text-blue-200">{step.note}</p>
585
+ </div>
586
+ )}
587
+
588
+ {step.link && (
589
+ <a
590
+ href={step.link}
591
+ target="_blank"
592
+ rel="noopener noreferrer"
593
+ className="inline-flex items-center gap-1 text-sm text-white hover:underline"
594
+ >
595
+ Learn more
596
+ <ExternalLink className="w-3 h-3" />
597
+ </a>
598
+ )}
599
+
600
+ {!isComplete && (
601
+ <button
602
+ onClick={() => markStepComplete(index)}
603
+ className="flex items-center gap-2 px-4 py-2 bg-white text-black rounded-lg text-sm font-medium hover:bg-neutral-200 transition-colors"
604
+ >
605
+ <Check className="w-4 h-4" />
606
+ Mark as Complete
607
+ </button>
608
+ )}
609
+ </div>
610
+ </motion.div>
611
+ )}
612
+ </AnimatePresence>
613
+ </motion.div>
614
+ );
615
+ })}
616
+ </motion.div>
617
+
618
+ {/* Completion state */}
619
+ <AnimatePresence>
620
+ {currentStep >= currentInstructions.steps.filter(s => !s.isOptional).length && (
621
+ <motion.div
622
+ initial={{ opacity: 0, scale: 0.95 }}
623
+ animate={{ opacity: 1, scale: 1 }}
624
+ exit={{ opacity: 0, scale: 0.95 }}
625
+ className="rounded-xl border border-green-500/30 bg-green-500/10 p-6 text-center"
626
+ >
627
+ <div className="w-16 h-16 rounded-full bg-green-500/20 flex items-center justify-center mx-auto mb-4">
628
+ <Check className="w-8 h-8 text-green-400" />
629
+ </div>
630
+ <h3 className="text-xl font-semibold text-white mb-2">Installation Complete!</h3>
631
+ <p className="text-neutral-400 mb-4">
632
+ Your MCP server is now configured and ready to use with Claude Desktop.
633
+ </p>
634
+ <div className="flex items-center justify-center gap-3">
635
+ <button
636
+ onClick={() => window.open('claude://open', '_blank')}
637
+ className="flex items-center gap-2 px-4 py-2 bg-white text-black rounded-lg font-medium hover:bg-neutral-200 transition-colors"
638
+ >
639
+ <Play className="w-4 h-4" />
640
+ Open Claude
641
+ </button>
642
+ <button
643
+ onClick={handleStartInstall}
644
+ className="flex items-center gap-2 px-4 py-2 bg-white/10 text-white rounded-lg font-medium hover:bg-white/20 transition-colors"
645
+ >
646
+ <RefreshCw className="w-4 h-4" />
647
+ Start Over
648
+ </button>
649
+ </div>
650
+ </motion.div>
651
+ )}
652
+ </AnimatePresence>
653
+
654
+ {/* Help section */}
655
+ <motion.div
656
+ initial={{ opacity: 0 }}
657
+ animate={{ opacity: 1 }}
658
+ transition={{ delay: 0.3 }}
659
+ className="flex items-center justify-center gap-6 text-sm text-neutral-500"
660
+ >
661
+ <a href="#" className="flex items-center gap-1 hover:text-white transition-colors">
662
+ <Shield className="w-4 h-4" />
663
+ Security Guide
664
+ </a>
665
+ <a href="#" className="flex items-center gap-1 hover:text-white transition-colors">
666
+ <AlertCircle className="w-4 h-4" />
667
+ Troubleshooting
668
+ </a>
669
+ <a href="#" className="flex items-center gap-1 hover:text-white transition-colors">
670
+ <ExternalLink className="w-4 h-4" />
671
+ Documentation
672
+ </a>
673
+ </motion.div>
674
+ </div>
675
+ );
676
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Install components barrel export
3
+ * @copyright 2024-2026 nirholas
4
+ * @license MIT
5
+ */
6
+
7
+ export { default as OneClickInstall } from './OneClickInstall';