@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,169 @@
|
|
|
1
|
+
use regex::Regex;
|
|
2
|
+
use std::collections::{HashMap, HashSet};
|
|
3
|
+
use std::fs::File;
|
|
4
|
+
use std::io::Write;
|
|
5
|
+
use tempfile::tempdir;
|
|
6
|
+
|
|
7
|
+
// Import the function we want to test
|
|
8
|
+
// Note: We need to make the function public in the actual implementation
|
|
9
|
+
// This is a test-only version of the function
|
|
10
|
+
fn search_file_with_combined_pattern(
|
|
11
|
+
file_path: &std::path::Path,
|
|
12
|
+
combined_regex: ®ex::Regex,
|
|
13
|
+
pattern_to_terms: &[HashSet<usize>],
|
|
14
|
+
) -> anyhow::Result<HashMap<usize, HashSet<usize>>> {
|
|
15
|
+
let mut term_map = HashMap::new();
|
|
16
|
+
|
|
17
|
+
// Read the file content
|
|
18
|
+
let content = std::fs::read_to_string(file_path)?;
|
|
19
|
+
|
|
20
|
+
// Process each line
|
|
21
|
+
for (line_number, line) in content.lines().enumerate() {
|
|
22
|
+
// Skip lines that are too long
|
|
23
|
+
if line.len() > 2000 {
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Find all matches in the line
|
|
28
|
+
for cap in combined_regex.captures_iter(line) {
|
|
29
|
+
// Check all possible pattern groups in this capture
|
|
30
|
+
for i in 1..=pattern_to_terms.len() {
|
|
31
|
+
if cap.get(i).is_some() {
|
|
32
|
+
let pattern_idx = i - 1;
|
|
33
|
+
|
|
34
|
+
// Add matches for all terms associated with this pattern
|
|
35
|
+
for &term_idx in &pattern_to_terms[pattern_idx] {
|
|
36
|
+
term_map
|
|
37
|
+
.entry(term_idx)
|
|
38
|
+
.or_insert_with(HashSet::new)
|
|
39
|
+
.insert(line_number + 1); // Convert to 1-based line numbers
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Note: We removed the break statement here to process all matching groups
|
|
43
|
+
// in a capture, not just the first one. This fixes the search instability issue.
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
Ok(term_map)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
#[test]
|
|
53
|
+
fn test_multiple_capture_groups_in_line() {
|
|
54
|
+
// Create a temporary directory for our test file
|
|
55
|
+
let temp_dir = tempdir().unwrap();
|
|
56
|
+
let file_path = temp_dir.path().join("test_file.txt");
|
|
57
|
+
|
|
58
|
+
// Create a test file with multiple patterns in the same line
|
|
59
|
+
let mut file = File::create(&file_path).unwrap();
|
|
60
|
+
writeln!(file, "This line contains pattern1 and also pattern2").unwrap();
|
|
61
|
+
writeln!(file, "This line only has pattern1").unwrap();
|
|
62
|
+
writeln!(file, "This line only has pattern2").unwrap();
|
|
63
|
+
writeln!(file, "This line has neither pattern").unwrap();
|
|
64
|
+
writeln!(file, "pattern1 pattern2 pattern1 pattern2").unwrap(); // Multiple occurrences
|
|
65
|
+
|
|
66
|
+
// Create patterns and term mappings
|
|
67
|
+
let pattern1 = "pattern1";
|
|
68
|
+
let pattern2 = "pattern2";
|
|
69
|
+
|
|
70
|
+
// Fix the regex pattern by removing the extra closing parenthesis
|
|
71
|
+
let combined_pattern = format!("({pattern1})|({pattern2}))").replace("))", ")");
|
|
72
|
+
let combined_regex = Regex::new(&format!("(?i){combined_pattern}")).unwrap();
|
|
73
|
+
|
|
74
|
+
// Term 0 is associated with pattern1, term 1 is associated with pattern2
|
|
75
|
+
let mut pattern1_terms = HashSet::new();
|
|
76
|
+
pattern1_terms.insert(0);
|
|
77
|
+
|
|
78
|
+
let mut pattern2_terms = HashSet::new();
|
|
79
|
+
pattern2_terms.insert(1);
|
|
80
|
+
|
|
81
|
+
let pattern_to_terms = vec![pattern1_terms, pattern2_terms];
|
|
82
|
+
|
|
83
|
+
// Search the file
|
|
84
|
+
let result =
|
|
85
|
+
search_file_with_combined_pattern(&file_path, &combined_regex, &pattern_to_terms).unwrap();
|
|
86
|
+
|
|
87
|
+
// Verify results
|
|
88
|
+
|
|
89
|
+
// Term 0 (pattern1) should be found in lines 1, 2, and 5
|
|
90
|
+
let term0_lines = result.get(&0).unwrap();
|
|
91
|
+
assert!(term0_lines.contains(&1));
|
|
92
|
+
assert!(term0_lines.contains(&2));
|
|
93
|
+
assert!(!term0_lines.contains(&3));
|
|
94
|
+
assert!(!term0_lines.contains(&4));
|
|
95
|
+
assert!(term0_lines.contains(&5));
|
|
96
|
+
|
|
97
|
+
// Term 1 (pattern2) should be found in lines 1, 3, and 5
|
|
98
|
+
let term1_lines = result.get(&1).unwrap();
|
|
99
|
+
assert!(term1_lines.contains(&1));
|
|
100
|
+
assert!(!term1_lines.contains(&2));
|
|
101
|
+
assert!(term1_lines.contains(&3));
|
|
102
|
+
assert!(!term1_lines.contains(&4));
|
|
103
|
+
assert!(term1_lines.contains(&5));
|
|
104
|
+
|
|
105
|
+
// Line 1 should have both terms
|
|
106
|
+
assert!(term0_lines.contains(&1) && term1_lines.contains(&1));
|
|
107
|
+
|
|
108
|
+
// Line 5 should have both terms (multiple occurrences)
|
|
109
|
+
assert!(term0_lines.contains(&5) && term1_lines.contains(&5));
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
#[test]
|
|
113
|
+
fn test_overlapping_patterns() {
|
|
114
|
+
// Create a temporary directory for our test file
|
|
115
|
+
let temp_dir = tempdir().unwrap();
|
|
116
|
+
let file_path = temp_dir.path().join("test_file.txt");
|
|
117
|
+
|
|
118
|
+
// Create a test file with overlapping patterns
|
|
119
|
+
let mut file = File::create(&file_path).unwrap();
|
|
120
|
+
writeln!(file, "This patternXYZ has overlapping patterns").unwrap();
|
|
121
|
+
writeln!(file, "No overlap here").unwrap();
|
|
122
|
+
writeln!(file, "patternX and patternY separate").unwrap();
|
|
123
|
+
|
|
124
|
+
// Create patterns and term mappings
|
|
125
|
+
// We'll test with non-overlapping patterns to verify the basic functionality
|
|
126
|
+
let pattern1 = "patternX";
|
|
127
|
+
let pattern2 = "patternY"; // Changed from patternXYZ to avoid overlap issues
|
|
128
|
+
|
|
129
|
+
// Fix the regex pattern by removing the extra closing parenthesis
|
|
130
|
+
let combined_pattern = format!("({pattern1})|({pattern2}))").replace("))", ")");
|
|
131
|
+
let combined_regex = Regex::new(&format!("(?i){combined_pattern}")).unwrap();
|
|
132
|
+
|
|
133
|
+
// Term 0 is associated with pattern1, term 1 is associated with pattern2
|
|
134
|
+
let mut pattern1_terms = HashSet::new();
|
|
135
|
+
pattern1_terms.insert(0);
|
|
136
|
+
|
|
137
|
+
let mut pattern2_terms = HashSet::new();
|
|
138
|
+
pattern2_terms.insert(1);
|
|
139
|
+
|
|
140
|
+
let pattern_to_terms = vec![pattern1_terms, pattern2_terms];
|
|
141
|
+
|
|
142
|
+
// Search the file
|
|
143
|
+
let result =
|
|
144
|
+
search_file_with_combined_pattern(&file_path, &combined_regex, &pattern_to_terms).unwrap();
|
|
145
|
+
|
|
146
|
+
// Verify results
|
|
147
|
+
|
|
148
|
+
// Check if term 0 (patternX) exists in the result
|
|
149
|
+
if let Some(term0_lines) = result.get(&0) {
|
|
150
|
+
// Term 0 (patternX) should be found in lines 1 and 3
|
|
151
|
+
assert!(term0_lines.contains(&1)); // Matches "patternX" within "patternXYZ"
|
|
152
|
+
assert!(!term0_lines.contains(&2));
|
|
153
|
+
assert!(term0_lines.contains(&3));
|
|
154
|
+
} else {
|
|
155
|
+
// If term 0 doesn't exist, that's a failure
|
|
156
|
+
panic!("Term 0 (patternX) not found in results");
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Check if term 1 (patternY) exists in the result
|
|
160
|
+
if let Some(term1_lines) = result.get(&1) {
|
|
161
|
+
// Term 1 (patternY) should be found in line 3
|
|
162
|
+
assert!(!term1_lines.contains(&1));
|
|
163
|
+
assert!(!term1_lines.contains(&2));
|
|
164
|
+
assert!(term1_lines.contains(&3));
|
|
165
|
+
} else {
|
|
166
|
+
// With non-overlapping patterns, we should find term 1
|
|
167
|
+
panic!("Term 1 (patternY) not found in results");
|
|
168
|
+
}
|
|
169
|
+
}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
use std::fs;
|
|
2
|
+
use std::path::Path;
|
|
3
|
+
use tempfile::TempDir;
|
|
4
|
+
|
|
5
|
+
use probe_code::search::query::create_query_plan;
|
|
6
|
+
use probe_code::search::{perform_probe, SearchOptions};
|
|
7
|
+
|
|
8
|
+
/// Test negative compound word handling
|
|
9
|
+
#[test]
|
|
10
|
+
fn test_negative_compound_words() {
|
|
11
|
+
// Create a temporary directory for testing
|
|
12
|
+
let temp_dir = TempDir::new().unwrap();
|
|
13
|
+
let temp_path = temp_dir.path();
|
|
14
|
+
|
|
15
|
+
// Create test files
|
|
16
|
+
create_test_files(temp_path);
|
|
17
|
+
|
|
18
|
+
// Test basic negative compound word
|
|
19
|
+
test_basic_negative_compound_word(temp_path);
|
|
20
|
+
|
|
21
|
+
// Test complex query with negative compound word
|
|
22
|
+
test_complex_negative_compound_word(temp_path);
|
|
23
|
+
|
|
24
|
+
// Test excluded terms extraction
|
|
25
|
+
test_excluded_terms_extraction();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/// Create test files with content for negative compound word tests
|
|
29
|
+
fn create_test_files(temp_dir: &Path) {
|
|
30
|
+
// File with "network" and "firewall" separately
|
|
31
|
+
let file1_path = temp_dir.join("network_firewall.go");
|
|
32
|
+
let file1_content = r#"
|
|
33
|
+
package security
|
|
34
|
+
|
|
35
|
+
// NetworkConfig configures the network settings
|
|
36
|
+
type NetworkConfig struct {
|
|
37
|
+
FirewallEnabled bool
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// FirewallRule represents a firewall rule
|
|
41
|
+
type FirewallRule struct {
|
|
42
|
+
Name string
|
|
43
|
+
Action string
|
|
44
|
+
}
|
|
45
|
+
"#;
|
|
46
|
+
|
|
47
|
+
// File with only "network" and "settings"
|
|
48
|
+
let file2_path = temp_dir.join("network_only.go");
|
|
49
|
+
let file2_content = r#"
|
|
50
|
+
package network
|
|
51
|
+
|
|
52
|
+
// NetworkSettings configures the network settings
|
|
53
|
+
type NetworkSettings struct {
|
|
54
|
+
Enabled bool
|
|
55
|
+
Settings string
|
|
56
|
+
}
|
|
57
|
+
"#;
|
|
58
|
+
|
|
59
|
+
// File with "networkfirewall" as a single term
|
|
60
|
+
let file3_path = temp_dir.join("networkfirewall.go");
|
|
61
|
+
let file3_content = r#"
|
|
62
|
+
package security
|
|
63
|
+
|
|
64
|
+
// NetworkFirewall configures the network firewall
|
|
65
|
+
type NetworkFirewall struct {
|
|
66
|
+
Enabled bool
|
|
67
|
+
}
|
|
68
|
+
"#;
|
|
69
|
+
|
|
70
|
+
// Write files to disk
|
|
71
|
+
fs::write(file1_path, file1_content).unwrap();
|
|
72
|
+
fs::write(file2_path, file2_content).unwrap();
|
|
73
|
+
fs::write(file3_path, file3_content).unwrap();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/// Test basic negative compound word: "-networkfirewall"
|
|
77
|
+
fn test_basic_negative_compound_word(temp_path: &Path) {
|
|
78
|
+
println!("\n=== Testing basic negative compound word: -networkfirewall ===");
|
|
79
|
+
|
|
80
|
+
// Enable debug mode
|
|
81
|
+
std::env::set_var("DEBUG", "1");
|
|
82
|
+
|
|
83
|
+
// Create the query
|
|
84
|
+
let query = "-networkfirewall";
|
|
85
|
+
let queries = vec![query.to_string()];
|
|
86
|
+
let custom_ignores: Vec<String> = vec![];
|
|
87
|
+
|
|
88
|
+
// Create SearchOptions
|
|
89
|
+
let options = SearchOptions {
|
|
90
|
+
path: temp_path,
|
|
91
|
+
queries: &queries,
|
|
92
|
+
files_only: false,
|
|
93
|
+
custom_ignores: &custom_ignores,
|
|
94
|
+
exclude_filenames: false,
|
|
95
|
+
language: None,
|
|
96
|
+
reranker: "hybrid",
|
|
97
|
+
frequency_search: true,
|
|
98
|
+
max_results: None,
|
|
99
|
+
max_bytes: None,
|
|
100
|
+
max_tokens: None,
|
|
101
|
+
allow_tests: true,
|
|
102
|
+
no_merge: true,
|
|
103
|
+
merge_threshold: None,
|
|
104
|
+
dry_run: false,
|
|
105
|
+
session: None,
|
|
106
|
+
timeout: 30,
|
|
107
|
+
question: None,
|
|
108
|
+
exact: false,
|
|
109
|
+
no_gitignore: false,
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
// Run the search
|
|
113
|
+
let search_results = perform_probe(&options).unwrap();
|
|
114
|
+
|
|
115
|
+
// Check that we didn't find the file with "networkfirewall" as a single term
|
|
116
|
+
let found_networkfirewall = search_results
|
|
117
|
+
.results
|
|
118
|
+
.iter()
|
|
119
|
+
.any(|r| r.file.contains("networkfirewall.go"));
|
|
120
|
+
assert!(
|
|
121
|
+
!found_networkfirewall,
|
|
122
|
+
"Should NOT find networkfirewall.go with negative compound word"
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
// Check that we didn't find the file with "network" and "firewall" separately
|
|
126
|
+
let found_network_firewall = search_results
|
|
127
|
+
.results
|
|
128
|
+
.iter()
|
|
129
|
+
.any(|r| r.file.contains("network_firewall.go"));
|
|
130
|
+
assert!(
|
|
131
|
+
!found_network_firewall,
|
|
132
|
+
"Should NOT find network_firewall.go with negative compound word"
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
// Check that we didn't find the file with only "network"
|
|
136
|
+
let found_network_only = search_results
|
|
137
|
+
.results
|
|
138
|
+
.iter()
|
|
139
|
+
.any(|r| r.file.contains("network_only.go"));
|
|
140
|
+
assert!(
|
|
141
|
+
!found_network_only,
|
|
142
|
+
"Should NOT find network_only.go with negative compound word"
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/// Test complex query with multiple negative terms: "settings AND -network AND -firewall"
|
|
147
|
+
fn test_complex_negative_compound_word(temp_path: &Path) {
|
|
148
|
+
println!("\n=== Testing complex query with multiple negative terms: settings AND -network AND -firewall ===");
|
|
149
|
+
|
|
150
|
+
// Create the query
|
|
151
|
+
let query = "settings AND -network AND -firewall";
|
|
152
|
+
let queries = vec![query.to_string()];
|
|
153
|
+
let custom_ignores: Vec<String> = vec![];
|
|
154
|
+
|
|
155
|
+
// Create SearchOptions
|
|
156
|
+
let options = SearchOptions {
|
|
157
|
+
path: temp_path,
|
|
158
|
+
queries: &queries,
|
|
159
|
+
files_only: false,
|
|
160
|
+
custom_ignores: &custom_ignores,
|
|
161
|
+
exclude_filenames: false,
|
|
162
|
+
language: None,
|
|
163
|
+
reranker: "hybrid",
|
|
164
|
+
frequency_search: true,
|
|
165
|
+
max_results: None,
|
|
166
|
+
max_bytes: None,
|
|
167
|
+
max_tokens: None,
|
|
168
|
+
allow_tests: true,
|
|
169
|
+
// Use all terms mode
|
|
170
|
+
no_merge: true,
|
|
171
|
+
merge_threshold: None,
|
|
172
|
+
dry_run: false,
|
|
173
|
+
session: None,
|
|
174
|
+
timeout: 30,
|
|
175
|
+
question: None,
|
|
176
|
+
exact: false,
|
|
177
|
+
no_gitignore: false,
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
// Run the search
|
|
181
|
+
let search_results = perform_probe(&options).unwrap();
|
|
182
|
+
|
|
183
|
+
// Check that we found the file with "settings" but not "network" or "firewall"
|
|
184
|
+
let found_network_only = search_results
|
|
185
|
+
.results
|
|
186
|
+
.iter()
|
|
187
|
+
.any(|r| r.file.contains("network_only.go"));
|
|
188
|
+
assert!(
|
|
189
|
+
!found_network_only,
|
|
190
|
+
"Should NOT find network_only.go with 'settings' but excluding 'network'"
|
|
191
|
+
);
|
|
192
|
+
|
|
193
|
+
// Check that we didn't find the file with "networkfirewall" as a single term
|
|
194
|
+
let found_networkfirewall = search_results
|
|
195
|
+
.results
|
|
196
|
+
.iter()
|
|
197
|
+
.any(|r| r.file.contains("networkfirewall.go"));
|
|
198
|
+
assert!(
|
|
199
|
+
!found_networkfirewall,
|
|
200
|
+
"Should NOT find networkfirewall.go with negative terms '-network' and '-firewall'"
|
|
201
|
+
);
|
|
202
|
+
|
|
203
|
+
// Check that we didn't find the file with "network" and "firewall" separately
|
|
204
|
+
let found_network_firewall = search_results
|
|
205
|
+
.results
|
|
206
|
+
.iter()
|
|
207
|
+
.any(|r| r.file.contains("network_firewall.go"));
|
|
208
|
+
assert!(
|
|
209
|
+
!found_network_firewall,
|
|
210
|
+
"Should NOT find network_firewall.go with negative terms '-network' and '-firewall'"
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/// Test excluded terms extraction
|
|
215
|
+
fn test_excluded_terms_extraction() {
|
|
216
|
+
println!("\n=== Testing excluded terms extraction ===");
|
|
217
|
+
|
|
218
|
+
// Create a query plan with a negative compound word
|
|
219
|
+
let query = "-networkfirewall";
|
|
220
|
+
let plan = create_query_plan(query, false).unwrap();
|
|
221
|
+
|
|
222
|
+
// Check that the original term is in the excluded_terms set
|
|
223
|
+
assert!(
|
|
224
|
+
plan.excluded_terms.contains("networkfirewall"),
|
|
225
|
+
"Original term 'networkfirewall' should be in excluded_terms"
|
|
226
|
+
);
|
|
227
|
+
|
|
228
|
+
// For negative terms, we don't apply compound word splitting anymore
|
|
229
|
+
// So we don't expect the compound parts to be in the excluded terms set
|
|
230
|
+
|
|
231
|
+
// Test with a more complex query
|
|
232
|
+
let complex_query = "settings AND -networkfirewall";
|
|
233
|
+
let complex_plan = create_query_plan(complex_query, false).unwrap();
|
|
234
|
+
|
|
235
|
+
// Check that the original term is in the excluded_terms set
|
|
236
|
+
assert!(
|
|
237
|
+
complex_plan.excluded_terms.contains("networkfirewall"),
|
|
238
|
+
"Original term 'networkfirewall' should be in excluded_terms"
|
|
239
|
+
);
|
|
240
|
+
|
|
241
|
+
// For negative terms, we don't apply compound word splitting anymore
|
|
242
|
+
// So we don't expect the compound parts to be in the excluded terms set
|
|
243
|
+
|
|
244
|
+
// Reset debug mode
|
|
245
|
+
std::env::remove_var("DEBUG");
|
|
246
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
use anyhow::Result;
|
|
2
|
+
use std::fs;
|
|
3
|
+
use std::path::PathBuf;
|
|
4
|
+
|
|
5
|
+
#[test]
|
|
6
|
+
fn test_nested_symbol_extraction() -> Result<()> {
|
|
7
|
+
// Create a temporary test file with nested symbols
|
|
8
|
+
let test_content = r#"
|
|
9
|
+
struct ProbeAgentServer {
|
|
10
|
+
client: Client,
|
|
11
|
+
config: Config,
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
impl ProbeAgentServer {
|
|
15
|
+
pub fn new(client: Client, config: Config) -> Self {
|
|
16
|
+
Self { client, config }
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
pub fn setupToolHandlers(&self) {
|
|
20
|
+
// Setup tool handlers
|
|
21
|
+
println!("Setting up tool handlers");
|
|
22
|
+
|
|
23
|
+
// Register search handler
|
|
24
|
+
self.register_handler("search", |params| {
|
|
25
|
+
// Search implementation
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
fn register_handler(&self, name: &str, handler: impl Fn(&str)) {
|
|
30
|
+
// Register handler implementation
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
"#;
|
|
34
|
+
|
|
35
|
+
// Write the test content to a temporary file
|
|
36
|
+
let temp_dir = tempfile::tempdir()?;
|
|
37
|
+
let file_path = temp_dir.path().join("test_nested_symbols.rs");
|
|
38
|
+
fs::write(&file_path, test_content)?;
|
|
39
|
+
|
|
40
|
+
// Test extracting the nested symbol
|
|
41
|
+
let result = extract_nested_symbol(&file_path, "ProbeAgentServer.setupToolHandlers")?;
|
|
42
|
+
|
|
43
|
+
// Verify the result contains the setupToolHandlers method
|
|
44
|
+
assert!(result.contains("pub fn setupToolHandlers"));
|
|
45
|
+
assert!(result.contains("Setting up tool handlers"));
|
|
46
|
+
|
|
47
|
+
// Clean up
|
|
48
|
+
temp_dir.close()?;
|
|
49
|
+
|
|
50
|
+
Ok(())
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Helper function to extract a nested symbol from a file
|
|
54
|
+
fn extract_nested_symbol(path: &PathBuf, symbol: &str) -> Result<String> {
|
|
55
|
+
// Read the file content
|
|
56
|
+
let content = fs::read_to_string(path)?;
|
|
57
|
+
|
|
58
|
+
// Call the symbol finder function
|
|
59
|
+
let result = probe_code::extract::symbol_finder::find_symbol_in_file(
|
|
60
|
+
path, symbol, &content, true, // allow_tests
|
|
61
|
+
0, // context_lines
|
|
62
|
+
)?;
|
|
63
|
+
|
|
64
|
+
Ok(result.code)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
#[test]
|
|
68
|
+
fn test_simple_symbol_extraction() -> Result<()> {
|
|
69
|
+
// Create a temporary test file with a simple symbol
|
|
70
|
+
let test_content = r#"
|
|
71
|
+
struct Config {
|
|
72
|
+
pub path: String,
|
|
73
|
+
pub timeout: u64,
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
impl Config {
|
|
77
|
+
pub fn new(path: String, timeout: u64) -> Self {
|
|
78
|
+
Self { path, timeout }
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
"#;
|
|
82
|
+
|
|
83
|
+
// Write the test content to a temporary file
|
|
84
|
+
let temp_dir = tempfile::tempdir()?;
|
|
85
|
+
let file_path = temp_dir.path().join("test_simple_symbol.rs");
|
|
86
|
+
fs::write(&file_path, test_content)?;
|
|
87
|
+
|
|
88
|
+
// Test extracting a simple symbol
|
|
89
|
+
let result = extract_nested_symbol(&file_path, "Config")?;
|
|
90
|
+
|
|
91
|
+
// Verify the result contains the Config struct
|
|
92
|
+
assert!(result.contains("struct Config"));
|
|
93
|
+
assert!(result.contains("pub path: String"));
|
|
94
|
+
|
|
95
|
+
// Clean up
|
|
96
|
+
temp_dir.close()?;
|
|
97
|
+
|
|
98
|
+
Ok(())
|
|
99
|
+
}
|