@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,146 @@
|
|
|
1
|
+
use std::fs;
|
|
2
|
+
use std::process::Command;
|
|
3
|
+
|
|
4
|
+
use probe_code::extract::{handle_extract, ExtractOptions};
|
|
5
|
+
|
|
6
|
+
#[test]
|
|
7
|
+
fn test_deduplication_of_nested_extractions() {
|
|
8
|
+
// Create a temporary file with nested structures for testing
|
|
9
|
+
let temp_dir = tempfile::tempdir().unwrap();
|
|
10
|
+
let file_path = temp_dir.path().join("nested_test.rs");
|
|
11
|
+
let content = r#"
|
|
12
|
+
fn outer_function() {
|
|
13
|
+
let x = 10;
|
|
14
|
+
|
|
15
|
+
// This is a nested function that should be deduplicated
|
|
16
|
+
fn inner_function() {
|
|
17
|
+
let y = 20;
|
|
18
|
+
println!("Inner function: {}", y);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// Call the inner function
|
|
22
|
+
inner_function();
|
|
23
|
+
println!("Outer function: {}", x);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
fn standalone_function() {
|
|
27
|
+
println!("This is standalone");
|
|
28
|
+
}
|
|
29
|
+
"#;
|
|
30
|
+
fs::write(&file_path, content).unwrap();
|
|
31
|
+
|
|
32
|
+
// Enable debug mode to see deduplication logs
|
|
33
|
+
std::env::set_var("DEBUG", "1");
|
|
34
|
+
|
|
35
|
+
// Create options with both the outer function and inner function
|
|
36
|
+
let options = ExtractOptions {
|
|
37
|
+
files: vec![
|
|
38
|
+
format!("{}:2", file_path.to_string_lossy()), // outer function
|
|
39
|
+
format!("{}:6", file_path.to_string_lossy()), // inner function (should be deduplicated)
|
|
40
|
+
format!("{}:16", file_path.to_string_lossy()), // standalone function
|
|
41
|
+
],
|
|
42
|
+
custom_ignores: vec![],
|
|
43
|
+
context_lines: 0,
|
|
44
|
+
format: "plain".to_string(),
|
|
45
|
+
from_clipboard: false,
|
|
46
|
+
input_file: None,
|
|
47
|
+
to_clipboard: false,
|
|
48
|
+
dry_run: true, // Use dry run to avoid actual output
|
|
49
|
+
diff: false,
|
|
50
|
+
allow_tests: true,
|
|
51
|
+
keep_input: false,
|
|
52
|
+
prompt: None,
|
|
53
|
+
instructions: None,
|
|
54
|
+
no_gitignore: false,
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
// Call handle_extract
|
|
58
|
+
handle_extract(options).unwrap();
|
|
59
|
+
|
|
60
|
+
// Clean up environment variable
|
|
61
|
+
std::env::remove_var("DEBUG");
|
|
62
|
+
|
|
63
|
+
// The test passes if it runs without panicking
|
|
64
|
+
// The actual verification is done by manual inspection of the debug output
|
|
65
|
+
// which will show the nested duplicate being removed
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
#[test]
|
|
69
|
+
fn test_deduplication_with_command_line_integration() {
|
|
70
|
+
// Create a temporary file with nested structures for testing
|
|
71
|
+
let temp_dir = tempfile::tempdir().unwrap();
|
|
72
|
+
let file_path = temp_dir.path().join("nested_test.rs");
|
|
73
|
+
let content = r#"
|
|
74
|
+
fn outer_function() {
|
|
75
|
+
let x = 10;
|
|
76
|
+
|
|
77
|
+
// This is a nested function that should be deduplicated
|
|
78
|
+
fn inner_function() {
|
|
79
|
+
let y = 20;
|
|
80
|
+
println!("Inner function: {}", y);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Call the inner function
|
|
84
|
+
inner_function();
|
|
85
|
+
println!("Outer function: {}", x);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
fn standalone_function() {
|
|
89
|
+
println!("This is standalone");
|
|
90
|
+
}
|
|
91
|
+
"#;
|
|
92
|
+
fs::write(&file_path, content).unwrap();
|
|
93
|
+
|
|
94
|
+
// Get the project root directory (where Cargo.toml is)
|
|
95
|
+
let project_dir = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR"));
|
|
96
|
+
|
|
97
|
+
// Run the extract command with both the outer function and inner function
|
|
98
|
+
let output = Command::new("cargo")
|
|
99
|
+
.args([
|
|
100
|
+
"run",
|
|
101
|
+
"--manifest-path",
|
|
102
|
+
project_dir.join("Cargo.toml").to_string_lossy().as_ref(),
|
|
103
|
+
"--",
|
|
104
|
+
"extract",
|
|
105
|
+
&format!("{}:2", file_path.to_string_lossy()), // outer function
|
|
106
|
+
&format!("{}:6", file_path.to_string_lossy()), // inner function (should be deduplicated)
|
|
107
|
+
"--allow-tests",
|
|
108
|
+
"--format",
|
|
109
|
+
"json",
|
|
110
|
+
])
|
|
111
|
+
.env("DEBUG", "1")
|
|
112
|
+
.output()
|
|
113
|
+
.expect("Failed to execute command");
|
|
114
|
+
|
|
115
|
+
// Check that the command executed successfully
|
|
116
|
+
assert!(output.status.success(), "Command failed to execute");
|
|
117
|
+
|
|
118
|
+
// Get the output as a string
|
|
119
|
+
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
120
|
+
let stderr = String::from_utf8_lossy(&output.stderr);
|
|
121
|
+
|
|
122
|
+
// Print the output for debugging
|
|
123
|
+
println!("Command stdout: {stdout}");
|
|
124
|
+
println!("Command stderr: {stderr}");
|
|
125
|
+
|
|
126
|
+
// Check for deduplication logs in stdout (not stderr)
|
|
127
|
+
assert!(
|
|
128
|
+
stdout.contains("Before deduplication:") && stdout.contains("After deduplication:"),
|
|
129
|
+
"Deduplication logs not found in output"
|
|
130
|
+
);
|
|
131
|
+
|
|
132
|
+
// The deduplication is working correctly, as we can see in the logs
|
|
133
|
+
// Let's verify that the output contains only one result
|
|
134
|
+
|
|
135
|
+
// Check that the output contains the outer function but not the inner function as a separate result
|
|
136
|
+
assert!(
|
|
137
|
+
stdout.contains("\"count\": 1"),
|
|
138
|
+
"Should only have one result after deduplication"
|
|
139
|
+
);
|
|
140
|
+
assert!(
|
|
141
|
+
stdout.contains("outer_function"),
|
|
142
|
+
"Output should contain the outer function"
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
// Success! The deduplication is working correctly
|
|
146
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
use std::fs;
|
|
2
|
+
use std::process::Command;
|
|
3
|
+
use tempfile::TempDir;
|
|
4
|
+
|
|
5
|
+
#[test]
|
|
6
|
+
fn test_extract_command_with_input_file() {
|
|
7
|
+
// Create a temporary directory for our test files
|
|
8
|
+
let temp_dir = TempDir::new().expect("Failed to create temp dir");
|
|
9
|
+
|
|
10
|
+
// Create a test source file with simple content
|
|
11
|
+
let source_file_path = temp_dir.path().join("test_source.rs");
|
|
12
|
+
let source_content = r#"
|
|
13
|
+
fn main() {
|
|
14
|
+
println!("Hello, world!");
|
|
15
|
+
}
|
|
16
|
+
"#;
|
|
17
|
+
fs::write(&source_file_path, source_content).unwrap();
|
|
18
|
+
|
|
19
|
+
// Create an input file that contains the path to the source file
|
|
20
|
+
let input_file_path = temp_dir.path().join("input.txt");
|
|
21
|
+
fs::write(
|
|
22
|
+
&input_file_path,
|
|
23
|
+
source_file_path.to_string_lossy().as_bytes(),
|
|
24
|
+
)
|
|
25
|
+
.unwrap();
|
|
26
|
+
|
|
27
|
+
// Get the project root directory (where Cargo.toml is)
|
|
28
|
+
let project_dir = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR"));
|
|
29
|
+
|
|
30
|
+
// Run the extract command with --help to verify the new option exists
|
|
31
|
+
let help_output = Command::new("cargo")
|
|
32
|
+
.args([
|
|
33
|
+
"run",
|
|
34
|
+
"--manifest-path",
|
|
35
|
+
project_dir.join("Cargo.toml").to_string_lossy().as_ref(),
|
|
36
|
+
"--",
|
|
37
|
+
"extract",
|
|
38
|
+
"--help",
|
|
39
|
+
])
|
|
40
|
+
.output()
|
|
41
|
+
.expect("Failed to execute help command");
|
|
42
|
+
|
|
43
|
+
// Check that the help output includes the new option
|
|
44
|
+
let help_text = String::from_utf8_lossy(&help_output.stdout);
|
|
45
|
+
assert!(
|
|
46
|
+
help_text.contains("-F, --input-file"),
|
|
47
|
+
"Help text should include the new --input-file option"
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
#[test]
|
|
52
|
+
fn test_extract_command_with_nonexistent_input_file() {
|
|
53
|
+
// Get the project root directory (where Cargo.toml is)
|
|
54
|
+
let project_dir = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR"));
|
|
55
|
+
|
|
56
|
+
// Run the extract command with a nonexistent input file
|
|
57
|
+
let output = Command::new("cargo")
|
|
58
|
+
.args([
|
|
59
|
+
"run",
|
|
60
|
+
"--manifest-path",
|
|
61
|
+
project_dir.join("Cargo.toml").to_string_lossy().as_ref(),
|
|
62
|
+
"--",
|
|
63
|
+
"extract",
|
|
64
|
+
"--input-file",
|
|
65
|
+
"nonexistent_file.txt",
|
|
66
|
+
])
|
|
67
|
+
.output()
|
|
68
|
+
.expect("Failed to execute command");
|
|
69
|
+
|
|
70
|
+
// The command should fail
|
|
71
|
+
assert!(
|
|
72
|
+
!output.status.success(),
|
|
73
|
+
"Command should fail with nonexistent file"
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
// Get the error output as a string
|
|
77
|
+
let stderr = String::from_utf8_lossy(&output.stderr);
|
|
78
|
+
|
|
79
|
+
// The error should mention the nonexistent file
|
|
80
|
+
assert!(
|
|
81
|
+
stderr.contains("nonexistent_file.txt"),
|
|
82
|
+
"Error should mention the nonexistent file"
|
|
83
|
+
);
|
|
84
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
use std::fs;
|
|
2
|
+
use std::process::Command;
|
|
3
|
+
|
|
4
|
+
#[test]
|
|
5
|
+
fn test_extract_with_prompt_and_instructions() {
|
|
6
|
+
// Create a temporary file for testing
|
|
7
|
+
let temp_dir = tempfile::tempdir().unwrap();
|
|
8
|
+
let file_path = temp_dir.path().join("test_file.rs");
|
|
9
|
+
let content = r#"
|
|
10
|
+
fn test() {
|
|
11
|
+
println!("Hello, world!");
|
|
12
|
+
}
|
|
13
|
+
"#;
|
|
14
|
+
fs::write(&file_path, content).unwrap();
|
|
15
|
+
|
|
16
|
+
// Get the project root directory (where Cargo.toml is)
|
|
17
|
+
let project_dir = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR"));
|
|
18
|
+
|
|
19
|
+
// Run the extract command with prompt and instructions
|
|
20
|
+
let output = Command::new("cargo")
|
|
21
|
+
.args([
|
|
22
|
+
"run",
|
|
23
|
+
"--manifest-path",
|
|
24
|
+
project_dir.join("Cargo.toml").to_string_lossy().as_ref(),
|
|
25
|
+
"--",
|
|
26
|
+
"extract",
|
|
27
|
+
file_path.to_string_lossy().as_ref(),
|
|
28
|
+
"--format",
|
|
29
|
+
"json",
|
|
30
|
+
"--prompt",
|
|
31
|
+
"engineer",
|
|
32
|
+
"--instructions",
|
|
33
|
+
"Explain what this function does",
|
|
34
|
+
"--allow-tests", // Add this flag to ensure test files are included
|
|
35
|
+
])
|
|
36
|
+
.output()
|
|
37
|
+
.expect("Failed to execute command");
|
|
38
|
+
|
|
39
|
+
// Check that the command executed successfully
|
|
40
|
+
assert!(output.status.success(), "Command failed to execute");
|
|
41
|
+
|
|
42
|
+
// Get the output as a string
|
|
43
|
+
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
44
|
+
|
|
45
|
+
// Helper function to extract JSON from command output
|
|
46
|
+
fn extract_json_from_output(output: &str) -> &str {
|
|
47
|
+
// Find the first occurrence of '{'
|
|
48
|
+
if let Some(start_index) = output.find('{') {
|
|
49
|
+
// Return the substring from the first '{' to the end
|
|
50
|
+
&output[start_index..]
|
|
51
|
+
} else {
|
|
52
|
+
// If no '{' is found, return the original string
|
|
53
|
+
output
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Extract and parse the JSON
|
|
58
|
+
let json_str = extract_json_from_output(&stdout);
|
|
59
|
+
let json_value: serde_json::Value =
|
|
60
|
+
serde_json::from_str(json_str).expect("Failed to parse JSON output");
|
|
61
|
+
|
|
62
|
+
// Validate the structure of the JSON output
|
|
63
|
+
assert!(json_value.is_object(), "JSON output should be an object");
|
|
64
|
+
assert!(
|
|
65
|
+
json_value.get("results").is_some(),
|
|
66
|
+
"JSON output should have a 'results' field"
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
// Validate the results array
|
|
70
|
+
let results = json_value.get("results").unwrap().as_array().unwrap();
|
|
71
|
+
assert!(!results.is_empty(), "Results array should not be empty");
|
|
72
|
+
|
|
73
|
+
// Check for system_prompt field at the top level
|
|
74
|
+
assert!(
|
|
75
|
+
json_value.get("system_prompt").is_some(),
|
|
76
|
+
"JSON output should have a 'system_prompt' field"
|
|
77
|
+
);
|
|
78
|
+
let system_prompt = json_value.get("system_prompt").unwrap().as_str().unwrap();
|
|
79
|
+
assert!(
|
|
80
|
+
system_prompt.contains("senior software engineer"),
|
|
81
|
+
"System prompt should contain the engineer template"
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
// Check for user_instructions field at the top level
|
|
85
|
+
assert!(
|
|
86
|
+
json_value.get("user_instructions").is_some(),
|
|
87
|
+
"JSON output should have a 'user_instructions' field"
|
|
88
|
+
);
|
|
89
|
+
let user_instructions = json_value
|
|
90
|
+
.get("user_instructions")
|
|
91
|
+
.unwrap()
|
|
92
|
+
.as_str()
|
|
93
|
+
.unwrap();
|
|
94
|
+
assert_eq!(
|
|
95
|
+
user_instructions, "Explain what this function does",
|
|
96
|
+
"User instructions should match the input"
|
|
97
|
+
);
|
|
98
|
+
assert_eq!(
|
|
99
|
+
user_instructions, "Explain what this function does",
|
|
100
|
+
"User instructions should match the input"
|
|
101
|
+
);
|
|
102
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
use probe_code::search::elastic_query;
|
|
2
|
+
use probe_code::search::filters::SearchFilters;
|
|
3
|
+
use std::path::PathBuf;
|
|
4
|
+
|
|
5
|
+
#[test]
|
|
6
|
+
fn test_filename_directive_extraction() {
|
|
7
|
+
// Test explicit filename: directive
|
|
8
|
+
let query = "filename:\"SWE_TASK.txt\"";
|
|
9
|
+
let ast = elastic_query::parse_query(query, false).expect("Failed to parse query");
|
|
10
|
+
let (filters, simplified_ast) = SearchFilters::extract_and_simplify_with_autodetect(ast);
|
|
11
|
+
|
|
12
|
+
// Check that filename filter was extracted
|
|
13
|
+
assert_eq!(filters.exact_filenames.len(), 1);
|
|
14
|
+
assert_eq!(filters.exact_filenames[0], "SWE_TASK.txt");
|
|
15
|
+
|
|
16
|
+
// Should have no content search since only filename was specified
|
|
17
|
+
assert!(simplified_ast.is_none());
|
|
18
|
+
|
|
19
|
+
// Test that the filter matches the file
|
|
20
|
+
assert!(filters.matches_file(&PathBuf::from("SWE_TASK.txt")));
|
|
21
|
+
assert!(filters.matches_file(&PathBuf::from("path/to/SWE_TASK.txt")));
|
|
22
|
+
assert!(!filters.matches_file(&PathBuf::from("OTHER_FILE.txt")));
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
#[test]
|
|
26
|
+
fn test_filename_auto_detection() {
|
|
27
|
+
// Test auto-detection of filename-like terms
|
|
28
|
+
let query = "\"config.json\"";
|
|
29
|
+
let ast = elastic_query::parse_query(query, false).expect("Failed to parse query");
|
|
30
|
+
let (filters, simplified_ast) = SearchFilters::extract_and_simplify_with_autodetect(ast);
|
|
31
|
+
|
|
32
|
+
// Should auto-detect as filename
|
|
33
|
+
assert_eq!(filters.exact_filenames.len(), 1);
|
|
34
|
+
assert_eq!(filters.exact_filenames[0], "config.json");
|
|
35
|
+
assert!(simplified_ast.is_none());
|
|
36
|
+
|
|
37
|
+
// Test that the filter works
|
|
38
|
+
assert!(filters.matches_file(&PathBuf::from("config.json")));
|
|
39
|
+
assert!(filters.matches_file(&PathBuf::from("src/config.json")));
|
|
40
|
+
assert!(!filters.matches_file(&PathBuf::from("data.xml")));
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
#[test]
|
|
44
|
+
fn test_filename_or_query() {
|
|
45
|
+
// Test OR query with multiple filenames
|
|
46
|
+
let query = "\"SWE_TASK.txt\" OR \"swebench_problem.json\"";
|
|
47
|
+
let ast = elastic_query::parse_query(query, false).expect("Failed to parse query");
|
|
48
|
+
let (filters, simplified_ast) = SearchFilters::extract_and_simplify_with_autodetect(ast);
|
|
49
|
+
|
|
50
|
+
// Both should be detected as filenames
|
|
51
|
+
assert_eq!(filters.exact_filenames.len(), 2);
|
|
52
|
+
assert!(filters
|
|
53
|
+
.exact_filenames
|
|
54
|
+
.contains(&"SWE_TASK.txt".to_string()));
|
|
55
|
+
assert!(filters
|
|
56
|
+
.exact_filenames
|
|
57
|
+
.contains(&"swebench_problem.json".to_string()));
|
|
58
|
+
assert!(simplified_ast.is_none());
|
|
59
|
+
|
|
60
|
+
// Test that filters match both files
|
|
61
|
+
assert!(filters.matches_file(&PathBuf::from("SWE_TASK.txt")));
|
|
62
|
+
assert!(filters.matches_file(&PathBuf::from("swebench_problem.json")));
|
|
63
|
+
assert!(!filters.matches_file(&PathBuf::from("other.md")));
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
#[test]
|
|
67
|
+
fn test_filename_and_content_query() {
|
|
68
|
+
// Test AND query with filename and content search
|
|
69
|
+
let query = "\"task.txt\" AND error";
|
|
70
|
+
let ast = elastic_query::parse_query(query, false).expect("Failed to parse query");
|
|
71
|
+
let (filters, simplified_ast) = SearchFilters::extract_and_simplify_with_autodetect(ast);
|
|
72
|
+
|
|
73
|
+
// Filename should be extracted as filter
|
|
74
|
+
assert_eq!(filters.exact_filenames.len(), 1);
|
|
75
|
+
assert_eq!(filters.exact_filenames[0], "task.txt");
|
|
76
|
+
|
|
77
|
+
// "error" should remain in AST for content search
|
|
78
|
+
assert!(simplified_ast.is_some());
|
|
79
|
+
|
|
80
|
+
// Test filter matching
|
|
81
|
+
assert!(filters.matches_file(&PathBuf::from("task.txt")));
|
|
82
|
+
assert!(!filters.matches_file(&PathBuf::from("notes.txt")));
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
#[test]
|
|
86
|
+
fn test_filename_case_insensitive() {
|
|
87
|
+
// Test case-insensitive filename matching
|
|
88
|
+
let query = "filename:\"readme.md\"";
|
|
89
|
+
let ast = elastic_query::parse_query(query, false).expect("Failed to parse query");
|
|
90
|
+
let (filters, _) = SearchFilters::extract_and_simplify_with_autodetect(ast);
|
|
91
|
+
|
|
92
|
+
// Should match regardless of case
|
|
93
|
+
assert!(filters.matches_file(&PathBuf::from("README.md")));
|
|
94
|
+
assert!(filters.matches_file(&PathBuf::from("readme.md")));
|
|
95
|
+
assert!(filters.matches_file(&PathBuf::from("Readme.MD")));
|
|
96
|
+
}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
use std::fs;
|
|
2
|
+
use std::process::Command;
|
|
3
|
+
use tempfile::TempDir;
|
|
4
|
+
|
|
5
|
+
/// Integration tests specifically for the GitHub files extract bug fix.
|
|
6
|
+
///
|
|
7
|
+
/// This tests the issue where `probe extract` was incorrectly ignoring files
|
|
8
|
+
/// in .github directories due to substring matching on ".git".
|
|
9
|
+
|
|
10
|
+
#[test]
|
|
11
|
+
fn test_extract_github_workflow_file() {
|
|
12
|
+
let temp_dir = TempDir::new().unwrap();
|
|
13
|
+
|
|
14
|
+
// Create .github directory structure
|
|
15
|
+
let github_dir = temp_dir.path().join(".github");
|
|
16
|
+
let workflows_dir = github_dir.join("workflows");
|
|
17
|
+
fs::create_dir_all(&workflows_dir).unwrap();
|
|
18
|
+
|
|
19
|
+
// Create a GitHub workflow file
|
|
20
|
+
let workflow_file = workflows_dir.join("ci.yml");
|
|
21
|
+
let workflow_content = r#"name: CI Pipeline
|
|
22
|
+
on:
|
|
23
|
+
push:
|
|
24
|
+
branches: [ main, develop ]
|
|
25
|
+
pull_request:
|
|
26
|
+
branches: [ main ]
|
|
27
|
+
|
|
28
|
+
jobs:
|
|
29
|
+
test:
|
|
30
|
+
runs-on: ubuntu-latest
|
|
31
|
+
steps:
|
|
32
|
+
- uses: actions/checkout@v2
|
|
33
|
+
- name: Run tests
|
|
34
|
+
run: |
|
|
35
|
+
echo "Running tests"
|
|
36
|
+
cargo test --all
|
|
37
|
+
|
|
38
|
+
- name: Check formatting
|
|
39
|
+
run: cargo fmt --check
|
|
40
|
+
|
|
41
|
+
build:
|
|
42
|
+
needs: test
|
|
43
|
+
runs-on: ubuntu-latest
|
|
44
|
+
steps:
|
|
45
|
+
- uses: actions/checkout@v2
|
|
46
|
+
- name: Build
|
|
47
|
+
run: cargo build --release
|
|
48
|
+
"#;
|
|
49
|
+
fs::write(&workflow_file, workflow_content).unwrap();
|
|
50
|
+
|
|
51
|
+
// Test extracting the entire file
|
|
52
|
+
let output = Command::new(env!("CARGO_BIN_EXE_probe"))
|
|
53
|
+
.args(["extract", &workflow_file.to_string_lossy()])
|
|
54
|
+
.current_dir(temp_dir.path())
|
|
55
|
+
.output()
|
|
56
|
+
.expect("Failed to execute probe extract");
|
|
57
|
+
|
|
58
|
+
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
59
|
+
let stderr = String::from_utf8_lossy(&output.stderr);
|
|
60
|
+
|
|
61
|
+
assert!(
|
|
62
|
+
output.status.success(),
|
|
63
|
+
"probe extract should succeed for .github files. stderr: {stderr}"
|
|
64
|
+
);
|
|
65
|
+
assert!(
|
|
66
|
+
stdout.contains("CI Pipeline"),
|
|
67
|
+
"Should extract content from GitHub workflow file. stdout: {stdout}"
|
|
68
|
+
);
|
|
69
|
+
assert!(
|
|
70
|
+
!stdout.contains("No results found"),
|
|
71
|
+
"Should not return 'No results found' for .github files"
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
#[test]
|
|
76
|
+
fn test_extract_github_workflow_with_line_range() {
|
|
77
|
+
let temp_dir = TempDir::new().unwrap();
|
|
78
|
+
|
|
79
|
+
// Create .github directory structure
|
|
80
|
+
let github_dir = temp_dir.path().join(".github");
|
|
81
|
+
let workflows_dir = github_dir.join("workflows");
|
|
82
|
+
fs::create_dir_all(&workflows_dir).unwrap();
|
|
83
|
+
|
|
84
|
+
// Create a GitHub workflow file
|
|
85
|
+
let workflow_file = workflows_dir.join("test.yml");
|
|
86
|
+
let workflow_content = r#"name: Test Workflow
|
|
87
|
+
on: [push]
|
|
88
|
+
jobs:
|
|
89
|
+
test:
|
|
90
|
+
runs-on: ubuntu-latest
|
|
91
|
+
steps:
|
|
92
|
+
- name: Checkout
|
|
93
|
+
uses: actions/checkout@v2
|
|
94
|
+
- name: Test
|
|
95
|
+
run: echo "testing"
|
|
96
|
+
"#;
|
|
97
|
+
fs::write(&workflow_file, workflow_content).unwrap();
|
|
98
|
+
|
|
99
|
+
// Test extracting specific lines (lines 3-7)
|
|
100
|
+
let file_with_range = format!("{}:3-7", workflow_file.to_string_lossy());
|
|
101
|
+
let output = Command::new(env!("CARGO_BIN_EXE_probe"))
|
|
102
|
+
.args(["extract", &file_with_range])
|
|
103
|
+
.current_dir(temp_dir.path())
|
|
104
|
+
.output()
|
|
105
|
+
.expect("Failed to execute probe extract with line range");
|
|
106
|
+
|
|
107
|
+
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
108
|
+
let stderr = String::from_utf8_lossy(&output.stderr);
|
|
109
|
+
|
|
110
|
+
assert!(
|
|
111
|
+
output.status.success(),
|
|
112
|
+
"probe extract should succeed for .github files with line ranges. stderr: {stderr}"
|
|
113
|
+
);
|
|
114
|
+
assert!(
|
|
115
|
+
stdout.contains("jobs:"),
|
|
116
|
+
"Should extract the specified line range. stdout: {stdout}"
|
|
117
|
+
);
|
|
118
|
+
assert!(
|
|
119
|
+
stdout.contains("Lines: 3-7"),
|
|
120
|
+
"Should show the correct line range in output. stdout: {stdout}"
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
#[test]
|
|
125
|
+
fn test_git_directory_still_ignored() {
|
|
126
|
+
let temp_dir = TempDir::new().unwrap();
|
|
127
|
+
|
|
128
|
+
// Create a .git directory (should be ignored)
|
|
129
|
+
let git_dir = temp_dir.path().join(".git");
|
|
130
|
+
fs::create_dir_all(&git_dir).unwrap();
|
|
131
|
+
let git_config = git_dir.join("config");
|
|
132
|
+
fs::write(&git_config, "[core]\n repositoryformatversion = 0\n").unwrap();
|
|
133
|
+
|
|
134
|
+
// Test that .git files are still ignored
|
|
135
|
+
let output = Command::new(env!("CARGO_BIN_EXE_probe"))
|
|
136
|
+
.args(["extract", &git_config.to_string_lossy()])
|
|
137
|
+
.current_dir(temp_dir.path())
|
|
138
|
+
.output()
|
|
139
|
+
.expect("Failed to execute probe extract");
|
|
140
|
+
|
|
141
|
+
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
142
|
+
|
|
143
|
+
// .git files should still be ignored (should return "No results found")
|
|
144
|
+
assert!(
|
|
145
|
+
stdout.contains("No results found"),
|
|
146
|
+
".git directory files should still be ignored. stdout: {stdout}"
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
#[test]
|
|
151
|
+
fn test_gitignore_file_not_ignored() {
|
|
152
|
+
let temp_dir = TempDir::new().unwrap();
|
|
153
|
+
|
|
154
|
+
// Create a .gitignore file (should NOT be ignored)
|
|
155
|
+
let gitignore_file = temp_dir.path().join(".gitignore");
|
|
156
|
+
fs::write(&gitignore_file, "*.log\ntmp/\n*.tmp\n").unwrap();
|
|
157
|
+
|
|
158
|
+
// Test that .gitignore files are NOT ignored
|
|
159
|
+
let output = Command::new(env!("CARGO_BIN_EXE_probe"))
|
|
160
|
+
.args(["extract", &gitignore_file.to_string_lossy()])
|
|
161
|
+
.current_dir(temp_dir.path())
|
|
162
|
+
.output()
|
|
163
|
+
.expect("Failed to execute probe extract");
|
|
164
|
+
|
|
165
|
+
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
166
|
+
let stderr = String::from_utf8_lossy(&output.stderr);
|
|
167
|
+
|
|
168
|
+
assert!(
|
|
169
|
+
output.status.success(),
|
|
170
|
+
"probe extract should succeed for .gitignore files. stderr: {stderr}"
|
|
171
|
+
);
|
|
172
|
+
assert!(
|
|
173
|
+
stdout.contains("*.log"),
|
|
174
|
+
"Should extract content from .gitignore file. stdout: {stdout}"
|
|
175
|
+
);
|
|
176
|
+
assert!(
|
|
177
|
+
!stdout.contains("No results found"),
|
|
178
|
+
"Should not return 'No results found' for .gitignore files"
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
#[test]
|
|
183
|
+
fn test_github_issue_template() {
|
|
184
|
+
let temp_dir = TempDir::new().unwrap();
|
|
185
|
+
|
|
186
|
+
// Create .github directory structure
|
|
187
|
+
let github_dir = temp_dir.path().join(".github");
|
|
188
|
+
fs::create_dir_all(&github_dir).unwrap();
|
|
189
|
+
|
|
190
|
+
// Create a GitHub issue template
|
|
191
|
+
let issue_template = github_dir.join("issue_template.md");
|
|
192
|
+
let template_content = r#"---
|
|
193
|
+
name: Bug report
|
|
194
|
+
about: Create a report to help us improve
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
**Describe the bug**
|
|
198
|
+
A clear and concise description of what the bug is.
|
|
199
|
+
|
|
200
|
+
**To Reproduce**
|
|
201
|
+
Steps to reproduce the behavior:
|
|
202
|
+
1. Go to '...'
|
|
203
|
+
2. Click on '....'
|
|
204
|
+
3. Scroll down to '....'
|
|
205
|
+
4. See error
|
|
206
|
+
|
|
207
|
+
**Expected behavior**
|
|
208
|
+
A clear and concise description of what you expected to happen.
|
|
209
|
+
"#;
|
|
210
|
+
fs::write(&issue_template, template_content).unwrap();
|
|
211
|
+
|
|
212
|
+
// Test extracting the issue template
|
|
213
|
+
let output = Command::new(env!("CARGO_BIN_EXE_probe"))
|
|
214
|
+
.args(["extract", &issue_template.to_string_lossy()])
|
|
215
|
+
.current_dir(temp_dir.path())
|
|
216
|
+
.output()
|
|
217
|
+
.expect("Failed to execute probe extract");
|
|
218
|
+
|
|
219
|
+
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
220
|
+
let stderr = String::from_utf8_lossy(&output.stderr);
|
|
221
|
+
|
|
222
|
+
assert!(
|
|
223
|
+
output.status.success(),
|
|
224
|
+
"probe extract should succeed for .github issue templates. stderr: {stderr}"
|
|
225
|
+
);
|
|
226
|
+
assert!(
|
|
227
|
+
stdout.contains("Bug report"),
|
|
228
|
+
"Should extract content from GitHub issue template. stdout: {stdout}"
|
|
229
|
+
);
|
|
230
|
+
assert!(
|
|
231
|
+
stdout.contains("Describe the bug"),
|
|
232
|
+
"Should extract the issue template content. stdout: {stdout}"
|
|
233
|
+
);
|
|
234
|
+
}
|