@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,569 @@
1
+ use roxmltree::{Document, Node};
2
+ use std::fs::{self, File};
3
+ use std::io::Write;
4
+ use std::path::PathBuf;
5
+ use std::process::Command;
6
+ use tempfile::TempDir;
7
+
8
+ // Helper function to extract XML from command output
9
+ fn extract_xml_from_output(output: &str) -> &str {
10
+ // Find the first occurrence of '<?xml'
11
+ if let Some(start_index) = output.find("<?xml") {
12
+ // Return the substring from the first '<?xml' to the end
13
+ &output[start_index..]
14
+ } else {
15
+ // If no '<?xml' is found, return the original string
16
+ output
17
+ }
18
+ }
19
+
20
+ // Helper function to create test files
21
+ fn create_test_file(dir: &TempDir, filename: &str, content: &str) -> PathBuf {
22
+ let file_path = dir.path().join(filename);
23
+ let parent_dir = file_path.parent().unwrap();
24
+ fs::create_dir_all(parent_dir).expect("Failed to create parent directories");
25
+ let mut file = File::create(&file_path).expect("Failed to create test file");
26
+ file.write_all(content.as_bytes())
27
+ .expect("Failed to write test content");
28
+ file_path
29
+ }
30
+
31
+ // Helper function to create a test directory structure with various test files
32
+ fn create_test_directory_structure(root_dir: &TempDir) {
33
+ // Create a source directory
34
+ let src_dir = root_dir.path().join("src");
35
+ fs::create_dir(&src_dir).expect("Failed to create src directory");
36
+
37
+ // Create Rust files with functions
38
+ let rust_content = r#"
39
+ fn hello_world() {
40
+ println!("Hello, world!");
41
+ }
42
+
43
+ fn add(a: i32, b: i32) -> i32 {
44
+ a + b
45
+ }
46
+ "#;
47
+ create_test_file(root_dir, "src/functions.rs", rust_content);
48
+
49
+ // Create a JavaScript file with functions
50
+ let js_content = r#"
51
+ function greet(name) {
52
+ return `Hello, ${name}!`;
53
+ }
54
+
55
+ const multiply = (a, b) => a * b;
56
+ "#;
57
+ create_test_file(root_dir, "src/functions.js", js_content);
58
+
59
+ // Create a file with special characters
60
+ let special_chars_content = r#"
61
+ // This file contains special characters: "quotes", 'apostrophes', <tags>, &ampersands
62
+ function escapeTest(input) {
63
+ return input.replace(/[<>&"']/g, function(c) {
64
+ return {
65
+ '<': '&lt;',
66
+ '>': '&gt;',
67
+ '&': '&amp;',
68
+ '"': '&quot;',
69
+ "'": '&#39;'
70
+ }[c];
71
+ });
72
+ }
73
+ "#;
74
+ create_test_file(root_dir, "src/special_chars.js", special_chars_content);
75
+
76
+ // Create a Python file with functions
77
+ let python_content = r#"
78
+ def calculate_sum(numbers):
79
+ """Calculate the sum of a list of numbers."""
80
+ return sum(numbers)
81
+
82
+ def process_data(data, callback):
83
+ """Process data using the provided callback function."""
84
+ return callback(data)
85
+ "#;
86
+ create_test_file(root_dir, "src/functions.py", python_content);
87
+ }
88
+
89
+ #[test]
90
+ fn test_query_xml_output_rust_functions() {
91
+ let temp_dir = TempDir::new().expect("Failed to create temp dir");
92
+ create_test_directory_structure(&temp_dir);
93
+
94
+ // Run the CLI with XML output format
95
+ let output = Command::new("cargo")
96
+ .args([
97
+ "run",
98
+ "--",
99
+ "query",
100
+ "fn $NAME($$$PARAMS) $$$BODY", // Pattern to search for Rust functions
101
+ temp_dir.path().to_str().unwrap(),
102
+ "--language",
103
+ "rust",
104
+ "--format",
105
+ "xml",
106
+ ])
107
+ .output()
108
+ .expect("Failed to execute command");
109
+
110
+ // Check that the command succeeded
111
+ assert!(output.status.success());
112
+
113
+ // Convert stdout to string
114
+ let stdout = String::from_utf8_lossy(&output.stdout);
115
+
116
+ // Extract the XML part from the output
117
+ let xml_str = extract_xml_from_output(&stdout);
118
+
119
+ // Parse the XML output
120
+ let doc = Document::parse(xml_str).expect("Failed to parse XML output");
121
+ let root = doc.root_element();
122
+
123
+ // Validate the structure of the XML output
124
+ assert_eq!(
125
+ root.tag_name().name(),
126
+ "probe_results",
127
+ "Root element should be 'probe_results'"
128
+ );
129
+
130
+ // Validate that there are result elements
131
+ let matches: Vec<Node> = root
132
+ .children()
133
+ .filter(|n| n.is_element() && n.tag_name().name() == "result")
134
+ .collect();
135
+ assert!(
136
+ !matches.is_empty(),
137
+ "Should have at least one match element"
138
+ );
139
+ assert_eq!(matches.len(), 2, "Should find 2 Rust functions");
140
+
141
+ // Validate the summary element
142
+ let summary = root
143
+ .children()
144
+ .find(|n| n.is_element() && n.tag_name().name() == "summary");
145
+ assert!(summary.is_some(), "Should have a summary element");
146
+
147
+ if let Some(summary) = summary {
148
+ // Validate the summary contains count, total_bytes, and total_tokens
149
+ let count = summary
150
+ .children()
151
+ .find(|n| n.is_element() && n.tag_name().name() == "count");
152
+ assert!(count.is_some(), "Summary should have a count element");
153
+
154
+ let total_bytes = summary
155
+ .children()
156
+ .find(|n| n.is_element() && n.tag_name().name() == "total_bytes");
157
+ assert!(
158
+ total_bytes.is_some(),
159
+ "Summary should have a total_bytes element"
160
+ );
161
+
162
+ let total_tokens = summary
163
+ .children()
164
+ .find(|n| n.is_element() && n.tag_name().name() == "total_tokens");
165
+ assert!(
166
+ total_tokens.is_some(),
167
+ "Summary should have a total_tokens element"
168
+ );
169
+
170
+ // Validate the count matches the number of matches
171
+ if let Some(count) = count {
172
+ let count_value = count.text().unwrap_or("0").parse::<usize>().unwrap_or(0);
173
+ assert_eq!(
174
+ count_value,
175
+ matches.len(),
176
+ "Count should match the number of matches"
177
+ );
178
+ }
179
+ }
180
+
181
+ // Validate the structure of each match
182
+ for match_node in matches {
183
+ // Check for required elements
184
+ let file = match_node
185
+ .children()
186
+ .find(|n| n.is_element() && n.tag_name().name() == "file");
187
+ assert!(file.is_some(), "Each match should have a file element");
188
+
189
+ let lines = match_node
190
+ .children()
191
+ .find(|n| n.is_element() && n.tag_name().name() == "lines");
192
+ assert!(lines.is_some(), "Each result should have a lines element");
193
+
194
+ let node_type = match_node
195
+ .children()
196
+ .find(|n| n.is_element() && n.tag_name().name() == "node_type");
197
+ assert!(
198
+ node_type.is_some(),
199
+ "Each result should have a node_type element"
200
+ );
201
+
202
+ let column_start = match_node
203
+ .children()
204
+ .find(|n| n.is_element() && n.tag_name().name() == "column_start");
205
+ assert!(
206
+ column_start.is_some(),
207
+ "Each result should have a column_start element"
208
+ );
209
+
210
+ let column_end = match_node
211
+ .children()
212
+ .find(|n| n.is_element() && n.tag_name().name() == "column_end");
213
+ assert!(
214
+ column_end.is_some(),
215
+ "Each result should have a column_end element"
216
+ );
217
+
218
+ let code = match_node
219
+ .children()
220
+ .find(|n| n.is_element() && n.tag_name().name() == "code");
221
+ assert!(code.is_some(), "Each result should have a code element");
222
+
223
+ // Validate that code element contains function code
224
+ if let Some(code) = code {
225
+ let code_content = code.text();
226
+ assert!(
227
+ code_content.is_some(),
228
+ "Code element should have text content"
229
+ );
230
+ assert!(
231
+ code_content.unwrap().starts_with("fn "),
232
+ "Function code should start with 'fn '"
233
+ );
234
+ }
235
+ }
236
+ }
237
+
238
+ #[test]
239
+ fn test_query_xml_output_javascript_functions() {
240
+ let temp_dir = TempDir::new().expect("Failed to create temp dir");
241
+ create_test_directory_structure(&temp_dir);
242
+
243
+ // Run the CLI with XML output format
244
+ let output = Command::new("cargo")
245
+ .args([
246
+ "run",
247
+ "--",
248
+ "query",
249
+ "function $NAME($$$PARAMS) $$$BODY", // Pattern to search for JavaScript functions
250
+ temp_dir.path().to_str().unwrap(),
251
+ "--language",
252
+ "javascript",
253
+ "--format",
254
+ "xml",
255
+ ])
256
+ .output()
257
+ .expect("Failed to execute command");
258
+
259
+ // Check that the command succeeded
260
+ assert!(output.status.success());
261
+
262
+ // Convert stdout to string
263
+ let stdout = String::from_utf8_lossy(&output.stdout);
264
+
265
+ // Extract the XML part from the output
266
+ let xml_str = extract_xml_from_output(&stdout);
267
+
268
+ // Parse the XML output
269
+ let doc = Document::parse(xml_str).expect("Failed to parse XML output");
270
+ let root = doc.root_element();
271
+
272
+ // Validate that there are result elements
273
+ let matches: Vec<Node> = root
274
+ .children()
275
+ .filter(|n| n.is_element() && n.tag_name().name() == "result")
276
+ .collect();
277
+ assert!(
278
+ !matches.is_empty(),
279
+ "Should have at least one result element"
280
+ );
281
+
282
+ // Check that we found the JavaScript functions
283
+ let has_greet = matches.iter().any(|m| {
284
+ if let Some(code) = m
285
+ .children()
286
+ .find(|n| n.is_element() && n.tag_name().name() == "code")
287
+ {
288
+ if let Some(content) = code.text() {
289
+ return content.contains("greet");
290
+ }
291
+ }
292
+ false
293
+ });
294
+
295
+ assert!(has_greet, "Should find the 'greet' function");
296
+ }
297
+
298
+ #[test]
299
+ fn test_query_xml_output_with_special_characters() {
300
+ let temp_dir = TempDir::new().expect("Failed to create temp dir");
301
+ create_test_directory_structure(&temp_dir);
302
+
303
+ // Run the CLI with XML output format, searching for the escape function
304
+ let output = Command::new("cargo")
305
+ .args([
306
+ "run",
307
+ "--",
308
+ "query",
309
+ "function escapeTest", // Pattern to search for the escape function
310
+ temp_dir.path().to_str().unwrap(),
311
+ "--language",
312
+ "javascript",
313
+ "--format",
314
+ "xml",
315
+ ])
316
+ .output()
317
+ .expect("Failed to execute command");
318
+
319
+ // Check that the command succeeded
320
+ assert!(output.status.success());
321
+
322
+ // Convert stdout to string
323
+ let stdout = String::from_utf8_lossy(&output.stdout);
324
+
325
+ // Extract the XML part from the output
326
+ let xml_str = extract_xml_from_output(&stdout);
327
+
328
+ // Parse the XML output
329
+ let doc = Document::parse(xml_str).expect("Failed to parse XML output");
330
+ let root = doc.root_element();
331
+
332
+ // Validate that there are result elements
333
+ let matches: Vec<Node> = root
334
+ .children()
335
+ .filter(|n| n.is_element() && n.tag_name().name() == "result")
336
+ .collect();
337
+ assert!(
338
+ !matches.is_empty(),
339
+ "Should have at least one result element"
340
+ );
341
+
342
+ // Find the result with special characters
343
+ let escape_match = matches.iter().find(|&m| {
344
+ if let Some(code) = m
345
+ .children()
346
+ .find(|n| n.is_element() && n.tag_name().name() == "code")
347
+ {
348
+ if let Some(content) = code.text() {
349
+ return content.contains("escapeTest");
350
+ }
351
+ }
352
+ false
353
+ });
354
+
355
+ assert!(
356
+ escape_match.is_some(),
357
+ "Should find the 'escapeTest' function"
358
+ );
359
+
360
+ // Verify that special characters are properly handled in the XML
361
+ if let Some(match_node) = escape_match {
362
+ if let Some(code) = match_node
363
+ .children()
364
+ .find(|n| n.is_element() && n.tag_name().name() == "code")
365
+ {
366
+ if let Some(content) = code.text() {
367
+ // Check for special characters in the function body
368
+ // The function contains special characters in the string literals
369
+ assert!(content.contains("&lt;"), "Should contain '&lt;'");
370
+ assert!(content.contains("&gt;"), "Should contain '&gt;'");
371
+ assert!(content.contains("&amp;"), "Should contain '&amp;'");
372
+ assert!(content.contains("&quot;"), "Should contain '&quot;'");
373
+ assert!(content.contains("&#39;"), "Should contain '&#39;'");
374
+ } else {
375
+ panic!("Code element should have content");
376
+ }
377
+ } else {
378
+ panic!("Result should have a code element");
379
+ }
380
+
381
+ // Check that file path is properly escaped
382
+ if let Some(file) = match_node
383
+ .children()
384
+ .find(|n| n.is_element() && n.tag_name().name() == "file")
385
+ {
386
+ if let Some(text) = file.text() {
387
+ // The XML should parse correctly, which means special characters in attributes are escaped
388
+ assert!(
389
+ text.contains("special_chars.js"),
390
+ "File path should be correct"
391
+ );
392
+ } else {
393
+ panic!("File element should have text content");
394
+ }
395
+ } else {
396
+ panic!("Result should have a file element");
397
+ }
398
+ }
399
+ }
400
+
401
+ #[test]
402
+ fn test_query_xml_output_with_multiple_languages() {
403
+ let temp_dir = TempDir::new().expect("Failed to create temp dir");
404
+ create_test_directory_structure(&temp_dir);
405
+
406
+ // Run the CLI with XML output format, searching for Python functions
407
+ let output = Command::new("cargo")
408
+ .args([
409
+ "run",
410
+ "--",
411
+ "query",
412
+ "def $NAME($$$PARAMS): $$$BODY", // Pattern to search for Python functions
413
+ temp_dir.path().to_str().unwrap(),
414
+ "--language",
415
+ "python",
416
+ "--format",
417
+ "xml",
418
+ ])
419
+ .output()
420
+ .expect("Failed to execute command");
421
+
422
+ // Check that the command succeeded
423
+ assert!(output.status.success());
424
+
425
+ // Convert stdout to string
426
+ let stdout = String::from_utf8_lossy(&output.stdout);
427
+
428
+ // Extract the XML part from the output
429
+ let xml_str = extract_xml_from_output(&stdout);
430
+
431
+ // Parse the XML output
432
+ let doc = Document::parse(xml_str).expect("Failed to parse XML output");
433
+ let root = doc.root_element();
434
+
435
+ // Validate that there are result elements
436
+ let matches: Vec<Node> = root
437
+ .children()
438
+ .filter(|n| n.is_element() && n.tag_name().name() == "result")
439
+ .collect();
440
+ assert!(
441
+ !matches.is_empty(),
442
+ "Should have at least one result element"
443
+ );
444
+
445
+ // Check that we found Python functions
446
+ let has_calculate_sum = matches.iter().any(|m| {
447
+ if let Some(code) = m
448
+ .children()
449
+ .find(|n| n.is_element() && n.tag_name().name() == "code")
450
+ {
451
+ if let Some(content) = code.text() {
452
+ return content.contains("calculate_sum");
453
+ }
454
+ }
455
+ false
456
+ });
457
+
458
+ let has_process_data = matches.iter().any(|m| {
459
+ if let Some(code) = m
460
+ .children()
461
+ .find(|n| n.is_element() && n.tag_name().name() == "code")
462
+ {
463
+ if let Some(content) = code.text() {
464
+ return content.contains("process_data");
465
+ }
466
+ }
467
+ false
468
+ });
469
+
470
+ assert!(
471
+ has_calculate_sum,
472
+ "Should find the 'calculate_sum' function"
473
+ );
474
+ assert!(has_process_data, "Should find the 'process_data' function");
475
+ }
476
+
477
+ #[test]
478
+ fn test_query_xml_output_with_no_results() {
479
+ let temp_dir = TempDir::new().expect("Failed to create temp dir");
480
+ create_test_directory_structure(&temp_dir);
481
+
482
+ // Run the CLI with XML output format, searching for a pattern that doesn't exist
483
+ let output = Command::new("cargo")
484
+ .args([
485
+ "run",
486
+ "--",
487
+ "query",
488
+ "class $NAME { $$$METHODS }", // Pattern that doesn't match any file
489
+ temp_dir.path().to_str().unwrap(),
490
+ "--format",
491
+ "xml",
492
+ ])
493
+ .output()
494
+ .expect("Failed to execute command");
495
+
496
+ // Check that the command succeeded
497
+ assert!(output.status.success());
498
+
499
+ // Convert stdout to string
500
+ let stdout = String::from_utf8_lossy(&output.stdout);
501
+
502
+ // Extract the XML part from the output
503
+ let xml_str = extract_xml_from_output(&stdout);
504
+
505
+ // Parse the XML output
506
+ let doc = Document::parse(xml_str).expect("Failed to parse XML output");
507
+ let root = doc.root_element();
508
+
509
+ // Validate the structure of the XML output
510
+ assert_eq!(
511
+ root.tag_name().name(),
512
+ "probe_results",
513
+ "Root element should be 'probe_results'"
514
+ );
515
+
516
+ // Validate that there are no result elements
517
+ let matches: Vec<Node> = root
518
+ .children()
519
+ .filter(|n| n.is_element() && n.tag_name().name() == "result")
520
+ .collect();
521
+ assert!(matches.is_empty(), "Should have no result elements");
522
+
523
+ // Validate the summary element
524
+ let summary = root
525
+ .children()
526
+ .find(|n| n.is_element() && n.tag_name().name() == "summary");
527
+ assert!(summary.is_some(), "Should have a summary element");
528
+
529
+ if let Some(summary) = summary {
530
+ // Validate the summary contains count, total_bytes, and total_tokens with zero values
531
+ if let Some(count) = summary
532
+ .children()
533
+ .find(|n| n.is_element() && n.tag_name().name() == "count")
534
+ {
535
+ let count_value = count.text().unwrap_or("0").parse::<usize>().unwrap_or(0);
536
+ assert_eq!(count_value, 0, "Count should be 0");
537
+ } else {
538
+ panic!("Summary should have a count element");
539
+ }
540
+
541
+ if let Some(total_bytes) = summary
542
+ .children()
543
+ .find(|n| n.is_element() && n.tag_name().name() == "total_bytes")
544
+ {
545
+ let total_bytes_value = total_bytes
546
+ .text()
547
+ .unwrap_or("0")
548
+ .parse::<usize>()
549
+ .unwrap_or(0);
550
+ assert_eq!(total_bytes_value, 0, "Total bytes should be 0");
551
+ } else {
552
+ panic!("Summary should have a total_bytes element");
553
+ }
554
+
555
+ if let Some(total_tokens) = summary
556
+ .children()
557
+ .find(|n| n.is_element() && n.tag_name().name() == "total_tokens")
558
+ {
559
+ let total_tokens_value = total_tokens
560
+ .text()
561
+ .unwrap_or("0")
562
+ .parse::<usize>()
563
+ .unwrap_or(0);
564
+ assert_eq!(total_tokens_value, 0, "Total tokens should be 0");
565
+ } else {
566
+ panic!("Summary should have a total_tokens element");
567
+ }
568
+ }
569
+ }