@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,693 @@
1
+ use roxmltree::{Document, Node};
2
+ use serde_json::Value;
3
+ use std::fs::{self, File};
4
+ use std::io::Write;
5
+ use std::path::PathBuf;
6
+ use std::process::Command;
7
+ use tempfile::TempDir;
8
+
9
+ // Helper function to extract JSON from command output
10
+ fn extract_json_from_output(output: &str) -> &str {
11
+ // Find the first occurrence of '{'
12
+ if let Some(start_index) = output.find('{') {
13
+ // Return the substring from the first '{' to the end
14
+ &output[start_index..]
15
+ } else {
16
+ // If no '{' is found, return the original string
17
+ output
18
+ }
19
+ }
20
+
21
+ // Helper function to extract XML from command output
22
+ fn extract_xml_from_output(output: &str) -> &str {
23
+ // Find the first occurrence of '<?xml'
24
+ if let Some(start_index) = output.find("<?xml") {
25
+ // Return the substring from the first '<?xml' to the end
26
+ &output[start_index..]
27
+ } else {
28
+ // If no '<?xml' is found, return the original string
29
+ output
30
+ }
31
+ }
32
+
33
+ // Helper function to create test files
34
+ fn create_test_file(dir: &TempDir, filename: &str, content: &str) -> PathBuf {
35
+ let file_path = dir.path().join(filename);
36
+ let parent_dir = file_path.parent().unwrap();
37
+ fs::create_dir_all(parent_dir).expect("Failed to create parent directories");
38
+ let mut file = File::create(&file_path).expect("Failed to create test file");
39
+ file.write_all(content.as_bytes())
40
+ .expect("Failed to write test content");
41
+ file_path
42
+ }
43
+
44
+ // Helper function to create a test directory with edge case files
45
+ fn create_edge_case_test_files(root_dir: &TempDir) {
46
+ // Create a source directory
47
+ let src_dir = root_dir.path().join("src");
48
+ fs::create_dir(&src_dir).expect("Failed to create src directory");
49
+
50
+ // File with extremely long lines
51
+ let long_line_content = format!(
52
+ r#"
53
+ // This file contains an extremely long line
54
+ function longLine() {{
55
+ const longString = "{}";
56
+ return longString;
57
+ }}
58
+ "#,
59
+ "x".repeat(10000) // Create a very long string
60
+ );
61
+ create_test_file(root_dir, "src/long_line.js", &long_line_content);
62
+
63
+ // File with a large number of short lines
64
+ let mut many_lines_content = String::from(
65
+ r#"
66
+ // This file contains many short lines
67
+ function manyLines() {
68
+ const lines = [
69
+ "#,
70
+ );
71
+
72
+ for i in 0..1000 {
73
+ many_lines_content.push_str(&format!(" \"Line {i}\",\n"));
74
+ }
75
+
76
+ many_lines_content.push_str(
77
+ r#" ];
78
+ return lines;
79
+ }
80
+ "#,
81
+ );
82
+ create_test_file(root_dir, "src/many_lines.js", &many_lines_content);
83
+
84
+ // File with nested structures
85
+ let nested_content = r#"
86
+ // This file contains deeply nested structures
87
+ function nestedStructure() {
88
+ const nested = {
89
+ level1: {
90
+ level2: {
91
+ level3: {
92
+ level4: {
93
+ level5: {
94
+ level6: {
95
+ level7: {
96
+ level8: {
97
+ level9: {
98
+ level10: {
99
+ value: "deeply nested"
100
+ }
101
+ }
102
+ }
103
+ }
104
+ }
105
+ }
106
+ }
107
+ }
108
+ }
109
+ }
110
+ };
111
+ return nested;
112
+ }
113
+ "#;
114
+ create_test_file(root_dir, "src/nested_structure.js", nested_content);
115
+
116
+ // File with binary data representation
117
+ let binary_content = r#"
118
+ // This file contains binary data representation
119
+ function binaryData() {
120
+ const buffer = new Uint8Array([
121
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
122
+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
123
+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
124
+ 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
125
+ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
126
+ 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
127
+ 0x7F, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86,
128
+ 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E,
129
+ 0xFF
130
+ ]);
131
+ return buffer;
132
+ }
133
+ "#;
134
+ create_test_file(root_dir, "src/binary_data.js", binary_content);
135
+
136
+ // File with zero-width characters and other invisible characters
137
+ let invisible_chars_content = r#"
138
+ // This file contains zero-width and invisible characters
139
+ function invisibleChars() {
140
+ // Zero-width space (U+200B): "\u{200B}"
141
+ // Zero-width non-joiner (U+200C): "‌"
142
+ // Zero-width joiner (U+200D): "‍"
143
+ // Left-to-right mark (U+200E): "‎"
144
+ // Right-to-left mark (U+200F): "‏"
145
+
146
+ const text = "This\u{200B} has‌ invisible‍ characters‎ in‏ it";
147
+ return text;
148
+ }
149
+ "#;
150
+ create_test_file(root_dir, "src/invisible_chars.js", invisible_chars_content);
151
+
152
+ // File with mixed encodings
153
+ let mixed_encodings_content = r#"
154
+ // This file contains characters from different encodings
155
+ function mixedEncodings() {
156
+ // Latin: "Hello, World!"
157
+ // Cyrillic: "Привет, мир!"
158
+ // Greek: "Γειά σου, κόσμε!"
159
+ // Arabic: "مرحبا بالعالم!"
160
+ // Hebrew: "שלום, עולם!"
161
+ // Chinese: "你好,世界!"
162
+ // Japanese: "こんにちは、世界!"
163
+ // Korean: "안녕하세요, 세계!"
164
+ // Thai: "สวัสดี, โลก!"
165
+
166
+ const greetings = [
167
+ "Hello, World!",
168
+ "Привет, мир!",
169
+ "Γειά σου, κόσμε!",
170
+ "مرحبا بالعالم!",
171
+ "שלום, עולם!",
172
+ "你好,世界!",
173
+ "こんにちは、世界!",
174
+ "안녕하세요, 세계!",
175
+ "สวัสดี, โลก!"
176
+ ];
177
+
178
+ return greetings;
179
+ }
180
+ "#;
181
+ create_test_file(root_dir, "src/mixed_encodings.js", mixed_encodings_content);
182
+ }
183
+
184
+ #[test]
185
+ fn test_json_output_with_long_lines() {
186
+ let temp_dir = TempDir::new().expect("Failed to create temp dir");
187
+ create_edge_case_test_files(&temp_dir);
188
+
189
+ // Run the CLI with JSON output format, searching for "longLine"
190
+ let output = Command::new("cargo")
191
+ .args([
192
+ "run",
193
+ "--",
194
+ "search",
195
+ "longLine", // Pattern to search for
196
+ temp_dir.path().to_str().unwrap(),
197
+ "--format",
198
+ "json",
199
+ ])
200
+ .output()
201
+ .expect("Failed to execute command");
202
+
203
+ // Check that the command succeeded
204
+ assert!(output.status.success());
205
+
206
+ // Convert stdout to string
207
+ let stdout = String::from_utf8_lossy(&output.stdout);
208
+
209
+ // Extract the JSON part from the output
210
+ let json_str = extract_json_from_output(&stdout);
211
+
212
+ // Parse the JSON output
213
+ let json_result: Value =
214
+ serde_json::from_str(json_str).expect("Failed to parse JSON output with long lines");
215
+
216
+ // Find the result with long lines
217
+ let results = json_result.get("results").unwrap().as_array().unwrap();
218
+ let long_line_result = results.iter().find(|r| {
219
+ r.get("file")
220
+ .unwrap()
221
+ .as_str()
222
+ .unwrap()
223
+ .contains("long_line.js")
224
+ });
225
+
226
+ assert!(
227
+ long_line_result.is_some(),
228
+ "Should find the long_line.js file"
229
+ );
230
+
231
+ // Verify that the long line is properly handled in the JSON
232
+ let code = long_line_result
233
+ .unwrap()
234
+ .get("code")
235
+ .unwrap()
236
+ .as_str()
237
+ .unwrap();
238
+ assert!(
239
+ code.contains("longLine"),
240
+ "Should contain the function name"
241
+ );
242
+ assert!(
243
+ code.contains("longString"),
244
+ "Should contain the variable name"
245
+ );
246
+
247
+ // Check that the JSON is valid with the long line
248
+ let code_json = serde_json::json!({ "code": code });
249
+ let code_str = serde_json::to_string(&code_json).expect("Failed to serialize code to JSON");
250
+
251
+ // Deserialize to verify it's valid JSON
252
+ let _: Value = serde_json::from_str(&code_str).expect("Failed to parse serialized code JSON");
253
+ }
254
+
255
+ #[test]
256
+ fn test_json_output_with_many_lines() {
257
+ let temp_dir = TempDir::new().expect("Failed to create temp dir");
258
+ create_edge_case_test_files(&temp_dir);
259
+
260
+ // Run the CLI with JSON output format, searching for "Line"
261
+ let output = Command::new("cargo")
262
+ .args([
263
+ "run",
264
+ "--",
265
+ "search",
266
+ "Line", // Pattern to search for
267
+ temp_dir.path().to_str().unwrap(),
268
+ "--format",
269
+ "json",
270
+ ])
271
+ .output()
272
+ .expect("Failed to execute command");
273
+
274
+ // Check that the command succeeded
275
+ assert!(output.status.success());
276
+
277
+ // Convert stdout to string
278
+ let stdout = String::from_utf8_lossy(&output.stdout);
279
+
280
+ // Extract the JSON part from the output
281
+ let json_str = extract_json_from_output(&stdout);
282
+
283
+ // Parse the JSON output
284
+ let json_result: Value =
285
+ serde_json::from_str(json_str).expect("Failed to parse JSON output with many lines");
286
+
287
+ // Check that we have results
288
+ let results = json_result.get("results").unwrap().as_array().unwrap();
289
+ assert!(!results.is_empty(), "Should have at least one result");
290
+
291
+ // Just verify that the JSON is valid and can be parsed
292
+ let summary = json_result.get("summary").unwrap();
293
+ assert!(
294
+ summary.get("count").is_some(),
295
+ "Should have a count field in summary"
296
+ );
297
+ assert!(
298
+ summary.get("total_bytes").is_some(),
299
+ "Should have a total_bytes field in summary"
300
+ );
301
+ assert!(
302
+ summary.get("total_tokens").is_some(),
303
+ "Should have a total_tokens field in summary"
304
+ );
305
+
306
+ // Check that the JSON itself is valid
307
+ let json_str = serde_json::to_string(&json_result).expect("Failed to serialize JSON result");
308
+ let _: Value = serde_json::from_str(&json_str).expect("Failed to parse serialized JSON");
309
+ }
310
+
311
+ #[test]
312
+ fn test_json_output_with_nested_structures() {
313
+ let temp_dir = TempDir::new().expect("Failed to create temp dir");
314
+ create_edge_case_test_files(&temp_dir);
315
+
316
+ // Run the CLI with JSON output format, searching for "nestedStructure"
317
+ let output = Command::new("cargo")
318
+ .args([
319
+ "run",
320
+ "--",
321
+ "search",
322
+ "nestedStructure", // Pattern to search for
323
+ temp_dir.path().to_str().unwrap(),
324
+ "--format",
325
+ "json",
326
+ ])
327
+ .output()
328
+ .expect("Failed to execute command");
329
+
330
+ // Check that the command succeeded
331
+ assert!(output.status.success());
332
+
333
+ // Convert stdout to string
334
+ let stdout = String::from_utf8_lossy(&output.stdout);
335
+
336
+ // Extract the JSON part from the output
337
+ let json_str = extract_json_from_output(&stdout);
338
+
339
+ // Parse the JSON output
340
+ let json_result: Value =
341
+ serde_json::from_str(json_str).expect("Failed to parse JSON output with nested structures");
342
+
343
+ // Find the result with nested structures
344
+ let results = json_result.get("results").unwrap().as_array().unwrap();
345
+ let nested_result = results.iter().find(|r| {
346
+ r.get("file")
347
+ .unwrap()
348
+ .as_str()
349
+ .unwrap()
350
+ .contains("nested_structure.js")
351
+ });
352
+
353
+ assert!(
354
+ nested_result.is_some(),
355
+ "Should find the nested_structure.js file"
356
+ );
357
+
358
+ // Verify that the nested structures are properly handled in the JSON
359
+ let code = nested_result
360
+ .unwrap()
361
+ .get("code")
362
+ .unwrap()
363
+ .as_str()
364
+ .unwrap();
365
+ assert!(
366
+ code.contains("nestedStructure"),
367
+ "Should contain the function name"
368
+ );
369
+ assert!(code.contains("level1"), "Should contain level1");
370
+ assert!(code.contains("level10"), "Should contain level10");
371
+ assert!(
372
+ code.contains("deeply nested"),
373
+ "Should contain the nested value"
374
+ );
375
+
376
+ // Check that the JSON is valid with nested structures
377
+ let code_json = serde_json::json!({ "code": code });
378
+ let code_str = serde_json::to_string(&code_json).expect("Failed to serialize code to JSON");
379
+
380
+ // Deserialize to verify it's valid JSON
381
+ let _: Value = serde_json::from_str(&code_str).expect("Failed to parse serialized code JSON");
382
+ }
383
+
384
+ #[test]
385
+ fn test_json_output_with_mixed_encodings() {
386
+ let temp_dir = TempDir::new().expect("Failed to create temp dir");
387
+ create_edge_case_test_files(&temp_dir);
388
+
389
+ // Run the CLI with JSON output format, searching for "mixedEncodings"
390
+ let output = Command::new("cargo")
391
+ .args([
392
+ "run",
393
+ "--",
394
+ "search",
395
+ "mixedEncodings", // Pattern to search for
396
+ temp_dir.path().to_str().unwrap(),
397
+ "--format",
398
+ "json",
399
+ ])
400
+ .output()
401
+ .expect("Failed to execute command");
402
+
403
+ // Check that the command succeeded
404
+ assert!(output.status.success());
405
+
406
+ // Convert stdout to string
407
+ let stdout = String::from_utf8_lossy(&output.stdout);
408
+
409
+ // Extract the JSON part from the output
410
+ let json_str = extract_json_from_output(&stdout);
411
+
412
+ // Parse the JSON output
413
+ let json_result: Value =
414
+ serde_json::from_str(json_str).expect("Failed to parse JSON output with mixed encodings");
415
+
416
+ // Find the result with mixed encodings
417
+ let results = json_result.get("results").unwrap().as_array().unwrap();
418
+ let mixed_encodings_result = results.iter().find(|r| {
419
+ r.get("file")
420
+ .unwrap()
421
+ .as_str()
422
+ .unwrap()
423
+ .contains("mixed_encodings.js")
424
+ });
425
+
426
+ assert!(
427
+ mixed_encodings_result.is_some(),
428
+ "Should find the mixed_encodings.js file"
429
+ );
430
+
431
+ // Verify that the mixed encodings are properly handled in the JSON
432
+ let code = mixed_encodings_result
433
+ .unwrap()
434
+ .get("code")
435
+ .unwrap()
436
+ .as_str()
437
+ .unwrap();
438
+ assert!(
439
+ code.contains("mixedEncodings"),
440
+ "Should contain the function name"
441
+ );
442
+ assert!(code.contains("Hello, World!"), "Should contain Latin text");
443
+ assert!(
444
+ code.contains("Привет, мир!"),
445
+ "Should contain Cyrillic text"
446
+ );
447
+ assert!(code.contains("你好,世界!"), "Should contain Chinese text");
448
+
449
+ // Check that the JSON is valid with mixed encodings
450
+ let code_json = serde_json::json!({ "code": code });
451
+ let code_str = serde_json::to_string(&code_json).expect("Failed to serialize code to JSON");
452
+
453
+ // Deserialize to verify it's valid JSON
454
+ let _: Value = serde_json::from_str(&code_str).expect("Failed to parse serialized code JSON");
455
+ }
456
+
457
+ #[test]
458
+ fn test_xml_output_with_long_lines() {
459
+ let temp_dir = TempDir::new().expect("Failed to create temp dir");
460
+ create_edge_case_test_files(&temp_dir);
461
+
462
+ // Run the CLI with XML output format, searching for "longLine"
463
+ let output = Command::new("cargo")
464
+ .args([
465
+ "run",
466
+ "--",
467
+ "search",
468
+ "longLine", // Pattern to search for
469
+ temp_dir.path().to_str().unwrap(),
470
+ "--format",
471
+ "xml",
472
+ ])
473
+ .output()
474
+ .expect("Failed to execute command");
475
+
476
+ // Check that the command succeeded
477
+ assert!(output.status.success());
478
+
479
+ // Convert stdout to string
480
+ let stdout = String::from_utf8_lossy(&output.stdout);
481
+
482
+ // Extract the XML part from the output
483
+ let xml_str = extract_xml_from_output(&stdout);
484
+
485
+ // Parse the XML output
486
+ let doc = Document::parse(xml_str).expect("Failed to parse XML output with long lines");
487
+ let root = doc.root_element();
488
+
489
+ // Find the result with long lines
490
+ let results: Vec<Node> = root
491
+ .children()
492
+ .filter(|n| n.is_element() && n.tag_name().name() == "result")
493
+ .collect();
494
+ let long_line_result = results.iter().find(|&r| {
495
+ if let Some(file) = r
496
+ .children()
497
+ .find(|n| n.is_element() && n.tag_name().name() == "file")
498
+ {
499
+ if let Some(text) = file.text() {
500
+ return text.contains("long_line.js");
501
+ }
502
+ }
503
+ false
504
+ });
505
+
506
+ assert!(
507
+ long_line_result.is_some(),
508
+ "Should find the long_line.js file"
509
+ );
510
+
511
+ // Verify that the long line is properly handled in the XML
512
+ if let Some(result) = long_line_result {
513
+ if let Some(code) = result
514
+ .children()
515
+ .find(|n| n.is_element() && n.tag_name().name() == "code")
516
+ {
517
+ if let Some(text) = code.text() {
518
+ assert!(
519
+ text.contains("longLine"),
520
+ "Should contain the function name"
521
+ );
522
+ assert!(
523
+ text.contains("longString"),
524
+ "Should contain the variable name"
525
+ );
526
+ } else {
527
+ panic!("Code element should have text content");
528
+ }
529
+ } else {
530
+ panic!("Result should have a code element");
531
+ }
532
+ }
533
+ }
534
+
535
+ #[test]
536
+ fn test_xml_output_with_nested_structures() {
537
+ let temp_dir = TempDir::new().expect("Failed to create temp dir");
538
+ create_edge_case_test_files(&temp_dir);
539
+
540
+ // Run the CLI with XML output format, searching for "nestedStructure"
541
+ let output = Command::new("cargo")
542
+ .args([
543
+ "run",
544
+ "--",
545
+ "search",
546
+ "nestedStructure", // Pattern to search for
547
+ temp_dir.path().to_str().unwrap(),
548
+ "--format",
549
+ "xml",
550
+ ])
551
+ .output()
552
+ .expect("Failed to execute command");
553
+
554
+ // Check that the command succeeded
555
+ assert!(output.status.success());
556
+
557
+ // Convert stdout to string
558
+ let stdout = String::from_utf8_lossy(&output.stdout);
559
+
560
+ // Extract the XML part from the output
561
+ let xml_str = extract_xml_from_output(&stdout);
562
+
563
+ // Parse the XML output
564
+ let doc = Document::parse(xml_str).expect("Failed to parse XML output with nested structures");
565
+ let root = doc.root_element();
566
+
567
+ // Find the result with nested structures
568
+ let results: Vec<Node> = root
569
+ .children()
570
+ .filter(|n| n.is_element() && n.tag_name().name() == "result")
571
+ .collect();
572
+ let nested_result = results.iter().find(|&r| {
573
+ if let Some(file) = r
574
+ .children()
575
+ .find(|n| n.is_element() && n.tag_name().name() == "file")
576
+ {
577
+ if let Some(text) = file.text() {
578
+ return text.contains("nested_structure.js");
579
+ }
580
+ }
581
+ false
582
+ });
583
+
584
+ assert!(
585
+ nested_result.is_some(),
586
+ "Should find the nested_structure.js file"
587
+ );
588
+
589
+ // Verify that the nested structures are properly handled in the XML
590
+ if let Some(result) = nested_result {
591
+ if let Some(code) = result
592
+ .children()
593
+ .find(|n| n.is_element() && n.tag_name().name() == "code")
594
+ {
595
+ if let Some(text) = code.text() {
596
+ assert!(
597
+ text.contains("nestedStructure"),
598
+ "Should contain the function name"
599
+ );
600
+ assert!(text.contains("level1"), "Should contain level1");
601
+ assert!(text.contains("level10"), "Should contain level10");
602
+ assert!(
603
+ text.contains("deeply nested"),
604
+ "Should contain the nested value"
605
+ );
606
+ } else {
607
+ panic!("Code element should have text content");
608
+ }
609
+ } else {
610
+ panic!("Result should have a code element");
611
+ }
612
+ }
613
+ }
614
+
615
+ #[test]
616
+ fn test_xml_output_with_mixed_encodings() {
617
+ let temp_dir = TempDir::new().expect("Failed to create temp dir");
618
+ create_edge_case_test_files(&temp_dir);
619
+
620
+ // Run the CLI with XML output format, searching for "mixedEncodings"
621
+ let output = Command::new("cargo")
622
+ .args([
623
+ "run",
624
+ "--",
625
+ "search",
626
+ "mixedEncodings", // Pattern to search for
627
+ temp_dir.path().to_str().unwrap(),
628
+ "--format",
629
+ "xml",
630
+ ])
631
+ .output()
632
+ .expect("Failed to execute command");
633
+
634
+ // Check that the command succeeded
635
+ assert!(output.status.success());
636
+
637
+ // Convert stdout to string
638
+ let stdout = String::from_utf8_lossy(&output.stdout);
639
+
640
+ // Extract the XML part from the output
641
+ let xml_str = extract_xml_from_output(&stdout);
642
+
643
+ // Parse the XML output
644
+ let doc = Document::parse(xml_str).expect("Failed to parse XML output with mixed encodings");
645
+ let root = doc.root_element();
646
+
647
+ // Find the result with mixed encodings
648
+ let results: Vec<Node> = root
649
+ .children()
650
+ .filter(|n| n.is_element() && n.tag_name().name() == "result")
651
+ .collect();
652
+ let mixed_encodings_result = results.iter().find(|&r| {
653
+ if let Some(file) = r
654
+ .children()
655
+ .find(|n| n.is_element() && n.tag_name().name() == "file")
656
+ {
657
+ if let Some(text) = file.text() {
658
+ return text.contains("mixed_encodings.js");
659
+ }
660
+ }
661
+ false
662
+ });
663
+
664
+ assert!(
665
+ mixed_encodings_result.is_some(),
666
+ "Should find the mixed_encodings.js file"
667
+ );
668
+
669
+ // Verify that the mixed encodings are properly handled in the XML
670
+ if let Some(result) = mixed_encodings_result {
671
+ if let Some(code) = result
672
+ .children()
673
+ .find(|n| n.is_element() && n.tag_name().name() == "code")
674
+ {
675
+ if let Some(text) = code.text() {
676
+ assert!(
677
+ text.contains("mixedEncodings"),
678
+ "Should contain the function name"
679
+ );
680
+ assert!(text.contains("Hello, World!"), "Should contain Latin text");
681
+ assert!(
682
+ text.contains("Привет, мир!"),
683
+ "Should contain Cyrillic text"
684
+ );
685
+ assert!(text.contains("你好,世界!"), "Should contain Chinese text");
686
+ } else {
687
+ panic!("Code element should have text content");
688
+ }
689
+ } else {
690
+ panic!("Result should have a code element");
691
+ }
692
+ }
693
+ }