@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,438 @@
1
+ use serde_json::Value;
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 JSON from command output
9
+ fn extract_json_from_output(output: &str) -> &str {
10
+ // Find the first occurrence of '{'
11
+ if let Some(start_index) = output.find('{') {
12
+ // Return the substring from the first '{' to the end
13
+ &output[start_index..]
14
+ } else {
15
+ // If no '{' is found, return the original string
16
+ output
17
+ }
18
+ }
19
+
20
+ // Helper function to create test files
21
+ fn create_test_file(dir: &TempDir, filename: &str, content: &str) -> PathBuf {
22
+ let file_path = dir.path().join(filename);
23
+ let parent_dir = file_path.parent().unwrap();
24
+ fs::create_dir_all(parent_dir).expect("Failed to create parent directories");
25
+ let mut file = File::create(&file_path).expect("Failed to create test file");
26
+ file.write_all(content.as_bytes())
27
+ .expect("Failed to write test content");
28
+ file_path
29
+ }
30
+
31
+ // Helper function to create a test directory structure with various test files
32
+ fn create_test_directory_structure(root_dir: &TempDir) {
33
+ // Create a source directory
34
+ let src_dir = root_dir.path().join("src");
35
+ fs::create_dir(&src_dir).expect("Failed to create src directory");
36
+
37
+ // Create Rust files with functions
38
+ let rust_content = r#"
39
+ fn hello_world() {
40
+ println!("Hello, world!");
41
+ }
42
+
43
+ fn add(a: i32, b: i32) -> i32 {
44
+ a + b
45
+ }
46
+ "#;
47
+ create_test_file(root_dir, "src/functions.rs", rust_content);
48
+
49
+ // Create a JavaScript file with functions
50
+ let js_content = r#"
51
+ function greet(name) {
52
+ return `Hello, ${name}!`;
53
+ }
54
+
55
+ const multiply = (a, b) => a * b;
56
+ "#;
57
+ create_test_file(root_dir, "src/functions.js", js_content);
58
+
59
+ // Create a file with special characters
60
+ let special_chars_content = r#"
61
+ // This file contains special characters: "quotes", 'apostrophes', <tags>, &ampersands
62
+ function escapeTest(input) {
63
+ return input.replace(/[<>&"']/g, function(c) {
64
+ return {
65
+ '<': '&lt;',
66
+ '>': '&gt;',
67
+ '&': '&amp;',
68
+ '"': '&quot;',
69
+ "'": '&#39;'
70
+ }[c];
71
+ });
72
+ }
73
+ "#;
74
+ create_test_file(root_dir, "src/special_chars.js", special_chars_content);
75
+
76
+ // Create a Python file with functions
77
+ let python_content = r#"
78
+ def calculate_sum(numbers):
79
+ """Calculate the sum of a list of numbers."""
80
+ return sum(numbers)
81
+
82
+ def process_data(data, callback):
83
+ """Process data using the provided callback function."""
84
+ return callback(data)
85
+ "#;
86
+ create_test_file(root_dir, "src/functions.py", python_content);
87
+ }
88
+
89
+ #[test]
90
+ fn test_query_json_output_rust_functions() {
91
+ let temp_dir = TempDir::new().expect("Failed to create temp dir");
92
+ create_test_directory_structure(&temp_dir);
93
+
94
+ // Run the CLI with JSON output format
95
+ let output = Command::new("cargo")
96
+ .args([
97
+ "run",
98
+ "--",
99
+ "query",
100
+ "fn $NAME($$$PARAMS) $$$BODY", // Pattern to search for Rust functions
101
+ temp_dir.path().to_str().unwrap(),
102
+ "--language",
103
+ "rust",
104
+ "--format",
105
+ "json",
106
+ ])
107
+ .output()
108
+ .expect("Failed to execute command");
109
+
110
+ // Check that the command succeeded
111
+ assert!(output.status.success());
112
+
113
+ // Convert stdout to string
114
+ let stdout = String::from_utf8_lossy(&output.stdout);
115
+
116
+ // Extract the JSON part from the output
117
+ let json_str = extract_json_from_output(&stdout);
118
+
119
+ // Parse the JSON output
120
+ let json_result: Value = serde_json::from_str(json_str).expect("Failed to parse JSON output");
121
+
122
+ // Validate the structure of the JSON output
123
+ assert!(json_result.is_object(), "JSON output should be an object");
124
+ assert!(
125
+ json_result.get("results").is_some(),
126
+ "JSON output should have a 'results' field"
127
+ );
128
+ assert!(
129
+ json_result.get("summary").is_some(),
130
+ "JSON output should have a 'summary' field"
131
+ );
132
+
133
+ // Validate the results array
134
+ let results = json_result.get("results").unwrap().as_array().unwrap();
135
+ assert!(!results.is_empty(), "'results' array should not be empty");
136
+ assert_eq!(results.len(), 2, "Should find 2 Rust functions");
137
+
138
+ // Validate the structure of each result
139
+ for result in results {
140
+ assert!(
141
+ result.get("file").is_some(),
142
+ "Each result should have a 'file' field"
143
+ );
144
+ assert!(
145
+ result.get("lines").is_some(),
146
+ "Each result should have a 'lines' field"
147
+ );
148
+ assert!(
149
+ result.get("node_type").is_some(),
150
+ "Each result should have a 'node_type' field"
151
+ );
152
+ assert!(
153
+ result.get("column_start").is_some(),
154
+ "Each result should have a 'column_start' field"
155
+ );
156
+ assert!(
157
+ result.get("column_end").is_some(),
158
+ "Each result should have a 'column_end' field"
159
+ );
160
+ assert!(
161
+ result.get("code").is_some(),
162
+ "Each result should have a 'code' field"
163
+ );
164
+
165
+ // Check that the code contains function code
166
+ let code = result.get("code").unwrap().as_str().unwrap();
167
+ assert!(
168
+ code.starts_with("fn "),
169
+ "Function code should start with 'fn '"
170
+ );
171
+ }
172
+
173
+ // Validate the summary object
174
+ let summary = json_result.get("summary").unwrap();
175
+ assert!(summary.is_object(), "'summary' should be an object");
176
+ assert!(
177
+ summary.get("count").is_some(),
178
+ "'summary' should have a 'count' field"
179
+ );
180
+ assert!(
181
+ summary.get("total_bytes").is_some(),
182
+ "'summary' should have a 'total_bytes' field"
183
+ );
184
+ assert!(
185
+ summary.get("total_tokens").is_some(),
186
+ "'summary' should have a 'total_tokens' field"
187
+ );
188
+
189
+ // Validate the count matches the number of results
190
+ let count = summary.get("count").unwrap().as_u64().unwrap();
191
+ let results_count = results.len() as u64;
192
+ assert_eq!(
193
+ count, results_count,
194
+ "The 'count' in summary should match the number of results"
195
+ );
196
+ }
197
+
198
+ #[test]
199
+ fn test_query_json_output_javascript_functions() {
200
+ let temp_dir = TempDir::new().expect("Failed to create temp dir");
201
+ create_test_directory_structure(&temp_dir);
202
+
203
+ // Run the CLI with JSON output format
204
+ let output = Command::new("cargo")
205
+ .args([
206
+ "run",
207
+ "--",
208
+ "query",
209
+ "function $NAME($$$PARAMS) $$$BODY", // Pattern to search for JavaScript functions
210
+ temp_dir.path().to_str().unwrap(),
211
+ "--language",
212
+ "javascript",
213
+ "--format",
214
+ "json",
215
+ ])
216
+ .output()
217
+ .expect("Failed to execute command");
218
+
219
+ // Check that the command succeeded
220
+ assert!(output.status.success());
221
+
222
+ // Convert stdout to string
223
+ let stdout = String::from_utf8_lossy(&output.stdout);
224
+
225
+ // Extract the JSON part from the output
226
+ let json_str = extract_json_from_output(&stdout);
227
+
228
+ // Parse the JSON output
229
+ let json_result: Value = serde_json::from_str(json_str).expect("Failed to parse JSON output");
230
+
231
+ // Validate the results array
232
+ let results = json_result.get("results").unwrap().as_array().unwrap();
233
+ assert!(!results.is_empty(), "'results' array should not be empty");
234
+
235
+ // Check that we found the JavaScript functions
236
+ let has_greet = results
237
+ .iter()
238
+ .any(|r| r.get("code").unwrap().as_str().unwrap().contains("greet"));
239
+
240
+ assert!(has_greet, "Should find the 'greet' function");
241
+ }
242
+
243
+ #[test]
244
+ fn test_query_json_output_with_special_characters() {
245
+ let temp_dir = TempDir::new().expect("Failed to create temp dir");
246
+ create_test_directory_structure(&temp_dir);
247
+
248
+ // Run the CLI with JSON output format, searching for the escape function
249
+ let output = Command::new("cargo")
250
+ .args([
251
+ "run",
252
+ "--",
253
+ "query",
254
+ "function escapeTest", // Pattern to search for the escape function
255
+ temp_dir.path().to_str().unwrap(),
256
+ "--language",
257
+ "javascript",
258
+ "--format",
259
+ "json",
260
+ ])
261
+ .output()
262
+ .expect("Failed to execute command");
263
+
264
+ // Check that the command succeeded
265
+ assert!(output.status.success());
266
+
267
+ // Convert stdout to string
268
+ let stdout = String::from_utf8_lossy(&output.stdout);
269
+
270
+ // Extract the JSON part from the output
271
+ let json_str = extract_json_from_output(&stdout);
272
+
273
+ // Parse the JSON output
274
+ let json_result: Value = serde_json::from_str(json_str).expect("Failed to parse JSON output");
275
+
276
+ // Validate the results array
277
+ let results = json_result.get("results").unwrap().as_array().unwrap();
278
+ assert!(!results.is_empty(), "'results' array should not be empty");
279
+
280
+ // Check that we found the escape function
281
+ let escape_result = results.iter().find(|r| {
282
+ r.get("code")
283
+ .unwrap()
284
+ .as_str()
285
+ .unwrap()
286
+ .contains("escapeTest")
287
+ });
288
+
289
+ assert!(
290
+ escape_result.is_some(),
291
+ "Should find the 'escapeTest' function"
292
+ );
293
+
294
+ // Verify that special characters are properly escaped in the JSON
295
+ let code = escape_result
296
+ .unwrap()
297
+ .get("code")
298
+ .unwrap()
299
+ .as_str()
300
+ .unwrap();
301
+
302
+ // Print the code content for debugging
303
+ println!("Code content: {code}");
304
+
305
+ // Check for special characters in the function body
306
+ // The function contains special characters in the string literals
307
+ assert!(code.contains("&lt;"), "Should contain '&lt;'");
308
+ assert!(code.contains("&gt;"), "Should contain '&gt;'");
309
+ assert!(code.contains("&amp;"), "Should contain '&amp;'");
310
+ assert!(code.contains("&quot;"), "Should contain '&quot;'");
311
+ assert!(code.contains("&#39;"), "Should contain '&#39;'");
312
+ }
313
+
314
+ #[test]
315
+ fn test_query_json_output_with_multiple_languages() {
316
+ let temp_dir = TempDir::new().expect("Failed to create temp dir");
317
+ create_test_directory_structure(&temp_dir);
318
+
319
+ // Run the CLI with JSON output format, without specifying a language
320
+ let output = Command::new("cargo")
321
+ .args([
322
+ "run",
323
+ "--",
324
+ "query",
325
+ "def $NAME($$$PARAMS): $$$BODY", // Pattern to search for Python functions
326
+ temp_dir.path().to_str().unwrap(),
327
+ "--language",
328
+ "python",
329
+ "--format",
330
+ "json",
331
+ ])
332
+ .output()
333
+ .expect("Failed to execute command");
334
+
335
+ // Check that the command succeeded
336
+ assert!(output.status.success());
337
+
338
+ // Convert stdout to string
339
+ let stdout = String::from_utf8_lossy(&output.stdout);
340
+
341
+ // Extract the JSON part from the output
342
+ let json_str = extract_json_from_output(&stdout);
343
+
344
+ // Parse the JSON output
345
+ let json_result: Value = serde_json::from_str(json_str).expect("Failed to parse JSON output");
346
+
347
+ // Validate the results array
348
+ let results = json_result.get("results").unwrap().as_array().unwrap();
349
+ assert!(!results.is_empty(), "'results' array should not be empty");
350
+
351
+ // Check that we found Python functions
352
+ let has_calculate_sum = results.iter().any(|r| {
353
+ r.get("code")
354
+ .unwrap()
355
+ .as_str()
356
+ .unwrap()
357
+ .contains("calculate_sum")
358
+ });
359
+
360
+ let has_process_data = results.iter().any(|r| {
361
+ r.get("code")
362
+ .unwrap()
363
+ .as_str()
364
+ .unwrap()
365
+ .contains("process_data")
366
+ });
367
+
368
+ assert!(
369
+ has_calculate_sum,
370
+ "Should find the 'calculate_sum' function"
371
+ );
372
+ assert!(has_process_data, "Should find the 'process_data' function");
373
+ }
374
+
375
+ #[test]
376
+ fn test_query_json_output_with_no_results() {
377
+ let temp_dir = TempDir::new().expect("Failed to create temp dir");
378
+ create_test_directory_structure(&temp_dir);
379
+
380
+ // Run the CLI with JSON output format, searching for a pattern that doesn't exist
381
+ let output = Command::new("cargo")
382
+ .args([
383
+ "run",
384
+ "--",
385
+ "query",
386
+ "class $NAME { $$$METHODS }", // Pattern that doesn't match any file
387
+ temp_dir.path().to_str().unwrap(),
388
+ "--format",
389
+ "json",
390
+ ])
391
+ .output()
392
+ .expect("Failed to execute command");
393
+
394
+ // Check that the command succeeded
395
+ assert!(output.status.success());
396
+
397
+ // Convert stdout to string
398
+ let stdout = String::from_utf8_lossy(&output.stdout);
399
+
400
+ // Extract the JSON part from the output
401
+ let json_str = extract_json_from_output(&stdout);
402
+
403
+ // Parse the JSON output
404
+ let json_result: Value = serde_json::from_str(json_str).expect("Failed to parse JSON output");
405
+
406
+ // Validate the structure of the JSON output
407
+ assert!(json_result.is_object(), "JSON output should be an object");
408
+ assert!(
409
+ json_result.get("results").is_some(),
410
+ "JSON output should have a 'results' field"
411
+ );
412
+ assert!(
413
+ json_result.get("summary").is_some(),
414
+ "JSON output should have a 'summary' field"
415
+ );
416
+
417
+ // Validate the results array is empty
418
+ let results = json_result.get("results").unwrap().as_array().unwrap();
419
+ assert!(results.is_empty(), "'results' array should be empty");
420
+
421
+ // Validate the summary object
422
+ let summary = json_result.get("summary").unwrap();
423
+ assert_eq!(
424
+ summary.get("count").unwrap().as_u64().unwrap(),
425
+ 0,
426
+ "'count' should be 0"
427
+ );
428
+ assert_eq!(
429
+ summary.get("total_bytes").unwrap().as_u64().unwrap(),
430
+ 0,
431
+ "'total_bytes' should be 0"
432
+ );
433
+ assert_eq!(
434
+ summary.get("total_tokens").unwrap().as_u64().unwrap(),
435
+ 0,
436
+ "'total_tokens' should be 0"
437
+ );
438
+ }
@@ -0,0 +1,232 @@
1
+ use anyhow::Result;
2
+ use probe_code::query::{perform_query, QueryOptions};
3
+ use std::fs;
4
+ use tempfile::tempdir;
5
+
6
+ #[test]
7
+ fn test_query_rust_function() -> Result<()> {
8
+ // Create a temporary directory for our test files
9
+ let temp_dir = tempdir()?;
10
+ let temp_path = temp_dir.path();
11
+
12
+ // Create a test Rust file with a function
13
+ let rust_file_path = temp_path.join("test_function.rs");
14
+ let rust_content = r#"
15
+ fn hello_world() {
16
+ println!("Hello, world!");
17
+ }
18
+
19
+ fn add(a: i32, b: i32) -> i32 {
20
+ a + b
21
+ }
22
+ "#;
23
+ fs::write(&rust_file_path, rust_content)?;
24
+
25
+ // Create query options to search for function definitions
26
+ let options = QueryOptions {
27
+ path: temp_path,
28
+ pattern: "fn $NAME($$$PARAMS) $$$BODY",
29
+ language: Some("rust"),
30
+ ignore: &[],
31
+ allow_tests: true,
32
+ max_results: None,
33
+ format: "plain",
34
+ no_gitignore: false,
35
+ };
36
+
37
+ // Perform the query
38
+ let matches = perform_query(&options)?;
39
+
40
+ // Verify that we found both functions
41
+ assert_eq!(matches.len(), 2);
42
+
43
+ // Check that the first match is the hello_world function
44
+ let hello_match = matches
45
+ .iter()
46
+ .find(|m| m.matched_text.contains("hello_world"))
47
+ .unwrap();
48
+ assert!(hello_match.matched_text.contains("println!"));
49
+
50
+ // Check that the second match is the add function
51
+ let add_match = matches
52
+ .iter()
53
+ .find(|m| m.matched_text.contains("add"))
54
+ .unwrap();
55
+ assert!(add_match.matched_text.contains("a + b"));
56
+
57
+ Ok(())
58
+ }
59
+
60
+ #[test]
61
+ fn test_query_javascript_function() -> Result<()> {
62
+ // Create a temporary directory for our test files
63
+ let temp_dir = tempdir()?;
64
+ let temp_path = temp_dir.path();
65
+
66
+ // Create a test JavaScript file with a function
67
+ let js_file_path = temp_path.join("test_function.js");
68
+ let js_content = r#"
69
+ function greet(name) {
70
+ return `Hello, ${name}!`;
71
+ }
72
+
73
+ const multiply = (a, b) => a * b;
74
+ "#;
75
+ fs::write(&js_file_path, js_content)?;
76
+
77
+ // Create query options to search for function declarations
78
+ let options = QueryOptions {
79
+ path: temp_path,
80
+ pattern: "function $NAME($$$PARAMS) $$$BODY",
81
+ language: Some("javascript"),
82
+ ignore: &[],
83
+ allow_tests: true,
84
+ max_results: None,
85
+ format: "plain",
86
+ no_gitignore: false,
87
+ };
88
+
89
+ // Perform the query
90
+ let matches = perform_query(&options)?;
91
+
92
+ // Verify that we found the function declaration (not the arrow function)
93
+ assert_eq!(matches.len(), 1);
94
+ assert!(matches[0].matched_text.contains("greet"));
95
+ assert!(matches[0].matched_text.contains("return"));
96
+
97
+ // Now search for arrow functions
98
+ let arrow_options = QueryOptions {
99
+ path: temp_path,
100
+ pattern: "const $NAME = ($$$PARAMS) => $$$BODY",
101
+ language: Some("javascript"),
102
+ ignore: &[],
103
+ allow_tests: true,
104
+ max_results: None,
105
+ format: "plain",
106
+ no_gitignore: false,
107
+ };
108
+
109
+ // Perform the query
110
+ let arrow_matches = perform_query(&arrow_options)?;
111
+
112
+ // Verify that we found the arrow function
113
+ assert_eq!(arrow_matches.len(), 1);
114
+ assert!(arrow_matches[0].matched_text.contains("multiply"));
115
+ assert!(arrow_matches[0].matched_text.contains("a * b"));
116
+
117
+ Ok(())
118
+ }
119
+
120
+ #[test]
121
+ fn test_query_with_max_results() -> Result<()> {
122
+ // Create a temporary directory for our test files
123
+ let temp_dir = tempdir()?;
124
+ let temp_path = temp_dir.path();
125
+
126
+ // Create a test Rust file with multiple functions
127
+ let rust_file_path = temp_path.join("test_multiple.rs");
128
+ let rust_content = r#"
129
+ fn func1() {}
130
+ fn func2() {}
131
+ fn func3() {}
132
+ fn func4() {}
133
+ fn func5() {}
134
+ "#;
135
+ fs::write(&rust_file_path, rust_content)?;
136
+
137
+ // Create query options with max_results = 3
138
+ let options = QueryOptions {
139
+ path: temp_path,
140
+ pattern: "fn $NAME() {}",
141
+ language: Some("rust"),
142
+ ignore: &[],
143
+ allow_tests: true,
144
+ max_results: Some(3),
145
+ format: "plain",
146
+ no_gitignore: false,
147
+ };
148
+
149
+ // Perform the query
150
+ let matches = perform_query(&options)?;
151
+
152
+ // Verify that we only got 3 matches (due to max_results)
153
+ assert_eq!(matches.len(), 3);
154
+
155
+ Ok(())
156
+ }
157
+
158
+ #[test]
159
+ fn test_query_ignore_patterns() -> Result<()> {
160
+ // Create a temporary directory for our test files
161
+ let temp_dir = tempdir()?;
162
+ let temp_path = temp_dir.path();
163
+
164
+ // Create a test file in the main directory
165
+ let main_file_path = temp_path.join("main.rs");
166
+ fs::write(&main_file_path, "fn main() {}")?;
167
+
168
+ // Create a test file in a subdirectory that should be ignored
169
+ let test_dir_path = temp_path.join("test");
170
+ fs::create_dir(&test_dir_path)?;
171
+ let test_file_path = test_dir_path.join("test_file.rs");
172
+ fs::write(&test_file_path, "fn test_function() {}")?;
173
+
174
+ // Create query options with ignore patterns
175
+ let options = QueryOptions {
176
+ path: temp_path,
177
+ pattern: "fn $NAME() {}",
178
+ language: Some("rust"),
179
+ ignore: &["test".to_string()],
180
+ allow_tests: false,
181
+ max_results: None,
182
+ format: "plain",
183
+ no_gitignore: false,
184
+ };
185
+
186
+ // Perform the query
187
+ let matches = perform_query(&options)?;
188
+
189
+ // Verify that we only found the main function (test_function was ignored)
190
+ assert_eq!(matches.len(), 1);
191
+ assert!(matches[0].matched_text.contains("main"));
192
+ assert!(!matches[0].matched_text.contains("test_function"));
193
+
194
+ Ok(())
195
+ }
196
+
197
+ #[test]
198
+ fn test_query_with_auto_detect_language() -> Result<()> {
199
+ // Create a temporary directory for our test files
200
+ let temp_dir = tempdir()?;
201
+ let temp_path = temp_dir.path();
202
+
203
+ // Create a test Rust file with a function
204
+ let rust_file_path = temp_path.join("test_auto_detect.rs");
205
+ let rust_content = r#"
206
+ fn auto_detected_function() {
207
+ println!("This function should be found with auto-detection");
208
+ }
209
+ "#;
210
+ fs::write(&rust_file_path, rust_content)?;
211
+
212
+ // Create query options without specifying language
213
+ let options = QueryOptions {
214
+ path: temp_path,
215
+ pattern: "fn $NAME($$$PARAMS) $$$BODY",
216
+ language: None, // No language specified, should auto-detect
217
+ ignore: &[],
218
+ allow_tests: true,
219
+ max_results: None,
220
+ format: "plain",
221
+ no_gitignore: false,
222
+ };
223
+
224
+ // Perform the query
225
+ let matches = perform_query(&options)?;
226
+
227
+ // Verify that we found the function through auto-detection
228
+ assert_eq!(matches.len(), 1);
229
+ assert!(matches[0].matched_text.contains("auto_detected_function"));
230
+
231
+ Ok(())
232
+ }