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,334 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview File-based storage adapter for registry
|
|
3
|
+
* @copyright Copyright (c) 2024-2026 nirholas
|
|
4
|
+
* @license Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import * as fs from 'fs/promises';
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
import type {
|
|
10
|
+
StorageAdapter,
|
|
11
|
+
RegistryEntry,
|
|
12
|
+
RegistryEntrySummary,
|
|
13
|
+
ListOptions,
|
|
14
|
+
ListResult,
|
|
15
|
+
} from './types';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* File-based storage for registry entries
|
|
19
|
+
* Stores entries as JSON files in a directory structure
|
|
20
|
+
*/
|
|
21
|
+
export class FileStorage implements StorageAdapter {
|
|
22
|
+
private dataDir: string;
|
|
23
|
+
private indexCache: Map<string, RegistryEntrySummary> | null = null;
|
|
24
|
+
private indexCacheTime: number = 0;
|
|
25
|
+
private readonly INDEX_CACHE_TTL = 60000; // 1 minute
|
|
26
|
+
|
|
27
|
+
constructor(dataDir?: string) {
|
|
28
|
+
// Default to bundled data directory
|
|
29
|
+
this.dataDir = dataDir || path.join(import.meta.dirname || __dirname, '..', 'data', 'entries');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Ensure the data directory exists
|
|
34
|
+
*/
|
|
35
|
+
private async ensureDir(): Promise<void> {
|
|
36
|
+
try {
|
|
37
|
+
await fs.mkdir(this.dataDir, { recursive: true });
|
|
38
|
+
} catch {
|
|
39
|
+
// Directory may already exist
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Get path to entry file
|
|
45
|
+
*/
|
|
46
|
+
private getEntryPath(id: string): string {
|
|
47
|
+
return path.join(this.dataDir, `${id}.json`);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Build index of all entries
|
|
52
|
+
*/
|
|
53
|
+
private async buildIndex(): Promise<Map<string, RegistryEntrySummary>> {
|
|
54
|
+
const now = Date.now();
|
|
55
|
+
|
|
56
|
+
// Return cached index if still valid
|
|
57
|
+
if (this.indexCache && (now - this.indexCacheTime) < this.INDEX_CACHE_TTL) {
|
|
58
|
+
return this.indexCache;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const index = new Map<string, RegistryEntrySummary>();
|
|
62
|
+
|
|
63
|
+
try {
|
|
64
|
+
await this.ensureDir();
|
|
65
|
+
const files = await fs.readdir(this.dataDir);
|
|
66
|
+
|
|
67
|
+
for (const file of files) {
|
|
68
|
+
if (!file.endsWith('.json')) continue;
|
|
69
|
+
|
|
70
|
+
try {
|
|
71
|
+
const content = await fs.readFile(path.join(this.dataDir, file), 'utf-8');
|
|
72
|
+
const entry: RegistryEntry = JSON.parse(content);
|
|
73
|
+
|
|
74
|
+
index.set(entry.id, {
|
|
75
|
+
id: entry.id,
|
|
76
|
+
name: entry.name,
|
|
77
|
+
description: entry.description,
|
|
78
|
+
sourceRepo: entry.sourceRepo,
|
|
79
|
+
version: entry.version,
|
|
80
|
+
toolCount: entry.toolCount,
|
|
81
|
+
categories: entry.categories,
|
|
82
|
+
popularity: entry.popularity,
|
|
83
|
+
quality: entry.quality.overall,
|
|
84
|
+
verified: entry.verified,
|
|
85
|
+
lastUpdated: entry.lastUpdated,
|
|
86
|
+
});
|
|
87
|
+
} catch {
|
|
88
|
+
// Skip invalid files
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
} catch {
|
|
92
|
+
// Directory doesn't exist yet
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
this.indexCache = index;
|
|
96
|
+
this.indexCacheTime = now;
|
|
97
|
+
return index;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Invalidate the index cache
|
|
102
|
+
*/
|
|
103
|
+
private invalidateCache(): void {
|
|
104
|
+
this.indexCache = null;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Get an entry by ID
|
|
109
|
+
*/
|
|
110
|
+
async get(id: string): Promise<RegistryEntry | null> {
|
|
111
|
+
try {
|
|
112
|
+
const content = await fs.readFile(this.getEntryPath(id), 'utf-8');
|
|
113
|
+
return JSON.parse(content);
|
|
114
|
+
} catch {
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* List entries with filtering and pagination
|
|
121
|
+
*/
|
|
122
|
+
async list(options: ListOptions = {}): Promise<ListResult> {
|
|
123
|
+
const {
|
|
124
|
+
category,
|
|
125
|
+
search,
|
|
126
|
+
sortBy = 'popularity',
|
|
127
|
+
sortOrder = 'desc',
|
|
128
|
+
offset = 0,
|
|
129
|
+
limit = 20,
|
|
130
|
+
verifiedOnly = false,
|
|
131
|
+
} = options;
|
|
132
|
+
|
|
133
|
+
const index = await this.buildIndex();
|
|
134
|
+
let entries = Array.from(index.values());
|
|
135
|
+
|
|
136
|
+
// Filter by category
|
|
137
|
+
if (category) {
|
|
138
|
+
entries = entries.filter(e =>
|
|
139
|
+
e.categories.some(c => c.toLowerCase() === category.toLowerCase())
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Filter by search query
|
|
144
|
+
if (search) {
|
|
145
|
+
const query = search.toLowerCase();
|
|
146
|
+
entries = entries.filter(e =>
|
|
147
|
+
e.name.toLowerCase().includes(query) ||
|
|
148
|
+
e.description.toLowerCase().includes(query) ||
|
|
149
|
+
e.id.toLowerCase().includes(query) ||
|
|
150
|
+
e.sourceRepo.toLowerCase().includes(query)
|
|
151
|
+
);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Filter verified only
|
|
155
|
+
if (verifiedOnly) {
|
|
156
|
+
entries = entries.filter(e => e.verified);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Sort
|
|
160
|
+
entries.sort((a, b) => {
|
|
161
|
+
let comparison = 0;
|
|
162
|
+
switch (sortBy) {
|
|
163
|
+
case 'name':
|
|
164
|
+
comparison = a.name.localeCompare(b.name);
|
|
165
|
+
break;
|
|
166
|
+
case 'quality':
|
|
167
|
+
comparison = a.quality - b.quality;
|
|
168
|
+
break;
|
|
169
|
+
case 'lastUpdated':
|
|
170
|
+
comparison = new Date(a.lastUpdated).getTime() - new Date(b.lastUpdated).getTime();
|
|
171
|
+
break;
|
|
172
|
+
case 'toolCount':
|
|
173
|
+
comparison = a.toolCount - b.toolCount;
|
|
174
|
+
break;
|
|
175
|
+
case 'popularity':
|
|
176
|
+
default:
|
|
177
|
+
comparison = a.popularity - b.popularity;
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
return sortOrder === 'asc' ? comparison : -comparison;
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
const total = entries.length;
|
|
184
|
+
const paginated = entries.slice(offset, offset + limit);
|
|
185
|
+
|
|
186
|
+
return {
|
|
187
|
+
entries: paginated,
|
|
188
|
+
total,
|
|
189
|
+
offset,
|
|
190
|
+
limit,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Save an entry
|
|
196
|
+
*/
|
|
197
|
+
async save(entry: RegistryEntry): Promise<void> {
|
|
198
|
+
await this.ensureDir();
|
|
199
|
+
await fs.writeFile(
|
|
200
|
+
this.getEntryPath(entry.id),
|
|
201
|
+
JSON.stringify(entry, null, 2),
|
|
202
|
+
'utf-8'
|
|
203
|
+
);
|
|
204
|
+
this.invalidateCache();
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Delete an entry
|
|
209
|
+
*/
|
|
210
|
+
async delete(id: string): Promise<boolean> {
|
|
211
|
+
try {
|
|
212
|
+
await fs.unlink(this.getEntryPath(id));
|
|
213
|
+
this.invalidateCache();
|
|
214
|
+
return true;
|
|
215
|
+
} catch {
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Check if entry exists
|
|
222
|
+
*/
|
|
223
|
+
async exists(id: string): Promise<boolean> {
|
|
224
|
+
try {
|
|
225
|
+
await fs.access(this.getEntryPath(id));
|
|
226
|
+
return true;
|
|
227
|
+
} catch {
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Get all unique categories
|
|
234
|
+
*/
|
|
235
|
+
async getCategories(): Promise<string[]> {
|
|
236
|
+
const index = await this.buildIndex();
|
|
237
|
+
const categories = new Set<string>();
|
|
238
|
+
|
|
239
|
+
for (const entry of index.values()) {
|
|
240
|
+
for (const cat of entry.categories) {
|
|
241
|
+
categories.add(cat);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
return Array.from(categories).sort();
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Search entries by query
|
|
250
|
+
*/
|
|
251
|
+
async search(query: string): Promise<RegistryEntrySummary[]> {
|
|
252
|
+
const result = await this.list({ search: query, limit: 50 });
|
|
253
|
+
return result.entries;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* In-memory storage for testing
|
|
259
|
+
*/
|
|
260
|
+
export class MemoryStorage implements StorageAdapter {
|
|
261
|
+
private entries: Map<string, RegistryEntry> = new Map();
|
|
262
|
+
|
|
263
|
+
async get(id: string): Promise<RegistryEntry | null> {
|
|
264
|
+
return this.entries.get(id) || null;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
async list(options: ListOptions = {}): Promise<ListResult> {
|
|
268
|
+
const { offset = 0, limit = 20 } = options;
|
|
269
|
+
const all = Array.from(this.entries.values());
|
|
270
|
+
|
|
271
|
+
return {
|
|
272
|
+
entries: all.slice(offset, offset + limit).map(e => ({
|
|
273
|
+
id: e.id,
|
|
274
|
+
name: e.name,
|
|
275
|
+
description: e.description,
|
|
276
|
+
sourceRepo: e.sourceRepo,
|
|
277
|
+
version: e.version,
|
|
278
|
+
toolCount: e.toolCount,
|
|
279
|
+
categories: e.categories,
|
|
280
|
+
popularity: e.popularity,
|
|
281
|
+
quality: e.quality.overall,
|
|
282
|
+
verified: e.verified,
|
|
283
|
+
lastUpdated: e.lastUpdated,
|
|
284
|
+
})),
|
|
285
|
+
total: all.length,
|
|
286
|
+
offset,
|
|
287
|
+
limit,
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
async save(entry: RegistryEntry): Promise<void> {
|
|
292
|
+
this.entries.set(entry.id, entry);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
async delete(id: string): Promise<boolean> {
|
|
296
|
+
return this.entries.delete(id);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
async exists(id: string): Promise<boolean> {
|
|
300
|
+
return this.entries.has(id);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
async getCategories(): Promise<string[]> {
|
|
304
|
+
const categories = new Set<string>();
|
|
305
|
+
for (const entry of this.entries.values()) {
|
|
306
|
+
for (const cat of entry.categories) {
|
|
307
|
+
categories.add(cat);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
return Array.from(categories).sort();
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
async search(query: string): Promise<RegistryEntrySummary[]> {
|
|
314
|
+
const q = query.toLowerCase();
|
|
315
|
+
return Array.from(this.entries.values())
|
|
316
|
+
.filter(e =>
|
|
317
|
+
e.name.toLowerCase().includes(q) ||
|
|
318
|
+
e.description.toLowerCase().includes(q)
|
|
319
|
+
)
|
|
320
|
+
.map(e => ({
|
|
321
|
+
id: e.id,
|
|
322
|
+
name: e.name,
|
|
323
|
+
description: e.description,
|
|
324
|
+
sourceRepo: e.sourceRepo,
|
|
325
|
+
version: e.version,
|
|
326
|
+
toolCount: e.toolCount,
|
|
327
|
+
categories: e.categories,
|
|
328
|
+
popularity: e.popularity,
|
|
329
|
+
quality: e.quality.overall,
|
|
330
|
+
verified: e.verified,
|
|
331
|
+
lastUpdated: e.lastUpdated,
|
|
332
|
+
}));
|
|
333
|
+
}
|
|
334
|
+
}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Type definitions for MCP Registry
|
|
3
|
+
* @copyright Copyright (c) 2024-2026 nirholas
|
|
4
|
+
* @license Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Quality metrics for a tool or server
|
|
9
|
+
*/
|
|
10
|
+
export interface QualityScore {
|
|
11
|
+
/** Overall quality score (0-100) */
|
|
12
|
+
overall: number;
|
|
13
|
+
/** Schema completeness - required fields, types defined (0-100) */
|
|
14
|
+
schemaCompleteness: number;
|
|
15
|
+
/** Documentation quality - descriptions, examples (0-100) */
|
|
16
|
+
documentation: number;
|
|
17
|
+
/** Has examples in OpenAPI or code (0-100) */
|
|
18
|
+
examples: number;
|
|
19
|
+
/** Authentication handling clarity (0-100) */
|
|
20
|
+
authHandling: number;
|
|
21
|
+
/** Parameter type coverage (0-100) */
|
|
22
|
+
parameterTypes: number;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Summary of a tool in the registry
|
|
27
|
+
*/
|
|
28
|
+
export interface ToolSummary {
|
|
29
|
+
/** Tool name */
|
|
30
|
+
name: string;
|
|
31
|
+
/** Tool description */
|
|
32
|
+
description: string;
|
|
33
|
+
/** Source of extraction (openapi, readme, code, etc.) */
|
|
34
|
+
source: string;
|
|
35
|
+
/** Number of parameters */
|
|
36
|
+
paramCount: number;
|
|
37
|
+
/** Whether authentication is required */
|
|
38
|
+
requiresAuth: boolean;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Authentication scheme detected for an API
|
|
43
|
+
*/
|
|
44
|
+
export interface AuthScheme {
|
|
45
|
+
/** Type of authentication */
|
|
46
|
+
type: 'apiKey' | 'oauth2' | 'http' | 'openIdConnect' | 'none';
|
|
47
|
+
/** Name of the auth header/param */
|
|
48
|
+
name?: string;
|
|
49
|
+
/** Location of the auth credential */
|
|
50
|
+
in?: 'header' | 'query' | 'cookie';
|
|
51
|
+
/** HTTP scheme (bearer, basic) */
|
|
52
|
+
scheme?: 'bearer' | 'basic';
|
|
53
|
+
/** Environment variable name for the credential */
|
|
54
|
+
envVar?: string;
|
|
55
|
+
/** Description of how to obtain credentials */
|
|
56
|
+
instructions?: string;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* IDE configuration formats
|
|
61
|
+
*/
|
|
62
|
+
export interface IdeConfigs {
|
|
63
|
+
/** Claude Desktop configuration */
|
|
64
|
+
claude: {
|
|
65
|
+
mcpServers: Record<string, {
|
|
66
|
+
command: string;
|
|
67
|
+
args: string[];
|
|
68
|
+
env?: Record<string, string>;
|
|
69
|
+
}>;
|
|
70
|
+
};
|
|
71
|
+
/** Cursor configuration */
|
|
72
|
+
cursor: {
|
|
73
|
+
mcpServers: Record<string, {
|
|
74
|
+
command: string;
|
|
75
|
+
args: string[];
|
|
76
|
+
env?: Record<string, string>;
|
|
77
|
+
}>;
|
|
78
|
+
};
|
|
79
|
+
/** VS Code configuration */
|
|
80
|
+
vscode: {
|
|
81
|
+
mcpServers: Record<string, {
|
|
82
|
+
command: string;
|
|
83
|
+
args: string[];
|
|
84
|
+
env?: Record<string, string>;
|
|
85
|
+
}>;
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Generated code for different languages
|
|
91
|
+
*/
|
|
92
|
+
export interface GeneratedCode {
|
|
93
|
+
/** TypeScript MCP server code */
|
|
94
|
+
typescript: string;
|
|
95
|
+
/** Python MCP server code (optional) */
|
|
96
|
+
python?: string;
|
|
97
|
+
/** Go MCP server code (optional) */
|
|
98
|
+
go?: string;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* A registry entry for a pre-converted MCP server
|
|
103
|
+
*/
|
|
104
|
+
export interface RegistryEntry {
|
|
105
|
+
/** Unique identifier (e.g., "stripe-mcp") */
|
|
106
|
+
id: string;
|
|
107
|
+
/** Display name (e.g., "Stripe") */
|
|
108
|
+
name: string;
|
|
109
|
+
/** Short description */
|
|
110
|
+
description: string;
|
|
111
|
+
/** Source GitHub repository (e.g., "stripe/stripe-node") */
|
|
112
|
+
sourceRepo: string;
|
|
113
|
+
/** Source repository URL */
|
|
114
|
+
sourceUrl: string;
|
|
115
|
+
/** Registry entry version */
|
|
116
|
+
version: string;
|
|
117
|
+
/** Source repo version/commit this was generated from */
|
|
118
|
+
sourceVersion: string;
|
|
119
|
+
/** Number of tools */
|
|
120
|
+
toolCount: number;
|
|
121
|
+
/** Summary of all tools */
|
|
122
|
+
tools: ToolSummary[];
|
|
123
|
+
/** Categories for filtering */
|
|
124
|
+
categories: string[];
|
|
125
|
+
/** Tags for search */
|
|
126
|
+
tags: string[];
|
|
127
|
+
/** Download/install count */
|
|
128
|
+
popularity: number;
|
|
129
|
+
/** Last updated timestamp */
|
|
130
|
+
lastUpdated: string;
|
|
131
|
+
/** When entry was created */
|
|
132
|
+
createdAt: string;
|
|
133
|
+
/** Generated code for each language */
|
|
134
|
+
generatedCode: GeneratedCode;
|
|
135
|
+
/** IDE configuration snippets */
|
|
136
|
+
configs: IdeConfigs;
|
|
137
|
+
/** Quality metrics */
|
|
138
|
+
quality: QualityScore;
|
|
139
|
+
/** Authentication requirements */
|
|
140
|
+
auth: AuthScheme[];
|
|
141
|
+
/** Documentation URL */
|
|
142
|
+
docsUrl?: string;
|
|
143
|
+
/** API documentation URL */
|
|
144
|
+
apiDocsUrl?: string;
|
|
145
|
+
/** Logo/icon URL */
|
|
146
|
+
iconUrl?: string;
|
|
147
|
+
/** Whether this is an official/verified entry */
|
|
148
|
+
verified: boolean;
|
|
149
|
+
/** Author of the registry entry */
|
|
150
|
+
author: string;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Minimal registry entry for list views
|
|
155
|
+
*/
|
|
156
|
+
export interface RegistryEntrySummary {
|
|
157
|
+
id: string;
|
|
158
|
+
name: string;
|
|
159
|
+
description: string;
|
|
160
|
+
sourceRepo: string;
|
|
161
|
+
version: string;
|
|
162
|
+
toolCount: number;
|
|
163
|
+
categories: string[];
|
|
164
|
+
popularity: number;
|
|
165
|
+
quality: number;
|
|
166
|
+
verified: boolean;
|
|
167
|
+
lastUpdated: string;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Options for listing registry entries
|
|
172
|
+
*/
|
|
173
|
+
export interface ListOptions {
|
|
174
|
+
/** Filter by category */
|
|
175
|
+
category?: string;
|
|
176
|
+
/** Search query */
|
|
177
|
+
search?: string;
|
|
178
|
+
/** Sort field */
|
|
179
|
+
sortBy?: 'popularity' | 'name' | 'quality' | 'lastUpdated' | 'toolCount';
|
|
180
|
+
/** Sort direction */
|
|
181
|
+
sortOrder?: 'asc' | 'desc';
|
|
182
|
+
/** Pagination offset */
|
|
183
|
+
offset?: number;
|
|
184
|
+
/** Pagination limit */
|
|
185
|
+
limit?: number;
|
|
186
|
+
/** Only show verified entries */
|
|
187
|
+
verifiedOnly?: boolean;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Result of a list operation
|
|
192
|
+
*/
|
|
193
|
+
export interface ListResult {
|
|
194
|
+
entries: RegistryEntrySummary[];
|
|
195
|
+
total: number;
|
|
196
|
+
offset: number;
|
|
197
|
+
limit: number;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Options for installing a registry entry
|
|
202
|
+
*/
|
|
203
|
+
export interface InstallOptions {
|
|
204
|
+
/** Target IDE/tool */
|
|
205
|
+
target: 'claude' | 'cursor' | 'vscode' | 'file';
|
|
206
|
+
/** Output directory (for 'file' target) */
|
|
207
|
+
outputDir?: string;
|
|
208
|
+
/** Environment variables to set */
|
|
209
|
+
env?: Record<string, string>;
|
|
210
|
+
/** Language preference */
|
|
211
|
+
language?: 'typescript' | 'python';
|
|
212
|
+
/** Overwrite existing installation */
|
|
213
|
+
overwrite?: boolean;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Result of an install operation
|
|
218
|
+
*/
|
|
219
|
+
export interface InstallResult {
|
|
220
|
+
success: boolean;
|
|
221
|
+
/** Path to installed files or config */
|
|
222
|
+
path?: string;
|
|
223
|
+
/** Installation instructions */
|
|
224
|
+
instructions?: string[];
|
|
225
|
+
/** Error message if failed */
|
|
226
|
+
error?: string;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Information about available updates
|
|
231
|
+
*/
|
|
232
|
+
export interface UpdateInfo {
|
|
233
|
+
/** Entry ID */
|
|
234
|
+
id: string;
|
|
235
|
+
/** Current installed version */
|
|
236
|
+
currentVersion: string;
|
|
237
|
+
/** Latest available version */
|
|
238
|
+
latestVersion: string;
|
|
239
|
+
/** What changed */
|
|
240
|
+
changelog?: string;
|
|
241
|
+
/** Whether update is breaking */
|
|
242
|
+
breaking: boolean;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Storage adapter interface for registry data
|
|
247
|
+
*/
|
|
248
|
+
export interface StorageAdapter {
|
|
249
|
+
/** Get an entry by ID */
|
|
250
|
+
get(id: string): Promise<RegistryEntry | null>;
|
|
251
|
+
/** List all entries */
|
|
252
|
+
list(options?: ListOptions): Promise<ListResult>;
|
|
253
|
+
/** Save an entry */
|
|
254
|
+
save(entry: RegistryEntry): Promise<void>;
|
|
255
|
+
/** Delete an entry */
|
|
256
|
+
delete(id: string): Promise<boolean>;
|
|
257
|
+
/** Check if entry exists */
|
|
258
|
+
exists(id: string): Promise<boolean>;
|
|
259
|
+
/** Get all categories */
|
|
260
|
+
getCategories(): Promise<string[]>;
|
|
261
|
+
/** Search entries */
|
|
262
|
+
search(query: string): Promise<RegistryEntrySummary[]>;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Registry statistics
|
|
267
|
+
*/
|
|
268
|
+
export interface RegistryStats {
|
|
269
|
+
totalEntries: number;
|
|
270
|
+
totalTools: number;
|
|
271
|
+
totalDownloads: number;
|
|
272
|
+
categories: { name: string; count: number }[];
|
|
273
|
+
topEntries: RegistryEntrySummary[];
|
|
274
|
+
recentlyUpdated: RegistryEntrySummary[];
|
|
275
|
+
}
|