@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,725 @@
|
|
|
1
|
+
use anyhow::Result;
|
|
2
|
+
use std::fs;
|
|
3
|
+
use tempfile::TempDir;
|
|
4
|
+
|
|
5
|
+
mod common;
|
|
6
|
+
use common::TestContext;
|
|
7
|
+
|
|
8
|
+
#[test]
|
|
9
|
+
fn test_rust_outline_smart_closing_brace_comments() -> Result<()> {
|
|
10
|
+
let temp_dir = TempDir::new()?;
|
|
11
|
+
let test_file = temp_dir.path().join("smart_braces.rs");
|
|
12
|
+
|
|
13
|
+
let content = r#"/// Small function that should NOT get closing brace comments.
|
|
14
|
+
pub fn small_function(x: i32) -> i32 {
|
|
15
|
+
let result = x * 2;
|
|
16
|
+
result + 1
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/// Large function that SHOULD get closing brace comments when there are gaps.
|
|
20
|
+
pub fn large_function_with_gaps(data: Vec<i32>) -> Vec<String> {
|
|
21
|
+
let mut results = Vec::new();
|
|
22
|
+
let mut processor = DataProcessor::new();
|
|
23
|
+
|
|
24
|
+
// Phase 1: Initial processing
|
|
25
|
+
for (index, value) in data.iter().enumerate() {
|
|
26
|
+
if value > &100 {
|
|
27
|
+
processor.process_large_value(value, index);
|
|
28
|
+
} else if value < &0 {
|
|
29
|
+
processor.process_negative_value(value, index);
|
|
30
|
+
} else {
|
|
31
|
+
processor.process_small_value(value, index);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Phase 2: Complex transformation logic
|
|
36
|
+
let transformed_data = processor.get_transformed_data();
|
|
37
|
+
for item in transformed_data {
|
|
38
|
+
match item.category {
|
|
39
|
+
Category::High => {
|
|
40
|
+
results.push(format!("HIGH: {}", item.value));
|
|
41
|
+
}
|
|
42
|
+
Category::Medium => {
|
|
43
|
+
results.push(format!("MED: {}", item.value));
|
|
44
|
+
}
|
|
45
|
+
Category::Low => {
|
|
46
|
+
results.push(format!("LOW: {}", item.value));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Phase 3: Final validation and cleanup
|
|
52
|
+
let mut validated_results = Vec::new();
|
|
53
|
+
for result in results {
|
|
54
|
+
if result.len() > 5 {
|
|
55
|
+
validated_results.push(result);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
validated_results
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/// Another large function to test closing brace behavior
|
|
63
|
+
pub fn another_large_function(items: &[Item]) -> ProcessedResult {
|
|
64
|
+
let mut accumulator = Accumulator::new();
|
|
65
|
+
|
|
66
|
+
// Main processing loop with complex nested logic
|
|
67
|
+
for item in items {
|
|
68
|
+
match item.item_type {
|
|
69
|
+
ItemType::Primary => {
|
|
70
|
+
if item.weight > 50.0 {
|
|
71
|
+
accumulator.add_heavy_primary(item);
|
|
72
|
+
} else {
|
|
73
|
+
accumulator.add_light_primary(item);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
ItemType::Secondary => {
|
|
77
|
+
accumulator.add_secondary(item);
|
|
78
|
+
}
|
|
79
|
+
ItemType::Auxiliary => {
|
|
80
|
+
accumulator.add_auxiliary(item);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
accumulator.finalize()
|
|
86
|
+
}
|
|
87
|
+
"#;
|
|
88
|
+
|
|
89
|
+
fs::write(&test_file, content)?;
|
|
90
|
+
|
|
91
|
+
let ctx = TestContext::new();
|
|
92
|
+
let output = ctx.run_probe(&[
|
|
93
|
+
"search",
|
|
94
|
+
"large_function", // Search for large functions
|
|
95
|
+
test_file.to_str().unwrap(),
|
|
96
|
+
"--format",
|
|
97
|
+
"outline",
|
|
98
|
+
])?;
|
|
99
|
+
|
|
100
|
+
// Should find the large functions
|
|
101
|
+
assert!(
|
|
102
|
+
output.contains("large_function_with_gaps") || output.contains("another_large_function"),
|
|
103
|
+
"Missing large functions - output: {}",
|
|
104
|
+
output
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
// Should have closing brace comments for large functions with gaps
|
|
108
|
+
let has_closing_brace_comment = output.contains("} //") || output.contains("} /*");
|
|
109
|
+
assert!(
|
|
110
|
+
has_closing_brace_comment,
|
|
111
|
+
"Large functions should have closing brace comments - output: {}",
|
|
112
|
+
output
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
// Should be in outline format
|
|
116
|
+
assert!(
|
|
117
|
+
output.contains("---\nFile:"),
|
|
118
|
+
"Missing file delimiter in outline format - output: {}",
|
|
119
|
+
output
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
Ok(())
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
#[test]
|
|
126
|
+
fn test_rust_outline_array_truncation_with_keyword_preservation() -> Result<()> {
|
|
127
|
+
let temp_dir = TempDir::new()?;
|
|
128
|
+
let test_file = temp_dir.path().join("large_arrays.rs");
|
|
129
|
+
|
|
130
|
+
let content = r#"use std::collections::HashMap;
|
|
131
|
+
|
|
132
|
+
/// Function containing large array that should be truncated but preserve keywords.
|
|
133
|
+
pub fn process_large_dataset() -> Vec<String> {
|
|
134
|
+
let large_configuration = vec![
|
|
135
|
+
"database_connection_string",
|
|
136
|
+
"api_key_primary",
|
|
137
|
+
"api_key_secondary",
|
|
138
|
+
"cache_timeout_value",
|
|
139
|
+
"retry_attempt_count",
|
|
140
|
+
"batch_size_limit",
|
|
141
|
+
"queue_max_capacity",
|
|
142
|
+
"worker_thread_count",
|
|
143
|
+
"memory_allocation_limit",
|
|
144
|
+
"disk_space_threshold",
|
|
145
|
+
"network_timeout_value",
|
|
146
|
+
"authentication_token_lifetime",
|
|
147
|
+
"session_expiry_duration",
|
|
148
|
+
"log_rotation_interval",
|
|
149
|
+
"backup_retention_period",
|
|
150
|
+
"monitoring_check_interval",
|
|
151
|
+
"alert_notification_threshold",
|
|
152
|
+
"performance_metrics_collection",
|
|
153
|
+
"security_audit_frequency",
|
|
154
|
+
"data_encryption_algorithm",
|
|
155
|
+
"compression_ratio_target",
|
|
156
|
+
"indexing_strategy_preference",
|
|
157
|
+
"query_optimization_level",
|
|
158
|
+
"connection_pool_sizing",
|
|
159
|
+
"load_balancer_configuration",
|
|
160
|
+
"failover_mechanism_timeout",
|
|
161
|
+
"disaster_recovery_checkpoint",
|
|
162
|
+
"data_replication_strategy",
|
|
163
|
+
"cache_invalidation_policy",
|
|
164
|
+
"resource_allocation_priority"
|
|
165
|
+
];
|
|
166
|
+
|
|
167
|
+
let mut results = Vec::new();
|
|
168
|
+
for config_item in large_configuration {
|
|
169
|
+
if config_item.contains("api_key") {
|
|
170
|
+
results.push(format!("SECURE: {}", config_item));
|
|
171
|
+
} else if config_item.contains("timeout") {
|
|
172
|
+
results.push(format!("TIMING: {}", config_item));
|
|
173
|
+
} else {
|
|
174
|
+
results.push(format!("CONFIG: {}", config_item));
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
results
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/// Function with large struct initialization that should be truncated.
|
|
182
|
+
pub fn create_large_configuration() -> Config {
|
|
183
|
+
let config = Config {
|
|
184
|
+
database_host: "localhost".to_string(),
|
|
185
|
+
database_port: 5432,
|
|
186
|
+
database_name: "production_db".to_string(),
|
|
187
|
+
connection_timeout: Duration::from_secs(30),
|
|
188
|
+
max_connections: 100,
|
|
189
|
+
idle_timeout: Duration::from_secs(300),
|
|
190
|
+
query_timeout: Duration::from_secs(60),
|
|
191
|
+
ssl_enabled: true,
|
|
192
|
+
ssl_cert_path: "/etc/ssl/certs/db.pem".to_string(),
|
|
193
|
+
ssl_key_path: "/etc/ssl/private/db.key".to_string(),
|
|
194
|
+
backup_enabled: true,
|
|
195
|
+
backup_interval: Duration::from_secs(3600),
|
|
196
|
+
backup_retention_days: 30,
|
|
197
|
+
log_level: LogLevel::Info,
|
|
198
|
+
log_file_path: "/var/log/app.log".to_string(),
|
|
199
|
+
max_log_file_size: 100_000_000,
|
|
200
|
+
api_key: "super_secret_api_key_here".to_string(),
|
|
201
|
+
api_rate_limit: 1000,
|
|
202
|
+
cache_size: 1024 * 1024 * 100,
|
|
203
|
+
cache_ttl: Duration::from_secs(3600),
|
|
204
|
+
feature_flags: FeatureFlags {
|
|
205
|
+
enable_new_feature_alpha: true,
|
|
206
|
+
enable_experimental_optimization: false,
|
|
207
|
+
enable_beta_ui: true,
|
|
208
|
+
enable_advanced_analytics: true,
|
|
209
|
+
},
|
|
210
|
+
monitoring: MonitoringConfig {
|
|
211
|
+
metrics_enabled: true,
|
|
212
|
+
traces_enabled: true,
|
|
213
|
+
logs_enabled: true,
|
|
214
|
+
sample_rate: 0.1,
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
config
|
|
219
|
+
}
|
|
220
|
+
"#;
|
|
221
|
+
|
|
222
|
+
fs::write(&test_file, content)?;
|
|
223
|
+
|
|
224
|
+
let ctx = TestContext::new();
|
|
225
|
+
let output = ctx.run_probe(&[
|
|
226
|
+
"search",
|
|
227
|
+
"api_key", // Search for keyword that appears in large structures
|
|
228
|
+
test_file.to_str().unwrap(),
|
|
229
|
+
"--format",
|
|
230
|
+
"outline",
|
|
231
|
+
])?;
|
|
232
|
+
|
|
233
|
+
// Should find the functions containing api_key
|
|
234
|
+
assert!(
|
|
235
|
+
output.contains("process_large_dataset") || output.contains("create_large_configuration"),
|
|
236
|
+
"Missing functions with api_key - output: {}",
|
|
237
|
+
output
|
|
238
|
+
);
|
|
239
|
+
|
|
240
|
+
// Should contain the search keyword even in truncated output
|
|
241
|
+
assert!(
|
|
242
|
+
output.contains("api_key"),
|
|
243
|
+
"Should preserve api_key keyword even in truncated arrays - output: {}",
|
|
244
|
+
output
|
|
245
|
+
);
|
|
246
|
+
|
|
247
|
+
// Should show truncation with ellipsis for large arrays
|
|
248
|
+
assert!(
|
|
249
|
+
output.contains("..."),
|
|
250
|
+
"Should show ellipsis for truncated large arrays - output: {}",
|
|
251
|
+
output
|
|
252
|
+
);
|
|
253
|
+
|
|
254
|
+
// Should be reasonably sized (not show the full large array)
|
|
255
|
+
let line_count = output.lines().count();
|
|
256
|
+
assert!(
|
|
257
|
+
line_count < 100,
|
|
258
|
+
"Output should be truncated to reasonable size, got {} lines",
|
|
259
|
+
line_count
|
|
260
|
+
);
|
|
261
|
+
|
|
262
|
+
Ok(())
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
#[test]
|
|
266
|
+
fn test_rust_outline_complex_generics_and_lifetimes() -> Result<()> {
|
|
267
|
+
let temp_dir = TempDir::new()?;
|
|
268
|
+
let test_file = temp_dir.path().join("complex_rust.rs");
|
|
269
|
+
|
|
270
|
+
let content = r#"use std::collections::HashMap;
|
|
271
|
+
use std::marker::PhantomData;
|
|
272
|
+
|
|
273
|
+
/// Complex generic struct with lifetimes and type bounds.
|
|
274
|
+
pub struct ComplexProcessor<'a, T, U>
|
|
275
|
+
where
|
|
276
|
+
T: Clone + Send + Sync + 'static,
|
|
277
|
+
U: AsRef<str> + Into<String>,
|
|
278
|
+
{
|
|
279
|
+
data: &'a [T],
|
|
280
|
+
lookup: HashMap<String, U>,
|
|
281
|
+
phantom: PhantomData<T>,
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
impl<'a, T, U> ComplexProcessor<'a, T, U>
|
|
285
|
+
where
|
|
286
|
+
T: Clone + Send + Sync + 'static,
|
|
287
|
+
U: AsRef<str> + Into<String>,
|
|
288
|
+
{
|
|
289
|
+
/// Create a new processor with lifetime and generic constraints.
|
|
290
|
+
pub fn new(data: &'a [T]) -> Self {
|
|
291
|
+
Self {
|
|
292
|
+
data,
|
|
293
|
+
lookup: HashMap::new(),
|
|
294
|
+
phantom: PhantomData,
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/// Async function with complex generic processing.
|
|
299
|
+
pub async fn process_with_constraints<F, R>(&mut self, processor_func: F) -> Result<Vec<R>, ProcessError>
|
|
300
|
+
where
|
|
301
|
+
F: Fn(&T) -> Result<R, ProcessError> + Send + Sync,
|
|
302
|
+
R: Clone + Send + 'static,
|
|
303
|
+
{
|
|
304
|
+
let mut results = Vec::new();
|
|
305
|
+
|
|
306
|
+
for item in self.data.iter() {
|
|
307
|
+
match processor_func(item) {
|
|
308
|
+
Ok(result) => {
|
|
309
|
+
results.push(result);
|
|
310
|
+
}
|
|
311
|
+
Err(e) => {
|
|
312
|
+
log::error!("Processing error: {:?}", e);
|
|
313
|
+
return Err(e);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
Ok(results)
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/// Trait with associated types and complex bounds.
|
|
323
|
+
pub trait DataProcessor<'a, T>: Send + Sync
|
|
324
|
+
where
|
|
325
|
+
T: Clone + Send + Sync,
|
|
326
|
+
{
|
|
327
|
+
type Output: Clone + Send;
|
|
328
|
+
type Error: std::error::Error + Send + Sync + 'static;
|
|
329
|
+
|
|
330
|
+
/// Process data with lifetime constraints.
|
|
331
|
+
fn process_data(&self, data: &'a [T]) -> Result<Self::Output, Self::Error>;
|
|
332
|
+
|
|
333
|
+
/// Async processing method with complex constraints.
|
|
334
|
+
async fn async_process<F>(&self, data: &'a [T], mapper: F) -> Result<Vec<Self::Output>, Self::Error>
|
|
335
|
+
where
|
|
336
|
+
F: Fn(&T) -> Result<Self::Output, Self::Error> + Send + Sync;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/// Function with higher-ranked trait bounds (HRTB).
|
|
340
|
+
pub fn apply_closure<F>(data: &[String], func: F) -> Vec<String>
|
|
341
|
+
where
|
|
342
|
+
F: for<'a> Fn(&'a str) -> String,
|
|
343
|
+
{
|
|
344
|
+
data.iter()
|
|
345
|
+
.map(|s| func(s.as_str()))
|
|
346
|
+
.collect()
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/// Complex match expression with patterns and guards.
|
|
350
|
+
pub fn pattern_matching_example<T>(value: Option<Result<T, String>>) -> String
|
|
351
|
+
where
|
|
352
|
+
T: std::fmt::Display,
|
|
353
|
+
{
|
|
354
|
+
match value {
|
|
355
|
+
Some(Ok(val)) if val.to_string().len() > 5 => {
|
|
356
|
+
format!("Long value: {}", val)
|
|
357
|
+
}
|
|
358
|
+
Some(Ok(val)) => {
|
|
359
|
+
format!("Short value: {}", val)
|
|
360
|
+
}
|
|
361
|
+
Some(Err(e)) if e.contains("critical") => {
|
|
362
|
+
format!("Critical error: {}", e)
|
|
363
|
+
}
|
|
364
|
+
Some(Err(e)) => {
|
|
365
|
+
format!("Error: {}", e)
|
|
366
|
+
}
|
|
367
|
+
None => {
|
|
368
|
+
"No value provided".to_string()
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
"#;
|
|
373
|
+
|
|
374
|
+
fs::write(&test_file, content)?;
|
|
375
|
+
|
|
376
|
+
let ctx = TestContext::new();
|
|
377
|
+
let output = ctx.run_probe(&[
|
|
378
|
+
"search",
|
|
379
|
+
"ComplexProcessor", // Search for the complex struct
|
|
380
|
+
test_file.to_str().unwrap(),
|
|
381
|
+
"--format",
|
|
382
|
+
"outline",
|
|
383
|
+
])?;
|
|
384
|
+
|
|
385
|
+
// Should find complex Rust constructs
|
|
386
|
+
assert!(
|
|
387
|
+
output.contains("ComplexProcessor") || output.contains("where"),
|
|
388
|
+
"Missing complex generic structures - output: {}",
|
|
389
|
+
output
|
|
390
|
+
);
|
|
391
|
+
|
|
392
|
+
// Should handle complex generic syntax properly in outline format
|
|
393
|
+
assert!(
|
|
394
|
+
output.contains("---\nFile:"),
|
|
395
|
+
"Missing file delimiter in outline format - output: {}",
|
|
396
|
+
output
|
|
397
|
+
);
|
|
398
|
+
|
|
399
|
+
// Should be in outline format with proper structure
|
|
400
|
+
assert!(
|
|
401
|
+
output.contains("Found") && output.contains("search results"),
|
|
402
|
+
"Missing search results summary - output: {}",
|
|
403
|
+
output
|
|
404
|
+
);
|
|
405
|
+
|
|
406
|
+
Ok(())
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
#[test]
|
|
410
|
+
fn test_rust_outline_nested_control_flow_closing_braces() -> Result<()> {
|
|
411
|
+
let temp_dir = TempDir::new()?;
|
|
412
|
+
let test_file = temp_dir.path().join("nested_control_flow.rs");
|
|
413
|
+
|
|
414
|
+
let content = r#"/// Function with deeply nested control flow structures.
|
|
415
|
+
pub fn deeply_nested_processing(data: &[ProcessingItem]) -> ProcessingResult {
|
|
416
|
+
let mut result = ProcessingResult::new();
|
|
417
|
+
|
|
418
|
+
// Level 1: Main iteration
|
|
419
|
+
for (outer_index, item) in data.iter().enumerate() {
|
|
420
|
+
if item.is_valid() {
|
|
421
|
+
// Level 2: Category processing
|
|
422
|
+
match item.category {
|
|
423
|
+
Category::TypeA => {
|
|
424
|
+
// Level 3: Sub-category processing
|
|
425
|
+
for sub_item in &item.sub_items {
|
|
426
|
+
if sub_item.weight > 10.0 {
|
|
427
|
+
// Level 4: Weight-based processing
|
|
428
|
+
match sub_item.processing_type {
|
|
429
|
+
ProcessingType::Intensive => {
|
|
430
|
+
// Level 5: Intensive processing branch
|
|
431
|
+
if sub_item.requires_validation {
|
|
432
|
+
while !sub_item.is_validated() {
|
|
433
|
+
sub_item.validate();
|
|
434
|
+
if sub_item.validation_attempts > MAX_ATTEMPTS {
|
|
435
|
+
break;
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
result.add_intensive_result(sub_item.process());
|
|
440
|
+
}
|
|
441
|
+
ProcessingType::Standard => {
|
|
442
|
+
result.add_standard_result(sub_item.process());
|
|
443
|
+
}
|
|
444
|
+
ProcessingType::Quick => {
|
|
445
|
+
result.add_quick_result(sub_item.quick_process());
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
} else {
|
|
449
|
+
// Light-weight item processing
|
|
450
|
+
result.add_lightweight_result(sub_item.lightweight_process());
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
Category::TypeB => {
|
|
455
|
+
// Different processing path for TypeB
|
|
456
|
+
for (index, sub_item) in item.sub_items.iter().enumerate() {
|
|
457
|
+
if index % 2 == 0 {
|
|
458
|
+
// Even index processing
|
|
459
|
+
result.add_even_result(sub_item.process_even());
|
|
460
|
+
} else {
|
|
461
|
+
// Odd index processing
|
|
462
|
+
result.add_odd_result(sub_item.process_odd());
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
Category::TypeC => {
|
|
467
|
+
// TypeC has special processing requirements
|
|
468
|
+
let mut batch_processor = BatchProcessor::new();
|
|
469
|
+
loop {
|
|
470
|
+
let batch = item.get_next_batch();
|
|
471
|
+
if batch.is_empty() {
|
|
472
|
+
break;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
for batch_item in batch {
|
|
476
|
+
if batch_item.needs_special_handling() {
|
|
477
|
+
match batch_item.special_type {
|
|
478
|
+
SpecialType::Critical => {
|
|
479
|
+
result.add_critical_result(batch_item.critical_process());
|
|
480
|
+
}
|
|
481
|
+
SpecialType::Urgent => {
|
|
482
|
+
result.add_urgent_result(batch_item.urgent_process());
|
|
483
|
+
}
|
|
484
|
+
SpecialType::Normal => {
|
|
485
|
+
result.add_normal_result(batch_item.normal_process());
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
batch_processor.process_batch(batch);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
} else {
|
|
496
|
+
// Invalid item handling
|
|
497
|
+
result.add_error(format!("Invalid item at index {}", outer_index));
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
result
|
|
502
|
+
}
|
|
503
|
+
"#;
|
|
504
|
+
|
|
505
|
+
fs::write(&test_file, content)?;
|
|
506
|
+
|
|
507
|
+
let ctx = TestContext::new();
|
|
508
|
+
let output = ctx.run_probe(&[
|
|
509
|
+
"search",
|
|
510
|
+
"nested_processing", // Search for the function
|
|
511
|
+
test_file.to_str().unwrap(),
|
|
512
|
+
"--format",
|
|
513
|
+
"outline",
|
|
514
|
+
])?;
|
|
515
|
+
|
|
516
|
+
// Should find the deeply nested function
|
|
517
|
+
assert!(
|
|
518
|
+
output.contains("deeply_nested_processing"),
|
|
519
|
+
"Missing deeply nested function - output: {}",
|
|
520
|
+
output
|
|
521
|
+
);
|
|
522
|
+
|
|
523
|
+
// The function should be shown with all its nested structure
|
|
524
|
+
// Note: Closing brace comments only appear when there are gaps (ellipsis) in the outline
|
|
525
|
+
// If the entire function is shown, no closing brace comments are needed
|
|
526
|
+
let has_complete_function = !output.contains("...");
|
|
527
|
+
let has_closing_brace_comments = output.contains("} //") || output.contains("} /*");
|
|
528
|
+
|
|
529
|
+
// Either we should see closing brace comments (if there are gaps)
|
|
530
|
+
// OR we should see the complete function (if no gaps)
|
|
531
|
+
assert!(
|
|
532
|
+
has_closing_brace_comments || has_complete_function,
|
|
533
|
+
"Should either have closing brace comments (with gaps) or show complete function (no gaps) - output: {}",
|
|
534
|
+
output
|
|
535
|
+
);
|
|
536
|
+
|
|
537
|
+
// Should show nested control flow keywords
|
|
538
|
+
let control_flow_count = output.matches("for ").count()
|
|
539
|
+
+ output.matches("if ").count()
|
|
540
|
+
+ output.matches("match ").count()
|
|
541
|
+
+ output.matches("while ").count()
|
|
542
|
+
+ output.matches("loop").count();
|
|
543
|
+
assert!(
|
|
544
|
+
control_flow_count >= 3,
|
|
545
|
+
"Should show multiple nested control flow keywords - output: {}",
|
|
546
|
+
output
|
|
547
|
+
);
|
|
548
|
+
|
|
549
|
+
Ok(())
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
#[test]
|
|
553
|
+
fn test_rust_outline_small_functions_no_closing_brace_comments() -> Result<()> {
|
|
554
|
+
let temp_dir = TempDir::new()?;
|
|
555
|
+
let test_file = temp_dir.path().join("small_functions.rs");
|
|
556
|
+
|
|
557
|
+
let content = r#"/// Small helper function - should not have closing brace comments.
|
|
558
|
+
pub fn small_helper(x: i32) -> i32 {
|
|
559
|
+
x * 2
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
/// Another small function - also should not have closing brace comments.
|
|
563
|
+
pub fn another_small_function(s: &str) -> String {
|
|
564
|
+
s.to_uppercase()
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
/// Small function with a few lines - still should not have closing brace comments.
|
|
568
|
+
pub fn small_with_few_lines(data: &[i32]) -> i32 {
|
|
569
|
+
let sum: i32 = data.iter().sum();
|
|
570
|
+
let count = data.len() as i32;
|
|
571
|
+
if count > 0 {
|
|
572
|
+
sum / count
|
|
573
|
+
} else {
|
|
574
|
+
0
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
/// Utility function - very small.
|
|
579
|
+
pub fn utility_function(a: i32, b: i32) -> i32 {
|
|
580
|
+
a + b
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
/// Simple validation function.
|
|
584
|
+
pub fn validate_input(input: &str) -> bool {
|
|
585
|
+
!input.is_empty() && input.len() < 100
|
|
586
|
+
}
|
|
587
|
+
"#;
|
|
588
|
+
|
|
589
|
+
fs::write(&test_file, content)?;
|
|
590
|
+
|
|
591
|
+
let ctx = TestContext::new();
|
|
592
|
+
let output = ctx.run_probe(&[
|
|
593
|
+
"search",
|
|
594
|
+
"small", // Search for small functions
|
|
595
|
+
test_file.to_str().unwrap(),
|
|
596
|
+
"--format",
|
|
597
|
+
"outline",
|
|
598
|
+
])?;
|
|
599
|
+
|
|
600
|
+
// Should find the small functions
|
|
601
|
+
assert!(
|
|
602
|
+
output.contains("small_helper") || output.contains("small_function"),
|
|
603
|
+
"Missing small functions - output: {}",
|
|
604
|
+
output
|
|
605
|
+
);
|
|
606
|
+
|
|
607
|
+
// Small functions should NOT have closing brace comments
|
|
608
|
+
let has_closing_brace_comment = output.contains("} //") || output.contains("} /*");
|
|
609
|
+
assert!(
|
|
610
|
+
!has_closing_brace_comment,
|
|
611
|
+
"Small functions should NOT have closing brace comments - output: {}",
|
|
612
|
+
output
|
|
613
|
+
);
|
|
614
|
+
|
|
615
|
+
// Should be in outline format
|
|
616
|
+
assert!(
|
|
617
|
+
output.contains("---\nFile:"),
|
|
618
|
+
"Missing file delimiter in outline format - output: {}",
|
|
619
|
+
output
|
|
620
|
+
);
|
|
621
|
+
|
|
622
|
+
Ok(())
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
#[test]
|
|
626
|
+
fn test_rust_outline_keyword_highlighting_preservation() -> Result<()> {
|
|
627
|
+
let temp_dir = TempDir::new()?;
|
|
628
|
+
let test_file = temp_dir.path().join("keyword_highlighting.rs");
|
|
629
|
+
|
|
630
|
+
let content = r#"use std::sync::Arc;
|
|
631
|
+
|
|
632
|
+
/// Function containing the search term "synchronization" in multiple contexts.
|
|
633
|
+
pub fn advanced_synchronization_handler() -> SyncResult {
|
|
634
|
+
let synchronization_config = SyncConfig {
|
|
635
|
+
timeout: Duration::from_secs(30),
|
|
636
|
+
retry_attempts: 3,
|
|
637
|
+
enable_synchronization_logging: true,
|
|
638
|
+
};
|
|
639
|
+
|
|
640
|
+
// Synchronization logic with multiple references
|
|
641
|
+
if synchronization_config.enable_synchronization_logging {
|
|
642
|
+
log::info!("Starting synchronization process");
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
let sync_manager = SyncManager::new(synchronization_config);
|
|
646
|
+
sync_manager.perform_synchronization()
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
/// Another function with synchronization in comments and code.
|
|
650
|
+
pub fn background_synchronization_worker() {
|
|
651
|
+
// This function handles background synchronization tasks
|
|
652
|
+
// The synchronization process is critical for data consistency
|
|
653
|
+
|
|
654
|
+
loop {
|
|
655
|
+
match synchronization_queue.pop() {
|
|
656
|
+
Some(task) => {
|
|
657
|
+
// Process synchronization task
|
|
658
|
+
task.execute_synchronization();
|
|
659
|
+
}
|
|
660
|
+
None => {
|
|
661
|
+
// No synchronization tasks pending
|
|
662
|
+
thread::sleep(Duration::from_millis(100));
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
/// Complex function with synchronization in various contexts.
|
|
669
|
+
pub fn multi_context_synchronization() {
|
|
670
|
+
let synchronization_items = vec![
|
|
671
|
+
"user_data_synchronization",
|
|
672
|
+
"config_synchronization",
|
|
673
|
+
"cache_synchronization",
|
|
674
|
+
"backup_synchronization"
|
|
675
|
+
];
|
|
676
|
+
|
|
677
|
+
for item in synchronization_items {
|
|
678
|
+
println!("Processing synchronization for: {}", item);
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
"#;
|
|
682
|
+
|
|
683
|
+
fs::write(&test_file, content)?;
|
|
684
|
+
|
|
685
|
+
let ctx = TestContext::new();
|
|
686
|
+
let output = ctx.run_probe(&[
|
|
687
|
+
"search",
|
|
688
|
+
"synchronization", // Search term that appears multiple times
|
|
689
|
+
test_file.to_str().unwrap(),
|
|
690
|
+
"--format",
|
|
691
|
+
"outline",
|
|
692
|
+
])?;
|
|
693
|
+
|
|
694
|
+
// Should find functions containing synchronization
|
|
695
|
+
assert!(
|
|
696
|
+
output.contains("synchronization_handler") || output.contains("synchronization_worker"),
|
|
697
|
+
"Missing functions with synchronization - output: {}",
|
|
698
|
+
output
|
|
699
|
+
);
|
|
700
|
+
|
|
701
|
+
// Should contain the search keyword multiple times (highlighted)
|
|
702
|
+
let synchronization_count = output.matches("synchronization").count();
|
|
703
|
+
assert!(
|
|
704
|
+
synchronization_count >= 3,
|
|
705
|
+
"Should preserve synchronization keyword multiple times - found {}, output: {}",
|
|
706
|
+
synchronization_count,
|
|
707
|
+
output
|
|
708
|
+
);
|
|
709
|
+
|
|
710
|
+
// Should be in outline format
|
|
711
|
+
assert!(
|
|
712
|
+
output.contains("---\nFile:"),
|
|
713
|
+
"Missing file delimiter in outline format - output: {}",
|
|
714
|
+
output
|
|
715
|
+
);
|
|
716
|
+
|
|
717
|
+
// Should have search results summary
|
|
718
|
+
assert!(
|
|
719
|
+
output.contains("Found") && output.contains("search results"),
|
|
720
|
+
"Missing search results summary - output: {}",
|
|
721
|
+
output
|
|
722
|
+
);
|
|
723
|
+
|
|
724
|
+
Ok(())
|
|
725
|
+
}
|