@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,569 @@
|
|
|
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 functions
|
|
38
|
+
let rust_content = r#"
|
|
39
|
+
fn hello_world() {
|
|
40
|
+
println!("Hello, world!");
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
fn add(a: i32, b: i32) -> i32 {
|
|
44
|
+
a + b
|
|
45
|
+
}
|
|
46
|
+
"#;
|
|
47
|
+
create_test_file(root_dir, "src/functions.rs", rust_content);
|
|
48
|
+
|
|
49
|
+
// Create a JavaScript file with functions
|
|
50
|
+
let js_content = r#"
|
|
51
|
+
function greet(name) {
|
|
52
|
+
return `Hello, ${name}!`;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const multiply = (a, b) => a * b;
|
|
56
|
+
"#;
|
|
57
|
+
create_test_file(root_dir, "src/functions.js", js_content);
|
|
58
|
+
|
|
59
|
+
// Create a file with special characters
|
|
60
|
+
let special_chars_content = r#"
|
|
61
|
+
// This file contains special characters: "quotes", 'apostrophes', <tags>, &ersands
|
|
62
|
+
function escapeTest(input) {
|
|
63
|
+
return input.replace(/[<>&"']/g, function(c) {
|
|
64
|
+
return {
|
|
65
|
+
'<': '<',
|
|
66
|
+
'>': '>',
|
|
67
|
+
'&': '&',
|
|
68
|
+
'"': '"',
|
|
69
|
+
"'": '''
|
|
70
|
+
}[c];
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
"#;
|
|
74
|
+
create_test_file(root_dir, "src/special_chars.js", special_chars_content);
|
|
75
|
+
|
|
76
|
+
// Create a Python file with functions
|
|
77
|
+
let python_content = r#"
|
|
78
|
+
def calculate_sum(numbers):
|
|
79
|
+
"""Calculate the sum of a list of numbers."""
|
|
80
|
+
return sum(numbers)
|
|
81
|
+
|
|
82
|
+
def process_data(data, callback):
|
|
83
|
+
"""Process data using the provided callback function."""
|
|
84
|
+
return callback(data)
|
|
85
|
+
"#;
|
|
86
|
+
create_test_file(root_dir, "src/functions.py", python_content);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
#[test]
|
|
90
|
+
fn test_query_xml_output_rust_functions() {
|
|
91
|
+
let temp_dir = TempDir::new().expect("Failed to create temp dir");
|
|
92
|
+
create_test_directory_structure(&temp_dir);
|
|
93
|
+
|
|
94
|
+
// Run the CLI with XML output format
|
|
95
|
+
let output = Command::new("cargo")
|
|
96
|
+
.args([
|
|
97
|
+
"run",
|
|
98
|
+
"--",
|
|
99
|
+
"query",
|
|
100
|
+
"fn $NAME($$$PARAMS) $$$BODY", // Pattern to search for Rust functions
|
|
101
|
+
temp_dir.path().to_str().unwrap(),
|
|
102
|
+
"--language",
|
|
103
|
+
"rust",
|
|
104
|
+
"--format",
|
|
105
|
+
"xml",
|
|
106
|
+
])
|
|
107
|
+
.output()
|
|
108
|
+
.expect("Failed to execute command");
|
|
109
|
+
|
|
110
|
+
// Check that the command succeeded
|
|
111
|
+
assert!(output.status.success());
|
|
112
|
+
|
|
113
|
+
// Convert stdout to string
|
|
114
|
+
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
115
|
+
|
|
116
|
+
// Extract the XML part from the output
|
|
117
|
+
let xml_str = extract_xml_from_output(&stdout);
|
|
118
|
+
|
|
119
|
+
// Parse the XML output
|
|
120
|
+
let doc = Document::parse(xml_str).expect("Failed to parse XML output");
|
|
121
|
+
let root = doc.root_element();
|
|
122
|
+
|
|
123
|
+
// Validate the structure of the XML output
|
|
124
|
+
assert_eq!(
|
|
125
|
+
root.tag_name().name(),
|
|
126
|
+
"probe_results",
|
|
127
|
+
"Root element should be 'probe_results'"
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
// Validate that there are result elements
|
|
131
|
+
let matches: Vec<Node> = root
|
|
132
|
+
.children()
|
|
133
|
+
.filter(|n| n.is_element() && n.tag_name().name() == "result")
|
|
134
|
+
.collect();
|
|
135
|
+
assert!(
|
|
136
|
+
!matches.is_empty(),
|
|
137
|
+
"Should have at least one match element"
|
|
138
|
+
);
|
|
139
|
+
assert_eq!(matches.len(), 2, "Should find 2 Rust functions");
|
|
140
|
+
|
|
141
|
+
// Validate the summary element
|
|
142
|
+
let summary = root
|
|
143
|
+
.children()
|
|
144
|
+
.find(|n| n.is_element() && n.tag_name().name() == "summary");
|
|
145
|
+
assert!(summary.is_some(), "Should have a summary element");
|
|
146
|
+
|
|
147
|
+
if let Some(summary) = summary {
|
|
148
|
+
// Validate the summary contains count, total_bytes, and total_tokens
|
|
149
|
+
let count = summary
|
|
150
|
+
.children()
|
|
151
|
+
.find(|n| n.is_element() && n.tag_name().name() == "count");
|
|
152
|
+
assert!(count.is_some(), "Summary should have a count element");
|
|
153
|
+
|
|
154
|
+
let total_bytes = summary
|
|
155
|
+
.children()
|
|
156
|
+
.find(|n| n.is_element() && n.tag_name().name() == "total_bytes");
|
|
157
|
+
assert!(
|
|
158
|
+
total_bytes.is_some(),
|
|
159
|
+
"Summary should have a total_bytes element"
|
|
160
|
+
);
|
|
161
|
+
|
|
162
|
+
let total_tokens = summary
|
|
163
|
+
.children()
|
|
164
|
+
.find(|n| n.is_element() && n.tag_name().name() == "total_tokens");
|
|
165
|
+
assert!(
|
|
166
|
+
total_tokens.is_some(),
|
|
167
|
+
"Summary should have a total_tokens element"
|
|
168
|
+
);
|
|
169
|
+
|
|
170
|
+
// Validate the count matches the number of matches
|
|
171
|
+
if let Some(count) = count {
|
|
172
|
+
let count_value = count.text().unwrap_or("0").parse::<usize>().unwrap_or(0);
|
|
173
|
+
assert_eq!(
|
|
174
|
+
count_value,
|
|
175
|
+
matches.len(),
|
|
176
|
+
"Count should match the number of matches"
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Validate the structure of each match
|
|
182
|
+
for match_node in matches {
|
|
183
|
+
// Check for required elements
|
|
184
|
+
let file = match_node
|
|
185
|
+
.children()
|
|
186
|
+
.find(|n| n.is_element() && n.tag_name().name() == "file");
|
|
187
|
+
assert!(file.is_some(), "Each match should have a file element");
|
|
188
|
+
|
|
189
|
+
let lines = match_node
|
|
190
|
+
.children()
|
|
191
|
+
.find(|n| n.is_element() && n.tag_name().name() == "lines");
|
|
192
|
+
assert!(lines.is_some(), "Each result should have a lines element");
|
|
193
|
+
|
|
194
|
+
let node_type = match_node
|
|
195
|
+
.children()
|
|
196
|
+
.find(|n| n.is_element() && n.tag_name().name() == "node_type");
|
|
197
|
+
assert!(
|
|
198
|
+
node_type.is_some(),
|
|
199
|
+
"Each result should have a node_type element"
|
|
200
|
+
);
|
|
201
|
+
|
|
202
|
+
let column_start = match_node
|
|
203
|
+
.children()
|
|
204
|
+
.find(|n| n.is_element() && n.tag_name().name() == "column_start");
|
|
205
|
+
assert!(
|
|
206
|
+
column_start.is_some(),
|
|
207
|
+
"Each result should have a column_start element"
|
|
208
|
+
);
|
|
209
|
+
|
|
210
|
+
let column_end = match_node
|
|
211
|
+
.children()
|
|
212
|
+
.find(|n| n.is_element() && n.tag_name().name() == "column_end");
|
|
213
|
+
assert!(
|
|
214
|
+
column_end.is_some(),
|
|
215
|
+
"Each result should have a column_end element"
|
|
216
|
+
);
|
|
217
|
+
|
|
218
|
+
let code = match_node
|
|
219
|
+
.children()
|
|
220
|
+
.find(|n| n.is_element() && n.tag_name().name() == "code");
|
|
221
|
+
assert!(code.is_some(), "Each result should have a code element");
|
|
222
|
+
|
|
223
|
+
// Validate that code element contains function code
|
|
224
|
+
if let Some(code) = code {
|
|
225
|
+
let code_content = code.text();
|
|
226
|
+
assert!(
|
|
227
|
+
code_content.is_some(),
|
|
228
|
+
"Code element should have text content"
|
|
229
|
+
);
|
|
230
|
+
assert!(
|
|
231
|
+
code_content.unwrap().starts_with("fn "),
|
|
232
|
+
"Function code should start with 'fn '"
|
|
233
|
+
);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
#[test]
|
|
239
|
+
fn test_query_xml_output_javascript_functions() {
|
|
240
|
+
let temp_dir = TempDir::new().expect("Failed to create temp dir");
|
|
241
|
+
create_test_directory_structure(&temp_dir);
|
|
242
|
+
|
|
243
|
+
// Run the CLI with XML output format
|
|
244
|
+
let output = Command::new("cargo")
|
|
245
|
+
.args([
|
|
246
|
+
"run",
|
|
247
|
+
"--",
|
|
248
|
+
"query",
|
|
249
|
+
"function $NAME($$$PARAMS) $$$BODY", // Pattern to search for JavaScript functions
|
|
250
|
+
temp_dir.path().to_str().unwrap(),
|
|
251
|
+
"--language",
|
|
252
|
+
"javascript",
|
|
253
|
+
"--format",
|
|
254
|
+
"xml",
|
|
255
|
+
])
|
|
256
|
+
.output()
|
|
257
|
+
.expect("Failed to execute command");
|
|
258
|
+
|
|
259
|
+
// Check that the command succeeded
|
|
260
|
+
assert!(output.status.success());
|
|
261
|
+
|
|
262
|
+
// Convert stdout to string
|
|
263
|
+
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
264
|
+
|
|
265
|
+
// Extract the XML part from the output
|
|
266
|
+
let xml_str = extract_xml_from_output(&stdout);
|
|
267
|
+
|
|
268
|
+
// Parse the XML output
|
|
269
|
+
let doc = Document::parse(xml_str).expect("Failed to parse XML output");
|
|
270
|
+
let root = doc.root_element();
|
|
271
|
+
|
|
272
|
+
// Validate that there are result elements
|
|
273
|
+
let matches: Vec<Node> = root
|
|
274
|
+
.children()
|
|
275
|
+
.filter(|n| n.is_element() && n.tag_name().name() == "result")
|
|
276
|
+
.collect();
|
|
277
|
+
assert!(
|
|
278
|
+
!matches.is_empty(),
|
|
279
|
+
"Should have at least one result element"
|
|
280
|
+
);
|
|
281
|
+
|
|
282
|
+
// Check that we found the JavaScript functions
|
|
283
|
+
let has_greet = matches.iter().any(|m| {
|
|
284
|
+
if let Some(code) = m
|
|
285
|
+
.children()
|
|
286
|
+
.find(|n| n.is_element() && n.tag_name().name() == "code")
|
|
287
|
+
{
|
|
288
|
+
if let Some(content) = code.text() {
|
|
289
|
+
return content.contains("greet");
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
false
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
assert!(has_greet, "Should find the 'greet' function");
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
#[test]
|
|
299
|
+
fn test_query_xml_output_with_special_characters() {
|
|
300
|
+
let temp_dir = TempDir::new().expect("Failed to create temp dir");
|
|
301
|
+
create_test_directory_structure(&temp_dir);
|
|
302
|
+
|
|
303
|
+
// Run the CLI with XML output format, searching for the escape function
|
|
304
|
+
let output = Command::new("cargo")
|
|
305
|
+
.args([
|
|
306
|
+
"run",
|
|
307
|
+
"--",
|
|
308
|
+
"query",
|
|
309
|
+
"function escapeTest", // Pattern to search for the escape function
|
|
310
|
+
temp_dir.path().to_str().unwrap(),
|
|
311
|
+
"--language",
|
|
312
|
+
"javascript",
|
|
313
|
+
"--format",
|
|
314
|
+
"xml",
|
|
315
|
+
])
|
|
316
|
+
.output()
|
|
317
|
+
.expect("Failed to execute command");
|
|
318
|
+
|
|
319
|
+
// Check that the command succeeded
|
|
320
|
+
assert!(output.status.success());
|
|
321
|
+
|
|
322
|
+
// Convert stdout to string
|
|
323
|
+
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
324
|
+
|
|
325
|
+
// Extract the XML part from the output
|
|
326
|
+
let xml_str = extract_xml_from_output(&stdout);
|
|
327
|
+
|
|
328
|
+
// Parse the XML output
|
|
329
|
+
let doc = Document::parse(xml_str).expect("Failed to parse XML output");
|
|
330
|
+
let root = doc.root_element();
|
|
331
|
+
|
|
332
|
+
// Validate that there are result elements
|
|
333
|
+
let matches: Vec<Node> = root
|
|
334
|
+
.children()
|
|
335
|
+
.filter(|n| n.is_element() && n.tag_name().name() == "result")
|
|
336
|
+
.collect();
|
|
337
|
+
assert!(
|
|
338
|
+
!matches.is_empty(),
|
|
339
|
+
"Should have at least one result element"
|
|
340
|
+
);
|
|
341
|
+
|
|
342
|
+
// Find the result with special characters
|
|
343
|
+
let escape_match = matches.iter().find(|&m| {
|
|
344
|
+
if let Some(code) = m
|
|
345
|
+
.children()
|
|
346
|
+
.find(|n| n.is_element() && n.tag_name().name() == "code")
|
|
347
|
+
{
|
|
348
|
+
if let Some(content) = code.text() {
|
|
349
|
+
return content.contains("escapeTest");
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
false
|
|
353
|
+
});
|
|
354
|
+
|
|
355
|
+
assert!(
|
|
356
|
+
escape_match.is_some(),
|
|
357
|
+
"Should find the 'escapeTest' function"
|
|
358
|
+
);
|
|
359
|
+
|
|
360
|
+
// Verify that special characters are properly handled in the XML
|
|
361
|
+
if let Some(match_node) = escape_match {
|
|
362
|
+
if let Some(code) = match_node
|
|
363
|
+
.children()
|
|
364
|
+
.find(|n| n.is_element() && n.tag_name().name() == "code")
|
|
365
|
+
{
|
|
366
|
+
if let Some(content) = code.text() {
|
|
367
|
+
// Check for special characters in the function body
|
|
368
|
+
// The function contains special characters in the string literals
|
|
369
|
+
assert!(content.contains("<"), "Should contain '<'");
|
|
370
|
+
assert!(content.contains(">"), "Should contain '>'");
|
|
371
|
+
assert!(content.contains("&"), "Should contain '&'");
|
|
372
|
+
assert!(content.contains("""), "Should contain '"'");
|
|
373
|
+
assert!(content.contains("'"), "Should contain '''");
|
|
374
|
+
} else {
|
|
375
|
+
panic!("Code element should have content");
|
|
376
|
+
}
|
|
377
|
+
} else {
|
|
378
|
+
panic!("Result should have a code element");
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
// Check that file path is properly escaped
|
|
382
|
+
if let Some(file) = match_node
|
|
383
|
+
.children()
|
|
384
|
+
.find(|n| n.is_element() && n.tag_name().name() == "file")
|
|
385
|
+
{
|
|
386
|
+
if let Some(text) = file.text() {
|
|
387
|
+
// The XML should parse correctly, which means special characters in attributes are escaped
|
|
388
|
+
assert!(
|
|
389
|
+
text.contains("special_chars.js"),
|
|
390
|
+
"File path should be correct"
|
|
391
|
+
);
|
|
392
|
+
} else {
|
|
393
|
+
panic!("File element should have text content");
|
|
394
|
+
}
|
|
395
|
+
} else {
|
|
396
|
+
panic!("Result should have a file element");
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
#[test]
|
|
402
|
+
fn test_query_xml_output_with_multiple_languages() {
|
|
403
|
+
let temp_dir = TempDir::new().expect("Failed to create temp dir");
|
|
404
|
+
create_test_directory_structure(&temp_dir);
|
|
405
|
+
|
|
406
|
+
// Run the CLI with XML output format, searching for Python functions
|
|
407
|
+
let output = Command::new("cargo")
|
|
408
|
+
.args([
|
|
409
|
+
"run",
|
|
410
|
+
"--",
|
|
411
|
+
"query",
|
|
412
|
+
"def $NAME($$$PARAMS): $$$BODY", // Pattern to search for Python functions
|
|
413
|
+
temp_dir.path().to_str().unwrap(),
|
|
414
|
+
"--language",
|
|
415
|
+
"python",
|
|
416
|
+
"--format",
|
|
417
|
+
"xml",
|
|
418
|
+
])
|
|
419
|
+
.output()
|
|
420
|
+
.expect("Failed to execute command");
|
|
421
|
+
|
|
422
|
+
// Check that the command succeeded
|
|
423
|
+
assert!(output.status.success());
|
|
424
|
+
|
|
425
|
+
// Convert stdout to string
|
|
426
|
+
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
427
|
+
|
|
428
|
+
// Extract the XML part from the output
|
|
429
|
+
let xml_str = extract_xml_from_output(&stdout);
|
|
430
|
+
|
|
431
|
+
// Parse the XML output
|
|
432
|
+
let doc = Document::parse(xml_str).expect("Failed to parse XML output");
|
|
433
|
+
let root = doc.root_element();
|
|
434
|
+
|
|
435
|
+
// Validate that there are result elements
|
|
436
|
+
let matches: Vec<Node> = root
|
|
437
|
+
.children()
|
|
438
|
+
.filter(|n| n.is_element() && n.tag_name().name() == "result")
|
|
439
|
+
.collect();
|
|
440
|
+
assert!(
|
|
441
|
+
!matches.is_empty(),
|
|
442
|
+
"Should have at least one result element"
|
|
443
|
+
);
|
|
444
|
+
|
|
445
|
+
// Check that we found Python functions
|
|
446
|
+
let has_calculate_sum = matches.iter().any(|m| {
|
|
447
|
+
if let Some(code) = m
|
|
448
|
+
.children()
|
|
449
|
+
.find(|n| n.is_element() && n.tag_name().name() == "code")
|
|
450
|
+
{
|
|
451
|
+
if let Some(content) = code.text() {
|
|
452
|
+
return content.contains("calculate_sum");
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
false
|
|
456
|
+
});
|
|
457
|
+
|
|
458
|
+
let has_process_data = matches.iter().any(|m| {
|
|
459
|
+
if let Some(code) = m
|
|
460
|
+
.children()
|
|
461
|
+
.find(|n| n.is_element() && n.tag_name().name() == "code")
|
|
462
|
+
{
|
|
463
|
+
if let Some(content) = code.text() {
|
|
464
|
+
return content.contains("process_data");
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
false
|
|
468
|
+
});
|
|
469
|
+
|
|
470
|
+
assert!(
|
|
471
|
+
has_calculate_sum,
|
|
472
|
+
"Should find the 'calculate_sum' function"
|
|
473
|
+
);
|
|
474
|
+
assert!(has_process_data, "Should find the 'process_data' function");
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
#[test]
|
|
478
|
+
fn test_query_xml_output_with_no_results() {
|
|
479
|
+
let temp_dir = TempDir::new().expect("Failed to create temp dir");
|
|
480
|
+
create_test_directory_structure(&temp_dir);
|
|
481
|
+
|
|
482
|
+
// Run the CLI with XML output format, searching for a pattern that doesn't exist
|
|
483
|
+
let output = Command::new("cargo")
|
|
484
|
+
.args([
|
|
485
|
+
"run",
|
|
486
|
+
"--",
|
|
487
|
+
"query",
|
|
488
|
+
"class $NAME { $$$METHODS }", // Pattern that doesn't match any file
|
|
489
|
+
temp_dir.path().to_str().unwrap(),
|
|
490
|
+
"--format",
|
|
491
|
+
"xml",
|
|
492
|
+
])
|
|
493
|
+
.output()
|
|
494
|
+
.expect("Failed to execute command");
|
|
495
|
+
|
|
496
|
+
// Check that the command succeeded
|
|
497
|
+
assert!(output.status.success());
|
|
498
|
+
|
|
499
|
+
// Convert stdout to string
|
|
500
|
+
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
501
|
+
|
|
502
|
+
// Extract the XML part from the output
|
|
503
|
+
let xml_str = extract_xml_from_output(&stdout);
|
|
504
|
+
|
|
505
|
+
// Parse the XML output
|
|
506
|
+
let doc = Document::parse(xml_str).expect("Failed to parse XML output");
|
|
507
|
+
let root = doc.root_element();
|
|
508
|
+
|
|
509
|
+
// Validate the structure of the XML output
|
|
510
|
+
assert_eq!(
|
|
511
|
+
root.tag_name().name(),
|
|
512
|
+
"probe_results",
|
|
513
|
+
"Root element should be 'probe_results'"
|
|
514
|
+
);
|
|
515
|
+
|
|
516
|
+
// Validate that there are no result elements
|
|
517
|
+
let matches: Vec<Node> = root
|
|
518
|
+
.children()
|
|
519
|
+
.filter(|n| n.is_element() && n.tag_name().name() == "result")
|
|
520
|
+
.collect();
|
|
521
|
+
assert!(matches.is_empty(), "Should have no result elements");
|
|
522
|
+
|
|
523
|
+
// Validate the summary element
|
|
524
|
+
let summary = root
|
|
525
|
+
.children()
|
|
526
|
+
.find(|n| n.is_element() && n.tag_name().name() == "summary");
|
|
527
|
+
assert!(summary.is_some(), "Should have a summary element");
|
|
528
|
+
|
|
529
|
+
if let Some(summary) = summary {
|
|
530
|
+
// Validate the summary contains count, total_bytes, and total_tokens with zero values
|
|
531
|
+
if let Some(count) = summary
|
|
532
|
+
.children()
|
|
533
|
+
.find(|n| n.is_element() && n.tag_name().name() == "count")
|
|
534
|
+
{
|
|
535
|
+
let count_value = count.text().unwrap_or("0").parse::<usize>().unwrap_or(0);
|
|
536
|
+
assert_eq!(count_value, 0, "Count should be 0");
|
|
537
|
+
} else {
|
|
538
|
+
panic!("Summary should have a count element");
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
if let Some(total_bytes) = summary
|
|
542
|
+
.children()
|
|
543
|
+
.find(|n| n.is_element() && n.tag_name().name() == "total_bytes")
|
|
544
|
+
{
|
|
545
|
+
let total_bytes_value = total_bytes
|
|
546
|
+
.text()
|
|
547
|
+
.unwrap_or("0")
|
|
548
|
+
.parse::<usize>()
|
|
549
|
+
.unwrap_or(0);
|
|
550
|
+
assert_eq!(total_bytes_value, 0, "Total bytes should be 0");
|
|
551
|
+
} else {
|
|
552
|
+
panic!("Summary should have a total_bytes element");
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
if let Some(total_tokens) = summary
|
|
556
|
+
.children()
|
|
557
|
+
.find(|n| n.is_element() && n.tag_name().name() == "total_tokens")
|
|
558
|
+
{
|
|
559
|
+
let total_tokens_value = total_tokens
|
|
560
|
+
.text()
|
|
561
|
+
.unwrap_or("0")
|
|
562
|
+
.parse::<usize>()
|
|
563
|
+
.unwrap_or(0);
|
|
564
|
+
assert_eq!(total_tokens_value, 0, "Total tokens should be 0");
|
|
565
|
+
} else {
|
|
566
|
+
panic!("Summary should have a total_tokens element");
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
}
|