@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,497 @@
|
|
|
1
|
+
use roxmltree::{Document, Node};
|
|
2
|
+
use std::fs::{self, File};
|
|
3
|
+
use std::io::Write;
|
|
4
|
+
use std::path::PathBuf;
|
|
5
|
+
use std::process::Command;
|
|
6
|
+
use tempfile::TempDir;
|
|
7
|
+
// We'll use roxmltree for XML validation since xml-schema doesn't have the expected validator module
|
|
8
|
+
|
|
9
|
+
// Helper function to extract XML from command output
|
|
10
|
+
fn extract_xml_from_output(output: &str) -> &str {
|
|
11
|
+
// Find the first occurrence of '<?xml'
|
|
12
|
+
if let Some(start_index) = output.find("<?xml") {
|
|
13
|
+
// Return the substring from the first '<?xml' to the end
|
|
14
|
+
&output[start_index..]
|
|
15
|
+
} else {
|
|
16
|
+
// If no '<?xml' is found, return the original string
|
|
17
|
+
output
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// Helper function to create test files
|
|
22
|
+
fn create_test_file(dir: &TempDir, filename: &str, content: &str) -> PathBuf {
|
|
23
|
+
let file_path = dir.path().join(filename);
|
|
24
|
+
let parent_dir = file_path.parent().unwrap();
|
|
25
|
+
fs::create_dir_all(parent_dir).expect("Failed to create parent directories");
|
|
26
|
+
let mut file = File::create(&file_path).expect("Failed to create test file");
|
|
27
|
+
file.write_all(content.as_bytes())
|
|
28
|
+
.expect("Failed to write test content");
|
|
29
|
+
file_path
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Helper function to create a test directory structure with various test files
|
|
33
|
+
fn create_test_directory_structure(root_dir: &TempDir) {
|
|
34
|
+
// Create a source directory
|
|
35
|
+
let src_dir = root_dir.path().join("src");
|
|
36
|
+
fs::create_dir(&src_dir).expect("Failed to create src directory");
|
|
37
|
+
|
|
38
|
+
// Create Rust files with search terms
|
|
39
|
+
let rust_content = r#"
|
|
40
|
+
// This is a Rust file with a search term
|
|
41
|
+
fn search_function(query: &str) -> bool {
|
|
42
|
+
println!("Searching for: {}", query);
|
|
43
|
+
query.contains("search")
|
|
44
|
+
}
|
|
45
|
+
"#;
|
|
46
|
+
create_test_file(root_dir, "src/search.rs", rust_content);
|
|
47
|
+
|
|
48
|
+
// Create a JavaScript file with search terms
|
|
49
|
+
let js_content = r#"
|
|
50
|
+
// This is a JavaScript file with a search term
|
|
51
|
+
function searchFunction(query) {
|
|
52
|
+
console.log(`Searching for: ${query}`);
|
|
53
|
+
return query.includes('search');
|
|
54
|
+
}
|
|
55
|
+
"#;
|
|
56
|
+
create_test_file(root_dir, "src/search.js", js_content);
|
|
57
|
+
|
|
58
|
+
// Create a file with special characters
|
|
59
|
+
let special_chars_content = r#"
|
|
60
|
+
// This file contains special characters: "quotes", 'apostrophes', <tags>, &ersands
|
|
61
|
+
function escapeTest(input) {
|
|
62
|
+
return input.replace(/[<>&"']/g, function(c) {
|
|
63
|
+
return {
|
|
64
|
+
'<': '<',
|
|
65
|
+
'>': '>',
|
|
66
|
+
'&': '&',
|
|
67
|
+
'"': '"',
|
|
68
|
+
"'": '''
|
|
69
|
+
}[c];
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
"#;
|
|
73
|
+
create_test_file(root_dir, "src/special_chars.js", special_chars_content);
|
|
74
|
+
|
|
75
|
+
// Create a file with multiple search terms
|
|
76
|
+
let multi_term_content = r#"
|
|
77
|
+
// This file contains multiple search terms
|
|
78
|
+
function processQuery(query) {
|
|
79
|
+
// Check if the query contains multiple terms
|
|
80
|
+
const terms = query.split(' ');
|
|
81
|
+
|
|
82
|
+
// Process each term
|
|
83
|
+
return terms.map(term => {
|
|
84
|
+
return {
|
|
85
|
+
term: term,
|
|
86
|
+
isValid: validateTerm(term)
|
|
87
|
+
};
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function validateTerm(term) {
|
|
92
|
+
// Validate that the term is not empty and contains only allowed characters
|
|
93
|
+
return term.length > 0 && /^[a-zA-Z0-9_-]+$/.test(term);
|
|
94
|
+
}
|
|
95
|
+
"#;
|
|
96
|
+
create_test_file(root_dir, "src/multi_term.js", multi_term_content);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Helper function to validate XML structure
|
|
100
|
+
fn validate_xml_structure(xml_str: &str) -> Result<(), String> {
|
|
101
|
+
// Parse the XML to verify its structure
|
|
102
|
+
let doc = Document::parse(xml_str).map_err(|e| format!("Failed to parse XML: {e}"))?;
|
|
103
|
+
|
|
104
|
+
let root = doc.root_element();
|
|
105
|
+
|
|
106
|
+
// Check root element name
|
|
107
|
+
if root.tag_name().name() != "probe_results" {
|
|
108
|
+
return Err(format!(
|
|
109
|
+
"Root element should be 'probe_results', found '{}'",
|
|
110
|
+
root.tag_name().name()
|
|
111
|
+
));
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Check for summary element
|
|
115
|
+
let summary = root
|
|
116
|
+
.children()
|
|
117
|
+
.find(|n| n.is_element() && n.tag_name().name() == "summary");
|
|
118
|
+
if summary.is_none() {
|
|
119
|
+
return Err("Missing required 'summary' element".to_string());
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Check summary structure
|
|
123
|
+
if let Some(summary) = summary {
|
|
124
|
+
let count = summary
|
|
125
|
+
.children()
|
|
126
|
+
.find(|n| n.is_element() && n.tag_name().name() == "count");
|
|
127
|
+
if count.is_none() {
|
|
128
|
+
return Err("Missing required 'count' element in summary".to_string());
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
let total_bytes = summary
|
|
132
|
+
.children()
|
|
133
|
+
.find(|n| n.is_element() && n.tag_name().name() == "total_bytes");
|
|
134
|
+
if total_bytes.is_none() {
|
|
135
|
+
return Err("Missing required 'total_bytes' element in summary".to_string());
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
let total_tokens = summary
|
|
139
|
+
.children()
|
|
140
|
+
.find(|n| n.is_element() && n.tag_name().name() == "total_tokens");
|
|
141
|
+
if total_tokens.is_none() {
|
|
142
|
+
return Err("Missing required 'total_tokens' element in summary".to_string());
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Check result elements (if any)
|
|
147
|
+
let results: Vec<Node> = root
|
|
148
|
+
.children()
|
|
149
|
+
.filter(|n| n.is_element() && n.tag_name().name() == "result")
|
|
150
|
+
.collect();
|
|
151
|
+
for result in results {
|
|
152
|
+
// Check required elements in each result
|
|
153
|
+
let file = result
|
|
154
|
+
.children()
|
|
155
|
+
.find(|n| n.is_element() && n.tag_name().name() == "file");
|
|
156
|
+
if file.is_none() {
|
|
157
|
+
return Err("Missing required 'file' element in result".to_string());
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
let lines = result
|
|
161
|
+
.children()
|
|
162
|
+
.find(|n| n.is_element() && n.tag_name().name() == "lines");
|
|
163
|
+
if lines.is_none() {
|
|
164
|
+
return Err("Missing required 'lines' element in result".to_string());
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
let node_type = result
|
|
168
|
+
.children()
|
|
169
|
+
.find(|n| n.is_element() && n.tag_name().name() == "node_type");
|
|
170
|
+
if node_type.is_none() {
|
|
171
|
+
return Err("Missing required 'node_type' element in result".to_string());
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
let code = result
|
|
175
|
+
.children()
|
|
176
|
+
.find(|n| n.is_element() && n.tag_name().name() == "code");
|
|
177
|
+
if code.is_none() {
|
|
178
|
+
return Err("Missing required 'code' element in result".to_string());
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
Ok(())
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
#[test]
|
|
186
|
+
fn test_xml_schema_validation_basic() {
|
|
187
|
+
let temp_dir = TempDir::new().expect("Failed to create temp dir");
|
|
188
|
+
create_test_directory_structure(&temp_dir);
|
|
189
|
+
|
|
190
|
+
// Run the CLI with XML output format
|
|
191
|
+
let output = Command::new("cargo")
|
|
192
|
+
.args([
|
|
193
|
+
"run",
|
|
194
|
+
"--",
|
|
195
|
+
"search",
|
|
196
|
+
"search", // Pattern to search for
|
|
197
|
+
temp_dir.path().to_str().unwrap(),
|
|
198
|
+
"--format",
|
|
199
|
+
"xml",
|
|
200
|
+
])
|
|
201
|
+
.output()
|
|
202
|
+
.expect("Failed to execute command");
|
|
203
|
+
|
|
204
|
+
// Check that the command succeeded
|
|
205
|
+
assert!(output.status.success());
|
|
206
|
+
|
|
207
|
+
// Convert stdout to string
|
|
208
|
+
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
209
|
+
|
|
210
|
+
// Extract the XML part from the output
|
|
211
|
+
let xml_str = extract_xml_from_output(&stdout);
|
|
212
|
+
|
|
213
|
+
// Validate the XML structure
|
|
214
|
+
let validation_result = validate_xml_structure(xml_str);
|
|
215
|
+
assert!(
|
|
216
|
+
validation_result.is_ok(),
|
|
217
|
+
"XML output does not conform to expected structure: {:?}",
|
|
218
|
+
validation_result.err()
|
|
219
|
+
);
|
|
220
|
+
|
|
221
|
+
// Parse the XML to verify its structure
|
|
222
|
+
let doc = Document::parse(xml_str).expect("Failed to parse XML output");
|
|
223
|
+
let root = doc.root_element();
|
|
224
|
+
|
|
225
|
+
// Validate the structure of the XML output
|
|
226
|
+
assert_eq!(
|
|
227
|
+
root.tag_name().name(),
|
|
228
|
+
"probe_results",
|
|
229
|
+
"Root element should be 'probe_results'"
|
|
230
|
+
);
|
|
231
|
+
|
|
232
|
+
// Validate that there are result elements
|
|
233
|
+
let results: Vec<Node> = root
|
|
234
|
+
.children()
|
|
235
|
+
.filter(|n| n.is_element() && n.tag_name().name() == "result")
|
|
236
|
+
.collect();
|
|
237
|
+
assert!(
|
|
238
|
+
!results.is_empty(),
|
|
239
|
+
"Should have at least one result element"
|
|
240
|
+
);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
#[test]
|
|
244
|
+
fn test_xml_schema_validation_special_characters() {
|
|
245
|
+
let temp_dir = TempDir::new().expect("Failed to create temp dir");
|
|
246
|
+
create_test_directory_structure(&temp_dir);
|
|
247
|
+
|
|
248
|
+
// Run the CLI with XML output format, searching for special characters
|
|
249
|
+
let output = Command::new("cargo")
|
|
250
|
+
.args([
|
|
251
|
+
"run",
|
|
252
|
+
"--",
|
|
253
|
+
"search",
|
|
254
|
+
"special", // Pattern to search for
|
|
255
|
+
temp_dir.path().to_str().unwrap(),
|
|
256
|
+
"--format",
|
|
257
|
+
"xml",
|
|
258
|
+
])
|
|
259
|
+
.output()
|
|
260
|
+
.expect("Failed to execute command");
|
|
261
|
+
|
|
262
|
+
// Check that the command succeeded
|
|
263
|
+
assert!(output.status.success());
|
|
264
|
+
|
|
265
|
+
// Convert stdout to string
|
|
266
|
+
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
267
|
+
|
|
268
|
+
// Extract the XML part from the output
|
|
269
|
+
let xml_str = extract_xml_from_output(&stdout);
|
|
270
|
+
|
|
271
|
+
// Validate the XML structure
|
|
272
|
+
let validation_result = validate_xml_structure(xml_str);
|
|
273
|
+
assert!(
|
|
274
|
+
validation_result.is_ok(),
|
|
275
|
+
"XML output with special characters does not conform to expected structure: {:?}",
|
|
276
|
+
validation_result.err()
|
|
277
|
+
);
|
|
278
|
+
|
|
279
|
+
// Parse the XML to verify its structure
|
|
280
|
+
let doc = Document::parse(xml_str).expect("Failed to parse XML output");
|
|
281
|
+
let root = doc.root_element();
|
|
282
|
+
|
|
283
|
+
// Find the result with special characters
|
|
284
|
+
let results: Vec<Node> = root
|
|
285
|
+
.children()
|
|
286
|
+
.filter(|n| n.is_element() && n.tag_name().name() == "result")
|
|
287
|
+
.collect();
|
|
288
|
+
let special_chars_result = results.iter().find(|&r| {
|
|
289
|
+
if let Some(file) = r
|
|
290
|
+
.children()
|
|
291
|
+
.find(|n| n.is_element() && n.tag_name().name() == "file")
|
|
292
|
+
{
|
|
293
|
+
if let Some(text) = file.text() {
|
|
294
|
+
return text.contains("special_chars.js");
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
false
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
assert!(
|
|
301
|
+
special_chars_result.is_some(),
|
|
302
|
+
"Should find the special_chars.js file"
|
|
303
|
+
);
|
|
304
|
+
|
|
305
|
+
// Verify that special characters are properly escaped in the XML
|
|
306
|
+
if let Some(result) = special_chars_result {
|
|
307
|
+
if let Some(code) = result
|
|
308
|
+
.children()
|
|
309
|
+
.find(|n| n.is_element() && n.tag_name().name() == "code")
|
|
310
|
+
{
|
|
311
|
+
if let Some(text) = code.text() {
|
|
312
|
+
// The special characters should be properly escaped in XML
|
|
313
|
+
// Since we're using CDATA, the characters should be preserved as-is
|
|
314
|
+
assert!(
|
|
315
|
+
text.contains("\"quotes\""),
|
|
316
|
+
"Double quotes should be preserved in CDATA"
|
|
317
|
+
);
|
|
318
|
+
assert!(
|
|
319
|
+
text.contains("'apostrophes'"),
|
|
320
|
+
"Apostrophes should be preserved in CDATA"
|
|
321
|
+
);
|
|
322
|
+
assert!(text.contains("<tags>"), "Tags should be preserved in CDATA");
|
|
323
|
+
assert!(
|
|
324
|
+
text.contains("&ersands"),
|
|
325
|
+
"Ampersands should be preserved in CDATA"
|
|
326
|
+
);
|
|
327
|
+
} else {
|
|
328
|
+
panic!("Code element should have text content");
|
|
329
|
+
}
|
|
330
|
+
} else {
|
|
331
|
+
panic!("Result should have a code element");
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
#[test]
|
|
337
|
+
fn test_xml_schema_validation_empty_results() {
|
|
338
|
+
let temp_dir = TempDir::new().expect("Failed to create temp dir");
|
|
339
|
+
create_test_directory_structure(&temp_dir);
|
|
340
|
+
|
|
341
|
+
// Run the CLI with XML output format, searching for a term that doesn't exist
|
|
342
|
+
let output = Command::new("cargo")
|
|
343
|
+
.args([
|
|
344
|
+
"run",
|
|
345
|
+
"--",
|
|
346
|
+
"search",
|
|
347
|
+
"nonexistentterm", // Term that doesn't exist in any file
|
|
348
|
+
temp_dir.path().to_str().unwrap(),
|
|
349
|
+
"--format",
|
|
350
|
+
"xml",
|
|
351
|
+
])
|
|
352
|
+
.output()
|
|
353
|
+
.expect("Failed to execute command");
|
|
354
|
+
|
|
355
|
+
// Check that the command succeeded
|
|
356
|
+
assert!(output.status.success());
|
|
357
|
+
|
|
358
|
+
// Convert stdout to string
|
|
359
|
+
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
360
|
+
|
|
361
|
+
// Extract the XML part from the output
|
|
362
|
+
let xml_str = extract_xml_from_output(&stdout);
|
|
363
|
+
|
|
364
|
+
// Validate the XML structure
|
|
365
|
+
let validation_result = validate_xml_structure(xml_str);
|
|
366
|
+
assert!(
|
|
367
|
+
validation_result.is_ok(),
|
|
368
|
+
"XML output with empty results does not conform to expected structure: {:?}",
|
|
369
|
+
validation_result.err()
|
|
370
|
+
);
|
|
371
|
+
|
|
372
|
+
// Parse the XML to verify its structure
|
|
373
|
+
let doc = Document::parse(xml_str).expect("Failed to parse XML output");
|
|
374
|
+
let root = doc.root_element();
|
|
375
|
+
|
|
376
|
+
// Validate that there are no result elements
|
|
377
|
+
let results: Vec<Node> = root
|
|
378
|
+
.children()
|
|
379
|
+
.filter(|n| n.is_element() && n.tag_name().name() == "result")
|
|
380
|
+
.collect();
|
|
381
|
+
assert!(results.is_empty(), "Should have no result elements");
|
|
382
|
+
|
|
383
|
+
// Validate the summary element
|
|
384
|
+
let summary = root
|
|
385
|
+
.children()
|
|
386
|
+
.find(|n| n.is_element() && n.tag_name().name() == "summary");
|
|
387
|
+
assert!(summary.is_some(), "Should have a summary element");
|
|
388
|
+
|
|
389
|
+
if let Some(summary) = summary {
|
|
390
|
+
// Validate the summary contains count, total_bytes, and total_tokens with zero values
|
|
391
|
+
if let Some(count) = summary
|
|
392
|
+
.children()
|
|
393
|
+
.find(|n| n.is_element() && n.tag_name().name() == "count")
|
|
394
|
+
{
|
|
395
|
+
let count_value = count.text().unwrap_or("0").parse::<usize>().unwrap_or(0);
|
|
396
|
+
assert_eq!(count_value, 0, "Count should be 0");
|
|
397
|
+
} else {
|
|
398
|
+
panic!("Summary should have a count element");
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
#[test]
|
|
404
|
+
fn test_xml_schema_validation_multiple_terms() {
|
|
405
|
+
let temp_dir = TempDir::new().expect("Failed to create temp dir");
|
|
406
|
+
create_test_directory_structure(&temp_dir);
|
|
407
|
+
|
|
408
|
+
// Run the CLI with XML output format, searching for multiple terms
|
|
409
|
+
let output = Command::new("cargo")
|
|
410
|
+
.args([
|
|
411
|
+
"run",
|
|
412
|
+
"--",
|
|
413
|
+
"search",
|
|
414
|
+
"term process", // Multiple terms to search for
|
|
415
|
+
temp_dir.path().to_str().unwrap(),
|
|
416
|
+
"--format",
|
|
417
|
+
"xml",
|
|
418
|
+
])
|
|
419
|
+
.output()
|
|
420
|
+
.expect("Failed to execute command");
|
|
421
|
+
|
|
422
|
+
// Check that the command succeeded
|
|
423
|
+
assert!(output.status.success());
|
|
424
|
+
|
|
425
|
+
// Convert stdout to string
|
|
426
|
+
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
427
|
+
|
|
428
|
+
// Extract the XML part from the output
|
|
429
|
+
let xml_str = extract_xml_from_output(&stdout);
|
|
430
|
+
|
|
431
|
+
// Validate the XML structure
|
|
432
|
+
let validation_result = validate_xml_structure(xml_str);
|
|
433
|
+
assert!(
|
|
434
|
+
validation_result.is_ok(),
|
|
435
|
+
"XML output with multiple terms does not conform to expected structure: {:?}",
|
|
436
|
+
validation_result.err()
|
|
437
|
+
);
|
|
438
|
+
|
|
439
|
+
// Parse the XML to verify its structure
|
|
440
|
+
let doc = Document::parse(xml_str).expect("Failed to parse XML output");
|
|
441
|
+
let root = doc.root_element();
|
|
442
|
+
|
|
443
|
+
// Find the result with multiple terms
|
|
444
|
+
let results: Vec<Node> = root
|
|
445
|
+
.children()
|
|
446
|
+
.filter(|n| n.is_element() && n.tag_name().name() == "result")
|
|
447
|
+
.collect();
|
|
448
|
+
let multi_term_result = results.iter().find(|&r| {
|
|
449
|
+
if let Some(file) = r
|
|
450
|
+
.children()
|
|
451
|
+
.find(|n| n.is_element() && n.tag_name().name() == "file")
|
|
452
|
+
{
|
|
453
|
+
if let Some(text) = file.text() {
|
|
454
|
+
return text.contains("multi_term.js");
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
false
|
|
458
|
+
});
|
|
459
|
+
|
|
460
|
+
assert!(
|
|
461
|
+
multi_term_result.is_some(),
|
|
462
|
+
"Should find the multi_term.js file"
|
|
463
|
+
);
|
|
464
|
+
|
|
465
|
+
// Check if matched_keywords element contains both search terms
|
|
466
|
+
if let Some(result) = multi_term_result {
|
|
467
|
+
if let Some(matched_keywords) = result
|
|
468
|
+
.children()
|
|
469
|
+
.find(|n| n.is_element() && n.tag_name().name() == "matched_keywords")
|
|
470
|
+
{
|
|
471
|
+
let keywords: Vec<Node> = matched_keywords
|
|
472
|
+
.children()
|
|
473
|
+
.filter(|n| n.is_element() && n.tag_name().name() == "keyword")
|
|
474
|
+
.collect();
|
|
475
|
+
|
|
476
|
+
// Check if both terms are present
|
|
477
|
+
let has_term = keywords.iter().any(|k| {
|
|
478
|
+
if let Some(text) = k.text() {
|
|
479
|
+
text.contains("term")
|
|
480
|
+
} else {
|
|
481
|
+
false
|
|
482
|
+
}
|
|
483
|
+
});
|
|
484
|
+
|
|
485
|
+
let has_process = keywords.iter().any(|k| {
|
|
486
|
+
if let Some(text) = k.text() {
|
|
487
|
+
text.contains("process")
|
|
488
|
+
} else {
|
|
489
|
+
false
|
|
490
|
+
}
|
|
491
|
+
});
|
|
492
|
+
|
|
493
|
+
assert!(has_term, "matched_keywords should contain 'term'");
|
|
494
|
+
assert!(has_process, "matched_keywords should contain 'process'");
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
import { isWebContainer } from "@webcontainer/env";
|
|
3
|
+
|
|
4
|
+
if (isWebContainer()) {
|
|
5
|
+
console.log("[postinstall] WebContainer/StackBlitz erkannt → build wird ausgeführt…");
|
|
6
|
+
execSync("npm run build", { stdio: "inherit" });
|
|
7
|
+
} else {
|
|
8
|
+
console.log("[postinstall] Kein WebContainer → build wird übersprungen.");
|
|
9
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
#
|
|
3
|
+
# Wiki Build Script
|
|
4
|
+
# Builds wiki/ directory from docs/ source files
|
|
5
|
+
#
|
|
6
|
+
# Usage: ./scripts/wiki-build.sh
|
|
7
|
+
#
|
|
8
|
+
|
|
9
|
+
set -e
|
|
10
|
+
|
|
11
|
+
DOCS_DIR="docs"
|
|
12
|
+
WIKI_DIR="wiki"
|
|
13
|
+
|
|
14
|
+
echo "📦 Building Wiki from docs/"
|
|
15
|
+
echo "=============================="
|
|
16
|
+
echo ""
|
|
17
|
+
|
|
18
|
+
# Check if docs directory exists
|
|
19
|
+
if [ ! -d "$DOCS_DIR" ]; then
|
|
20
|
+
echo "❌ Error: $DOCS_DIR/ directory not found"
|
|
21
|
+
exit 1
|
|
22
|
+
fi
|
|
23
|
+
|
|
24
|
+
# Create wiki directory if not exists
|
|
25
|
+
mkdir -p "$WIKI_DIR"
|
|
26
|
+
|
|
27
|
+
# Copy templates from docs/
|
|
28
|
+
echo "📄 Copying wiki templates from docs/..."
|
|
29
|
+
cp "$DOCS_DIR/WIKI-HOME.md" "$WIKI_DIR/Home.md" 2>/dev/null && echo " ✓ Home.md (from WIKI-HOME.md)" || echo " ⚠ WIKI-HOME.md not found"
|
|
30
|
+
cp "$DOCS_DIR/WIKI-SIDEBAR.md" "$WIKI_DIR/_Sidebar.md" 2>/dev/null && echo " ✓ _Sidebar.md (from WIKI-SIDEBAR.md)" || echo " ⚠ WIKI-SIDEBAR.md not found"
|
|
31
|
+
|
|
32
|
+
# File mapping: docs/*.md → wiki/Wiki-Name.md (names based on document headings)
|
|
33
|
+
echo "📋 Copying files from docs/ to wiki/..."
|
|
34
|
+
|
|
35
|
+
cp "$DOCS_DIR/QUICKSTART.md" "$WIKI_DIR/Quick-Start-Guide.md" 2>/dev/null && echo " ✓ Quick-Start-Guide.md" || echo " ⚠ QUICKSTART.md not found"
|
|
36
|
+
cp "$DOCS_DIR/EXAMPLES.md" "$WIKI_DIR/Example-Usage.md" 2>/dev/null && echo " ✓ Example-Usage.md" || echo " ⚠ EXAMPLES.md not found"
|
|
37
|
+
cp "$DOCS_DIR/AUTHENTICATION.md" "$WIKI_DIR/Authentication-Configuration.md" 2>/dev/null && echo " ✓ Authentication-Configuration.md" || echo " ⚠ AUTHENTICATION.md not found"
|
|
38
|
+
cp "$DOCS_DIR/AI-FEATURES.md" "$WIKI_DIR/AI-Features-Guide.md" 2>/dev/null && echo " ✓ AI-Features-Guide.md" || echo " ⚠ AI-FEATURES.md not found"
|
|
39
|
+
cp "$DOCS_DIR/WIDGET-GUIDE.md" "$WIKI_DIR/Widget-Bundle-Guide.md" 2>/dev/null && echo " ✓ Widget-Bundle-Guide.md" || echo " ⚠ WIDGET-GUIDE.md not found"
|
|
40
|
+
cp "$DOCS_DIR/MIGRATION-GUIDE.md" "$WIKI_DIR/Migration-Guide.md" 2>/dev/null && echo " ✓ Migration-Guide.md" || echo " ⚠ MIGRATION-GUIDE.md not found"
|
|
41
|
+
cp "$DOCS_DIR/API-REFERENCE.md" "$WIKI_DIR/API-Reference.md" 2>/dev/null && echo " ✓ API-Reference.md" || echo " ⚠ API-REFERENCE.md not found"
|
|
42
|
+
cp "$DOCS_DIR/TROUBLESHOOTING.md" "$WIKI_DIR/Troubleshooting-Guide.md" 2>/dev/null && echo " ✓ Troubleshooting-Guide.md" || echo " ⚠ TROUBLESHOOTING.md not found"
|
|
43
|
+
cp "$DOCS_DIR/BACKEND-API.md" "$WIKI_DIR/Backend-API-Guide.md" 2>/dev/null && echo " ✓ Backend-API-Guide.md" || echo " ⚠ BACKEND-API.md not found"
|
|
44
|
+
cp "$DOCS_DIR/DEVELOPMENT.md" "$WIKI_DIR/Development-Guide.md" 2>/dev/null && echo " ✓ Development-Guide.md" || echo " ⚠ DEVELOPMENT.md not found"
|
|
45
|
+
cp "$DOCS_DIR/NPM-PUBLISH.md" "$WIKI_DIR/NPM-Publishing-Guide.md" 2>/dev/null && echo " ✓ NPM-Publishing-Guide.md" || echo " ⚠ NPM-PUBLISH.md not found"
|
|
46
|
+
cp "$DOCS_DIR/REDIS-SETUP.md" "$WIKI_DIR/Redis-Production-Setup.md" 2>/dev/null && echo " ✓ Redis-Production-Setup.md" || echo " ⚠ REDIS-SETUP.md not found"
|
|
47
|
+
cp "$DOCS_DIR/SERVER.md" "$WIKI_DIR/Backend-Server.md" 2>/dev/null && echo " ✓ Backend-Server.md" || echo " ⚠ SERVER.md not found"
|
|
48
|
+
cp "$DOCS_DIR/MCP-SERVER.md" "$WIKI_DIR/MCP-Server-Integration.md" 2>/dev/null && echo " ✓ MCP-Server-Integration.md" || echo " ⚠ MCP-SERVER.md not found"
|
|
49
|
+
|
|
50
|
+
echo ""
|
|
51
|
+
echo "🔗 Fixing wiki links..."
|
|
52
|
+
|
|
53
|
+
# Fix all markdown links for wiki format
|
|
54
|
+
cd "$WIKI_DIR"
|
|
55
|
+
|
|
56
|
+
# Remove .md extensions from links and map to new wiki page names
|
|
57
|
+
sed -i '' 's|\](./docs/QUICKSTART\.md)|\](Quick-Start-Guide)|g' *.md 2>/dev/null || true
|
|
58
|
+
sed -i '' 's|\](./docs/EXAMPLES\.md)|\](Example-Usage)|g' *.md 2>/dev/null || true
|
|
59
|
+
sed -i '' 's|\](./docs/AUTHENTICATION\.md)|\](Authentication-Configuration)|g' *.md 2>/dev/null || true
|
|
60
|
+
sed -i '' 's|\](./docs/AI-FEATURES\.md)|\](AI-Features-Guide)|g' *.md 2>/dev/null || true
|
|
61
|
+
sed -i '' 's|\](./docs/WIDGET-GUIDE\.md)|\](Widget-Bundle-Guide)|g' *.md 2>/dev/null || true
|
|
62
|
+
sed -i '' 's|\](./docs/MIGRATION-GUIDE\.md)|\](Migration-Guide)|g' *.md 2>/dev/null || true
|
|
63
|
+
sed -i '' 's|\](./docs/API-REFERENCE\.md)|\](API-Reference)|g' *.md 2>/dev/null || true
|
|
64
|
+
sed -i '' 's|\](./docs/TROUBLESHOOTING\.md)|\](Troubleshooting-Guide)|g' *.md 2>/dev/null || true
|
|
65
|
+
sed -i '' 's|\](./docs/BACKEND-API\.md)|\](Backend-API-Guide)|g' *.md 2>/dev/null || true
|
|
66
|
+
sed -i '' 's|\](./docs/DEVELOPMENT\.md)|\](Development-Guide)|g' *.md 2>/dev/null || true
|
|
67
|
+
sed -i '' 's|\](./docs/NPM-PUBLISH\.md)|\](NPM-Publishing-Guide)|g' *.md 2>/dev/null || true
|
|
68
|
+
sed -i '' 's|\](./docs/REDIS-SETUP\.md)|\](Redis-Production-Setup)|g' *.md 2>/dev/null || true
|
|
69
|
+
sed -i '' 's|\](./docs/SERVER\.md)|\](Backend-Server)|g' *.md 2>/dev/null || true
|
|
70
|
+
sed -i '' 's|\](./docs/MCP-SERVER\.md)|\](MCP-Server-Integration)|g' *.md 2>/dev/null || true
|
|
71
|
+
|
|
72
|
+
# Also handle root-level links (within docs/ folder)
|
|
73
|
+
sed -i '' 's|\](./QUICKSTART\.md)|\](Quick-Start-Guide)|g' *.md 2>/dev/null || true
|
|
74
|
+
sed -i '' 's|\](./EXAMPLES\.md)|\](Example-Usage)|g' *.md 2>/dev/null || true
|
|
75
|
+
sed -i '' 's|\](./AUTHENTICATION\.md)|\](Authentication-Configuration)|g' *.md 2>/dev/null || true
|
|
76
|
+
sed -i '' 's|\](./AI-FEATURES\.md)|\](AI-Features-Guide)|g' *.md 2>/dev/null || true
|
|
77
|
+
sed -i '' 's|\](./WIDGET-GUIDE\.md)|\](Widget-Bundle-Guide)|g' *.md 2>/dev/null || true
|
|
78
|
+
sed -i '' 's|\](./MIGRATION-GUIDE\.md)|\](Migration-Guide)|g' *.md 2>/dev/null || true
|
|
79
|
+
sed -i '' 's|\](./API-REFERENCE\.md)|\](API-Reference)|g' *.md 2>/dev/null || true
|
|
80
|
+
sed -i '' 's|\](./TROUBLESHOOTING\.md)|\](Troubleshooting-Guide)|g' *.md 2>/dev/null || true
|
|
81
|
+
sed -i '' 's|\](./BACKEND-API\.md)|\](Backend-API-Guide)|g' *.md 2>/dev/null || true
|
|
82
|
+
sed -i '' 's|\](./DEVELOPMENT\.md)|\](Development-Guide)|g' *.md 2>/dev/null || true
|
|
83
|
+
sed -i '' 's|\](./NPM-PUBLISH\.md)|\](NPM-Publishing-Guide)|g' *.md 2>/dev/null || true
|
|
84
|
+
sed -i '' 's|\](./REDIS-SETUP\.md)|\](Redis-Production-Setup)|g' *.md 2>/dev/null || true
|
|
85
|
+
sed -i '' 's|\](./SERVER\.md)|\](Backend-Server)|g' *.md 2>/dev/null || true
|
|
86
|
+
sed -i '' 's|\](./MCP-SERVER\.md)|\](MCP-Server-Integration)|g' *.md 2>/dev/null || true
|
|
87
|
+
|
|
88
|
+
# Handle links without ./ prefix (e.g., ](EXAMPLES.md))
|
|
89
|
+
sed -i '' 's|\](QUICKSTART\.md)|\](Quick-Start-Guide)|g' *.md 2>/dev/null || true
|
|
90
|
+
sed -i '' 's|\](EXAMPLES\.md)|\](Example-Usage)|g' *.md 2>/dev/null || true
|
|
91
|
+
sed -i '' 's|\](AUTHENTICATION\.md)|\](Authentication-Configuration)|g' *.md 2>/dev/null || true
|
|
92
|
+
sed -i '' 's|\](AI-FEATURES\.md)|\](AI-Features-Guide)|g' *.md 2>/dev/null || true
|
|
93
|
+
sed -i '' 's|\](WIDGET-GUIDE\.md)|\](Widget-Bundle-Guide)|g' *.md 2>/dev/null || true
|
|
94
|
+
sed -i '' 's|\](MIGRATION-GUIDE\.md)|\](Migration-Guide)|g' *.md 2>/dev/null || true
|
|
95
|
+
sed -i '' 's|\](API-REFERENCE\.md)|\](API-Reference)|g' *.md 2>/dev/null || true
|
|
96
|
+
sed -i '' 's|\](TROUBLESHOOTING\.md)|\](Troubleshooting-Guide)|g' *.md 2>/dev/null || true
|
|
97
|
+
sed -i '' 's|\](BACKEND-API\.md)|\](Backend-API-Guide)|g' *.md 2>/dev/null || true
|
|
98
|
+
sed -i '' 's|\](DEVELOPMENT\.md)|\](Development-Guide)|g' *.md 2>/dev/null || true
|
|
99
|
+
sed -i '' 's|\](NPM-PUBLISH\.md)|\](NPM-Publishing-Guide)|g' *.md 2>/dev/null || true
|
|
100
|
+
sed -i '' 's|\](REDIS-SETUP\.md)|\](Redis-Production-Setup)|g' *.md 2>/dev/null || true
|
|
101
|
+
sed -i '' 's|\](SERVER\.md)|\](Backend-Server)|g' *.md 2>/dev/null || true
|
|
102
|
+
sed -i '' 's|\](MCP-SERVER\.md)|\](MCP-Server-Integration)|g' *.md 2>/dev/null || true
|
|
103
|
+
|
|
104
|
+
cd ..
|
|
105
|
+
|
|
106
|
+
echo ""
|
|
107
|
+
echo "✅ Wiki build complete!"
|
|
108
|
+
echo "📁 Files: $(ls -1 $WIKI_DIR/*.md 2>/dev/null | wc -l | tr -d ' ')"
|
|
109
|
+
echo ""
|
|
110
|
+
echo "Next steps:"
|
|
111
|
+
echo " ./scripts/wiki-deploy.sh \"Update documentation\""
|