@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.
Files changed (444) hide show
  1. package/README.md +138 -0
  2. package/data/.env.example +22 -0
  3. package/data/.gitattributes +47 -0
  4. package/data/.glfrc.json +7 -0
  5. package/data/.husky/pre-commit +5 -0
  6. package/data/.nvmrc +1 -0
  7. package/data/CHANGELOG.md +75 -0
  8. package/data/CODE_OF_CONDUCT.md +129 -0
  9. package/data/CONTRIBUTING.md +203 -0
  10. package/data/DOCS-STRUCTURE.md +307 -0
  11. package/data/I18N.md +292 -0
  12. package/data/LICENSE +22 -0
  13. package/data/README.md +315 -0
  14. package/data/SECURITY.md +125 -0
  15. package/data/WIKI-DEPLOYMENT.md +348 -0
  16. package/data/docs/AI-FEATURES.md +610 -0
  17. package/data/docs/API-REFERENCE.md +1022 -0
  18. package/data/docs/AUTHENTICATION.md +301 -0
  19. package/data/docs/BACKEND-API.md +468 -0
  20. package/data/docs/DEVELOPMENT.md +375 -0
  21. package/data/docs/EXAMPLES.md +622 -0
  22. package/data/docs/MCP-SERVER.md +307 -0
  23. package/data/docs/MIGRATION-GUIDE.md +367 -0
  24. package/data/docs/NPM-PUBLISH.md +193 -0
  25. package/data/docs/QUICKSTART.md +206 -0
  26. package/data/docs/REDIS-SETUP.md +162 -0
  27. package/data/docs/SERVER.md +228 -0
  28. package/data/docs/TROUBLESHOOTING.md +657 -0
  29. package/data/docs/WIDGET-GUIDE.md +638 -0
  30. package/data/docs/WIKI-HOME.md +58 -0
  31. package/data/docs/WIKI-SIDEBAR.md +39 -0
  32. package/data/package.json +171 -0
  33. package/data/playwright.config.ts +64 -0
  34. package/data/probe/.cargo/config.toml +10 -0
  35. package/data/probe/.claude/commands/performance-review.md +15 -0
  36. package/data/probe/.clinerules +288 -0
  37. package/data/probe/.dockerignore +57 -0
  38. package/data/probe/.githooks/post-commit +11 -0
  39. package/data/probe/.githooks/pre-commit +99 -0
  40. package/data/probe/.githooks/pre-commit-vow +9 -0
  41. package/data/probe/.prompts/engineer.md +41 -0
  42. package/data/probe/.roomodes +28 -0
  43. package/data/probe/.windsurfrules +0 -0
  44. package/data/probe/BASH_TOOL_SUMMARY.md +148 -0
  45. package/data/probe/BENCHMARKING.md +256 -0
  46. package/data/probe/CLAUDE.md +226 -0
  47. package/data/probe/CODE_OF_CONDUCT.md +128 -0
  48. package/data/probe/CONTRIBUTING.md +193 -0
  49. package/data/probe/Cargo.toml +120 -0
  50. package/data/probe/Cross.toml +10 -0
  51. package/data/probe/DOCKER-README.md +224 -0
  52. package/data/probe/Dockerfile +32 -0
  53. package/data/probe/ENHANCED_DEBUG_TELEMETRY.md +188 -0
  54. package/data/probe/LICENSE +201 -0
  55. package/data/probe/Makefile +210 -0
  56. package/data/probe/README.md +824 -0
  57. package/data/probe/SECURITY.md +67 -0
  58. package/data/probe/WINDOWS-GUIDE.md +294 -0
  59. package/data/probe/benches/parsing_benchmarks.rs +370 -0
  60. package/data/probe/benches/search_benchmarks.rs +599 -0
  61. package/data/probe/benches/simd_benchmarks.rs +372 -0
  62. package/data/probe/benches/timing_benchmarks.rs +287 -0
  63. package/data/probe/build-windows.bat +229 -0
  64. package/data/probe/codex-config/config.toml +6 -0
  65. package/data/probe/docs/PERFORMANCE_OPTIMIZATION.md +161 -0
  66. package/data/probe/examples/cache_demo.rs +46 -0
  67. package/data/probe/examples/chat/.dockerignore +37 -0
  68. package/data/probe/examples/chat/ChatSessionManager.js +295 -0
  69. package/data/probe/examples/chat/Dockerfile +98 -0
  70. package/data/probe/examples/chat/LICENSE +201 -0
  71. package/data/probe/examples/chat/LOCAL_IMAGE_SUPPORT.md +195 -0
  72. package/data/probe/examples/chat/MCP_INTEGRATION.md +400 -0
  73. package/data/probe/examples/chat/README.md +338 -0
  74. package/data/probe/examples/chat/TRACING.md +226 -0
  75. package/data/probe/examples/chat/appTracer.js +968 -0
  76. package/data/probe/examples/chat/auth.js +76 -0
  77. package/data/probe/examples/chat/bin/probe-chat.js +13 -0
  78. package/data/probe/examples/chat/build.js +104 -0
  79. package/data/probe/examples/chat/cancelRequest.js +84 -0
  80. package/data/probe/examples/chat/demo-agentic-image-flow.js +88 -0
  81. package/data/probe/examples/chat/demo-local-images.js +128 -0
  82. package/data/probe/examples/chat/fileSpanExporter.js +181 -0
  83. package/data/probe/examples/chat/implement/README.md +228 -0
  84. package/data/probe/examples/chat/implement/backends/AiderBackend.js +750 -0
  85. package/data/probe/examples/chat/implement/backends/BaseBackend.js +276 -0
  86. package/data/probe/examples/chat/implement/backends/ClaudeCodeBackend.js +767 -0
  87. package/data/probe/examples/chat/implement/backends/MockBackend.js +237 -0
  88. package/data/probe/examples/chat/implement/backends/registry.js +85 -0
  89. package/data/probe/examples/chat/implement/core/BackendManager.js +567 -0
  90. package/data/probe/examples/chat/implement/core/ImplementTool.js +354 -0
  91. package/data/probe/examples/chat/implement/core/config.js +428 -0
  92. package/data/probe/examples/chat/implement/core/timeouts.js +58 -0
  93. package/data/probe/examples/chat/implement/core/utils.js +496 -0
  94. package/data/probe/examples/chat/implement/types/BackendTypes.js +126 -0
  95. package/data/probe/examples/chat/index.js +669 -0
  96. package/data/probe/examples/chat/mcpServer.js +341 -0
  97. package/data/probe/examples/chat/npm/LICENSE +15 -0
  98. package/data/probe/examples/chat/npm/README.md +168 -0
  99. package/data/probe/examples/chat/npm/bin/probe-chat.js +156 -0
  100. package/data/probe/examples/chat/npm/index.js +259 -0
  101. package/data/probe/examples/chat/npm/package.json +54 -0
  102. package/data/probe/examples/chat/package.json +102 -0
  103. package/data/probe/examples/chat/probeChat.js +456 -0
  104. package/data/probe/examples/chat/probeTool.js +491 -0
  105. package/data/probe/examples/chat/storage/JsonChatStorage.js +476 -0
  106. package/data/probe/examples/chat/telemetry.js +281 -0
  107. package/data/probe/examples/chat/test/integration/chatFlows.test.js +320 -0
  108. package/data/probe/examples/chat/test/integration/toolCalling.test.js +471 -0
  109. package/data/probe/examples/chat/test/mocks/mockLLMProvider.js +269 -0
  110. package/data/probe/examples/chat/test/test-backends.js +90 -0
  111. package/data/probe/examples/chat/test/testUtils.js +530 -0
  112. package/data/probe/examples/chat/test/unit/backendTimeout.test.js +161 -0
  113. package/data/probe/examples/chat/test/unit/packageFiles.test.js +120 -0
  114. package/data/probe/examples/chat/test/verify-tests.js +118 -0
  115. package/data/probe/examples/chat/test-agentic-image-loading.js +294 -0
  116. package/data/probe/examples/chat/test-ai-sdk-telemetry.js +204 -0
  117. package/data/probe/examples/chat/test-chat-tracing.js +38 -0
  118. package/data/probe/examples/chat/test-direct-function.js +49 -0
  119. package/data/probe/examples/chat/test-file-size-validation.js +103 -0
  120. package/data/probe/examples/chat/test-full-mcp-integration.js +258 -0
  121. package/data/probe/examples/chat/test-github-context.txt +12 -0
  122. package/data/probe/examples/chat/test-hierarchy.js +203 -0
  123. package/data/probe/examples/chat/test-image-spans.js +37 -0
  124. package/data/probe/examples/chat/test-local-image-reading.js +176 -0
  125. package/data/probe/examples/chat/test-mcp-integration.js +136 -0
  126. package/data/probe/examples/chat/test-mcp-probe-server.js +161 -0
  127. package/data/probe/examples/chat/test-mcp-with-ai.js +279 -0
  128. package/data/probe/examples/chat/test-multiple-allowed-dirs.js +111 -0
  129. package/data/probe/examples/chat/test-probe-mcp-server.js +110 -0
  130. package/data/probe/examples/chat/test-security-validation.js +145 -0
  131. package/data/probe/examples/chat/test-simple-tracing.js +32 -0
  132. package/data/probe/examples/chat/test-trace-verification.js +235 -0
  133. package/data/probe/examples/chat/test-tracing.js +114 -0
  134. package/data/probe/examples/chat/tokenCounter.js +419 -0
  135. package/data/probe/examples/chat/tokenUsageDisplay.js +134 -0
  136. package/data/probe/examples/chat/webServer.js +1103 -0
  137. package/data/probe/examples/reranker/Cargo.toml +33 -0
  138. package/data/probe/examples/reranker/DEBUG_OUTPUT_ANALYSIS.md +71 -0
  139. package/data/probe/examples/reranker/MODELS.md +66 -0
  140. package/data/probe/examples/reranker/MODEL_COMPARISON.md +60 -0
  141. package/data/probe/examples/reranker/MULTI_MODEL_ANALYSIS.md +176 -0
  142. package/data/probe/examples/reranker/PERFORMANCE_SUMMARY.md +156 -0
  143. package/data/probe/examples/reranker/README.md +347 -0
  144. package/data/probe/examples/reranker/RUST_BERT_COMPARISON.md +82 -0
  145. package/data/probe/examples/reranker/TOKENIZATION_GUIDE.md +120 -0
  146. package/data/probe/examples/reranker/check_rust_tokenizer.py +108 -0
  147. package/data/probe/examples/reranker/convert_to_torchscript.py +109 -0
  148. package/data/probe/examples/reranker/debug_scoring.py +189 -0
  149. package/data/probe/examples/reranker/debug_tokenization.py +154 -0
  150. package/data/probe/examples/reranker/download_models.sh +73 -0
  151. package/data/probe/examples/reranker/requirements.txt +13 -0
  152. package/data/probe/examples/reranker/run_comprehensive_benchmark.sh +83 -0
  153. package/data/probe/examples/reranker/rust_bert_test/Cargo.toml +12 -0
  154. package/data/probe/examples/reranker/rust_bert_test/README.md +54 -0
  155. package/data/probe/examples/reranker/simple_test.py +50 -0
  156. package/data/probe/examples/reranker/test_all_models.sh +63 -0
  157. package/data/probe/examples/reranker/test_bert_results.sh +44 -0
  158. package/data/probe/examples/reranker/test_cross_encoder.py +334 -0
  159. package/data/probe/examples/reranker/test_cross_encoder.sh +80 -0
  160. package/data/probe/examples/reranker/test_exact_comparison.py +151 -0
  161. package/data/probe/examples/reranker/test_parallel_performance.sh +56 -0
  162. package/data/probe/examples/reranker/test_scores.py +132 -0
  163. package/data/probe/install.ps1 +508 -0
  164. package/data/probe/install.sh +460 -0
  165. package/data/probe/npm/CLONE_METHOD_EXAMPLES.md +596 -0
  166. package/data/probe/npm/CONTEXT_COMPACTION.md +303 -0
  167. package/data/probe/npm/DELEGATE_TOOL_README.md +166 -0
  168. package/data/probe/npm/MAID_INTEGRATION.md +313 -0
  169. package/data/probe/npm/MCP_INTEGRATION_SUMMARY.md +241 -0
  170. package/data/probe/npm/README.md +824 -0
  171. package/data/probe/npm/bin/.gitignore +7 -0
  172. package/data/probe/npm/bin/.gitkeep +0 -0
  173. package/data/probe/npm/bin/README.md +12 -0
  174. package/data/probe/npm/bin/probe +167 -0
  175. package/data/probe/npm/docs/CLAUDE_CODE_INTEGRATION.md +414 -0
  176. package/data/probe/npm/docs/CODEX_INTEGRATION.md +502 -0
  177. package/data/probe/npm/docs/EDIT_CREATE_TOOLS.md +233 -0
  178. package/data/probe/npm/docs/RETRY_AND_FALLBACK.md +674 -0
  179. package/data/probe/npm/example-usage.js +335 -0
  180. package/data/probe/npm/examples/multi-engine-demo.js +117 -0
  181. package/data/probe/npm/examples/probe-agent-cli.js +113 -0
  182. package/data/probe/npm/examples/test-agent-edit.js +114 -0
  183. package/data/probe/npm/examples/test-edit-create.js +120 -0
  184. package/data/probe/npm/examples/test-edit-direct.js +114 -0
  185. package/data/probe/npm/index.d.ts +744 -0
  186. package/data/probe/npm/jest.config.js +52 -0
  187. package/data/probe/npm/package.json +117 -0
  188. package/data/probe/npm/scripts/build-agent.cjs +75 -0
  189. package/data/probe/npm/scripts/build-cjs.js +124 -0
  190. package/data/probe/npm/scripts/build-mcp.cjs +36 -0
  191. package/data/probe/npm/scripts/postinstall.js +216 -0
  192. package/data/probe/npm/test-codex-e2e.js +78 -0
  193. package/data/probe/npm/test-download-lock.js +109 -0
  194. package/data/probe/npm/test-grep-security.js +94 -0
  195. package/data/probe/npm/test-grep-simplified.js +63 -0
  196. package/data/probe/npm/test-grep.js +51 -0
  197. package/data/probe/npm/tests/README.md +96 -0
  198. package/data/probe/npm/tests/agent-compact-history.test.js +174 -0
  199. package/data/probe/npm/tests/allow-tests-default.test.js +151 -0
  200. package/data/probe/npm/tests/contextCompactor.test.js +498 -0
  201. package/data/probe/npm/tests/delegate-config.test.js +353 -0
  202. package/data/probe/npm/tests/delegate-integration.test.js +348 -0
  203. package/data/probe/npm/tests/extractor-integration.test.js +162 -0
  204. package/data/probe/npm/tests/extractor.test.js +317 -0
  205. package/data/probe/npm/tests/fixtures/sampleDiagrams.js +267 -0
  206. package/data/probe/npm/tests/integration/claude-code-auto-fallback.spec.js +148 -0
  207. package/data/probe/npm/tests/integration/claude-code-multi-step.spec.js +127 -0
  208. package/data/probe/npm/tests/integration/claude-code-tool-events.spec.js +163 -0
  209. package/data/probe/npm/tests/integration/codex-auto-fallback.spec.js +191 -0
  210. package/data/probe/npm/tests/integration/codex-tool-events.spec.js +147 -0
  211. package/data/probe/npm/tests/integration/examplesChatMcp.test.js +402 -0
  212. package/data/probe/npm/tests/integration/mcpDotenvSupport.test.js +174 -0
  213. package/data/probe/npm/tests/integration/mcpErrorHandling.test.js +566 -0
  214. package/data/probe/npm/tests/integration/mcpRobustness.test.js +564 -0
  215. package/data/probe/npm/tests/integration/mcpStdoutPurity.test.js +355 -0
  216. package/data/probe/npm/tests/integration/probeAgentMcp.test.js +398 -0
  217. package/data/probe/npm/tests/integration/retryFallback.test.js +368 -0
  218. package/data/probe/npm/tests/integration/schema-in-initial-message.test.js +318 -0
  219. package/data/probe/npm/tests/integration/schema-validation-loop-prevention.test.js +244 -0
  220. package/data/probe/npm/tests/integration/schemaRetryLogic.test.js +94 -0
  221. package/data/probe/npm/tests/integration/validationFlow.test.js +329 -0
  222. package/data/probe/npm/tests/manual/test-codex-basic.js +110 -0
  223. package/data/probe/npm/tests/mcp/mcpClientManager.test.js +614 -0
  224. package/data/probe/npm/tests/mcp/mcpConfig.test.js +359 -0
  225. package/data/probe/npm/tests/mcp/mcpXmlBridge.test.js +436 -0
  226. package/data/probe/npm/tests/mcp/mockMcpServer.js +510 -0
  227. package/data/probe/npm/tests/mcp-strict-syntax.test.js +319 -0
  228. package/data/probe/npm/tests/mermaidQuoteEscaping.test.js +214 -0
  229. package/data/probe/npm/tests/nestedQuoteFix.test.js +40 -0
  230. package/data/probe/npm/tests/setup.js +46 -0
  231. package/data/probe/npm/tests/unit/allowed-tools.test.js +513 -0
  232. package/data/probe/npm/tests/unit/attempt-completion-closing-tag-in-content.test.js +188 -0
  233. package/data/probe/npm/tests/unit/attemptCompletionJsonFix.test.js +238 -0
  234. package/data/probe/npm/tests/unit/attemptCompletionJsonIssue.test.js +128 -0
  235. package/data/probe/npm/tests/unit/backtickAutoFix.test.js +35 -0
  236. package/data/probe/npm/tests/unit/bash-probe-agent-integration.test.js +389 -0
  237. package/data/probe/npm/tests/unit/bash-simple-commands.test.js +324 -0
  238. package/data/probe/npm/tests/unit/bash-tool-comprehensive.test.js +371 -0
  239. package/data/probe/npm/tests/unit/bash-tool-integration.test.js +310 -0
  240. package/data/probe/npm/tests/unit/bash-tool.test.js +341 -0
  241. package/data/probe/npm/tests/unit/completion-prompt.test.js +379 -0
  242. package/data/probe/npm/tests/unit/cwd-path-options.test.js +287 -0
  243. package/data/probe/npm/tests/unit/delegate-limits.test.js +422 -0
  244. package/data/probe/npm/tests/unit/direct-content-attempt-completion.test.js +235 -0
  245. package/data/probe/npm/tests/unit/edit-create-tools.test.js +609 -0
  246. package/data/probe/npm/tests/unit/enhancedMermaidValidation.test.js +577 -0
  247. package/data/probe/npm/tests/unit/extract-content.test.js +83 -0
  248. package/data/probe/npm/tests/unit/extract-multiple-targets.test.js +89 -0
  249. package/data/probe/npm/tests/unit/fallbackManager.test.js +442 -0
  250. package/data/probe/npm/tests/unit/githubCompatibilityValidation.test.js +258 -0
  251. package/data/probe/npm/tests/unit/imageConfig.test.js +149 -0
  252. package/data/probe/npm/tests/unit/imagePathResolution.test.js +345 -0
  253. package/data/probe/npm/tests/unit/json-fixing-agent.test.js +238 -0
  254. package/data/probe/npm/tests/unit/json-validation-enhanced-errors.test.js +199 -0
  255. package/data/probe/npm/tests/unit/jsonValidationInfiniteLoopFix.test.js +228 -0
  256. package/data/probe/npm/tests/unit/maidIntegration.test.js +139 -0
  257. package/data/probe/npm/tests/unit/maxIterationsWarning.test.js +195 -0
  258. package/data/probe/npm/tests/unit/mermaidEdgeLabelFix.test.js +161 -0
  259. package/data/probe/npm/tests/unit/mermaidHtmlEntities.test.js +76 -0
  260. package/data/probe/npm/tests/unit/mermaidInfiniteLoopFix.test.js +64 -0
  261. package/data/probe/npm/tests/unit/mermaidValidation.test.js +723 -0
  262. package/data/probe/npm/tests/unit/mermaidValidationVisorExample.test.js +309 -0
  263. package/data/probe/npm/tests/unit/probe-agent-clone-realistic.test.js +643 -0
  264. package/data/probe/npm/tests/unit/probe-agent-clone.test.js +476 -0
  265. package/data/probe/npm/tests/unit/probe-agent-delegate.test.js +400 -0
  266. package/data/probe/npm/tests/unit/probe-agent-model-option.test.js +118 -0
  267. package/data/probe/npm/tests/unit/probeTool-security.test.js +283 -0
  268. package/data/probe/npm/tests/unit/readImageTool.test.js +418 -0
  269. package/data/probe/npm/tests/unit/retryManager.test.js +317 -0
  270. package/data/probe/npm/tests/unit/schema-aware-reminders.test.js +288 -0
  271. package/data/probe/npm/tests/unit/schemaDefinitionDetection.test.js +115 -0
  272. package/data/probe/npm/tests/unit/schemaUtils.test.js +1268 -0
  273. package/data/probe/npm/tests/unit/simpleTelemetry.test.js +282 -0
  274. package/data/probe/npm/tests/unit/simplified-attempt-completion.test.js +274 -0
  275. package/data/probe/npm/tests/unit/single-quote-json-bug.test.js +231 -0
  276. package/data/probe/npm/tests/unit/subgraphAutoFix.test.js +110 -0
  277. package/data/probe/npm/tests/unit/system-prompt.test.js +32 -0
  278. package/data/probe/npm/tests/unit/types-probe-agent-options.test.js +42 -0
  279. package/data/probe/npm/tests/unit/xmlParsing.test.js +720 -0
  280. package/data/probe/npm/tsconfig.json +21 -0
  281. package/data/probe/result1.txt +19 -0
  282. package/data/probe/result2.txt +26 -0
  283. package/data/probe/scripts/benchmark.sh +270 -0
  284. package/data/probe/scripts/cache_memory_analysis.rs +844 -0
  285. package/data/probe/scripts/claude-hook-wrapper.sh +56 -0
  286. package/data/probe/site/.env.example +10 -0
  287. package/data/probe/site/DEPLOYMENT.md +86 -0
  288. package/data/probe/site/README.md +183 -0
  289. package/data/probe/site/adding-languages.md +135 -0
  290. package/data/probe/site/ai-chat.md +427 -0
  291. package/data/probe/site/ai-integration.md +1488 -0
  292. package/data/probe/site/blog/agentic-flow-custom-xml-protocol.md +407 -0
  293. package/data/probe/site/blog/index.md +118 -0
  294. package/data/probe/site/blog/v0.6.0-release.md +426 -0
  295. package/data/probe/site/blog.md +8 -0
  296. package/data/probe/site/changelog.md +200 -0
  297. package/data/probe/site/cli-mode.md +437 -0
  298. package/data/probe/site/code-extraction.md +436 -0
  299. package/data/probe/site/contributing/README.md +9 -0
  300. package/data/probe/site/contributing/documentation-cross-references.md +215 -0
  301. package/data/probe/site/contributing/documentation-maintenance.md +275 -0
  302. package/data/probe/site/contributing/documentation-structure.md +75 -0
  303. package/data/probe/site/documentation-cross-references.md +215 -0
  304. package/data/probe/site/documentation-guide.md +132 -0
  305. package/data/probe/site/documentation-maintenance.md +275 -0
  306. package/data/probe/site/features.md +147 -0
  307. package/data/probe/site/how-it-works.md +118 -0
  308. package/data/probe/site/index.md +175 -0
  309. package/data/probe/site/index.md.bak +133 -0
  310. package/data/probe/site/installation.md +235 -0
  311. package/data/probe/site/integrations/docker.md +248 -0
  312. package/data/probe/site/integrations/github-actions.md +413 -0
  313. package/data/probe/site/language-support-overview.md +168 -0
  314. package/data/probe/site/mcp-integration.md +587 -0
  315. package/data/probe/site/mcp-server.md +304 -0
  316. package/data/probe/site/navigation-structure.md +76 -0
  317. package/data/probe/site/nodejs-sdk.md +798 -0
  318. package/data/probe/site/output-formats.md +625 -0
  319. package/data/probe/site/package.json +21 -0
  320. package/data/probe/site/public/_headers +28 -0
  321. package/data/probe/site/public/_redirects +11 -0
  322. package/data/probe/site/quick-start.md +289 -0
  323. package/data/probe/site/search-functionality.md +291 -0
  324. package/data/probe/site/search-reference.md +291 -0
  325. package/data/probe/site/supported-languages.md +215 -0
  326. package/data/probe/site/use-cases/README.md +8 -0
  327. package/data/probe/site/use-cases/advanced-cli.md +253 -0
  328. package/data/probe/site/use-cases/ai-code-editors.md +239 -0
  329. package/data/probe/site/use-cases/building-ai-tools.md +529 -0
  330. package/data/probe/site/use-cases/cli-ai-workflows.md +285 -0
  331. package/data/probe/site/use-cases/deploying-probe-web-interface.md +255 -0
  332. package/data/probe/site/use-cases/integrating-probe-into-ai-code-editors.md +161 -0
  333. package/data/probe/site/use-cases/nodejs-sdk.md +596 -0
  334. package/data/probe/site/use-cases/team-chat.md +350 -0
  335. package/data/probe/site/web-interface.md +434 -0
  336. package/data/probe/site/wrangler.toml +9 -0
  337. package/data/probe/test-api-key.sh +1 -0
  338. package/data/probe/test-probe-implementation/hello.js +7 -0
  339. package/data/probe/test_cases/demonstrate_early_termination_issues.sh +176 -0
  340. package/data/probe/test_cases/early_termination_issues.rs +533 -0
  341. package/data/probe/test_data/test_nested_struct.go +26 -0
  342. package/data/probe/tests/README.md +286 -0
  343. package/data/probe/tests/README_search_determinism_tests.md +116 -0
  344. package/data/probe/tests/adjacent_comment_test.rs +152 -0
  345. package/data/probe/tests/apostrophe_handling_tests.rs +132 -0
  346. package/data/probe/tests/block_filtering_with_ast_tests.rs +669 -0
  347. package/data/probe/tests/block_merging_tests.rs +396 -0
  348. package/data/probe/tests/c_outline_format_tests.rs +2179 -0
  349. package/data/probe/tests/cache_invalidation_issues.rs.disabled +682 -0
  350. package/data/probe/tests/cache_order_tests.rs +147 -0
  351. package/data/probe/tests/cache_query_scoping_tests.rs +221 -0
  352. package/data/probe/tests/cli_tests.rs +680 -0
  353. package/data/probe/tests/comment_context_integration_test.rs +240 -0
  354. package/data/probe/tests/common.rs +33 -0
  355. package/data/probe/tests/complex_block_merging_tests.rs +599 -0
  356. package/data/probe/tests/complex_query_block_filtering_tests.rs +422 -0
  357. package/data/probe/tests/control_flow_closing_braces_test.rs +91 -0
  358. package/data/probe/tests/cpp_outline_format_tests.rs +1507 -0
  359. package/data/probe/tests/csharp_outline_format_tests.rs +941 -0
  360. package/data/probe/tests/elastic_query_integration_tests.rs +922 -0
  361. package/data/probe/tests/extract_command_tests.rs +1848 -0
  362. package/data/probe/tests/extract_deduplication_tests.rs +146 -0
  363. package/data/probe/tests/extract_input_file_tests.rs +84 -0
  364. package/data/probe/tests/extract_prompt_tests.rs +102 -0
  365. package/data/probe/tests/filename_search_tests.rs +96 -0
  366. package/data/probe/tests/fixtures/user/AssemblyInfo.cs +3 -0
  367. package/data/probe/tests/github_extract_tests.rs +234 -0
  368. package/data/probe/tests/go_comment_test.rs +253 -0
  369. package/data/probe/tests/go_outline_format_tests.rs +2587 -0
  370. package/data/probe/tests/go_path_resolver_tests.rs +96 -0
  371. package/data/probe/tests/html_outline_format_tests.rs +637 -0
  372. package/data/probe/tests/integration_tests.rs +837 -0
  373. package/data/probe/tests/ip_whitelist_test.rs +148 -0
  374. package/data/probe/tests/java_outline_format_tests.rs +1611 -0
  375. package/data/probe/tests/javascript_extract_tests.rs +315 -0
  376. package/data/probe/tests/javascript_outline_format_tests.rs +1464 -0
  377. package/data/probe/tests/json_format_tests.rs +436 -0
  378. package/data/probe/tests/json_schema_validation_tests.rs +450 -0
  379. package/data/probe/tests/lib_usage.rs +60 -0
  380. package/data/probe/tests/line_comment_context_extension_test.rs +459 -0
  381. package/data/probe/tests/line_map_cache_tests.rs +114 -0
  382. package/data/probe/tests/markdown_integration_tests.rs +190 -0
  383. package/data/probe/tests/mocks/test_ip_whitelist.go +11 -0
  384. package/data/probe/tests/mocks/test_object.js +27 -0
  385. package/data/probe/tests/mocks/test_struct.go +50 -0
  386. package/data/probe/tests/multi_keyword_pattern_tests.rs +464 -0
  387. package/data/probe/tests/multi_language_syntax_integration_tests.rs +218 -0
  388. package/data/probe/tests/multiple_capture_groups_tests.rs +169 -0
  389. package/data/probe/tests/negative_compound_word_tests.rs +246 -0
  390. package/data/probe/tests/nested_symbol_extraction_tests.rs +99 -0
  391. package/data/probe/tests/outline_cross_file_interference_test.rs +335 -0
  392. package/data/probe/tests/outline_keyword_preservation_test.rs +67 -0
  393. package/data/probe/tests/output_format_edge_cases_tests.rs +693 -0
  394. package/data/probe/tests/parallel_extraction_tests.rs +178 -0
  395. package/data/probe/tests/parallel_search_tests.rs +355 -0
  396. package/data/probe/tests/path_resolver_tests.rs +698 -0
  397. package/data/probe/tests/php_outline_format_extended_tests.rs +928 -0
  398. package/data/probe/tests/php_outline_format_tests.rs +768 -0
  399. package/data/probe/tests/property_tests.proptest-regressions +9 -0
  400. package/data/probe/tests/property_tests.rs +118 -0
  401. package/data/probe/tests/python_outline_format_tests.rs +1538 -0
  402. package/data/probe/tests/query_command_json_tests.rs +438 -0
  403. package/data/probe/tests/query_command_tests.rs +232 -0
  404. package/data/probe/tests/query_command_xml_tests.rs +569 -0
  405. package/data/probe/tests/quoted_term_with_negative_keyword_tests.rs +216 -0
  406. package/data/probe/tests/required_terms_filename_tests.rs +116 -0
  407. package/data/probe/tests/ruby_outline_format_tests.rs +1011 -0
  408. package/data/probe/tests/rust_line_comment_context_test.rs +151 -0
  409. package/data/probe/tests/rust_outline_format_enhanced_tests.rs +725 -0
  410. package/data/probe/tests/rust_outline_format_tests.rs +843 -0
  411. package/data/probe/tests/schemas/xml_output_schema.xsd +38 -0
  412. package/data/probe/tests/search_determinism_tests.rs +451 -0
  413. package/data/probe/tests/search_hints_tests.rs +253 -0
  414. package/data/probe/tests/special_character_escaping_tests.rs +417 -0
  415. package/data/probe/tests/stemming_compound_word_filtering_tests.rs +535 -0
  416. package/data/probe/tests/strict_elastic_syntax_tests.rs +404 -0
  417. package/data/probe/tests/swift_outline_format_tests.rs +3319 -0
  418. package/data/probe/tests/symbols_tests.rs +166 -0
  419. package/data/probe/tests/test_file.rs +45 -0
  420. package/data/probe/tests/test_tokenize.rs +28 -0
  421. package/data/probe/tests/timeout_tests.rs +82 -0
  422. package/data/probe/tests/tokenization_tests.rs +195 -0
  423. package/data/probe/tests/tokenized_block_filtering_tests.rs +174 -0
  424. package/data/probe/tests/typescript_extract_tests.rs +214 -0
  425. package/data/probe/tests/typescript_outline_format_tests.rs +2188 -0
  426. package/data/probe/tests/xml_format_tests.rs +568 -0
  427. package/data/probe/tests/xml_schema_validation_tests.rs +497 -0
  428. package/data/scripts/postinstall.mjs +9 -0
  429. package/data/scripts/set-version.js +0 -0
  430. package/data/scripts/wiki-build.sh +111 -0
  431. package/data/scripts/wiki-deploy.sh +73 -0
  432. package/data/serve.json +12 -0
  433. package/data/test/demo-dynamic.html +134 -0
  434. package/data/test/demo-esm.html +105 -0
  435. package/data/test/demo-iife.html +78 -0
  436. package/data/tsconfig.json +7 -0
  437. package/data/vite.server.ts +483 -0
  438. package/data/vitest.config.ts +40 -0
  439. package/data/wiki/Home.md +58 -0
  440. package/data/wiki/_Sidebar.md +39 -0
  441. package/docs-mcp.config.json +20 -0
  442. package/package.json +56 -0
  443. package/src/config.js +111 -0
  444. package/src/index.js +395 -0
