@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,568 @@
|
|
|
1
|
+
use roxmltree::{Document, Node};
|
|
2
|
+
use std::fs::{self, File};
|
|
3
|
+
use std::io::Write;
|
|
4
|
+
use std::path::PathBuf;
|
|
5
|
+
use std::process::Command;
|
|
6
|
+
use tempfile::TempDir;
|
|
7
|
+
|
|
8
|
+
// Helper function to extract XML from command output
|
|
9
|
+
fn extract_xml_from_output(output: &str) -> &str {
|
|
10
|
+
// Find the first occurrence of '<?xml'
|
|
11
|
+
if let Some(start_index) = output.find("<?xml") {
|
|
12
|
+
// Return the substring from the first '<?xml' to the end
|
|
13
|
+
&output[start_index..]
|
|
14
|
+
} else {
|
|
15
|
+
// If no '<?xml' is found, return the original string
|
|
16
|
+
output
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// Helper function to create test files
|
|
21
|
+
fn create_test_file(dir: &TempDir, filename: &str, content: &str) -> PathBuf {
|
|
22
|
+
let file_path = dir.path().join(filename);
|
|
23
|
+
let parent_dir = file_path.parent().unwrap();
|
|
24
|
+
fs::create_dir_all(parent_dir).expect("Failed to create parent directories");
|
|
25
|
+
let mut file = File::create(&file_path).expect("Failed to create test file");
|
|
26
|
+
file.write_all(content.as_bytes())
|
|
27
|
+
.expect("Failed to write test content");
|
|
28
|
+
file_path
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Helper function to create a test directory structure with various test files
|
|
32
|
+
fn create_test_directory_structure(root_dir: &TempDir) {
|
|
33
|
+
// Create a source directory
|
|
34
|
+
let src_dir = root_dir.path().join("src");
|
|
35
|
+
fs::create_dir(&src_dir).expect("Failed to create src directory");
|
|
36
|
+
|
|
37
|
+
// Create Rust files with search terms
|
|
38
|
+
let rust_content = r#"
|
|
39
|
+
// This is a Rust file with a search term
|
|
40
|
+
fn search_function(query: &str) -> bool {
|
|
41
|
+
println!("Searching for: {}", query);
|
|
42
|
+
query.contains("search")
|
|
43
|
+
}
|
|
44
|
+
"#;
|
|
45
|
+
create_test_file(root_dir, "src/search.rs", rust_content);
|
|
46
|
+
|
|
47
|
+
// Create a JavaScript file with search terms
|
|
48
|
+
let js_content = r#"
|
|
49
|
+
// This is a JavaScript file with a search term
|
|
50
|
+
function searchFunction(query) {
|
|
51
|
+
console.log(`Searching for: ${query}`);
|
|
52
|
+
return query.includes('search');
|
|
53
|
+
}
|
|
54
|
+
"#;
|
|
55
|
+
create_test_file(root_dir, "src/search.js", js_content);
|
|
56
|
+
|
|
57
|
+
// Create a file with special characters
|
|
58
|
+
let special_chars_content = r#"
|
|
59
|
+
// This file contains special characters: "quotes", 'apostrophes', <tags>, &ersands
|
|
60
|
+
function escapeTest(input) {
|
|
61
|
+
return input.replace(/[<>&"']/g, function(c) {
|
|
62
|
+
return {
|
|
63
|
+
'<': '<',
|
|
64
|
+
'>': '>',
|
|
65
|
+
'&': '&',
|
|
66
|
+
'"': '"',
|
|
67
|
+
"'": '''
|
|
68
|
+
}[c];
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
"#;
|
|
72
|
+
create_test_file(root_dir, "src/special_chars.js", special_chars_content);
|
|
73
|
+
|
|
74
|
+
// Create a file with multiple search terms
|
|
75
|
+
let multi_term_content = r#"
|
|
76
|
+
// This file contains multiple search terms
|
|
77
|
+
function processQuery(query) {
|
|
78
|
+
// Check if the query contains multiple terms
|
|
79
|
+
const terms = query.split(' ');
|
|
80
|
+
|
|
81
|
+
// Process each term
|
|
82
|
+
return terms.map(term => {
|
|
83
|
+
return {
|
|
84
|
+
term: term,
|
|
85
|
+
isValid: validateTerm(term)
|
|
86
|
+
};
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function validateTerm(term) {
|
|
91
|
+
// Validate that the term is not empty and contains only allowed characters
|
|
92
|
+
return term.length > 0 && /^[a-zA-Z0-9_-]+$/.test(term);
|
|
93
|
+
}
|
|
94
|
+
"#;
|
|
95
|
+
create_test_file(root_dir, "src/multi_term.js", multi_term_content);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
#[test]
|
|
99
|
+
fn test_xml_output_format_basic() {
|
|
100
|
+
let temp_dir = TempDir::new().expect("Failed to create temp dir");
|
|
101
|
+
create_test_directory_structure(&temp_dir);
|
|
102
|
+
|
|
103
|
+
// Run the CLI with XML output format
|
|
104
|
+
let output = Command::new("cargo")
|
|
105
|
+
.args([
|
|
106
|
+
"run",
|
|
107
|
+
"--",
|
|
108
|
+
"search",
|
|
109
|
+
"search", // Pattern to search for
|
|
110
|
+
temp_dir.path().to_str().unwrap(),
|
|
111
|
+
"--format",
|
|
112
|
+
"xml",
|
|
113
|
+
])
|
|
114
|
+
.output()
|
|
115
|
+
.expect("Failed to execute command");
|
|
116
|
+
|
|
117
|
+
// Check that the command succeeded
|
|
118
|
+
assert!(output.status.success());
|
|
119
|
+
|
|
120
|
+
// Convert stdout to string
|
|
121
|
+
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
122
|
+
|
|
123
|
+
// Extract the XML part from the output
|
|
124
|
+
let xml_str = extract_xml_from_output(&stdout);
|
|
125
|
+
|
|
126
|
+
// Parse the XML output
|
|
127
|
+
let doc = Document::parse(xml_str).expect("Failed to parse XML output");
|
|
128
|
+
let root = doc.root_element();
|
|
129
|
+
|
|
130
|
+
// Validate the structure of the XML output
|
|
131
|
+
assert_eq!(
|
|
132
|
+
root.tag_name().name(),
|
|
133
|
+
"probe_results",
|
|
134
|
+
"Root element should be 'probe_results'"
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
// Validate that there are result elements
|
|
138
|
+
let results: Vec<Node> = root
|
|
139
|
+
.children()
|
|
140
|
+
.filter(|n| n.is_element() && n.tag_name().name() == "result")
|
|
141
|
+
.collect();
|
|
142
|
+
assert!(
|
|
143
|
+
!results.is_empty(),
|
|
144
|
+
"Should have at least one result element"
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
// Validate the summary element
|
|
148
|
+
let summary = root
|
|
149
|
+
.children()
|
|
150
|
+
.find(|n| n.is_element() && n.tag_name().name() == "summary");
|
|
151
|
+
assert!(summary.is_some(), "Should have a summary element");
|
|
152
|
+
|
|
153
|
+
if let Some(summary) = summary {
|
|
154
|
+
// Validate the summary contains count, total_bytes, and total_tokens
|
|
155
|
+
let count = summary
|
|
156
|
+
.children()
|
|
157
|
+
.find(|n| n.is_element() && n.tag_name().name() == "count");
|
|
158
|
+
assert!(count.is_some(), "Summary should have a count element");
|
|
159
|
+
|
|
160
|
+
let total_bytes = summary
|
|
161
|
+
.children()
|
|
162
|
+
.find(|n| n.is_element() && n.tag_name().name() == "total_bytes");
|
|
163
|
+
assert!(
|
|
164
|
+
total_bytes.is_some(),
|
|
165
|
+
"Summary should have a total_bytes element"
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
let total_tokens = summary
|
|
169
|
+
.children()
|
|
170
|
+
.find(|n| n.is_element() && n.tag_name().name() == "total_tokens");
|
|
171
|
+
assert!(
|
|
172
|
+
total_tokens.is_some(),
|
|
173
|
+
"Summary should have a total_tokens element"
|
|
174
|
+
);
|
|
175
|
+
|
|
176
|
+
// Validate the count matches the number of results
|
|
177
|
+
if let Some(count) = count {
|
|
178
|
+
let count_value = count.text().unwrap_or("0").parse::<usize>().unwrap_or(0);
|
|
179
|
+
assert_eq!(
|
|
180
|
+
count_value,
|
|
181
|
+
results.len(),
|
|
182
|
+
"Count should match the number of results"
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Validate the structure of each result
|
|
188
|
+
for result in results {
|
|
189
|
+
// Check for required elements
|
|
190
|
+
let file = result
|
|
191
|
+
.children()
|
|
192
|
+
.find(|n| n.is_element() && n.tag_name().name() == "file");
|
|
193
|
+
assert!(file.is_some(), "Each result should have a file element");
|
|
194
|
+
|
|
195
|
+
let lines = result
|
|
196
|
+
.children()
|
|
197
|
+
.find(|n| n.is_element() && n.tag_name().name() == "lines");
|
|
198
|
+
assert!(lines.is_some(), "Each result should have a lines element");
|
|
199
|
+
|
|
200
|
+
let node_type = result
|
|
201
|
+
.children()
|
|
202
|
+
.find(|n| n.is_element() && n.tag_name().name() == "node_type");
|
|
203
|
+
assert!(
|
|
204
|
+
node_type.is_some(),
|
|
205
|
+
"Each result should have a node_type element"
|
|
206
|
+
);
|
|
207
|
+
|
|
208
|
+
let code = result
|
|
209
|
+
.children()
|
|
210
|
+
.find(|n| n.is_element() && n.tag_name().name() == "code");
|
|
211
|
+
assert!(code.is_some(), "Each result should have a code element");
|
|
212
|
+
|
|
213
|
+
// Validate that code element contains CDATA
|
|
214
|
+
if let Some(code) = code {
|
|
215
|
+
let code_text = code.text();
|
|
216
|
+
assert!(code_text.is_some(), "Code element should have text content");
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
#[test]
|
|
222
|
+
fn test_xml_output_with_special_characters() {
|
|
223
|
+
let temp_dir = TempDir::new().expect("Failed to create temp dir");
|
|
224
|
+
create_test_directory_structure(&temp_dir);
|
|
225
|
+
|
|
226
|
+
// Run the CLI with XML output format, searching for special characters
|
|
227
|
+
let output = Command::new("cargo")
|
|
228
|
+
.args([
|
|
229
|
+
"run",
|
|
230
|
+
"--",
|
|
231
|
+
"search",
|
|
232
|
+
"special", // Pattern to search for
|
|
233
|
+
temp_dir.path().to_str().unwrap(),
|
|
234
|
+
"--format",
|
|
235
|
+
"xml",
|
|
236
|
+
])
|
|
237
|
+
.output()
|
|
238
|
+
.expect("Failed to execute command");
|
|
239
|
+
|
|
240
|
+
// Check that the command succeeded
|
|
241
|
+
assert!(output.status.success());
|
|
242
|
+
|
|
243
|
+
// Convert stdout to string
|
|
244
|
+
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
245
|
+
|
|
246
|
+
// Extract the XML part from the output
|
|
247
|
+
let xml_str = extract_xml_from_output(&stdout);
|
|
248
|
+
|
|
249
|
+
// Parse the XML output
|
|
250
|
+
let doc = Document::parse(xml_str).expect("Failed to parse XML output");
|
|
251
|
+
let root = doc.root_element();
|
|
252
|
+
|
|
253
|
+
// Find the result with special characters
|
|
254
|
+
let results: Vec<Node> = root
|
|
255
|
+
.children()
|
|
256
|
+
.filter(|n| n.is_element() && n.tag_name().name() == "result")
|
|
257
|
+
.collect();
|
|
258
|
+
let special_chars_result = results.iter().find(|&r| {
|
|
259
|
+
if let Some(file) = r
|
|
260
|
+
.children()
|
|
261
|
+
.find(|n| n.is_element() && n.tag_name().name() == "file")
|
|
262
|
+
{
|
|
263
|
+
if let Some(text) = file.text() {
|
|
264
|
+
return text.contains("special_chars.js");
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
false
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
assert!(
|
|
271
|
+
special_chars_result.is_some(),
|
|
272
|
+
"Should find the special_chars.js file"
|
|
273
|
+
);
|
|
274
|
+
|
|
275
|
+
// Verify that special characters are properly escaped in the XML
|
|
276
|
+
if let Some(result) = special_chars_result {
|
|
277
|
+
if let Some(code) = result
|
|
278
|
+
.children()
|
|
279
|
+
.find(|n| n.is_element() && n.tag_name().name() == "code")
|
|
280
|
+
{
|
|
281
|
+
if let Some(text) = code.text() {
|
|
282
|
+
// The special characters should be preserved in the CDATA section
|
|
283
|
+
assert!(
|
|
284
|
+
text.contains("\"quotes\""),
|
|
285
|
+
"Double quotes should be preserved in CDATA"
|
|
286
|
+
);
|
|
287
|
+
assert!(
|
|
288
|
+
text.contains("'apostrophes'"),
|
|
289
|
+
"Apostrophes should be preserved in CDATA"
|
|
290
|
+
);
|
|
291
|
+
assert!(text.contains("<tags>"), "Tags should be preserved in CDATA");
|
|
292
|
+
assert!(
|
|
293
|
+
text.contains("&ersands"),
|
|
294
|
+
"Ampersands should be preserved in CDATA"
|
|
295
|
+
);
|
|
296
|
+
} else {
|
|
297
|
+
panic!("Code element should have text content");
|
|
298
|
+
}
|
|
299
|
+
} else {
|
|
300
|
+
panic!("Result should have a code element");
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// Check that file path is properly escaped
|
|
304
|
+
if let Some(file) = result
|
|
305
|
+
.children()
|
|
306
|
+
.find(|n| n.is_element() && n.tag_name().name() == "file")
|
|
307
|
+
{
|
|
308
|
+
if let Some(text) = file.text() {
|
|
309
|
+
// The XML should parse correctly, which means special characters in attributes are escaped
|
|
310
|
+
assert!(
|
|
311
|
+
text.contains("special_chars.js"),
|
|
312
|
+
"File path should be correct"
|
|
313
|
+
);
|
|
314
|
+
} else {
|
|
315
|
+
panic!("File element should have text content");
|
|
316
|
+
}
|
|
317
|
+
} else {
|
|
318
|
+
panic!("Result should have a file element");
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
#[test]
|
|
324
|
+
fn test_xml_output_with_multiple_terms() {
|
|
325
|
+
let temp_dir = TempDir::new().expect("Failed to create temp dir");
|
|
326
|
+
create_test_directory_structure(&temp_dir);
|
|
327
|
+
|
|
328
|
+
// Run the CLI with XML output format, searching for multiple terms
|
|
329
|
+
let output = Command::new("cargo")
|
|
330
|
+
.args([
|
|
331
|
+
"run",
|
|
332
|
+
"--",
|
|
333
|
+
"search",
|
|
334
|
+
"term process", // Multiple terms to search for
|
|
335
|
+
temp_dir.path().to_str().unwrap(),
|
|
336
|
+
"--format",
|
|
337
|
+
"xml",
|
|
338
|
+
])
|
|
339
|
+
.output()
|
|
340
|
+
.expect("Failed to execute command");
|
|
341
|
+
|
|
342
|
+
// Check that the command succeeded
|
|
343
|
+
assert!(output.status.success());
|
|
344
|
+
|
|
345
|
+
// Convert stdout to string
|
|
346
|
+
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
347
|
+
|
|
348
|
+
// Extract the XML part from the output
|
|
349
|
+
let xml_str = extract_xml_from_output(&stdout);
|
|
350
|
+
|
|
351
|
+
// Parse the XML output
|
|
352
|
+
let doc = Document::parse(xml_str).expect("Failed to parse XML output");
|
|
353
|
+
let root = doc.root_element();
|
|
354
|
+
|
|
355
|
+
// Find the result with multiple terms
|
|
356
|
+
let results: Vec<Node> = root
|
|
357
|
+
.children()
|
|
358
|
+
.filter(|n| n.is_element() && n.tag_name().name() == "result")
|
|
359
|
+
.collect();
|
|
360
|
+
let multi_term_result = results.iter().find(|&r| {
|
|
361
|
+
if let Some(file) = r
|
|
362
|
+
.children()
|
|
363
|
+
.find(|n| n.is_element() && n.tag_name().name() == "file")
|
|
364
|
+
{
|
|
365
|
+
if let Some(text) = file.text() {
|
|
366
|
+
return text.contains("multi_term.js");
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
false
|
|
370
|
+
});
|
|
371
|
+
|
|
372
|
+
assert!(
|
|
373
|
+
multi_term_result.is_some(),
|
|
374
|
+
"Should find the multi_term.js file"
|
|
375
|
+
);
|
|
376
|
+
|
|
377
|
+
// Check if matched_keywords element contains both search terms
|
|
378
|
+
if let Some(result) = multi_term_result {
|
|
379
|
+
if let Some(matched_keywords) = result
|
|
380
|
+
.children()
|
|
381
|
+
.find(|n| n.is_element() && n.tag_name().name() == "matched_keywords")
|
|
382
|
+
{
|
|
383
|
+
let keywords: Vec<Node> = matched_keywords
|
|
384
|
+
.children()
|
|
385
|
+
.filter(|n| n.is_element() && n.tag_name().name() == "keyword")
|
|
386
|
+
.collect();
|
|
387
|
+
|
|
388
|
+
// Check if both terms are present
|
|
389
|
+
let has_term = keywords.iter().any(|k| {
|
|
390
|
+
if let Some(text) = k.text() {
|
|
391
|
+
text.contains("term")
|
|
392
|
+
} else {
|
|
393
|
+
false
|
|
394
|
+
}
|
|
395
|
+
});
|
|
396
|
+
|
|
397
|
+
let has_process = keywords.iter().any(|k| {
|
|
398
|
+
if let Some(text) = k.text() {
|
|
399
|
+
text.contains("process")
|
|
400
|
+
} else {
|
|
401
|
+
false
|
|
402
|
+
}
|
|
403
|
+
});
|
|
404
|
+
|
|
405
|
+
assert!(has_term, "matched_keywords should contain 'term'");
|
|
406
|
+
assert!(has_process, "matched_keywords should contain 'process'");
|
|
407
|
+
} else {
|
|
408
|
+
panic!("Result should have a matched_keywords element");
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
#[test]
|
|
414
|
+
fn test_xml_output_with_no_results() {
|
|
415
|
+
let temp_dir = TempDir::new().expect("Failed to create temp dir");
|
|
416
|
+
create_test_directory_structure(&temp_dir);
|
|
417
|
+
|
|
418
|
+
// Run the CLI with XML output format, searching for a term that doesn't exist
|
|
419
|
+
let output = Command::new("cargo")
|
|
420
|
+
.args([
|
|
421
|
+
"run",
|
|
422
|
+
"--",
|
|
423
|
+
"search",
|
|
424
|
+
"nonexistentterm", // Term that doesn't exist in any file
|
|
425
|
+
temp_dir.path().to_str().unwrap(),
|
|
426
|
+
"--format",
|
|
427
|
+
"xml",
|
|
428
|
+
])
|
|
429
|
+
.output()
|
|
430
|
+
.expect("Failed to execute command");
|
|
431
|
+
|
|
432
|
+
// Check that the command succeeded
|
|
433
|
+
assert!(output.status.success());
|
|
434
|
+
|
|
435
|
+
// Convert stdout to string
|
|
436
|
+
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
437
|
+
|
|
438
|
+
// Extract the XML part from the output
|
|
439
|
+
let xml_str = extract_xml_from_output(&stdout);
|
|
440
|
+
|
|
441
|
+
// Parse the XML output
|
|
442
|
+
let doc = Document::parse(xml_str).expect("Failed to parse XML output");
|
|
443
|
+
let root = doc.root_element();
|
|
444
|
+
|
|
445
|
+
// Validate the structure of the XML output
|
|
446
|
+
assert_eq!(
|
|
447
|
+
root.tag_name().name(),
|
|
448
|
+
"probe_results",
|
|
449
|
+
"Root element should be 'probe_results'"
|
|
450
|
+
);
|
|
451
|
+
|
|
452
|
+
// Validate that there are no result elements
|
|
453
|
+
let results: Vec<Node> = root
|
|
454
|
+
.children()
|
|
455
|
+
.filter(|n| n.is_element() && n.tag_name().name() == "result")
|
|
456
|
+
.collect();
|
|
457
|
+
assert!(results.is_empty(), "Should have no result elements");
|
|
458
|
+
|
|
459
|
+
// Validate the summary element
|
|
460
|
+
let summary = root
|
|
461
|
+
.children()
|
|
462
|
+
.find(|n| n.is_element() && n.tag_name().name() == "summary");
|
|
463
|
+
assert!(summary.is_some(), "Should have a summary element");
|
|
464
|
+
|
|
465
|
+
if let Some(summary) = summary {
|
|
466
|
+
// Validate the summary contains count, total_bytes, and total_tokens with zero values
|
|
467
|
+
if let Some(count) = summary
|
|
468
|
+
.children()
|
|
469
|
+
.find(|n| n.is_element() && n.tag_name().name() == "count")
|
|
470
|
+
{
|
|
471
|
+
let count_value = count.text().unwrap_or("0").parse::<usize>().unwrap_or(0);
|
|
472
|
+
assert_eq!(count_value, 0, "Count should be 0");
|
|
473
|
+
} else {
|
|
474
|
+
panic!("Summary should have a count element");
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
if let Some(total_bytes) = summary
|
|
478
|
+
.children()
|
|
479
|
+
.find(|n| n.is_element() && n.tag_name().name() == "total_bytes")
|
|
480
|
+
{
|
|
481
|
+
let total_bytes_value = total_bytes
|
|
482
|
+
.text()
|
|
483
|
+
.unwrap_or("0")
|
|
484
|
+
.parse::<usize>()
|
|
485
|
+
.unwrap_or(0);
|
|
486
|
+
assert_eq!(total_bytes_value, 0, "Total bytes should be 0");
|
|
487
|
+
} else {
|
|
488
|
+
panic!("Summary should have a total_bytes element");
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
if let Some(total_tokens) = summary
|
|
492
|
+
.children()
|
|
493
|
+
.find(|n| n.is_element() && n.tag_name().name() == "total_tokens")
|
|
494
|
+
{
|
|
495
|
+
let total_tokens_value = total_tokens
|
|
496
|
+
.text()
|
|
497
|
+
.unwrap_or("0")
|
|
498
|
+
.parse::<usize>()
|
|
499
|
+
.unwrap_or(0);
|
|
500
|
+
assert_eq!(total_tokens_value, 0, "Total tokens should be 0");
|
|
501
|
+
} else {
|
|
502
|
+
panic!("Summary should have a total_tokens element");
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
#[test]
|
|
508
|
+
fn test_xml_output_with_files_only() {
|
|
509
|
+
let temp_dir = TempDir::new().expect("Failed to create temp dir");
|
|
510
|
+
create_test_directory_structure(&temp_dir);
|
|
511
|
+
|
|
512
|
+
// Run the CLI with XML output format and files-only option
|
|
513
|
+
let output = Command::new("cargo")
|
|
514
|
+
.args([
|
|
515
|
+
"run",
|
|
516
|
+
"--",
|
|
517
|
+
"search",
|
|
518
|
+
"search", // Pattern to search for
|
|
519
|
+
temp_dir.path().to_str().unwrap(),
|
|
520
|
+
"--format",
|
|
521
|
+
"xml",
|
|
522
|
+
"--files-only",
|
|
523
|
+
])
|
|
524
|
+
.output()
|
|
525
|
+
.expect("Failed to execute command");
|
|
526
|
+
|
|
527
|
+
// Check that the command succeeded
|
|
528
|
+
assert!(output.status.success());
|
|
529
|
+
|
|
530
|
+
// Convert stdout to string
|
|
531
|
+
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
532
|
+
|
|
533
|
+
// Extract the XML part from the output
|
|
534
|
+
let xml_str = extract_xml_from_output(&stdout);
|
|
535
|
+
|
|
536
|
+
// Parse the XML output
|
|
537
|
+
let doc = Document::parse(xml_str).expect("Failed to parse XML output");
|
|
538
|
+
let root = doc.root_element();
|
|
539
|
+
|
|
540
|
+
// Validate the results
|
|
541
|
+
let results: Vec<Node> = root
|
|
542
|
+
.children()
|
|
543
|
+
.filter(|n| n.is_element() && n.tag_name().name() == "result")
|
|
544
|
+
.collect();
|
|
545
|
+
assert!(
|
|
546
|
+
!results.is_empty(),
|
|
547
|
+
"Should have at least one result element"
|
|
548
|
+
);
|
|
549
|
+
|
|
550
|
+
// Verify that all results have node_type = "file"
|
|
551
|
+
for result in results {
|
|
552
|
+
if let Some(node_type) = result
|
|
553
|
+
.children()
|
|
554
|
+
.find(|n| n.is_element() && n.tag_name().name() == "node_type")
|
|
555
|
+
{
|
|
556
|
+
if let Some(text) = node_type.text() {
|
|
557
|
+
assert_eq!(
|
|
558
|
+
text, "file",
|
|
559
|
+
"With --files-only, all results should have node_type = 'file'"
|
|
560
|
+
);
|
|
561
|
+
} else {
|
|
562
|
+
panic!("node_type element should have text content");
|
|
563
|
+
}
|
|
564
|
+
} else {
|
|
565
|
+
panic!("Result should have a node_type element");
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
}
|