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,382 @@
|
|
|
1
|
+
# Tool Types
|
|
2
|
+
|
|
3
|
+
Understanding the different types of tools generated by GitHub to MCP.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
Tools are the core functionality exposed by MCP servers. GitHub to MCP generates two categories:
|
|
8
|
+
|
|
9
|
+
1. **Universal Tools** - Always included, work with any repository
|
|
10
|
+
2. **Extracted Tools** - Specific to the repository's API/functionality
|
|
11
|
+
|
|
12
|
+
## Universal Tools
|
|
13
|
+
|
|
14
|
+
These tools are included by default for every repository.
|
|
15
|
+
|
|
16
|
+
### get_readme
|
|
17
|
+
|
|
18
|
+
Fetch the repository's README content.
|
|
19
|
+
|
|
20
|
+
```json
|
|
21
|
+
{
|
|
22
|
+
"name": "get_readme",
|
|
23
|
+
"description": "Get the README content of the repository",
|
|
24
|
+
"inputSchema": {
|
|
25
|
+
"type": "object",
|
|
26
|
+
"properties": {}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**Use case**: Understanding what a project does, finding documentation.
|
|
32
|
+
|
|
33
|
+
### list_files
|
|
34
|
+
|
|
35
|
+
List files and directories in the repository.
|
|
36
|
+
|
|
37
|
+
```json
|
|
38
|
+
{
|
|
39
|
+
"name": "list_files",
|
|
40
|
+
"description": "List files in a directory",
|
|
41
|
+
"inputSchema": {
|
|
42
|
+
"type": "object",
|
|
43
|
+
"properties": {
|
|
44
|
+
"path": {
|
|
45
|
+
"type": "string",
|
|
46
|
+
"description": "Directory path (default: root)"
|
|
47
|
+
},
|
|
48
|
+
"recursive": {
|
|
49
|
+
"type": "boolean",
|
|
50
|
+
"description": "Include subdirectories"
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**Use case**: Exploring project structure, finding specific files.
|
|
58
|
+
|
|
59
|
+
### read_file
|
|
60
|
+
|
|
61
|
+
Read the contents of any file.
|
|
62
|
+
|
|
63
|
+
```json
|
|
64
|
+
{
|
|
65
|
+
"name": "read_file",
|
|
66
|
+
"description": "Read the contents of a file",
|
|
67
|
+
"inputSchema": {
|
|
68
|
+
"type": "object",
|
|
69
|
+
"properties": {
|
|
70
|
+
"path": {
|
|
71
|
+
"type": "string",
|
|
72
|
+
"description": "Path to the file"
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
"required": ["path"]
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**Use case**: Reading source code, configuration files, documentation.
|
|
81
|
+
|
|
82
|
+
### search_code
|
|
83
|
+
|
|
84
|
+
Search for code patterns in the repository.
|
|
85
|
+
|
|
86
|
+
```json
|
|
87
|
+
{
|
|
88
|
+
"name": "search_code",
|
|
89
|
+
"description": "Search for code patterns",
|
|
90
|
+
"inputSchema": {
|
|
91
|
+
"type": "object",
|
|
92
|
+
"properties": {
|
|
93
|
+
"query": {
|
|
94
|
+
"type": "string",
|
|
95
|
+
"description": "Search query"
|
|
96
|
+
},
|
|
97
|
+
"path": {
|
|
98
|
+
"type": "string",
|
|
99
|
+
"description": "Limit search to path"
|
|
100
|
+
},
|
|
101
|
+
"extension": {
|
|
102
|
+
"type": "string",
|
|
103
|
+
"description": "File extension filter"
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
"required": ["query"]
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
**Use case**: Finding function definitions, usages, patterns.
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## Extracted Tools
|
|
116
|
+
|
|
117
|
+
These tools are specific to each repository, extracted from various sources.
|
|
118
|
+
|
|
119
|
+
### From OpenAPI/Swagger
|
|
120
|
+
|
|
121
|
+
API endpoints become callable tools:
|
|
122
|
+
|
|
123
|
+
**Original OpenAPI:**
|
|
124
|
+
```yaml
|
|
125
|
+
paths:
|
|
126
|
+
/customers:
|
|
127
|
+
post:
|
|
128
|
+
operationId: createCustomer
|
|
129
|
+
summary: Create a new customer
|
|
130
|
+
requestBody:
|
|
131
|
+
content:
|
|
132
|
+
application/json:
|
|
133
|
+
schema:
|
|
134
|
+
type: object
|
|
135
|
+
properties:
|
|
136
|
+
email:
|
|
137
|
+
type: string
|
|
138
|
+
name:
|
|
139
|
+
type: string
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
**Generated Tool:**
|
|
143
|
+
```json
|
|
144
|
+
{
|
|
145
|
+
"name": "create_customer",
|
|
146
|
+
"description": "Create a new customer",
|
|
147
|
+
"inputSchema": {
|
|
148
|
+
"type": "object",
|
|
149
|
+
"properties": {
|
|
150
|
+
"email": { "type": "string" },
|
|
151
|
+
"name": { "type": "string" }
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
"source": "openapi"
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### From GraphQL
|
|
159
|
+
|
|
160
|
+
Queries and mutations become tools:
|
|
161
|
+
|
|
162
|
+
**Original GraphQL:**
|
|
163
|
+
```graphql
|
|
164
|
+
type Query {
|
|
165
|
+
user(id: ID!): User
|
|
166
|
+
users(limit: Int): [User!]!
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
type Mutation {
|
|
170
|
+
createUser(input: CreateUserInput!): User!
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
**Generated Tools:**
|
|
175
|
+
```json
|
|
176
|
+
[
|
|
177
|
+
{
|
|
178
|
+
"name": "query_user",
|
|
179
|
+
"description": "Get a user by ID",
|
|
180
|
+
"inputSchema": {
|
|
181
|
+
"type": "object",
|
|
182
|
+
"properties": {
|
|
183
|
+
"id": { "type": "string" }
|
|
184
|
+
},
|
|
185
|
+
"required": ["id"]
|
|
186
|
+
},
|
|
187
|
+
"source": "graphql"
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
"name": "create_user",
|
|
191
|
+
"description": "Create a new user",
|
|
192
|
+
"inputSchema": {
|
|
193
|
+
"type": "object",
|
|
194
|
+
"properties": {
|
|
195
|
+
"input": {
|
|
196
|
+
"type": "object",
|
|
197
|
+
"properties": {
|
|
198
|
+
"name": { "type": "string" },
|
|
199
|
+
"email": { "type": "string" }
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
},
|
|
204
|
+
"source": "graphql"
|
|
205
|
+
}
|
|
206
|
+
]
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### From Python Code
|
|
210
|
+
|
|
211
|
+
Functions with `@mcp.tool` decorators:
|
|
212
|
+
|
|
213
|
+
**Original Python:**
|
|
214
|
+
```python
|
|
215
|
+
from mcp import tool
|
|
216
|
+
|
|
217
|
+
@tool
|
|
218
|
+
def analyze_text(text: str, language: str = "en") -> dict:
|
|
219
|
+
"""Analyze the given text for sentiment and entities."""
|
|
220
|
+
# ...
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
**Generated Tool:**
|
|
224
|
+
```json
|
|
225
|
+
{
|
|
226
|
+
"name": "analyze_text",
|
|
227
|
+
"description": "Analyze the given text for sentiment and entities.",
|
|
228
|
+
"inputSchema": {
|
|
229
|
+
"type": "object",
|
|
230
|
+
"properties": {
|
|
231
|
+
"text": { "type": "string" },
|
|
232
|
+
"language": { "type": "string", "default": "en" }
|
|
233
|
+
},
|
|
234
|
+
"required": ["text"]
|
|
235
|
+
},
|
|
236
|
+
"source": "code"
|
|
237
|
+
}
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### From Existing MCP Servers
|
|
241
|
+
|
|
242
|
+
For repos that are already MCP servers:
|
|
243
|
+
|
|
244
|
+
```typescript
|
|
245
|
+
// Original
|
|
246
|
+
server.tool("calculate", "Perform calculations", {
|
|
247
|
+
expression: { type: "string" }
|
|
248
|
+
}, async ({ expression }) => {
|
|
249
|
+
return eval(expression);
|
|
250
|
+
});
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
**Extracted Tool:**
|
|
254
|
+
```json
|
|
255
|
+
{
|
|
256
|
+
"name": "calculate",
|
|
257
|
+
"description": "Perform calculations",
|
|
258
|
+
"inputSchema": {
|
|
259
|
+
"type": "object",
|
|
260
|
+
"properties": {
|
|
261
|
+
"expression": { "type": "string" }
|
|
262
|
+
}
|
|
263
|
+
},
|
|
264
|
+
"source": "mcp"
|
|
265
|
+
}
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
## Tool Naming
|
|
271
|
+
|
|
272
|
+
Tools follow consistent naming conventions:
|
|
273
|
+
|
|
274
|
+
| Source | Convention | Example |
|
|
275
|
+
|--------|------------|---------|
|
|
276
|
+
| Universal | `snake_case` | `read_file` |
|
|
277
|
+
| OpenAPI | `operationId` or `method_path` | `create_customer` |
|
|
278
|
+
| GraphQL | `type_field` | `query_user`, `mutation_create_user` |
|
|
279
|
+
| Code | Original function name | `analyze_text` |
|
|
280
|
+
|
|
281
|
+
### Conflict Resolution
|
|
282
|
+
|
|
283
|
+
When multiple tools have the same name:
|
|
284
|
+
|
|
285
|
+
1. Universal tools take precedence
|
|
286
|
+
2. Later sources add numeric suffix: `read_file_2`
|
|
287
|
+
3. Or use `--exclude-tools` to remove conflicts
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## Tool Schemas
|
|
292
|
+
|
|
293
|
+
All tools use JSON Schema for input validation:
|
|
294
|
+
|
|
295
|
+
### Basic Types
|
|
296
|
+
|
|
297
|
+
```json
|
|
298
|
+
{
|
|
299
|
+
"type": "object",
|
|
300
|
+
"properties": {
|
|
301
|
+
"name": { "type": "string" },
|
|
302
|
+
"count": { "type": "integer" },
|
|
303
|
+
"enabled": { "type": "boolean" },
|
|
304
|
+
"score": { "type": "number" }
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
### Arrays
|
|
310
|
+
|
|
311
|
+
```json
|
|
312
|
+
{
|
|
313
|
+
"type": "object",
|
|
314
|
+
"properties": {
|
|
315
|
+
"tags": {
|
|
316
|
+
"type": "array",
|
|
317
|
+
"items": { "type": "string" }
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
### Nested Objects
|
|
324
|
+
|
|
325
|
+
```json
|
|
326
|
+
{
|
|
327
|
+
"type": "object",
|
|
328
|
+
"properties": {
|
|
329
|
+
"address": {
|
|
330
|
+
"type": "object",
|
|
331
|
+
"properties": {
|
|
332
|
+
"street": { "type": "string" },
|
|
333
|
+
"city": { "type": "string" }
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
### Enums
|
|
341
|
+
|
|
342
|
+
```json
|
|
343
|
+
{
|
|
344
|
+
"type": "object",
|
|
345
|
+
"properties": {
|
|
346
|
+
"status": {
|
|
347
|
+
"type": "string",
|
|
348
|
+
"enum": ["pending", "active", "completed"]
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
---
|
|
355
|
+
|
|
356
|
+
## Filtering Tools
|
|
357
|
+
|
|
358
|
+
### Include Specific Tools
|
|
359
|
+
|
|
360
|
+
```bash
|
|
361
|
+
github-to-mcp <url> --include-tools read_file,search_code,create_customer
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
### Exclude Tools
|
|
365
|
+
|
|
366
|
+
```bash
|
|
367
|
+
github-to-mcp <url> --exclude-tools get_readme
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
### Skip Universal Tools
|
|
371
|
+
|
|
372
|
+
```bash
|
|
373
|
+
github-to-mcp <url> --no-universal
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
---
|
|
377
|
+
|
|
378
|
+
## See Also
|
|
379
|
+
|
|
380
|
+
- [How It Works](how-it-works.md) - Extraction process
|
|
381
|
+
- [Custom Tools](../guides/custom-tools.md) - Extending tools
|
|
382
|
+
- [API Reference](../api/core.md) - Tool type definitions
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
# Architecture
|
|
2
|
+
|
|
3
|
+
Technical architecture of GitHub to MCP.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
GitHub to MCP follows a monorepo architecture with clear separation of concerns:
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
11
|
+
│ Applications │
|
|
12
|
+
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
|
13
|
+
│ │ Web App │ │ Docs │ │ VS Code │ │
|
|
14
|
+
│ │ (Next.js) │ │ (Nextra) │ │ (Extension) │ │
|
|
15
|
+
│ └──────┬──────┘ └─────────────┘ └──────┬──────┘ │
|
|
16
|
+
│ │ │ │
|
|
17
|
+
│ └─────────────────┬────────────────┘ │
|
|
18
|
+
│ ↓ │
|
|
19
|
+
├─────────────────────────────────────────────────────────────────┤
|
|
20
|
+
│ Packages │
|
|
21
|
+
│ ┌─────────────────────────────────────────────────────────┐ │
|
|
22
|
+
│ │ @nirholas/github-to-mcp │ │
|
|
23
|
+
│ │ ┌───────────────┐ ┌───────────────┐ ┌─────────────┐ │ │
|
|
24
|
+
│ │ │ Generator │ │ Extractors │ │ GitHub │ │ │
|
|
25
|
+
│ │ │ │ │ │ │ Client │ │ │
|
|
26
|
+
│ │ └───────┬───────┘ └───────┬───────┘ └──────┬──────┘ │ │
|
|
27
|
+
│ └──────────┼──────────────────┼─────────────────┼─────────┘ │
|
|
28
|
+
│ │ │ │ │
|
|
29
|
+
│ ┌──────────┴──────────┐ ┌────┴────────────────┴─────────┐ │
|
|
30
|
+
│ │ @github-to-mcp/ │ │ @github-to-mcp/mcp-server │ │
|
|
31
|
+
│ │ openapi-parser │ │ │ │
|
|
32
|
+
│ └─────────────────────┘ └───────────────────────────────┘ │
|
|
33
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Package Responsibilities
|
|
37
|
+
|
|
38
|
+
### @nirholas/github-to-mcp (core)
|
|
39
|
+
|
|
40
|
+
The main library that orchestrates the conversion process.
|
|
41
|
+
|
|
42
|
+
**Responsibilities:**
|
|
43
|
+
- Public API (`generateFromGithub`, `parseRepository`)
|
|
44
|
+
- Repository classification
|
|
45
|
+
- Tool extraction coordination
|
|
46
|
+
- Code generation
|
|
47
|
+
- Output bundling
|
|
48
|
+
|
|
49
|
+
**Key Components:**
|
|
50
|
+
|
|
51
|
+
```typescript
|
|
52
|
+
// Generator - Main orchestrator
|
|
53
|
+
class GithubToMcpGenerator {
|
|
54
|
+
async generate(url: string, options: Options): Promise<Result>
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// GitHub Client - API interaction
|
|
58
|
+
class GithubClient {
|
|
59
|
+
async getRepository(url: string): Promise<RepoInfo>
|
|
60
|
+
async getFileTree(url: string): Promise<FileTree>
|
|
61
|
+
async getFile(url: string, path: string): Promise<string>
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Classifier - Repository type detection
|
|
65
|
+
function classifyRepository(info: RepoInfo): RepositoryType
|
|
66
|
+
|
|
67
|
+
// Extractors - Tool extraction
|
|
68
|
+
interface Extractor {
|
|
69
|
+
extract(info: RepoInfo): Promise<Tool[]>
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### @github-to-mcp/openapi-parser
|
|
74
|
+
|
|
75
|
+
Parses API specifications into tool definitions.
|
|
76
|
+
|
|
77
|
+
**Responsibilities:**
|
|
78
|
+
- OpenAPI 2.0/3.0/3.1 parsing
|
|
79
|
+
- GraphQL schema parsing
|
|
80
|
+
- JSON Schema generation
|
|
81
|
+
- Spec file detection
|
|
82
|
+
|
|
83
|
+
**Key Components:**
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
// OpenAPI Parser
|
|
87
|
+
function parseOpenAPI(spec: string | object): Promise<Tool[]>
|
|
88
|
+
|
|
89
|
+
// GraphQL Parser
|
|
90
|
+
function parseGraphQL(schema: string): Promise<Tool[]>
|
|
91
|
+
|
|
92
|
+
// Spec Finder
|
|
93
|
+
function findSpecs(files: FileTree): SpecFiles
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### @github-to-mcp/mcp-server
|
|
97
|
+
|
|
98
|
+
MCP server implementation for generated servers.
|
|
99
|
+
|
|
100
|
+
**Responsibilities:**
|
|
101
|
+
- MCP protocol implementation
|
|
102
|
+
- Tool registration and execution
|
|
103
|
+
- Transport handling (stdio, HTTP)
|
|
104
|
+
- Error handling
|
|
105
|
+
|
|
106
|
+
**Key Components:**
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
// MCP Server
|
|
110
|
+
class McpServer {
|
|
111
|
+
addTool(tool: ToolDefinition): void
|
|
112
|
+
start(): Promise<void>
|
|
113
|
+
stop(): Promise<void>
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Transports
|
|
117
|
+
class StdioTransport implements Transport {}
|
|
118
|
+
class HttpTransport implements Transport {}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## Data Flow
|
|
122
|
+
|
|
123
|
+
### Generation Flow
|
|
124
|
+
|
|
125
|
+
```
|
|
126
|
+
1. User Input (GitHub URL)
|
|
127
|
+
↓
|
|
128
|
+
2. GithubClient.getRepository()
|
|
129
|
+
- Fetch metadata
|
|
130
|
+
- Fetch README
|
|
131
|
+
- Fetch file tree
|
|
132
|
+
↓
|
|
133
|
+
3. classifyRepository()
|
|
134
|
+
- Analyze patterns
|
|
135
|
+
- Determine type
|
|
136
|
+
↓
|
|
137
|
+
4. Extractors.extract()
|
|
138
|
+
- Universal tools
|
|
139
|
+
- OpenAPI extraction
|
|
140
|
+
- GraphQL extraction
|
|
141
|
+
- Code analysis
|
|
142
|
+
↓
|
|
143
|
+
5. CodeGenerator.generate()
|
|
144
|
+
- Apply templates
|
|
145
|
+
- Generate implementations
|
|
146
|
+
↓
|
|
147
|
+
6. Bundler.bundle()
|
|
148
|
+
- Create package.json
|
|
149
|
+
- Organize files
|
|
150
|
+
- Write to disk
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### Tool Execution Flow
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
1. AI Client sends tools/call
|
|
157
|
+
↓
|
|
158
|
+
2. McpServer receives request
|
|
159
|
+
- Parse JSON-RPC
|
|
160
|
+
- Validate parameters
|
|
161
|
+
↓
|
|
162
|
+
3. Tool.execute()
|
|
163
|
+
- Run implementation
|
|
164
|
+
- Handle errors
|
|
165
|
+
↓
|
|
166
|
+
4. Format response
|
|
167
|
+
- Create content array
|
|
168
|
+
- Return result
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## File Organization
|
|
172
|
+
|
|
173
|
+
### Core Package Structure
|
|
174
|
+
|
|
175
|
+
```
|
|
176
|
+
packages/core/
|
|
177
|
+
├── src/
|
|
178
|
+
│ ├── index.ts # Public exports
|
|
179
|
+
│ ├── generator.ts # Main generator class
|
|
180
|
+
│ ├── types.ts # TypeScript types
|
|
181
|
+
│ ├── github/
|
|
182
|
+
│ │ ├── client.ts # GitHub API client
|
|
183
|
+
│ │ ├── cache.ts # Request caching
|
|
184
|
+
│ │ └── types.ts # GitHub types
|
|
185
|
+
│ ├── classification/
|
|
186
|
+
│ │ ├── classifier.ts # Repository classifier
|
|
187
|
+
│ │ └── patterns.ts # Detection patterns
|
|
188
|
+
│ ├── extractors/
|
|
189
|
+
│ │ ├── universal.ts # Universal tools
|
|
190
|
+
│ │ ├── openapi.ts # OpenAPI extractor
|
|
191
|
+
│ │ ├── graphql.ts # GraphQL extractor
|
|
192
|
+
│ │ └── code.ts # Code analysis
|
|
193
|
+
│ ├── generators/
|
|
194
|
+
│ │ ├── typescript.ts # TS code generator
|
|
195
|
+
│ │ └── python.ts # Python code generator
|
|
196
|
+
│ └── utils/
|
|
197
|
+
│ ├── schema.ts # JSON Schema helpers
|
|
198
|
+
│ └── naming.ts # Naming conventions
|
|
199
|
+
├── tests/
|
|
200
|
+
├── package.json
|
|
201
|
+
└── tsconfig.json
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### Web App Structure
|
|
205
|
+
|
|
206
|
+
```
|
|
207
|
+
apps/web/
|
|
208
|
+
├── app/
|
|
209
|
+
│ ├── layout.tsx # Root layout
|
|
210
|
+
│ ├── page.tsx # Home page
|
|
211
|
+
│ ├── api/
|
|
212
|
+
│ │ └── generate/ # API routes
|
|
213
|
+
│ ├── playground/ # Playground page
|
|
214
|
+
│ └── batch/ # Batch conversion
|
|
215
|
+
├── components/
|
|
216
|
+
│ ├── Header.tsx
|
|
217
|
+
│ ├── Footer.tsx
|
|
218
|
+
│ ├── GeneratorForm.tsx
|
|
219
|
+
│ └── ...
|
|
220
|
+
├── lib/
|
|
221
|
+
│ ├── generator.ts # Client-side generator
|
|
222
|
+
│ └── utils.ts
|
|
223
|
+
└── public/
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
## Design Decisions
|
|
227
|
+
|
|
228
|
+
### Why Monorepo?
|
|
229
|
+
|
|
230
|
+
- **Shared code**: Common utilities across packages
|
|
231
|
+
- **Atomic changes**: Related changes in one PR
|
|
232
|
+
- **Consistent tooling**: Same lint, test, build config
|
|
233
|
+
- **Easy local development**: Automatic linking
|
|
234
|
+
|
|
235
|
+
### Why TypeScript?
|
|
236
|
+
|
|
237
|
+
- **Type safety**: Catch errors at compile time
|
|
238
|
+
- **Better DX**: IDE autocomplete and documentation
|
|
239
|
+
- **Self-documenting**: Types serve as documentation
|
|
240
|
+
- **Industry standard**: Common in JS/TS ecosystem
|
|
241
|
+
|
|
242
|
+
### Why Next.js for Web?
|
|
243
|
+
|
|
244
|
+
- **Server components**: Fast initial load
|
|
245
|
+
- **API routes**: Built-in backend
|
|
246
|
+
- **Vercel deployment**: Zero-config hosting
|
|
247
|
+
- **React ecosystem**: Rich component libraries
|
|
248
|
+
|
|
249
|
+
### Why Separate Parser Package?
|
|
250
|
+
|
|
251
|
+
- **Reusability**: Can be used independently
|
|
252
|
+
- **Testability**: Easier to test in isolation
|
|
253
|
+
- **Performance**: Tree-shakeable for size
|
|
254
|
+
- **Maintenance**: Clear boundaries
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
## See Also
|
|
259
|
+
|
|
260
|
+
- [Development Setup](development.md) - Get started contributing
|
|
261
|
+
- [Testing](testing.md) - Write and run tests
|
|
262
|
+
- [How It Works](../concepts/how-it-works.md) - User-facing explanation
|