@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,535 @@
1
+ use std::collections::{HashMap, HashSet};
2
+ use std::fs;
3
+ use std::path::Path;
4
+ use tempfile::TempDir;
5
+
6
+ use probe_code::search::elastic_query::parse_query_test as parse_query;
7
+ use probe_code::search::file_processing::filter_code_block_with_ast;
8
+ use probe_code::search::query::create_query_plan;
9
+ use probe_code::search::{perform_probe, SearchOptions};
10
+
11
+ /// Test stemming and compound word handling in block filtering with complex queries
12
+ #[test]
13
+ fn test_stemming_in_complex_queries() {
14
+ // Create a temporary directory for testing
15
+ let temp_dir = TempDir::new().unwrap();
16
+ let temp_path = temp_dir.path();
17
+
18
+ // Create test files with content for stemming test
19
+ create_test_files(temp_path);
20
+
21
+ // Test various stemming scenarios
22
+ test_stemming_with_and_query(temp_path);
23
+ test_stemming_with_or_query(temp_path);
24
+ test_stemming_with_complex_query(temp_path);
25
+ test_compound_word_splitting(temp_path);
26
+ test_negative_compound_word_in_existing_tests(temp_path);
27
+ }
28
+
29
+ /// Create test files with content for stemming tests
30
+ fn create_test_files(temp_dir: &Path) {
31
+ // File with stemming variations: "ip", "ips", "whitelist", "whitelisting"
32
+ let file1_path = temp_dir.join("stemming_variations.go");
33
+ let file1_content = r#"
34
+ package middleware
35
+
36
+ // IPWhiteListMiddleware handles IP whitelisting
37
+ // It processes IPs against the whitelist
38
+ type IPWhiteListMiddleware struct {
39
+ Whitelist []string
40
+ }
41
+
42
+ // Process implements whitelisting for IPs
43
+ func (i *IPWhiteListMiddleware) Process() {
44
+ // Implementation for IP whitelisting
45
+ }
46
+ "#;
47
+
48
+ // File with compound words: "whitelist", "firewall", "network"
49
+ let file2_path = temp_dir.join("compound_words.go");
50
+ let file2_content = r#"
51
+ package security
52
+
53
+ // FirewallConfig configures the network firewall
54
+ // It includes white list settings for the network
55
+ type FirewallConfig struct {
56
+ NetworkWhitelist []string
57
+ FirewallRules []Rule
58
+ }
59
+
60
+ // Rule represents a firewall rule
61
+ type Rule struct {
62
+ Name string
63
+ Action string
64
+ }
65
+ "#;
66
+
67
+ // Write files to disk
68
+ fs::write(file1_path, file1_content).unwrap();
69
+ fs::write(file2_path, file2_content).unwrap();
70
+ }
71
+
72
+ /// Test stemming with AND query: "ips AND whitelisting"
73
+ fn test_stemming_with_and_query(temp_path: &Path) {
74
+ // Enable debug mode
75
+ std::env::set_var("DEBUG", "1");
76
+ println!("\n=== Testing stemming with AND query: ips AND whitelisting ===");
77
+
78
+ // Create the query
79
+ let query = "ips AND whitelisting";
80
+ let queries = vec![query.to_string()];
81
+ let custom_ignores: Vec<String> = vec![];
82
+
83
+ // Create SearchOptions with stemming enabled (exact=false)
84
+ let options = SearchOptions {
85
+ path: temp_path,
86
+ queries: &queries,
87
+ files_only: false,
88
+ custom_ignores: &custom_ignores,
89
+ exclude_filenames: false,
90
+ language: None,
91
+ reranker: "hybrid",
92
+ frequency_search: true,
93
+ max_results: None,
94
+ max_bytes: None,
95
+ max_tokens: None,
96
+ allow_tests: true,
97
+ no_merge: true,
98
+ merge_threshold: None,
99
+ dry_run: false,
100
+ session: None,
101
+ timeout: 30,
102
+ question: None,
103
+ exact: false,
104
+ no_gitignore: false,
105
+ };
106
+
107
+ // Run the search
108
+ let search_results = perform_probe(&options).unwrap();
109
+
110
+ // Check that we got results
111
+ assert!(
112
+ !search_results.results.is_empty(),
113
+ "Search should return results with stemming"
114
+ );
115
+
116
+ // Check that we found the file with stemming variations
117
+ let found_file = search_results
118
+ .results
119
+ .iter()
120
+ .any(|r| r.file.contains("stemming_variations.go"));
121
+ assert!(
122
+ found_file,
123
+ "Should find stemming_variations.go with stemmed terms"
124
+ );
125
+
126
+ // Now test the filter_code_block_with_ast function directly
127
+ // Create a QueryPlan
128
+ let plan = create_query_plan(query, false).unwrap();
129
+
130
+ // Get the term indices from the QueryPlan
131
+ let term_indices = &plan.term_indices;
132
+
133
+ // Create term matches
134
+ let mut term_matches = HashMap::new();
135
+
136
+ // Add "ip" matches
137
+ let mut ip_lines = HashSet::new();
138
+ ip_lines.insert(4); // Line with "IPs"
139
+ term_matches.insert(*term_indices.get("ip").unwrap(), ip_lines);
140
+
141
+ // Add "whitelist" matches
142
+ let mut whitelist_lines = HashSet::new();
143
+ whitelist_lines.insert(5); // Line with "whitelist"
144
+ term_matches.insert(*term_indices.get("whitelist").unwrap(), whitelist_lines);
145
+
146
+ // Block lines
147
+ let block_lines = (1, 10);
148
+
149
+ // Test filtering
150
+ let result = filter_code_block_with_ast(block_lines, &term_matches, &plan, true);
151
+ assert!(result, "Block with stemmed terms 'ip' and 'whitelist' should match the query 'ips AND whitelisting'");
152
+ println!("✓ Block with stemmed terms matches the AND query");
153
+ }
154
+
155
+ /// Test stemming with OR query: "ips OR whitelisting"
156
+ fn test_stemming_with_or_query(temp_path: &Path) {
157
+ println!("\n=== Testing stemming with OR query: ips OR whitelisting ===");
158
+
159
+ // Create the query
160
+ let query = "ips OR whitelisting";
161
+ let queries = vec![query.to_string()];
162
+ let custom_ignores: Vec<String> = vec![];
163
+
164
+ // Create SearchOptions with stemming enabled (exact=false)
165
+ let options = SearchOptions {
166
+ path: temp_path,
167
+ queries: &queries,
168
+ files_only: false,
169
+ custom_ignores: &custom_ignores,
170
+ exclude_filenames: false,
171
+ language: None,
172
+ reranker: "hybrid",
173
+ frequency_search: true,
174
+ max_results: None,
175
+ max_bytes: None,
176
+ max_tokens: None,
177
+ allow_tests: true,
178
+ // Use any term mode
179
+ no_merge: true,
180
+ merge_threshold: None,
181
+ dry_run: false,
182
+ session: None,
183
+ timeout: 30,
184
+ question: None,
185
+ exact: false,
186
+ no_gitignore: false,
187
+ };
188
+
189
+ // Run the search
190
+ let search_results = perform_probe(&options).unwrap();
191
+
192
+ // Check that we got results
193
+ assert!(
194
+ !search_results.results.is_empty(),
195
+ "Search should return results with stemming"
196
+ );
197
+
198
+ // Check that we found both files
199
+ let found_file1 = search_results
200
+ .results
201
+ .iter()
202
+ .any(|r| r.file.contains("stemming_variations.go"));
203
+ assert!(
204
+ found_file1,
205
+ "Should find stemming_variations.go with stemmed terms"
206
+ );
207
+
208
+ // Now test the filter_code_block_with_ast function directly
209
+ // Create a QueryPlan
210
+ let plan = create_query_plan(query, false).unwrap();
211
+
212
+ // Get the term indices from the QueryPlan
213
+ let term_indices = &plan.term_indices;
214
+
215
+ // Test case 1: Block with only "ip" (should match OR query)
216
+ {
217
+ let mut term_matches = HashMap::new();
218
+
219
+ // Add only "ip" matches
220
+ let mut ip_lines = HashSet::new();
221
+ ip_lines.insert(4);
222
+ term_matches.insert(*term_indices.get("ip").unwrap(), ip_lines);
223
+
224
+ // Block lines
225
+ let block_lines = (1, 10);
226
+
227
+ // Test filtering
228
+ let result = filter_code_block_with_ast(block_lines, &term_matches, &plan, true);
229
+ assert!(
230
+ result,
231
+ "Block with only stemmed term 'ip' should match the OR query"
232
+ );
233
+ println!("✓ Block with only stemmed term 'ip' matches the OR query");
234
+ }
235
+
236
+ // Test case 2: Block with only "whitelist" (should match OR query)
237
+ {
238
+ let mut term_matches = HashMap::new();
239
+
240
+ // Add only "whitelist" matches
241
+ let mut whitelist_lines = HashSet::new();
242
+ whitelist_lines.insert(5);
243
+ term_matches.insert(*term_indices.get("whitelist").unwrap(), whitelist_lines);
244
+
245
+ // Block lines
246
+ let block_lines = (1, 10);
247
+
248
+ // Test filtering
249
+ let result = filter_code_block_with_ast(block_lines, &term_matches, &plan, true);
250
+ assert!(
251
+ result,
252
+ "Block with only stemmed term 'whitelist' should match the OR query"
253
+ );
254
+ println!("✓ Block with only stemmed term 'whitelist' matches the OR query");
255
+ }
256
+ }
257
+
258
+ /// Test stemming with complex query: "(ips OR ports) AND (whitelisting OR security) AND -blocking"
259
+ fn test_stemming_with_complex_query(_temp_path: &Path) {
260
+ println!("\n=== Testing stemming with complex query: (ips OR ports) AND (whitelisting OR security) AND -blocking ===");
261
+
262
+ // Create the query
263
+ let query = "(ips OR ports) AND (whitelisting OR security) AND -blocking";
264
+
265
+ // Parse the query into an AST
266
+ // Using standard Elasticsearch behavior (AND for implicit combinations)
267
+ let ast = parse_query(query).unwrap();
268
+ println!("Parsed AST: {ast:?}");
269
+
270
+ // Create a QueryPlan
271
+ let plan = create_query_plan(query, false).unwrap();
272
+
273
+ // Get the term indices from the QueryPlan
274
+ let term_indices = &plan.term_indices;
275
+
276
+ // Test case 1: Block with "ip" and "whitelist" (should match)
277
+ {
278
+ let mut term_matches = HashMap::new();
279
+
280
+ // Add "ip" matches
281
+ let mut ip_lines = HashSet::new();
282
+ ip_lines.insert(3);
283
+ term_matches.insert(*term_indices.get("ip").unwrap(), ip_lines);
284
+
285
+ // Add "whitelist" matches
286
+ let mut whitelist_lines = HashSet::new();
287
+ whitelist_lines.insert(4);
288
+ term_matches.insert(*term_indices.get("whitelist").unwrap(), whitelist_lines);
289
+
290
+ // Block lines
291
+ let block_lines = (1, 10);
292
+
293
+ // Test filtering
294
+ let result = filter_code_block_with_ast(block_lines, &term_matches, &plan, true);
295
+ assert!(
296
+ result,
297
+ "Block with stemmed terms 'ip' and 'whitelist' should match the complex query"
298
+ );
299
+ println!("✓ Block with stemmed terms 'ip' and 'whitelist' matches the complex query");
300
+ }
301
+
302
+ // Test case 2: Block with "port" and "security" (should match)
303
+ {
304
+ let mut term_matches = HashMap::new();
305
+
306
+ // Add "port" matches
307
+ let mut port_lines = HashSet::new();
308
+ port_lines.insert(3);
309
+ term_matches.insert(*term_indices.get("port").unwrap(), port_lines);
310
+
311
+ // Add "secur" matches (stemmed form of "security")
312
+ let mut security_lines = HashSet::new();
313
+ security_lines.insert(4);
314
+ term_matches.insert(*term_indices.get("secur").unwrap(), security_lines);
315
+
316
+ // Block lines
317
+ let block_lines = (1, 10);
318
+
319
+ // Test filtering
320
+ let result = filter_code_block_with_ast(block_lines, &term_matches, &plan, true);
321
+ assert!(
322
+ result,
323
+ "Block with stemmed terms 'port' and 'security' should match the complex query"
324
+ );
325
+ println!("✓ Block with stemmed terms 'port' and 'security' matches the complex query");
326
+ }
327
+
328
+ // Test case 3: Block with "ip", "whitelist", and "block" (should NOT match due to -blocking)
329
+ {
330
+ let mut term_matches = HashMap::new();
331
+
332
+ // Add "ip" matches
333
+ let mut ip_lines = HashSet::new();
334
+ ip_lines.insert(3);
335
+ term_matches.insert(*term_indices.get("ip").unwrap(), ip_lines);
336
+
337
+ // Add "whitelist" matches
338
+ let mut whitelist_lines = HashSet::new();
339
+ whitelist_lines.insert(4);
340
+ term_matches.insert(*term_indices.get("whitelist").unwrap(), whitelist_lines);
341
+
342
+ // Add "blocking" matches (the exact term used in the query)
343
+ let mut block_lines = HashSet::new();
344
+ block_lines.insert(5);
345
+ term_matches.insert(*term_indices.get("blocking").unwrap(), block_lines);
346
+
347
+ // Block lines
348
+ let block_lines = (1, 10);
349
+
350
+ // Test filtering
351
+ let result = filter_code_block_with_ast(block_lines, &term_matches, &plan, true);
352
+ assert!(
353
+ !result,
354
+ "Block with 'ip', 'whitelist', and 'block' should NOT match due to -blocking"
355
+ );
356
+ println!("✓ Block with 'ip', 'whitelist', and 'block' doesn't match due to -blocking");
357
+ }
358
+ }
359
+
360
+ /// Test compound word splitting: "networkfirewall"
361
+ fn test_compound_word_splitting(temp_path: &Path) {
362
+ println!("\n=== Testing compound word splitting: networkfirewall ===");
363
+
364
+ // Create the query
365
+ let query = "networkfirewall";
366
+ let queries = vec![query.to_string()];
367
+ let custom_ignores: Vec<String> = vec![];
368
+
369
+ // Create SearchOptions with stemming and compound word splitting enabled
370
+ let options = SearchOptions {
371
+ path: temp_path,
372
+ queries: &queries,
373
+ files_only: false,
374
+ custom_ignores: &custom_ignores,
375
+ exclude_filenames: false,
376
+ language: None,
377
+ reranker: "hybrid",
378
+ frequency_search: true,
379
+ max_results: None,
380
+ max_bytes: None,
381
+ max_tokens: None,
382
+ allow_tests: true,
383
+ no_merge: true,
384
+ merge_threshold: None,
385
+ dry_run: false,
386
+ session: None,
387
+ timeout: 30,
388
+ question: None,
389
+ exact: false,
390
+ no_gitignore: false,
391
+ };
392
+
393
+ // Run the search
394
+ let search_results = perform_probe(&options).unwrap();
395
+
396
+ // Check that we got results
397
+ assert!(
398
+ !search_results.results.is_empty(),
399
+ "Search should return results with compound word splitting"
400
+ );
401
+
402
+ // Check that we found the file with "network" and "firewall"
403
+ let found_file = search_results
404
+ .results
405
+ .iter()
406
+ .any(|r| r.file.contains("compound_words.go"));
407
+ assert!(
408
+ found_file,
409
+ "Should find compound_words.go with split compound word"
410
+ );
411
+
412
+ // Now test with a more complex query: "network AND firewall"
413
+ let complex_query = "network AND firewall";
414
+ let complex_queries = vec![complex_query.to_string()];
415
+
416
+ let complex_options = SearchOptions {
417
+ path: temp_path,
418
+ queries: &complex_queries,
419
+ files_only: false,
420
+ custom_ignores: &custom_ignores,
421
+ exclude_filenames: false,
422
+ language: None,
423
+ reranker: "hybrid",
424
+ frequency_search: true,
425
+ max_results: None,
426
+ max_bytes: None,
427
+ max_tokens: None,
428
+ allow_tests: true,
429
+ // Use all terms mode
430
+ no_merge: true,
431
+ merge_threshold: None,
432
+ dry_run: false,
433
+ session: None,
434
+ timeout: 30,
435
+ question: None,
436
+ exact: false,
437
+ no_gitignore: false,
438
+ };
439
+
440
+ // Run the search
441
+ let complex_results = perform_probe(&complex_options).unwrap();
442
+
443
+ // Check that we got results
444
+ assert!(
445
+ !complex_results.results.is_empty(),
446
+ "Search should return results with AND query on compound words"
447
+ );
448
+
449
+ // Check that we found the file with both "network" and "firewall"
450
+ let found_complex_file = complex_results
451
+ .results
452
+ .iter()
453
+ .any(|r| r.file.contains("compound_words.go"));
454
+ assert!(
455
+ found_complex_file,
456
+ "Should find compound_words.go with AND query on compound words"
457
+ );
458
+
459
+ // Reset debug mode
460
+ std::env::remove_var("DEBUG");
461
+ }
462
+
463
+ /// Test negative compound word in existing tests: "-networkfirewall"
464
+ fn test_negative_compound_word_in_existing_tests(temp_path: &Path) {
465
+ println!("\n=== Testing negative compound word in existing tests: -networkfirewall ===");
466
+
467
+ // Enable debug mode
468
+ std::env::set_var("DEBUG", "1");
469
+
470
+ // Create the query
471
+ let query = "-networkfirewall";
472
+ let queries = vec![query.to_string()];
473
+ let custom_ignores: Vec<String> = vec![];
474
+
475
+ // Create SearchOptions
476
+ let options = SearchOptions {
477
+ path: temp_path,
478
+ queries: &queries,
479
+ files_only: false,
480
+ custom_ignores: &custom_ignores,
481
+ exclude_filenames: false,
482
+ language: None,
483
+ reranker: "hybrid",
484
+ frequency_search: true,
485
+ max_results: None,
486
+ max_bytes: None,
487
+ max_tokens: None,
488
+ allow_tests: true,
489
+ no_merge: true,
490
+ merge_threshold: None,
491
+ dry_run: false,
492
+ session: None,
493
+ timeout: 30,
494
+ question: None,
495
+ exact: false,
496
+ no_gitignore: false,
497
+ };
498
+
499
+ // Run the search
500
+ let search_results = perform_probe(&options).unwrap();
501
+
502
+ // Check that we didn't find the file with "network" and "firewall"
503
+ let found_file = search_results
504
+ .results
505
+ .iter()
506
+ .any(|r| r.file.contains("compound_words.go"));
507
+ assert!(
508
+ !found_file,
509
+ "Should NOT find compound_words.go with negative compound word"
510
+ );
511
+ println!("✓ Negative compound word properly excludes files with compound parts");
512
+
513
+ // Test excluded terms extraction directly using QueryPlan
514
+ let plan = create_query_plan(query, false).unwrap();
515
+
516
+ // Check that the original term is in the excluded_terms set
517
+ assert!(
518
+ plan.excluded_terms.contains("networkfirewall"),
519
+ "Original term 'networkfirewall' should be in excluded_terms"
520
+ );
521
+
522
+ // We don't split excluded terms, so compound parts should not be in the excluded terms set
523
+ assert!(
524
+ !plan.excluded_terms.contains("network"),
525
+ "Compound part 'network' should not be in excluded_terms"
526
+ );
527
+ assert!(
528
+ !plan.excluded_terms.contains("firewall"),
529
+ "Compound part 'firewall' should not be in excluded_terms"
530
+ );
531
+ println!("✓ Excluded terms extraction properly handles compound words");
532
+
533
+ // Reset debug mode
534
+ std::env::remove_var("DEBUG");
535
+ }