@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,768 @@
|
|
|
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_php_outline_basic_symbols() -> Result<()> {
|
|
10
|
+
let temp_dir = TempDir::new()?;
|
|
11
|
+
let test_file = temp_dir.path().join("Calculator.php");
|
|
12
|
+
|
|
13
|
+
let content = r#"<?php
|
|
14
|
+
|
|
15
|
+
namespace Calculator;
|
|
16
|
+
|
|
17
|
+
use Exception;
|
|
18
|
+
use InvalidArgumentException;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Calculator interface defining basic arithmetic operations
|
|
22
|
+
*/
|
|
23
|
+
interface CalculatorInterface
|
|
24
|
+
{
|
|
25
|
+
public function add(float $x, float $y): float;
|
|
26
|
+
public function subtract(float $x, float $y): float;
|
|
27
|
+
public function multiply(float $x, float $y): float;
|
|
28
|
+
public function divide(float $x, float $y): float;
|
|
29
|
+
public function getHistory(): array;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Abstract base calculator with common functionality
|
|
34
|
+
*/
|
|
35
|
+
abstract class BaseCalculator implements CalculatorInterface
|
|
36
|
+
{
|
|
37
|
+
protected string $name;
|
|
38
|
+
protected array $history = [];
|
|
39
|
+
protected int $precision;
|
|
40
|
+
|
|
41
|
+
public function __construct(string $name, int $precision = 2)
|
|
42
|
+
{
|
|
43
|
+
$this->name = $name;
|
|
44
|
+
$this->precision = $precision;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
protected function recordOperation(float $result): void
|
|
48
|
+
{
|
|
49
|
+
$this->history[] = round($result, $this->precision);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
public function getHistory(): array
|
|
53
|
+
{
|
|
54
|
+
return $this->history;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
public function getName(): string
|
|
58
|
+
{
|
|
59
|
+
return $this->name;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
public function clearHistory(): void
|
|
63
|
+
{
|
|
64
|
+
$this->history = [];
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
abstract public function getOperationsCount(): int;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Advanced calculator implementation with modern PHP features
|
|
72
|
+
*/
|
|
73
|
+
class AdvancedCalculator extends BaseCalculator
|
|
74
|
+
{
|
|
75
|
+
private const DEFAULT_PRECISION = 0.001;
|
|
76
|
+
private const SUPPORTED_OPERATIONS = ['add', 'subtract', 'multiply', 'divide'];
|
|
77
|
+
|
|
78
|
+
private array $constants;
|
|
79
|
+
private int $operationsCount = 0;
|
|
80
|
+
|
|
81
|
+
public function __construct(string $name, int $precision = 2)
|
|
82
|
+
{
|
|
83
|
+
parent::__construct($name, $precision);
|
|
84
|
+
$this->initializeConstants();
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
private function initializeConstants(): void
|
|
88
|
+
{
|
|
89
|
+
$this->constants = [
|
|
90
|
+
'PI' => M_PI,
|
|
91
|
+
'E' => M_E,
|
|
92
|
+
'GOLDEN_RATIO' => (1 + sqrt(5)) / 2,
|
|
93
|
+
];
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
public function add(float $x, float $y): float
|
|
97
|
+
{
|
|
98
|
+
$result = $x + $y;
|
|
99
|
+
$this->recordOperation($result);
|
|
100
|
+
$this->operationsCount++;
|
|
101
|
+
return $result;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
public function subtract(float $x, float $y): float
|
|
105
|
+
{
|
|
106
|
+
$result = $x - $y;
|
|
107
|
+
$this->recordOperation($result);
|
|
108
|
+
$this->operationsCount++;
|
|
109
|
+
return $result;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
public function multiply(float $x, float $y): float
|
|
113
|
+
{
|
|
114
|
+
$result = $x * $y;
|
|
115
|
+
$this->recordOperation($result);
|
|
116
|
+
$this->operationsCount++;
|
|
117
|
+
return $result;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
public function divide(float $x, float $y): float
|
|
121
|
+
{
|
|
122
|
+
if (abs($y) < self::DEFAULT_PRECISION) {
|
|
123
|
+
throw new InvalidArgumentException('Division by zero');
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
$result = $x / $y;
|
|
127
|
+
$this->recordOperation($result);
|
|
128
|
+
$this->operationsCount++;
|
|
129
|
+
return $result;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
public function getOperationsCount(): int
|
|
133
|
+
{
|
|
134
|
+
return $this->operationsCount;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Process an array of numbers with a callback
|
|
139
|
+
*/
|
|
140
|
+
public function processNumbers(array $numbers, callable $callback): array
|
|
141
|
+
{
|
|
142
|
+
return array_map($callback, array_filter($numbers, 'is_numeric'));
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Transform history using a callback
|
|
147
|
+
*/
|
|
148
|
+
public function transformHistory(callable $transformer): array
|
|
149
|
+
{
|
|
150
|
+
return array_map($transformer, $this->history);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Get constant value by name
|
|
155
|
+
*/
|
|
156
|
+
public function getConstant(string $name): ?float
|
|
157
|
+
{
|
|
158
|
+
return $this->constants[$name] ?? null;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Static factory method
|
|
163
|
+
*/
|
|
164
|
+
public static function createWithDefaults(string $name): self
|
|
165
|
+
{
|
|
166
|
+
return new self($name);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Magic method for dynamic operation calls
|
|
171
|
+
*/
|
|
172
|
+
public function __call(string $method, array $arguments): float
|
|
173
|
+
{
|
|
174
|
+
if (in_array($method, self::SUPPORTED_OPERATIONS, true)) {
|
|
175
|
+
return $this->$method(...$arguments);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
throw new InvalidArgumentException("Unsupported operation: {$method}");
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Scientific calculator with advanced mathematical functions
|
|
184
|
+
*/
|
|
185
|
+
class ScientificCalculator extends AdvancedCalculator
|
|
186
|
+
{
|
|
187
|
+
public function sin(float $x): float
|
|
188
|
+
{
|
|
189
|
+
$result = sin($x);
|
|
190
|
+
$this->recordOperation($result);
|
|
191
|
+
return $result;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
public function cos(float $x): float
|
|
195
|
+
{
|
|
196
|
+
$result = cos($x);
|
|
197
|
+
$this->recordOperation($result);
|
|
198
|
+
return $result;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
public function tan(float $x): float
|
|
202
|
+
{
|
|
203
|
+
$result = tan($x);
|
|
204
|
+
$this->recordOperation($result);
|
|
205
|
+
return $result;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
public function log(float $x, float $base = M_E): float
|
|
209
|
+
{
|
|
210
|
+
if ($x <= 0) {
|
|
211
|
+
throw new InvalidArgumentException('Cannot take log of zero or negative number');
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
$result = log($x) / log($base);
|
|
215
|
+
$this->recordOperation($result);
|
|
216
|
+
return $result;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
public function power(float $base, float $exponent): float
|
|
220
|
+
{
|
|
221
|
+
$result = pow($base, $exponent);
|
|
222
|
+
$this->recordOperation($result);
|
|
223
|
+
return $result;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
public function factorial(int $n): float
|
|
227
|
+
{
|
|
228
|
+
if ($n < 0) {
|
|
229
|
+
throw new InvalidArgumentException('Factorial of negative number');
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
$result = 1;
|
|
233
|
+
for ($i = 2; $i <= $n; $i++) {
|
|
234
|
+
$result *= $i;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
$this->recordOperation($result);
|
|
238
|
+
return $result;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Calculate statistics from history
|
|
243
|
+
*/
|
|
244
|
+
public function getStatistics(): array
|
|
245
|
+
{
|
|
246
|
+
if (empty($this->history)) {
|
|
247
|
+
return ['mean' => 0, 'median' => 0, 'std_dev' => 0];
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
$mean = array_sum($this->history) / count($this->history);
|
|
251
|
+
|
|
252
|
+
$sorted = $this->history;
|
|
253
|
+
sort($sorted);
|
|
254
|
+
$count = count($sorted);
|
|
255
|
+
$median = $count % 2 === 0
|
|
256
|
+
? ($sorted[$count / 2 - 1] + $sorted[$count / 2]) / 2
|
|
257
|
+
: $sorted[intval($count / 2)];
|
|
258
|
+
|
|
259
|
+
$variance = array_sum(array_map(
|
|
260
|
+
fn($x) => pow($x - $mean, 2),
|
|
261
|
+
$this->history
|
|
262
|
+
)) / count($this->history);
|
|
263
|
+
$stdDev = sqrt($variance);
|
|
264
|
+
|
|
265
|
+
return [
|
|
266
|
+
'mean' => $mean,
|
|
267
|
+
'median' => $median,
|
|
268
|
+
'std_dev' => $stdDev,
|
|
269
|
+
];
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Utility trait for common calculator operations
|
|
275
|
+
*/
|
|
276
|
+
trait CalculatorUtils
|
|
277
|
+
{
|
|
278
|
+
public function formatResult(float $result, int $precision = 2): string
|
|
279
|
+
{
|
|
280
|
+
return number_format($result, $precision);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
public function isValidNumber($value): bool
|
|
284
|
+
{
|
|
285
|
+
return is_numeric($value) && is_finite((float) $value);
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
public function roundToPrecision(float $value, int $precision): float
|
|
289
|
+
{
|
|
290
|
+
return round($value, $precision);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Calculator factory class
|
|
296
|
+
*/
|
|
297
|
+
class CalculatorFactory
|
|
298
|
+
{
|
|
299
|
+
use CalculatorUtils;
|
|
300
|
+
|
|
301
|
+
public static function create(string $type, string $name): CalculatorInterface
|
|
302
|
+
{
|
|
303
|
+
return match ($type) {
|
|
304
|
+
'basic' => new AdvancedCalculator($name),
|
|
305
|
+
'scientific' => new ScientificCalculator($name),
|
|
306
|
+
default => throw new InvalidArgumentException("Unknown calculator type: {$type}"),
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
public static function createFromConfig(array $config): CalculatorInterface
|
|
311
|
+
{
|
|
312
|
+
$type = $config['type'] ?? 'basic';
|
|
313
|
+
$name = $config['name'] ?? 'Default Calculator';
|
|
314
|
+
$precision = $config['precision'] ?? 2;
|
|
315
|
+
|
|
316
|
+
$calculator = self::create($type, $name);
|
|
317
|
+
|
|
318
|
+
if (method_exists($calculator, 'setPrecision')) {
|
|
319
|
+
$calculator->setPrecision($precision);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
return $calculator;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Demo class showcasing calculator functionality
|
|
328
|
+
*/
|
|
329
|
+
class CalculatorDemo
|
|
330
|
+
{
|
|
331
|
+
public static function run(): void
|
|
332
|
+
{
|
|
333
|
+
echo "Calculator Demo\n";
|
|
334
|
+
echo "===============\n";
|
|
335
|
+
|
|
336
|
+
$calc = ScientificCalculator::createWithDefaults('Demo Calculator');
|
|
337
|
+
|
|
338
|
+
try {
|
|
339
|
+
echo "Basic operations:\n";
|
|
340
|
+
echo "10 + 5 = " . $calc->add(10, 5) . "\n";
|
|
341
|
+
echo "20 * 3 = " . $calc->multiply(20, 3) . "\n";
|
|
342
|
+
echo "100 / 4 = " . $calc->divide(100, 4) . "\n";
|
|
343
|
+
|
|
344
|
+
echo "\nScientific operations:\n";
|
|
345
|
+
echo "sin(π/2) = " . $calc->sin(M_PI / 2) . "\n";
|
|
346
|
+
echo "5! = " . $calc->factorial(5) . "\n";
|
|
347
|
+
|
|
348
|
+
echo "\nStatistics:\n";
|
|
349
|
+
$stats = $calc->getStatistics();
|
|
350
|
+
echo "Mean: " . $stats['mean'] . "\n";
|
|
351
|
+
echo "Median: " . $stats['median'] . "\n";
|
|
352
|
+
|
|
353
|
+
echo "\nHistory: " . implode(', ', $calc->getHistory()) . "\n";
|
|
354
|
+
|
|
355
|
+
} catch (Exception $e) {
|
|
356
|
+
echo "Error: " . $e->getMessage() . "\n";
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// Test functions
|
|
362
|
+
function testBasicCalculator(): void
|
|
363
|
+
{
|
|
364
|
+
$calc = new AdvancedCalculator('Test Calculator');
|
|
365
|
+
|
|
366
|
+
$result = $calc->add(2, 3);
|
|
367
|
+
if ($result !== 5.0) {
|
|
368
|
+
throw new Exception('Add test failed');
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
$result = $calc->multiply(4, 5);
|
|
372
|
+
if ($result !== 20.0) {
|
|
373
|
+
throw new Exception('Multiply test failed');
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
echo "Basic calculator tests passed\n";
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
function testScientificCalculator(): void
|
|
380
|
+
{
|
|
381
|
+
$calc = new ScientificCalculator('Scientific Test');
|
|
382
|
+
|
|
383
|
+
$result = $calc->power(2, 3);
|
|
384
|
+
if ($result !== 8.0) {
|
|
385
|
+
throw new Exception('Power test failed');
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
$result = $calc->factorial(4);
|
|
389
|
+
if ($result !== 24.0) {
|
|
390
|
+
throw new Exception('Factorial test failed');
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
echo "Scientific calculator tests passed\n";
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
// Run demo if this file is executed directly
|
|
397
|
+
if (basename(__FILE__) === basename($_SERVER['SCRIPT_NAME'])) {
|
|
398
|
+
CalculatorDemo::run();
|
|
399
|
+
testBasicCalculator();
|
|
400
|
+
testScientificCalculator();
|
|
401
|
+
}
|
|
402
|
+
"#;
|
|
403
|
+
|
|
404
|
+
fs::write(&test_file, content)?;
|
|
405
|
+
|
|
406
|
+
let ctx = TestContext::new();
|
|
407
|
+
let output = ctx.run_probe(&[
|
|
408
|
+
"search",
|
|
409
|
+
"Calculator",
|
|
410
|
+
test_file.to_str().unwrap(),
|
|
411
|
+
"--format",
|
|
412
|
+
"outline",
|
|
413
|
+
"--allow-tests",
|
|
414
|
+
"--max-results",
|
|
415
|
+
"50",
|
|
416
|
+
])?;
|
|
417
|
+
|
|
418
|
+
// Verify PHP symbols are extracted (flexible matching for outline format)
|
|
419
|
+
let has_interface = output.contains("interface") || output.contains("CalculatorInterface");
|
|
420
|
+
let has_base_class = output.contains("BaseCalculator") || output.contains("abstract");
|
|
421
|
+
let has_advanced_calc = output.contains("AdvancedCalculator") || output.contains("class");
|
|
422
|
+
let has_scientific = output.contains("ScientificCalculator") || output.contains("Calculator");
|
|
423
|
+
let has_functions = output.contains("function") || output.contains("test");
|
|
424
|
+
|
|
425
|
+
// At least some PHP structures should be present in outline format
|
|
426
|
+
let php_structures_count = [
|
|
427
|
+
has_interface,
|
|
428
|
+
has_base_class,
|
|
429
|
+
has_advanced_calc,
|
|
430
|
+
has_scientific,
|
|
431
|
+
has_functions,
|
|
432
|
+
]
|
|
433
|
+
.iter()
|
|
434
|
+
.filter(|&&x| x)
|
|
435
|
+
.count();
|
|
436
|
+
|
|
437
|
+
assert!(
|
|
438
|
+
php_structures_count >= 2,
|
|
439
|
+
"Should find at least 2 PHP structures in outline format, found {} structures. Output: {}",
|
|
440
|
+
php_structures_count,
|
|
441
|
+
output
|
|
442
|
+
);
|
|
443
|
+
|
|
444
|
+
Ok(())
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
#[test]
|
|
448
|
+
fn test_php_outline_closing_brace_comments() -> Result<()> {
|
|
449
|
+
let temp_dir = TempDir::new()?;
|
|
450
|
+
let test_file = temp_dir.path().join("large_class.php");
|
|
451
|
+
|
|
452
|
+
let content = r#"<?php
|
|
453
|
+
|
|
454
|
+
namespace App\Services;
|
|
455
|
+
|
|
456
|
+
use Exception;
|
|
457
|
+
use InvalidArgumentException;
|
|
458
|
+
|
|
459
|
+
class LargeDataProcessor
|
|
460
|
+
{
|
|
461
|
+
private array $config;
|
|
462
|
+
private string $status;
|
|
463
|
+
private int $processedCount = 0;
|
|
464
|
+
|
|
465
|
+
public function __construct(array $config)
|
|
466
|
+
{
|
|
467
|
+
$this->config = $config;
|
|
468
|
+
$this->status = 'initialized';
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
public function processLargeDataSet(array $data): array
|
|
472
|
+
{
|
|
473
|
+
$results = [];
|
|
474
|
+
$batchSize = $this->config['batch_size'] ?? 100;
|
|
475
|
+
|
|
476
|
+
foreach ($data as $index => $item) {
|
|
477
|
+
if (!$this->validateItem($item)) {
|
|
478
|
+
continue;
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
try {
|
|
482
|
+
$processed = $this->transformItem($item);
|
|
483
|
+
$results[] = $processed;
|
|
484
|
+
$this->processedCount++;
|
|
485
|
+
|
|
486
|
+
if ($this->processedCount % $batchSize === 0) {
|
|
487
|
+
$this->logProgress();
|
|
488
|
+
}
|
|
489
|
+
} catch (Exception $e) {
|
|
490
|
+
$this->handleError($e, $item);
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
$this->status = 'completed';
|
|
495
|
+
return $results;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
private function validateItem($item): bool
|
|
499
|
+
{
|
|
500
|
+
if (!is_array($item)) {
|
|
501
|
+
return false;
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
$requiredFields = ['id', 'type', 'data'];
|
|
505
|
+
foreach ($requiredFields as $field) {
|
|
506
|
+
if (!isset($item[$field])) {
|
|
507
|
+
return false;
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
return true;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
private function transformItem(array $item): array
|
|
515
|
+
{
|
|
516
|
+
$transformed = [
|
|
517
|
+
'id' => (int) $item['id'],
|
|
518
|
+
'type' => strtolower($item['type']),
|
|
519
|
+
'processed_at' => date('Y-m-d H:i:s'),
|
|
520
|
+
];
|
|
521
|
+
|
|
522
|
+
if (isset($item['metadata'])) {
|
|
523
|
+
$transformed['metadata'] = $this->processMetadata($item['metadata']);
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
return $transformed;
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
private function processMetadata(array $metadata): array
|
|
530
|
+
{
|
|
531
|
+
$processed = [];
|
|
532
|
+
|
|
533
|
+
foreach ($metadata as $key => $value) {
|
|
534
|
+
if (is_string($value)) {
|
|
535
|
+
$processed[$key] = trim($value);
|
|
536
|
+
} elseif (is_numeric($value)) {
|
|
537
|
+
$processed[$key] = (float) $value;
|
|
538
|
+
} else {
|
|
539
|
+
$processed[$key] = $value;
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
return $processed;
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
function smallFunction(): string
|
|
548
|
+
{
|
|
549
|
+
return 'small';
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
function mediumFunction(array $data): array
|
|
553
|
+
{
|
|
554
|
+
$result = [];
|
|
555
|
+
foreach ($data as $item) {
|
|
556
|
+
$result[] = strtoupper($item);
|
|
557
|
+
}
|
|
558
|
+
return $result;
|
|
559
|
+
}
|
|
560
|
+
"#;
|
|
561
|
+
|
|
562
|
+
fs::write(&test_file, content)?;
|
|
563
|
+
|
|
564
|
+
let ctx = TestContext::new();
|
|
565
|
+
let output = ctx.run_probe(&[
|
|
566
|
+
"search",
|
|
567
|
+
"class|function",
|
|
568
|
+
test_file.to_str().unwrap(),
|
|
569
|
+
"--format",
|
|
570
|
+
"outline",
|
|
571
|
+
])?;
|
|
572
|
+
|
|
573
|
+
// Verify we get search results for large classes and functions
|
|
574
|
+
let has_large_class = output.contains("LargeDataProcessor") || output.contains("class");
|
|
575
|
+
let has_large_method = output.contains("processLargeDataSet") || output.contains("function");
|
|
576
|
+
|
|
577
|
+
assert!(
|
|
578
|
+
has_large_class,
|
|
579
|
+
"Should find large class in search results - output: {}",
|
|
580
|
+
output
|
|
581
|
+
);
|
|
582
|
+
|
|
583
|
+
assert!(
|
|
584
|
+
has_large_method,
|
|
585
|
+
"Should find large method in search results - output: {}",
|
|
586
|
+
output
|
|
587
|
+
);
|
|
588
|
+
|
|
589
|
+
// Note: Closing brace comments are a feature of the outline format,
|
|
590
|
+
// but may not always appear in search results depending on the context shown.
|
|
591
|
+
|
|
592
|
+
// Small functions should NOT have closing brace comments
|
|
593
|
+
let small_function_section = output.split("smallFunction").last().unwrap_or("");
|
|
594
|
+
let small_section_before_next = small_function_section
|
|
595
|
+
.split("mediumFunction")
|
|
596
|
+
.next()
|
|
597
|
+
.unwrap_or(small_function_section);
|
|
598
|
+
|
|
599
|
+
assert!(
|
|
600
|
+
!small_section_before_next.contains("// function smallFunction")
|
|
601
|
+
&& !small_section_before_next.contains("// smallFunction"),
|
|
602
|
+
"Small function should NOT have closing brace comment - output: {}",
|
|
603
|
+
output
|
|
604
|
+
);
|
|
605
|
+
|
|
606
|
+
Ok(())
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
#[test]
|
|
610
|
+
fn test_php_outline_keyword_highlighting() -> Result<()> {
|
|
611
|
+
let temp_dir = TempDir::new()?;
|
|
612
|
+
let test_file = temp_dir.path().join("keyword_test.php");
|
|
613
|
+
|
|
614
|
+
let content = r#"<?php
|
|
615
|
+
|
|
616
|
+
namespace App\Search;
|
|
617
|
+
|
|
618
|
+
use Exception;
|
|
619
|
+
|
|
620
|
+
class SearchEngine
|
|
621
|
+
{
|
|
622
|
+
private array $keywords = ['search', 'index', 'query', 'result'];
|
|
623
|
+
|
|
624
|
+
public function searchDocuments(string $query): array
|
|
625
|
+
{
|
|
626
|
+
$searchTerms = explode(' ', $query);
|
|
627
|
+
$results = [];
|
|
628
|
+
|
|
629
|
+
foreach ($searchTerms as $term) {
|
|
630
|
+
if (in_array($term, $this->keywords)) {
|
|
631
|
+
$results[] = $this->findMatches($term);
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
return array_merge(...$results);
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
private function findMatches(string $searchTerm): array
|
|
639
|
+
{
|
|
640
|
+
// This function would search for matches
|
|
641
|
+
return ['match1', 'match2', 'searchTerm' => $searchTerm];
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
"#;
|
|
645
|
+
|
|
646
|
+
fs::write(&test_file, content)?;
|
|
647
|
+
|
|
648
|
+
let ctx = TestContext::new();
|
|
649
|
+
let output = ctx.run_probe(&[
|
|
650
|
+
"search",
|
|
651
|
+
"search",
|
|
652
|
+
test_file.to_str().unwrap(),
|
|
653
|
+
"--format",
|
|
654
|
+
"outline",
|
|
655
|
+
])?;
|
|
656
|
+
|
|
657
|
+
// Should contain the search keyword in various contexts
|
|
658
|
+
assert!(
|
|
659
|
+
output.contains("search"),
|
|
660
|
+
"Output should contain 'search' keyword - output: {}",
|
|
661
|
+
output
|
|
662
|
+
);
|
|
663
|
+
|
|
664
|
+
// Should show function definitions
|
|
665
|
+
assert!(
|
|
666
|
+
output.contains("searchDocuments") || output.contains("function"),
|
|
667
|
+
"Output should contain search function - output: {}",
|
|
668
|
+
output
|
|
669
|
+
);
|
|
670
|
+
|
|
671
|
+
Ok(())
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
#[test]
|
|
675
|
+
fn test_php_outline_array_truncation_with_keywords() -> Result<()> {
|
|
676
|
+
let temp_dir = TempDir::new()?;
|
|
677
|
+
let test_file = temp_dir.path().join("large_arrays.php");
|
|
678
|
+
|
|
679
|
+
let content = r#"<?php
|
|
680
|
+
|
|
681
|
+
class DataProcessor
|
|
682
|
+
{
|
|
683
|
+
private array $config = [
|
|
684
|
+
'database' => [
|
|
685
|
+
'host' => 'localhost',
|
|
686
|
+
'port' => 3306,
|
|
687
|
+
'username' => 'user',
|
|
688
|
+
'password' => 'secret',
|
|
689
|
+
'database' => 'app_db',
|
|
690
|
+
'charset' => 'utf8mb4',
|
|
691
|
+
'search_engine' => 'mysql',
|
|
692
|
+
'indexing' => true,
|
|
693
|
+
'query_cache' => true,
|
|
694
|
+
'result_limit' => 1000,
|
|
695
|
+
],
|
|
696
|
+
'redis' => [
|
|
697
|
+
'host' => 'redis-server',
|
|
698
|
+
'port' => 6379,
|
|
699
|
+
'database' => 0,
|
|
700
|
+
'password' => null,
|
|
701
|
+
'search_ttl' => 3600,
|
|
702
|
+
'query_cache_ttl' => 1800,
|
|
703
|
+
],
|
|
704
|
+
'elasticsearch' => [
|
|
705
|
+
'hosts' => ['es1:9200', 'es2:9200'],
|
|
706
|
+
'index_name' => 'documents',
|
|
707
|
+
'search_type' => 'match',
|
|
708
|
+
'query_timeout' => 30,
|
|
709
|
+
'result_size' => 50,
|
|
710
|
+
],
|
|
711
|
+
'search_options' => [
|
|
712
|
+
'fuzzy_matching' => true,
|
|
713
|
+
'stemming' => true,
|
|
714
|
+
'stop_words' => ['the', 'and', 'or', 'but', 'search', 'query'],
|
|
715
|
+
'synonyms' => ['find' => 'search', 'lookup' => 'query'],
|
|
716
|
+
'boost_fields' => ['title' => 2.0, 'content' => 1.0],
|
|
717
|
+
],
|
|
718
|
+
];
|
|
719
|
+
|
|
720
|
+
public function search(string $term): array
|
|
721
|
+
{
|
|
722
|
+
$searchConfig = $this->config['search_options'];
|
|
723
|
+
return $this->executeSearch($term, $searchConfig);
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
private function executeSearch(string $term, array $config): array
|
|
727
|
+
{
|
|
728
|
+
return ['query' => $term, 'search_results' => []];
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
"#;
|
|
732
|
+
|
|
733
|
+
fs::write(&test_file, content)?;
|
|
734
|
+
|
|
735
|
+
let ctx = TestContext::new();
|
|
736
|
+
let output = ctx.run_probe(&[
|
|
737
|
+
"search",
|
|
738
|
+
"search",
|
|
739
|
+
test_file.to_str().unwrap(),
|
|
740
|
+
"--format",
|
|
741
|
+
"outline",
|
|
742
|
+
])?;
|
|
743
|
+
|
|
744
|
+
// Should contain the search keyword even in truncated arrays
|
|
745
|
+
assert!(
|
|
746
|
+
output.contains("search"),
|
|
747
|
+
"Output should contain 'search' keyword even in truncated arrays - output: {}",
|
|
748
|
+
output
|
|
749
|
+
);
|
|
750
|
+
|
|
751
|
+
// Should show truncation with ellipsis if arrays are large enough
|
|
752
|
+
// Note: This test may not always trigger truncation depending on the search results
|
|
753
|
+
// We just verify that the search works and contains the keyword
|
|
754
|
+
let has_truncation = output.contains("...") || output.contains("…");
|
|
755
|
+
if has_truncation {
|
|
756
|
+
println!("Array truncation detected (good!)");
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
// Should have reasonable length for outline format
|
|
760
|
+
let line_count = output.lines().count();
|
|
761
|
+
assert!(
|
|
762
|
+
line_count < 200,
|
|
763
|
+
"Output should be reasonably sized for outline format, got {} lines",
|
|
764
|
+
line_count
|
|
765
|
+
);
|
|
766
|
+
|
|
767
|
+
Ok(())
|
|
768
|
+
}
|