@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,843 @@
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_basic_symbols() -> Result<()> {
10
+ let temp_dir = TempDir::new()?;
11
+ let test_file = temp_dir.path().join("basic.rs");
12
+
13
+ let content = r#"use std::collections::HashMap;
14
+
15
+ /// A simple calculator struct for arithmetic operations.
16
+ pub struct Calculator {
17
+ pub name: String,
18
+ history: Vec<f64>,
19
+ }
20
+
21
+ impl Calculator {
22
+ /// Creates a new calculator instance.
23
+ pub fn new(name: String) -> Self {
24
+ Self {
25
+ name,
26
+ history: Vec::new(),
27
+ }
28
+ }
29
+
30
+ /// Adds two numbers and returns the result.
31
+ pub fn add(&mut self, x: f64, y: f64) -> f64 {
32
+ let result = x + y;
33
+ self.history.push(result);
34
+ result
35
+ }
36
+
37
+ /// Gets the calculation history.
38
+ pub fn get_history(&self) -> &[f64] {
39
+ &self.history
40
+ }
41
+ }
42
+
43
+ /// Trait for mathematical operations.
44
+ pub trait MathOperations {
45
+ fn multiply(&self, a: f64, b: f64) -> f64;
46
+ fn divide(&self, a: f64, b: f64) -> Option<f64>;
47
+ }
48
+
49
+ /// Enumeration of supported number types.
50
+ #[derive(Debug, Clone)]
51
+ pub enum NumberType {
52
+ Integer(i64),
53
+ Float(f64),
54
+ Complex { real: f64, imaginary: f64 },
55
+ }
56
+
57
+ /// Main function to demonstrate calculator usage.
58
+ pub fn main() {
59
+ let mut calc = Calculator::new("Test Calculator".to_string());
60
+ let result = calc.add(10.0, 20.0);
61
+ println!("Result: {}", result);
62
+ }
63
+
64
+ #[cfg(test)]
65
+ mod tests {
66
+ use super::*;
67
+
68
+ #[test]
69
+ fn test_calculator_add() {
70
+ let mut calc = Calculator::new("Test".to_string());
71
+ assert_eq!(calc.add(2.0, 3.0), 5.0);
72
+ }
73
+
74
+ #[test]
75
+ fn test_calculator_history() {
76
+ let mut calc = Calculator::new("Test".to_string());
77
+ calc.add(1.0, 2.0);
78
+ assert_eq!(calc.get_history().len(), 1);
79
+ }
80
+ }
81
+ "#;
82
+
83
+ fs::write(&test_file, content)?;
84
+
85
+ let ctx = TestContext::new();
86
+ let output = ctx.run_probe(&[
87
+ "search",
88
+ "Calculator", // Search term that will match multiple symbols
89
+ test_file.to_str().unwrap(),
90
+ "--format",
91
+ "outline",
92
+ "--allow-tests",
93
+ ])?;
94
+
95
+ // Verify Rust symbols are extracted in outline format
96
+ assert!(
97
+ output.contains("pub struct Calculator"),
98
+ "Missing Calculator struct - output: {}",
99
+ output
100
+ );
101
+ assert!(
102
+ output.contains("Calculator::new"),
103
+ "Missing Calculator impl methods - output: {}",
104
+ output
105
+ );
106
+ assert!(
107
+ output.contains("pub fn main"),
108
+ "Missing main function - output: {}",
109
+ output
110
+ );
111
+ // In outline format, we should see the search results properly formatted
112
+ assert!(
113
+ output.contains("---\nFile:"),
114
+ "Missing file delimiter - output: {}",
115
+ output
116
+ );
117
+ // We expect multiple search results since Calculator appears in multiple places
118
+ assert!(
119
+ output.contains("Found") && output.contains("search results"),
120
+ "Missing search results summary - output: {}",
121
+ output
122
+ );
123
+
124
+ Ok(())
125
+ }
126
+
127
+ #[test]
128
+ fn test_rust_outline_control_flow_statements() -> Result<()> {
129
+ let temp_dir = TempDir::new()?;
130
+ let test_file = temp_dir.path().join("control_flow.rs");
131
+
132
+ let content = r#"use std::collections::HashMap;
133
+
134
+ /// Function demonstrating various control flow statements with gaps.
135
+ pub fn complex_algorithm(data: Vec<i32>, threshold: i32) -> HashMap<String, i32> {
136
+ let mut result = HashMap::new();
137
+ let mut counter = 0;
138
+
139
+ // First processing phase
140
+ for item in &data {
141
+ if *item > threshold {
142
+ counter += 1;
143
+
144
+ // Complex nested conditions
145
+ if counter % 2 == 0 {
146
+ result.insert(format!("even_{}", counter), *item);
147
+ } else {
148
+ result.insert(format!("odd_{}", counter), *item);
149
+ }
150
+ }
151
+ }
152
+
153
+ // Second processing phase
154
+ let mut index = 0;
155
+ while index < data.len() {
156
+ match data[index] {
157
+ x if x < 0 => {
158
+ result.insert(format!("negative_{}", index), x);
159
+ index += 1;
160
+ }
161
+ x if x == 0 => {
162
+ result.insert("zero".to_string(), 0);
163
+ index += 1;
164
+ }
165
+ x => {
166
+ result.insert(format!("positive_{}", index), x);
167
+ index += 1;
168
+ }
169
+ }
170
+ }
171
+
172
+ result
173
+ }
174
+
175
+ /// Function with nested loops demonstrating closing brace comments.
176
+ pub fn process_matrix(matrix: Vec<Vec<i32>>) -> Vec<Vec<i32>> {
177
+ let mut processed = Vec::new();
178
+
179
+ for row in matrix.iter() {
180
+ let mut new_row = Vec::new();
181
+
182
+ for &cell in row.iter() {
183
+ let processed_cell = if cell > 0 {
184
+ cell * 2
185
+ } else if cell < 0 {
186
+ cell.abs()
187
+ } else {
188
+ 1
189
+ };
190
+
191
+ new_row.push(processed_cell);
192
+ }
193
+
194
+ processed.push(new_row);
195
+ }
196
+
197
+ processed
198
+ }
199
+
200
+ /// Function with match statements and complex patterns.
201
+ pub fn analyze_data(input: &str) -> Result<String, String> {
202
+ match input.trim() {
203
+ "" => Err("Empty input".to_string()),
204
+ s if s.len() > 100 => {
205
+ Ok("Large input detected".to_string())
206
+ }
207
+ s if s.chars().all(|c| c.is_ascii_digit()) => {
208
+ let num: i32 = s.parse().map_err(|e| format!("Parse error: {}", e))?;
209
+
210
+ match num {
211
+ 0..=10 => Ok("Small number".to_string()),
212
+ 11..=100 => Ok("Medium number".to_string()),
213
+ _ => Ok("Large number".to_string()),
214
+ }
215
+ }
216
+ _ => Ok("Text input".to_string()),
217
+ }
218
+ }
219
+ "#;
220
+
221
+ fs::write(&test_file, content)?;
222
+
223
+ let ctx = TestContext::new();
224
+ let output = ctx.run_probe(&[
225
+ "search",
226
+ "algorithm", // Search for function names that will match
227
+ test_file.to_str().unwrap(),
228
+ "--format",
229
+ "outline",
230
+ ])?;
231
+
232
+ // Verify control flow functions are found
233
+ assert!(
234
+ output.contains("complex_algorithm") || output.contains("process_matrix"),
235
+ "Missing control flow functions - output: {}",
236
+ output
237
+ );
238
+
239
+ // Should contain control flow keywords highlighted in the outline
240
+ let has_control_flow = output.contains("for ")
241
+ || output.contains("while ")
242
+ || output.contains("match ")
243
+ || output.contains("if ");
244
+ assert!(
245
+ has_control_flow,
246
+ "Missing control flow statements - output: {}",
247
+ output
248
+ );
249
+
250
+ // Should contain closing braces for large blocks with gaps
251
+ assert!(
252
+ output.contains("}"),
253
+ "Missing closing braces - output: {}",
254
+ output
255
+ );
256
+
257
+ // Should be in outline format with file delimiter
258
+ assert!(
259
+ output.contains("---\nFile:"),
260
+ "Missing file delimiter in outline format - output: {}",
261
+ output
262
+ );
263
+
264
+ Ok(())
265
+ }
266
+
267
+ #[test]
268
+ fn test_rust_outline_macros_and_attributes() -> Result<()> {
269
+ let temp_dir = TempDir::new()?;
270
+ let test_file = temp_dir.path().join("macros.rs");
271
+
272
+ let content = r#"use serde::{Deserialize, Serialize};
273
+ use std::fmt;
274
+
275
+ /// Custom derive macro demonstration.
276
+ #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
277
+ pub struct Person {
278
+ pub name: String,
279
+ pub age: u32,
280
+ pub email: String,
281
+ }
282
+
283
+ /// Custom attribute macro demonstration.
284
+ #[cfg(feature = "advanced")]
285
+ pub fn advanced_feature() -> String {
286
+ "This is an advanced feature".to_string()
287
+ }
288
+
289
+ /// Procedural macro definition.
290
+ macro_rules! create_function {
291
+ ($func_name:ident, $return_type:ty, $value:expr) => {
292
+ pub fn $func_name() -> $return_type {
293
+ $value
294
+ }
295
+ };
296
+ }
297
+
298
+ // Generate functions using macro
299
+ create_function!(get_pi, f64, 3.14159);
300
+ create_function!(get_greeting, String, "Hello, World!".to_string());
301
+ create_function!(get_answer, i32, 42);
302
+
303
+ /// Implementation with custom Display trait.
304
+ impl fmt::Display for Person {
305
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
306
+ write!(f, "{} (age: {}, email: {})", self.name, self.age, self.email)
307
+ }
308
+ }
309
+
310
+ /// Generic implementation with constraints.
311
+ impl<T> From<T> for Person
312
+ where
313
+ T: AsRef<str>,
314
+ {
315
+ fn from(name: T) -> Self {
316
+ Person {
317
+ name: name.as_ref().to_string(),
318
+ age: 0,
319
+ email: String::new(),
320
+ }
321
+ }
322
+ }
323
+
324
+ #[cfg(test)]
325
+ mod tests {
326
+ use super::*;
327
+
328
+ #[test]
329
+ fn test_person_creation() {
330
+ let person = Person {
331
+ name: "John".to_string(),
332
+ age: 30,
333
+ email: "john@example.com".to_string(),
334
+ };
335
+ assert_eq!(person.name, "John");
336
+ }
337
+
338
+ #[test]
339
+ fn test_macro_generated_functions() {
340
+ assert_eq!(get_pi(), 3.14159);
341
+ assert_eq!(get_answer(), 42);
342
+ }
343
+ }
344
+ "#;
345
+
346
+ fs::write(&test_file, content)?;
347
+
348
+ let ctx = TestContext::new();
349
+ let output = ctx.run_probe(&[
350
+ "search",
351
+ "create_function", // Search for a term that will match
352
+ test_file.to_str().unwrap(),
353
+ "--format",
354
+ "outline",
355
+ "--allow-tests",
356
+ ])?;
357
+
358
+ // Verify macro handling in outline format
359
+ assert!(
360
+ output.contains("macro_rules!") || output.contains("create_function"),
361
+ "Missing macro definition - output: {}",
362
+ output
363
+ );
364
+
365
+ // Should be in outline format with file delimiter
366
+ assert!(
367
+ output.contains("---\nFile:"),
368
+ "Missing file delimiter in outline format - output: {}",
369
+ output
370
+ );
371
+
372
+ // Should have found at least one result
373
+ assert!(
374
+ output.contains("Found") && output.contains("search results"),
375
+ "Missing search results summary - output: {}",
376
+ output
377
+ );
378
+
379
+ Ok(())
380
+ }
381
+
382
+ #[test]
383
+ fn test_rust_outline_async_and_errors() -> Result<()> {
384
+ let temp_dir = TempDir::new()?;
385
+ let test_file = temp_dir.path().join("async_errors.rs");
386
+
387
+ let content = r#"use std::error::Error;
388
+ use std::fmt;
389
+ use tokio::time::{sleep, Duration};
390
+
391
+ /// Custom error type for demonstration.
392
+ #[derive(Debug)]
393
+ pub enum ProcessingError {
394
+ NetworkError(String),
395
+ TimeoutError,
396
+ ValidationError { field: String, message: String },
397
+ }
398
+
399
+ impl fmt::Display for ProcessingError {
400
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
401
+ match self {
402
+ ProcessingError::NetworkError(msg) => write!(f, "Network error: {}", msg),
403
+ ProcessingError::TimeoutError => write!(f, "Operation timed out"),
404
+ ProcessingError::ValidationError { field, message } => {
405
+ write!(f, "Validation error in {}: {}", field, message)
406
+ }
407
+ }
408
+ }
409
+ }
410
+
411
+ impl Error for ProcessingError {}
412
+
413
+ /// Async function with error handling.
414
+ pub async fn fetch_data(url: &str) -> Result<String, ProcessingError> {
415
+ // Simulate network delay
416
+ sleep(Duration::from_millis(100)).await;
417
+
418
+ // Simulate validation
419
+ if url.is_empty() {
420
+ return Err(ProcessingError::ValidationError {
421
+ field: "url".to_string(),
422
+ message: "URL cannot be empty".to_string(),
423
+ });
424
+ }
425
+
426
+ if url.len() > 1000 {
427
+ return Err(ProcessingError::ValidationError {
428
+ field: "url".to_string(),
429
+ message: "URL too long".to_string(),
430
+ });
431
+ }
432
+
433
+ // Simulate successful fetch
434
+ Ok(format!("Data from {}", url))
435
+ }
436
+
437
+ /// Async function with complex error handling and retries.
438
+ pub async fn fetch_with_retry(url: &str, max_retries: u32) -> Result<String, ProcessingError> {
439
+ let mut attempts = 0;
440
+
441
+ while attempts < max_retries {
442
+ match fetch_data(url).await {
443
+ Ok(data) => return Ok(data),
444
+ Err(ProcessingError::NetworkError(msg)) => {
445
+ eprintln!("Attempt {} failed: {}", attempts + 1, msg);
446
+ attempts += 1;
447
+
448
+ if attempts < max_retries {
449
+ sleep(Duration::from_millis(1000)).await;
450
+ }
451
+ }
452
+ Err(other_error) => return Err(other_error),
453
+ }
454
+ }
455
+
456
+ Err(ProcessingError::TimeoutError)
457
+ }
458
+
459
+ /// Generic async function with bounds.
460
+ pub async fn process_items<T, E, F>(items: Vec<T>, processor: F) -> Result<Vec<String>, E>
461
+ where
462
+ T: Send + Sync,
463
+ E: Send,
464
+ F: Fn(T) -> Result<String, E> + Send + Sync,
465
+ {
466
+ let mut results = Vec::new();
467
+
468
+ for item in items {
469
+ match processor(item) {
470
+ Ok(result) => results.push(result),
471
+ Err(e) => return Err(e),
472
+ }
473
+ }
474
+
475
+ Ok(results)
476
+ }
477
+
478
+ #[cfg(test)]
479
+ mod tests {
480
+ use super::*;
481
+ use tokio_test;
482
+
483
+ #[tokio::test]
484
+ async fn test_fetch_data_success() {
485
+ let result = fetch_data("https://example.com").await;
486
+ assert!(result.is_ok());
487
+ }
488
+
489
+ #[tokio::test]
490
+ async fn test_fetch_data_validation_error() {
491
+ let result = fetch_data("").await;
492
+ assert!(result.is_err());
493
+ }
494
+
495
+ #[tokio::test]
496
+ async fn test_fetch_with_retry() {
497
+ let result = fetch_with_retry("https://example.com", 3).await;
498
+ assert!(result.is_ok());
499
+ }
500
+ }
501
+ "#;
502
+
503
+ fs::write(&test_file, content)?;
504
+
505
+ let ctx = TestContext::new();
506
+ let output = ctx.run_probe(&[
507
+ "search",
508
+ "fetch_data", // Search for a function name that exists
509
+ test_file.to_str().unwrap(),
510
+ "--format",
511
+ "outline",
512
+ "--allow-tests",
513
+ ])?;
514
+
515
+ // Verify async functions are found in outline format
516
+ assert!(
517
+ output.contains("fetch_data") || output.contains("async"),
518
+ "Missing async functions - output: {}",
519
+ output
520
+ );
521
+
522
+ // Should be in outline format with file delimiter
523
+ assert!(
524
+ output.contains("---\nFile:"),
525
+ "Missing file delimiter in outline format - output: {}",
526
+ output
527
+ );
528
+
529
+ // Should have found at least one result
530
+ assert!(
531
+ output.contains("Found") && output.contains("search results"),
532
+ "Missing search results summary - output: {}",
533
+ output
534
+ );
535
+
536
+ Ok(())
537
+ }
538
+
539
+ #[test]
540
+ fn test_rust_outline_large_function_closing_braces() -> Result<()> {
541
+ let temp_dir = TempDir::new()?;
542
+ let test_file = temp_dir.path().join("large_function.rs");
543
+
544
+ // Create a large function with multiple control flow blocks and gaps
545
+ let content = r#"/// Large function with multiple nested blocks to test closing brace comments.
546
+ pub fn complex_data_processor(data: Vec<i32>) -> Vec<String> {
547
+ let mut results = Vec::new();
548
+ let mut categories = std::collections::HashMap::new();
549
+
550
+ // Phase 1: Categorization
551
+ for (index, &value) in data.iter().enumerate() {
552
+ let category = match value {
553
+ x if x < 0 => "negative",
554
+ 0 => "zero",
555
+ x if x < 100 => "small_positive",
556
+ x if x < 1000 => "medium_positive",
557
+ _ => "large_positive",
558
+ };
559
+
560
+ categories.entry(category.to_string())
561
+ .or_insert_with(Vec::new)
562
+ .push((index, value));
563
+ }
564
+
565
+ // Phase 2: Processing each category
566
+ for (category, items) in categories {
567
+ if category == "negative" {
568
+ for (index, value) in items {
569
+ results.push(format!("NEG[{}]: {}", index, value.abs()));
570
+ }
571
+ } else if category == "zero" {
572
+ for (index, _) in items {
573
+ results.push(format!("ZERO[{}]: neutral", index));
574
+ }
575
+ } else {
576
+ // Positive number processing
577
+ for (index, value) in items {
578
+ let processed = if value < 10 {
579
+ format!("SINGLE_DIGIT[{}]: {}", index, value)
580
+ } else if value < 100 {
581
+ format!("DOUBLE_DIGIT[{}]: {}", index, value)
582
+ } else {
583
+ format!("MULTI_DIGIT[{}]: {}", index, value)
584
+ };
585
+ results.push(processed);
586
+ }
587
+ }
588
+ }
589
+
590
+ // Phase 3: Final sorting and validation
591
+ results.sort();
592
+
593
+ // Validation phase
594
+ let mut validated_results = Vec::new();
595
+ for result in results {
596
+ if result.len() > 5 {
597
+ validated_results.push(result);
598
+ }
599
+ }
600
+
601
+ validated_results
602
+ }
603
+ "#;
604
+
605
+ fs::write(&test_file, content)?;
606
+
607
+ let ctx = TestContext::new();
608
+ let output = ctx.run_probe(&[
609
+ "search",
610
+ "complex_data_processor", // Search for the large function name
611
+ test_file.to_str().unwrap(),
612
+ "--format",
613
+ "outline",
614
+ ])?;
615
+
616
+ // Verify large function is shown with closing braces for major blocks
617
+ assert!(
618
+ output.contains("complex_data_processor"),
619
+ "Missing complex_data_processor function - output: {}",
620
+ output
621
+ );
622
+
623
+ // Should have a closing brace with comment for the large function
624
+ let has_closing_brace_comment = output.contains("} //") || output.contains("} /*");
625
+ assert!(
626
+ has_closing_brace_comment,
627
+ "Should have closing brace comment for large function - output: {}",
628
+ output
629
+ );
630
+
631
+ // Should be in outline format with file delimiter
632
+ assert!(
633
+ output.contains("---\nFile:"),
634
+ "Missing file delimiter in outline format - output: {}",
635
+ output
636
+ );
637
+
638
+ Ok(())
639
+ }
640
+
641
+ #[test]
642
+ fn test_rust_outline_keyword_highlighting() -> Result<()> {
643
+ let temp_dir = TempDir::new()?;
644
+ let test_file = temp_dir.path().join("keywords.rs");
645
+
646
+ let content = r#"/// Function containing various Rust keywords for highlighting test.
647
+ pub fn keyword_demonstration() {
648
+ // Keywords in variables and control structures
649
+ let mut counter = 0;
650
+ let const_value = 42;
651
+
652
+ while counter < 10 {
653
+ if counter % 2 == 0 {
654
+ println!("Even number: {}", counter);
655
+ } else {
656
+ println!("Odd number: {}", counter);
657
+ }
658
+
659
+ match counter {
660
+ 0 => println!("Starting"),
661
+ 5 => println!("Halfway"),
662
+ 9 => println!("Almost done"),
663
+ _ => println!("Continuing..."),
664
+ }
665
+
666
+ counter += 1;
667
+ }
668
+
669
+ // Loop and break/continue keywords
670
+ loop {
671
+ if counter > 20 {
672
+ break;
673
+ }
674
+
675
+ if counter % 3 == 0 {
676
+ counter += 1;
677
+ continue;
678
+ }
679
+
680
+ counter += 1;
681
+ }
682
+
683
+ // Return keyword
684
+ return;
685
+ }
686
+ "#;
687
+
688
+ fs::write(&test_file, content)?;
689
+
690
+ let ctx = TestContext::new();
691
+ let output = ctx.run_probe(&[
692
+ "search",
693
+ "counter",
694
+ test_file.to_str().unwrap(),
695
+ "--format",
696
+ "outline",
697
+ ])?;
698
+
699
+ // Should find the keyword in the function
700
+ assert!(
701
+ output.contains("keyword_demonstration") || output.contains("counter"),
702
+ "Should find keyword 'counter' - output: {}",
703
+ output
704
+ );
705
+
706
+ // Should have reasonable length (truncated for outline)
707
+ let line_count = output.lines().count();
708
+ assert!(
709
+ line_count < 100,
710
+ "Output should be reasonably sized, got {} lines",
711
+ line_count
712
+ );
713
+
714
+ Ok(())
715
+ }
716
+
717
+ #[test]
718
+ fn test_rust_outline_test_detection() -> Result<()> {
719
+ let temp_dir = TempDir::new()?;
720
+ let test_file = temp_dir.path().join("test_detection.rs");
721
+
722
+ let content = r#"use std::collections::HashMap;
723
+
724
+ pub fn add_numbers(a: i32, b: i32) -> i32 {
725
+ a + b
726
+ }
727
+
728
+ pub fn multiply_numbers(a: i32, b: i32) -> i32 {
729
+ a * b
730
+ }
731
+
732
+ // Unit tests
733
+ #[cfg(test)]
734
+ mod tests {
735
+ use super::*;
736
+
737
+ #[test]
738
+ fn test_add_positive_numbers() {
739
+ assert_eq!(add_numbers(2, 3), 5);
740
+ }
741
+
742
+ #[test]
743
+ fn test_add_negative_numbers() {
744
+ assert_eq!(add_numbers(-2, -3), -5);
745
+ }
746
+
747
+ #[test]
748
+ fn test_multiply_positive_numbers() {
749
+ assert_eq!(multiply_numbers(4, 5), 20);
750
+ }
751
+
752
+ #[test]
753
+ fn test_multiply_with_zero() {
754
+ assert_eq!(multiply_numbers(0, 5), 0);
755
+ }
756
+
757
+ #[should_panic]
758
+ #[test]
759
+ fn test_panic_scenario() {
760
+ panic!("This test is expected to panic");
761
+ }
762
+
763
+ #[ignore]
764
+ #[test]
765
+ fn test_ignored() {
766
+ // This test is ignored
767
+ assert!(true);
768
+ }
769
+ }
770
+
771
+ // Integration test module
772
+ #[cfg(test)]
773
+ mod integration_tests {
774
+ use super::*;
775
+
776
+ #[test]
777
+ fn test_integration_scenario() {
778
+ let sum = add_numbers(10, 20);
779
+ let product = multiply_numbers(sum, 2);
780
+ assert_eq!(product, 60);
781
+ }
782
+ }
783
+
784
+ // Benchmark tests (using criterion would be more typical)
785
+ #[cfg(test)]
786
+ mod benches {
787
+ use super::*;
788
+ use std::hint::black_box;
789
+
790
+ #[test]
791
+ fn bench_add_numbers() {
792
+ for i in 0..1000 {
793
+ black_box(add_numbers(i, i + 1));
794
+ }
795
+ }
796
+ }
797
+ "#;
798
+
799
+ fs::write(&test_file, content)?;
800
+
801
+ let ctx = TestContext::new();
802
+ let output = ctx.run_probe(&[
803
+ "search",
804
+ "test", // Search for test keyword
805
+ test_file.to_str().unwrap(),
806
+ "--format",
807
+ "outline",
808
+ "--allow-tests",
809
+ ])?;
810
+
811
+ // Verify test-related content is found in outline format
812
+ assert!(
813
+ output.contains("test") && output.contains("#[test]"),
814
+ "Missing test annotations - output: {}",
815
+ output
816
+ );
817
+
818
+ // Should be in outline format with file delimiter
819
+ assert!(
820
+ output.contains("---\nFile:"),
821
+ "Missing file delimiter in outline format - output: {}",
822
+ output
823
+ );
824
+
825
+ // Should have found at least one result
826
+ assert!(
827
+ output.contains("Found") && output.contains("search results"),
828
+ "Missing search results summary - output: {}",
829
+ output
830
+ );
831
+
832
+ // Should include test functions or modules
833
+ let has_test_content = output.contains("mod tests")
834
+ || output.contains("fn test_")
835
+ || output.contains("add_numbers");
836
+ assert!(
837
+ has_test_content,
838
+ "Missing test content - output: {}",
839
+ output
840
+ );
841
+
842
+ Ok(())
843
+ }