@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,725 @@
1
+ use anyhow::Result;
2
+ use std::fs;
3
+ use tempfile::TempDir;
4
+
5
+ mod common;
6
+ use common::TestContext;
7
+
8
+ #[test]
9
+ fn test_rust_outline_smart_closing_brace_comments() -> Result<()> {
10
+ let temp_dir = TempDir::new()?;
11
+ let test_file = temp_dir.path().join("smart_braces.rs");
12
+
13
+ let content = r#"/// Small function that should NOT get closing brace comments.
14
+ pub fn small_function(x: i32) -> i32 {
15
+ let result = x * 2;
16
+ result + 1
17
+ }
18
+
19
+ /// Large function that SHOULD get closing brace comments when there are gaps.
20
+ pub fn large_function_with_gaps(data: Vec<i32>) -> Vec<String> {
21
+ let mut results = Vec::new();
22
+ let mut processor = DataProcessor::new();
23
+
24
+ // Phase 1: Initial processing
25
+ for (index, value) in data.iter().enumerate() {
26
+ if value > &100 {
27
+ processor.process_large_value(value, index);
28
+ } else if value < &0 {
29
+ processor.process_negative_value(value, index);
30
+ } else {
31
+ processor.process_small_value(value, index);
32
+ }
33
+ }
34
+
35
+ // Phase 2: Complex transformation logic
36
+ let transformed_data = processor.get_transformed_data();
37
+ for item in transformed_data {
38
+ match item.category {
39
+ Category::High => {
40
+ results.push(format!("HIGH: {}", item.value));
41
+ }
42
+ Category::Medium => {
43
+ results.push(format!("MED: {}", item.value));
44
+ }
45
+ Category::Low => {
46
+ results.push(format!("LOW: {}", item.value));
47
+ }
48
+ }
49
+ }
50
+
51
+ // Phase 3: Final validation and cleanup
52
+ let mut validated_results = Vec::new();
53
+ for result in results {
54
+ if result.len() > 5 {
55
+ validated_results.push(result);
56
+ }
57
+ }
58
+
59
+ validated_results
60
+ }
61
+
62
+ /// Another large function to test closing brace behavior
63
+ pub fn another_large_function(items: &[Item]) -> ProcessedResult {
64
+ let mut accumulator = Accumulator::new();
65
+
66
+ // Main processing loop with complex nested logic
67
+ for item in items {
68
+ match item.item_type {
69
+ ItemType::Primary => {
70
+ if item.weight > 50.0 {
71
+ accumulator.add_heavy_primary(item);
72
+ } else {
73
+ accumulator.add_light_primary(item);
74
+ }
75
+ }
76
+ ItemType::Secondary => {
77
+ accumulator.add_secondary(item);
78
+ }
79
+ ItemType::Auxiliary => {
80
+ accumulator.add_auxiliary(item);
81
+ }
82
+ }
83
+ }
84
+
85
+ accumulator.finalize()
86
+ }
87
+ "#;
88
+
89
+ fs::write(&test_file, content)?;
90
+
91
+ let ctx = TestContext::new();
92
+ let output = ctx.run_probe(&[
93
+ "search",
94
+ "large_function", // Search for large functions
95
+ test_file.to_str().unwrap(),
96
+ "--format",
97
+ "outline",
98
+ ])?;
99
+
100
+ // Should find the large functions
101
+ assert!(
102
+ output.contains("large_function_with_gaps") || output.contains("another_large_function"),
103
+ "Missing large functions - output: {}",
104
+ output
105
+ );
106
+
107
+ // Should have closing brace comments for large functions with gaps
108
+ let has_closing_brace_comment = output.contains("} //") || output.contains("} /*");
109
+ assert!(
110
+ has_closing_brace_comment,
111
+ "Large functions should have closing brace comments - output: {}",
112
+ output
113
+ );
114
+
115
+ // Should be in outline format
116
+ assert!(
117
+ output.contains("---\nFile:"),
118
+ "Missing file delimiter in outline format - output: {}",
119
+ output
120
+ );
121
+
122
+ Ok(())
123
+ }
124
+
125
+ #[test]
126
+ fn test_rust_outline_array_truncation_with_keyword_preservation() -> Result<()> {
127
+ let temp_dir = TempDir::new()?;
128
+ let test_file = temp_dir.path().join("large_arrays.rs");
129
+
130
+ let content = r#"use std::collections::HashMap;
131
+
132
+ /// Function containing large array that should be truncated but preserve keywords.
133
+ pub fn process_large_dataset() -> Vec<String> {
134
+ let large_configuration = vec![
135
+ "database_connection_string",
136
+ "api_key_primary",
137
+ "api_key_secondary",
138
+ "cache_timeout_value",
139
+ "retry_attempt_count",
140
+ "batch_size_limit",
141
+ "queue_max_capacity",
142
+ "worker_thread_count",
143
+ "memory_allocation_limit",
144
+ "disk_space_threshold",
145
+ "network_timeout_value",
146
+ "authentication_token_lifetime",
147
+ "session_expiry_duration",
148
+ "log_rotation_interval",
149
+ "backup_retention_period",
150
+ "monitoring_check_interval",
151
+ "alert_notification_threshold",
152
+ "performance_metrics_collection",
153
+ "security_audit_frequency",
154
+ "data_encryption_algorithm",
155
+ "compression_ratio_target",
156
+ "indexing_strategy_preference",
157
+ "query_optimization_level",
158
+ "connection_pool_sizing",
159
+ "load_balancer_configuration",
160
+ "failover_mechanism_timeout",
161
+ "disaster_recovery_checkpoint",
162
+ "data_replication_strategy",
163
+ "cache_invalidation_policy",
164
+ "resource_allocation_priority"
165
+ ];
166
+
167
+ let mut results = Vec::new();
168
+ for config_item in large_configuration {
169
+ if config_item.contains("api_key") {
170
+ results.push(format!("SECURE: {}", config_item));
171
+ } else if config_item.contains("timeout") {
172
+ results.push(format!("TIMING: {}", config_item));
173
+ } else {
174
+ results.push(format!("CONFIG: {}", config_item));
175
+ }
176
+ }
177
+
178
+ results
179
+ }
180
+
181
+ /// Function with large struct initialization that should be truncated.
182
+ pub fn create_large_configuration() -> Config {
183
+ let config = Config {
184
+ database_host: "localhost".to_string(),
185
+ database_port: 5432,
186
+ database_name: "production_db".to_string(),
187
+ connection_timeout: Duration::from_secs(30),
188
+ max_connections: 100,
189
+ idle_timeout: Duration::from_secs(300),
190
+ query_timeout: Duration::from_secs(60),
191
+ ssl_enabled: true,
192
+ ssl_cert_path: "/etc/ssl/certs/db.pem".to_string(),
193
+ ssl_key_path: "/etc/ssl/private/db.key".to_string(),
194
+ backup_enabled: true,
195
+ backup_interval: Duration::from_secs(3600),
196
+ backup_retention_days: 30,
197
+ log_level: LogLevel::Info,
198
+ log_file_path: "/var/log/app.log".to_string(),
199
+ max_log_file_size: 100_000_000,
200
+ api_key: "super_secret_api_key_here".to_string(),
201
+ api_rate_limit: 1000,
202
+ cache_size: 1024 * 1024 * 100,
203
+ cache_ttl: Duration::from_secs(3600),
204
+ feature_flags: FeatureFlags {
205
+ enable_new_feature_alpha: true,
206
+ enable_experimental_optimization: false,
207
+ enable_beta_ui: true,
208
+ enable_advanced_analytics: true,
209
+ },
210
+ monitoring: MonitoringConfig {
211
+ metrics_enabled: true,
212
+ traces_enabled: true,
213
+ logs_enabled: true,
214
+ sample_rate: 0.1,
215
+ }
216
+ };
217
+
218
+ config
219
+ }
220
+ "#;
221
+
222
+ fs::write(&test_file, content)?;
223
+
224
+ let ctx = TestContext::new();
225
+ let output = ctx.run_probe(&[
226
+ "search",
227
+ "api_key", // Search for keyword that appears in large structures
228
+ test_file.to_str().unwrap(),
229
+ "--format",
230
+ "outline",
231
+ ])?;
232
+
233
+ // Should find the functions containing api_key
234
+ assert!(
235
+ output.contains("process_large_dataset") || output.contains("create_large_configuration"),
236
+ "Missing functions with api_key - output: {}",
237
+ output
238
+ );
239
+
240
+ // Should contain the search keyword even in truncated output
241
+ assert!(
242
+ output.contains("api_key"),
243
+ "Should preserve api_key keyword even in truncated arrays - output: {}",
244
+ output
245
+ );
246
+
247
+ // Should show truncation with ellipsis for large arrays
248
+ assert!(
249
+ output.contains("..."),
250
+ "Should show ellipsis for truncated large arrays - output: {}",
251
+ output
252
+ );
253
+
254
+ // Should be reasonably sized (not show the full large array)
255
+ let line_count = output.lines().count();
256
+ assert!(
257
+ line_count < 100,
258
+ "Output should be truncated to reasonable size, got {} lines",
259
+ line_count
260
+ );
261
+
262
+ Ok(())
263
+ }
264
+
265
+ #[test]
266
+ fn test_rust_outline_complex_generics_and_lifetimes() -> Result<()> {
267
+ let temp_dir = TempDir::new()?;
268
+ let test_file = temp_dir.path().join("complex_rust.rs");
269
+
270
+ let content = r#"use std::collections::HashMap;
271
+ use std::marker::PhantomData;
272
+
273
+ /// Complex generic struct with lifetimes and type bounds.
274
+ pub struct ComplexProcessor<'a, T, U>
275
+ where
276
+ T: Clone + Send + Sync + 'static,
277
+ U: AsRef<str> + Into<String>,
278
+ {
279
+ data: &'a [T],
280
+ lookup: HashMap<String, U>,
281
+ phantom: PhantomData<T>,
282
+ }
283
+
284
+ impl<'a, T, U> ComplexProcessor<'a, T, U>
285
+ where
286
+ T: Clone + Send + Sync + 'static,
287
+ U: AsRef<str> + Into<String>,
288
+ {
289
+ /// Create a new processor with lifetime and generic constraints.
290
+ pub fn new(data: &'a [T]) -> Self {
291
+ Self {
292
+ data,
293
+ lookup: HashMap::new(),
294
+ phantom: PhantomData,
295
+ }
296
+ }
297
+
298
+ /// Async function with complex generic processing.
299
+ pub async fn process_with_constraints<F, R>(&mut self, processor_func: F) -> Result<Vec<R>, ProcessError>
300
+ where
301
+ F: Fn(&T) -> Result<R, ProcessError> + Send + Sync,
302
+ R: Clone + Send + 'static,
303
+ {
304
+ let mut results = Vec::new();
305
+
306
+ for item in self.data.iter() {
307
+ match processor_func(item) {
308
+ Ok(result) => {
309
+ results.push(result);
310
+ }
311
+ Err(e) => {
312
+ log::error!("Processing error: {:?}", e);
313
+ return Err(e);
314
+ }
315
+ }
316
+ }
317
+
318
+ Ok(results)
319
+ }
320
+ }
321
+
322
+ /// Trait with associated types and complex bounds.
323
+ pub trait DataProcessor<'a, T>: Send + Sync
324
+ where
325
+ T: Clone + Send + Sync,
326
+ {
327
+ type Output: Clone + Send;
328
+ type Error: std::error::Error + Send + Sync + 'static;
329
+
330
+ /// Process data with lifetime constraints.
331
+ fn process_data(&self, data: &'a [T]) -> Result<Self::Output, Self::Error>;
332
+
333
+ /// Async processing method with complex constraints.
334
+ async fn async_process<F>(&self, data: &'a [T], mapper: F) -> Result<Vec<Self::Output>, Self::Error>
335
+ where
336
+ F: Fn(&T) -> Result<Self::Output, Self::Error> + Send + Sync;
337
+ }
338
+
339
+ /// Function with higher-ranked trait bounds (HRTB).
340
+ pub fn apply_closure<F>(data: &[String], func: F) -> Vec<String>
341
+ where
342
+ F: for<'a> Fn(&'a str) -> String,
343
+ {
344
+ data.iter()
345
+ .map(|s| func(s.as_str()))
346
+ .collect()
347
+ }
348
+
349
+ /// Complex match expression with patterns and guards.
350
+ pub fn pattern_matching_example<T>(value: Option<Result<T, String>>) -> String
351
+ where
352
+ T: std::fmt::Display,
353
+ {
354
+ match value {
355
+ Some(Ok(val)) if val.to_string().len() > 5 => {
356
+ format!("Long value: {}", val)
357
+ }
358
+ Some(Ok(val)) => {
359
+ format!("Short value: {}", val)
360
+ }
361
+ Some(Err(e)) if e.contains("critical") => {
362
+ format!("Critical error: {}", e)
363
+ }
364
+ Some(Err(e)) => {
365
+ format!("Error: {}", e)
366
+ }
367
+ None => {
368
+ "No value provided".to_string()
369
+ }
370
+ }
371
+ }
372
+ "#;
373
+
374
+ fs::write(&test_file, content)?;
375
+
376
+ let ctx = TestContext::new();
377
+ let output = ctx.run_probe(&[
378
+ "search",
379
+ "ComplexProcessor", // Search for the complex struct
380
+ test_file.to_str().unwrap(),
381
+ "--format",
382
+ "outline",
383
+ ])?;
384
+
385
+ // Should find complex Rust constructs
386
+ assert!(
387
+ output.contains("ComplexProcessor") || output.contains("where"),
388
+ "Missing complex generic structures - output: {}",
389
+ output
390
+ );
391
+
392
+ // Should handle complex generic syntax properly in outline format
393
+ assert!(
394
+ output.contains("---\nFile:"),
395
+ "Missing file delimiter in outline format - output: {}",
396
+ output
397
+ );
398
+
399
+ // Should be in outline format with proper structure
400
+ assert!(
401
+ output.contains("Found") && output.contains("search results"),
402
+ "Missing search results summary - output: {}",
403
+ output
404
+ );
405
+
406
+ Ok(())
407
+ }
408
+
409
+ #[test]
410
+ fn test_rust_outline_nested_control_flow_closing_braces() -> Result<()> {
411
+ let temp_dir = TempDir::new()?;
412
+ let test_file = temp_dir.path().join("nested_control_flow.rs");
413
+
414
+ let content = r#"/// Function with deeply nested control flow structures.
415
+ pub fn deeply_nested_processing(data: &[ProcessingItem]) -> ProcessingResult {
416
+ let mut result = ProcessingResult::new();
417
+
418
+ // Level 1: Main iteration
419
+ for (outer_index, item) in data.iter().enumerate() {
420
+ if item.is_valid() {
421
+ // Level 2: Category processing
422
+ match item.category {
423
+ Category::TypeA => {
424
+ // Level 3: Sub-category processing
425
+ for sub_item in &item.sub_items {
426
+ if sub_item.weight > 10.0 {
427
+ // Level 4: Weight-based processing
428
+ match sub_item.processing_type {
429
+ ProcessingType::Intensive => {
430
+ // Level 5: Intensive processing branch
431
+ if sub_item.requires_validation {
432
+ while !sub_item.is_validated() {
433
+ sub_item.validate();
434
+ if sub_item.validation_attempts > MAX_ATTEMPTS {
435
+ break;
436
+ }
437
+ }
438
+ }
439
+ result.add_intensive_result(sub_item.process());
440
+ }
441
+ ProcessingType::Standard => {
442
+ result.add_standard_result(sub_item.process());
443
+ }
444
+ ProcessingType::Quick => {
445
+ result.add_quick_result(sub_item.quick_process());
446
+ }
447
+ }
448
+ } else {
449
+ // Light-weight item processing
450
+ result.add_lightweight_result(sub_item.lightweight_process());
451
+ }
452
+ }
453
+ }
454
+ Category::TypeB => {
455
+ // Different processing path for TypeB
456
+ for (index, sub_item) in item.sub_items.iter().enumerate() {
457
+ if index % 2 == 0 {
458
+ // Even index processing
459
+ result.add_even_result(sub_item.process_even());
460
+ } else {
461
+ // Odd index processing
462
+ result.add_odd_result(sub_item.process_odd());
463
+ }
464
+ }
465
+ }
466
+ Category::TypeC => {
467
+ // TypeC has special processing requirements
468
+ let mut batch_processor = BatchProcessor::new();
469
+ loop {
470
+ let batch = item.get_next_batch();
471
+ if batch.is_empty() {
472
+ break;
473
+ }
474
+
475
+ for batch_item in batch {
476
+ if batch_item.needs_special_handling() {
477
+ match batch_item.special_type {
478
+ SpecialType::Critical => {
479
+ result.add_critical_result(batch_item.critical_process());
480
+ }
481
+ SpecialType::Urgent => {
482
+ result.add_urgent_result(batch_item.urgent_process());
483
+ }
484
+ SpecialType::Normal => {
485
+ result.add_normal_result(batch_item.normal_process());
486
+ }
487
+ }
488
+ }
489
+ }
490
+
491
+ batch_processor.process_batch(batch);
492
+ }
493
+ }
494
+ }
495
+ } else {
496
+ // Invalid item handling
497
+ result.add_error(format!("Invalid item at index {}", outer_index));
498
+ }
499
+ }
500
+
501
+ result
502
+ }
503
+ "#;
504
+
505
+ fs::write(&test_file, content)?;
506
+
507
+ let ctx = TestContext::new();
508
+ let output = ctx.run_probe(&[
509
+ "search",
510
+ "nested_processing", // Search for the function
511
+ test_file.to_str().unwrap(),
512
+ "--format",
513
+ "outline",
514
+ ])?;
515
+
516
+ // Should find the deeply nested function
517
+ assert!(
518
+ output.contains("deeply_nested_processing"),
519
+ "Missing deeply nested function - output: {}",
520
+ output
521
+ );
522
+
523
+ // The function should be shown with all its nested structure
524
+ // Note: Closing brace comments only appear when there are gaps (ellipsis) in the outline
525
+ // If the entire function is shown, no closing brace comments are needed
526
+ let has_complete_function = !output.contains("...");
527
+ let has_closing_brace_comments = output.contains("} //") || output.contains("} /*");
528
+
529
+ // Either we should see closing brace comments (if there are gaps)
530
+ // OR we should see the complete function (if no gaps)
531
+ assert!(
532
+ has_closing_brace_comments || has_complete_function,
533
+ "Should either have closing brace comments (with gaps) or show complete function (no gaps) - output: {}",
534
+ output
535
+ );
536
+
537
+ // Should show nested control flow keywords
538
+ let control_flow_count = output.matches("for ").count()
539
+ + output.matches("if ").count()
540
+ + output.matches("match ").count()
541
+ + output.matches("while ").count()
542
+ + output.matches("loop").count();
543
+ assert!(
544
+ control_flow_count >= 3,
545
+ "Should show multiple nested control flow keywords - output: {}",
546
+ output
547
+ );
548
+
549
+ Ok(())
550
+ }
551
+
552
+ #[test]
553
+ fn test_rust_outline_small_functions_no_closing_brace_comments() -> Result<()> {
554
+ let temp_dir = TempDir::new()?;
555
+ let test_file = temp_dir.path().join("small_functions.rs");
556
+
557
+ let content = r#"/// Small helper function - should not have closing brace comments.
558
+ pub fn small_helper(x: i32) -> i32 {
559
+ x * 2
560
+ }
561
+
562
+ /// Another small function - also should not have closing brace comments.
563
+ pub fn another_small_function(s: &str) -> String {
564
+ s.to_uppercase()
565
+ }
566
+
567
+ /// Small function with a few lines - still should not have closing brace comments.
568
+ pub fn small_with_few_lines(data: &[i32]) -> i32 {
569
+ let sum: i32 = data.iter().sum();
570
+ let count = data.len() as i32;
571
+ if count > 0 {
572
+ sum / count
573
+ } else {
574
+ 0
575
+ }
576
+ }
577
+
578
+ /// Utility function - very small.
579
+ pub fn utility_function(a: i32, b: i32) -> i32 {
580
+ a + b
581
+ }
582
+
583
+ /// Simple validation function.
584
+ pub fn validate_input(input: &str) -> bool {
585
+ !input.is_empty() && input.len() < 100
586
+ }
587
+ "#;
588
+
589
+ fs::write(&test_file, content)?;
590
+
591
+ let ctx = TestContext::new();
592
+ let output = ctx.run_probe(&[
593
+ "search",
594
+ "small", // Search for small functions
595
+ test_file.to_str().unwrap(),
596
+ "--format",
597
+ "outline",
598
+ ])?;
599
+
600
+ // Should find the small functions
601
+ assert!(
602
+ output.contains("small_helper") || output.contains("small_function"),
603
+ "Missing small functions - output: {}",
604
+ output
605
+ );
606
+
607
+ // Small functions should NOT have closing brace comments
608
+ let has_closing_brace_comment = output.contains("} //") || output.contains("} /*");
609
+ assert!(
610
+ !has_closing_brace_comment,
611
+ "Small functions should NOT have closing brace comments - output: {}",
612
+ output
613
+ );
614
+
615
+ // Should be in outline format
616
+ assert!(
617
+ output.contains("---\nFile:"),
618
+ "Missing file delimiter in outline format - output: {}",
619
+ output
620
+ );
621
+
622
+ Ok(())
623
+ }
624
+
625
+ #[test]
626
+ fn test_rust_outline_keyword_highlighting_preservation() -> Result<()> {
627
+ let temp_dir = TempDir::new()?;
628
+ let test_file = temp_dir.path().join("keyword_highlighting.rs");
629
+
630
+ let content = r#"use std::sync::Arc;
631
+
632
+ /// Function containing the search term "synchronization" in multiple contexts.
633
+ pub fn advanced_synchronization_handler() -> SyncResult {
634
+ let synchronization_config = SyncConfig {
635
+ timeout: Duration::from_secs(30),
636
+ retry_attempts: 3,
637
+ enable_synchronization_logging: true,
638
+ };
639
+
640
+ // Synchronization logic with multiple references
641
+ if synchronization_config.enable_synchronization_logging {
642
+ log::info!("Starting synchronization process");
643
+ }
644
+
645
+ let sync_manager = SyncManager::new(synchronization_config);
646
+ sync_manager.perform_synchronization()
647
+ }
648
+
649
+ /// Another function with synchronization in comments and code.
650
+ pub fn background_synchronization_worker() {
651
+ // This function handles background synchronization tasks
652
+ // The synchronization process is critical for data consistency
653
+
654
+ loop {
655
+ match synchronization_queue.pop() {
656
+ Some(task) => {
657
+ // Process synchronization task
658
+ task.execute_synchronization();
659
+ }
660
+ None => {
661
+ // No synchronization tasks pending
662
+ thread::sleep(Duration::from_millis(100));
663
+ }
664
+ }
665
+ }
666
+ }
667
+
668
+ /// Complex function with synchronization in various contexts.
669
+ pub fn multi_context_synchronization() {
670
+ let synchronization_items = vec![
671
+ "user_data_synchronization",
672
+ "config_synchronization",
673
+ "cache_synchronization",
674
+ "backup_synchronization"
675
+ ];
676
+
677
+ for item in synchronization_items {
678
+ println!("Processing synchronization for: {}", item);
679
+ }
680
+ }
681
+ "#;
682
+
683
+ fs::write(&test_file, content)?;
684
+
685
+ let ctx = TestContext::new();
686
+ let output = ctx.run_probe(&[
687
+ "search",
688
+ "synchronization", // Search term that appears multiple times
689
+ test_file.to_str().unwrap(),
690
+ "--format",
691
+ "outline",
692
+ ])?;
693
+
694
+ // Should find functions containing synchronization
695
+ assert!(
696
+ output.contains("synchronization_handler") || output.contains("synchronization_worker"),
697
+ "Missing functions with synchronization - output: {}",
698
+ output
699
+ );
700
+
701
+ // Should contain the search keyword multiple times (highlighted)
702
+ let synchronization_count = output.matches("synchronization").count();
703
+ assert!(
704
+ synchronization_count >= 3,
705
+ "Should preserve synchronization keyword multiple times - found {}, output: {}",
706
+ synchronization_count,
707
+ output
708
+ );
709
+
710
+ // Should be in outline format
711
+ assert!(
712
+ output.contains("---\nFile:"),
713
+ "Missing file delimiter in outline format - output: {}",
714
+ output
715
+ );
716
+
717
+ // Should have search results summary
718
+ assert!(
719
+ output.contains("Found") && output.contains("search results"),
720
+ "Missing search results summary - output: {}",
721
+ output
722
+ );
723
+
724
+ Ok(())
725
+ }