@crownpeak/dqm-react-component-dev-mcp 1.2.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/README.md +138 -0
- package/data/.env.example +22 -0
- package/data/.gitattributes +47 -0
- package/data/.glfrc.json +7 -0
- package/data/.husky/pre-commit +5 -0
- package/data/.nvmrc +1 -0
- package/data/CHANGELOG.md +75 -0
- package/data/CODE_OF_CONDUCT.md +129 -0
- package/data/CONTRIBUTING.md +203 -0
- package/data/DOCS-STRUCTURE.md +307 -0
- package/data/I18N.md +292 -0
- package/data/LICENSE +22 -0
- package/data/README.md +315 -0
- package/data/SECURITY.md +125 -0
- package/data/WIKI-DEPLOYMENT.md +348 -0
- package/data/docs/AI-FEATURES.md +610 -0
- package/data/docs/API-REFERENCE.md +1022 -0
- package/data/docs/AUTHENTICATION.md +301 -0
- package/data/docs/BACKEND-API.md +468 -0
- package/data/docs/DEVELOPMENT.md +375 -0
- package/data/docs/EXAMPLES.md +622 -0
- package/data/docs/MCP-SERVER.md +307 -0
- package/data/docs/MIGRATION-GUIDE.md +367 -0
- package/data/docs/NPM-PUBLISH.md +193 -0
- package/data/docs/QUICKSTART.md +206 -0
- package/data/docs/REDIS-SETUP.md +162 -0
- package/data/docs/SERVER.md +228 -0
- package/data/docs/TROUBLESHOOTING.md +657 -0
- package/data/docs/WIDGET-GUIDE.md +638 -0
- package/data/docs/WIKI-HOME.md +58 -0
- package/data/docs/WIKI-SIDEBAR.md +39 -0
- package/data/package.json +171 -0
- package/data/playwright.config.ts +64 -0
- package/data/probe/.cargo/config.toml +10 -0
- package/data/probe/.claude/commands/performance-review.md +15 -0
- package/data/probe/.clinerules +288 -0
- package/data/probe/.dockerignore +57 -0
- package/data/probe/.githooks/post-commit +11 -0
- package/data/probe/.githooks/pre-commit +99 -0
- package/data/probe/.githooks/pre-commit-vow +9 -0
- package/data/probe/.prompts/engineer.md +41 -0
- package/data/probe/.roomodes +28 -0
- package/data/probe/.windsurfrules +0 -0
- package/data/probe/BASH_TOOL_SUMMARY.md +148 -0
- package/data/probe/BENCHMARKING.md +256 -0
- package/data/probe/CLAUDE.md +226 -0
- package/data/probe/CODE_OF_CONDUCT.md +128 -0
- package/data/probe/CONTRIBUTING.md +193 -0
- package/data/probe/Cargo.toml +120 -0
- package/data/probe/Cross.toml +10 -0
- package/data/probe/DOCKER-README.md +224 -0
- package/data/probe/Dockerfile +32 -0
- package/data/probe/ENHANCED_DEBUG_TELEMETRY.md +188 -0
- package/data/probe/LICENSE +201 -0
- package/data/probe/Makefile +210 -0
- package/data/probe/README.md +824 -0
- package/data/probe/SECURITY.md +67 -0
- package/data/probe/WINDOWS-GUIDE.md +294 -0
- package/data/probe/benches/parsing_benchmarks.rs +370 -0
- package/data/probe/benches/search_benchmarks.rs +599 -0
- package/data/probe/benches/simd_benchmarks.rs +372 -0
- package/data/probe/benches/timing_benchmarks.rs +287 -0
- package/data/probe/build-windows.bat +229 -0
- package/data/probe/codex-config/config.toml +6 -0
- package/data/probe/docs/PERFORMANCE_OPTIMIZATION.md +161 -0
- package/data/probe/examples/cache_demo.rs +46 -0
- package/data/probe/examples/chat/.dockerignore +37 -0
- package/data/probe/examples/chat/ChatSessionManager.js +295 -0
- package/data/probe/examples/chat/Dockerfile +98 -0
- package/data/probe/examples/chat/LICENSE +201 -0
- package/data/probe/examples/chat/LOCAL_IMAGE_SUPPORT.md +195 -0
- package/data/probe/examples/chat/MCP_INTEGRATION.md +400 -0
- package/data/probe/examples/chat/README.md +338 -0
- package/data/probe/examples/chat/TRACING.md +226 -0
- package/data/probe/examples/chat/appTracer.js +968 -0
- package/data/probe/examples/chat/auth.js +76 -0
- package/data/probe/examples/chat/bin/probe-chat.js +13 -0
- package/data/probe/examples/chat/build.js +104 -0
- package/data/probe/examples/chat/cancelRequest.js +84 -0
- package/data/probe/examples/chat/demo-agentic-image-flow.js +88 -0
- package/data/probe/examples/chat/demo-local-images.js +128 -0
- package/data/probe/examples/chat/fileSpanExporter.js +181 -0
- package/data/probe/examples/chat/implement/README.md +228 -0
- package/data/probe/examples/chat/implement/backends/AiderBackend.js +750 -0
- package/data/probe/examples/chat/implement/backends/BaseBackend.js +276 -0
- package/data/probe/examples/chat/implement/backends/ClaudeCodeBackend.js +767 -0
- package/data/probe/examples/chat/implement/backends/MockBackend.js +237 -0
- package/data/probe/examples/chat/implement/backends/registry.js +85 -0
- package/data/probe/examples/chat/implement/core/BackendManager.js +567 -0
- package/data/probe/examples/chat/implement/core/ImplementTool.js +354 -0
- package/data/probe/examples/chat/implement/core/config.js +428 -0
- package/data/probe/examples/chat/implement/core/timeouts.js +58 -0
- package/data/probe/examples/chat/implement/core/utils.js +496 -0
- package/data/probe/examples/chat/implement/types/BackendTypes.js +126 -0
- package/data/probe/examples/chat/index.js +669 -0
- package/data/probe/examples/chat/mcpServer.js +341 -0
- package/data/probe/examples/chat/npm/LICENSE +15 -0
- package/data/probe/examples/chat/npm/README.md +168 -0
- package/data/probe/examples/chat/npm/bin/probe-chat.js +156 -0
- package/data/probe/examples/chat/npm/index.js +259 -0
- package/data/probe/examples/chat/npm/package.json +54 -0
- package/data/probe/examples/chat/package.json +102 -0
- package/data/probe/examples/chat/probeChat.js +456 -0
- package/data/probe/examples/chat/probeTool.js +491 -0
- package/data/probe/examples/chat/storage/JsonChatStorage.js +476 -0
- package/data/probe/examples/chat/telemetry.js +281 -0
- package/data/probe/examples/chat/test/integration/chatFlows.test.js +320 -0
- package/data/probe/examples/chat/test/integration/toolCalling.test.js +471 -0
- package/data/probe/examples/chat/test/mocks/mockLLMProvider.js +269 -0
- package/data/probe/examples/chat/test/test-backends.js +90 -0
- package/data/probe/examples/chat/test/testUtils.js +530 -0
- package/data/probe/examples/chat/test/unit/backendTimeout.test.js +161 -0
- package/data/probe/examples/chat/test/unit/packageFiles.test.js +120 -0
- package/data/probe/examples/chat/test/verify-tests.js +118 -0
- package/data/probe/examples/chat/test-agentic-image-loading.js +294 -0
- package/data/probe/examples/chat/test-ai-sdk-telemetry.js +204 -0
- package/data/probe/examples/chat/test-chat-tracing.js +38 -0
- package/data/probe/examples/chat/test-direct-function.js +49 -0
- package/data/probe/examples/chat/test-file-size-validation.js +103 -0
- package/data/probe/examples/chat/test-full-mcp-integration.js +258 -0
- package/data/probe/examples/chat/test-github-context.txt +12 -0
- package/data/probe/examples/chat/test-hierarchy.js +203 -0
- package/data/probe/examples/chat/test-image-spans.js +37 -0
- package/data/probe/examples/chat/test-local-image-reading.js +176 -0
- package/data/probe/examples/chat/test-mcp-integration.js +136 -0
- package/data/probe/examples/chat/test-mcp-probe-server.js +161 -0
- package/data/probe/examples/chat/test-mcp-with-ai.js +279 -0
- package/data/probe/examples/chat/test-multiple-allowed-dirs.js +111 -0
- package/data/probe/examples/chat/test-probe-mcp-server.js +110 -0
- package/data/probe/examples/chat/test-security-validation.js +145 -0
- package/data/probe/examples/chat/test-simple-tracing.js +32 -0
- package/data/probe/examples/chat/test-trace-verification.js +235 -0
- package/data/probe/examples/chat/test-tracing.js +114 -0
- package/data/probe/examples/chat/tokenCounter.js +419 -0
- package/data/probe/examples/chat/tokenUsageDisplay.js +134 -0
- package/data/probe/examples/chat/webServer.js +1103 -0
- package/data/probe/examples/reranker/Cargo.toml +33 -0
- package/data/probe/examples/reranker/DEBUG_OUTPUT_ANALYSIS.md +71 -0
- package/data/probe/examples/reranker/MODELS.md +66 -0
- package/data/probe/examples/reranker/MODEL_COMPARISON.md +60 -0
- package/data/probe/examples/reranker/MULTI_MODEL_ANALYSIS.md +176 -0
- package/data/probe/examples/reranker/PERFORMANCE_SUMMARY.md +156 -0
- package/data/probe/examples/reranker/README.md +347 -0
- package/data/probe/examples/reranker/RUST_BERT_COMPARISON.md +82 -0
- package/data/probe/examples/reranker/TOKENIZATION_GUIDE.md +120 -0
- package/data/probe/examples/reranker/check_rust_tokenizer.py +108 -0
- package/data/probe/examples/reranker/convert_to_torchscript.py +109 -0
- package/data/probe/examples/reranker/debug_scoring.py +189 -0
- package/data/probe/examples/reranker/debug_tokenization.py +154 -0
- package/data/probe/examples/reranker/download_models.sh +73 -0
- package/data/probe/examples/reranker/requirements.txt +13 -0
- package/data/probe/examples/reranker/run_comprehensive_benchmark.sh +83 -0
- package/data/probe/examples/reranker/rust_bert_test/Cargo.toml +12 -0
- package/data/probe/examples/reranker/rust_bert_test/README.md +54 -0
- package/data/probe/examples/reranker/simple_test.py +50 -0
- package/data/probe/examples/reranker/test_all_models.sh +63 -0
- package/data/probe/examples/reranker/test_bert_results.sh +44 -0
- package/data/probe/examples/reranker/test_cross_encoder.py +334 -0
- package/data/probe/examples/reranker/test_cross_encoder.sh +80 -0
- package/data/probe/examples/reranker/test_exact_comparison.py +151 -0
- package/data/probe/examples/reranker/test_parallel_performance.sh +56 -0
- package/data/probe/examples/reranker/test_scores.py +132 -0
- package/data/probe/install.ps1 +508 -0
- package/data/probe/install.sh +460 -0
- package/data/probe/npm/CLONE_METHOD_EXAMPLES.md +596 -0
- package/data/probe/npm/CONTEXT_COMPACTION.md +303 -0
- package/data/probe/npm/DELEGATE_TOOL_README.md +166 -0
- package/data/probe/npm/MAID_INTEGRATION.md +313 -0
- package/data/probe/npm/MCP_INTEGRATION_SUMMARY.md +241 -0
- package/data/probe/npm/README.md +824 -0
- package/data/probe/npm/bin/.gitignore +7 -0
- package/data/probe/npm/bin/.gitkeep +0 -0
- package/data/probe/npm/bin/README.md +12 -0
- package/data/probe/npm/bin/probe +167 -0
- package/data/probe/npm/docs/CLAUDE_CODE_INTEGRATION.md +414 -0
- package/data/probe/npm/docs/CODEX_INTEGRATION.md +502 -0
- package/data/probe/npm/docs/EDIT_CREATE_TOOLS.md +233 -0
- package/data/probe/npm/docs/RETRY_AND_FALLBACK.md +674 -0
- package/data/probe/npm/example-usage.js +335 -0
- package/data/probe/npm/examples/multi-engine-demo.js +117 -0
- package/data/probe/npm/examples/probe-agent-cli.js +113 -0
- package/data/probe/npm/examples/test-agent-edit.js +114 -0
- package/data/probe/npm/examples/test-edit-create.js +120 -0
- package/data/probe/npm/examples/test-edit-direct.js +114 -0
- package/data/probe/npm/index.d.ts +744 -0
- package/data/probe/npm/jest.config.js +52 -0
- package/data/probe/npm/package.json +117 -0
- package/data/probe/npm/scripts/build-agent.cjs +75 -0
- package/data/probe/npm/scripts/build-cjs.js +124 -0
- package/data/probe/npm/scripts/build-mcp.cjs +36 -0
- package/data/probe/npm/scripts/postinstall.js +216 -0
- package/data/probe/npm/test-codex-e2e.js +78 -0
- package/data/probe/npm/test-download-lock.js +109 -0
- package/data/probe/npm/test-grep-security.js +94 -0
- package/data/probe/npm/test-grep-simplified.js +63 -0
- package/data/probe/npm/test-grep.js +51 -0
- package/data/probe/npm/tests/README.md +96 -0
- package/data/probe/npm/tests/agent-compact-history.test.js +174 -0
- package/data/probe/npm/tests/allow-tests-default.test.js +151 -0
- package/data/probe/npm/tests/contextCompactor.test.js +498 -0
- package/data/probe/npm/tests/delegate-config.test.js +353 -0
- package/data/probe/npm/tests/delegate-integration.test.js +348 -0
- package/data/probe/npm/tests/extractor-integration.test.js +162 -0
- package/data/probe/npm/tests/extractor.test.js +317 -0
- package/data/probe/npm/tests/fixtures/sampleDiagrams.js +267 -0
- package/data/probe/npm/tests/integration/claude-code-auto-fallback.spec.js +148 -0
- package/data/probe/npm/tests/integration/claude-code-multi-step.spec.js +127 -0
- package/data/probe/npm/tests/integration/claude-code-tool-events.spec.js +163 -0
- package/data/probe/npm/tests/integration/codex-auto-fallback.spec.js +191 -0
- package/data/probe/npm/tests/integration/codex-tool-events.spec.js +147 -0
- package/data/probe/npm/tests/integration/examplesChatMcp.test.js +402 -0
- package/data/probe/npm/tests/integration/mcpDotenvSupport.test.js +174 -0
- package/data/probe/npm/tests/integration/mcpErrorHandling.test.js +566 -0
- package/data/probe/npm/tests/integration/mcpRobustness.test.js +564 -0
- package/data/probe/npm/tests/integration/mcpStdoutPurity.test.js +355 -0
- package/data/probe/npm/tests/integration/probeAgentMcp.test.js +398 -0
- package/data/probe/npm/tests/integration/retryFallback.test.js +368 -0
- package/data/probe/npm/tests/integration/schema-in-initial-message.test.js +318 -0
- package/data/probe/npm/tests/integration/schema-validation-loop-prevention.test.js +244 -0
- package/data/probe/npm/tests/integration/schemaRetryLogic.test.js +94 -0
- package/data/probe/npm/tests/integration/validationFlow.test.js +329 -0
- package/data/probe/npm/tests/manual/test-codex-basic.js +110 -0
- package/data/probe/npm/tests/mcp/mcpClientManager.test.js +614 -0
- package/data/probe/npm/tests/mcp/mcpConfig.test.js +359 -0
- package/data/probe/npm/tests/mcp/mcpXmlBridge.test.js +436 -0
- package/data/probe/npm/tests/mcp/mockMcpServer.js +510 -0
- package/data/probe/npm/tests/mcp-strict-syntax.test.js +319 -0
- package/data/probe/npm/tests/mermaidQuoteEscaping.test.js +214 -0
- package/data/probe/npm/tests/nestedQuoteFix.test.js +40 -0
- package/data/probe/npm/tests/setup.js +46 -0
- package/data/probe/npm/tests/unit/allowed-tools.test.js +513 -0
- package/data/probe/npm/tests/unit/attempt-completion-closing-tag-in-content.test.js +188 -0
- package/data/probe/npm/tests/unit/attemptCompletionJsonFix.test.js +238 -0
- package/data/probe/npm/tests/unit/attemptCompletionJsonIssue.test.js +128 -0
- package/data/probe/npm/tests/unit/backtickAutoFix.test.js +35 -0
- package/data/probe/npm/tests/unit/bash-probe-agent-integration.test.js +389 -0
- package/data/probe/npm/tests/unit/bash-simple-commands.test.js +324 -0
- package/data/probe/npm/tests/unit/bash-tool-comprehensive.test.js +371 -0
- package/data/probe/npm/tests/unit/bash-tool-integration.test.js +310 -0
- package/data/probe/npm/tests/unit/bash-tool.test.js +341 -0
- package/data/probe/npm/tests/unit/completion-prompt.test.js +379 -0
- package/data/probe/npm/tests/unit/cwd-path-options.test.js +287 -0
- package/data/probe/npm/tests/unit/delegate-limits.test.js +422 -0
- package/data/probe/npm/tests/unit/direct-content-attempt-completion.test.js +235 -0
- package/data/probe/npm/tests/unit/edit-create-tools.test.js +609 -0
- package/data/probe/npm/tests/unit/enhancedMermaidValidation.test.js +577 -0
- package/data/probe/npm/tests/unit/extract-content.test.js +83 -0
- package/data/probe/npm/tests/unit/extract-multiple-targets.test.js +89 -0
- package/data/probe/npm/tests/unit/fallbackManager.test.js +442 -0
- package/data/probe/npm/tests/unit/githubCompatibilityValidation.test.js +258 -0
- package/data/probe/npm/tests/unit/imageConfig.test.js +149 -0
- package/data/probe/npm/tests/unit/imagePathResolution.test.js +345 -0
- package/data/probe/npm/tests/unit/json-fixing-agent.test.js +238 -0
- package/data/probe/npm/tests/unit/json-validation-enhanced-errors.test.js +199 -0
- package/data/probe/npm/tests/unit/jsonValidationInfiniteLoopFix.test.js +228 -0
- package/data/probe/npm/tests/unit/maidIntegration.test.js +139 -0
- package/data/probe/npm/tests/unit/maxIterationsWarning.test.js +195 -0
- package/data/probe/npm/tests/unit/mermaidEdgeLabelFix.test.js +161 -0
- package/data/probe/npm/tests/unit/mermaidHtmlEntities.test.js +76 -0
- package/data/probe/npm/tests/unit/mermaidInfiniteLoopFix.test.js +64 -0
- package/data/probe/npm/tests/unit/mermaidValidation.test.js +723 -0
- package/data/probe/npm/tests/unit/mermaidValidationVisorExample.test.js +309 -0
- package/data/probe/npm/tests/unit/probe-agent-clone-realistic.test.js +643 -0
- package/data/probe/npm/tests/unit/probe-agent-clone.test.js +476 -0
- package/data/probe/npm/tests/unit/probe-agent-delegate.test.js +400 -0
- package/data/probe/npm/tests/unit/probe-agent-model-option.test.js +118 -0
- package/data/probe/npm/tests/unit/probeTool-security.test.js +283 -0
- package/data/probe/npm/tests/unit/readImageTool.test.js +418 -0
- package/data/probe/npm/tests/unit/retryManager.test.js +317 -0
- package/data/probe/npm/tests/unit/schema-aware-reminders.test.js +288 -0
- package/data/probe/npm/tests/unit/schemaDefinitionDetection.test.js +115 -0
- package/data/probe/npm/tests/unit/schemaUtils.test.js +1268 -0
- package/data/probe/npm/tests/unit/simpleTelemetry.test.js +282 -0
- package/data/probe/npm/tests/unit/simplified-attempt-completion.test.js +274 -0
- package/data/probe/npm/tests/unit/single-quote-json-bug.test.js +231 -0
- package/data/probe/npm/tests/unit/subgraphAutoFix.test.js +110 -0
- package/data/probe/npm/tests/unit/system-prompt.test.js +32 -0
- package/data/probe/npm/tests/unit/types-probe-agent-options.test.js +42 -0
- package/data/probe/npm/tests/unit/xmlParsing.test.js +720 -0
- package/data/probe/npm/tsconfig.json +21 -0
- package/data/probe/result1.txt +19 -0
- package/data/probe/result2.txt +26 -0
- package/data/probe/scripts/benchmark.sh +270 -0
- package/data/probe/scripts/cache_memory_analysis.rs +844 -0
- package/data/probe/scripts/claude-hook-wrapper.sh +56 -0
- package/data/probe/site/.env.example +10 -0
- package/data/probe/site/DEPLOYMENT.md +86 -0
- package/data/probe/site/README.md +183 -0
- package/data/probe/site/adding-languages.md +135 -0
- package/data/probe/site/ai-chat.md +427 -0
- package/data/probe/site/ai-integration.md +1488 -0
- package/data/probe/site/blog/agentic-flow-custom-xml-protocol.md +407 -0
- package/data/probe/site/blog/index.md +118 -0
- package/data/probe/site/blog/v0.6.0-release.md +426 -0
- package/data/probe/site/blog.md +8 -0
- package/data/probe/site/changelog.md +200 -0
- package/data/probe/site/cli-mode.md +437 -0
- package/data/probe/site/code-extraction.md +436 -0
- package/data/probe/site/contributing/README.md +9 -0
- package/data/probe/site/contributing/documentation-cross-references.md +215 -0
- package/data/probe/site/contributing/documentation-maintenance.md +275 -0
- package/data/probe/site/contributing/documentation-structure.md +75 -0
- package/data/probe/site/documentation-cross-references.md +215 -0
- package/data/probe/site/documentation-guide.md +132 -0
- package/data/probe/site/documentation-maintenance.md +275 -0
- package/data/probe/site/features.md +147 -0
- package/data/probe/site/how-it-works.md +118 -0
- package/data/probe/site/index.md +175 -0
- package/data/probe/site/index.md.bak +133 -0
- package/data/probe/site/installation.md +235 -0
- package/data/probe/site/integrations/docker.md +248 -0
- package/data/probe/site/integrations/github-actions.md +413 -0
- package/data/probe/site/language-support-overview.md +168 -0
- package/data/probe/site/mcp-integration.md +587 -0
- package/data/probe/site/mcp-server.md +304 -0
- package/data/probe/site/navigation-structure.md +76 -0
- package/data/probe/site/nodejs-sdk.md +798 -0
- package/data/probe/site/output-formats.md +625 -0
- package/data/probe/site/package.json +21 -0
- package/data/probe/site/public/_headers +28 -0
- package/data/probe/site/public/_redirects +11 -0
- package/data/probe/site/quick-start.md +289 -0
- package/data/probe/site/search-functionality.md +291 -0
- package/data/probe/site/search-reference.md +291 -0
- package/data/probe/site/supported-languages.md +215 -0
- package/data/probe/site/use-cases/README.md +8 -0
- package/data/probe/site/use-cases/advanced-cli.md +253 -0
- package/data/probe/site/use-cases/ai-code-editors.md +239 -0
- package/data/probe/site/use-cases/building-ai-tools.md +529 -0
- package/data/probe/site/use-cases/cli-ai-workflows.md +285 -0
- package/data/probe/site/use-cases/deploying-probe-web-interface.md +255 -0
- package/data/probe/site/use-cases/integrating-probe-into-ai-code-editors.md +161 -0
- package/data/probe/site/use-cases/nodejs-sdk.md +596 -0
- package/data/probe/site/use-cases/team-chat.md +350 -0
- package/data/probe/site/web-interface.md +434 -0
- package/data/probe/site/wrangler.toml +9 -0
- package/data/probe/test-api-key.sh +1 -0
- package/data/probe/test-probe-implementation/hello.js +7 -0
- package/data/probe/test_cases/demonstrate_early_termination_issues.sh +176 -0
- package/data/probe/test_cases/early_termination_issues.rs +533 -0
- package/data/probe/test_data/test_nested_struct.go +26 -0
- package/data/probe/tests/README.md +286 -0
- package/data/probe/tests/README_search_determinism_tests.md +116 -0
- package/data/probe/tests/adjacent_comment_test.rs +152 -0
- package/data/probe/tests/apostrophe_handling_tests.rs +132 -0
- package/data/probe/tests/block_filtering_with_ast_tests.rs +669 -0
- package/data/probe/tests/block_merging_tests.rs +396 -0
- package/data/probe/tests/c_outline_format_tests.rs +2179 -0
- package/data/probe/tests/cache_invalidation_issues.rs.disabled +682 -0
- package/data/probe/tests/cache_order_tests.rs +147 -0
- package/data/probe/tests/cache_query_scoping_tests.rs +221 -0
- package/data/probe/tests/cli_tests.rs +680 -0
- package/data/probe/tests/comment_context_integration_test.rs +240 -0
- package/data/probe/tests/common.rs +33 -0
- package/data/probe/tests/complex_block_merging_tests.rs +599 -0
- package/data/probe/tests/complex_query_block_filtering_tests.rs +422 -0
- package/data/probe/tests/control_flow_closing_braces_test.rs +91 -0
- package/data/probe/tests/cpp_outline_format_tests.rs +1507 -0
- package/data/probe/tests/csharp_outline_format_tests.rs +941 -0
- package/data/probe/tests/elastic_query_integration_tests.rs +922 -0
- package/data/probe/tests/extract_command_tests.rs +1848 -0
- package/data/probe/tests/extract_deduplication_tests.rs +146 -0
- package/data/probe/tests/extract_input_file_tests.rs +84 -0
- package/data/probe/tests/extract_prompt_tests.rs +102 -0
- package/data/probe/tests/filename_search_tests.rs +96 -0
- package/data/probe/tests/fixtures/user/AssemblyInfo.cs +3 -0
- package/data/probe/tests/github_extract_tests.rs +234 -0
- package/data/probe/tests/go_comment_test.rs +253 -0
- package/data/probe/tests/go_outline_format_tests.rs +2587 -0
- package/data/probe/tests/go_path_resolver_tests.rs +96 -0
- package/data/probe/tests/html_outline_format_tests.rs +637 -0
- package/data/probe/tests/integration_tests.rs +837 -0
- package/data/probe/tests/ip_whitelist_test.rs +148 -0
- package/data/probe/tests/java_outline_format_tests.rs +1611 -0
- package/data/probe/tests/javascript_extract_tests.rs +315 -0
- package/data/probe/tests/javascript_outline_format_tests.rs +1464 -0
- package/data/probe/tests/json_format_tests.rs +436 -0
- package/data/probe/tests/json_schema_validation_tests.rs +450 -0
- package/data/probe/tests/lib_usage.rs +60 -0
- package/data/probe/tests/line_comment_context_extension_test.rs +459 -0
- package/data/probe/tests/line_map_cache_tests.rs +114 -0
- package/data/probe/tests/markdown_integration_tests.rs +190 -0
- package/data/probe/tests/mocks/test_ip_whitelist.go +11 -0
- package/data/probe/tests/mocks/test_object.js +27 -0
- package/data/probe/tests/mocks/test_struct.go +50 -0
- package/data/probe/tests/multi_keyword_pattern_tests.rs +464 -0
- package/data/probe/tests/multi_language_syntax_integration_tests.rs +218 -0
- package/data/probe/tests/multiple_capture_groups_tests.rs +169 -0
- package/data/probe/tests/negative_compound_word_tests.rs +246 -0
- package/data/probe/tests/nested_symbol_extraction_tests.rs +99 -0
- package/data/probe/tests/outline_cross_file_interference_test.rs +335 -0
- package/data/probe/tests/outline_keyword_preservation_test.rs +67 -0
- package/data/probe/tests/output_format_edge_cases_tests.rs +693 -0
- package/data/probe/tests/parallel_extraction_tests.rs +178 -0
- package/data/probe/tests/parallel_search_tests.rs +355 -0
- package/data/probe/tests/path_resolver_tests.rs +698 -0
- package/data/probe/tests/php_outline_format_extended_tests.rs +928 -0
- package/data/probe/tests/php_outline_format_tests.rs +768 -0
- package/data/probe/tests/property_tests.proptest-regressions +9 -0
- package/data/probe/tests/property_tests.rs +118 -0
- package/data/probe/tests/python_outline_format_tests.rs +1538 -0
- package/data/probe/tests/query_command_json_tests.rs +438 -0
- package/data/probe/tests/query_command_tests.rs +232 -0
- package/data/probe/tests/query_command_xml_tests.rs +569 -0
- package/data/probe/tests/quoted_term_with_negative_keyword_tests.rs +216 -0
- package/data/probe/tests/required_terms_filename_tests.rs +116 -0
- package/data/probe/tests/ruby_outline_format_tests.rs +1011 -0
- package/data/probe/tests/rust_line_comment_context_test.rs +151 -0
- package/data/probe/tests/rust_outline_format_enhanced_tests.rs +725 -0
- package/data/probe/tests/rust_outline_format_tests.rs +843 -0
- package/data/probe/tests/schemas/xml_output_schema.xsd +38 -0
- package/data/probe/tests/search_determinism_tests.rs +451 -0
- package/data/probe/tests/search_hints_tests.rs +253 -0
- package/data/probe/tests/special_character_escaping_tests.rs +417 -0
- package/data/probe/tests/stemming_compound_word_filtering_tests.rs +535 -0
- package/data/probe/tests/strict_elastic_syntax_tests.rs +404 -0
- package/data/probe/tests/swift_outline_format_tests.rs +3319 -0
- package/data/probe/tests/symbols_tests.rs +166 -0
- package/data/probe/tests/test_file.rs +45 -0
- package/data/probe/tests/test_tokenize.rs +28 -0
- package/data/probe/tests/timeout_tests.rs +82 -0
- package/data/probe/tests/tokenization_tests.rs +195 -0
- package/data/probe/tests/tokenized_block_filtering_tests.rs +174 -0
- package/data/probe/tests/typescript_extract_tests.rs +214 -0
- package/data/probe/tests/typescript_outline_format_tests.rs +2188 -0
- package/data/probe/tests/xml_format_tests.rs +568 -0
- package/data/probe/tests/xml_schema_validation_tests.rs +497 -0
- package/data/scripts/postinstall.mjs +9 -0
- package/data/scripts/set-version.js +0 -0
- package/data/scripts/wiki-build.sh +111 -0
- package/data/scripts/wiki-deploy.sh +73 -0
- package/data/serve.json +12 -0
- package/data/test/demo-dynamic.html +134 -0
- package/data/test/demo-esm.html +105 -0
- package/data/test/demo-iife.html +78 -0
- package/data/tsconfig.json +7 -0
- package/data/vite.server.ts +483 -0
- package/data/vitest.config.ts +40 -0
- package/data/wiki/Home.md +58 -0
- package/data/wiki/_Sidebar.md +39 -0
- package/docs-mcp.config.json +20 -0
- package/package.json +56 -0
- package/src/config.js +111 -0
- package/src/index.js +395 -0
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@crownpeak/dqm-react-component-dev-mcp",
|
|
3
|
+
"version": "1.2.0",
|
|
4
|
+
"description": "MCP Server for Crownpeak DQM React Component documentation - powered by Probe",
|
|
5
|
+
"author": "Crownpeak Technology GmbH",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"main": "src/index.js",
|
|
9
|
+
"bin": {
|
|
10
|
+
"dqm-dev-mcp": "bin/mcp"
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"bin",
|
|
14
|
+
"src",
|
|
15
|
+
"data",
|
|
16
|
+
"docs-mcp.config.json"
|
|
17
|
+
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "node scripts/build.js",
|
|
20
|
+
"start": "node src/index.js",
|
|
21
|
+
"prepublishOnly": "npm run build"
|
|
22
|
+
},
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"@probelabs/probe": "^0.6.0-rc128",
|
|
25
|
+
"@modelcontextprotocol/sdk": "^1.6.0",
|
|
26
|
+
"axios": "^1.6.0",
|
|
27
|
+
"fs-extra": "^11.2.0",
|
|
28
|
+
"glob": "^10.3.0",
|
|
29
|
+
"minimist": "^1.2.8",
|
|
30
|
+
"simple-git": "^3.22.0",
|
|
31
|
+
"tar": "^7.0.0"
|
|
32
|
+
},
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "git+https://github.com/Crownpeak/dqm-react-component.git",
|
|
36
|
+
"directory": "mcp-server"
|
|
37
|
+
},
|
|
38
|
+
"bugs": {
|
|
39
|
+
"url": "https://github.com/Crownpeak/dqm-react-component/issues"
|
|
40
|
+
},
|
|
41
|
+
"homepage": "https://github.com/Crownpeak/dqm-react-component/tree/main/mcp-server#readme",
|
|
42
|
+
"keywords": [
|
|
43
|
+
"mcp",
|
|
44
|
+
"model-context-protocol",
|
|
45
|
+
"crownpeak",
|
|
46
|
+
"dqm",
|
|
47
|
+
"quality-management",
|
|
48
|
+
"ai",
|
|
49
|
+
"copilot",
|
|
50
|
+
"documentation",
|
|
51
|
+
"probe"
|
|
52
|
+
],
|
|
53
|
+
"engines": {
|
|
54
|
+
"node": ">=18.0.0"
|
|
55
|
+
}
|
|
56
|
+
}
|
package/src/config.js
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
import minimist from 'minimist';
|
|
5
|
+
|
|
6
|
+
// Get the directory of the current module
|
|
7
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
8
|
+
const __dirname = path.dirname(__filename);
|
|
9
|
+
|
|
10
|
+
// Default configuration
|
|
11
|
+
const defaultConfig = {
|
|
12
|
+
// Directory to include in the package (for static docs)
|
|
13
|
+
includeDir: null,
|
|
14
|
+
|
|
15
|
+
// Git repository URL (for dynamic docs)
|
|
16
|
+
gitUrl: null,
|
|
17
|
+
|
|
18
|
+
// Git branch or tag to checkout
|
|
19
|
+
gitRef: 'main',
|
|
20
|
+
|
|
21
|
+
// Auto-update interval in minutes (0 to disable)
|
|
22
|
+
autoUpdateInterval: 0,
|
|
23
|
+
|
|
24
|
+
// Data directory for searching
|
|
25
|
+
dataDir: path.resolve(__dirname, '..', 'data'),
|
|
26
|
+
|
|
27
|
+
// MCP Tool configuration
|
|
28
|
+
toolName: 'search_dqm_docs',
|
|
29
|
+
toolDescription: 'Search the Crownpeak DQM React Component documentation. Use this to find information about DQMSidebar props, configuration options, overlay detection, backend authentication, widget bundle integration, and troubleshooting.',
|
|
30
|
+
|
|
31
|
+
// Ignore patterns
|
|
32
|
+
ignorePatterns: [
|
|
33
|
+
'node_modules',
|
|
34
|
+
'.git',
|
|
35
|
+
'dist',
|
|
36
|
+
'build',
|
|
37
|
+
'coverage',
|
|
38
|
+
'*.log',
|
|
39
|
+
'*.lock',
|
|
40
|
+
'*.tgz',
|
|
41
|
+
'dump.rdb'
|
|
42
|
+
],
|
|
43
|
+
|
|
44
|
+
// Enable build cleanup (remove large files)
|
|
45
|
+
enableBuildCleanup: true
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Load configuration from config file and environment variables
|
|
50
|
+
* @returns {Object} Configuration object
|
|
51
|
+
*/
|
|
52
|
+
export function loadConfig() {
|
|
53
|
+
// Parse command line arguments
|
|
54
|
+
const args = minimist(process.argv.slice(2));
|
|
55
|
+
|
|
56
|
+
// Check for config file path in arguments
|
|
57
|
+
const configPath = args.config || path.resolve(__dirname, '..', 'docs-mcp.config.json');
|
|
58
|
+
|
|
59
|
+
let config = { ...defaultConfig };
|
|
60
|
+
|
|
61
|
+
// Load configuration from file if it exists
|
|
62
|
+
if (fs.existsSync(configPath)) {
|
|
63
|
+
try {
|
|
64
|
+
const fileConfig = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
65
|
+
config = { ...config, ...fileConfig };
|
|
66
|
+
console.error(`Loaded configuration from ${configPath}`);
|
|
67
|
+
} catch (error) {
|
|
68
|
+
console.error(`Error loading configuration from ${configPath}:`, error);
|
|
69
|
+
}
|
|
70
|
+
} else {
|
|
71
|
+
console.error(`No configuration file found at ${configPath}, using defaults`);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Override with environment variables
|
|
75
|
+
if (process.env.INCLUDE_DIR) config.includeDir = process.env.INCLUDE_DIR;
|
|
76
|
+
if (process.env.GIT_URL) config.gitUrl = process.env.GIT_URL;
|
|
77
|
+
if (process.env.GIT_REF) config.gitRef = process.env.GIT_REF;
|
|
78
|
+
if (process.env.AUTO_UPDATE_INTERVAL) config.autoUpdateInterval = parseInt(process.env.AUTO_UPDATE_INTERVAL, 10);
|
|
79
|
+
if (process.env.DATA_DIR) config.dataDir = process.env.DATA_DIR;
|
|
80
|
+
if (process.env.TOOL_NAME) config.toolName = process.env.TOOL_NAME;
|
|
81
|
+
if (process.env.TOOL_DESCRIPTION) config.toolDescription = process.env.TOOL_DESCRIPTION;
|
|
82
|
+
if (process.env.IGNORE_PATTERNS) config.ignorePatterns = process.env.IGNORE_PATTERNS.split(',').map(p => p.trim());
|
|
83
|
+
|
|
84
|
+
// Override with command line arguments (highest priority)
|
|
85
|
+
if (args.includeDir) config.includeDir = args.includeDir;
|
|
86
|
+
if (args.gitUrl) config.gitUrl = args.gitUrl;
|
|
87
|
+
if (args.gitRef) config.gitRef = args.gitRef;
|
|
88
|
+
if (args.autoUpdateInterval !== undefined) config.autoUpdateInterval = parseInt(args.autoUpdateInterval, 10);
|
|
89
|
+
if (args.dataDir) config.dataDir = args.dataDir;
|
|
90
|
+
if (args.toolName) config.toolName = args.toolName;
|
|
91
|
+
if (args.toolDescription) config.toolDescription = args.toolDescription;
|
|
92
|
+
if (args.ignorePatterns) config.ignorePatterns = Array.isArray(args.ignorePatterns) ? args.ignorePatterns : args.ignorePatterns.split(',').map(p => p.trim());
|
|
93
|
+
if (args.enableBuildCleanup !== undefined) config.enableBuildCleanup = args.enableBuildCleanup === true || args.enableBuildCleanup === 'true';
|
|
94
|
+
|
|
95
|
+
// Ensure dataDir is an absolute path
|
|
96
|
+
if (!path.isAbsolute(config.dataDir)) {
|
|
97
|
+
config.dataDir = path.resolve(process.cwd(), config.dataDir);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Ensure includeDir is an absolute path if provided
|
|
101
|
+
if (config.includeDir && !path.isAbsolute(config.includeDir)) {
|
|
102
|
+
config.includeDir = path.resolve(process.cwd(), config.includeDir);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Validate configuration
|
|
106
|
+
if (config.includeDir && config.gitUrl) {
|
|
107
|
+
console.warn('Both includeDir and gitUrl provided. gitUrl will take precedence.');
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return config;
|
|
111
|
+
}
|
package/src/index.js
ADDED
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
3
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
+
import {
|
|
5
|
+
CallToolRequestSchema,
|
|
6
|
+
ErrorCode,
|
|
7
|
+
ListToolsRequestSchema,
|
|
8
|
+
McpError,
|
|
9
|
+
} from '@modelcontextprotocol/sdk/types.js';
|
|
10
|
+
import path from 'path';
|
|
11
|
+
import fs from 'fs-extra';
|
|
12
|
+
import { fileURLToPath } from 'url';
|
|
13
|
+
import { search } from '@probelabs/probe';
|
|
14
|
+
import simpleGit from 'simple-git';
|
|
15
|
+
import axios from 'axios';
|
|
16
|
+
import * as tar from 'tar';
|
|
17
|
+
import { loadConfig } from './config.js';
|
|
18
|
+
import minimist from 'minimist';
|
|
19
|
+
|
|
20
|
+
// Get the package.json to determine the version
|
|
21
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
22
|
+
const __dirname = path.dirname(__filename);
|
|
23
|
+
const packageJsonPath = path.resolve(__dirname, '..', 'package.json');
|
|
24
|
+
|
|
25
|
+
// Get version from package.json
|
|
26
|
+
let packageVersion = '1.0.0';
|
|
27
|
+
try {
|
|
28
|
+
if (fs.existsSync(packageJsonPath)) {
|
|
29
|
+
console.error(`Found package.json at: ${packageJsonPath}`);
|
|
30
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
31
|
+
if (packageJson.version) {
|
|
32
|
+
packageVersion = packageJson.version;
|
|
33
|
+
console.error(`Using version from package.json: ${packageVersion}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
} catch (error) {
|
|
37
|
+
console.error(`Error reading package.json:`, error);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Load configuration (handles defaults, file, env, args precedence)
|
|
41
|
+
const config = loadConfig();
|
|
42
|
+
|
|
43
|
+
// Git instance - initialize lazily only if needed for auto-updates
|
|
44
|
+
let git = null;
|
|
45
|
+
|
|
46
|
+
// Ensure the data directory exists (might be empty initially)
|
|
47
|
+
try {
|
|
48
|
+
fs.ensureDirSync(config.dataDir);
|
|
49
|
+
console.error(`Ensured data directory exists: ${config.dataDir}`);
|
|
50
|
+
} catch (err) {
|
|
51
|
+
console.error(`Failed to ensure data directory exists: ${config.dataDir}`, err);
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Auto-update timer
|
|
56
|
+
let updateTimer = null;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* @typedef {Object} SearchDocsArgs
|
|
60
|
+
* @property {string|string[]} query - The search query using Elasticsearch syntax. Focus on keywords.
|
|
61
|
+
*/
|
|
62
|
+
|
|
63
|
+
class DocsMcpServer {
|
|
64
|
+
constructor() {
|
|
65
|
+
/**
|
|
66
|
+
* @type {Server}
|
|
67
|
+
* @private
|
|
68
|
+
*/
|
|
69
|
+
this.server = new Server(
|
|
70
|
+
{
|
|
71
|
+
name: '@crownpeak/dqm-react-component-dev-mcp',
|
|
72
|
+
version: packageVersion,
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
capabilities: {
|
|
76
|
+
tools: {},
|
|
77
|
+
},
|
|
78
|
+
}
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
this.setupToolHandlers();
|
|
82
|
+
|
|
83
|
+
// Error handling
|
|
84
|
+
this.server.onerror = (error) => console.error('[MCP Error]', error);
|
|
85
|
+
process.on('SIGINT', async () => {
|
|
86
|
+
if (updateTimer) clearTimeout(updateTimer);
|
|
87
|
+
await this.server.close();
|
|
88
|
+
process.exit(0);
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Set up the tool handlers for the MCP server
|
|
94
|
+
* @private
|
|
95
|
+
*/
|
|
96
|
+
setupToolHandlers() {
|
|
97
|
+
this.server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
98
|
+
tools: [
|
|
99
|
+
{
|
|
100
|
+
name: config.toolName,
|
|
101
|
+
description: config.toolDescription,
|
|
102
|
+
inputSchema: {
|
|
103
|
+
type: 'object',
|
|
104
|
+
properties: {
|
|
105
|
+
query: {
|
|
106
|
+
type: 'string',
|
|
107
|
+
description: 'Elasticsearch query string. Focus on keywords and use ES syntax (e.g., "overlay AND config", "DQMSidebar props", "backend authentication").',
|
|
108
|
+
},
|
|
109
|
+
page: {
|
|
110
|
+
type: 'number',
|
|
111
|
+
description: 'Optional page number for pagination of results (e.g., 1, 2, 3...). Default is 1.',
|
|
112
|
+
default: 1,
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
required: ['query']
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
],
|
|
119
|
+
}));
|
|
120
|
+
|
|
121
|
+
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
122
|
+
// Check against the configured tool name
|
|
123
|
+
if (request.params.name !== config.toolName) {
|
|
124
|
+
throw new McpError(
|
|
125
|
+
ErrorCode.MethodNotFound,
|
|
126
|
+
`Unknown tool: ${request.params.name}. Expected: ${config.toolName}`
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
try {
|
|
131
|
+
// Log the incoming request for debugging
|
|
132
|
+
console.error(`Received request for tool: ${request.params.name}`);
|
|
133
|
+
console.error(`Request arguments: ${JSON.stringify(request.params.arguments)}`);
|
|
134
|
+
|
|
135
|
+
// Ensure arguments is an object
|
|
136
|
+
if (!request.params.arguments || typeof request.params.arguments !== 'object') {
|
|
137
|
+
throw new Error("Arguments must be an object");
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
const args = request.params.arguments;
|
|
141
|
+
|
|
142
|
+
// Validate required fields
|
|
143
|
+
if (!args.query) {
|
|
144
|
+
throw new Error("Query is required in arguments");
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const result = await this.executeDocsSearch(args);
|
|
148
|
+
|
|
149
|
+
return {
|
|
150
|
+
content: [
|
|
151
|
+
{
|
|
152
|
+
type: 'text',
|
|
153
|
+
text: result,
|
|
154
|
+
},
|
|
155
|
+
],
|
|
156
|
+
};
|
|
157
|
+
} catch (error) {
|
|
158
|
+
console.error(`Error executing ${request.params.name}:`, error);
|
|
159
|
+
return {
|
|
160
|
+
content: [
|
|
161
|
+
{
|
|
162
|
+
type: 'text',
|
|
163
|
+
text: `Error executing ${request.params.name}: ${error instanceof Error ? error.message : String(error)}`,
|
|
164
|
+
},
|
|
165
|
+
],
|
|
166
|
+
isError: true,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Execute a documentation search
|
|
174
|
+
* @param {SearchDocsArgs} args - Search arguments
|
|
175
|
+
* @returns {Promise<string>} Search results
|
|
176
|
+
* @private
|
|
177
|
+
*/
|
|
178
|
+
async executeDocsSearch(args) {
|
|
179
|
+
try {
|
|
180
|
+
// Always use the configured data directory
|
|
181
|
+
const searchPath = config.dataDir;
|
|
182
|
+
|
|
183
|
+
// Create a clean options object
|
|
184
|
+
const options = {
|
|
185
|
+
path: searchPath,
|
|
186
|
+
query: args.query,
|
|
187
|
+
maxTokens: 10000
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
console.error("Executing search with options:", JSON.stringify(options, null, 2));
|
|
191
|
+
|
|
192
|
+
// Call search with the options object
|
|
193
|
+
const result = await search(options);
|
|
194
|
+
return result;
|
|
195
|
+
} catch (error) {
|
|
196
|
+
console.error('Error executing docs search:', error);
|
|
197
|
+
throw new McpError(
|
|
198
|
+
ErrorCode.MethodNotFound,
|
|
199
|
+
`Error executing docs search: ${error.message || String(error)}`
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Check for updates in the Git repository and pull changes.
|
|
206
|
+
* @private
|
|
207
|
+
*/
|
|
208
|
+
async checkForUpdates() {
|
|
209
|
+
if (!config.gitUrl || !git) return;
|
|
210
|
+
|
|
211
|
+
console.log('Checking for documentation updates...');
|
|
212
|
+
try {
|
|
213
|
+
const isRepo = await git.checkIsRepo();
|
|
214
|
+
if (!isRepo) {
|
|
215
|
+
console.error(`Data directory ${config.dataDir} is not a Git repository. Skipping update.`);
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
await git.fetch();
|
|
220
|
+
const status = await git.status();
|
|
221
|
+
|
|
222
|
+
if (status.behind > 0) {
|
|
223
|
+
console.log(`Local branch is ${status.behind} commits behind origin/${status.tracking}. Pulling updates...`);
|
|
224
|
+
await git.pull('origin', config.gitRef);
|
|
225
|
+
console.log('Documentation updated successfully.');
|
|
226
|
+
} else {
|
|
227
|
+
console.log('Documentation is up-to-date.');
|
|
228
|
+
}
|
|
229
|
+
} catch (error) {
|
|
230
|
+
console.error('Error checking for updates:', error);
|
|
231
|
+
} finally {
|
|
232
|
+
if (config.autoUpdateInterval > 0) {
|
|
233
|
+
updateTimer = setTimeout(() => this.checkForUpdates(), config.autoUpdateInterval * 60 * 1000);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Downloads and extracts a tarball archive from a Git repository URL.
|
|
240
|
+
* @private
|
|
241
|
+
*/
|
|
242
|
+
async downloadAndExtractTarballRuntime() {
|
|
243
|
+
const match = config.gitUrl.match(/github\.com\/([^/]+)\/([^/]+?)(\.git)?$/);
|
|
244
|
+
if (!match) {
|
|
245
|
+
console.error(`Cannot determine tarball URL from gitUrl: ${config.gitUrl}. Cannot proceed.`);
|
|
246
|
+
throw new Error('Invalid or unsupported Git URL for tarball download.');
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
const owner = match[1];
|
|
250
|
+
const repo = match[2];
|
|
251
|
+
let ref = config.gitRef || 'main';
|
|
252
|
+
|
|
253
|
+
const downloadAttempt = async (currentRef) => {
|
|
254
|
+
const tarballUrl = `https://github.com/${owner}/${repo}/archive/${currentRef}.tar.gz`;
|
|
255
|
+
console.log(`Attempting to download archive (${currentRef}) from ${tarballUrl} to ${config.dataDir}...`);
|
|
256
|
+
|
|
257
|
+
await fs.emptyDir(config.dataDir);
|
|
258
|
+
|
|
259
|
+
const response = await axios({
|
|
260
|
+
method: 'get',
|
|
261
|
+
url: tarballUrl,
|
|
262
|
+
responseType: 'stream',
|
|
263
|
+
validateStatus: (status) => status >= 200 && status < 300,
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
await new Promise((resolve, reject) => {
|
|
267
|
+
response.data
|
|
268
|
+
.pipe(
|
|
269
|
+
tar.x({
|
|
270
|
+
strip: 1,
|
|
271
|
+
C: config.dataDir,
|
|
272
|
+
})
|
|
273
|
+
)
|
|
274
|
+
.on('finish', resolve)
|
|
275
|
+
.on('error', reject);
|
|
276
|
+
});
|
|
277
|
+
console.log(`Successfully downloaded and extracted archive (${currentRef}) to ${config.dataDir}`);
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
try {
|
|
281
|
+
await downloadAttempt(ref);
|
|
282
|
+
} catch (error) {
|
|
283
|
+
if (ref === 'main' && error.response && error.response.status === 404) {
|
|
284
|
+
console.warn(`Download failed for ref 'main' (404). Retrying with 'master'...`);
|
|
285
|
+
ref = 'master';
|
|
286
|
+
try {
|
|
287
|
+
await downloadAttempt(ref);
|
|
288
|
+
} catch (retryError) {
|
|
289
|
+
console.error(`Retry with 'master' also failed: ${retryError.message}`);
|
|
290
|
+
throw new Error(`Failed to download archive for both 'main' and 'master' refs.`);
|
|
291
|
+
}
|
|
292
|
+
} else {
|
|
293
|
+
console.error(`Error downloading or extracting tarball (${ref}): ${error.message}`);
|
|
294
|
+
throw error;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
async run() {
|
|
300
|
+
try {
|
|
301
|
+
console.error("Starting DQM Docs MCP server...");
|
|
302
|
+
console.error(`Using data directory: ${config.dataDir}`);
|
|
303
|
+
console.error(`MCP Tool Name: ${config.toolName}`);
|
|
304
|
+
console.error(`MCP Tool Description: ${config.toolDescription}`);
|
|
305
|
+
if (config.gitUrl) {
|
|
306
|
+
console.error(`Using Git repository: ${config.gitUrl} (ref: ${config.gitRef})`);
|
|
307
|
+
console.error(`Auto-update interval: ${config.autoUpdateInterval} minutes`);
|
|
308
|
+
} else if (config.includeDir) {
|
|
309
|
+
console.error(`Using static directory: ${config.includeDir}`);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// Check for runtime overrides and pre-built data
|
|
313
|
+
const args = minimist(process.argv.slice(2));
|
|
314
|
+
const runtimeOverride = args.dataDir || args.gitUrl || args.includeDir ||
|
|
315
|
+
process.env.DATA_DIR || process.env.GIT_URL || process.env.INCLUDE_DIR;
|
|
316
|
+
|
|
317
|
+
let usePrebuiltData = false;
|
|
318
|
+
if (!runtimeOverride) {
|
|
319
|
+
try {
|
|
320
|
+
if (fs.existsSync(config.dataDir)) {
|
|
321
|
+
const items = await fs.readdir(config.dataDir);
|
|
322
|
+
if (items.length > 0) {
|
|
323
|
+
usePrebuiltData = true;
|
|
324
|
+
console.error(`Detected non-empty default data directory. Using pre-built content from ${config.dataDir}.`);
|
|
325
|
+
} else {
|
|
326
|
+
console.error(`Default data directory ${config.dataDir} exists but is empty. Will attempt fetch based on config.`);
|
|
327
|
+
}
|
|
328
|
+
} else {
|
|
329
|
+
console.error(`Default data directory ${config.dataDir} does not exist. Will attempt fetch based on config.`);
|
|
330
|
+
}
|
|
331
|
+
} catch (readDirError) {
|
|
332
|
+
console.error(`Error checking default data directory ${config.dataDir}:`, readDirError);
|
|
333
|
+
}
|
|
334
|
+
} else {
|
|
335
|
+
console.error('Runtime content source override detected. Ignoring pre-built data check.');
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
// Handle content source initialization
|
|
339
|
+
if (usePrebuiltData) {
|
|
340
|
+
console.error("Skipping content fetch, using pre-built data.");
|
|
341
|
+
if (updateTimer) clearTimeout(updateTimer);
|
|
342
|
+
updateTimer = null;
|
|
343
|
+
} else if (config.gitUrl) {
|
|
344
|
+
if (config.autoUpdateInterval > 0) {
|
|
345
|
+
console.error(`Auto-update enabled. Initializing Git for ${config.dataDir}...`);
|
|
346
|
+
if (!git) git = simpleGit(config.dataDir);
|
|
347
|
+
const isRepo = await git.checkIsRepo();
|
|
348
|
+
|
|
349
|
+
if (!isRepo) {
|
|
350
|
+
console.error(`Directory ${config.dataDir} is not a Git repository. Attempting initial clone...`);
|
|
351
|
+
try {
|
|
352
|
+
await fs.emptyDir(config.dataDir);
|
|
353
|
+
await simpleGit().clone(config.gitUrl, config.dataDir, ['--branch', config.gitRef, '--depth', '1']);
|
|
354
|
+
console.error(`Successfully cloned ${config.gitUrl} to ${config.dataDir}`);
|
|
355
|
+
} catch (cloneError) {
|
|
356
|
+
console.error(`Error during initial clone:`, cloneError);
|
|
357
|
+
process.exit(1);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
console.error(`Directory ${config.dataDir} is a Git repository. Proceeding with update check.`);
|
|
361
|
+
await this.checkForUpdates();
|
|
362
|
+
} else {
|
|
363
|
+
console.error(`Auto-update disabled. Initializing content from tarball for ${config.gitUrl}...`);
|
|
364
|
+
try {
|
|
365
|
+
await this.downloadAndExtractTarballRuntime();
|
|
366
|
+
} catch (tarballError) {
|
|
367
|
+
console.error(`Failed to initialize from tarball:`, tarballError);
|
|
368
|
+
process.exit(1);
|
|
369
|
+
}
|
|
370
|
+
if (updateTimer) clearTimeout(updateTimer);
|
|
371
|
+
updateTimer = null;
|
|
372
|
+
}
|
|
373
|
+
} else if (config.includeDir && !runtimeOverride) {
|
|
374
|
+
console.error(`Warning: Config specifies includeDir (${config.includeDir}) but data dir (${config.dataDir}) is empty/missing and no runtime override provided.`);
|
|
375
|
+
if (updateTimer) clearTimeout(updateTimer);
|
|
376
|
+
updateTimer = null;
|
|
377
|
+
} else if (!runtimeOverride) {
|
|
378
|
+
console.error(`No content source specified and no pre-built data found in ${config.dataDir}. Server may have no data to search.`);
|
|
379
|
+
if (updateTimer) clearTimeout(updateTimer);
|
|
380
|
+
updateTimer = null;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// Connect the server to the transport
|
|
384
|
+
const transport = new StdioServerTransport();
|
|
385
|
+
await this.server.connect(transport);
|
|
386
|
+
console.error('DQM Docs MCP server running on stdio');
|
|
387
|
+
} catch (error) {
|
|
388
|
+
console.error('Error starting server:', error);
|
|
389
|
+
process.exit(1);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
const server = new DocsMcpServer();
|
|
395
|
+
server.run().catch(console.error);
|