@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,577 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for Enhanced Mermaid validation functionality with specialized fixing agent
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { describe, test, expect, beforeEach, afterEach, jest } from '@jest/globals';
|
|
6
|
+
import {
|
|
7
|
+
extractMermaidFromMarkdown,
|
|
8
|
+
replaceMermaidDiagramsInMarkdown,
|
|
9
|
+
MermaidFixingAgent,
|
|
10
|
+
validateAndFixMermaidResponse
|
|
11
|
+
} from '../../src/agent/schemaUtils.js';
|
|
12
|
+
import { SimpleAppTracer } from '../../src/agent/simpleTelemetry.js';
|
|
13
|
+
|
|
14
|
+
// Mock ProbeAgent to avoid actual API calls in tests
|
|
15
|
+
const mockProbeAgent = {
|
|
16
|
+
answer: jest.fn(),
|
|
17
|
+
getTokenUsage: jest.fn(() => ({ totalTokens: 100, inputTokens: 50, outputTokens: 50 })),
|
|
18
|
+
cancel: jest.fn()
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
// Mock the dynamic import
|
|
22
|
+
jest.mock('../../src/agent/ProbeAgent.js', () => ({
|
|
23
|
+
ProbeAgent: jest.fn(() => mockProbeAgent)
|
|
24
|
+
}), { virtual: true });
|
|
25
|
+
|
|
26
|
+
describe('Enhanced Mermaid Validation', () => {
|
|
27
|
+
beforeEach(() => {
|
|
28
|
+
jest.clearAllMocks();
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
afterEach(() => {
|
|
32
|
+
jest.clearAllMocks();
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
describe('Enhanced extractMermaidFromMarkdown', () => {
|
|
36
|
+
test('should extract mermaid with position tracking and attributes', () => {
|
|
37
|
+
const response = `Generate a mermaid diagram showing the relationships between the modified components:
|
|
38
|
+
|
|
39
|
+
\`\`\`mermaid
|
|
40
|
+
graph TD
|
|
41
|
+
A[Component A] --> B[Component B]
|
|
42
|
+
B --> C[Database]
|
|
43
|
+
C --> D[API Endpoints]
|
|
44
|
+
\`\`\`
|
|
45
|
+
|
|
46
|
+
Some other text here.
|
|
47
|
+
|
|
48
|
+
\`\`\`mermaid title="System Flow"
|
|
49
|
+
sequenceDiagram
|
|
50
|
+
participant U as User
|
|
51
|
+
participant S as System
|
|
52
|
+
U->>S: Request
|
|
53
|
+
S->>U: Response
|
|
54
|
+
\`\`\``;
|
|
55
|
+
|
|
56
|
+
const result = extractMermaidFromMarkdown(response);
|
|
57
|
+
|
|
58
|
+
expect(result.diagrams).toHaveLength(2);
|
|
59
|
+
|
|
60
|
+
// First diagram
|
|
61
|
+
expect(result.diagrams[0].content).toContain('graph TD');
|
|
62
|
+
expect(result.diagrams[0].content).toContain('A[Component A] --> B[Component B]');
|
|
63
|
+
expect(result.diagrams[0].attributes).toBe('');
|
|
64
|
+
expect(result.diagrams[0].startIndex).toBeGreaterThan(0);
|
|
65
|
+
expect(result.diagrams[0].endIndex).toBeGreaterThan(result.diagrams[0].startIndex);
|
|
66
|
+
expect(result.diagrams[0].fullMatch).toContain('```mermaid');
|
|
67
|
+
|
|
68
|
+
// Second diagram with attributes
|
|
69
|
+
expect(result.diagrams[1].content).toContain('sequenceDiagram');
|
|
70
|
+
expect(result.diagrams[1].content).toContain('participant U as User');
|
|
71
|
+
expect(result.diagrams[1].attributes).toBe('title="System Flow"');
|
|
72
|
+
expect(result.diagrams[1].startIndex).toBeGreaterThan(result.diagrams[0].endIndex);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
test('should handle nested markdown structures', () => {
|
|
76
|
+
const response = `
|
|
77
|
+
> Here's a quote with a diagram:
|
|
78
|
+
>
|
|
79
|
+
> \`\`\`mermaid
|
|
80
|
+
> graph LR
|
|
81
|
+
> A --> B
|
|
82
|
+
> \`\`\`
|
|
83
|
+
>
|
|
84
|
+
> End of quote.
|
|
85
|
+
|
|
86
|
+
And a list:
|
|
87
|
+
1. Item 1
|
|
88
|
+
2. Item 2 with diagram:
|
|
89
|
+
\`\`\`mermaid
|
|
90
|
+
pie title Pie Chart
|
|
91
|
+
"A" : 50
|
|
92
|
+
"B" : 30
|
|
93
|
+
"C" : 20
|
|
94
|
+
\`\`\`
|
|
95
|
+
3. Item 3`;
|
|
96
|
+
|
|
97
|
+
const result = extractMermaidFromMarkdown(response);
|
|
98
|
+
|
|
99
|
+
expect(result.diagrams).toHaveLength(2);
|
|
100
|
+
expect(result.diagrams[0].content).toContain('graph LR');
|
|
101
|
+
expect(result.diagrams[1].content).toContain('pie title Pie Chart');
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
test('should preserve whitespace and indentation context', () => {
|
|
105
|
+
const response = ` \`\`\`mermaid
|
|
106
|
+
graph TD
|
|
107
|
+
A[Start] --> B{Decision}
|
|
108
|
+
B -->|Yes| C[Action 1]
|
|
109
|
+
B -->|No| D[Action 2]
|
|
110
|
+
\`\`\``;
|
|
111
|
+
|
|
112
|
+
const result = extractMermaidFromMarkdown(response);
|
|
113
|
+
|
|
114
|
+
expect(result.diagrams).toHaveLength(1);
|
|
115
|
+
expect(result.diagrams[0].content).toContain('graph TD');
|
|
116
|
+
expect(result.diagrams[0].content).toContain('A[Start] --> B{Decision}');
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
test('should handle mixed code block types', () => {
|
|
120
|
+
const response = `
|
|
121
|
+
\`\`\`javascript
|
|
122
|
+
console.log("Hello");
|
|
123
|
+
\`\`\`
|
|
124
|
+
|
|
125
|
+
\`\`\`mermaid
|
|
126
|
+
graph TD
|
|
127
|
+
A --> B
|
|
128
|
+
\`\`\`
|
|
129
|
+
|
|
130
|
+
\`\`\`json
|
|
131
|
+
{"key": "value"}
|
|
132
|
+
\`\`\`
|
|
133
|
+
|
|
134
|
+
\`\`\`mermaid class="custom"
|
|
135
|
+
stateDiagram-v2
|
|
136
|
+
[*] --> State1
|
|
137
|
+
State1 --> [*]
|
|
138
|
+
\`\`\``;
|
|
139
|
+
|
|
140
|
+
const result = extractMermaidFromMarkdown(response);
|
|
141
|
+
|
|
142
|
+
expect(result.diagrams).toHaveLength(2);
|
|
143
|
+
expect(result.diagrams[0].content).toContain('graph TD');
|
|
144
|
+
expect(result.diagrams[0].attributes).toBe('');
|
|
145
|
+
expect(result.diagrams[1].content).toContain('stateDiagram-v2');
|
|
146
|
+
expect(result.diagrams[1].attributes).toBe('class="custom"');
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
describe('replaceMermaidDiagramsInMarkdown', () => {
|
|
151
|
+
test('should replace diagrams while preserving original format', () => {
|
|
152
|
+
const original = `Here's a diagram:
|
|
153
|
+
|
|
154
|
+
\`\`\`mermaid
|
|
155
|
+
graph TD
|
|
156
|
+
A --> B[Bad Syntax
|
|
157
|
+
B --> C
|
|
158
|
+
\`\`\`
|
|
159
|
+
|
|
160
|
+
Some text.`;
|
|
161
|
+
|
|
162
|
+
const { diagrams } = extractMermaidFromMarkdown(original);
|
|
163
|
+
|
|
164
|
+
// Simulate corrected diagram
|
|
165
|
+
const correctedDiagrams = [{
|
|
166
|
+
...diagrams[0],
|
|
167
|
+
content: 'graph TD\n A --> B[Fixed Syntax]\n B --> C'
|
|
168
|
+
}];
|
|
169
|
+
|
|
170
|
+
const result = replaceMermaidDiagramsInMarkdown(original, correctedDiagrams);
|
|
171
|
+
|
|
172
|
+
expect(result).toContain('B[Fixed Syntax]');
|
|
173
|
+
expect(result).toContain('```mermaid');
|
|
174
|
+
expect(result).toContain('Some text.');
|
|
175
|
+
expect(result).not.toContain('B[Bad Syntax');
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
test('should preserve attributes when replacing', () => {
|
|
179
|
+
const original = `\`\`\`mermaid title="My Diagram" class="custom"
|
|
180
|
+
graph TD
|
|
181
|
+
A --> B[Broken
|
|
182
|
+
\`\`\``;
|
|
183
|
+
|
|
184
|
+
const { diagrams } = extractMermaidFromMarkdown(original);
|
|
185
|
+
const correctedDiagrams = [{
|
|
186
|
+
...diagrams[0],
|
|
187
|
+
content: 'graph TD\n A --> B[Fixed]'
|
|
188
|
+
}];
|
|
189
|
+
|
|
190
|
+
const result = replaceMermaidDiagramsInMarkdown(original, correctedDiagrams);
|
|
191
|
+
|
|
192
|
+
expect(result).toContain('```mermaid title="My Diagram" class="custom"');
|
|
193
|
+
expect(result).toContain('A --> B[Fixed]');
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
test('should handle multiple diagram replacements', () => {
|
|
197
|
+
const original = `First:
|
|
198
|
+
\`\`\`mermaid
|
|
199
|
+
graph TD
|
|
200
|
+
A --> B[Error1
|
|
201
|
+
\`\`\`
|
|
202
|
+
|
|
203
|
+
Second:
|
|
204
|
+
\`\`\`mermaid
|
|
205
|
+
pie title Bad
|
|
206
|
+
"A" 50
|
|
207
|
+
\`\`\`
|
|
208
|
+
|
|
209
|
+
Third:
|
|
210
|
+
\`\`\`mermaid title="Test"
|
|
211
|
+
sequenceDiagram
|
|
212
|
+
A->>B: Missing colon
|
|
213
|
+
\`\`\``;
|
|
214
|
+
|
|
215
|
+
const { diagrams } = extractMermaidFromMarkdown(original);
|
|
216
|
+
const correctedDiagrams = diagrams.map((diagram, index) => ({
|
|
217
|
+
...diagram,
|
|
218
|
+
content: `corrected_diagram_${index}`
|
|
219
|
+
}));
|
|
220
|
+
|
|
221
|
+
const result = replaceMermaidDiagramsInMarkdown(original, correctedDiagrams);
|
|
222
|
+
|
|
223
|
+
expect(result).toContain('corrected_diagram_0');
|
|
224
|
+
expect(result).toContain('corrected_diagram_1');
|
|
225
|
+
expect(result).toContain('corrected_diagram_2');
|
|
226
|
+
expect(result).toContain('```mermaid title="Test"');
|
|
227
|
+
expect(result).toContain('First:');
|
|
228
|
+
expect(result).toContain('Second:');
|
|
229
|
+
expect(result).toContain('Third:');
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
describe('MermaidFixingAgent', () => {
|
|
234
|
+
test('should initialize with correct options', () => {
|
|
235
|
+
const agent = new MermaidFixingAgent({
|
|
236
|
+
path: '/test/path',
|
|
237
|
+
provider: 'anthropic',
|
|
238
|
+
model: 'claude-3',
|
|
239
|
+
debug: true
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
expect(agent.options.path).toBe('/test/path');
|
|
243
|
+
expect(agent.options.provider).toBe('anthropic');
|
|
244
|
+
expect(agent.options.model).toBe('claude-3');
|
|
245
|
+
expect(agent.options.debug).toBe(true);
|
|
246
|
+
expect(agent.options.allowEdit).toBe(false);
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
test('should extract corrected diagram from response', () => {
|
|
250
|
+
const agent = new MermaidFixingAgent();
|
|
251
|
+
|
|
252
|
+
// Test mermaid code block extraction
|
|
253
|
+
const response1 = `Here's the corrected diagram:
|
|
254
|
+
|
|
255
|
+
\`\`\`mermaid
|
|
256
|
+
graph TD
|
|
257
|
+
A --> B[Fixed]
|
|
258
|
+
B --> C
|
|
259
|
+
\`\`\``;
|
|
260
|
+
|
|
261
|
+
expect(agent.extractCorrectedDiagram(response1)).toBe('graph TD\n A --> B[Fixed]\n B --> C');
|
|
262
|
+
|
|
263
|
+
// Test fallback to any code block
|
|
264
|
+
const response2 = `\`\`\`
|
|
265
|
+
graph TD
|
|
266
|
+
A --> B[Fixed]
|
|
267
|
+
\`\`\``;
|
|
268
|
+
|
|
269
|
+
expect(agent.extractCorrectedDiagram(response2)).toBe('graph TD\n A --> B[Fixed]');
|
|
270
|
+
|
|
271
|
+
// Test cleanup without code blocks
|
|
272
|
+
const response3 = '```mermaid\ngraph TD\n A --> B\n```';
|
|
273
|
+
expect(agent.extractCorrectedDiagram(response3)).toBe('graph TD\n A --> B');
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
test('should call ProbeAgent with correct prompt', async () => {
|
|
277
|
+
// Skip this test in CI/environments without API keys
|
|
278
|
+
if (!process.env.ANTHROPIC_API_KEY && !process.env.OPENAI_API_KEY && !process.env.GOOGLE_API_KEY) {
|
|
279
|
+
console.log('Skipping ProbeAgent test - no API keys available');
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
const agent = new MermaidFixingAgent({ debug: true });
|
|
284
|
+
|
|
285
|
+
try {
|
|
286
|
+
const result = await agent.fixMermaidDiagram(
|
|
287
|
+
'graph TD\n A --> B[Broken\n B --> C',
|
|
288
|
+
['Unclosed bracket'],
|
|
289
|
+
{ diagramType: 'flowchart' }
|
|
290
|
+
);
|
|
291
|
+
|
|
292
|
+
// If we get here, the agent worked
|
|
293
|
+
expect(result).toContain('graph TD');
|
|
294
|
+
} catch (error) {
|
|
295
|
+
// Expected in test environments without API keys or provider setup
|
|
296
|
+
expect(error.message).toMatch(/No API key provided|this\.provider is not a function|Failed to get response from AI model/);
|
|
297
|
+
}
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
test('should handle fixing errors gracefully', async () => {
|
|
301
|
+
// Skip this test in CI/environments without API keys
|
|
302
|
+
if (!process.env.ANTHROPIC_API_KEY && !process.env.OPENAI_API_KEY && !process.env.GOOGLE_API_KEY) {
|
|
303
|
+
console.log('Skipping ProbeAgent error test - no API keys available');
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
const agent = new MermaidFixingAgent({ debug: true });
|
|
308
|
+
|
|
309
|
+
try {
|
|
310
|
+
await agent.fixMermaidDiagram('invalid diagram');
|
|
311
|
+
} catch (error) {
|
|
312
|
+
// This could be either API key error or actual fixing error
|
|
313
|
+
expect(error.message).toBeDefined();
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
describe('validateAndFixMermaidResponse', () => {
|
|
319
|
+
test('should return original response if all diagrams are valid', async () => {
|
|
320
|
+
const validResponse = `Here's a valid diagram:
|
|
321
|
+
|
|
322
|
+
\`\`\`mermaid
|
|
323
|
+
graph TD
|
|
324
|
+
A --> B[Valid]
|
|
325
|
+
B --> C
|
|
326
|
+
\`\`\``;
|
|
327
|
+
|
|
328
|
+
const result = await validateAndFixMermaidResponse(validResponse);
|
|
329
|
+
|
|
330
|
+
expect(result.isValid).toBe(true);
|
|
331
|
+
expect(result.wasFixed).toBe(false);
|
|
332
|
+
expect(result.originalResponse).toBe(validResponse);
|
|
333
|
+
expect(result.fixedResponse).toBe(validResponse);
|
|
334
|
+
});
|
|
335
|
+
|
|
336
|
+
test('should fix invalid diagrams using specialized agent', async () => {
|
|
337
|
+
const invalidResponse = `Generate a mermaid diagram showing the relationships between the modified components:
|
|
338
|
+
|
|
339
|
+
\`\`\`mermaid
|
|
340
|
+
graph TD
|
|
341
|
+
A[Component A] --> B[Component B
|
|
342
|
+
B --> C[Database]
|
|
343
|
+
C --> D[API Endpoints]
|
|
344
|
+
\`\`\`
|
|
345
|
+
|
|
346
|
+
Some other text here.`;
|
|
347
|
+
|
|
348
|
+
const result = await validateAndFixMermaidResponse(invalidResponse, {
|
|
349
|
+
schema: 'Create mermaid diagram',
|
|
350
|
+
debug: true,
|
|
351
|
+
path: '/test',
|
|
352
|
+
provider: 'anthropic'
|
|
353
|
+
});
|
|
354
|
+
|
|
355
|
+
// Maid 0.0.5 auto-fixes unclosed brackets, so diagram becomes valid
|
|
356
|
+
expect(result.originalResponse).toBe(invalidResponse);
|
|
357
|
+
expect(result.diagrams).toHaveLength(1);
|
|
358
|
+
expect(result.diagrams[0].isValid).toBe(true); // Maid auto-fixes unclosed brackets
|
|
359
|
+
expect(result.wasFixed).toBe(true); // Fixed by maid auto-fix
|
|
360
|
+
expect(result.isValid).toBe(true);
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
test('should handle multiple invalid diagrams', async () => {
|
|
364
|
+
const invalidResponse = `\`\`\`mermaid
|
|
365
|
+
graph TD
|
|
366
|
+
A --> B[Error1
|
|
367
|
+
\`\`\`
|
|
368
|
+
|
|
369
|
+
\`\`\`mermaid
|
|
370
|
+
pie title Bad
|
|
371
|
+
"A" 50
|
|
372
|
+
\`\`\``;
|
|
373
|
+
|
|
374
|
+
const result = await validateAndFixMermaidResponse(invalidResponse, {
|
|
375
|
+
debug: true
|
|
376
|
+
});
|
|
377
|
+
|
|
378
|
+
// Maid 0.0.5 auto-fixes unclosed brackets and validates pie charts
|
|
379
|
+
expect(result.diagrams).toHaveLength(2);
|
|
380
|
+
expect(result.diagrams[0].isValid).toBe(true); // Maid auto-fixes unclosed bracket
|
|
381
|
+
expect(result.diagrams[1].isValid).toBe(true); // Pie chart syntax is valid
|
|
382
|
+
expect(result.isValid).toBe(true);
|
|
383
|
+
});
|
|
384
|
+
|
|
385
|
+
test('should handle agent initialization failures gracefully', async () => {
|
|
386
|
+
const invalidResponse = `\`\`\`mermaid
|
|
387
|
+
graph TD
|
|
388
|
+
A --> B[Error
|
|
389
|
+
\`\`\``;
|
|
390
|
+
|
|
391
|
+
const result = await validateAndFixMermaidResponse(invalidResponse, {
|
|
392
|
+
debug: true
|
|
393
|
+
});
|
|
394
|
+
|
|
395
|
+
// Maid 0.0.5 auto-fixes unclosed brackets
|
|
396
|
+
expect(result.diagrams).toHaveLength(1);
|
|
397
|
+
expect(result.diagrams[0].isValid).toBe(true); // Maid auto-fixes unclosed bracket
|
|
398
|
+
expect(result.wasFixed).toBe(true);
|
|
399
|
+
expect(result.isValid).toBe(true);
|
|
400
|
+
});
|
|
401
|
+
|
|
402
|
+
test('should preserve markdown formatting in fixed response', async () => {
|
|
403
|
+
const response = `# Title
|
|
404
|
+
|
|
405
|
+
Here's the analysis with a diagram:
|
|
406
|
+
|
|
407
|
+
\`\`\`mermaid title="Architecture"
|
|
408
|
+
graph TD
|
|
409
|
+
A --> B[Broken
|
|
410
|
+
B --> C
|
|
411
|
+
\`\`\`
|
|
412
|
+
|
|
413
|
+
## Conclusion
|
|
414
|
+
|
|
415
|
+
Some final text.`;
|
|
416
|
+
|
|
417
|
+
const result = await validateAndFixMermaidResponse(response);
|
|
418
|
+
|
|
419
|
+
// Maid 0.0.5 auto-fixes unclosed brackets and preserves structure
|
|
420
|
+
expect(result.diagrams).toHaveLength(1);
|
|
421
|
+
expect(result.diagrams[0].isValid).toBe(true); // Maid auto-fixes unclosed bracket
|
|
422
|
+
expect(result.diagrams[0].attributes).toBe('title="Architecture"');
|
|
423
|
+
expect(result.fixedResponse).toContain('# Title');
|
|
424
|
+
expect(result.fixedResponse).toContain('## Conclusion');
|
|
425
|
+
expect(result.fixedResponse).toContain('Some final text.');
|
|
426
|
+
expect(result.fixedResponse).toContain('```mermaid title="Architecture"');
|
|
427
|
+
expect(result.wasFixed).toBe(true);
|
|
428
|
+
expect(result.isValid).toBe(true);
|
|
429
|
+
});
|
|
430
|
+
});
|
|
431
|
+
|
|
432
|
+
describe('Edge Cases and Error Handling', () => {
|
|
433
|
+
test('should handle empty responses', async () => {
|
|
434
|
+
const result = await validateAndFixMermaidResponse('');
|
|
435
|
+
expect(result.isValid).toBe(false);
|
|
436
|
+
expect(result.wasFixed).toBe(false);
|
|
437
|
+
});
|
|
438
|
+
|
|
439
|
+
test('should handle responses with no mermaid diagrams', async () => {
|
|
440
|
+
const result = await validateAndFixMermaidResponse('Just plain text with no diagrams');
|
|
441
|
+
expect(result.isValid).toBe(false);
|
|
442
|
+
expect(result.wasFixed).toBe(false);
|
|
443
|
+
});
|
|
444
|
+
|
|
445
|
+
test('should handle malformed markdown', async () => {
|
|
446
|
+
const malformedResponse = '```mermaid\ngraph TD\n A --> B\n```incomplete';
|
|
447
|
+
const result = await validateAndFixMermaidResponse(malformedResponse);
|
|
448
|
+
|
|
449
|
+
// Should still extract and process what it can
|
|
450
|
+
expect(result.diagrams).toBeDefined();
|
|
451
|
+
});
|
|
452
|
+
|
|
453
|
+
test('should handle unicode and special characters', async () => {
|
|
454
|
+
const unicodeResponse = `\`\`\`mermaid
|
|
455
|
+
graph TD
|
|
456
|
+
A[Ñoñó] --> B[测试]
|
|
457
|
+
B --> C[🚀 Rocket
|
|
458
|
+
\`\`\``;
|
|
459
|
+
|
|
460
|
+
mockProbeAgent.answer.mockResolvedValue(`\`\`\`mermaid
|
|
461
|
+
graph TD
|
|
462
|
+
A[Ñoñó] --> B[测试]
|
|
463
|
+
B --> C["🚀 Rocket"]
|
|
464
|
+
\`\`\``);
|
|
465
|
+
|
|
466
|
+
const result = await validateAndFixMermaidResponse(unicodeResponse);
|
|
467
|
+
|
|
468
|
+
expect(result.fixedResponse).toContain('Ñoñó');
|
|
469
|
+
expect(result.fixedResponse).toContain('测试');
|
|
470
|
+
expect(result.fixedResponse).toContain('🚀 Rocket');
|
|
471
|
+
});
|
|
472
|
+
});
|
|
473
|
+
|
|
474
|
+
describe('HTML Entity Auto-Fix Integration', () => {
|
|
475
|
+
|
|
476
|
+
|
|
477
|
+
test('should skip AI fixing when HTML entity decoding resolves all issues', async () => {
|
|
478
|
+
const responseWithOnlyEntities = `Valid diagram with only escaped entities:
|
|
479
|
+
|
|
480
|
+
\`\`\`mermaid
|
|
481
|
+
graph TD
|
|
482
|
+
A[Start] --> B{"Valid<br>Decision"}
|
|
483
|
+
B --> C[End]
|
|
484
|
+
\`\`\``;
|
|
485
|
+
|
|
486
|
+
let aiWasCalled = false;
|
|
487
|
+
mockProbeAgent.answer = jest.fn(() => {
|
|
488
|
+
aiWasCalled = true;
|
|
489
|
+
return Promise.resolve('should not be called');
|
|
490
|
+
});
|
|
491
|
+
|
|
492
|
+
const result = await validateAndFixMermaidResponse(responseWithOnlyEntities, {
|
|
493
|
+
debug: true,
|
|
494
|
+
provider: 'anthropic',
|
|
495
|
+
model: 'claude-3'
|
|
496
|
+
});
|
|
497
|
+
|
|
498
|
+
// AI should NOT be called since HTML entity decoding fixed everything
|
|
499
|
+
expect(aiWasCalled).toBe(false);
|
|
500
|
+
|
|
501
|
+
// Result should have decoded entities
|
|
502
|
+
expect(result.fixedResponse).toContain('A[Start] --> B{"Valid<br>Decision"}');
|
|
503
|
+
expect(result.wasFixed).toBe(true);
|
|
504
|
+
expect(result.isValid).toBe(true);
|
|
505
|
+
});
|
|
506
|
+
|
|
507
|
+
test('should handle mixed scenarios with multiple diagrams', async () => {
|
|
508
|
+
const responseWithMixedIssues = `Multiple diagrams with different issues:
|
|
509
|
+
|
|
510
|
+
\`\`\`mermaid
|
|
511
|
+
graph TD
|
|
512
|
+
A[Start] --> B{"Entities only"}
|
|
513
|
+
B --> C[End]
|
|
514
|
+
\`\`\`
|
|
515
|
+
|
|
516
|
+
\`\`\`mermaid
|
|
517
|
+
graph TD
|
|
518
|
+
A[Start] --> B{"Test"}
|
|
519
|
+
B ->-> C[End]
|
|
520
|
+
\`\`\`
|
|
521
|
+
|
|
522
|
+
\`\`\`mermaid
|
|
523
|
+
graph TD
|
|
524
|
+
X --> Y{"Another<br>Entity"}
|
|
525
|
+
Y --> Z[Done]
|
|
526
|
+
\`\`\``;
|
|
527
|
+
|
|
528
|
+
let aiCallCount = 0;
|
|
529
|
+
mockProbeAgent.answer = jest.fn(() => {
|
|
530
|
+
aiCallCount++;
|
|
531
|
+
return Promise.resolve(`\`\`\`mermaid
|
|
532
|
+
graph TD
|
|
533
|
+
A[Start] --> B{"Fixed"}
|
|
534
|
+
B --> C[End]
|
|
535
|
+
\`\`\``);
|
|
536
|
+
});
|
|
537
|
+
|
|
538
|
+
const result = await validateAndFixMermaidResponse(responseWithMixedIssues, {
|
|
539
|
+
debug: true,
|
|
540
|
+
provider: 'anthropic',
|
|
541
|
+
model: 'claude-3'
|
|
542
|
+
});
|
|
543
|
+
|
|
544
|
+
expect(result.diagrams).toHaveLength(3);
|
|
545
|
+
|
|
546
|
+
// Should have decoded entities in diagrams that were fixed with HTML entity decoding
|
|
547
|
+
expect(result.fixedResponse).toContain('A[Start] --> B{"Entities only"}');
|
|
548
|
+
expect(result.fixedResponse).toContain('X --> Y{"Another<br>Entity"}');
|
|
549
|
+
|
|
550
|
+
// Should not contain escaped entities in HTML-entity-fixed diagrams
|
|
551
|
+
expect(result.fixedResponse.split('```mermaid')[1]).not.toContain('"'); // First diagram
|
|
552
|
+
expect(result.fixedResponse.split('```mermaid')[3]).not.toContain('"'); // Third diagram
|
|
553
|
+
|
|
554
|
+
// AI should be called for the diagram with remaining syntax errors
|
|
555
|
+
// Since we don't have API keys in test environment, expect the attempt to be made
|
|
556
|
+
expect(result.fixingResults).toBeDefined();
|
|
557
|
+
expect(result.fixingResults.length).toBeGreaterThan(0);
|
|
558
|
+
});
|
|
559
|
+
|
|
560
|
+
test('should preserve original content when no HTML entities are present', async () => {
|
|
561
|
+
const normalResponse = `Normal diagram without entities:
|
|
562
|
+
|
|
563
|
+
\`\`\`mermaid
|
|
564
|
+
graph TD
|
|
565
|
+
A[Start] --> B{"Normal Decision"}
|
|
566
|
+
B --> C[End]
|
|
567
|
+
\`\`\``;
|
|
568
|
+
|
|
569
|
+
const result = await validateAndFixMermaidResponse(normalResponse);
|
|
570
|
+
|
|
571
|
+
// Should pass through unchanged since it's already valid
|
|
572
|
+
expect(result.fixedResponse).toBe(normalResponse);
|
|
573
|
+
expect(result.wasFixed).toBe(false);
|
|
574
|
+
expect(result.isValid).toBe(true);
|
|
575
|
+
});
|
|
576
|
+
});
|
|
577
|
+
});
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test for extract() function with content parameter
|
|
3
|
+
* This test verifies the fix for the process.env.DEBUG bug
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { extract } from '../../src/index.js';
|
|
7
|
+
import path from 'path';
|
|
8
|
+
|
|
9
|
+
describe('extract() with content parameter', () => {
|
|
10
|
+
// Sample diff content for testing
|
|
11
|
+
const diffContent = `diff --git a/src/main.rs b/src/main.rs
|
|
12
|
+
index 123..456
|
|
13
|
+
--- a/src/main.rs
|
|
14
|
+
+++ b/src/main.rs
|
|
15
|
+
@@ -10,3 +10,4 @@
|
|
16
|
+
fn main() {
|
|
17
|
+
- println!("old");
|
|
18
|
+
+ println!("new");
|
|
19
|
+
}`;
|
|
20
|
+
|
|
21
|
+
test('should process diff content without crashing', async () => {
|
|
22
|
+
// This test verifies that the extract function doesn't crash
|
|
23
|
+
// when accessing process.env.DEBUG
|
|
24
|
+
const result = await extract({
|
|
25
|
+
content: diffContent,
|
|
26
|
+
format: 'outline-xml',
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
// Should return a result (string for outline-xml format)
|
|
30
|
+
expect(result).toBeDefined();
|
|
31
|
+
expect(typeof result).toBe('string');
|
|
32
|
+
expect(result.length).toBeGreaterThan(0);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
test('should handle DEBUG environment variable correctly', async () => {
|
|
36
|
+
// Test with DEBUG enabled
|
|
37
|
+
const originalDebug = process.env.DEBUG;
|
|
38
|
+
process.env.DEBUG = '1';
|
|
39
|
+
|
|
40
|
+
try {
|
|
41
|
+
const result = await extract({
|
|
42
|
+
content: diffContent,
|
|
43
|
+
format: 'outline-xml',
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
expect(result).toBeDefined();
|
|
47
|
+
} finally {
|
|
48
|
+
// Restore original DEBUG value
|
|
49
|
+
if (originalDebug === undefined) {
|
|
50
|
+
delete process.env.DEBUG;
|
|
51
|
+
} else {
|
|
52
|
+
process.env.DEBUG = originalDebug;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
test('should work with outline-xml format', async () => {
|
|
58
|
+
const result = await extract({
|
|
59
|
+
content: diffContent,
|
|
60
|
+
format: 'outline-xml',
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
expect(result).toBeDefined();
|
|
64
|
+
expect(typeof result).toBe('string');
|
|
65
|
+
expect(result.length).toBeGreaterThan(0);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
test('should handle errors gracefully', async () => {
|
|
69
|
+
// Test with invalid content
|
|
70
|
+
try {
|
|
71
|
+
await extract({
|
|
72
|
+
content: 'invalid diff content',
|
|
73
|
+
format: 'outline-xml',
|
|
74
|
+
});
|
|
75
|
+
// If it succeeds, that's also acceptable
|
|
76
|
+
} catch (error) {
|
|
77
|
+
// Should throw a proper Error object, not a TypeError about undefined
|
|
78
|
+
expect(error).toBeInstanceOf(Error);
|
|
79
|
+
expect(error.message).not.toContain('Cannot read properties of undefined');
|
|
80
|
+
expect(error.message).not.toContain('process2');
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
});
|