@@ -0,0 +1,319 @@
1
+ /**
2
+ * Tests for MCP server with strict elastic syntax validation
3
+ *
4
+ * Note: These tests use the freshly compiled probe binary from the workspace.
5
+ * In CI, the binary will be built before tests run.
6
+ */
7
+
8
+ import { search } from '../src/search.js';
9
+ import path from 'path';
10
+ import fs from 'fs';
11
+ import os from 'os';
12
+ import { exec } from 'child_process';
13
+ import { promisify } from 'util';
14
+ import { fileURLToPath } from 'url';
15
+
16
+ const execAsync = promisify(exec);
17
+ const __filename = fileURLToPath(import.meta.url);
18
+ const __dirname = path.dirname(__filename);
19
+
20
+ // Get the workspace root (one level up from npm/)
21
+ const workspaceRoot = path.resolve(__dirname, '..', '..');
22
+ const npmBinDir = path.join(__dirname, '..', 'bin');
23
+
24
+ /**
25
+ * Copy the freshly built binary from workspace to npm bin directory
26
+ */
27
+ async function copyFreshBinary() {
28
+ try {
29
+ // Check for release binary first, then debug
30
+ const possibleBinaries = [
31
+ path.join(workspaceRoot, 'target', 'release', 'probe'),
32
+ path.join(workspaceRoot, 'target', 'debug', 'probe'),
33
+ ];
34
+
35
+ let sourceBinary = null;
36
+ for (const binPath of possibleBinaries) {
37
+ if (fs.existsSync(binPath)) {
38
+ sourceBinary = binPath;
39
+ console.log(` ✓ Found fresh binary at: ${binPath}`);
40
+ break;
41
+ }
42
+ }
43
+
44
+ if (!sourceBinary) {
45
+ console.log(' ⚠️ No fresh binary found in target/release or target/debug');
46
+ console.log(' ℹ️ Run "cargo build --release" or "cargo build" to build the binary');
47
+ return false;
48
+ }
49
+
50
+ // Ensure bin directory exists
51
+ await fs.promises.mkdir(npmBinDir, { recursive: true });
52
+
53
+ // Copy to npm bin directory
54
+ const targetBinary = path.join(npmBinDir, 'probe-binary');
55
+ await fs.promises.copyFile(sourceBinary, targetBinary);
56
+ await fs.promises.chmod(targetBinary, 0o755);
57
+
58
+ console.log(` ✓ Copied fresh binary to: ${targetBinary}`);
59
+ return true;
60
+ } catch (error) {
61
+ console.error(` ✗ Error copying fresh binary: ${error.message}`);
62
+ return false;
63
+ }
64
+ }
65
+
66
+ /**
67
+ * Check if the binary supports --strict-elastic-syntax flag
68
+ */
69
+ async function binarySupportsStrictSyntax() {
70
+ try {
71
+ const binaryPath = path.join(npmBinDir, 'probe-binary');
72
+ if (!fs.existsSync(binaryPath)) {
73
+ return false;
74
+ }
75
+
76
+ const { stdout } = await execAsync(`"${binaryPath}" search --help`);
77
+ return stdout.includes('--strict-elastic-syntax');
78
+ } catch (error) {
79
+ return false;
80
+ }
81
+ }
82
+
83
+ describe('MCP Strict Elastic Syntax', () => {
84
+ let tempDir;
85
+ let skipTests = false;
86
+
87
+ beforeAll(async () => {
88
+ console.log('\n🔧 Setting up MCP strict syntax tests...');
89
+
90
+ // Try to copy fresh binary
91
+ const copiedFresh = await copyFreshBinary();
92
+
93
+ if (!copiedFresh) {
94
+ console.log(' ⚠️ Using existing binary (if available)');
95
+ }
96
+
97
+ // Check if binary supports the flag
98
+ skipTests = !(await binarySupportsStrictSyntax());
99
+
100
+ if (skipTests) {
101
+ console.log(' ⚠️ Binary does not support --strict-elastic-syntax flag');
102
+ console.log(' ℹ️ These tests will be skipped');
103
+ console.log(' 💡 To run tests, build the binary first: cargo build --release\n');
104
+ } else {
105
+ console.log(' ✓ Binary supports --strict-elastic-syntax flag');
106
+ console.log(' ✓ All tests will run\n');
107
+ }
108
+ });
109
+
110
+ beforeEach(() => {
111
+ if (skipTests) return;
112
+
113
+ // Create a temporary directory for test files
114
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'probe-mcp-test-'));
115
+
116
+ // Create test files with various patterns
117
+ const testFile = path.join(tempDir, 'test.js');
118
+ fs.writeFileSync(testFile, `
119
+ function getUserId(user) {
120
+ return user.id;
121
+ }
122
+
123
+ function get_user_name(user) {
124
+ return user.name;
125
+ }
126
+
127
+ function errorHandler(err) {
128
+ console.error('Error:', err);
129
+ }
130
+
131
+ function handleError(err) {
132
+ errorHandler(err);
133
+ }
134
+ `);
135
+ });
136
+
137
+ afterEach(() => {
138
+ if (skipTests) return;
139
+
140
+ // Clean up temp directory
141
+ if (tempDir && fs.existsSync(tempDir)) {
142
+ fs.rmSync(tempDir, { recursive: true, force: true });
143
+ }
144
+ });
145
+
146
+ test('rejects vague query with strict syntax enabled', async () => {
147
+ if (skipTests) {
148
+ console.log(' ⊘ Skipped: binary does not support --strict-elastic-syntax yet');
149
+ return;
150
+ }
151
+
152
+ await expect(
153
+ search({
154
+ path: tempDir,
155
+ query: 'error handler', // Vague query
156
+ strictElasticSyntax: true,
157
+ maxResults: 1,
158
+ timeout: 10
159
+ })
160
+ ).rejects.toThrow(/Vague query format detected/);
161
+ });
162
+
163
+ test('rejects unquoted snake_case with strict syntax enabled', async () => {
164
+ if (skipTests) {
165
+ console.log(' ⊘ Skipped: binary does not support --strict-elastic-syntax yet');
166
+ return;
167
+ }
168
+
169
+ await expect(
170
+ search({
171
+ path: tempDir,
172
+ query: 'get_user_name', // Unquoted snake_case
173
+ strictElasticSyntax: true,
174
+ maxResults: 1,
175
+ timeout: 10
176
+ })
177
+ ).rejects.toThrow(/contains special characters/);
178
+ });
179
+
180
+ test('rejects unquoted camelCase with strict syntax enabled', async () => {
181
+ if (skipTests) {
182
+ console.log(' ⊘ Skipped: binary does not support --strict-elastic-syntax yet');
183
+ return;
184
+ }
185
+
186
+ await expect(
187
+ search({
188
+ path: tempDir,
189
+ query: 'getUserId', // Unquoted camelCase
190
+ strictElasticSyntax: true,
191
+ maxResults: 1,
192
+ timeout: 10
193
+ })
194
+ ).rejects.toThrow(/contains special characters/);
195
+ });
196
+
197
+ test('accepts explicit operators with strict syntax enabled', async () => {
198
+ if (skipTests) {
199
+ console.log(' ⊘ Skipped: binary does not support --strict-elastic-syntax yet');
200
+ return;
201
+ }
202
+
203
+ const result = await search({
204
+ path: tempDir,
205
+ query: '(error AND handler)',
206
+ strictElasticSyntax: true,
207
+ maxResults: 1,
208
+ timeout: 10
209
+ });
210
+
211
+ expect(result).toBeDefined();
212
+ expect(typeof result).toBe('string');
213
+ });
214
+
215
+ test('accepts quoted snake_case with strict syntax enabled', async () => {
216
+ if (skipTests) {
217
+ console.log(' ⊘ Skipped: binary does not support --strict-elastic-syntax yet');
218
+ return;
219
+ }
220
+
221
+ const result = await search({
222
+ path: tempDir,
223
+ query: '"get_user_name"',
224
+ strictElasticSyntax: true,
225
+ maxResults: 1,
226
+ timeout: 10
227
+ });
228
+
229
+ expect(result).toBeDefined();
230
+ expect(typeof result).toBe('string');
231
+ });
232
+
233
+ test('accepts quoted camelCase with strict syntax enabled', async () => {
234
+ if (skipTests) {
235
+ console.log(' ⊘ Skipped: binary does not support --strict-elastic-syntax yet');
236
+ return;
237
+ }
238
+
239
+ const result = await search({
240
+ path: tempDir,
241
+ query: '"getUserId"',
242
+ strictElasticSyntax: true,
243
+ maxResults: 1,
244
+ timeout: 10
245
+ });
246
+
247
+ expect(result).toBeDefined();
248
+ expect(typeof result).toBe('string');
249
+ });
250
+
251
+ test('accepts single word with strict syntax enabled', async () => {
252
+ if (skipTests) {
253
+ console.log(' ⊘ Skipped: binary does not support --strict-elastic-syntax yet');
254
+ return;
255
+ }
256
+
257
+ const result = await search({
258
+ path: tempDir,
259
+ query: 'error',
260
+ strictElasticSyntax: true,
261
+ maxResults: 1,
262
+ timeout: 10
263
+ });
264
+
265
+ expect(result).toBeDefined();
266
+ expect(typeof result).toBe('string');
267
+ });
268
+
269
+ test('accepts complex query with strict syntax enabled', async () => {
270
+ if (skipTests) {
271
+ console.log(' ⊘ Skipped: binary does not support --strict-elastic-syntax yet');
272
+ return;
273
+ }
274
+
275
+ const result = await search({
276
+ path: tempDir,
277
+ query: '("getUserId" AND NOT test)',
278
+ strictElasticSyntax: true,
279
+ maxResults: 1,
280
+ timeout: 10
281
+ });
282
+
283
+ expect(result).toBeDefined();
284
+ expect(typeof result).toBe('string');
285
+ });
286
+
287
+ test('allows vague query when strict syntax is disabled', async () => {
288
+ // This test doesn't require the strict flag, so it always runs
289
+ if (!tempDir) {
290
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'probe-mcp-test-'));
291
+ }
292
+
293
+ const result = await search({
294
+ path: tempDir,
295
+ query: 'error handler', // Vague query but flag not set
296
+ strictElasticSyntax: false,
297
+ maxResults: 1,
298
+ timeout: 10
299
+ });
300
+
301
+ expect(result).toBeDefined();
302
+ expect(typeof result).toBe('string');
303
+ });
304
+
305
+ test('MCP default behavior disables strict syntax', () => {
306
+ // This is a static test, always runs
307
+ const mcpOptions = {
308
+ path: '/some/path',
309
+ query: 'test',
310
+ allowTests: true,
311
+ session: "new",
312
+ maxResults: 20,
313
+ maxTokens: 8000,
314
+ strictElasticSyntax: false, // This is the MCP default (relaxed syntax)
315
+ };
316
+
317
+ expect(mcpOptions.strictElasticSyntax).toBe(false);
318
+ });
319
+ });
@@ -0,0 +1,214 @@
1
+ /**
2
+ * Mermaid Quote Handling Tests - Updated for maid integration
3
+ *
4
+ * NOTE: This test file has been significantly updated for maid 0.0.6 integration.
5
+ * Many tests from the old regex-based validation have been REMOVED because:
6
+ * 1. Maid has different quote handling than the old manual logic
7
+ * 2. Maid doesn't support escaped quotes (\") - requires HTML entities
8
+ * 3. Maid cannot auto-fix some quote patterns that the old logic could
9
+ *
10
+ * Removed tests checked OLD behavior that maid doesn't support.
11
+ * See: https://github.com/probelabs/maid/issues/18 for maid limitations
12
+ */
13
+
14
+ import { validateAndFixMermaidResponse, validateMermaidDiagram, decodeHtmlEntities } from '../src/agent/schemaUtils.js';
15
+
16
+ describe('Mermaid Quote Escaping - Maid Integration Tests', () => {
17
+
18
+ describe('Basic Quote Validation', () => {
19
+ test('should validate diagrams with properly quoted labels', async () => {
20
+ const diagram = `
21
+ \`\`\`mermaid
22
+ graph TD
23
+ A["Task with quotes"]
24
+ B["Process with data"]
25
+ \`\`\`
26
+ `;
27
+
28
+ const result = await validateAndFixMermaidResponse(diagram, { autoFix: true });
29
+
30
+ expect(result.isValid).toBe(true);
31
+ });
32
+
33
+
34
+ });
35
+
36
+ describe('HTML Entity Handling', () => {
37
+ test('should accept HTML entities in labels', async () => {
38
+ const diagram = `
39
+ \`\`\`mermaid
40
+ graph TD
41
+ A[It's a test]
42
+ B[Process "data" file]
43
+ \`\`\`
44
+ `;
45
+
46
+ const result = await validateAndFixMermaidResponse(diagram, { autoFix: true });
47
+
48
+ expect(result.isValid).toBe(true);
49
+ });
50
+
51
+
52
+
53
+ test('should not double-encode existing ' entities', async () => {
54
+ const diagram = `
55
+ \`\`\`mermaid
56
+ graph TD
57
+ A[It's already encoded]
58
+ \`\`\`
59
+ `;
60
+
61
+ const result = await validateAndFixMermaidResponse(diagram, { autoFix: true });
62
+
63
+ expect(result.isValid).toBe(true);
64
+ expect(result.fixedResponse).not.toContain(''');
65
+ });
66
+
67
+ });
68
+
69
+ describe('Quoted Labels', () => {
70
+
71
+ });
72
+
73
+ describe('Edge Cases', () => {
74
+ test('should handle empty quotes', async () => {
75
+ const diagram = `
76
+ \`\`\`mermaid
77
+ graph TD
78
+ A[""]
79
+ B[" "]
80
+ \`\`\`
81
+ `;
82
+
83
+ const result = await validateAndFixMermaidResponse(diagram, { autoFix: true });
84
+
85
+ expect(result.isValid).toBe(true);
86
+ });
87
+
88
+ test('should handle properly quoted content', async () => {
89
+ const diagram = `
90
+ \`\`\`mermaid
91
+ graph TD
92
+ A["start and end"]
93
+ B["Content here"]
94
+ \`\`\`
95
+ `;
96
+
97
+ const result = await validateAndFixMermaidResponse(diagram, { autoFix: true });
98
+
99
+ expect(result.isValid).toBe(true);
100
+ });
101
+
102
+
103
+ test('should handle quotes in different node types with proper quoting', async () => {
104
+ const diagram = `
105
+ \`\`\`mermaid
106
+ graph TD
107
+ A["Square with quotes"]
108
+ B{"Diamond with 'quotes'"}
109
+ C(["Database with "quotes""])
110
+ \`\`\`
111
+ `;
112
+
113
+ const result = await validateAndFixMermaidResponse(diagram, { autoFix: true });
114
+
115
+ expect(result.isValid).toBe(true);
116
+ });
117
+ });
118
+
119
+ describe('Real-World Scenarios', () => {
120
+
121
+ test('should handle JSON-like content with proper quoting', async () => {
122
+ const diagram = `
123
+ \`\`\`mermaid
124
+ graph TD
125
+ A["Parse data structure"]
126
+ B["Config items"]
127
+ \`\`\`
128
+ `;
129
+
130
+ const result = await validateAndFixMermaidResponse(diagram, { autoFix: true });
131
+
132
+ expect(result.isValid).toBe(true);
133
+ });
134
+
135
+ test('should handle file paths with quotes', async () => {
136
+ const diagram = `
137
+ \`\`\`mermaid
138
+ graph TD
139
+ A["Read file path"]
140
+ B["Write file path"]
141
+ \`\`\`
142
+ `;
143
+
144
+ const result = await validateAndFixMermaidResponse(diagram, { autoFix: true });
145
+
146
+ expect(result.isValid).toBe(true);
147
+ });
148
+
149
+ });
150
+
151
+ describe('HTML Entity Decoder Tests', () => {
152
+ test('should decode all supported HTML entities', () => {
153
+ const input = '<tag> & "text" 'data' 'test'  space';
154
+ const expected = '<tag> & "text" \'data\' \'test\' space';
155
+
156
+ expect(decodeHtmlEntities(input)).toBe(expected);
157
+ });
158
+
159
+ test('should handle null and undefined gracefully', () => {
160
+ expect(decodeHtmlEntities(null)).toBe(null);
161
+ expect(decodeHtmlEntities(undefined)).toBe(undefined);
162
+ expect(decodeHtmlEntities('')).toBe('');
163
+ });
164
+
165
+ test('should decode entities multiple times in same string', () => {
166
+ const input = '&quot;one&quot; and &quot;two&quot; and &quot;three&quot;';
167
+ const expected = '"one" and "two" and "three"';
168
+
169
+ expect(decodeHtmlEntities(input)).toBe(expected);
170
+ });
171
+ });
172
+
173
+ describe('Validation Without Auto-Fix', () => {
174
+ test('should validate diagrams with quotes as valid when appropriate', async () => {
175
+ const validDiagram = `graph TD
176
+ A["Valid quoted label"]
177
+ B[Regular label]
178
+ `;
179
+
180
+ const result = await validateMermaidDiagram(validDiagram);
181
+
182
+ expect(result.isValid).toBe(true);
183
+ });
184
+
185
+ });
186
+
187
+ describe('Multiple Diagrams', () => {
188
+ test('should handle multiple diagrams with proper quoting', async () => {
189
+ const response = `
190
+ Here's the first diagram:
191
+ \`\`\`mermaid
192
+ graph TD
193
+ A["First with quotes"]
194
+ B["First with data"]
195
+ \`\`\`
196
+
197
+ And here's the second:
198
+ \`\`\`mermaid
199
+ graph LR
200
+ C["Second with &apos;entities&apos;"]
201
+ D["Second with &quot;entities&quot;"]
202
+ \`\`\`
203
+ `;
204
+
205
+ const result = await validateAndFixMermaidResponse(response, { autoFix: true });
206
+
207
+ expect(result.isValid).toBe(true);
208
+ expect(result.diagrams).toHaveLength(2);
209
+ });
210
+ });
211
+
212
+ describe('Performance', () => {
213
+ });
214
+ });
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Nested Quote Fix Tests
3
+ *
4
+ * NOTE: Most tests in this file have been skipped for maid 0.0.6 integration.
5
+ * These tests check OLD regex-based HTML entity handling and quote fixing behavior:
6
+ * - Converting &apos; to &#39;
7
+ * - Automatic quote wrapping with escaped inner quotes
8
+ * - Specific HTML entity normalization
9
+ *
10
+ * Maid handles HTML entities and quotes differently using proper parsing.
11
+ * Tests marked with .skip check OLD behavior that maid doesn't replicate.
12
+ */
13
+
14
+ import { validateAndFixMermaidResponse } from '../src/agent/schemaUtils.js';
15
+
16
+
17
+
18
+ test('should not double-encode already encoded entities', async () => {
19
+ const preEncodedDiagram = `
20
+ \`\`\`mermaid
21
+ graph TD
22
+ A[Text with &#39;single&#39; quotes]
23
+ B[Text with &quot;double&quot; quotes]
24
+ \`\`\`
25
+ `;
26
+
27
+ const result = await validateAndFixMermaidResponse(preEncodedDiagram, {
28
+ autoFix: true,
29
+ debug: false
30
+ });
31
+
32
+ expect(result.isValid).toBe(true);
33
+
34
+ // Should not double-encode
35
+ expect(result.fixedResponse).not.toContain('&amp;#39;');
36
+ expect(result.fixedResponse).not.toContain('&amp;quot;');
37
+ });
38
+
39
+
40
+
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Jest setup file
3
+ * This file runs before all tests to set up the testing environment
4
+ */
5
+ import { jest, beforeEach, afterEach } from '@jest/globals';
6
+ import fs from 'fs';
7
+ import path from 'path';
8
+
9
+ // Set environment to test
10
+ process.env.NODE_ENV = 'test';
11
+
12
+ // Disable debug logging during tests unless explicitly enabled
13
+ if (!process.env.TEST_DEBUG) {
14
+ process.env.DEBUG = '';
15
+ }
16
+
17
+ // Prefer local binary in repository to avoid network during tests
18
+ try {
19
+ const isWin = process.platform === 'win32';
20
+ const binDir = path.resolve(__dirname, '..', 'bin');
21
+ const candidate = path.join(binDir, isWin ? 'probe.exe' : 'probe-binary');
22
+ if (fs.existsSync(candidate)) {
23
+ process.env.PROBE_PATH = candidate;
24
+ }
25
+ } catch {}
26
+
27
+ // Global test timeout (can be overridden per test)
28
+ jest.setTimeout(10000);
29
+
30
+ // Mock console methods to avoid cluttering test output
31
+ const originalConsole = { ...console };
32
+ beforeEach(() => {
33
+ if (!process.env.TEST_VERBOSE) {
34
+ console.log = jest.fn();
35
+ console.error = jest.fn();
36
+ console.warn = jest.fn();
37
+ }
38
+ });
39
+
40
+ afterEach(() => {
41
+ if (!process.env.TEST_VERBOSE) {
42
+ console.log = originalConsole.log;
43
+ console.error = originalConsole.error;
44
+ console.warn = originalConsole.warn;
45
+ }
46
+ });