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.
- package/.env.example +8 -0
- package/.github/CODEOWNERS +6 -0
- package/.husky/pre-commit +1 -0
- package/.nvmrc +1 -0
- package/.prettierignore +5 -0
- package/.prettierrc +7 -0
- package/.vscode/settings.json +4 -0
- package/ARCHITECTURE.md +1429 -0
- package/CHANGELOG.md +167 -0
- package/CONTRIBUTING.md +327 -0
- package/LICENSE +201 -0
- package/README.md +1028 -0
- package/SECURITY.md +248 -0
- package/VISUAL_GUIDE.md +437 -0
- package/apps/vscode/IMPLEMENTATION.md +480 -0
- package/apps/vscode/README.md +248 -0
- package/apps/vscode/package.json +381 -0
- package/apps/vscode/resources/icon.png +0 -0
- package/apps/vscode/resources/icon.svg +5 -0
- package/apps/vscode/src/commands/browseRegistry.ts +211 -0
- package/apps/vscode/src/commands/configureClaudeDesktop.ts +332 -0
- package/apps/vscode/src/commands/convert.ts +82 -0
- package/apps/vscode/src/commands/convertCurrentRepo.ts +109 -0
- package/apps/vscode/src/commands/convertFromUrl.ts +138 -0
- package/apps/vscode/src/commands/index.ts +121 -0
- package/apps/vscode/src/commands/validate.ts +197 -0
- package/apps/vscode/src/extension.ts +464 -0
- package/apps/vscode/src/global.d.ts +36 -0
- package/apps/vscode/src/test/extension.test.ts +73 -0
- package/apps/vscode/src/utils/file-generator.ts +529 -0
- package/apps/vscode/src/utils/github-api.ts +335 -0
- package/apps/vscode/src/utils/index.ts +29 -0
- package/apps/vscode/src/utils/mcp-config.ts +334 -0
- package/apps/vscode/src/utils/storage.ts +87 -0
- package/apps/vscode/src/views/McpServersTreeView.ts +160 -0
- package/apps/vscode/src/views/OutputChannelView.ts +195 -0
- package/apps/vscode/src/views/StatusBarItem.ts +251 -0
- package/apps/vscode/src/views/ToolsExplorerView.ts +314 -0
- package/apps/vscode/src/views/historyProvider.ts +75 -0
- package/apps/vscode/src/views/index.ts +12 -0
- package/apps/vscode/src/views/resultsPanel.ts +330 -0
- package/apps/vscode/src/webviews/ConversionPanel.ts +350 -0
- package/apps/vscode/src/webviews/ToolDetailsPanel.ts +448 -0
- package/apps/vscode/src/webviews/index.ts +9 -0
- package/apps/vscode/src/webviews/webview-ui/styles.ts +492 -0
- package/apps/vscode/tsconfig.json +20 -0
- package/apps/web/PLAYGROUND_GUIDE.md +499 -0
- package/apps/web/README.md +505 -0
- package/apps/web/app/api/convert/route.ts +100 -0
- package/apps/web/app/api/convert/stream/route.ts +198 -0
- package/apps/web/app/api/deploy/route.ts +157 -0
- package/apps/web/app/api/edge/route.ts +308 -0
- package/apps/web/app/api/export-docker/route.ts +284 -0
- package/apps/web/app/api/generate-openapi/route.ts +119 -0
- package/apps/web/app/api/mcp/[serverId]/route.ts +263 -0
- package/apps/web/app/api/playground/connect/route.ts +143 -0
- package/apps/web/app/api/playground/disconnect/route.ts +78 -0
- package/apps/web/app/api/playground/execute/route.ts +135 -0
- package/apps/web/app/api/playground/sessions/route.ts +103 -0
- package/apps/web/app/api/playground/tools/route.ts +117 -0
- package/apps/web/app/api/playground/v2/connect/route.ts +96 -0
- package/apps/web/app/api/playground/v2/disconnect/route.ts +88 -0
- package/apps/web/app/api/playground/v2/health/route.ts +80 -0
- package/apps/web/app/api/playground/v2/prompts/route.ts +160 -0
- package/apps/web/app/api/playground/v2/resources/route.ts +159 -0
- package/apps/web/app/api/playground/v2/sessions/route.ts +184 -0
- package/apps/web/app/api/playground/v2/tools/route.ts +167 -0
- package/apps/web/app/api/stream/route.ts +232 -0
- package/apps/web/app/batch/BatchConvertClient.tsx +190 -0
- package/apps/web/app/batch/page.tsx +37 -0
- package/apps/web/app/convert/page.tsx +269 -0
- package/apps/web/app/dashboard/page.tsx +380 -0
- package/apps/web/app/globals.css +622 -0
- package/apps/web/app/layout.tsx +120 -0
- package/apps/web/app/manifest.ts +31 -0
- package/apps/web/app/opengraph-image.tsx +112 -0
- package/apps/web/app/page.old.tsx +924 -0
- package/apps/web/app/page.tsx +77 -0
- package/apps/web/app/playground/page.tsx +306 -0
- package/apps/web/app/playground/v2/error.tsx +163 -0
- package/apps/web/app/playground/v2/layout.tsx +58 -0
- package/apps/web/app/playground/v2/loading.tsx +152 -0
- package/apps/web/app/playground/v2/page.tsx +644 -0
- package/apps/web/app/playground/v2/providers.tsx +214 -0
- package/apps/web/app/playground/v2/use-shortcuts.ts +209 -0
- package/apps/web/app/playground/v2/use-url-state.ts +296 -0
- package/apps/web/app/providers.tsx +22 -0
- package/apps/web/app/sitemap.ts +32 -0
- package/apps/web/app/twitter-image.tsx +112 -0
- package/apps/web/components/BranchSelector.tsx +401 -0
- package/apps/web/components/ClaudeConfigExport.tsx +226 -0
- package/apps/web/components/Features.tsx +84 -0
- package/apps/web/components/Footer.tsx +119 -0
- package/apps/web/components/GenerationProgress.tsx +248 -0
- package/apps/web/components/GithubUrlInput.tsx +483 -0
- package/apps/web/components/Header.tsx +175 -0
- package/apps/web/components/Hero.tsx +117 -0
- package/apps/web/components/HowItWorks.tsx +119 -0
- package/apps/web/components/InstallBanner.tsx +158 -0
- package/apps/web/components/Logo.tsx +116 -0
- package/apps/web/components/ParticleBackground.tsx +105 -0
- package/apps/web/components/Playground.tsx +472 -0
- package/apps/web/components/PlaygroundToolTester.tsx +410 -0
- package/apps/web/components/ProductCards.tsx +179 -0
- package/apps/web/components/SplitView.tsx +194 -0
- package/apps/web/components/ToolFilter.tsx +260 -0
- package/apps/web/components/ToolList.tsx +325 -0
- package/apps/web/components/batch/BatchConvert.tsx +785 -0
- package/apps/web/components/batch/index.ts +7 -0
- package/apps/web/components/convert/ConfigTabs.tsx +230 -0
- package/apps/web/components/convert/ConversionResult.tsx +482 -0
- package/apps/web/components/convert/InlinePlayground.tsx +259 -0
- package/apps/web/components/convert/LoadingSteps.tsx +311 -0
- package/apps/web/components/convert/OneClickInstall.tsx +224 -0
- package/apps/web/components/convert/ToolCard.tsx +189 -0
- package/apps/web/components/convert/TryInPlayground.tsx +242 -0
- package/apps/web/components/convert/index.ts +12 -0
- package/apps/web/components/deploy/DeployButton.tsx +369 -0
- package/apps/web/components/deploy/index.ts +7 -0
- package/apps/web/components/docker/DockerExport.tsx +690 -0
- package/apps/web/components/docker/index.ts +7 -0
- package/apps/web/components/install/OneClickInstall.tsx +676 -0
- package/apps/web/components/install/index.ts +7 -0
- package/apps/web/components/playground/CapabilityTabs.tsx +150 -0
- package/apps/web/components/playground/ConnectionStatusV2.tsx +322 -0
- package/apps/web/components/playground/EmptyStates.tsx +305 -0
- package/apps/web/components/playground/ExecutionLog.tsx +260 -0
- package/apps/web/components/playground/ExecutionLogV2.tsx +378 -0
- package/apps/web/components/playground/JsonViewer.tsx +388 -0
- package/apps/web/components/playground/PlaygroundLayout.tsx +244 -0
- package/apps/web/components/playground/PromptsPanel.tsx +385 -0
- package/apps/web/components/playground/ResourcesPanel.tsx +378 -0
- package/apps/web/components/playground/SchemaForm.tsx +477 -0
- package/apps/web/components/playground/ServerStatus.tsx +151 -0
- package/apps/web/components/playground/ShareButton.tsx +239 -0
- package/apps/web/components/playground/ToolsPanel.tsx +309 -0
- package/apps/web/components/playground/TransportConfigurator.tsx +563 -0
- package/apps/web/components/playground/index.ts +74 -0
- package/apps/web/components/playground/types.ts +202 -0
- package/apps/web/components/streaming/StreamingProgress.tsx +441 -0
- package/apps/web/components/streaming/index.ts +7 -0
- package/apps/web/components/ui/badge.tsx +42 -0
- package/apps/web/components/ui/button.tsx +88 -0
- package/apps/web/components/ui/card.tsx +75 -0
- package/apps/web/components/ui/code-block.tsx +122 -0
- package/apps/web/components/ui/index.ts +12 -0
- package/apps/web/components/ui/input.tsx +55 -0
- package/apps/web/components/ui/tabs.tsx +61 -0
- package/apps/web/hooks/index.ts +85 -0
- package/apps/web/hooks/types.ts +1173 -0
- package/apps/web/hooks/use-conversion.ts +133 -0
- package/apps/web/hooks/use-execution-history.ts +376 -0
- package/apps/web/hooks/use-generation-progress.ts +147 -0
- package/apps/web/hooks/use-local-storage.ts +88 -0
- package/apps/web/hooks/use-mcp-client.ts +623 -0
- package/apps/web/hooks/use-mcp-connection.ts +500 -0
- package/apps/web/hooks/use-mcp-execution.ts +282 -0
- package/apps/web/hooks/use-mcp-prompts.ts +441 -0
- package/apps/web/hooks/use-mcp-resources.ts +430 -0
- package/apps/web/hooks/use-mcp-tools.ts +540 -0
- package/apps/web/hooks/use-playground-store.ts +299 -0
- package/apps/web/hooks/use-playground.ts +184 -0
- package/apps/web/hooks/use-streaming-conversion.ts +227 -0
- package/apps/web/hooks/useBatchConversion.ts +271 -0
- package/apps/web/hooks/useDockerConfig.ts +161 -0
- package/apps/web/hooks/usePlatformDetection.ts +80 -0
- package/apps/web/hooks/useStreaming.ts +199 -0
- package/apps/web/lib/api/errors.ts +386 -0
- package/apps/web/lib/api/index.ts +137 -0
- package/apps/web/lib/api/logger.ts +187 -0
- package/apps/web/lib/api/middleware.ts +364 -0
- package/apps/web/lib/api/openapi.ts +977 -0
- package/apps/web/lib/api/session-manager.ts +594 -0
- package/apps/web/lib/api/types.ts +433 -0
- package/apps/web/lib/api/validation.ts +523 -0
- package/apps/web/lib/constants.ts +114 -0
- package/apps/web/lib/mcp/client.ts +1137 -0
- package/apps/web/lib/mcp/events.ts +651 -0
- package/apps/web/lib/mcp/index.ts +347 -0
- package/apps/web/lib/mcp/logger.ts +428 -0
- package/apps/web/lib/mcp/metrics.ts +703 -0
- package/apps/web/lib/mcp/retry.ts +616 -0
- package/apps/web/lib/mcp/session-manager.ts +779 -0
- package/apps/web/lib/mcp/transports.ts +988 -0
- package/apps/web/lib/mcp/types.ts +594 -0
- package/apps/web/lib/mcp-client-enhanced.ts +871 -0
- package/apps/web/lib/mcp-client.ts +778 -0
- package/apps/web/lib/mcp-errors.ts +489 -0
- package/apps/web/lib/mcp-sandbox.ts +593 -0
- package/apps/web/lib/mcp-testing.ts +428 -0
- package/apps/web/lib/mcp-types.ts +448 -0
- package/apps/web/lib/playground-store.tsx +1147 -0
- package/apps/web/lib/utils.ts +439 -0
- package/apps/web/next-env.d.ts +5 -0
- package/apps/web/next.config.js +23 -0
- package/apps/web/package.json +55 -0
- package/apps/web/postcss.config.js +6 -0
- package/apps/web/public/.well-known/ai-plugin.json +17 -0
- package/apps/web/public/logo.svg +6 -0
- package/apps/web/public/robots.txt +22 -0
- package/apps/web/public/schema.json +27 -0
- package/apps/web/tailwind.config.js +26 -0
- package/apps/web/tailwind.config.ts +123 -0
- package/apps/web/tsconfig.json +20 -0
- package/apps/web/types/deploy.ts +139 -0
- package/apps/web/types/index.ts +247 -0
- package/apps/web/vercel.json +39 -0
- package/eslint.config.mjs +23 -0
- package/llms.txt +102 -0
- package/mkdocs/docs/api/core.md +318 -0
- package/mkdocs/docs/api/index.md +128 -0
- package/mkdocs/docs/api/mcp-server.md +301 -0
- package/mkdocs/docs/api/openapi-parser.md +254 -0
- package/mkdocs/docs/assets/logo.svg +7 -0
- package/mkdocs/docs/changelog.md +118 -0
- package/mkdocs/docs/cli/generate.md +148 -0
- package/mkdocs/docs/cli/index.md +52 -0
- package/mkdocs/docs/cli/inspect.md +164 -0
- package/mkdocs/docs/cli/serve.md +136 -0
- package/mkdocs/docs/concepts/classification.md +254 -0
- package/mkdocs/docs/concepts/how-it-works.md +299 -0
- package/mkdocs/docs/concepts/index.md +77 -0
- package/mkdocs/docs/concepts/mcp-protocol.md +362 -0
- package/mkdocs/docs/concepts/tool-types.md +382 -0
- package/mkdocs/docs/contributing/architecture.md +262 -0
- package/mkdocs/docs/contributing/development.md +245 -0
- package/mkdocs/docs/contributing/index.md +73 -0
- package/mkdocs/docs/contributing/testing.md +320 -0
- package/mkdocs/docs/getting-started/configuration.md +235 -0
- package/mkdocs/docs/getting-started/index.md +54 -0
- package/mkdocs/docs/getting-started/installation.md +145 -0
- package/mkdocs/docs/getting-started/quickstart.md +160 -0
- package/mkdocs/docs/guides/batch.md +375 -0
- package/mkdocs/docs/guides/claude-desktop.md +227 -0
- package/mkdocs/docs/guides/cursor.md +188 -0
- package/mkdocs/docs/guides/custom-tools.md +367 -0
- package/mkdocs/docs/guides/index.md +78 -0
- package/mkdocs/docs/guides/private-repos.md +221 -0
- package/mkdocs/docs/guides/vscode.md +247 -0
- package/mkdocs/docs/index.md +175 -0
- package/mkdocs/docs/reference/config.md +223 -0
- package/mkdocs/docs/reference/env.md +192 -0
- package/mkdocs/docs/reference/index.md +102 -0
- package/mkdocs/docs/reference/tools.md +309 -0
- package/mkdocs/docs/stylesheets/extra.css +231 -0
- package/mkdocs/mkdocs.yml +204 -0
- package/mkdocs/overrides/.gitkeep +1 -0
- package/mkdocs/overrides/main.html +7 -0
- package/mkdocs/python-deps.txt +7 -0
- package/mkdocs/vercel.json +11 -0
- package/package.json +63 -0
- package/packages/core/package.json +61 -0
- package/packages/core/src/__tests__/bitbucket-client.test.ts +366 -0
- package/packages/core/src/__tests__/cli.test.ts +235 -0
- package/packages/core/src/__tests__/code-extractor.test.ts +378 -0
- package/packages/core/src/__tests__/docker-generator.test.ts +255 -0
- package/packages/core/src/__tests__/github-client.test.ts +390 -0
- package/packages/core/src/__tests__/gitlab-client.test.ts +319 -0
- package/packages/core/src/__tests__/go-extractor.test.ts +351 -0
- package/packages/core/src/__tests__/graphql-extractor.test.ts +330 -0
- package/packages/core/src/__tests__/java-extractor.test.ts +497 -0
- package/packages/core/src/__tests__/plugins.test.ts +467 -0
- package/packages/core/src/__tests__/readme-extractor.test.ts +258 -0
- package/packages/core/src/__tests__/redis-cache.test.ts +307 -0
- package/packages/core/src/__tests__/rust-extractor.test.ts +252 -0
- package/packages/core/src/__tests__/streaming.test.ts +251 -0
- package/packages/core/src/additional-extractors.ts +333 -0
- package/packages/core/src/cache/cache-interface.ts +179 -0
- package/packages/core/src/cache/index.ts +210 -0
- package/packages/core/src/cache/redis-cache.ts +291 -0
- package/packages/core/src/cache/upstash-cache.ts +379 -0
- package/packages/core/src/cache.ts +251 -0
- package/packages/core/src/cli.ts +822 -0
- package/packages/core/src/code-extractor.ts +696 -0
- package/packages/core/src/docker-generator.ts +470 -0
- package/packages/core/src/edge-compatible.ts +491 -0
- package/packages/core/src/extractors/go-extractor.ts +791 -0
- package/packages/core/src/extractors/index.ts +9 -0
- package/packages/core/src/extractors/java-extractor.ts +937 -0
- package/packages/core/src/extractors/rust-extractor.ts +744 -0
- package/packages/core/src/github-client.ts +319 -0
- package/packages/core/src/go-generator.ts +356 -0
- package/packages/core/src/graphql-extractor.ts +358 -0
- package/packages/core/src/index.ts +797 -0
- package/packages/core/src/langchain-exporter.ts +617 -0
- package/packages/core/src/language-parsers.ts +1114 -0
- package/packages/core/src/mcp-introspector.ts +279 -0
- package/packages/core/src/monorepo-detector.ts +378 -0
- package/packages/core/src/plugins/index.ts +370 -0
- package/packages/core/src/plugins/registry.ts +404 -0
- package/packages/core/src/plugins/types.ts +215 -0
- package/packages/core/src/providers/base-provider.ts +246 -0
- package/packages/core/src/providers/bitbucket-client.ts +464 -0
- package/packages/core/src/providers/gitlab-client.ts +388 -0
- package/packages/core/src/providers/index.ts +176 -0
- package/packages/core/src/python-generator.ts +260 -0
- package/packages/core/src/queue/index.ts +100 -0
- package/packages/core/src/queue/memory-queue.ts +445 -0
- package/packages/core/src/queue/redis-queue.ts +578 -0
- package/packages/core/src/queue/types.ts +251 -0
- package/packages/core/src/readme-extractor.ts +409 -0
- package/packages/core/src/schema-generator.ts +638 -0
- package/packages/core/src/streaming.ts +999 -0
- package/packages/core/src/types.ts +289 -0
- package/packages/core/tsconfig.json +9 -0
- package/packages/core/tsup.config.ts +25 -0
- package/packages/mcp-server/README.md +297 -0
- package/packages/mcp-server/package.json +55 -0
- package/packages/mcp-server/src/__tests__/mcp-server.test.ts +177 -0
- package/packages/mcp-server/src/__tests__/tools.test.ts +217 -0
- package/packages/mcp-server/src/index.ts +1206 -0
- package/packages/mcp-server/src/prompts/index.ts +601 -0
- package/packages/mcp-server/src/tools/export-docker.ts +362 -0
- package/packages/mcp-server/src/tools/generate-openapi.ts +162 -0
- package/packages/mcp-server/src/tools/monitor-mcp-server.ts +448 -0
- package/packages/mcp-server/src/tools/stream-convert.ts +398 -0
- package/packages/mcp-server/src/tools/test-mcp-tool.ts +531 -0
- package/packages/mcp-server/tsconfig.json +12 -0
- package/packages/mcp-server/tsup.config.ts +14 -0
- package/packages/openapi-parser/package-lock.json +3028 -0
- package/packages/openapi-parser/package.json +41 -0
- package/packages/openapi-parser/src/analyzer.ts +700 -0
- package/packages/openapi-parser/src/asyncapi-parser.ts +475 -0
- package/packages/openapi-parser/src/cli.ts +302 -0
- package/packages/openapi-parser/src/generator.ts +570 -0
- package/packages/openapi-parser/src/generators/express-analyzer.ts +649 -0
- package/packages/openapi-parser/src/generators/fastapi-analyzer.ts +960 -0
- package/packages/openapi-parser/src/generators/index.ts +200 -0
- package/packages/openapi-parser/src/generators/nextjs-analyzer.ts +768 -0
- package/packages/openapi-parser/src/generators/openapi-builder.ts +527 -0
- package/packages/openapi-parser/src/generators/types.ts +298 -0
- package/packages/openapi-parser/src/graphql-parser.ts +462 -0
- package/packages/openapi-parser/src/grpc-parser.ts +649 -0
- package/packages/openapi-parser/src/har-parser.ts +723 -0
- package/packages/openapi-parser/src/index.ts +635 -0
- package/packages/openapi-parser/src/insomnia-parser.ts +614 -0
- package/packages/openapi-parser/src/parser.ts +231 -0
- package/packages/openapi-parser/src/postman-parser.ts +611 -0
- package/packages/openapi-parser/src/ref-resolver.ts +313 -0
- package/packages/openapi-parser/src/transformer.ts +459 -0
- package/packages/openapi-parser/tests/generators/express.test.ts +209 -0
- package/packages/openapi-parser/tests/generators/fastapi.test.ts +236 -0
- package/packages/openapi-parser/tests/generators/nextjs.test.ts +273 -0
- package/packages/openapi-parser/tests/parsers.test.ts +847 -0
- package/packages/openapi-parser/tsconfig.json +9 -0
- package/packages/openapi-parser/tsup.config.ts +11 -0
- package/packages/registry/package.json +59 -0
- package/packages/registry/src/cli.ts +456 -0
- package/packages/registry/src/index.ts +44 -0
- package/packages/registry/src/popular/github.json +47 -0
- package/packages/registry/src/popular/index.ts +55 -0
- package/packages/registry/src/popular/linear.json +42 -0
- package/packages/registry/src/popular/notion.json +42 -0
- package/packages/registry/src/popular/openai.json +40 -0
- package/packages/registry/src/popular/resend.json +38 -0
- package/packages/registry/src/popular/slack.json +42 -0
- package/packages/registry/src/popular/stripe.json +163 -0
- package/packages/registry/src/popular/supabase.json +42 -0
- package/packages/registry/src/popular/twilio.json +40 -0
- package/packages/registry/src/popular/vercel.json +40 -0
- package/packages/registry/src/registry.ts +492 -0
- package/packages/registry/src/storage.ts +334 -0
- package/packages/registry/src/types.ts +275 -0
- package/packages/registry/src/updater.ts +208 -0
- package/packages/registry/tsconfig.json +10 -0
- package/packages/registry/tsup.config.ts +11 -0
- package/pnpm-workspace.yaml +3 -0
- package/scripts/build-docs.sh +16 -0
- package/server.json +9 -0
- package/templates/Dockerfile.python.template +60 -0
- package/templates/Dockerfile.typescript.template +60 -0
- package/templates/docker-compose.template.yml +68 -0
- package/tests/fixtures/express-app/index.js +34 -0
- package/tests/fixtures/express-app/routes/posts.js +43 -0
- package/tests/fixtures/express-app/routes/users.js +58 -0
- package/tests/fixtures/fastapi-app/main.py +125 -0
- package/tests/fixtures/fastapi-app/routes/admin.py +42 -0
- package/tests/fixtures/graphql/simple-schema.graphql +65 -0
- package/tests/fixtures/mocks/github-api-responses.json +63 -0
- package/tests/fixtures/nextjs-app/app/api/posts/route.ts +55 -0
- package/tests/fixtures/nextjs-app/app/api/users/[id]/route.ts +63 -0
- package/tests/fixtures/nextjs-app/app/api/users/route.ts +44 -0
- package/tests/fixtures/nextjs-app/pages/api/health.ts +28 -0
- package/tests/fixtures/openapi/petstore.yaml +179 -0
- package/tests/integration/langchain-export.test.ts +405 -0
- package/tests/integration/openapi-conversion.test.ts +221 -0
- package/tsconfig.json +18 -0
- 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
|
+
}
|