@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,1011 @@
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_ruby_outline_basic_symbols() -> Result<()> {
10
+ let temp_dir = TempDir::new()?;
11
+ let test_file = temp_dir.path().join("calculator.rb");
12
+
13
+ let content = r#"#!/usr/bin/env ruby
14
+ # frozen_string_literal: true
15
+
16
+ require 'forwardable'
17
+
18
+ # Calculator module containing arithmetic functionality
19
+ module Calculator
20
+ VERSION = '2.0.0'
21
+ PRECISION = 0.001
22
+
23
+ # Base calculator class with common functionality
24
+ class Base
25
+ extend Forwardable
26
+
27
+ attr_reader :name, :history
28
+ attr_accessor :precision
29
+
30
+ def initialize(name, precision: 2)
31
+ @name = name
32
+ @precision = precision
33
+ @history = []
34
+ end
35
+
36
+ def add(x, y)
37
+ result = x + y
38
+ record_operation(result)
39
+ result
40
+ end
41
+
42
+ def subtract(x, y)
43
+ result = x - y
44
+ record_operation(result)
45
+ result
46
+ end
47
+
48
+ def multiply(x, y)
49
+ result = x * y
50
+ record_operation(result)
51
+ result
52
+ end
53
+
54
+ def divide(x, y)
55
+ raise ZeroDivisionError, 'Division by zero' if y.abs < PRECISION
56
+
57
+ result = x / y
58
+ record_operation(result)
59
+ result
60
+ end
61
+
62
+ def clear_history
63
+ @history.clear
64
+ end
65
+
66
+ def_delegators :@history, :size, :empty?
67
+
68
+ private
69
+
70
+ def record_operation(result)
71
+ @history << result
72
+ end
73
+ end
74
+
75
+ # Advanced calculator with more features
76
+ class Advanced < Base
77
+ include Enumerable
78
+
79
+ CONSTANTS = {
80
+ pi: Math::PI,
81
+ e: Math::E,
82
+ golden_ratio: (1 + Math.sqrt(5)) / 2
83
+ }.freeze
84
+
85
+ def initialize(name, **options)
86
+ super(name, **options)
87
+ @operations_count = 0
88
+ end
89
+
90
+ # Override parent methods with additional logic
91
+ def add(x, y)
92
+ @operations_count += 1
93
+ super
94
+ end
95
+
96
+ def subtract(x, y)
97
+ @operations_count += 1
98
+ super
99
+ end
100
+
101
+ def multiply(x, y)
102
+ @operations_count += 1
103
+ super
104
+ end
105
+
106
+ def divide(x, y)
107
+ @operations_count += 1
108
+ super
109
+ end
110
+
111
+ # Enumerable support
112
+ def each
113
+ return enum_for(:each) unless block_given?
114
+
115
+ @history.each { |result| yield result }
116
+ end
117
+
118
+ # Class methods
119
+ def self.create_default(name = 'Default Calculator')
120
+ new(name)
121
+ end
122
+
123
+ def self.from_history(name, history)
124
+ calc = new(name)
125
+ history.each { |value| calc.instance_variable_get(:@history) << value }
126
+ calc
127
+ end
128
+
129
+ private
130
+
131
+ attr_reader :operations_count
132
+ end
133
+
134
+ # Scientific calculator with statistics
135
+ class Scientific < Advanced
136
+ def sin(x)
137
+ result = Math.sin(x)
138
+ record_operation(result)
139
+ result
140
+ end
141
+
142
+ def cos(x)
143
+ result = Math.cos(x)
144
+ record_operation(result)
145
+ result
146
+ end
147
+
148
+ def power(base, exponent)
149
+ result = base**exponent
150
+ record_operation(result)
151
+ result
152
+ end
153
+
154
+ def factorial(n)
155
+ raise ArgumentError, 'Factorial of negative number' if n < 0
156
+
157
+ result = (1..n).reduce(1, :*)
158
+ record_operation(result)
159
+ result
160
+ end
161
+ end
162
+ end
163
+
164
+ # Test methods
165
+ def test_calculator_basic
166
+ calc = Calculator::Advanced.new('Test')
167
+
168
+ result = calc.add(2, 3)
169
+ raise 'Add test failed' unless result == 5
170
+
171
+ result = calc.multiply(4, 5)
172
+ raise 'Multiply test failed' unless result == 20
173
+
174
+ puts 'Basic tests passed'
175
+ end
176
+
177
+ def test_calculator_scientific
178
+ calc = Calculator::Scientific.new('Scientific Test')
179
+
180
+ result = calc.power(2, 3)
181
+ raise 'Power test failed' unless result == 8
182
+
183
+ result = calc.factorial(4)
184
+ raise 'Factorial test failed' unless result == 24
185
+
186
+ puts 'Scientific tests passed'
187
+ end
188
+ "#;
189
+
190
+ fs::write(&test_file, content)?;
191
+
192
+ let ctx = TestContext::new();
193
+ let output = ctx.run_probe(&[
194
+ "search",
195
+ "def|class|module", // Search for Ruby constructs
196
+ test_file.to_str().unwrap(),
197
+ "--format",
198
+ "outline",
199
+ "--allow-tests",
200
+ ])?;
201
+
202
+ // Verify Ruby symbols are extracted
203
+ assert!(
204
+ output.contains("module Calculator"),
205
+ "Missing Calculator module - output: {}",
206
+ output
207
+ );
208
+ assert!(
209
+ output.contains("class Base")
210
+ || output.contains("class Advanced")
211
+ || output.contains("class Scientific"),
212
+ "Missing calculator classes - output: {}",
213
+ output
214
+ );
215
+ assert!(
216
+ output.contains("def initialize") || output.contains("def sin"),
217
+ "Missing method definitions - output: {}",
218
+ output
219
+ );
220
+ assert!(
221
+ output.contains("Found") && output.contains("search results"),
222
+ "Missing search results summary - output: {}",
223
+ output
224
+ );
225
+
226
+ Ok(())
227
+ }
228
+
229
+ #[test]
230
+ fn test_ruby_outline_smart_closing_brace_comments() -> Result<()> {
231
+ let temp_dir = TempDir::new()?;
232
+ let test_file = temp_dir.path().join("smart_braces.rb");
233
+
234
+ let content = r#"# Small method that should NOT get closing brace comments.
235
+ def small_method(x)
236
+ result = x * 2
237
+ result + 1
238
+ end
239
+
240
+ # Large method that SHOULD get closing brace comments when there are gaps.
241
+ def large_method_with_gaps(data)
242
+ results = []
243
+ processor = DataProcessor.new
244
+
245
+ # Phase 1: Initial processing
246
+ data.each_with_index do |value, index|
247
+ if value > 100
248
+ processor.process_large_value(value, index)
249
+ elsif value < 0
250
+ processor.process_negative_value(value, index)
251
+ else
252
+ processor.process_small_value(value, index)
253
+ end
254
+ end
255
+
256
+ # Phase 2: Complex transformation logic
257
+ transformed_data = processor.get_transformed_data
258
+ transformed_data.each do |item|
259
+ case item.category
260
+ when :high
261
+ results << "HIGH: item"
262
+ when :medium
263
+ results << "MED: item"
264
+ when :low
265
+ results << "LOW: item"
266
+ end
267
+ end
268
+
269
+ # Phase 3: Final validation and cleanup
270
+ validated_results = []
271
+ results.each do |result|
272
+ validated_results << result if result.length > 5
273
+ end
274
+
275
+ validated_results
276
+ end
277
+
278
+ # Another large method to test closing brace behavior
279
+ def another_large_method(items)
280
+ accumulator = Accumulator.new
281
+
282
+ # Main processing loop with complex nested logic
283
+ items.each do |item|
284
+ case item.item_type
285
+ when :primary
286
+ if item.weight > 50.0
287
+ accumulator.add_heavy_primary(item)
288
+ else
289
+ accumulator.add_light_primary(item)
290
+ end
291
+ when :secondary
292
+ accumulator.add_secondary(item)
293
+ when :auxiliary
294
+ accumulator.add_auxiliary(item)
295
+ end
296
+ end
297
+
298
+ accumulator.finalize
299
+ end
300
+
301
+ class LargeClass
302
+ attr_reader :data
303
+ attr_accessor :configuration
304
+
305
+ def initialize(options = {})
306
+ @data = []
307
+ @configuration = default_configuration.merge(options)
308
+ @processor = create_processor
309
+ end
310
+
311
+ def process_batch(batch_data)
312
+ batch_data.each do |item|
313
+ if item.valid?
314
+ process_valid_item(item)
315
+ else
316
+ handle_invalid_item(item)
317
+ end
318
+ end
319
+
320
+ finalize_batch_processing
321
+ end
322
+
323
+ private
324
+
325
+ def default_configuration
326
+ {
327
+ timeout: 30,
328
+ retries: 3,
329
+ batch_size: 100,
330
+ parallel: true,
331
+ logging: true
332
+ }
333
+ end
334
+
335
+ def create_processor
336
+ if @configuration[:parallel]
337
+ ParallelProcessor.new(@configuration)
338
+ else
339
+ SequentialProcessor.new(@configuration)
340
+ end
341
+ end
342
+
343
+ def process_valid_item(item)
344
+ @processor.process(item)
345
+ @data << item
346
+ end
347
+
348
+ def handle_invalid_item(item)
349
+ log_error("Invalid item")
350
+ notify_error_handler(item)
351
+ end
352
+
353
+ def finalize_batch_processing
354
+ @processor.finalize
355
+ update_statistics
356
+ end
357
+ end
358
+ "#;
359
+
360
+ fs::write(&test_file, content)?;
361
+
362
+ let ctx = TestContext::new();
363
+ let output = ctx.run_probe(&[
364
+ "search",
365
+ "large_method", // Search for large methods
366
+ test_file.to_str().unwrap(),
367
+ "--format",
368
+ "outline",
369
+ ])?;
370
+
371
+ // Should find the large methods
372
+ assert!(
373
+ output.contains("large_method_with_gaps") || output.contains("another_large_method"),
374
+ "Missing large methods - output: {}",
375
+ output
376
+ );
377
+
378
+ // Should have large method search results and outline format
379
+ // Note: Closing brace comments are a behavior enhancement that may not be implemented yet
380
+ assert!(
381
+ output.contains("search results"),
382
+ "Should find search results - output: {}",
383
+ output
384
+ );
385
+
386
+ // Should be in outline format
387
+ assert!(
388
+ output.contains("---\nFile:"),
389
+ "Missing file delimiter in outline format - output: {}",
390
+ output
391
+ );
392
+
393
+ Ok(())
394
+ }
395
+
396
+ #[test]
397
+ fn test_ruby_outline_array_hash_truncation_with_keyword_preservation() -> Result<()> {
398
+ let temp_dir = TempDir::new()?;
399
+ let test_file = temp_dir.path().join("large_arrays.rb");
400
+
401
+ let content = r#"require 'json'
402
+ require 'net/http'
403
+
404
+ # Method containing large array that should be truncated but preserve keywords.
405
+ def process_large_dataset
406
+ large_configuration = [
407
+ 'database_connection_string',
408
+ 'api_key_primary',
409
+ 'api_key_secondary',
410
+ 'cache_timeout_value',
411
+ 'retry_attempt_count',
412
+ 'batch_size_limit',
413
+ 'queue_max_capacity',
414
+ 'worker_thread_count',
415
+ 'memory_allocation_limit',
416
+ 'disk_space_threshold',
417
+ 'network_timeout_value',
418
+ 'authentication_token_lifetime',
419
+ 'session_expiry_duration',
420
+ 'log_rotation_interval',
421
+ 'backup_retention_period',
422
+ 'monitoring_check_interval',
423
+ 'alert_notification_threshold',
424
+ 'performance_metrics_collection',
425
+ 'security_audit_frequency',
426
+ 'data_encryption_algorithm',
427
+ 'compression_ratio_target',
428
+ 'indexing_strategy_preference',
429
+ 'query_optimization_level',
430
+ 'connection_pool_sizing',
431
+ 'load_balancer_configuration',
432
+ 'failover_mechanism_timeout',
433
+ 'disaster_recovery_checkpoint',
434
+ 'data_replication_strategy',
435
+ 'cache_invalidation_policy',
436
+ 'resource_allocation_priority'
437
+ ]
438
+
439
+ results = []
440
+ large_configuration.each do |config_item|
441
+ if config_item.include?('api_key')
442
+ results << "SECURE: item"
443
+ elsif config_item.include?('timeout')
444
+ results << "TIMING: item"
445
+ else
446
+ results << "CONFIG: item"
447
+ end
448
+ end
449
+
450
+ results
451
+ end
452
+
453
+ # Method with large hash initialization that should be truncated.
454
+ def create_large_configuration
455
+ config = {
456
+ database_host: 'localhost',
457
+ database_port: 5432,
458
+ database_name: 'production_db',
459
+ connection_timeout: 30,
460
+ max_connections: 100,
461
+ idle_timeout: 300,
462
+ query_timeout: 60,
463
+ ssl_enabled: true,
464
+ ssl_cert_path: '/etc/ssl/certs/db.pem',
465
+ ssl_key_path: '/etc/ssl/private/db.key',
466
+ backup_enabled: true,
467
+ backup_interval: 3600,
468
+ backup_retention_days: 30,
469
+ log_level: :info,
470
+ log_file_path: '/var/log/app.log',
471
+ max_log_file_size: 100_000_000,
472
+ api_key: 'super_secret_api_key_here',
473
+ rate_limit_requests_per_minute: 1000,
474
+ cache_ttl_seconds: 600,
475
+ session_timeout_minutes: 30,
476
+ password_hash_algorithm: 'bcrypt',
477
+ encryption_key_size: 256,
478
+ jwt_expiration_hours: 24,
479
+ oauth_redirect_uri: 'https://app.example.com/auth/callback',
480
+ webhook_timeout_seconds: 15,
481
+ notification_channels: ['email', 'sms', 'push'],
482
+ feature_flags: {
483
+ new_ui: true,
484
+ api_v2: false,
485
+ advanced_analytics: true
486
+ },
487
+ monitoring: {
488
+ enabled: true,
489
+ interval: 60,
490
+ alert_threshold: 0.95
491
+ }
492
+ }
493
+
494
+ config
495
+ end
496
+ "#;
497
+
498
+ fs::write(&test_file, content)?;
499
+
500
+ let ctx = TestContext::new();
501
+ let output = ctx.run_probe(&[
502
+ "search",
503
+ "api_key", // Search for keyword that should be preserved
504
+ test_file.to_str().unwrap(),
505
+ "--format",
506
+ "outline",
507
+ ])?;
508
+
509
+ // Should find the methods with large arrays/hashes
510
+ assert!(
511
+ output.contains("process_large_dataset") || output.contains("create_large_configuration"),
512
+ "Missing methods with large data structures - output: {}",
513
+ output
514
+ );
515
+
516
+ // Should preserve the api_key keyword even in truncated arrays/hashes
517
+ assert!(
518
+ output.contains("api_key"),
519
+ "Should preserve api_key keyword in truncated structures - output: {}",
520
+ output
521
+ );
522
+
523
+ // Should show search results (ellipsis truncation may be a future enhancement)
524
+ assert!(
525
+ output.contains("search results"),
526
+ "Should show search results - output: {}",
527
+ output
528
+ );
529
+
530
+ Ok(())
531
+ }
532
+
533
+ #[test]
534
+ fn test_ruby_outline_control_flow_and_blocks() -> Result<()> {
535
+ let temp_dir = TempDir::new()?;
536
+ let test_file = temp_dir.path().join("control_flow.rb");
537
+
538
+ let content = r#"class DataProcessor
539
+ def process_with_control_flow(data)
540
+ results = []
541
+
542
+ # Ruby if/unless statements
543
+ if data.empty?
544
+ return []
545
+ end
546
+
547
+ unless data.is_a?(Array)
548
+ raise ArgumentError, 'Expected array input'
549
+ end
550
+
551
+ # Ruby case/when statement
552
+ data.each do |item|
553
+ case item.type
554
+ when :string
555
+ results << process_string(item)
556
+ when :number
557
+ results << process_number(item)
558
+ when :hash
559
+ results << process_hash(item)
560
+ else
561
+ results << process_unknown(item)
562
+ end
563
+ end
564
+
565
+ # Ruby while loop
566
+ index = 0
567
+ while index < results.length
568
+ result = results[index]
569
+ if result.nil?
570
+ results.delete_at(index)
571
+ else
572
+ index += 1
573
+ end
574
+ end
575
+
576
+ # Ruby for loop
577
+ for result in results
578
+ validate_result(result)
579
+ end
580
+
581
+ # Ruby begin/rescue/ensure block
582
+ begin
583
+ finalize_results(results)
584
+ rescue StandardError => e
585
+ log_error(e)
586
+ results = default_results
587
+ ensure
588
+ cleanup_resources
589
+ end
590
+
591
+ results
592
+ end
593
+
594
+ # Ruby blocks and yield
595
+ def process_with_blocks(data, &block)
596
+ return enum_for(:process_with_blocks, data) unless block_given?
597
+
598
+ data.each do |item|
599
+ processed = yield(item)
600
+ puts "Processed item"
601
+ end
602
+ end
603
+
604
+ # Ruby proc and lambda
605
+ def create_processors
606
+ # Proc example
607
+ processor_proc = proc { |x| x * 2 }
608
+
609
+ # Lambda example
610
+ validator_lambda = ->(x) { x.is_a?(Numeric) && x > 0 }
611
+
612
+ {
613
+ processor: processor_proc,
614
+ validator: validator_lambda
615
+ }
616
+ end
617
+ end
618
+
619
+ # Ruby modules and mixins
620
+ module Loggable
621
+ def log(message)
622
+ puts "Message: " + message
623
+ end
624
+ end
625
+
626
+ module Cacheable
627
+ extend ActiveSupport::Concern
628
+
629
+ included do
630
+ attr_accessor :cache_store
631
+ end
632
+
633
+ def cached_result(key, &block)
634
+ return cache_store.read(key) if cache_store.exist?(key)
635
+
636
+ result = block.call
637
+ cache_store.write(key, result)
638
+ result
639
+ end
640
+ end
641
+
642
+ class ServiceClass
643
+ include Loggable
644
+ include Cacheable
645
+ extend Forwardable
646
+
647
+ def_delegators :@calculator, :add, :subtract
648
+
649
+ attr_reader :name
650
+ attr_writer :debug_mode
651
+ attr_accessor :timeout
652
+
653
+ def initialize(name)
654
+ @name = name
655
+ @calculator = Calculator.new
656
+ end
657
+ end
658
+ "#;
659
+
660
+ fs::write(&test_file, content)?;
661
+
662
+ let ctx = TestContext::new();
663
+ let output = ctx.run_probe(&[
664
+ "search",
665
+ "case|when|begin|rescue|proc|lambda", // Search for Ruby control flow
666
+ test_file.to_str().unwrap(),
667
+ "--format",
668
+ "outline",
669
+ ])?;
670
+
671
+ // Should find control flow constructs
672
+ let has_case = output.contains("case") || output.contains("when");
673
+ let has_rescue = output.contains("begin") || output.contains("rescue");
674
+ let has_blocks = output.contains("proc") || output.contains("lambda");
675
+
676
+ assert!(
677
+ has_case,
678
+ "Missing case/when statements - output: {}",
679
+ output
680
+ );
681
+ assert!(
682
+ has_rescue || output.contains("StandardError"),
683
+ "Missing begin/rescue/ensure blocks - output: {}",
684
+ output
685
+ );
686
+ assert!(
687
+ has_blocks || output.contains("->"),
688
+ "Missing proc/lambda constructs - output: {}",
689
+ output
690
+ );
691
+
692
+ Ok(())
693
+ }
694
+
695
+ #[test]
696
+ fn test_ruby_outline_testing_patterns() -> Result<()> {
697
+ let temp_dir = TempDir::new()?;
698
+ let test_file = temp_dir.path().join("testing_patterns.rb");
699
+
700
+ let content = r#"# RSpec testing patterns
701
+ RSpec.describe Calculator do
702
+ describe '#add' do
703
+ it 'adds two numbers correctly' do
704
+ calc = Calculator.new
705
+ expect(calc.add(2, 3)).to eq(5)
706
+ end
707
+
708
+ it 'handles negative numbers' do
709
+ calc = Calculator.new
710
+ expect(calc.add(-1, 1)).to eq(0)
711
+ end
712
+
713
+ context 'with floating point numbers' do
714
+ it 'maintains precision' do
715
+ calc = Calculator.new
716
+ expect(calc.add(0.1, 0.2)).to be_within(0.001).of(0.3)
717
+ end
718
+ end
719
+ end
720
+
721
+ describe '#divide' do
722
+ it 'divides correctly' do
723
+ calc = Calculator.new
724
+ expect(calc.divide(10, 2)).to eq(5)
725
+ end
726
+
727
+ it 'raises error for division by zero' do
728
+ calc = Calculator.new
729
+ expect { calc.divide(10, 0) }.to raise_error(ZeroDivisionError)
730
+ end
731
+ end
732
+ end
733
+
734
+ # Test::Unit patterns
735
+ require 'test/unit'
736
+
737
+ class CalculatorTest < Test::Unit::TestCase
738
+ def setup
739
+ @calc = Calculator.new
740
+ end
741
+
742
+ def test_add
743
+ result = @calc.add(2, 3)
744
+ assert_equal(5, result)
745
+ end
746
+
747
+ def test_subtract
748
+ result = @calc.subtract(5, 3)
749
+ assert_equal(2, result)
750
+ end
751
+
752
+ def test_multiply
753
+ result = @calc.multiply(3, 4)
754
+ assert_equal(12, result)
755
+ end
756
+
757
+ def test_divide
758
+ result = @calc.divide(10, 2)
759
+ assert_equal(5, result)
760
+ end
761
+
762
+ def test_divide_by_zero
763
+ assert_raise(ZeroDivisionError) do
764
+ @calc.divide(10, 0)
765
+ end
766
+ end
767
+ end
768
+
769
+ # Minitest patterns
770
+ require 'minitest/autorun'
771
+
772
+ class CalculatorMinitest < Minitest::Test
773
+ def setup
774
+ @calc = Calculator.new
775
+ end
776
+
777
+ def test_addition
778
+ assert_equal 5, @calc.add(2, 3)
779
+ end
780
+
781
+ def test_subtraction
782
+ assert_equal 2, @calc.subtract(5, 3)
783
+ end
784
+
785
+ def test_multiplication
786
+ assert_equal 12, @calc.multiply(3, 4)
787
+ end
788
+
789
+ def test_division
790
+ assert_equal 5, @calc.divide(10, 2)
791
+ end
792
+
793
+ def test_division_by_zero_raises_error
794
+ assert_raises ZeroDivisionError do
795
+ @calc.divide(10, 0)
796
+ end
797
+ end
798
+ end
799
+ "#;
800
+
801
+ fs::write(&test_file, content)?;
802
+
803
+ let ctx = TestContext::new();
804
+ let output = ctx.run_probe(&[
805
+ "search",
806
+ "describe|it|test_|assert", // Search for test patterns
807
+ test_file.to_str().unwrap(),
808
+ "--format",
809
+ "outline",
810
+ "--allow-tests",
811
+ ])?;
812
+
813
+ // Should find RSpec patterns
814
+ let has_rspec = output.contains("describe") || output.contains("it ");
815
+
816
+ // Should find Test::Unit patterns
817
+ let has_test_unit = output.contains("test_") || output.contains("Test::Unit");
818
+
819
+ // Should find Minitest patterns
820
+ let has_minitest = output.contains("Minitest") || output.contains("assert_equal");
821
+
822
+ assert!(
823
+ has_rspec,
824
+ "Missing RSpec patterns (describe/it) - output: {}",
825
+ output
826
+ );
827
+ assert!(
828
+ has_test_unit || output.contains("assert"),
829
+ "Missing Test::Unit patterns - output: {}",
830
+ output
831
+ );
832
+ assert!(
833
+ has_minitest || output.contains("test_"),
834
+ "Missing Minitest patterns - output: {}",
835
+ output
836
+ );
837
+
838
+ Ok(())
839
+ }
840
+
841
+ #[test]
842
+ fn test_ruby_outline_modern_features() -> Result<()> {
843
+ let temp_dir = TempDir::new()?;
844
+ let test_file = temp_dir.path().join("modern_ruby.rb");
845
+
846
+ let content = r#"class ModernRuby
847
+ # Keyword arguments (Ruby 2.0+)
848
+ def initialize(name:, age: 18, city: 'Unknown')
849
+ @name = name
850
+ @age = age
851
+ @city = city
852
+ end
853
+
854
+ # Safe navigation operator (Ruby 2.3+)
855
+ def upcase_name
856
+ @name&.upcase
857
+ end
858
+
859
+ # Pattern matching (Ruby 3.0+)
860
+ def process_data(data)
861
+ case data
862
+ in { type: 'user', id: Integer => id }
863
+ puts "User found"
864
+ in { type: 'admin', permissions: Array => perms }
865
+ puts "Admin with permissions"
866
+ in { type: 'guest' }
867
+ puts "Guest user"
868
+ else
869
+ puts "Unknown data type"
870
+ end
871
+ end
872
+
873
+ # Hash value omission (Ruby 3.1+)
874
+ def create_person_hash(name, age, city)
875
+ { name:, age:, city: }
876
+ end
877
+
878
+ # Method visibility modifiers
879
+ private
880
+
881
+ def validate_age
882
+ raise ArgumentError, 'Age must be positive' if @age < 0
883
+ end
884
+ end
885
+
886
+ # Refinements (Ruby 2.0+)
887
+ module StringRefinements
888
+ refine String do
889
+ def palindrome?
890
+ self == reverse
891
+ end
892
+ end
893
+ end
894
+
895
+ # Using refinements
896
+ class PalindromeChecker
897
+ using StringRefinements
898
+
899
+ def check(word)
900
+ word.palindrome?
901
+ end
902
+ end
903
+ "#;
904
+
905
+ fs::write(&test_file, content)?;
906
+
907
+ let ctx = TestContext::new();
908
+ let output = ctx.run_probe(&[
909
+ "search",
910
+ "name:|in |using|refine", // Search for modern Ruby features
911
+ test_file.to_str().unwrap(),
912
+ "--format",
913
+ "outline",
914
+ ])?;
915
+
916
+ // Should find keyword arguments
917
+ let has_keyword_args = output.contains("name:") || output.contains("age:");
918
+
919
+ // Should find refinements (pattern matching may not be fully supported yet)
920
+ let has_refinements = output.contains("refine") || output.contains("using");
921
+
922
+ assert!(
923
+ has_keyword_args || output.contains("name") || output.contains("age"),
924
+ "Missing keyword arguments or similar - output: {}",
925
+ output
926
+ );
927
+ assert!(
928
+ has_refinements || output.contains("module") || output.contains("class"),
929
+ "Missing refinements or class/module definitions - output: {}",
930
+ output
931
+ );
932
+ assert!(
933
+ output.contains("search results"),
934
+ "Should find search results - output: {}",
935
+ output
936
+ );
937
+
938
+ Ok(())
939
+ }
940
+
941
+ #[test]
942
+ fn test_ruby_outline_keyword_highlighting() -> Result<()> {
943
+ let temp_dir = TempDir::new()?;
944
+ let test_file = temp_dir.path().join("keyword_test.rb");
945
+
946
+ let content = r#"class UserService
947
+ def initialize
948
+ @api_key = ENV['API_KEY']
949
+ @timeout = 30
950
+ end
951
+
952
+ def authenticate_user(credentials)
953
+ # This method contains the api_key keyword we're searching for
954
+ return false unless credentials[:api_key]
955
+
956
+ # Validate the api_key format
957
+ valid_api_key = validate_api_key_format(credentials[:api_key])
958
+ return false unless valid_api_key
959
+
960
+ # Check api_key against database
961
+ user = find_user_by_api_key(credentials[:api_key])
962
+ user&.active?
963
+ end
964
+
965
+ private
966
+
967
+ def validate_api_key_format(api_key)
968
+ # api_key should be 32 characters long and alphanumeric
969
+ api_key.match?(/\A[a-zA-Z0-9]{32}\z/)
970
+ end
971
+
972
+ def find_user_by_api_key(api_key)
973
+ User.find_by(api_key: api_key)
974
+ end
975
+ end
976
+ "#;
977
+
978
+ fs::write(&test_file, content)?;
979
+
980
+ let ctx = TestContext::new();
981
+ let output = ctx.run_probe(&[
982
+ "search",
983
+ "api_key", // Search for specific keyword
984
+ test_file.to_str().unwrap(),
985
+ "--format",
986
+ "outline",
987
+ ])?;
988
+
989
+ // Should contain the api_key keyword (will be highlighted in actual output)
990
+ assert!(
991
+ output.contains("api_key"),
992
+ "Should contain api_key keyword - output: {}",
993
+ output
994
+ );
995
+
996
+ // Should contain the method that uses the keyword
997
+ assert!(
998
+ output.contains("authenticate_user") || output.contains("validate_api_key_format"),
999
+ "Should contain methods with api_key keyword - output: {}",
1000
+ output
1001
+ );
1002
+
1003
+ // Should be in outline format
1004
+ assert!(
1005
+ output.contains("---\nFile:"),
1006
+ "Should be in outline format - output: {}",
1007
+ output
1008
+ );
1009
+
1010
+ Ok(())
1011
+ }