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