@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,768 @@
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_php_outline_basic_symbols() -> Result<()> {
10
+ let temp_dir = TempDir::new()?;
11
+ let test_file = temp_dir.path().join("Calculator.php");
12
+
13
+ let content = r#"<?php
14
+
15
+ namespace Calculator;
16
+
17
+ use Exception;
18
+ use InvalidArgumentException;
19
+
20
+ /**
21
+ * Calculator interface defining basic arithmetic operations
22
+ */
23
+ interface CalculatorInterface
24
+ {
25
+ public function add(float $x, float $y): float;
26
+ public function subtract(float $x, float $y): float;
27
+ public function multiply(float $x, float $y): float;
28
+ public function divide(float $x, float $y): float;
29
+ public function getHistory(): array;
30
+ }
31
+
32
+ /**
33
+ * Abstract base calculator with common functionality
34
+ */
35
+ abstract class BaseCalculator implements CalculatorInterface
36
+ {
37
+ protected string $name;
38
+ protected array $history = [];
39
+ protected int $precision;
40
+
41
+ public function __construct(string $name, int $precision = 2)
42
+ {
43
+ $this->name = $name;
44
+ $this->precision = $precision;
45
+ }
46
+
47
+ protected function recordOperation(float $result): void
48
+ {
49
+ $this->history[] = round($result, $this->precision);
50
+ }
51
+
52
+ public function getHistory(): array
53
+ {
54
+ return $this->history;
55
+ }
56
+
57
+ public function getName(): string
58
+ {
59
+ return $this->name;
60
+ }
61
+
62
+ public function clearHistory(): void
63
+ {
64
+ $this->history = [];
65
+ }
66
+
67
+ abstract public function getOperationsCount(): int;
68
+ }
69
+
70
+ /**
71
+ * Advanced calculator implementation with modern PHP features
72
+ */
73
+ class AdvancedCalculator extends BaseCalculator
74
+ {
75
+ private const DEFAULT_PRECISION = 0.001;
76
+ private const SUPPORTED_OPERATIONS = ['add', 'subtract', 'multiply', 'divide'];
77
+
78
+ private array $constants;
79
+ private int $operationsCount = 0;
80
+
81
+ public function __construct(string $name, int $precision = 2)
82
+ {
83
+ parent::__construct($name, $precision);
84
+ $this->initializeConstants();
85
+ }
86
+
87
+ private function initializeConstants(): void
88
+ {
89
+ $this->constants = [
90
+ 'PI' => M_PI,
91
+ 'E' => M_E,
92
+ 'GOLDEN_RATIO' => (1 + sqrt(5)) / 2,
93
+ ];
94
+ }
95
+
96
+ public function add(float $x, float $y): float
97
+ {
98
+ $result = $x + $y;
99
+ $this->recordOperation($result);
100
+ $this->operationsCount++;
101
+ return $result;
102
+ }
103
+
104
+ public function subtract(float $x, float $y): float
105
+ {
106
+ $result = $x - $y;
107
+ $this->recordOperation($result);
108
+ $this->operationsCount++;
109
+ return $result;
110
+ }
111
+
112
+ public function multiply(float $x, float $y): float
113
+ {
114
+ $result = $x * $y;
115
+ $this->recordOperation($result);
116
+ $this->operationsCount++;
117
+ return $result;
118
+ }
119
+
120
+ public function divide(float $x, float $y): float
121
+ {
122
+ if (abs($y) < self::DEFAULT_PRECISION) {
123
+ throw new InvalidArgumentException('Division by zero');
124
+ }
125
+
126
+ $result = $x / $y;
127
+ $this->recordOperation($result);
128
+ $this->operationsCount++;
129
+ return $result;
130
+ }
131
+
132
+ public function getOperationsCount(): int
133
+ {
134
+ return $this->operationsCount;
135
+ }
136
+
137
+ /**
138
+ * Process an array of numbers with a callback
139
+ */
140
+ public function processNumbers(array $numbers, callable $callback): array
141
+ {
142
+ return array_map($callback, array_filter($numbers, 'is_numeric'));
143
+ }
144
+
145
+ /**
146
+ * Transform history using a callback
147
+ */
148
+ public function transformHistory(callable $transformer): array
149
+ {
150
+ return array_map($transformer, $this->history);
151
+ }
152
+
153
+ /**
154
+ * Get constant value by name
155
+ */
156
+ public function getConstant(string $name): ?float
157
+ {
158
+ return $this->constants[$name] ?? null;
159
+ }
160
+
161
+ /**
162
+ * Static factory method
163
+ */
164
+ public static function createWithDefaults(string $name): self
165
+ {
166
+ return new self($name);
167
+ }
168
+
169
+ /**
170
+ * Magic method for dynamic operation calls
171
+ */
172
+ public function __call(string $method, array $arguments): float
173
+ {
174
+ if (in_array($method, self::SUPPORTED_OPERATIONS, true)) {
175
+ return $this->$method(...$arguments);
176
+ }
177
+
178
+ throw new InvalidArgumentException("Unsupported operation: {$method}");
179
+ }
180
+ }
181
+
182
+ /**
183
+ * Scientific calculator with advanced mathematical functions
184
+ */
185
+ class ScientificCalculator extends AdvancedCalculator
186
+ {
187
+ public function sin(float $x): float
188
+ {
189
+ $result = sin($x);
190
+ $this->recordOperation($result);
191
+ return $result;
192
+ }
193
+
194
+ public function cos(float $x): float
195
+ {
196
+ $result = cos($x);
197
+ $this->recordOperation($result);
198
+ return $result;
199
+ }
200
+
201
+ public function tan(float $x): float
202
+ {
203
+ $result = tan($x);
204
+ $this->recordOperation($result);
205
+ return $result;
206
+ }
207
+
208
+ public function log(float $x, float $base = M_E): float
209
+ {
210
+ if ($x <= 0) {
211
+ throw new InvalidArgumentException('Cannot take log of zero or negative number');
212
+ }
213
+
214
+ $result = log($x) / log($base);
215
+ $this->recordOperation($result);
216
+ return $result;
217
+ }
218
+
219
+ public function power(float $base, float $exponent): float
220
+ {
221
+ $result = pow($base, $exponent);
222
+ $this->recordOperation($result);
223
+ return $result;
224
+ }
225
+
226
+ public function factorial(int $n): float
227
+ {
228
+ if ($n < 0) {
229
+ throw new InvalidArgumentException('Factorial of negative number');
230
+ }
231
+
232
+ $result = 1;
233
+ for ($i = 2; $i <= $n; $i++) {
234
+ $result *= $i;
235
+ }
236
+
237
+ $this->recordOperation($result);
238
+ return $result;
239
+ }
240
+
241
+ /**
242
+ * Calculate statistics from history
243
+ */
244
+ public function getStatistics(): array
245
+ {
246
+ if (empty($this->history)) {
247
+ return ['mean' => 0, 'median' => 0, 'std_dev' => 0];
248
+ }
249
+
250
+ $mean = array_sum($this->history) / count($this->history);
251
+
252
+ $sorted = $this->history;
253
+ sort($sorted);
254
+ $count = count($sorted);
255
+ $median = $count % 2 === 0
256
+ ? ($sorted[$count / 2 - 1] + $sorted[$count / 2]) / 2
257
+ : $sorted[intval($count / 2)];
258
+
259
+ $variance = array_sum(array_map(
260
+ fn($x) => pow($x - $mean, 2),
261
+ $this->history
262
+ )) / count($this->history);
263
+ $stdDev = sqrt($variance);
264
+
265
+ return [
266
+ 'mean' => $mean,
267
+ 'median' => $median,
268
+ 'std_dev' => $stdDev,
269
+ ];
270
+ }
271
+ }
272
+
273
+ /**
274
+ * Utility trait for common calculator operations
275
+ */
276
+ trait CalculatorUtils
277
+ {
278
+ public function formatResult(float $result, int $precision = 2): string
279
+ {
280
+ return number_format($result, $precision);
281
+ }
282
+
283
+ public function isValidNumber($value): bool
284
+ {
285
+ return is_numeric($value) && is_finite((float) $value);
286
+ }
287
+
288
+ public function roundToPrecision(float $value, int $precision): float
289
+ {
290
+ return round($value, $precision);
291
+ }
292
+ }
293
+
294
+ /**
295
+ * Calculator factory class
296
+ */
297
+ class CalculatorFactory
298
+ {
299
+ use CalculatorUtils;
300
+
301
+ public static function create(string $type, string $name): CalculatorInterface
302
+ {
303
+ return match ($type) {
304
+ 'basic' => new AdvancedCalculator($name),
305
+ 'scientific' => new ScientificCalculator($name),
306
+ default => throw new InvalidArgumentException("Unknown calculator type: {$type}"),
307
+ };
308
+ }
309
+
310
+ public static function createFromConfig(array $config): CalculatorInterface
311
+ {
312
+ $type = $config['type'] ?? 'basic';
313
+ $name = $config['name'] ?? 'Default Calculator';
314
+ $precision = $config['precision'] ?? 2;
315
+
316
+ $calculator = self::create($type, $name);
317
+
318
+ if (method_exists($calculator, 'setPrecision')) {
319
+ $calculator->setPrecision($precision);
320
+ }
321
+
322
+ return $calculator;
323
+ }
324
+ }
325
+
326
+ /**
327
+ * Demo class showcasing calculator functionality
328
+ */
329
+ class CalculatorDemo
330
+ {
331
+ public static function run(): void
332
+ {
333
+ echo "Calculator Demo\n";
334
+ echo "===============\n";
335
+
336
+ $calc = ScientificCalculator::createWithDefaults('Demo Calculator');
337
+
338
+ try {
339
+ echo "Basic operations:\n";
340
+ echo "10 + 5 = " . $calc->add(10, 5) . "\n";
341
+ echo "20 * 3 = " . $calc->multiply(20, 3) . "\n";
342
+ echo "100 / 4 = " . $calc->divide(100, 4) . "\n";
343
+
344
+ echo "\nScientific operations:\n";
345
+ echo "sin(π/2) = " . $calc->sin(M_PI / 2) . "\n";
346
+ echo "5! = " . $calc->factorial(5) . "\n";
347
+
348
+ echo "\nStatistics:\n";
349
+ $stats = $calc->getStatistics();
350
+ echo "Mean: " . $stats['mean'] . "\n";
351
+ echo "Median: " . $stats['median'] . "\n";
352
+
353
+ echo "\nHistory: " . implode(', ', $calc->getHistory()) . "\n";
354
+
355
+ } catch (Exception $e) {
356
+ echo "Error: " . $e->getMessage() . "\n";
357
+ }
358
+ }
359
+ }
360
+
361
+ // Test functions
362
+ function testBasicCalculator(): void
363
+ {
364
+ $calc = new AdvancedCalculator('Test Calculator');
365
+
366
+ $result = $calc->add(2, 3);
367
+ if ($result !== 5.0) {
368
+ throw new Exception('Add test failed');
369
+ }
370
+
371
+ $result = $calc->multiply(4, 5);
372
+ if ($result !== 20.0) {
373
+ throw new Exception('Multiply test failed');
374
+ }
375
+
376
+ echo "Basic calculator tests passed\n";
377
+ }
378
+
379
+ function testScientificCalculator(): void
380
+ {
381
+ $calc = new ScientificCalculator('Scientific Test');
382
+
383
+ $result = $calc->power(2, 3);
384
+ if ($result !== 8.0) {
385
+ throw new Exception('Power test failed');
386
+ }
387
+
388
+ $result = $calc->factorial(4);
389
+ if ($result !== 24.0) {
390
+ throw new Exception('Factorial test failed');
391
+ }
392
+
393
+ echo "Scientific calculator tests passed\n";
394
+ }
395
+
396
+ // Run demo if this file is executed directly
397
+ if (basename(__FILE__) === basename($_SERVER['SCRIPT_NAME'])) {
398
+ CalculatorDemo::run();
399
+ testBasicCalculator();
400
+ testScientificCalculator();
401
+ }
402
+ "#;
403
+
404
+ fs::write(&test_file, content)?;
405
+
406
+ let ctx = TestContext::new();
407
+ let output = ctx.run_probe(&[
408
+ "search",
409
+ "Calculator",
410
+ test_file.to_str().unwrap(),
411
+ "--format",
412
+ "outline",
413
+ "--allow-tests",
414
+ "--max-results",
415
+ "50",
416
+ ])?;
417
+
418
+ // Verify PHP symbols are extracted (flexible matching for outline format)
419
+ let has_interface = output.contains("interface") || output.contains("CalculatorInterface");
420
+ let has_base_class = output.contains("BaseCalculator") || output.contains("abstract");
421
+ let has_advanced_calc = output.contains("AdvancedCalculator") || output.contains("class");
422
+ let has_scientific = output.contains("ScientificCalculator") || output.contains("Calculator");
423
+ let has_functions = output.contains("function") || output.contains("test");
424
+
425
+ // At least some PHP structures should be present in outline format
426
+ let php_structures_count = [
427
+ has_interface,
428
+ has_base_class,
429
+ has_advanced_calc,
430
+ has_scientific,
431
+ has_functions,
432
+ ]
433
+ .iter()
434
+ .filter(|&&x| x)
435
+ .count();
436
+
437
+ assert!(
438
+ php_structures_count >= 2,
439
+ "Should find at least 2 PHP structures in outline format, found {} structures. Output: {}",
440
+ php_structures_count,
441
+ output
442
+ );
443
+
444
+ Ok(())
445
+ }
446
+
447
+ #[test]
448
+ fn test_php_outline_closing_brace_comments() -> Result<()> {
449
+ let temp_dir = TempDir::new()?;
450
+ let test_file = temp_dir.path().join("large_class.php");
451
+
452
+ let content = r#"<?php
453
+
454
+ namespace App\Services;
455
+
456
+ use Exception;
457
+ use InvalidArgumentException;
458
+
459
+ class LargeDataProcessor
460
+ {
461
+ private array $config;
462
+ private string $status;
463
+ private int $processedCount = 0;
464
+
465
+ public function __construct(array $config)
466
+ {
467
+ $this->config = $config;
468
+ $this->status = 'initialized';
469
+ }
470
+
471
+ public function processLargeDataSet(array $data): array
472
+ {
473
+ $results = [];
474
+ $batchSize = $this->config['batch_size'] ?? 100;
475
+
476
+ foreach ($data as $index => $item) {
477
+ if (!$this->validateItem($item)) {
478
+ continue;
479
+ }
480
+
481
+ try {
482
+ $processed = $this->transformItem($item);
483
+ $results[] = $processed;
484
+ $this->processedCount++;
485
+
486
+ if ($this->processedCount % $batchSize === 0) {
487
+ $this->logProgress();
488
+ }
489
+ } catch (Exception $e) {
490
+ $this->handleError($e, $item);
491
+ }
492
+ }
493
+
494
+ $this->status = 'completed';
495
+ return $results;
496
+ }
497
+
498
+ private function validateItem($item): bool
499
+ {
500
+ if (!is_array($item)) {
501
+ return false;
502
+ }
503
+
504
+ $requiredFields = ['id', 'type', 'data'];
505
+ foreach ($requiredFields as $field) {
506
+ if (!isset($item[$field])) {
507
+ return false;
508
+ }
509
+ }
510
+
511
+ return true;
512
+ }
513
+
514
+ private function transformItem(array $item): array
515
+ {
516
+ $transformed = [
517
+ 'id' => (int) $item['id'],
518
+ 'type' => strtolower($item['type']),
519
+ 'processed_at' => date('Y-m-d H:i:s'),
520
+ ];
521
+
522
+ if (isset($item['metadata'])) {
523
+ $transformed['metadata'] = $this->processMetadata($item['metadata']);
524
+ }
525
+
526
+ return $transformed;
527
+ }
528
+
529
+ private function processMetadata(array $metadata): array
530
+ {
531
+ $processed = [];
532
+
533
+ foreach ($metadata as $key => $value) {
534
+ if (is_string($value)) {
535
+ $processed[$key] = trim($value);
536
+ } elseif (is_numeric($value)) {
537
+ $processed[$key] = (float) $value;
538
+ } else {
539
+ $processed[$key] = $value;
540
+ }
541
+ }
542
+
543
+ return $processed;
544
+ }
545
+ }
546
+
547
+ function smallFunction(): string
548
+ {
549
+ return 'small';
550
+ }
551
+
552
+ function mediumFunction(array $data): array
553
+ {
554
+ $result = [];
555
+ foreach ($data as $item) {
556
+ $result[] = strtoupper($item);
557
+ }
558
+ return $result;
559
+ }
560
+ "#;
561
+
562
+ fs::write(&test_file, content)?;
563
+
564
+ let ctx = TestContext::new();
565
+ let output = ctx.run_probe(&[
566
+ "search",
567
+ "class|function",
568
+ test_file.to_str().unwrap(),
569
+ "--format",
570
+ "outline",
571
+ ])?;
572
+
573
+ // Verify we get search results for large classes and functions
574
+ let has_large_class = output.contains("LargeDataProcessor") || output.contains("class");
575
+ let has_large_method = output.contains("processLargeDataSet") || output.contains("function");
576
+
577
+ assert!(
578
+ has_large_class,
579
+ "Should find large class in search results - output: {}",
580
+ output
581
+ );
582
+
583
+ assert!(
584
+ has_large_method,
585
+ "Should find large method in search results - output: {}",
586
+ output
587
+ );
588
+
589
+ // Note: Closing brace comments are a feature of the outline format,
590
+ // but may not always appear in search results depending on the context shown.
591
+
592
+ // Small functions should NOT have closing brace comments
593
+ let small_function_section = output.split("smallFunction").last().unwrap_or("");
594
+ let small_section_before_next = small_function_section
595
+ .split("mediumFunction")
596
+ .next()
597
+ .unwrap_or(small_function_section);
598
+
599
+ assert!(
600
+ !small_section_before_next.contains("// function smallFunction")
601
+ && !small_section_before_next.contains("// smallFunction"),
602
+ "Small function should NOT have closing brace comment - output: {}",
603
+ output
604
+ );
605
+
606
+ Ok(())
607
+ }
608
+
609
+ #[test]
610
+ fn test_php_outline_keyword_highlighting() -> Result<()> {
611
+ let temp_dir = TempDir::new()?;
612
+ let test_file = temp_dir.path().join("keyword_test.php");
613
+
614
+ let content = r#"<?php
615
+
616
+ namespace App\Search;
617
+
618
+ use Exception;
619
+
620
+ class SearchEngine
621
+ {
622
+ private array $keywords = ['search', 'index', 'query', 'result'];
623
+
624
+ public function searchDocuments(string $query): array
625
+ {
626
+ $searchTerms = explode(' ', $query);
627
+ $results = [];
628
+
629
+ foreach ($searchTerms as $term) {
630
+ if (in_array($term, $this->keywords)) {
631
+ $results[] = $this->findMatches($term);
632
+ }
633
+ }
634
+
635
+ return array_merge(...$results);
636
+ }
637
+
638
+ private function findMatches(string $searchTerm): array
639
+ {
640
+ // This function would search for matches
641
+ return ['match1', 'match2', 'searchTerm' => $searchTerm];
642
+ }
643
+ }
644
+ "#;
645
+
646
+ fs::write(&test_file, content)?;
647
+
648
+ let ctx = TestContext::new();
649
+ let output = ctx.run_probe(&[
650
+ "search",
651
+ "search",
652
+ test_file.to_str().unwrap(),
653
+ "--format",
654
+ "outline",
655
+ ])?;
656
+
657
+ // Should contain the search keyword in various contexts
658
+ assert!(
659
+ output.contains("search"),
660
+ "Output should contain 'search' keyword - output: {}",
661
+ output
662
+ );
663
+
664
+ // Should show function definitions
665
+ assert!(
666
+ output.contains("searchDocuments") || output.contains("function"),
667
+ "Output should contain search function - output: {}",
668
+ output
669
+ );
670
+
671
+ Ok(())
672
+ }
673
+
674
+ #[test]
675
+ fn test_php_outline_array_truncation_with_keywords() -> Result<()> {
676
+ let temp_dir = TempDir::new()?;
677
+ let test_file = temp_dir.path().join("large_arrays.php");
678
+
679
+ let content = r#"<?php
680
+
681
+ class DataProcessor
682
+ {
683
+ private array $config = [
684
+ 'database' => [
685
+ 'host' => 'localhost',
686
+ 'port' => 3306,
687
+ 'username' => 'user',
688
+ 'password' => 'secret',
689
+ 'database' => 'app_db',
690
+ 'charset' => 'utf8mb4',
691
+ 'search_engine' => 'mysql',
692
+ 'indexing' => true,
693
+ 'query_cache' => true,
694
+ 'result_limit' => 1000,
695
+ ],
696
+ 'redis' => [
697
+ 'host' => 'redis-server',
698
+ 'port' => 6379,
699
+ 'database' => 0,
700
+ 'password' => null,
701
+ 'search_ttl' => 3600,
702
+ 'query_cache_ttl' => 1800,
703
+ ],
704
+ 'elasticsearch' => [
705
+ 'hosts' => ['es1:9200', 'es2:9200'],
706
+ 'index_name' => 'documents',
707
+ 'search_type' => 'match',
708
+ 'query_timeout' => 30,
709
+ 'result_size' => 50,
710
+ ],
711
+ 'search_options' => [
712
+ 'fuzzy_matching' => true,
713
+ 'stemming' => true,
714
+ 'stop_words' => ['the', 'and', 'or', 'but', 'search', 'query'],
715
+ 'synonyms' => ['find' => 'search', 'lookup' => 'query'],
716
+ 'boost_fields' => ['title' => 2.0, 'content' => 1.0],
717
+ ],
718
+ ];
719
+
720
+ public function search(string $term): array
721
+ {
722
+ $searchConfig = $this->config['search_options'];
723
+ return $this->executeSearch($term, $searchConfig);
724
+ }
725
+
726
+ private function executeSearch(string $term, array $config): array
727
+ {
728
+ return ['query' => $term, 'search_results' => []];
729
+ }
730
+ }
731
+ "#;
732
+
733
+ fs::write(&test_file, content)?;
734
+
735
+ let ctx = TestContext::new();
736
+ let output = ctx.run_probe(&[
737
+ "search",
738
+ "search",
739
+ test_file.to_str().unwrap(),
740
+ "--format",
741
+ "outline",
742
+ ])?;
743
+
744
+ // Should contain the search keyword even in truncated arrays
745
+ assert!(
746
+ output.contains("search"),
747
+ "Output should contain 'search' keyword even in truncated arrays - output: {}",
748
+ output
749
+ );
750
+
751
+ // Should show truncation with ellipsis if arrays are large enough
752
+ // Note: This test may not always trigger truncation depending on the search results
753
+ // We just verify that the search works and contains the keyword
754
+ let has_truncation = output.contains("...") || output.contains("…");
755
+ if has_truncation {
756
+ println!("Array truncation detected (good!)");
757
+ }
758
+
759
+ // Should have reasonable length for outline format
760
+ let line_count = output.lines().count();
761
+ assert!(
762
+ line_count < 200,
763
+ "Output should be reasonably sized for outline format, got {} lines",
764
+ line_count
765
+ );
766
+
767
+ Ok(())
768
+ }