@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
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration tests for examples/chat ProbeChat with MCP support
|
|
3
|
+
*
|
|
4
|
+
* NOTE: This test requires examples/chat dependencies to be installed.
|
|
5
|
+
* It tests the integration between the npm package and the examples/chat application.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { jest } from '@jest/globals';
|
|
9
|
+
import { join, dirname } from 'path';
|
|
10
|
+
import { fileURLToPath } from 'url';
|
|
11
|
+
import { mkdtemp, writeFile, rm } from 'fs/promises';
|
|
12
|
+
import { tmpdir } from 'os';
|
|
13
|
+
import { existsSync } from 'fs';
|
|
14
|
+
|
|
15
|
+
// Check if examples/chat exists and has node_modules
|
|
16
|
+
const examplesPath = join(dirname(dirname(dirname(dirname(fileURLToPath(import.meta.url))))), 'examples', 'chat');
|
|
17
|
+
const examplesNodeModules = join(examplesPath, 'node_modules');
|
|
18
|
+
|
|
19
|
+
// Skip these tests if examples/chat dependencies are not installed
|
|
20
|
+
const skipTests = !existsSync(examplesNodeModules);
|
|
21
|
+
|
|
22
|
+
// Only import ProbeChat if we can run the tests
|
|
23
|
+
let ProbeChat;
|
|
24
|
+
if (!skipTests) {
|
|
25
|
+
// Mock dotenv/config before importing modules that use it
|
|
26
|
+
jest.unstable_mockModule('dotenv/config', () => ({}));
|
|
27
|
+
|
|
28
|
+
// Import ProbeChat only if we'll run the tests
|
|
29
|
+
const module = await import('../../../examples/chat/probeChat.js');
|
|
30
|
+
ProbeChat = module.ProbeChat;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
34
|
+
const __dirname = dirname(__filename);
|
|
35
|
+
|
|
36
|
+
const describeOrSkip = skipTests ? describe.skip : describe;
|
|
37
|
+
|
|
38
|
+
describeOrSkip('ProbeChat MCP Integration', () => {
|
|
39
|
+
let tempDir;
|
|
40
|
+
|
|
41
|
+
if (skipTests) {
|
|
42
|
+
test('Tests skipped - examples/chat dependencies not installed', () => {
|
|
43
|
+
console.log('Skipping ProbeChat tests as examples/chat dependencies are not installed');
|
|
44
|
+
console.log(`Checked path: ${examplesNodeModules}`);
|
|
45
|
+
expect(true).toBe(true);
|
|
46
|
+
});
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
beforeEach(async () => {
|
|
51
|
+
tempDir = await mkdtemp(join(tmpdir(), 'probe-chat-mcp-test-'));
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
afterEach(async () => {
|
|
55
|
+
if (tempDir) {
|
|
56
|
+
await rm(tempDir, { recursive: true, force: true });
|
|
57
|
+
}
|
|
58
|
+
// Clean up environment variables
|
|
59
|
+
delete process.env.ENABLE_MCP;
|
|
60
|
+
delete process.env.MCP_CONFIG_PATH;
|
|
61
|
+
delete process.env.ANTHROPIC_API_KEY;
|
|
62
|
+
delete process.env.OPENAI_API_KEY;
|
|
63
|
+
delete process.env.GOOGLE_API_KEY;
|
|
64
|
+
delete process.env.PROBE_NON_INTERACTIVE;
|
|
65
|
+
delete process.env.DEBUG_CHAT;
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
describe('ProbeChat Initialization', () => {
|
|
69
|
+
test('should initialize ProbeChat without MCP by default', async () => {
|
|
70
|
+
process.env.PROBE_NON_INTERACTIVE = '1'; // Suppress logs in tests
|
|
71
|
+
|
|
72
|
+
const chat = new ProbeChat({
|
|
73
|
+
isNonInteractive: true,
|
|
74
|
+
debug: false
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
expect(chat.agent.enableMcp).toBe(false);
|
|
78
|
+
expect(chat.agent.mcpBridge).toBeNull();
|
|
79
|
+
|
|
80
|
+
await chat.cleanup();
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
test('should initialize ProbeChat with MCP enabled via options', async () => {
|
|
84
|
+
process.env.PROBE_NON_INTERACTIVE = '1';
|
|
85
|
+
|
|
86
|
+
const chat = new ProbeChat({
|
|
87
|
+
enableMcp: true,
|
|
88
|
+
isNonInteractive: true,
|
|
89
|
+
debug: false
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
expect(chat.agent.enableMcp).toBe(true);
|
|
93
|
+
|
|
94
|
+
await chat.cleanup();
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
test('should initialize ProbeChat with MCP enabled via environment', async () => {
|
|
98
|
+
process.env.ENABLE_MCP = '1';
|
|
99
|
+
process.env.PROBE_NON_INTERACTIVE = '1';
|
|
100
|
+
|
|
101
|
+
const chat = new ProbeChat({
|
|
102
|
+
isNonInteractive: true,
|
|
103
|
+
debug: false
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
expect(chat.agent.enableMcp).toBe(true);
|
|
107
|
+
|
|
108
|
+
await chat.cleanup();
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
test('should pass MCP server configurations to ProbeAgent', async () => {
|
|
112
|
+
process.env.PROBE_NON_INTERACTIVE = '1';
|
|
113
|
+
|
|
114
|
+
const mcpServers = [
|
|
115
|
+
{
|
|
116
|
+
name: 'test-server',
|
|
117
|
+
command: 'node',
|
|
118
|
+
args: ['test.js']
|
|
119
|
+
}
|
|
120
|
+
];
|
|
121
|
+
|
|
122
|
+
const chat = new ProbeChat({
|
|
123
|
+
enableMcp: true,
|
|
124
|
+
mcpServers: mcpServers,
|
|
125
|
+
isNonInteractive: true,
|
|
126
|
+
debug: false
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
expect(chat.agent.enableMcp).toBe(true);
|
|
130
|
+
expect(chat.agent.mcpServers).toEqual(mcpServers);
|
|
131
|
+
|
|
132
|
+
await chat.cleanup();
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
describe('ProbeChat API Integration', () => {
|
|
137
|
+
test('should maintain ProbeChat API compatibility', async () => {
|
|
138
|
+
process.env.PROBE_NON_INTERACTIVE = '1';
|
|
139
|
+
process.env.ANTHROPIC_API_KEY = 'test-key';
|
|
140
|
+
|
|
141
|
+
const chat = new ProbeChat({
|
|
142
|
+
enableMcp: true,
|
|
143
|
+
isNonInteractive: true,
|
|
144
|
+
debug: false
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
// Verify all expected methods exist
|
|
148
|
+
expect(typeof chat.chat).toBe('function');
|
|
149
|
+
expect(typeof chat.getSessionId).toBe('function');
|
|
150
|
+
expect(typeof chat.getUsageSummary).toBe('function');
|
|
151
|
+
expect(typeof chat.clearHistory).toBe('function');
|
|
152
|
+
expect(typeof chat.exportHistory).toBe('function');
|
|
153
|
+
expect(typeof chat.saveHistory).toBe('function');
|
|
154
|
+
expect(typeof chat.cancel).toBe('function');
|
|
155
|
+
expect(typeof chat.cleanup).toBe('function');
|
|
156
|
+
|
|
157
|
+
// Test basic functionality
|
|
158
|
+
expect(chat.getSessionId()).toBeDefined();
|
|
159
|
+
expect(chat.getUsageSummary()).toBeDefined();
|
|
160
|
+
expect(chat.exportHistory()).toEqual([]);
|
|
161
|
+
|
|
162
|
+
chat.clearHistory();
|
|
163
|
+
expect(chat.exportHistory()).toEqual([]);
|
|
164
|
+
|
|
165
|
+
await chat.cleanup();
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
test('should handle image URL extraction', async () => {
|
|
169
|
+
process.env.PROBE_NON_INTERACTIVE = '1';
|
|
170
|
+
|
|
171
|
+
const chat = new ProbeChat({
|
|
172
|
+
isNonInteractive: true,
|
|
173
|
+
debug: false
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
// Test that ProbeChat can be instantiated without errors
|
|
177
|
+
// Image extraction is tested in the ProbeChat source, here we just verify integration
|
|
178
|
+
expect(chat).toBeDefined();
|
|
179
|
+
|
|
180
|
+
await chat.cleanup();
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
describe('Token Usage and Display', () => {
|
|
185
|
+
test('should initialize token usage tracking', async () => {
|
|
186
|
+
process.env.PROBE_NON_INTERACTIVE = '1';
|
|
187
|
+
|
|
188
|
+
const chat = new ProbeChat({
|
|
189
|
+
isNonInteractive: true,
|
|
190
|
+
debug: false
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
expect(chat.tokenUsage).toBeDefined();
|
|
194
|
+
expect(typeof chat.tokenUsage.updateFromTokenCounter).toBe('function');
|
|
195
|
+
expect(typeof chat.tokenUsage.display).toBe('function');
|
|
196
|
+
expect(typeof chat.tokenUsage.clear).toBe('function');
|
|
197
|
+
|
|
198
|
+
await chat.cleanup();
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
test('should handle telemetry configuration', async () => {
|
|
202
|
+
process.env.PROBE_NON_INTERACTIVE = '1';
|
|
203
|
+
|
|
204
|
+
const chat = new ProbeChat({
|
|
205
|
+
isNonInteractive: true,
|
|
206
|
+
debug: false
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
expect(chat.telemetryConfig).toBeDefined();
|
|
210
|
+
|
|
211
|
+
await chat.cleanup();
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
describe('History Management', () => {
|
|
216
|
+
test('should save and load conversation history', async () => {
|
|
217
|
+
process.env.PROBE_NON_INTERACTIVE = '1';
|
|
218
|
+
|
|
219
|
+
const chat = new ProbeChat({
|
|
220
|
+
isNonInteractive: true,
|
|
221
|
+
debug: false
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
// Test history export/import
|
|
225
|
+
const initialHistory = chat.exportHistory();
|
|
226
|
+
expect(Array.isArray(initialHistory)).toBe(true);
|
|
227
|
+
|
|
228
|
+
// Test history saving (filename generation)
|
|
229
|
+
const filename = join(tempDir, 'test-history.json');
|
|
230
|
+
const savedFile = chat.saveHistory(filename);
|
|
231
|
+
expect(savedFile).toBe(filename);
|
|
232
|
+
|
|
233
|
+
await chat.cleanup();
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
test('should generate automatic history filenames', async () => {
|
|
237
|
+
process.env.PROBE_NON_INTERACTIVE = '1';
|
|
238
|
+
|
|
239
|
+
const chat = new ProbeChat({
|
|
240
|
+
isNonInteractive: true,
|
|
241
|
+
debug: false
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
// Test automatic filename generation
|
|
245
|
+
const sessionId = chat.getSessionId();
|
|
246
|
+
const filename = chat.saveHistory();
|
|
247
|
+
|
|
248
|
+
expect(filename).toContain(sessionId);
|
|
249
|
+
expect(filename).toContain('.json');
|
|
250
|
+
|
|
251
|
+
await chat.cleanup();
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
describe('Mock Server Integration', () => {
|
|
256
|
+
test('should work with mock MCP server configuration', async () => {
|
|
257
|
+
// Create MCP configuration with mock server
|
|
258
|
+
const mcpConfig = {
|
|
259
|
+
mcpServers: {
|
|
260
|
+
'mock-chat-test': {
|
|
261
|
+
command: 'node',
|
|
262
|
+
args: [join(__dirname, '../mcp/mockMcpServer.js')],
|
|
263
|
+
transport: 'stdio',
|
|
264
|
+
enabled: true
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
};
|
|
268
|
+
|
|
269
|
+
const configPath = join(tempDir, 'chat-mcp-config.json');
|
|
270
|
+
await writeFile(configPath, JSON.stringify(mcpConfig, null, 2));
|
|
271
|
+
|
|
272
|
+
process.env.MCP_CONFIG_PATH = configPath;
|
|
273
|
+
process.env.PROBE_NON_INTERACTIVE = '1';
|
|
274
|
+
process.env.ANTHROPIC_API_KEY = 'test-key';
|
|
275
|
+
|
|
276
|
+
const chat = new ProbeChat({
|
|
277
|
+
enableMcp: true,
|
|
278
|
+
isNonInteractive: true,
|
|
279
|
+
debug: true
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
// Wait for MCP initialization
|
|
283
|
+
await new Promise(resolve => setTimeout(resolve, 3000));
|
|
284
|
+
|
|
285
|
+
// Verify MCP integration is working
|
|
286
|
+
expect(chat.agent.enableMcp).toBe(true);
|
|
287
|
+
|
|
288
|
+
if (chat.agent.mcpBridge && chat.agent.mcpBridge.getToolNames().length > 0) {
|
|
289
|
+
const toolNames = chat.agent.mcpBridge.getToolNames();
|
|
290
|
+
console.log('ProbeChat successfully connected to mock server with tools:', toolNames);
|
|
291
|
+
|
|
292
|
+
// Verify expected tools
|
|
293
|
+
expect(toolNames.some(name => name.includes('foobar'))).toBe(true);
|
|
294
|
+
expect(toolNames.some(name => name.includes('calculator'))).toBe(true);
|
|
295
|
+
} else {
|
|
296
|
+
console.warn('Mock server connection failed in ProbeChat - may be expected in test environment');
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
await chat.cleanup();
|
|
300
|
+
}, 20000); // Extended timeout for server startup
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
describe('Error Handling', () => {
|
|
304
|
+
test('should handle MCP initialization errors gracefully', async () => {
|
|
305
|
+
// Create invalid MCP configuration
|
|
306
|
+
const mcpConfig = {
|
|
307
|
+
mcpServers: {
|
|
308
|
+
'invalid-chat-server': {
|
|
309
|
+
command: 'nonexistent-command',
|
|
310
|
+
args: ['--invalid'],
|
|
311
|
+
transport: 'stdio',
|
|
312
|
+
enabled: true
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
};
|
|
316
|
+
|
|
317
|
+
const configPath = join(tempDir, 'invalid-chat-config.json');
|
|
318
|
+
await writeFile(configPath, JSON.stringify(mcpConfig, null, 2));
|
|
319
|
+
|
|
320
|
+
process.env.MCP_CONFIG_PATH = configPath;
|
|
321
|
+
process.env.PROBE_NON_INTERACTIVE = '1';
|
|
322
|
+
|
|
323
|
+
// Should not crash during initialization
|
|
324
|
+
const chat = new ProbeChat({
|
|
325
|
+
enableMcp: true,
|
|
326
|
+
isNonInteractive: true,
|
|
327
|
+
debug: false
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
// Wait for initialization attempt
|
|
331
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
332
|
+
|
|
333
|
+
expect(chat).toBeDefined();
|
|
334
|
+
expect(chat.agent.enableMcp).toBe(true);
|
|
335
|
+
// MCP bridge should be null due to failed connection
|
|
336
|
+
expect(chat.agent.mcpBridge).toBeNull();
|
|
337
|
+
|
|
338
|
+
await chat.cleanup();
|
|
339
|
+
}, 10000);
|
|
340
|
+
|
|
341
|
+
test('should handle cleanup errors gracefully', async () => {
|
|
342
|
+
process.env.PROBE_NON_INTERACTIVE = '1';
|
|
343
|
+
|
|
344
|
+
const chat = new ProbeChat({
|
|
345
|
+
enableMcp: true,
|
|
346
|
+
isNonInteractive: true,
|
|
347
|
+
debug: false
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
// Mock the agent cleanup to throw an error
|
|
351
|
+
const originalCleanup = chat.agent.cleanup;
|
|
352
|
+
chat.agent.cleanup = jest.fn().mockRejectedValue(new Error('Cleanup failed'));
|
|
353
|
+
|
|
354
|
+
// Should not throw even if underlying cleanup fails
|
|
355
|
+
await expect(chat.cleanup()).resolves.not.toThrow();
|
|
356
|
+
|
|
357
|
+
// Restore original cleanup
|
|
358
|
+
chat.agent.cleanup = originalCleanup;
|
|
359
|
+
await chat.cleanup();
|
|
360
|
+
});
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
describe('Environment Variable Handling', () => {
|
|
364
|
+
test('should respect ENABLE_MCP environment variable', async () => {
|
|
365
|
+
process.env.ENABLE_MCP = '1';
|
|
366
|
+
process.env.PROBE_NON_INTERACTIVE = '1';
|
|
367
|
+
process.env.DEBUG_CHAT = '1';
|
|
368
|
+
|
|
369
|
+
const chat = new ProbeChat({
|
|
370
|
+
isNonInteractive: true
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
expect(chat.agent.enableMcp).toBe(true);
|
|
374
|
+
expect(chat.debug).toBe(true);
|
|
375
|
+
|
|
376
|
+
await chat.cleanup();
|
|
377
|
+
});
|
|
378
|
+
|
|
379
|
+
test('should respect DEBUG_CHAT environment variable', async () => {
|
|
380
|
+
process.env.DEBUG_CHAT = '1';
|
|
381
|
+
process.env.PROBE_NON_INTERACTIVE = '1';
|
|
382
|
+
|
|
383
|
+
const chat = new ProbeChat({
|
|
384
|
+
isNonInteractive: true
|
|
385
|
+
});
|
|
386
|
+
|
|
387
|
+
expect(chat.debug).toBe(true);
|
|
388
|
+
|
|
389
|
+
await chat.cleanup();
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
test('should handle non-interactive mode properly', async () => {
|
|
393
|
+
process.env.PROBE_NON_INTERACTIVE = '1';
|
|
394
|
+
|
|
395
|
+
const chat = new ProbeChat();
|
|
396
|
+
|
|
397
|
+
expect(chat.isNonInteractive).toBe(true);
|
|
398
|
+
|
|
399
|
+
await chat.cleanup();
|
|
400
|
+
});
|
|
401
|
+
});
|
|
402
|
+
});
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration tests for MCP Server .env file loading
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { jest } from '@jest/globals';
|
|
6
|
+
import { spawn } from 'child_process';
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
import { mkdtemp, writeFile, rm } from 'fs/promises';
|
|
9
|
+
import { tmpdir } from 'os';
|
|
10
|
+
import { fileURLToPath } from 'url';
|
|
11
|
+
import { dirname } from 'path';
|
|
12
|
+
|
|
13
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
14
|
+
const __dirname = dirname(__filename);
|
|
15
|
+
|
|
16
|
+
describe('MCP Server .env Support', () => {
|
|
17
|
+
let tempDir;
|
|
18
|
+
|
|
19
|
+
beforeEach(async () => {
|
|
20
|
+
tempDir = await mkdtemp(join(tmpdir(), 'mcp-dotenv-test-'));
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
afterEach(async () => {
|
|
24
|
+
if (tempDir) {
|
|
25
|
+
await rm(tempDir, { recursive: true, force: true });
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test('should load environment variables from .env file', async () => {
|
|
30
|
+
// Create a .env file in the temp directory
|
|
31
|
+
const envContent = `
|
|
32
|
+
TEST_VAR=from_dotenv
|
|
33
|
+
PROBE_PATH=/custom/probe/path
|
|
34
|
+
DEBUG=true
|
|
35
|
+
`.trim();
|
|
36
|
+
|
|
37
|
+
await writeFile(join(tempDir, '.env'), envContent);
|
|
38
|
+
|
|
39
|
+
// Test using dotenv directly (simulating what MCP server does)
|
|
40
|
+
const dotenv = await import('dotenv');
|
|
41
|
+
const result = dotenv.config({ path: join(tempDir, '.env') });
|
|
42
|
+
|
|
43
|
+
expect(result.error).toBeUndefined();
|
|
44
|
+
expect(result.parsed).toEqual({
|
|
45
|
+
TEST_VAR: 'from_dotenv',
|
|
46
|
+
PROBE_PATH: '/custom/probe/path',
|
|
47
|
+
DEBUG: 'true'
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
test('should not fail if .env file does not exist', async () => {
|
|
52
|
+
// Test using dotenv with non-existent file (simulating what MCP server does)
|
|
53
|
+
const dotenv = await import('dotenv');
|
|
54
|
+
const result = dotenv.config({ path: join(tempDir, '.env') });
|
|
55
|
+
|
|
56
|
+
// dotenv.config() should not throw when file doesn't exist
|
|
57
|
+
// It returns an error object but doesn't throw
|
|
58
|
+
expect(result.error).toBeDefined();
|
|
59
|
+
expect(result.error.code).toBe('ENOENT');
|
|
60
|
+
// When there's an error, parsed is an empty object
|
|
61
|
+
expect(result.parsed).toEqual({});
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
test('should prioritize existing environment variables over .env', async () => {
|
|
65
|
+
// Create a .env file
|
|
66
|
+
const envContent = `
|
|
67
|
+
TEST_PRIORITY=from_dotenv
|
|
68
|
+
`.trim();
|
|
69
|
+
|
|
70
|
+
await writeFile(join(tempDir, '.env'), envContent);
|
|
71
|
+
|
|
72
|
+
// Set an environment variable
|
|
73
|
+
const originalValue = process.env.TEST_PRIORITY;
|
|
74
|
+
process.env.TEST_PRIORITY = 'from_environment';
|
|
75
|
+
|
|
76
|
+
try {
|
|
77
|
+
// Test using dotenv
|
|
78
|
+
const dotenv = await import('dotenv');
|
|
79
|
+
const result = dotenv.config({ path: join(tempDir, '.env') });
|
|
80
|
+
|
|
81
|
+
expect(result.error).toBeUndefined();
|
|
82
|
+
// dotenv by default does not override existing env vars
|
|
83
|
+
expect(process.env.TEST_PRIORITY).toBe('from_environment');
|
|
84
|
+
} finally {
|
|
85
|
+
// Clean up
|
|
86
|
+
if (originalValue !== undefined) {
|
|
87
|
+
process.env.TEST_PRIORITY = originalValue;
|
|
88
|
+
} else {
|
|
89
|
+
delete process.env.TEST_PRIORITY;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
test('MCP server should have dotenv loaded at startup', async () => {
|
|
95
|
+
// This test verifies that the MCP server index.ts has dotenv import
|
|
96
|
+
const { readFile } = await import('fs/promises');
|
|
97
|
+
const mcpIndexPath = join(__dirname, '..', '..', 'src', 'mcp', 'index.ts');
|
|
98
|
+
|
|
99
|
+
const content = await readFile(mcpIndexPath, 'utf8');
|
|
100
|
+
|
|
101
|
+
// Check that dotenv is imported
|
|
102
|
+
expect(content).toContain("import { config } from 'dotenv'");
|
|
103
|
+
|
|
104
|
+
// Check that config() is called
|
|
105
|
+
expect(content).toContain('config()');
|
|
106
|
+
|
|
107
|
+
// Check that the dotenv import is near the top (before other imports)
|
|
108
|
+
const lines = content.split('\n');
|
|
109
|
+
const dotenvImportLine = lines.findIndex(line => line.includes("import { config } from 'dotenv'"));
|
|
110
|
+
const configCallLine = lines.findIndex(line => line.includes('config()'));
|
|
111
|
+
const firstRegularImport = lines.findIndex(line =>
|
|
112
|
+
line.includes('import') &&
|
|
113
|
+
!line.includes('dotenv') &&
|
|
114
|
+
!line.includes('#!/usr/bin/env node')
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
// dotenv should be imported and called before other imports
|
|
118
|
+
expect(dotenvImportLine).toBeGreaterThan(-1);
|
|
119
|
+
expect(configCallLine).toBeGreaterThan(-1);
|
|
120
|
+
expect(dotenvImportLine).toBeLessThan(firstRegularImport);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
test('ProbeAgent should have dotenv loaded at startup', async () => {
|
|
124
|
+
// This test verifies that ProbeAgent.js has dotenv import
|
|
125
|
+
const { readFile } = await import('fs/promises');
|
|
126
|
+
const probeAgentPath = join(__dirname, '..', '..', 'src', 'agent', 'ProbeAgent.js');
|
|
127
|
+
|
|
128
|
+
const content = await readFile(probeAgentPath, 'utf8');
|
|
129
|
+
|
|
130
|
+
// Check that dotenv is imported
|
|
131
|
+
expect(content).toContain("import dotenv from 'dotenv'");
|
|
132
|
+
|
|
133
|
+
// Check that config() is called
|
|
134
|
+
expect(content).toContain('dotenv.config()');
|
|
135
|
+
|
|
136
|
+
// Check that the dotenv import is near the top (before other imports)
|
|
137
|
+
const lines = content.split('\n');
|
|
138
|
+
const dotenvImportLine = lines.findIndex(line => line.includes("import dotenv from 'dotenv'"));
|
|
139
|
+
const configCallLine = lines.findIndex(line => line.includes('dotenv.config()'));
|
|
140
|
+
|
|
141
|
+
// dotenv should be imported and called at the top
|
|
142
|
+
expect(dotenvImportLine).toBeGreaterThan(-1);
|
|
143
|
+
expect(configCallLine).toBeGreaterThan(-1);
|
|
144
|
+
expect(dotenvImportLine).toBeLessThan(10); // Should be in first 10 lines
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
test('Main package index should have dotenv loaded at startup', async () => {
|
|
148
|
+
// This test verifies that index.js has dotenv import
|
|
149
|
+
const { readFile } = await import('fs/promises');
|
|
150
|
+
const indexPath = join(__dirname, '..', '..', 'src', 'index.js');
|
|
151
|
+
|
|
152
|
+
const content = await readFile(indexPath, 'utf8');
|
|
153
|
+
|
|
154
|
+
// Check that dotenv is imported
|
|
155
|
+
expect(content).toContain("import dotenv from 'dotenv'");
|
|
156
|
+
|
|
157
|
+
// Check that config() is called
|
|
158
|
+
expect(content).toContain('dotenv.config()');
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
test('Agent CLI index should have dotenv loaded at startup', async () => {
|
|
162
|
+
// This test verifies that agent/index.js has dotenv import
|
|
163
|
+
const { readFile } = await import('fs/promises');
|
|
164
|
+
const agentIndexPath = join(__dirname, '..', '..', 'src', 'agent', 'index.js');
|
|
165
|
+
|
|
166
|
+
const content = await readFile(agentIndexPath, 'utf8');
|
|
167
|
+
|
|
168
|
+
// Check that dotenv is imported
|
|
169
|
+
expect(content).toContain("import dotenv from 'dotenv'");
|
|
170
|
+
|
|
171
|
+
// Check that config() is called
|
|
172
|
+
expect(content).toContain('dotenv.config()');
|
|
173
|
+
});
|
|
174
|
+
});
|