@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,438 @@
|
|
|
1
|
+
use serde_json::Value;
|
|
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 JSON from command output
|
|
9
|
+
fn extract_json_from_output(output: &str) -> &str {
|
|
10
|
+
// Find the first occurrence of '{'
|
|
11
|
+
if let Some(start_index) = output.find('{') {
|
|
12
|
+
// Return the substring from the first '{' to the end
|
|
13
|
+
&output[start_index..]
|
|
14
|
+
} else {
|
|
15
|
+
// If no '{' 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_json_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 JSON 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
|
+
"json",
|
|
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 JSON part from the output
|
|
117
|
+
let json_str = extract_json_from_output(&stdout);
|
|
118
|
+
|
|
119
|
+
// Parse the JSON output
|
|
120
|
+
let json_result: Value = serde_json::from_str(json_str).expect("Failed to parse JSON output");
|
|
121
|
+
|
|
122
|
+
// Validate the structure of the JSON output
|
|
123
|
+
assert!(json_result.is_object(), "JSON output should be an object");
|
|
124
|
+
assert!(
|
|
125
|
+
json_result.get("results").is_some(),
|
|
126
|
+
"JSON output should have a 'results' field"
|
|
127
|
+
);
|
|
128
|
+
assert!(
|
|
129
|
+
json_result.get("summary").is_some(),
|
|
130
|
+
"JSON output should have a 'summary' field"
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
// Validate the results array
|
|
134
|
+
let results = json_result.get("results").unwrap().as_array().unwrap();
|
|
135
|
+
assert!(!results.is_empty(), "'results' array should not be empty");
|
|
136
|
+
assert_eq!(results.len(), 2, "Should find 2 Rust functions");
|
|
137
|
+
|
|
138
|
+
// Validate the structure of each result
|
|
139
|
+
for result in results {
|
|
140
|
+
assert!(
|
|
141
|
+
result.get("file").is_some(),
|
|
142
|
+
"Each result should have a 'file' field"
|
|
143
|
+
);
|
|
144
|
+
assert!(
|
|
145
|
+
result.get("lines").is_some(),
|
|
146
|
+
"Each result should have a 'lines' field"
|
|
147
|
+
);
|
|
148
|
+
assert!(
|
|
149
|
+
result.get("node_type").is_some(),
|
|
150
|
+
"Each result should have a 'node_type' field"
|
|
151
|
+
);
|
|
152
|
+
assert!(
|
|
153
|
+
result.get("column_start").is_some(),
|
|
154
|
+
"Each result should have a 'column_start' field"
|
|
155
|
+
);
|
|
156
|
+
assert!(
|
|
157
|
+
result.get("column_end").is_some(),
|
|
158
|
+
"Each result should have a 'column_end' field"
|
|
159
|
+
);
|
|
160
|
+
assert!(
|
|
161
|
+
result.get("code").is_some(),
|
|
162
|
+
"Each result should have a 'code' field"
|
|
163
|
+
);
|
|
164
|
+
|
|
165
|
+
// Check that the code contains function code
|
|
166
|
+
let code = result.get("code").unwrap().as_str().unwrap();
|
|
167
|
+
assert!(
|
|
168
|
+
code.starts_with("fn "),
|
|
169
|
+
"Function code should start with 'fn '"
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Validate the summary object
|
|
174
|
+
let summary = json_result.get("summary").unwrap();
|
|
175
|
+
assert!(summary.is_object(), "'summary' should be an object");
|
|
176
|
+
assert!(
|
|
177
|
+
summary.get("count").is_some(),
|
|
178
|
+
"'summary' should have a 'count' field"
|
|
179
|
+
);
|
|
180
|
+
assert!(
|
|
181
|
+
summary.get("total_bytes").is_some(),
|
|
182
|
+
"'summary' should have a 'total_bytes' field"
|
|
183
|
+
);
|
|
184
|
+
assert!(
|
|
185
|
+
summary.get("total_tokens").is_some(),
|
|
186
|
+
"'summary' should have a 'total_tokens' field"
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
// Validate the count matches the number of results
|
|
190
|
+
let count = summary.get("count").unwrap().as_u64().unwrap();
|
|
191
|
+
let results_count = results.len() as u64;
|
|
192
|
+
assert_eq!(
|
|
193
|
+
count, results_count,
|
|
194
|
+
"The 'count' in summary should match the number of results"
|
|
195
|
+
);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
#[test]
|
|
199
|
+
fn test_query_json_output_javascript_functions() {
|
|
200
|
+
let temp_dir = TempDir::new().expect("Failed to create temp dir");
|
|
201
|
+
create_test_directory_structure(&temp_dir);
|
|
202
|
+
|
|
203
|
+
// Run the CLI with JSON output format
|
|
204
|
+
let output = Command::new("cargo")
|
|
205
|
+
.args([
|
|
206
|
+
"run",
|
|
207
|
+
"--",
|
|
208
|
+
"query",
|
|
209
|
+
"function $NAME($$$PARAMS) $$$BODY", // Pattern to search for JavaScript functions
|
|
210
|
+
temp_dir.path().to_str().unwrap(),
|
|
211
|
+
"--language",
|
|
212
|
+
"javascript",
|
|
213
|
+
"--format",
|
|
214
|
+
"json",
|
|
215
|
+
])
|
|
216
|
+
.output()
|
|
217
|
+
.expect("Failed to execute command");
|
|
218
|
+
|
|
219
|
+
// Check that the command succeeded
|
|
220
|
+
assert!(output.status.success());
|
|
221
|
+
|
|
222
|
+
// Convert stdout to string
|
|
223
|
+
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
224
|
+
|
|
225
|
+
// Extract the JSON part from the output
|
|
226
|
+
let json_str = extract_json_from_output(&stdout);
|
|
227
|
+
|
|
228
|
+
// Parse the JSON output
|
|
229
|
+
let json_result: Value = serde_json::from_str(json_str).expect("Failed to parse JSON output");
|
|
230
|
+
|
|
231
|
+
// Validate the results array
|
|
232
|
+
let results = json_result.get("results").unwrap().as_array().unwrap();
|
|
233
|
+
assert!(!results.is_empty(), "'results' array should not be empty");
|
|
234
|
+
|
|
235
|
+
// Check that we found the JavaScript functions
|
|
236
|
+
let has_greet = results
|
|
237
|
+
.iter()
|
|
238
|
+
.any(|r| r.get("code").unwrap().as_str().unwrap().contains("greet"));
|
|
239
|
+
|
|
240
|
+
assert!(has_greet, "Should find the 'greet' function");
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
#[test]
|
|
244
|
+
fn test_query_json_output_with_special_characters() {
|
|
245
|
+
let temp_dir = TempDir::new().expect("Failed to create temp dir");
|
|
246
|
+
create_test_directory_structure(&temp_dir);
|
|
247
|
+
|
|
248
|
+
// Run the CLI with JSON output format, searching for the escape function
|
|
249
|
+
let output = Command::new("cargo")
|
|
250
|
+
.args([
|
|
251
|
+
"run",
|
|
252
|
+
"--",
|
|
253
|
+
"query",
|
|
254
|
+
"function escapeTest", // Pattern to search for the escape function
|
|
255
|
+
temp_dir.path().to_str().unwrap(),
|
|
256
|
+
"--language",
|
|
257
|
+
"javascript",
|
|
258
|
+
"--format",
|
|
259
|
+
"json",
|
|
260
|
+
])
|
|
261
|
+
.output()
|
|
262
|
+
.expect("Failed to execute command");
|
|
263
|
+
|
|
264
|
+
// Check that the command succeeded
|
|
265
|
+
assert!(output.status.success());
|
|
266
|
+
|
|
267
|
+
// Convert stdout to string
|
|
268
|
+
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
269
|
+
|
|
270
|
+
// Extract the JSON part from the output
|
|
271
|
+
let json_str = extract_json_from_output(&stdout);
|
|
272
|
+
|
|
273
|
+
// Parse the JSON output
|
|
274
|
+
let json_result: Value = serde_json::from_str(json_str).expect("Failed to parse JSON output");
|
|
275
|
+
|
|
276
|
+
// Validate the results array
|
|
277
|
+
let results = json_result.get("results").unwrap().as_array().unwrap();
|
|
278
|
+
assert!(!results.is_empty(), "'results' array should not be empty");
|
|
279
|
+
|
|
280
|
+
// Check that we found the escape function
|
|
281
|
+
let escape_result = results.iter().find(|r| {
|
|
282
|
+
r.get("code")
|
|
283
|
+
.unwrap()
|
|
284
|
+
.as_str()
|
|
285
|
+
.unwrap()
|
|
286
|
+
.contains("escapeTest")
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
assert!(
|
|
290
|
+
escape_result.is_some(),
|
|
291
|
+
"Should find the 'escapeTest' function"
|
|
292
|
+
);
|
|
293
|
+
|
|
294
|
+
// Verify that special characters are properly escaped in the JSON
|
|
295
|
+
let code = escape_result
|
|
296
|
+
.unwrap()
|
|
297
|
+
.get("code")
|
|
298
|
+
.unwrap()
|
|
299
|
+
.as_str()
|
|
300
|
+
.unwrap();
|
|
301
|
+
|
|
302
|
+
// Print the code content for debugging
|
|
303
|
+
println!("Code content: {code}");
|
|
304
|
+
|
|
305
|
+
// Check for special characters in the function body
|
|
306
|
+
// The function contains special characters in the string literals
|
|
307
|
+
assert!(code.contains("<"), "Should contain '<'");
|
|
308
|
+
assert!(code.contains(">"), "Should contain '>'");
|
|
309
|
+
assert!(code.contains("&"), "Should contain '&'");
|
|
310
|
+
assert!(code.contains("""), "Should contain '"'");
|
|
311
|
+
assert!(code.contains("'"), "Should contain '''");
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
#[test]
|
|
315
|
+
fn test_query_json_output_with_multiple_languages() {
|
|
316
|
+
let temp_dir = TempDir::new().expect("Failed to create temp dir");
|
|
317
|
+
create_test_directory_structure(&temp_dir);
|
|
318
|
+
|
|
319
|
+
// Run the CLI with JSON output format, without specifying a language
|
|
320
|
+
let output = Command::new("cargo")
|
|
321
|
+
.args([
|
|
322
|
+
"run",
|
|
323
|
+
"--",
|
|
324
|
+
"query",
|
|
325
|
+
"def $NAME($$$PARAMS): $$$BODY", // Pattern to search for Python functions
|
|
326
|
+
temp_dir.path().to_str().unwrap(),
|
|
327
|
+
"--language",
|
|
328
|
+
"python",
|
|
329
|
+
"--format",
|
|
330
|
+
"json",
|
|
331
|
+
])
|
|
332
|
+
.output()
|
|
333
|
+
.expect("Failed to execute command");
|
|
334
|
+
|
|
335
|
+
// Check that the command succeeded
|
|
336
|
+
assert!(output.status.success());
|
|
337
|
+
|
|
338
|
+
// Convert stdout to string
|
|
339
|
+
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
340
|
+
|
|
341
|
+
// Extract the JSON part from the output
|
|
342
|
+
let json_str = extract_json_from_output(&stdout);
|
|
343
|
+
|
|
344
|
+
// Parse the JSON output
|
|
345
|
+
let json_result: Value = serde_json::from_str(json_str).expect("Failed to parse JSON output");
|
|
346
|
+
|
|
347
|
+
// Validate the results array
|
|
348
|
+
let results = json_result.get("results").unwrap().as_array().unwrap();
|
|
349
|
+
assert!(!results.is_empty(), "'results' array should not be empty");
|
|
350
|
+
|
|
351
|
+
// Check that we found Python functions
|
|
352
|
+
let has_calculate_sum = results.iter().any(|r| {
|
|
353
|
+
r.get("code")
|
|
354
|
+
.unwrap()
|
|
355
|
+
.as_str()
|
|
356
|
+
.unwrap()
|
|
357
|
+
.contains("calculate_sum")
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
let has_process_data = results.iter().any(|r| {
|
|
361
|
+
r.get("code")
|
|
362
|
+
.unwrap()
|
|
363
|
+
.as_str()
|
|
364
|
+
.unwrap()
|
|
365
|
+
.contains("process_data")
|
|
366
|
+
});
|
|
367
|
+
|
|
368
|
+
assert!(
|
|
369
|
+
has_calculate_sum,
|
|
370
|
+
"Should find the 'calculate_sum' function"
|
|
371
|
+
);
|
|
372
|
+
assert!(has_process_data, "Should find the 'process_data' function");
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
#[test]
|
|
376
|
+
fn test_query_json_output_with_no_results() {
|
|
377
|
+
let temp_dir = TempDir::new().expect("Failed to create temp dir");
|
|
378
|
+
create_test_directory_structure(&temp_dir);
|
|
379
|
+
|
|
380
|
+
// Run the CLI with JSON output format, searching for a pattern that doesn't exist
|
|
381
|
+
let output = Command::new("cargo")
|
|
382
|
+
.args([
|
|
383
|
+
"run",
|
|
384
|
+
"--",
|
|
385
|
+
"query",
|
|
386
|
+
"class $NAME { $$$METHODS }", // Pattern that doesn't match any file
|
|
387
|
+
temp_dir.path().to_str().unwrap(),
|
|
388
|
+
"--format",
|
|
389
|
+
"json",
|
|
390
|
+
])
|
|
391
|
+
.output()
|
|
392
|
+
.expect("Failed to execute command");
|
|
393
|
+
|
|
394
|
+
// Check that the command succeeded
|
|
395
|
+
assert!(output.status.success());
|
|
396
|
+
|
|
397
|
+
// Convert stdout to string
|
|
398
|
+
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
399
|
+
|
|
400
|
+
// Extract the JSON part from the output
|
|
401
|
+
let json_str = extract_json_from_output(&stdout);
|
|
402
|
+
|
|
403
|
+
// Parse the JSON output
|
|
404
|
+
let json_result: Value = serde_json::from_str(json_str).expect("Failed to parse JSON output");
|
|
405
|
+
|
|
406
|
+
// Validate the structure of the JSON output
|
|
407
|
+
assert!(json_result.is_object(), "JSON output should be an object");
|
|
408
|
+
assert!(
|
|
409
|
+
json_result.get("results").is_some(),
|
|
410
|
+
"JSON output should have a 'results' field"
|
|
411
|
+
);
|
|
412
|
+
assert!(
|
|
413
|
+
json_result.get("summary").is_some(),
|
|
414
|
+
"JSON output should have a 'summary' field"
|
|
415
|
+
);
|
|
416
|
+
|
|
417
|
+
// Validate the results array is empty
|
|
418
|
+
let results = json_result.get("results").unwrap().as_array().unwrap();
|
|
419
|
+
assert!(results.is_empty(), "'results' array should be empty");
|
|
420
|
+
|
|
421
|
+
// Validate the summary object
|
|
422
|
+
let summary = json_result.get("summary").unwrap();
|
|
423
|
+
assert_eq!(
|
|
424
|
+
summary.get("count").unwrap().as_u64().unwrap(),
|
|
425
|
+
0,
|
|
426
|
+
"'count' should be 0"
|
|
427
|
+
);
|
|
428
|
+
assert_eq!(
|
|
429
|
+
summary.get("total_bytes").unwrap().as_u64().unwrap(),
|
|
430
|
+
0,
|
|
431
|
+
"'total_bytes' should be 0"
|
|
432
|
+
);
|
|
433
|
+
assert_eq!(
|
|
434
|
+
summary.get("total_tokens").unwrap().as_u64().unwrap(),
|
|
435
|
+
0,
|
|
436
|
+
"'total_tokens' should be 0"
|
|
437
|
+
);
|
|
438
|
+
}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
use anyhow::Result;
|
|
2
|
+
use probe_code::query::{perform_query, QueryOptions};
|
|
3
|
+
use std::fs;
|
|
4
|
+
use tempfile::tempdir;
|
|
5
|
+
|
|
6
|
+
#[test]
|
|
7
|
+
fn test_query_rust_function() -> Result<()> {
|
|
8
|
+
// Create a temporary directory for our test files
|
|
9
|
+
let temp_dir = tempdir()?;
|
|
10
|
+
let temp_path = temp_dir.path();
|
|
11
|
+
|
|
12
|
+
// Create a test Rust file with a function
|
|
13
|
+
let rust_file_path = temp_path.join("test_function.rs");
|
|
14
|
+
let rust_content = r#"
|
|
15
|
+
fn hello_world() {
|
|
16
|
+
println!("Hello, world!");
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
fn add(a: i32, b: i32) -> i32 {
|
|
20
|
+
a + b
|
|
21
|
+
}
|
|
22
|
+
"#;
|
|
23
|
+
fs::write(&rust_file_path, rust_content)?;
|
|
24
|
+
|
|
25
|
+
// Create query options to search for function definitions
|
|
26
|
+
let options = QueryOptions {
|
|
27
|
+
path: temp_path,
|
|
28
|
+
pattern: "fn $NAME($$$PARAMS) $$$BODY",
|
|
29
|
+
language: Some("rust"),
|
|
30
|
+
ignore: &[],
|
|
31
|
+
allow_tests: true,
|
|
32
|
+
max_results: None,
|
|
33
|
+
format: "plain",
|
|
34
|
+
no_gitignore: false,
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
// Perform the query
|
|
38
|
+
let matches = perform_query(&options)?;
|
|
39
|
+
|
|
40
|
+
// Verify that we found both functions
|
|
41
|
+
assert_eq!(matches.len(), 2);
|
|
42
|
+
|
|
43
|
+
// Check that the first match is the hello_world function
|
|
44
|
+
let hello_match = matches
|
|
45
|
+
.iter()
|
|
46
|
+
.find(|m| m.matched_text.contains("hello_world"))
|
|
47
|
+
.unwrap();
|
|
48
|
+
assert!(hello_match.matched_text.contains("println!"));
|
|
49
|
+
|
|
50
|
+
// Check that the second match is the add function
|
|
51
|
+
let add_match = matches
|
|
52
|
+
.iter()
|
|
53
|
+
.find(|m| m.matched_text.contains("add"))
|
|
54
|
+
.unwrap();
|
|
55
|
+
assert!(add_match.matched_text.contains("a + b"));
|
|
56
|
+
|
|
57
|
+
Ok(())
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
#[test]
|
|
61
|
+
fn test_query_javascript_function() -> Result<()> {
|
|
62
|
+
// Create a temporary directory for our test files
|
|
63
|
+
let temp_dir = tempdir()?;
|
|
64
|
+
let temp_path = temp_dir.path();
|
|
65
|
+
|
|
66
|
+
// Create a test JavaScript file with a function
|
|
67
|
+
let js_file_path = temp_path.join("test_function.js");
|
|
68
|
+
let js_content = r#"
|
|
69
|
+
function greet(name) {
|
|
70
|
+
return `Hello, ${name}!`;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const multiply = (a, b) => a * b;
|
|
74
|
+
"#;
|
|
75
|
+
fs::write(&js_file_path, js_content)?;
|
|
76
|
+
|
|
77
|
+
// Create query options to search for function declarations
|
|
78
|
+
let options = QueryOptions {
|
|
79
|
+
path: temp_path,
|
|
80
|
+
pattern: "function $NAME($$$PARAMS) $$$BODY",
|
|
81
|
+
language: Some("javascript"),
|
|
82
|
+
ignore: &[],
|
|
83
|
+
allow_tests: true,
|
|
84
|
+
max_results: None,
|
|
85
|
+
format: "plain",
|
|
86
|
+
no_gitignore: false,
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
// Perform the query
|
|
90
|
+
let matches = perform_query(&options)?;
|
|
91
|
+
|
|
92
|
+
// Verify that we found the function declaration (not the arrow function)
|
|
93
|
+
assert_eq!(matches.len(), 1);
|
|
94
|
+
assert!(matches[0].matched_text.contains("greet"));
|
|
95
|
+
assert!(matches[0].matched_text.contains("return"));
|
|
96
|
+
|
|
97
|
+
// Now search for arrow functions
|
|
98
|
+
let arrow_options = QueryOptions {
|
|
99
|
+
path: temp_path,
|
|
100
|
+
pattern: "const $NAME = ($$$PARAMS) => $$$BODY",
|
|
101
|
+
language: Some("javascript"),
|
|
102
|
+
ignore: &[],
|
|
103
|
+
allow_tests: true,
|
|
104
|
+
max_results: None,
|
|
105
|
+
format: "plain",
|
|
106
|
+
no_gitignore: false,
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
// Perform the query
|
|
110
|
+
let arrow_matches = perform_query(&arrow_options)?;
|
|
111
|
+
|
|
112
|
+
// Verify that we found the arrow function
|
|
113
|
+
assert_eq!(arrow_matches.len(), 1);
|
|
114
|
+
assert!(arrow_matches[0].matched_text.contains("multiply"));
|
|
115
|
+
assert!(arrow_matches[0].matched_text.contains("a * b"));
|
|
116
|
+
|
|
117
|
+
Ok(())
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
#[test]
|
|
121
|
+
fn test_query_with_max_results() -> Result<()> {
|
|
122
|
+
// Create a temporary directory for our test files
|
|
123
|
+
let temp_dir = tempdir()?;
|
|
124
|
+
let temp_path = temp_dir.path();
|
|
125
|
+
|
|
126
|
+
// Create a test Rust file with multiple functions
|
|
127
|
+
let rust_file_path = temp_path.join("test_multiple.rs");
|
|
128
|
+
let rust_content = r#"
|
|
129
|
+
fn func1() {}
|
|
130
|
+
fn func2() {}
|
|
131
|
+
fn func3() {}
|
|
132
|
+
fn func4() {}
|
|
133
|
+
fn func5() {}
|
|
134
|
+
"#;
|
|
135
|
+
fs::write(&rust_file_path, rust_content)?;
|
|
136
|
+
|
|
137
|
+
// Create query options with max_results = 3
|
|
138
|
+
let options = QueryOptions {
|
|
139
|
+
path: temp_path,
|
|
140
|
+
pattern: "fn $NAME() {}",
|
|
141
|
+
language: Some("rust"),
|
|
142
|
+
ignore: &[],
|
|
143
|
+
allow_tests: true,
|
|
144
|
+
max_results: Some(3),
|
|
145
|
+
format: "plain",
|
|
146
|
+
no_gitignore: false,
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
// Perform the query
|
|
150
|
+
let matches = perform_query(&options)?;
|
|
151
|
+
|
|
152
|
+
// Verify that we only got 3 matches (due to max_results)
|
|
153
|
+
assert_eq!(matches.len(), 3);
|
|
154
|
+
|
|
155
|
+
Ok(())
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
#[test]
|
|
159
|
+
fn test_query_ignore_patterns() -> Result<()> {
|
|
160
|
+
// Create a temporary directory for our test files
|
|
161
|
+
let temp_dir = tempdir()?;
|
|
162
|
+
let temp_path = temp_dir.path();
|
|
163
|
+
|
|
164
|
+
// Create a test file in the main directory
|
|
165
|
+
let main_file_path = temp_path.join("main.rs");
|
|
166
|
+
fs::write(&main_file_path, "fn main() {}")?;
|
|
167
|
+
|
|
168
|
+
// Create a test file in a subdirectory that should be ignored
|
|
169
|
+
let test_dir_path = temp_path.join("test");
|
|
170
|
+
fs::create_dir(&test_dir_path)?;
|
|
171
|
+
let test_file_path = test_dir_path.join("test_file.rs");
|
|
172
|
+
fs::write(&test_file_path, "fn test_function() {}")?;
|
|
173
|
+
|
|
174
|
+
// Create query options with ignore patterns
|
|
175
|
+
let options = QueryOptions {
|
|
176
|
+
path: temp_path,
|
|
177
|
+
pattern: "fn $NAME() {}",
|
|
178
|
+
language: Some("rust"),
|
|
179
|
+
ignore: &["test".to_string()],
|
|
180
|
+
allow_tests: false,
|
|
181
|
+
max_results: None,
|
|
182
|
+
format: "plain",
|
|
183
|
+
no_gitignore: false,
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
// Perform the query
|
|
187
|
+
let matches = perform_query(&options)?;
|
|
188
|
+
|
|
189
|
+
// Verify that we only found the main function (test_function was ignored)
|
|
190
|
+
assert_eq!(matches.len(), 1);
|
|
191
|
+
assert!(matches[0].matched_text.contains("main"));
|
|
192
|
+
assert!(!matches[0].matched_text.contains("test_function"));
|
|
193
|
+
|
|
194
|
+
Ok(())
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
#[test]
|
|
198
|
+
fn test_query_with_auto_detect_language() -> Result<()> {
|
|
199
|
+
// Create a temporary directory for our test files
|
|
200
|
+
let temp_dir = tempdir()?;
|
|
201
|
+
let temp_path = temp_dir.path();
|
|
202
|
+
|
|
203
|
+
// Create a test Rust file with a function
|
|
204
|
+
let rust_file_path = temp_path.join("test_auto_detect.rs");
|
|
205
|
+
let rust_content = r#"
|
|
206
|
+
fn auto_detected_function() {
|
|
207
|
+
println!("This function should be found with auto-detection");
|
|
208
|
+
}
|
|
209
|
+
"#;
|
|
210
|
+
fs::write(&rust_file_path, rust_content)?;
|
|
211
|
+
|
|
212
|
+
// Create query options without specifying language
|
|
213
|
+
let options = QueryOptions {
|
|
214
|
+
path: temp_path,
|
|
215
|
+
pattern: "fn $NAME($$$PARAMS) $$$BODY",
|
|
216
|
+
language: None, // No language specified, should auto-detect
|
|
217
|
+
ignore: &[],
|
|
218
|
+
allow_tests: true,
|
|
219
|
+
max_results: None,
|
|
220
|
+
format: "plain",
|
|
221
|
+
no_gitignore: false,
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
// Perform the query
|
|
225
|
+
let matches = perform_query(&options)?;
|
|
226
|
+
|
|
227
|
+
// Verify that we found the function through auto-detection
|
|
228
|
+
assert_eq!(matches.len(), 1);
|
|
229
|
+
assert!(matches[0].matched_text.contains("auto_detected_function"));
|
|
230
|
+
|
|
231
|
+
Ok(())
|
|
232
|
+
}
|