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,245 @@
|
|
|
1
|
+
# Development Setup
|
|
2
|
+
|
|
3
|
+
Set up your local development environment for contributing to GitHub to MCP.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
- **Node.js 18+** - [Download](https://nodejs.org)
|
|
8
|
+
- **pnpm** - [Install](https://pnpm.io/installation)
|
|
9
|
+
- **Git** - [Download](https://git-scm.com)
|
|
10
|
+
|
|
11
|
+
## Clone and Install
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# Clone the repository
|
|
15
|
+
git clone https://github.com/nirholas/github-to-mcp
|
|
16
|
+
cd github-to-mcp
|
|
17
|
+
|
|
18
|
+
# Install dependencies
|
|
19
|
+
pnpm install
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Project Structure
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
github-to-mcp/
|
|
26
|
+
├── apps/
|
|
27
|
+
│ ├── web/ # Next.js web application
|
|
28
|
+
│ ├── docs/ # Documentation (Nextra)
|
|
29
|
+
│ └── vscode/ # VS Code extension
|
|
30
|
+
├── packages/
|
|
31
|
+
│ ├── core/ # Core conversion library
|
|
32
|
+
│ ├── openapi-parser/ # OpenAPI/GraphQL parser
|
|
33
|
+
│ └── mcp-server/ # MCP server implementation
|
|
34
|
+
├── mkdocs/ # MkDocs documentation
|
|
35
|
+
├── tests/ # Integration tests
|
|
36
|
+
└── templates/ # Code generation templates
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Development Commands
|
|
40
|
+
|
|
41
|
+
### Build All Packages
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
pnpm build
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Build Specific Package
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
pnpm --filter @nirholas/github-to-mcp build
|
|
51
|
+
pnpm --filter @github-to-mcp/openapi-parser build
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Run Development Server
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
pnpm dev
|
|
58
|
+
# Opens web app at http://localhost:3000
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Run Tests
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
# All tests
|
|
65
|
+
pnpm test
|
|
66
|
+
|
|
67
|
+
# Watch mode
|
|
68
|
+
pnpm test:watch
|
|
69
|
+
|
|
70
|
+
# Coverage
|
|
71
|
+
pnpm test:coverage
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Lint and Format
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
# Check
|
|
78
|
+
pnpm lint
|
|
79
|
+
|
|
80
|
+
# Fix
|
|
81
|
+
pnpm lint:fix
|
|
82
|
+
|
|
83
|
+
# Format
|
|
84
|
+
pnpm format
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Package Development
|
|
88
|
+
|
|
89
|
+
### Core Package
|
|
90
|
+
|
|
91
|
+
The main conversion library:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
cd packages/core
|
|
95
|
+
pnpm build
|
|
96
|
+
pnpm test
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Key files:
|
|
100
|
+
- `src/index.ts` - Public API
|
|
101
|
+
- `src/generator.ts` - Main generator
|
|
102
|
+
- `src/extractors/` - Tool extraction
|
|
103
|
+
- `src/github/` - GitHub API client
|
|
104
|
+
|
|
105
|
+
### OpenAPI Parser
|
|
106
|
+
|
|
107
|
+
Parse OpenAPI and GraphQL specs:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
cd packages/openapi-parser
|
|
111
|
+
pnpm build
|
|
112
|
+
pnpm test
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Key files:
|
|
116
|
+
- `src/openapi.ts` - OpenAPI parser
|
|
117
|
+
- `src/graphql.ts` - GraphQL parser
|
|
118
|
+
- `src/utils.ts` - Shared utilities
|
|
119
|
+
|
|
120
|
+
### MCP Server
|
|
121
|
+
|
|
122
|
+
MCP server implementation:
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
cd packages/mcp-server
|
|
126
|
+
pnpm build
|
|
127
|
+
pnpm test
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Key files:
|
|
131
|
+
- `src/server.ts` - Server class
|
|
132
|
+
- `src/transport/` - Transport implementations
|
|
133
|
+
- `src/tools/` - Tool registration
|
|
134
|
+
|
|
135
|
+
## Web App Development
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
cd apps/web
|
|
139
|
+
pnpm dev
|
|
140
|
+
# http://localhost:3000
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Key directories:
|
|
144
|
+
- `app/` - Next.js app router pages
|
|
145
|
+
- `components/` - React components
|
|
146
|
+
- `lib/` - Utilities and helpers
|
|
147
|
+
|
|
148
|
+
## Environment Setup
|
|
149
|
+
|
|
150
|
+
Create `.env.local` in the root:
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
# Optional: For testing with private repos
|
|
154
|
+
GITHUB_TOKEN=ghp_xxxxx
|
|
155
|
+
|
|
156
|
+
# Optional: For enhanced extraction
|
|
157
|
+
OPENAI_API_KEY=sk-xxxxx
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
## IDE Setup
|
|
161
|
+
|
|
162
|
+
### VS Code
|
|
163
|
+
|
|
164
|
+
Install recommended extensions:
|
|
165
|
+
- ESLint
|
|
166
|
+
- Prettier
|
|
167
|
+
- TypeScript
|
|
168
|
+
|
|
169
|
+
The project includes `.vscode/settings.json` for automatic formatting.
|
|
170
|
+
|
|
171
|
+
### Debugging
|
|
172
|
+
|
|
173
|
+
Launch configurations are provided in `.vscode/launch.json`:
|
|
174
|
+
|
|
175
|
+
1. Open VS Code
|
|
176
|
+
2. Go to Run and Debug (Cmd+Shift+D)
|
|
177
|
+
3. Select a configuration
|
|
178
|
+
4. Press F5
|
|
179
|
+
|
|
180
|
+
## Common Tasks
|
|
181
|
+
|
|
182
|
+
### Add a New Dependency
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
# Root workspace
|
|
186
|
+
pnpm add -w <package>
|
|
187
|
+
|
|
188
|
+
# Specific package
|
|
189
|
+
pnpm --filter @nirholas/github-to-mcp add <package>
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### Create a Changeset
|
|
193
|
+
|
|
194
|
+
For version management:
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
pnpm changeset
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Link Local Packages
|
|
201
|
+
|
|
202
|
+
For testing locally:
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
pnpm link --global
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## Troubleshooting
|
|
209
|
+
|
|
210
|
+
### Build Errors
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
# Clean and rebuild
|
|
214
|
+
pnpm clean
|
|
215
|
+
pnpm install
|
|
216
|
+
pnpm build
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### Test Failures
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
# Run specific test
|
|
223
|
+
pnpm test -- --grep "pattern"
|
|
224
|
+
|
|
225
|
+
# Update snapshots
|
|
226
|
+
pnpm test -- -u
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
### Type Errors
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
# Check types
|
|
233
|
+
pnpm typecheck
|
|
234
|
+
|
|
235
|
+
# Generate types
|
|
236
|
+
pnpm build
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## Next Steps
|
|
242
|
+
|
|
243
|
+
- [Architecture](architecture.md) - Understand the codebase
|
|
244
|
+
- [Testing](testing.md) - Write tests
|
|
245
|
+
- [Contributing Guide](index.md) - Contribution guidelines
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
Thank you for your interest in contributing to GitHub to MCP! 🎉
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Clone the repository
|
|
9
|
+
git clone https://github.com/nirholas/github-to-mcp
|
|
10
|
+
cd github-to-mcp
|
|
11
|
+
|
|
12
|
+
# Install dependencies
|
|
13
|
+
pnpm install
|
|
14
|
+
|
|
15
|
+
# Build all packages
|
|
16
|
+
pnpm build
|
|
17
|
+
|
|
18
|
+
# Run tests
|
|
19
|
+
pnpm test
|
|
20
|
+
|
|
21
|
+
# Start development server
|
|
22
|
+
pnpm dev
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Ways to Contribute
|
|
26
|
+
|
|
27
|
+
<div class="feature-grid" markdown>
|
|
28
|
+
|
|
29
|
+
<div class="feature-card" markdown>
|
|
30
|
+
|
|
31
|
+
### 🐛 Bug Reports
|
|
32
|
+
Found a bug? [Open an issue](https://github.com/nirholas/github-to-mcp/issues/new?template=bug_report.md) with steps to reproduce.
|
|
33
|
+
|
|
34
|
+
</div>
|
|
35
|
+
|
|
36
|
+
<div class="feature-card" markdown>
|
|
37
|
+
|
|
38
|
+
### 💡 Feature Requests
|
|
39
|
+
Have an idea? [Start a discussion](https://github.com/nirholas/github-to-mcp/discussions/new?category=ideas).
|
|
40
|
+
|
|
41
|
+
</div>
|
|
42
|
+
|
|
43
|
+
<div class="feature-card" markdown>
|
|
44
|
+
|
|
45
|
+
### 📖 Documentation
|
|
46
|
+
Improve docs, fix typos, add examples.
|
|
47
|
+
|
|
48
|
+
</div>
|
|
49
|
+
|
|
50
|
+
<div class="feature-card" markdown>
|
|
51
|
+
|
|
52
|
+
### 🔧 Code
|
|
53
|
+
Fix bugs, add features, improve performance.
|
|
54
|
+
|
|
55
|
+
</div>
|
|
56
|
+
|
|
57
|
+
</div>
|
|
58
|
+
|
|
59
|
+
## Guides
|
|
60
|
+
|
|
61
|
+
| Guide | Description |
|
|
62
|
+
|-------|-------------|
|
|
63
|
+
| [Development Setup](development.md) | Set up your local environment |
|
|
64
|
+
| [Architecture](architecture.md) | Understand the codebase |
|
|
65
|
+
| [Testing](testing.md) | Write and run tests |
|
|
66
|
+
|
|
67
|
+
## Code of Conduct
|
|
68
|
+
|
|
69
|
+
Be respectful and inclusive. See our [Code of Conduct](https://github.com/nirholas/github-to-mcp/blob/main/CODE_OF_CONDUCT.md).
|
|
70
|
+
|
|
71
|
+
## License
|
|
72
|
+
|
|
73
|
+
By contributing, you agree that your contributions will be licensed under the MIT License.
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
# Testing
|
|
2
|
+
|
|
3
|
+
Guide to writing and running tests for GitHub to MCP.
|
|
4
|
+
|
|
5
|
+
## Running Tests
|
|
6
|
+
|
|
7
|
+
### All Tests
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
pnpm test
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
### Watch Mode
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
pnpm test:watch
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### Coverage Report
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
pnpm test:coverage
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### Specific Package
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
pnpm --filter @nirholas/github-to-mcp test
|
|
29
|
+
pnpm --filter @github-to-mcp/openapi-parser test
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Test Structure
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
tests/
|
|
36
|
+
├── unit/ # Unit tests
|
|
37
|
+
│ ├── core/
|
|
38
|
+
│ │ ├── generator.test.ts
|
|
39
|
+
│ │ ├── classifier.test.ts
|
|
40
|
+
│ │ └── extractors/
|
|
41
|
+
│ ├── openapi-parser/
|
|
42
|
+
│ └── mcp-server/
|
|
43
|
+
├── integration/ # Integration tests
|
|
44
|
+
│ ├── generation.test.ts
|
|
45
|
+
│ └── end-to-end.test.ts
|
|
46
|
+
└── fixtures/ # Test data
|
|
47
|
+
├── repos/
|
|
48
|
+
├── openapi/
|
|
49
|
+
└── graphql/
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Writing Tests
|
|
53
|
+
|
|
54
|
+
### Unit Tests
|
|
55
|
+
|
|
56
|
+
Test individual functions in isolation:
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
60
|
+
import { classifyRepository } from '@nirholas/github-to-mcp';
|
|
61
|
+
|
|
62
|
+
describe('classifyRepository', () => {
|
|
63
|
+
it('should classify MCP server repos', () => {
|
|
64
|
+
const repo = {
|
|
65
|
+
packageJson: {
|
|
66
|
+
dependencies: {
|
|
67
|
+
'@modelcontextprotocol/sdk': '^1.0.0'
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
expect(classifyRepository(repo)).toBe('mcp-server');
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('should classify API SDK repos', () => {
|
|
76
|
+
const repo = {
|
|
77
|
+
files: ['openapi.json'],
|
|
78
|
+
packageJson: {}
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
expect(classifyRepository(repo)).toBe('api-sdk');
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Mocking
|
|
87
|
+
|
|
88
|
+
Use Vitest's mocking capabilities:
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
import { vi } from 'vitest';
|
|
92
|
+
import { GithubClient } from '../src/github/client';
|
|
93
|
+
|
|
94
|
+
// Mock entire module
|
|
95
|
+
vi.mock('../src/github/client');
|
|
96
|
+
|
|
97
|
+
// Mock specific function
|
|
98
|
+
const mockFetch = vi.fn();
|
|
99
|
+
vi.spyOn(global, 'fetch').mockImplementation(mockFetch);
|
|
100
|
+
|
|
101
|
+
// Setup mock return value
|
|
102
|
+
mockFetch.mockResolvedValue({
|
|
103
|
+
ok: true,
|
|
104
|
+
json: () => Promise.resolve({ data: 'test' })
|
|
105
|
+
});
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Integration Tests
|
|
109
|
+
|
|
110
|
+
Test multiple components together:
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
|
|
114
|
+
import { generateFromGithub } from '@nirholas/github-to-mcp';
|
|
115
|
+
|
|
116
|
+
describe('End-to-end generation', () => {
|
|
117
|
+
it('should generate MCP server from public repo', async () => {
|
|
118
|
+
const result = await generateFromGithub(
|
|
119
|
+
'https://github.com/octocat/Hello-World',
|
|
120
|
+
{ token: process.env.GITHUB_TOKEN }
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
expect(result.tools).toHaveLength(4); // Universal tools
|
|
124
|
+
expect(result.tools.map(t => t.name)).toContain('read_file');
|
|
125
|
+
expect(result.tools.map(t => t.name)).toContain('list_files');
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it('should extract OpenAPI tools', async () => {
|
|
129
|
+
const result = await generateFromGithub(
|
|
130
|
+
'https://github.com/stripe/stripe-node'
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
// Should have more than universal tools
|
|
134
|
+
expect(result.tools.length).toBeGreaterThan(4);
|
|
135
|
+
expect(result.tools.some(t => t.source === 'openapi')).toBe(true);
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Fixture Tests
|
|
141
|
+
|
|
142
|
+
Test with predefined data:
|
|
143
|
+
|
|
144
|
+
```typescript
|
|
145
|
+
import { readFixture } from '../helpers';
|
|
146
|
+
import { parseOpenAPI } from '@github-to-mcp/openapi-parser';
|
|
147
|
+
|
|
148
|
+
describe('OpenAPI Parser', () => {
|
|
149
|
+
it('should parse petstore spec', async () => {
|
|
150
|
+
const spec = await readFixture('openapi/petstore.json');
|
|
151
|
+
const tools = await parseOpenAPI(spec);
|
|
152
|
+
|
|
153
|
+
expect(tools).toMatchSnapshot();
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
it('should parse GitHub API spec', async () => {
|
|
157
|
+
const spec = await readFixture('openapi/github-api.yaml');
|
|
158
|
+
const tools = await parseOpenAPI(spec);
|
|
159
|
+
|
|
160
|
+
expect(tools.length).toBeGreaterThan(100);
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## Test Helpers
|
|
166
|
+
|
|
167
|
+
### fixtures/helpers.ts
|
|
168
|
+
|
|
169
|
+
```typescript
|
|
170
|
+
import fs from 'fs/promises';
|
|
171
|
+
import path from 'path';
|
|
172
|
+
|
|
173
|
+
export async function readFixture(name: string): Promise<string> {
|
|
174
|
+
const fixturePath = path.join(__dirname, 'fixtures', name);
|
|
175
|
+
return fs.readFile(fixturePath, 'utf-8');
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export function createMockRepo(overrides = {}) {
|
|
179
|
+
return {
|
|
180
|
+
owner: 'test',
|
|
181
|
+
name: 'repo',
|
|
182
|
+
url: 'https://github.com/test/repo',
|
|
183
|
+
readme: '# Test Repo',
|
|
184
|
+
files: [],
|
|
185
|
+
packageJson: {},
|
|
186
|
+
...overrides
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export function createMockTool(overrides = {}) {
|
|
191
|
+
return {
|
|
192
|
+
name: 'test_tool',
|
|
193
|
+
description: 'A test tool',
|
|
194
|
+
inputSchema: { type: 'object' },
|
|
195
|
+
source: 'universal',
|
|
196
|
+
...overrides
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
## Testing Patterns
|
|
202
|
+
|
|
203
|
+
### Testing Extractors
|
|
204
|
+
|
|
205
|
+
```typescript
|
|
206
|
+
describe('OpenAPI Extractor', () => {
|
|
207
|
+
it('should extract operations with operationId', async () => {
|
|
208
|
+
const repo = createMockRepo({
|
|
209
|
+
files: ['openapi.json'],
|
|
210
|
+
fileContents: {
|
|
211
|
+
'openapi.json': JSON.stringify({
|
|
212
|
+
openapi: '3.0.0',
|
|
213
|
+
paths: {
|
|
214
|
+
'/users': {
|
|
215
|
+
get: {
|
|
216
|
+
operationId: 'listUsers',
|
|
217
|
+
summary: 'List all users'
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
})
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
const extractor = new OpenAPIExtractor();
|
|
226
|
+
const tools = await extractor.extract(repo);
|
|
227
|
+
|
|
228
|
+
expect(tools).toHaveLength(1);
|
|
229
|
+
expect(tools[0].name).toBe('listUsers');
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### Testing Generators
|
|
235
|
+
|
|
236
|
+
```typescript
|
|
237
|
+
describe('TypeScript Generator', () => {
|
|
238
|
+
it('should generate valid TypeScript', async () => {
|
|
239
|
+
const tools = [createMockTool({ name: 'read_file' })];
|
|
240
|
+
const generator = new TypeScriptGenerator();
|
|
241
|
+
|
|
242
|
+
const code = generator.generate(tools);
|
|
243
|
+
|
|
244
|
+
// Check it's valid TypeScript by parsing
|
|
245
|
+
expect(() => typescript.createSourceFile(
|
|
246
|
+
'test.ts',
|
|
247
|
+
code,
|
|
248
|
+
typescript.ScriptTarget.Latest
|
|
249
|
+
)).not.toThrow();
|
|
250
|
+
});
|
|
251
|
+
});
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### Testing Error Handling
|
|
255
|
+
|
|
256
|
+
```typescript
|
|
257
|
+
describe('Error handling', () => {
|
|
258
|
+
it('should throw on invalid URL', async () => {
|
|
259
|
+
await expect(
|
|
260
|
+
generateFromGithub('not-a-url')
|
|
261
|
+
).rejects.toThrow('Invalid GitHub URL');
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
it('should throw on rate limit', async () => {
|
|
265
|
+
vi.mocked(fetch).mockResolvedValueOnce({
|
|
266
|
+
ok: false,
|
|
267
|
+
status: 403,
|
|
268
|
+
headers: new Headers({
|
|
269
|
+
'X-RateLimit-Remaining': '0'
|
|
270
|
+
})
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
await expect(
|
|
274
|
+
generateFromGithub('https://github.com/test/repo')
|
|
275
|
+
).rejects.toThrow('Rate limit exceeded');
|
|
276
|
+
});
|
|
277
|
+
});
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
## Snapshot Testing
|
|
281
|
+
|
|
282
|
+
For complex outputs, use snapshots:
|
|
283
|
+
|
|
284
|
+
```typescript
|
|
285
|
+
it('should generate expected server code', async () => {
|
|
286
|
+
const result = await generateFromGithub(
|
|
287
|
+
'https://github.com/test/simple-repo'
|
|
288
|
+
);
|
|
289
|
+
|
|
290
|
+
expect(result.toTypeScript()).toMatchSnapshot();
|
|
291
|
+
});
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
Update snapshots when behavior changes intentionally:
|
|
295
|
+
|
|
296
|
+
```bash
|
|
297
|
+
pnpm test -- -u
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
## Coverage Goals
|
|
301
|
+
|
|
302
|
+
| Package | Target |
|
|
303
|
+
|---------|--------|
|
|
304
|
+
| Core | 80%+ |
|
|
305
|
+
| OpenAPI Parser | 90%+ |
|
|
306
|
+
| MCP Server | 85%+ |
|
|
307
|
+
|
|
308
|
+
Check coverage:
|
|
309
|
+
|
|
310
|
+
```bash
|
|
311
|
+
pnpm test:coverage
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
---
|
|
315
|
+
|
|
316
|
+
## See Also
|
|
317
|
+
|
|
318
|
+
- [Development Setup](development.md) - Setup environment
|
|
319
|
+
- [Architecture](architecture.md) - Code structure
|
|
320
|
+
- [Contributing](index.md) - Contribution guidelines
|