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,404 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Plugin registry for managing extractor plugins
|
|
3
|
+
* @copyright Copyright (c) 2024-2026 nirholas
|
|
4
|
+
* @license MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
ExtractorPlugin,
|
|
9
|
+
PluginRegistryEntry,
|
|
10
|
+
PluginLoadResult,
|
|
11
|
+
PluginFactory,
|
|
12
|
+
PluginEvent,
|
|
13
|
+
PluginEventHandler
|
|
14
|
+
} from './types';
|
|
15
|
+
import * as path from 'path';
|
|
16
|
+
import * as fs from 'fs/promises';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Plugin registry that manages loading, storing, and accessing plugins
|
|
20
|
+
*/
|
|
21
|
+
export class PluginRegistry {
|
|
22
|
+
private plugins: Map<string, PluginRegistryEntry> = new Map();
|
|
23
|
+
private eventHandlers: Set<PluginEventHandler> = new Set();
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Register a plugin from an ExtractorPlugin instance
|
|
27
|
+
*/
|
|
28
|
+
register(plugin: ExtractorPlugin, config: Record<string, any> = {}): void {
|
|
29
|
+
const entry: PluginRegistryEntry = {
|
|
30
|
+
plugin,
|
|
31
|
+
config,
|
|
32
|
+
enabled: true,
|
|
33
|
+
source: 'inline',
|
|
34
|
+
loadedAt: new Date()
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
this.plugins.set(plugin.metadata.id, entry);
|
|
38
|
+
|
|
39
|
+
// Call onRegister hook
|
|
40
|
+
plugin.hooks?.onRegister?.();
|
|
41
|
+
|
|
42
|
+
this.emit({
|
|
43
|
+
type: 'registered',
|
|
44
|
+
pluginId: plugin.metadata.id,
|
|
45
|
+
timestamp: new Date(),
|
|
46
|
+
data: { name: plugin.metadata.name, version: plugin.metadata.version }
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Unregister a plugin by ID
|
|
52
|
+
*/
|
|
53
|
+
async unregister(pluginId: string): Promise<boolean> {
|
|
54
|
+
const entry = this.plugins.get(pluginId);
|
|
55
|
+
if (!entry) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Call onUnregister hook
|
|
60
|
+
await entry.plugin.hooks?.onUnregister?.();
|
|
61
|
+
|
|
62
|
+
this.plugins.delete(pluginId);
|
|
63
|
+
|
|
64
|
+
this.emit({
|
|
65
|
+
type: 'unregistered',
|
|
66
|
+
pluginId,
|
|
67
|
+
timestamp: new Date()
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Load a plugin from an npm package
|
|
75
|
+
*/
|
|
76
|
+
async loadFromNpm(packageName: string, config: Record<string, any> = {}): Promise<PluginLoadResult> {
|
|
77
|
+
try {
|
|
78
|
+
// Dynamic import of the npm package
|
|
79
|
+
const module = await import(packageName);
|
|
80
|
+
|
|
81
|
+
// Check for default export or plugin factory
|
|
82
|
+
let plugin: ExtractorPlugin;
|
|
83
|
+
|
|
84
|
+
if (typeof module.default === 'function') {
|
|
85
|
+
// Plugin factory
|
|
86
|
+
plugin = (module.default as PluginFactory)(config);
|
|
87
|
+
} else if (typeof module.default === 'object' && module.default.metadata) {
|
|
88
|
+
// Direct plugin export
|
|
89
|
+
plugin = module.default;
|
|
90
|
+
} else if (typeof module.createPlugin === 'function') {
|
|
91
|
+
// Named factory export
|
|
92
|
+
plugin = module.createPlugin(config);
|
|
93
|
+
} else {
|
|
94
|
+
throw new Error(`Package ${packageName} does not export a valid plugin`);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const entry: PluginRegistryEntry = {
|
|
98
|
+
plugin,
|
|
99
|
+
config,
|
|
100
|
+
enabled: true,
|
|
101
|
+
source: 'npm',
|
|
102
|
+
loadedAt: new Date()
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
this.plugins.set(plugin.metadata.id, entry);
|
|
106
|
+
plugin.hooks?.onRegister?.();
|
|
107
|
+
|
|
108
|
+
this.emit({
|
|
109
|
+
type: 'registered',
|
|
110
|
+
pluginId: plugin.metadata.id,
|
|
111
|
+
timestamp: new Date(),
|
|
112
|
+
data: { source: 'npm', package: packageName }
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
return {
|
|
116
|
+
success: true,
|
|
117
|
+
plugin,
|
|
118
|
+
source: 'npm'
|
|
119
|
+
};
|
|
120
|
+
} catch (error) {
|
|
121
|
+
return {
|
|
122
|
+
success: false,
|
|
123
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
124
|
+
source: 'npm'
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Load a plugin from a local file
|
|
131
|
+
*/
|
|
132
|
+
async loadFromFile(filePath: string, config: Record<string, any> = {}): Promise<PluginLoadResult> {
|
|
133
|
+
try {
|
|
134
|
+
const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(process.cwd(), filePath);
|
|
135
|
+
|
|
136
|
+
// Check file exists
|
|
137
|
+
await fs.access(absolutePath);
|
|
138
|
+
|
|
139
|
+
// Dynamic import
|
|
140
|
+
const module = await import(absolutePath);
|
|
141
|
+
|
|
142
|
+
let plugin: ExtractorPlugin;
|
|
143
|
+
|
|
144
|
+
if (typeof module.default === 'function') {
|
|
145
|
+
plugin = (module.default as PluginFactory)(config);
|
|
146
|
+
} else if (typeof module.default === 'object' && module.default.metadata) {
|
|
147
|
+
plugin = module.default;
|
|
148
|
+
} else if (typeof module.createPlugin === 'function') {
|
|
149
|
+
plugin = module.createPlugin(config);
|
|
150
|
+
} else {
|
|
151
|
+
throw new Error(`File ${filePath} does not export a valid plugin`);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const entry: PluginRegistryEntry = {
|
|
155
|
+
plugin,
|
|
156
|
+
config,
|
|
157
|
+
enabled: true,
|
|
158
|
+
source: 'local',
|
|
159
|
+
loadedAt: new Date()
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
this.plugins.set(plugin.metadata.id, entry);
|
|
163
|
+
plugin.hooks?.onRegister?.();
|
|
164
|
+
|
|
165
|
+
this.emit({
|
|
166
|
+
type: 'registered',
|
|
167
|
+
pluginId: plugin.metadata.id,
|
|
168
|
+
timestamp: new Date(),
|
|
169
|
+
data: { source: 'local', file: filePath }
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
return {
|
|
173
|
+
success: true,
|
|
174
|
+
plugin,
|
|
175
|
+
source: 'local'
|
|
176
|
+
};
|
|
177
|
+
} catch (error) {
|
|
178
|
+
return {
|
|
179
|
+
success: false,
|
|
180
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
181
|
+
source: 'local'
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Load all plugins from a directory
|
|
188
|
+
*/
|
|
189
|
+
async loadFromDirectory(dirPath: string, config: Record<string, any> = {}): Promise<PluginLoadResult[]> {
|
|
190
|
+
const results: PluginLoadResult[] = [];
|
|
191
|
+
|
|
192
|
+
try {
|
|
193
|
+
const absolutePath = path.isAbsolute(dirPath) ? dirPath : path.resolve(process.cwd(), dirPath);
|
|
194
|
+
const entries = await fs.readdir(absolutePath, { withFileTypes: true });
|
|
195
|
+
|
|
196
|
+
for (const entry of entries) {
|
|
197
|
+
if (entry.isFile() && (entry.name.endsWith('.js') || entry.name.endsWith('.ts') || entry.name.endsWith('.mjs'))) {
|
|
198
|
+
const filePath = path.join(absolutePath, entry.name);
|
|
199
|
+
const result = await this.loadFromFile(filePath, config);
|
|
200
|
+
results.push(result);
|
|
201
|
+
} else if (entry.isDirectory()) {
|
|
202
|
+
// Check for index file in directory
|
|
203
|
+
const indexPath = path.join(absolutePath, entry.name, 'index.js');
|
|
204
|
+
try {
|
|
205
|
+
await fs.access(indexPath);
|
|
206
|
+
const result = await this.loadFromFile(indexPath, config);
|
|
207
|
+
results.push(result);
|
|
208
|
+
} catch {
|
|
209
|
+
// No index file, skip directory
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
} catch (error) {
|
|
214
|
+
results.push({
|
|
215
|
+
success: false,
|
|
216
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
217
|
+
source: 'local'
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
return results;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Get a plugin by ID
|
|
226
|
+
*/
|
|
227
|
+
get(pluginId: string): ExtractorPlugin | undefined {
|
|
228
|
+
return this.plugins.get(pluginId)?.plugin;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Get a plugin entry by ID
|
|
233
|
+
*/
|
|
234
|
+
getEntry(pluginId: string): PluginRegistryEntry | undefined {
|
|
235
|
+
return this.plugins.get(pluginId);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Check if a plugin is registered
|
|
240
|
+
*/
|
|
241
|
+
has(pluginId: string): boolean {
|
|
242
|
+
return this.plugins.has(pluginId);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Enable a plugin
|
|
247
|
+
*/
|
|
248
|
+
enable(pluginId: string): boolean {
|
|
249
|
+
const entry = this.plugins.get(pluginId);
|
|
250
|
+
if (!entry) return false;
|
|
251
|
+
|
|
252
|
+
entry.enabled = true;
|
|
253
|
+
|
|
254
|
+
this.emit({
|
|
255
|
+
type: 'enabled',
|
|
256
|
+
pluginId,
|
|
257
|
+
timestamp: new Date()
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
return true;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Disable a plugin
|
|
265
|
+
*/
|
|
266
|
+
disable(pluginId: string): boolean {
|
|
267
|
+
const entry = this.plugins.get(pluginId);
|
|
268
|
+
if (!entry) return false;
|
|
269
|
+
|
|
270
|
+
entry.enabled = false;
|
|
271
|
+
|
|
272
|
+
this.emit({
|
|
273
|
+
type: 'disabled',
|
|
274
|
+
pluginId,
|
|
275
|
+
timestamp: new Date()
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
return true;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* List all registered plugins
|
|
283
|
+
*/
|
|
284
|
+
list(): Array<{ id: string; name: string; version: string; enabled: boolean; source: string }> {
|
|
285
|
+
return Array.from(this.plugins.entries()).map(([id, entry]) => ({
|
|
286
|
+
id,
|
|
287
|
+
name: entry.plugin.metadata.name,
|
|
288
|
+
version: entry.plugin.metadata.version,
|
|
289
|
+
enabled: entry.enabled,
|
|
290
|
+
source: entry.source
|
|
291
|
+
}));
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Get all enabled plugins
|
|
296
|
+
*/
|
|
297
|
+
getEnabled(): ExtractorPlugin[] {
|
|
298
|
+
return Array.from(this.plugins.values())
|
|
299
|
+
.filter(entry => entry.enabled)
|
|
300
|
+
.map(entry => entry.plugin);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Get all plugins
|
|
305
|
+
*/
|
|
306
|
+
getAll(): ExtractorPlugin[] {
|
|
307
|
+
return Array.from(this.plugins.values()).map(entry => entry.plugin);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
* Update plugin configuration
|
|
312
|
+
*/
|
|
313
|
+
updateConfig(pluginId: string, config: Record<string, any>): boolean {
|
|
314
|
+
const entry = this.plugins.get(pluginId);
|
|
315
|
+
if (!entry) return false;
|
|
316
|
+
|
|
317
|
+
// Validate config against schema if available
|
|
318
|
+
if (entry.plugin.configSchema) {
|
|
319
|
+
for (const schema of entry.plugin.configSchema) {
|
|
320
|
+
if (schema.required && !(schema.name in config)) {
|
|
321
|
+
throw new Error(`Missing required config option: ${schema.name}`);
|
|
322
|
+
}
|
|
323
|
+
if (schema.name in config && schema.validate) {
|
|
324
|
+
if (!schema.validate(config[schema.name])) {
|
|
325
|
+
throw new Error(`Invalid value for config option: ${schema.name}`);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
entry.config = { ...entry.config, ...config };
|
|
332
|
+
return true;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* Get plugin configuration
|
|
337
|
+
*/
|
|
338
|
+
getConfig(pluginId: string): Record<string, any> | undefined {
|
|
339
|
+
return this.plugins.get(pluginId)?.config;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* Subscribe to plugin events
|
|
344
|
+
*/
|
|
345
|
+
on(handler: PluginEventHandler): () => void {
|
|
346
|
+
this.eventHandlers.add(handler);
|
|
347
|
+
return () => this.eventHandlers.delete(handler);
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* Emit a plugin event
|
|
352
|
+
*/
|
|
353
|
+
private emit(event: PluginEvent): void {
|
|
354
|
+
for (const handler of this.eventHandlers) {
|
|
355
|
+
try {
|
|
356
|
+
handler(event);
|
|
357
|
+
} catch {
|
|
358
|
+
// Ignore handler errors
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* Clear all plugins
|
|
365
|
+
*/
|
|
366
|
+
async clear(): Promise<void> {
|
|
367
|
+
for (const [id, entry] of this.plugins) {
|
|
368
|
+
await entry.plugin.hooks?.onUnregister?.();
|
|
369
|
+
this.emit({
|
|
370
|
+
type: 'unregistered',
|
|
371
|
+
pluginId: id,
|
|
372
|
+
timestamp: new Date()
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
this.plugins.clear();
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
/**
|
|
379
|
+
* Get registry statistics
|
|
380
|
+
*/
|
|
381
|
+
stats(): {
|
|
382
|
+
total: number;
|
|
383
|
+
enabled: number;
|
|
384
|
+
disabled: number;
|
|
385
|
+
bySource: Record<string, number>;
|
|
386
|
+
} {
|
|
387
|
+
const entries = Array.from(this.plugins.values());
|
|
388
|
+
const bySource: Record<string, number> = {};
|
|
389
|
+
|
|
390
|
+
for (const entry of entries) {
|
|
391
|
+
bySource[entry.source] = (bySource[entry.source] || 0) + 1;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
return {
|
|
395
|
+
total: entries.length,
|
|
396
|
+
enabled: entries.filter(e => e.enabled).length,
|
|
397
|
+
disabled: entries.filter(e => !e.enabled).length,
|
|
398
|
+
bySource
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
// Default registry instance
|
|
404
|
+
export const defaultRegistry = new PluginRegistry();
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Plugin system type definitions
|
|
3
|
+
* @copyright Copyright (c) 2024-2026 nirholas
|
|
4
|
+
* @license MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { ExtractedTool, GithubToMcpOptions, RepoClassification } from '../types';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Repository context passed to plugins
|
|
11
|
+
*/
|
|
12
|
+
export interface PluginRepoContext {
|
|
13
|
+
/** Repository owner */
|
|
14
|
+
owner: string;
|
|
15
|
+
/** Repository name */
|
|
16
|
+
repo: string;
|
|
17
|
+
/** Repository URL */
|
|
18
|
+
url: string;
|
|
19
|
+
/** Repository classification */
|
|
20
|
+
classification: RepoClassification;
|
|
21
|
+
/** Repository metadata */
|
|
22
|
+
metadata: {
|
|
23
|
+
stars: number;
|
|
24
|
+
language: string;
|
|
25
|
+
license?: string;
|
|
26
|
+
description?: string;
|
|
27
|
+
};
|
|
28
|
+
/** README content if available */
|
|
29
|
+
readme?: string;
|
|
30
|
+
/** GitHub token for API access */
|
|
31
|
+
githubToken?: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* File content for plugin processing
|
|
36
|
+
*/
|
|
37
|
+
export interface PluginFileContent {
|
|
38
|
+
path: string;
|
|
39
|
+
content: string;
|
|
40
|
+
language: string;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Plugin detection result
|
|
45
|
+
*/
|
|
46
|
+
export interface PluginDetectionResult {
|
|
47
|
+
/** Whether the plugin should process this repo */
|
|
48
|
+
shouldProcess: boolean;
|
|
49
|
+
/** Confidence level (0-1) */
|
|
50
|
+
confidence: number;
|
|
51
|
+
/** Reason for the decision */
|
|
52
|
+
reason: string;
|
|
53
|
+
/** Specific files that triggered detection */
|
|
54
|
+
matchedFiles?: string[];
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Plugin extraction result
|
|
59
|
+
*/
|
|
60
|
+
export interface PluginExtractionResult {
|
|
61
|
+
/** Extracted tools */
|
|
62
|
+
tools: ExtractedTool[];
|
|
63
|
+
/** Source files processed */
|
|
64
|
+
sourceFiles: string[];
|
|
65
|
+
/** Any warnings during extraction */
|
|
66
|
+
warnings?: string[];
|
|
67
|
+
/** Plugin-specific metadata */
|
|
68
|
+
metadata?: Record<string, any>;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Plugin lifecycle hooks
|
|
73
|
+
*/
|
|
74
|
+
export interface PluginHooks {
|
|
75
|
+
/** Called when the plugin is registered */
|
|
76
|
+
onRegister?: () => void | Promise<void>;
|
|
77
|
+
/** Called when the plugin is unregistered */
|
|
78
|
+
onUnregister?: () => void | Promise<void>;
|
|
79
|
+
/** Called before extraction begins */
|
|
80
|
+
beforeExtract?: (context: PluginRepoContext) => void | Promise<void>;
|
|
81
|
+
/** Called after extraction completes */
|
|
82
|
+
afterExtract?: (result: PluginExtractionResult) => void | Promise<void>;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Plugin configuration schema
|
|
87
|
+
*/
|
|
88
|
+
export interface PluginConfigSchema {
|
|
89
|
+
/** Configuration option name */
|
|
90
|
+
name: string;
|
|
91
|
+
/** Option type */
|
|
92
|
+
type: 'string' | 'number' | 'boolean' | 'array' | 'object';
|
|
93
|
+
/** Description of the option */
|
|
94
|
+
description: string;
|
|
95
|
+
/** Default value */
|
|
96
|
+
default?: any;
|
|
97
|
+
/** Whether the option is required */
|
|
98
|
+
required?: boolean;
|
|
99
|
+
/** Validation function */
|
|
100
|
+
validate?: (value: any) => boolean;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Plugin metadata
|
|
105
|
+
*/
|
|
106
|
+
export interface PluginMetadata {
|
|
107
|
+
/** Unique plugin identifier */
|
|
108
|
+
id: string;
|
|
109
|
+
/** Human-readable name */
|
|
110
|
+
name: string;
|
|
111
|
+
/** Plugin version (semver) */
|
|
112
|
+
version: string;
|
|
113
|
+
/** Plugin description */
|
|
114
|
+
description: string;
|
|
115
|
+
/** Plugin author */
|
|
116
|
+
author?: string;
|
|
117
|
+
/** Plugin homepage/repository */
|
|
118
|
+
homepage?: string;
|
|
119
|
+
/** License */
|
|
120
|
+
license?: string;
|
|
121
|
+
/** Tags for categorization */
|
|
122
|
+
tags?: string[];
|
|
123
|
+
/** Minimum core version required */
|
|
124
|
+
minCoreVersion?: string;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Main plugin interface that extractors must implement
|
|
129
|
+
*/
|
|
130
|
+
export interface ExtractorPlugin {
|
|
131
|
+
/** Plugin metadata */
|
|
132
|
+
metadata: PluginMetadata;
|
|
133
|
+
|
|
134
|
+
/** Configuration schema */
|
|
135
|
+
configSchema?: PluginConfigSchema[];
|
|
136
|
+
|
|
137
|
+
/** Lifecycle hooks */
|
|
138
|
+
hooks?: PluginHooks;
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Detect if this plugin should process the repository
|
|
142
|
+
* @param context Repository context
|
|
143
|
+
* @param files List of files in the repository
|
|
144
|
+
*/
|
|
145
|
+
detect(context: PluginRepoContext, files: string[]): Promise<PluginDetectionResult>;
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Extract tools from the repository
|
|
149
|
+
* @param context Repository context
|
|
150
|
+
* @param getFile Function to get file content
|
|
151
|
+
* @param config Plugin configuration
|
|
152
|
+
*/
|
|
153
|
+
extract(
|
|
154
|
+
context: PluginRepoContext,
|
|
155
|
+
getFile: (path: string) => Promise<string | null>,
|
|
156
|
+
config?: Record<string, any>
|
|
157
|
+
): Promise<PluginExtractionResult>;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Plugin factory function type
|
|
162
|
+
*/
|
|
163
|
+
export type PluginFactory = (options?: Record<string, any>) => ExtractorPlugin;
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Plugin loader result
|
|
167
|
+
*/
|
|
168
|
+
export interface PluginLoadResult {
|
|
169
|
+
success: boolean;
|
|
170
|
+
plugin?: ExtractorPlugin;
|
|
171
|
+
error?: Error;
|
|
172
|
+
source: 'npm' | 'local' | 'inline';
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Plugin registry entry
|
|
177
|
+
*/
|
|
178
|
+
export interface PluginRegistryEntry {
|
|
179
|
+
plugin: ExtractorPlugin;
|
|
180
|
+
config: Record<string, any>;
|
|
181
|
+
enabled: boolean;
|
|
182
|
+
source: 'npm' | 'local' | 'inline';
|
|
183
|
+
loadedAt: Date;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Plugin manager configuration
|
|
188
|
+
*/
|
|
189
|
+
export interface PluginManagerConfig {
|
|
190
|
+
/** Directory to search for local plugins */
|
|
191
|
+
pluginDir?: string;
|
|
192
|
+
/** Auto-load plugins from pluginDir */
|
|
193
|
+
autoLoad?: boolean;
|
|
194
|
+
/** Enable verbose logging */
|
|
195
|
+
verbose?: boolean;
|
|
196
|
+
/** Plugin execution timeout in ms */
|
|
197
|
+
timeout?: number;
|
|
198
|
+
/** Run plugins in parallel */
|
|
199
|
+
parallel?: boolean;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Event emitted by plugin manager
|
|
204
|
+
*/
|
|
205
|
+
export interface PluginEvent {
|
|
206
|
+
type: 'registered' | 'unregistered' | 'enabled' | 'disabled' | 'error' | 'extraction-start' | 'extraction-complete';
|
|
207
|
+
pluginId: string;
|
|
208
|
+
timestamp: Date;
|
|
209
|
+
data?: any;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Plugin event handler
|
|
214
|
+
*/
|
|
215
|
+
export type PluginEventHandler = (event: PluginEvent) => void;
|