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,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Storage utility for conversion history
|
|
3
|
+
* @copyright Copyright (c) 2024-2026 nirholas
|
|
4
|
+
* @license MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import * as vscode from 'vscode';
|
|
8
|
+
|
|
9
|
+
export interface ConversionResult {
|
|
10
|
+
id: string;
|
|
11
|
+
repoUrl: string;
|
|
12
|
+
repoName: string;
|
|
13
|
+
toolCount: number;
|
|
14
|
+
timestamp: string;
|
|
15
|
+
classification?: {
|
|
16
|
+
type: string;
|
|
17
|
+
confidence: number;
|
|
18
|
+
indicators: string[];
|
|
19
|
+
};
|
|
20
|
+
code?: string;
|
|
21
|
+
tools?: Array<{
|
|
22
|
+
name: string;
|
|
23
|
+
description: string;
|
|
24
|
+
}>;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const HISTORY_KEY = 'github-to-mcp.history';
|
|
28
|
+
|
|
29
|
+
export class StorageService {
|
|
30
|
+
private context: vscode.ExtensionContext;
|
|
31
|
+
|
|
32
|
+
constructor(context: vscode.ExtensionContext) {
|
|
33
|
+
this.context = context;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Get conversion history
|
|
38
|
+
*/
|
|
39
|
+
getHistory(): ConversionResult[] {
|
|
40
|
+
return this.context.globalState.get<ConversionResult[]>(HISTORY_KEY) || [];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Add a conversion result to history
|
|
45
|
+
*/
|
|
46
|
+
addToHistory(result: ConversionResult): void {
|
|
47
|
+
const history = this.getHistory();
|
|
48
|
+
|
|
49
|
+
// Add to beginning
|
|
50
|
+
history.unshift(result);
|
|
51
|
+
|
|
52
|
+
// Get limit from config
|
|
53
|
+
const config = vscode.workspace.getConfiguration('github-to-mcp');
|
|
54
|
+
const limit = config.get<number>('historyLimit') || 20;
|
|
55
|
+
|
|
56
|
+
// Trim to limit
|
|
57
|
+
if (history.length > limit) {
|
|
58
|
+
history.length = limit;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
this.context.globalState.update(HISTORY_KEY, history);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Remove a specific item from history
|
|
66
|
+
*/
|
|
67
|
+
removeFromHistory(id: string): void {
|
|
68
|
+
const history = this.getHistory();
|
|
69
|
+
const filtered = history.filter(item => item.id !== id);
|
|
70
|
+
this.context.globalState.update(HISTORY_KEY, filtered);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Clear all history
|
|
75
|
+
*/
|
|
76
|
+
clearHistory(): void {
|
|
77
|
+
this.context.globalState.update(HISTORY_KEY, []);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Get a specific conversion by ID
|
|
82
|
+
*/
|
|
83
|
+
getConversion(id: string): ConversionResult | undefined {
|
|
84
|
+
const history = this.getHistory();
|
|
85
|
+
return history.find(item => item.id === id);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Tree view provider for MCP servers
|
|
3
|
+
* @copyright Copyright (c) 2024-2026 nirholas
|
|
4
|
+
* @license MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import * as vscode from 'vscode';
|
|
8
|
+
import { StorageService, ConversionResult } from '../utils/storage';
|
|
9
|
+
|
|
10
|
+
type McpServerTreeItem = McpServerItem | McpToolItem | EmptyItem;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Tree data provider for MCP servers view
|
|
14
|
+
*/
|
|
15
|
+
export class McpServersTreeView implements vscode.TreeDataProvider<McpServerTreeItem> {
|
|
16
|
+
private _onDidChangeTreeData: vscode.EventEmitter<McpServerTreeItem | undefined | null | void> =
|
|
17
|
+
new vscode.EventEmitter<McpServerTreeItem | undefined | null | void>();
|
|
18
|
+
readonly onDidChangeTreeData: vscode.Event<McpServerTreeItem | undefined | null | void> =
|
|
19
|
+
this._onDidChangeTreeData.event;
|
|
20
|
+
|
|
21
|
+
constructor(private storage: StorageService) {}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Refresh the tree view
|
|
25
|
+
*/
|
|
26
|
+
refresh(): void {
|
|
27
|
+
this._onDidChangeTreeData.fire();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Get tree item representation
|
|
32
|
+
*/
|
|
33
|
+
getTreeItem(element: McpServerTreeItem): vscode.TreeItem {
|
|
34
|
+
return element;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Get children for tree node
|
|
39
|
+
*/
|
|
40
|
+
getChildren(element?: McpServerTreeItem): McpServerTreeItem[] {
|
|
41
|
+
if (!element) {
|
|
42
|
+
// Root level - show all servers
|
|
43
|
+
const history = this.storage.getHistory();
|
|
44
|
+
|
|
45
|
+
if (history.length === 0) {
|
|
46
|
+
return [new EmptyItem('No MCP servers yet', 'Convert a repository to get started')];
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return history.map(item => new McpServerItem(item));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (element instanceof McpServerItem) {
|
|
53
|
+
// Show tools under each server
|
|
54
|
+
const tools = element.result.tools || [];
|
|
55
|
+
|
|
56
|
+
if (tools.length === 0) {
|
|
57
|
+
return [new EmptyItem('No tools', 'This server has no tools')];
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return tools.map(tool => new McpToolItem(tool, element.result));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return [];
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Get parent of element (for reveal)
|
|
68
|
+
*/
|
|
69
|
+
getParent(element: McpServerTreeItem): McpServerTreeItem | undefined {
|
|
70
|
+
if (element instanceof McpToolItem) {
|
|
71
|
+
const history = this.storage.getHistory();
|
|
72
|
+
const server = history.find(h => h.id === element.serverId);
|
|
73
|
+
if (server) {
|
|
74
|
+
return new McpServerItem(server);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Tree item for an MCP server
|
|
83
|
+
*/
|
|
84
|
+
export class McpServerItem extends vscode.TreeItem {
|
|
85
|
+
public readonly result: ConversionResult;
|
|
86
|
+
|
|
87
|
+
constructor(result: ConversionResult) {
|
|
88
|
+
super(result.repoName, vscode.TreeItemCollapsibleState.Collapsed);
|
|
89
|
+
|
|
90
|
+
this.result = result;
|
|
91
|
+
this.description = `${result.toolCount} tools`;
|
|
92
|
+
|
|
93
|
+
const date = new Date(result.timestamp);
|
|
94
|
+
const formattedDate = date.toLocaleDateString() + ' ' + date.toLocaleTimeString();
|
|
95
|
+
|
|
96
|
+
this.tooltip = new vscode.MarkdownString();
|
|
97
|
+
this.tooltip.appendMarkdown(`### ${result.repoName}\n\n`);
|
|
98
|
+
this.tooltip.appendMarkdown(`**Tools:** ${result.toolCount}\n\n`);
|
|
99
|
+
if (result.classification) {
|
|
100
|
+
this.tooltip.appendMarkdown(`**Type:** ${result.classification.type}\n\n`);
|
|
101
|
+
this.tooltip.appendMarkdown(`**Confidence:** ${Math.round(result.classification.confidence * 100)}%\n\n`);
|
|
102
|
+
}
|
|
103
|
+
this.tooltip.appendMarkdown(`**Converted:** ${formattedDate}\n\n`);
|
|
104
|
+
this.tooltip.appendMarkdown(`[Open Repository](${result.repoUrl})`);
|
|
105
|
+
this.tooltip.isTrusted = true;
|
|
106
|
+
|
|
107
|
+
this.iconPath = new vscode.ThemeIcon('server', new vscode.ThemeColor('charts.green'));
|
|
108
|
+
this.contextValue = 'mcpServer';
|
|
109
|
+
|
|
110
|
+
// Command on click
|
|
111
|
+
this.command = {
|
|
112
|
+
command: 'github-to-mcp.viewDetails',
|
|
113
|
+
title: 'View Details',
|
|
114
|
+
arguments: [result]
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Tree item for an MCP tool
|
|
121
|
+
*/
|
|
122
|
+
export class McpToolItem extends vscode.TreeItem {
|
|
123
|
+
public readonly serverId: string;
|
|
124
|
+
|
|
125
|
+
constructor(
|
|
126
|
+
tool: { name: string; description: string },
|
|
127
|
+
server: ConversionResult
|
|
128
|
+
) {
|
|
129
|
+
super(tool.name, vscode.TreeItemCollapsibleState.None);
|
|
130
|
+
|
|
131
|
+
this.serverId = server.id;
|
|
132
|
+
this.description = tool.description.substring(0, 50) + (tool.description.length > 50 ? '...' : '');
|
|
133
|
+
|
|
134
|
+
this.tooltip = new vscode.MarkdownString();
|
|
135
|
+
this.tooltip.appendMarkdown(`### ${tool.name}\n\n`);
|
|
136
|
+
this.tooltip.appendMarkdown(tool.description);
|
|
137
|
+
this.tooltip.isTrusted = true;
|
|
138
|
+
|
|
139
|
+
this.iconPath = new vscode.ThemeIcon('symbol-method', new vscode.ThemeColor('charts.blue'));
|
|
140
|
+
this.contextValue = 'mcpTool';
|
|
141
|
+
|
|
142
|
+
// Command to show tool details
|
|
143
|
+
this.command = {
|
|
144
|
+
command: 'github-to-mcp.showToolDetails',
|
|
145
|
+
title: 'Show Tool Details',
|
|
146
|
+
arguments: [tool, server]
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Empty placeholder item
|
|
153
|
+
*/
|
|
154
|
+
class EmptyItem extends vscode.TreeItem {
|
|
155
|
+
constructor(label: string, description?: string) {
|
|
156
|
+
super(label, vscode.TreeItemCollapsibleState.None);
|
|
157
|
+
this.description = description;
|
|
158
|
+
this.iconPath = new vscode.ThemeIcon('info');
|
|
159
|
+
}
|
|
160
|
+
}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Dedicated output channel for extension logs
|
|
3
|
+
* @copyright Copyright (c) 2024-2026 nirholas
|
|
4
|
+
* @license MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import * as vscode from 'vscode';
|
|
8
|
+
|
|
9
|
+
type LogLevel = 'info' | 'warn' | 'error' | 'debug';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Output channel manager for extension logging
|
|
13
|
+
*/
|
|
14
|
+
export class OutputChannelView {
|
|
15
|
+
private static instance: OutputChannelView;
|
|
16
|
+
private channel: vscode.OutputChannel;
|
|
17
|
+
private logLevel: LogLevel = 'info';
|
|
18
|
+
|
|
19
|
+
private constructor() {
|
|
20
|
+
this.channel = vscode.window.createOutputChannel('GitHub to MCP', { log: true });
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Get singleton instance
|
|
25
|
+
*/
|
|
26
|
+
static getInstance(): OutputChannelView {
|
|
27
|
+
if (!OutputChannelView.instance) {
|
|
28
|
+
OutputChannelView.instance = new OutputChannelView();
|
|
29
|
+
}
|
|
30
|
+
return OutputChannelView.instance;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Set the minimum log level
|
|
35
|
+
*/
|
|
36
|
+
setLogLevel(level: LogLevel): void {
|
|
37
|
+
this.logLevel = level;
|
|
38
|
+
this.info(`Log level set to: ${level}`);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Log info message
|
|
43
|
+
*/
|
|
44
|
+
info(message: string, ...args: unknown[]): void {
|
|
45
|
+
this.log('info', message, ...args);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Log warning message
|
|
50
|
+
*/
|
|
51
|
+
warn(message: string, ...args: unknown[]): void {
|
|
52
|
+
this.log('warn', message, ...args);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Log error message
|
|
57
|
+
*/
|
|
58
|
+
error(message: string, error?: Error, ...args: unknown[]): void {
|
|
59
|
+
this.log('error', message, ...args);
|
|
60
|
+
if (error) {
|
|
61
|
+
this.channel.appendLine(` Stack: ${error.stack || 'No stack trace'}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Log debug message
|
|
67
|
+
*/
|
|
68
|
+
debug(message: string, ...args: unknown[]): void {
|
|
69
|
+
if (this.shouldLog('debug')) {
|
|
70
|
+
this.log('debug', message, ...args);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Log a message with level
|
|
76
|
+
*/
|
|
77
|
+
private log(level: LogLevel, message: string, ...args: unknown[]): void {
|
|
78
|
+
if (!this.shouldLog(level)) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const timestamp = new Date().toISOString();
|
|
83
|
+
const levelIcon = this.getLevelIcon(level);
|
|
84
|
+
const formattedArgs = args.length > 0 ? ' ' + JSON.stringify(args) : '';
|
|
85
|
+
|
|
86
|
+
this.channel.appendLine(`[${timestamp}] ${levelIcon} ${message}${formattedArgs}`);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Check if message should be logged based on level
|
|
91
|
+
*/
|
|
92
|
+
private shouldLog(level: LogLevel): boolean {
|
|
93
|
+
const levels: LogLevel[] = ['debug', 'info', 'warn', 'error'];
|
|
94
|
+
const currentLevelIndex = levels.indexOf(this.logLevel);
|
|
95
|
+
const messageLevelIndex = levels.indexOf(level);
|
|
96
|
+
return messageLevelIndex >= currentLevelIndex;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Get icon for log level
|
|
101
|
+
*/
|
|
102
|
+
private getLevelIcon(level: LogLevel): string {
|
|
103
|
+
switch (level) {
|
|
104
|
+
case 'debug': return '🔍';
|
|
105
|
+
case 'info': return 'ℹ️';
|
|
106
|
+
case 'warn': return '⚠️';
|
|
107
|
+
case 'error': return '❌';
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Show the output channel
|
|
113
|
+
*/
|
|
114
|
+
show(): void {
|
|
115
|
+
this.channel.show();
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Hide the output channel
|
|
120
|
+
*/
|
|
121
|
+
hide(): void {
|
|
122
|
+
this.channel.hide();
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Clear the output channel
|
|
127
|
+
*/
|
|
128
|
+
clear(): void {
|
|
129
|
+
this.channel.clear();
|
|
130
|
+
this.info('Output cleared');
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Log conversion start
|
|
135
|
+
*/
|
|
136
|
+
logConversionStart(repoUrl: string): void {
|
|
137
|
+
this.info('═'.repeat(50));
|
|
138
|
+
this.info(`Starting conversion for: ${repoUrl}`);
|
|
139
|
+
this.info('═'.repeat(50));
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Log conversion progress
|
|
144
|
+
*/
|
|
145
|
+
logConversionProgress(step: string, details?: string): void {
|
|
146
|
+
this.info(` → ${step}${details ? ': ' + details : ''}`);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Log conversion success
|
|
151
|
+
*/
|
|
152
|
+
logConversionSuccess(repoName: string, toolCount: number): void {
|
|
153
|
+
this.info('✅ Conversion completed successfully!');
|
|
154
|
+
this.info(` Repository: ${repoName}`);
|
|
155
|
+
this.info(` Tools found: ${toolCount}`);
|
|
156
|
+
this.info('─'.repeat(50));
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Log conversion failure
|
|
161
|
+
*/
|
|
162
|
+
logConversionFailure(repoUrl: string, error: Error): void {
|
|
163
|
+
this.error(`❌ Conversion failed for: ${repoUrl}`, error);
|
|
164
|
+
this.info('─'.repeat(50));
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Log tool extraction
|
|
169
|
+
*/
|
|
170
|
+
logToolExtracted(toolName: string, description: string): void {
|
|
171
|
+
this.debug(` 📦 Extracted tool: ${toolName}`);
|
|
172
|
+
this.debug(` ${description.substring(0, 60)}${description.length > 60 ? '...' : ''}`);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Log configuration change
|
|
177
|
+
*/
|
|
178
|
+
logConfigChange(setting: string, value: unknown): void {
|
|
179
|
+
this.info(`Configuration changed: ${setting} = ${JSON.stringify(value)}`);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Dispose the output channel
|
|
184
|
+
*/
|
|
185
|
+
dispose(): void {
|
|
186
|
+
this.channel.dispose();
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Get the global output channel instance
|
|
192
|
+
*/
|
|
193
|
+
export function getOutputChannel(): OutputChannelView {
|
|
194
|
+
return OutputChannelView.getInstance();
|
|
195
|
+
}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Status bar item for showing conversion progress
|
|
3
|
+
* @copyright Copyright (c) 2024-2026 nirholas
|
|
4
|
+
* @license MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import * as vscode from 'vscode';
|
|
8
|
+
import { isCurrentWorkspaceGitHubRepo } from '../commands/convertCurrentRepo';
|
|
9
|
+
|
|
10
|
+
type StatusBarState = 'idle' | 'loading' | 'success' | 'error';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Status bar item manager for the extension
|
|
14
|
+
*/
|
|
15
|
+
export class StatusBarItem {
|
|
16
|
+
private item: vscode.StatusBarItem;
|
|
17
|
+
private state: StatusBarState = 'idle';
|
|
18
|
+
private progressInterval: NodeJS.Timeout | null = null;
|
|
19
|
+
private progressDots = 0;
|
|
20
|
+
|
|
21
|
+
constructor(private context: vscode.ExtensionContext) {
|
|
22
|
+
this.item = vscode.window.createStatusBarItem(
|
|
23
|
+
vscode.StatusBarAlignment.Right,
|
|
24
|
+
100
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
this.item.command = 'github-to-mcp.showQuickActions';
|
|
28
|
+
this.setIdle();
|
|
29
|
+
|
|
30
|
+
// Register the quick actions command
|
|
31
|
+
context.subscriptions.push(
|
|
32
|
+
vscode.commands.registerCommand('github-to-mcp.showQuickActions', () => {
|
|
33
|
+
this.showQuickActions();
|
|
34
|
+
})
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
// Check if current workspace is a GitHub repo
|
|
38
|
+
this.updateVisibility();
|
|
39
|
+
|
|
40
|
+
// Watch for workspace changes
|
|
41
|
+
context.subscriptions.push(
|
|
42
|
+
vscode.workspace.onDidChangeWorkspaceFolders(() => {
|
|
43
|
+
this.updateVisibility();
|
|
44
|
+
})
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Update visibility based on workspace
|
|
50
|
+
*/
|
|
51
|
+
private async updateVisibility(): Promise<void> {
|
|
52
|
+
const isGitHubRepo = await isCurrentWorkspaceGitHubRepo();
|
|
53
|
+
const config = vscode.workspace.getConfiguration('github-to-mcp');
|
|
54
|
+
const alwaysShow = config.get<boolean>('alwaysShowStatusBar', false);
|
|
55
|
+
|
|
56
|
+
if (isGitHubRepo || alwaysShow) {
|
|
57
|
+
this.item.show();
|
|
58
|
+
} else {
|
|
59
|
+
this.item.hide();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Show quick actions menu
|
|
65
|
+
*/
|
|
66
|
+
private async showQuickActions(): Promise<void> {
|
|
67
|
+
const items: vscode.QuickPickItem[] = [
|
|
68
|
+
{
|
|
69
|
+
label: '$(github) Convert from URL',
|
|
70
|
+
description: 'Enter a GitHub repository URL',
|
|
71
|
+
detail: 'Convert any public GitHub repository to MCP server'
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
label: '$(folder) Convert Current Repo',
|
|
75
|
+
description: 'Convert the open workspace',
|
|
76
|
+
detail: 'Convert the currently open GitHub repository'
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
label: '$(list-flat) Browse Registry',
|
|
80
|
+
description: 'Browse popular MCP servers',
|
|
81
|
+
detail: 'Choose from a curated list of repositories'
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
label: '$(gear) Configure Claude Desktop',
|
|
85
|
+
description: 'Auto-configure your MCP servers',
|
|
86
|
+
detail: 'Add converted servers to Claude Desktop config'
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
label: '',
|
|
90
|
+
kind: vscode.QuickPickItemKind.Separator
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
label: '$(history) View History',
|
|
94
|
+
description: 'See conversion history',
|
|
95
|
+
detail: 'View all previously converted repositories'
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
label: '$(output) Show Logs',
|
|
99
|
+
description: 'Open output channel',
|
|
100
|
+
detail: 'View extension logs and debug information'
|
|
101
|
+
}
|
|
102
|
+
];
|
|
103
|
+
|
|
104
|
+
const selected = await vscode.window.showQuickPick(items, {
|
|
105
|
+
placeHolder: 'Select an action',
|
|
106
|
+
title: 'GitHub to MCP'
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
if (!selected) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
switch (selected.label) {
|
|
114
|
+
case '$(github) Convert from URL':
|
|
115
|
+
vscode.commands.executeCommand('github-to-mcp.convertFromUrl');
|
|
116
|
+
break;
|
|
117
|
+
case '$(folder) Convert Current Repo':
|
|
118
|
+
vscode.commands.executeCommand('github-to-mcp.convertCurrentRepo');
|
|
119
|
+
break;
|
|
120
|
+
case '$(list-flat) Browse Registry':
|
|
121
|
+
vscode.commands.executeCommand('github-to-mcp.browseRegistry');
|
|
122
|
+
break;
|
|
123
|
+
case '$(gear) Configure Claude Desktop':
|
|
124
|
+
vscode.commands.executeCommand('github-to-mcp.configureClaudeDesktop');
|
|
125
|
+
break;
|
|
126
|
+
case '$(history) View History':
|
|
127
|
+
vscode.commands.executeCommand('github-to-mcp.history.focus');
|
|
128
|
+
break;
|
|
129
|
+
case '$(output) Show Logs':
|
|
130
|
+
vscode.commands.executeCommand('github-to-mcp.showOutput');
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Set status to idle
|
|
137
|
+
*/
|
|
138
|
+
setIdle(): void {
|
|
139
|
+
this.stopProgress();
|
|
140
|
+
this.state = 'idle';
|
|
141
|
+
this.item.text = '$(github) MCP';
|
|
142
|
+
this.item.tooltip = 'GitHub to MCP: Click for actions';
|
|
143
|
+
this.item.backgroundColor = undefined;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Set status to loading with optional message
|
|
148
|
+
*/
|
|
149
|
+
setLoading(message?: string): void {
|
|
150
|
+
this.state = 'loading';
|
|
151
|
+
this.item.tooltip = message || 'Converting repository...';
|
|
152
|
+
this.item.backgroundColor = new vscode.ThemeColor('statusBarItem.warningBackground');
|
|
153
|
+
this.startProgress();
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Set status to success
|
|
158
|
+
*/
|
|
159
|
+
setSuccess(message?: string): void {
|
|
160
|
+
this.stopProgress();
|
|
161
|
+
this.state = 'success';
|
|
162
|
+
this.item.text = '$(check) MCP';
|
|
163
|
+
this.item.tooltip = message || 'Conversion successful!';
|
|
164
|
+
this.item.backgroundColor = new vscode.ThemeColor('statusBarItem.prominentBackground');
|
|
165
|
+
|
|
166
|
+
// Reset to idle after 3 seconds
|
|
167
|
+
setTimeout(() => {
|
|
168
|
+
if (this.state === 'success') {
|
|
169
|
+
this.setIdle();
|
|
170
|
+
}
|
|
171
|
+
}, 3000);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Set status to error
|
|
176
|
+
*/
|
|
177
|
+
setError(message?: string): void {
|
|
178
|
+
this.stopProgress();
|
|
179
|
+
this.state = 'error';
|
|
180
|
+
this.item.text = '$(error) MCP';
|
|
181
|
+
this.item.tooltip = message || 'Conversion failed';
|
|
182
|
+
this.item.backgroundColor = new vscode.ThemeColor('statusBarItem.errorBackground');
|
|
183
|
+
|
|
184
|
+
// Reset to idle after 5 seconds
|
|
185
|
+
setTimeout(() => {
|
|
186
|
+
if (this.state === 'error') {
|
|
187
|
+
this.setIdle();
|
|
188
|
+
}
|
|
189
|
+
}, 5000);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Start progress animation
|
|
194
|
+
*/
|
|
195
|
+
private startProgress(): void {
|
|
196
|
+
this.stopProgress();
|
|
197
|
+
this.progressDots = 0;
|
|
198
|
+
|
|
199
|
+
this.progressInterval = setInterval(() => {
|
|
200
|
+
this.progressDots = (this.progressDots + 1) % 4;
|
|
201
|
+
const dots = '.'.repeat(this.progressDots);
|
|
202
|
+
this.item.text = `$(sync~spin) MCP${dots}`;
|
|
203
|
+
}, 300);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Stop progress animation
|
|
208
|
+
*/
|
|
209
|
+
private stopProgress(): void {
|
|
210
|
+
if (this.progressInterval) {
|
|
211
|
+
clearInterval(this.progressInterval);
|
|
212
|
+
this.progressInterval = null;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Show the status bar item
|
|
218
|
+
*/
|
|
219
|
+
show(): void {
|
|
220
|
+
this.item.show();
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Hide the status bar item
|
|
225
|
+
*/
|
|
226
|
+
hide(): void {
|
|
227
|
+
this.item.hide();
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Get current state
|
|
232
|
+
*/
|
|
233
|
+
getState(): StatusBarState {
|
|
234
|
+
return this.state;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Dispose the status bar item
|
|
239
|
+
*/
|
|
240
|
+
dispose(): void {
|
|
241
|
+
this.stopProgress();
|
|
242
|
+
this.item.dispose();
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Create and initialize the status bar item
|
|
248
|
+
*/
|
|
249
|
+
export function createStatusBarItem(context: vscode.ExtensionContext): StatusBarItem {
|
|
250
|
+
return new StatusBarItem(context);
|
|
251
|
+
}
|