@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,941 @@
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_csharp_outline_basic_symbols() -> Result<()> {
10
+ let temp_dir = TempDir::new()?;
11
+ let test_file = temp_dir.path().join("Calculator.cs");
12
+
13
+ let content = r#"using System;
14
+ using System.Collections.Generic;
15
+ using System.Linq;
16
+
17
+ namespace Calculator
18
+ {
19
+ public interface ICalculator
20
+ {
21
+ double Add(double x, double y);
22
+ double Subtract(double x, double y);
23
+ }
24
+
25
+ public class BasicCalculator : ICalculator
26
+ {
27
+ public double Add(double x, double y) => x + y;
28
+ public double Subtract(double x, double y) => x - y;
29
+ }
30
+ }
31
+ "#;
32
+
33
+ fs::write(&test_file, content)?;
34
+
35
+ let ctx = TestContext::new();
36
+ let output = ctx.run_probe(&[
37
+ "search",
38
+ "Calculator",
39
+ test_file.to_str().unwrap(),
40
+ "--format",
41
+ "outline",
42
+ ])?;
43
+
44
+ // Verify C# symbols are found in outline format
45
+ assert!(
46
+ output.contains("ICalculator") || output.contains("BasicCalculator"),
47
+ "Missing C# symbols - output: {}",
48
+ output
49
+ );
50
+ assert!(
51
+ output.contains("namespace Calculator"),
52
+ "Missing namespace - output: {}",
53
+ output
54
+ );
55
+
56
+ Ok(())
57
+ }
58
+
59
+ #[test]
60
+ fn test_csharp_outline_smart_closing_brace_comments() -> Result<()> {
61
+ let temp_dir = TempDir::new()?;
62
+ let test_file = temp_dir.path().join("smart_braces.cs");
63
+
64
+ let content = r#"using System;
65
+ using System.Collections.Generic;
66
+ using System.Linq;
67
+
68
+ namespace SmartBraces
69
+ {
70
+ /// Small method that should NOT get closing brace comments.
71
+ public class SmallClass
72
+ {
73
+ public void SmallMethod(int x)
74
+ {
75
+ var result = x * 2;
76
+ Console.WriteLine(result);
77
+ }
78
+ }
79
+
80
+ /// Large class that SHOULD get closing brace comments when there are gaps.
81
+ public class LargeClassWithGaps
82
+ {
83
+ private readonly List<string> _data = new List<string>();
84
+ private const int MaxRetries = 3;
85
+
86
+ // Phase 1: Initial setup methods
87
+ public void InitializeData()
88
+ {
89
+ for (int i = 0; i < 100; i++)
90
+ {
91
+ if (i % 2 == 0)
92
+ {
93
+ _data.Add($"Even: {i}");
94
+ }
95
+ else
96
+ {
97
+ _data.Add($"Odd: {i}");
98
+ }
99
+ }
100
+ }
101
+
102
+ // Phase 2: Complex processing logic with nested structures
103
+ public void ProcessDataWithComplexLogic()
104
+ {
105
+ var processedData = new Dictionary<string, int>();
106
+
107
+ foreach (var item in _data)
108
+ {
109
+ if (item.StartsWith("Even"))
110
+ {
111
+ var number = ExtractNumber(item);
112
+ if (number > 50)
113
+ {
114
+ processedData[item] = number * 2;
115
+ }
116
+ else
117
+ {
118
+ processedData[item] = number;
119
+ }
120
+ }
121
+ else if (item.StartsWith("Odd"))
122
+ {
123
+ var number = ExtractNumber(item);
124
+ processedData[item] = number + 10;
125
+ }
126
+ }
127
+
128
+ // Final validation and cleanup
129
+ var validatedData = new List<KeyValuePair<string, int>>();
130
+ foreach (var kvp in processedData)
131
+ {
132
+ if (kvp.Value > 0 && kvp.Key.Length > 5)
133
+ {
134
+ validatedData.Add(kvp);
135
+ }
136
+ }
137
+ }
138
+
139
+ // Phase 3: Helper methods and utilities
140
+ private int ExtractNumber(string input)
141
+ {
142
+ var parts = input.Split(':');
143
+ if (parts.Length > 1 && int.TryParse(parts[1].Trim(), out var number))
144
+ {
145
+ return number;
146
+ }
147
+ return 0;
148
+ }
149
+ }
150
+
151
+ /// Another large class to test closing brace behavior with control flow
152
+ public class ControlFlowClass
153
+ {
154
+ public void ProcessWithControlFlow(List<Item> items)
155
+ {
156
+ var accumulator = new Dictionary<ItemType, List<Item>>();
157
+
158
+ // Main processing loop with complex nested control flow
159
+ foreach (var item in items)
160
+ {
161
+ try
162
+ {
163
+ switch (item.Type)
164
+ {
165
+ case ItemType.Primary:
166
+ if (item.Weight > 50.0)
167
+ {
168
+ if (!accumulator.ContainsKey(ItemType.Primary))
169
+ accumulator[ItemType.Primary] = new List<Item>();
170
+ accumulator[ItemType.Primary].Add(item);
171
+ }
172
+ else
173
+ {
174
+ // Handle lightweight primary items
175
+ ProcessLightweightItem(item);
176
+ }
177
+ break;
178
+ case ItemType.Secondary:
179
+ ProcessSecondaryItem(item, accumulator);
180
+ break;
181
+ case ItemType.Auxiliary:
182
+ ProcessAuxiliaryItem(item);
183
+ break;
184
+ default:
185
+ throw new ArgumentException($"Unknown item type: {item.Type}");
186
+ }
187
+ }
188
+ catch (Exception ex)
189
+ {
190
+ Console.WriteLine($"Error processing item {item.Id}: {ex.Message}");
191
+ continue;
192
+ }
193
+ }
194
+
195
+ FinalizeProcessing(accumulator);
196
+ }
197
+
198
+ private void ProcessLightweightItem(Item item) { }
199
+ private void ProcessSecondaryItem(Item item, Dictionary<ItemType, List<Item>> acc) { }
200
+ private void ProcessAuxiliaryItem(Item item) { }
201
+ private void FinalizeProcessing(Dictionary<ItemType, List<Item>> acc) { }
202
+ }
203
+
204
+ public class Item
205
+ {
206
+ public int Id { get; set; }
207
+ public ItemType Type { get; set; }
208
+ public double Weight { get; set; }
209
+ }
210
+
211
+ public enum ItemType
212
+ {
213
+ Primary,
214
+ Secondary,
215
+ Auxiliary
216
+ }
217
+ }
218
+ "#;
219
+
220
+ fs::write(&test_file, content)?;
221
+
222
+ let ctx = TestContext::new();
223
+ let output = ctx.run_probe(&[
224
+ "search",
225
+ "InitializeData",
226
+ test_file.to_str().unwrap(),
227
+ "--format",
228
+ "outline",
229
+ ])?;
230
+
231
+ // Should find the method
232
+ assert!(
233
+ output.contains("InitializeData"),
234
+ "Missing InitializeData method - output: {}",
235
+ output
236
+ );
237
+
238
+ // Should contain the class and method structure in outline format
239
+ assert!(
240
+ output.contains("LargeClassWithGaps") || output.contains("public void InitializeData"),
241
+ "Should contain class or method declaration - output: {}",
242
+ output
243
+ );
244
+
245
+ // Should be in outline format
246
+ assert!(
247
+ output.contains("---\nFile:") || output.contains("File:"),
248
+ "Missing file delimiter in outline format - output: {}",
249
+ output
250
+ );
251
+
252
+ Ok(())
253
+ }
254
+
255
+ #[test]
256
+ fn test_csharp_outline_keyword_highlighting() -> Result<()> {
257
+ let temp_dir = TempDir::new()?;
258
+ let test_file = temp_dir.path().join("keywords.cs");
259
+
260
+ let content = r#"using System;
261
+ using System.Linq;
262
+ using System.Collections.Generic;
263
+
264
+ namespace KeywordTest
265
+ {
266
+ public class KeywordProcessor
267
+ {
268
+ // Methods containing various C# keywords
269
+ public async Task ProcessAsync()
270
+ {
271
+ var data = await GetDataAsync();
272
+ foreach (var item in data.Where(x => x != null))
273
+ {
274
+ if (item is string text && !string.IsNullOrEmpty(text))
275
+ {
276
+ yield return text.ToUpper();
277
+ }
278
+ }
279
+ }
280
+
281
+ public void ProcessWithPatternMatching(object input)
282
+ {
283
+ var result = input switch
284
+ {
285
+ string s when s.Length > 10 => $"Long string: {s}",
286
+ int i when i > 0 => $"Positive number: {i}",
287
+ null => "Null value",
288
+ _ => "Unknown type"
289
+ };
290
+ }
291
+
292
+ public void UsingStatement()
293
+ {
294
+ using var resource = new DisposableResource();
295
+ using (var connection = new DatabaseConnection())
296
+ {
297
+ connection.Execute("SELECT * FROM table");
298
+ }
299
+ }
300
+ }
301
+ }
302
+ "#;
303
+
304
+ fs::write(&test_file, content)?;
305
+
306
+ let ctx = TestContext::new();
307
+ let output = ctx.run_probe(&[
308
+ "search",
309
+ "ProcessAsync",
310
+ test_file.to_str().unwrap(),
311
+ "--format",
312
+ "outline",
313
+ ])?;
314
+
315
+ // Should contain the async method
316
+ assert!(
317
+ output.contains("ProcessAsync"),
318
+ "Should contain ProcessAsync method - output: {}",
319
+ output
320
+ );
321
+
322
+ // Should contain Task in the return type or await keyword
323
+ assert!(
324
+ output.contains("Task") || output.contains("await"),
325
+ "Should contain async-related keywords - output: {}",
326
+ output
327
+ );
328
+
329
+ Ok(())
330
+ }
331
+
332
+ #[test]
333
+ fn test_csharp_outline_testing_frameworks_detection() -> Result<()> {
334
+ let temp_dir = TempDir::new()?;
335
+ let test_file = temp_dir.path().join("tests.cs");
336
+
337
+ let content = r#"using System;
338
+ using Xunit;
339
+ using NUnit.Framework;
340
+ using Microsoft.VisualStudio.TestTools.UnitTesting;
341
+
342
+ namespace Calculator.Tests
343
+ {
344
+ // xUnit tests
345
+ public class XUnitCalculatorTests
346
+ {
347
+ [Fact]
348
+ public void Add_ShouldReturnSum_WhenGivenTwoNumbers()
349
+ {
350
+ var calc = new Calculator();
351
+ var result = calc.Add(2, 3);
352
+ Assert.Equal(5, result);
353
+ }
354
+
355
+ [Theory]
356
+ [InlineData(2, 3, 5)]
357
+ [InlineData(0, 0, 0)]
358
+ [InlineData(-1, 1, 0)]
359
+ public void Add_ShouldReturnCorrectSum_ForVariousInputs(int a, int b, int expected)
360
+ {
361
+ var calc = new Calculator();
362
+ var result = calc.Add(a, b);
363
+ Assert.Equal(expected, result);
364
+ }
365
+ }
366
+
367
+ // NUnit tests
368
+ [TestFixture]
369
+ public class NUnitCalculatorTests
370
+ {
371
+ private Calculator _calculator;
372
+
373
+ [SetUp]
374
+ public void SetUp()
375
+ {
376
+ _calculator = new Calculator();
377
+ }
378
+
379
+ [Test]
380
+ public void Multiply_ShouldReturnProduct_WhenGivenTwoNumbers()
381
+ {
382
+ var result = _calculator.Multiply(3, 4);
383
+ Assert.AreEqual(12, result);
384
+ }
385
+
386
+ [TestCase(2, 3, 6)]
387
+ [TestCase(0, 5, 0)]
388
+ [TestCase(-2, 3, -6)]
389
+ public void Multiply_ShouldReturnCorrectProduct_ForVariousInputs(int a, int b, int expected)
390
+ {
391
+ var result = _calculator.Multiply(a, b);
392
+ Assert.AreEqual(expected, result);
393
+ }
394
+ }
395
+
396
+ // MSTest tests
397
+ [TestClass]
398
+ public class MSTestCalculatorTests
399
+ {
400
+ private Calculator _calculator;
401
+
402
+ [TestInitialize]
403
+ public void Initialize()
404
+ {
405
+ _calculator = new Calculator();
406
+ }
407
+
408
+ [TestMethod]
409
+ public void Divide_ShouldReturnQuotient_WhenGivenTwoNumbers()
410
+ {
411
+ var result = _calculator.Divide(10, 2);
412
+ Assert.AreEqual(5, result);
413
+ }
414
+
415
+ [DataTestMethod]
416
+ [DataRow(10, 2, 5)]
417
+ [DataRow(15, 3, 5)]
418
+ [DataRow(0, 1, 0)]
419
+ public void Divide_ShouldReturnCorrectQuotient_ForVariousInputs(int a, int b, int expected)
420
+ {
421
+ var result = _calculator.Divide(a, b);
422
+ Assert.AreEqual(expected, result);
423
+ }
424
+ }
425
+ }
426
+ "#;
427
+
428
+ fs::write(&test_file, content)?;
429
+
430
+ let ctx = TestContext::new();
431
+
432
+ // Test xUnit detection
433
+ let output = ctx.run_probe(&[
434
+ "search",
435
+ "Fact",
436
+ test_file.to_str().unwrap(),
437
+ "--format",
438
+ "outline",
439
+ ])?;
440
+
441
+ assert!(
442
+ output.contains("Fact") || output.contains("[Fact]"),
443
+ "Should detect xUnit [Fact] attribute - output: {}",
444
+ output
445
+ );
446
+
447
+ // Test NUnit detection
448
+ let output = ctx.run_probe(&[
449
+ "search",
450
+ "TestFixture",
451
+ test_file.to_str().unwrap(),
452
+ "--format",
453
+ "outline",
454
+ ])?;
455
+
456
+ assert!(
457
+ output.contains("TestFixture") || output.contains("[TestFixture]"),
458
+ "Should detect NUnit [TestFixture] attribute - output: {}",
459
+ output
460
+ );
461
+
462
+ // Test MSTest detection
463
+ let output = ctx.run_probe(&[
464
+ "search",
465
+ "TestMethod",
466
+ test_file.to_str().unwrap(),
467
+ "--format",
468
+ "outline",
469
+ ])?;
470
+
471
+ assert!(
472
+ output.contains("TestMethod") || output.contains("[TestMethod]"),
473
+ "Should detect MSTest [TestMethod] attribute - output: {}",
474
+ output
475
+ );
476
+
477
+ Ok(())
478
+ }
479
+
480
+ #[test]
481
+ fn test_csharp_outline_modern_features() -> Result<()> {
482
+ let temp_dir = TempDir::new()?;
483
+ let test_file = temp_dir.path().join("modern_csharp.cs");
484
+
485
+ let content = r#"using System;
486
+ using System.Collections.Generic;
487
+ using System.Linq;
488
+
489
+ namespace ModernCSharp
490
+ {
491
+ // Records (C# 9+)
492
+ public record Person(string Name, int Age)
493
+ {
494
+ public string? Email { get; init; }
495
+ }
496
+
497
+ public record struct Point(double X, double Y);
498
+
499
+ // Nullable reference types
500
+ public class DataProcessor
501
+ {
502
+ public string? ProcessData(string? input)
503
+ {
504
+ if (input is null)
505
+ return null;
506
+
507
+ return input.ToUpper();
508
+ }
509
+
510
+ public List<string> FilterNonNullItems(List<string?> items)
511
+ {
512
+ return items.Where(x => x is not null).ToList()!;
513
+ }
514
+ }
515
+
516
+ // Pattern matching enhancements
517
+ public class PatternMatchingExamples
518
+ {
519
+ public string DescribeValue(object value) => value switch
520
+ {
521
+ null => "It's null",
522
+ string s when s.Length == 0 => "Empty string",
523
+ string s => $"String of length {s.Length}",
524
+ int i when i < 0 => "Negative number",
525
+ int i when i == 0 => "Zero",
526
+ int i => $"Positive number: {i}",
527
+ Person { Age: >= 18 } p => $"Adult: {p.Name}",
528
+ Person p => $"Minor: {p.Name}",
529
+ IEnumerable<string> list => $"Collection with {list.Count()} items",
530
+ _ => "Unknown type"
531
+ };
532
+
533
+ public bool IsValidPerson(Person person) => person switch
534
+ {
535
+ { Name: not null, Age: >= 0 and < 150 } => true,
536
+ _ => false
537
+ };
538
+ }
539
+
540
+ // Top-level programs support (would typically be in Program.cs)
541
+ public static class TopLevelDemo
542
+ {
543
+ public static void RunDemo(string[] args)
544
+ {
545
+ Console.WriteLine("Hello, World!");
546
+
547
+ var person = new Person("John", 30) { Email = "john@example.com" };
548
+ Console.WriteLine($"Person: {person}");
549
+
550
+ var point = new Point(1.0, 2.0);
551
+ Console.WriteLine($"Point: {point}");
552
+
553
+ var processor = new DataProcessor();
554
+ var result = processor.ProcessData("test");
555
+ Console.WriteLine($"Result: {result ?? "null"}");
556
+ }
557
+ }
558
+
559
+ // Target-typed new expressions
560
+ public class ModernSyntax
561
+ {
562
+ private readonly List<Person> _people = new();
563
+ private readonly Dictionary<string, int> _scores = new()
564
+ {
565
+ ["Alice"] = 95,
566
+ ["Bob"] = 87
567
+ };
568
+
569
+ public void InitializationExamples()
570
+ {
571
+ Point point = new(1.0, 2.0);
572
+ Person person = new("Jane", 25);
573
+
574
+ var list = new List<string> { "item1", "item2" };
575
+ }
576
+ }
577
+
578
+ // Switch expressions and property patterns
579
+ public class AdvancedPatterns
580
+ {
581
+ public decimal CalculateDiscount(Person customer, decimal amount) =>
582
+ (customer, amount) switch
583
+ {
584
+ ({ Age: >= 65 }, _) => amount * 0.1m,
585
+ (_, >= 1000) => amount * 0.05m,
586
+ ({ Name: "VIP" }, _) => amount * 0.15m,
587
+ _ => 0m
588
+ };
589
+
590
+ public string GetDayType(DateTime date) => date.DayOfWeek switch
591
+ {
592
+ DayOfWeek.Saturday or DayOfWeek.Sunday => "Weekend",
593
+ DayOfWeek.Monday => "Start of week",
594
+ DayOfWeek.Friday => "End of week",
595
+ _ => "Weekday"
596
+ };
597
+ }
598
+ }
599
+ "#;
600
+
601
+ fs::write(&test_file, content)?;
602
+
603
+ let ctx = TestContext::new();
604
+
605
+ // Test records
606
+ let output = ctx.run_probe(&[
607
+ "search",
608
+ "record",
609
+ test_file.to_str().unwrap(),
610
+ "--format",
611
+ "outline",
612
+ ])?;
613
+
614
+ assert!(
615
+ output.contains("record") && (output.contains("Person") || output.contains("Point")),
616
+ "Should detect C# records - output: {}",
617
+ output
618
+ );
619
+
620
+ // Test nullable reference types
621
+ let output = ctx.run_probe(&[
622
+ "search",
623
+ "string?",
624
+ test_file.to_str().unwrap(),
625
+ "--format",
626
+ "outline",
627
+ ])?;
628
+
629
+ assert!(
630
+ output.contains("string?") || output.contains("nullable"),
631
+ "Should detect nullable reference types - output: {}",
632
+ output
633
+ );
634
+
635
+ // Test pattern matching with a more specific search
636
+ let output = ctx.run_probe(&[
637
+ "search",
638
+ "DescribeValue",
639
+ test_file.to_str().unwrap(),
640
+ "--format",
641
+ "outline",
642
+ ])?;
643
+
644
+ assert!(
645
+ output.contains("DescribeValue") && (output.contains("switch") || output.contains("=>")),
646
+ "Should detect pattern matching method - output: {}",
647
+ output
648
+ );
649
+
650
+ Ok(())
651
+ }
652
+
653
+ #[test]
654
+ fn test_csharp_outline_linq_and_generics() -> Result<()> {
655
+ let temp_dir = TempDir::new()?;
656
+ let test_file = temp_dir.path().join("linq_generics.cs");
657
+
658
+ let content = r#"using System;
659
+ using System.Collections.Generic;
660
+ using System.Linq;
661
+
662
+ namespace LinqAndGenerics
663
+ {
664
+ public class Repository<T> where T : class, IEntity
665
+ {
666
+ private readonly List<T> _items = new List<T>();
667
+
668
+ public void Add(T item)
669
+ {
670
+ _items.Add(item);
671
+ }
672
+
673
+ public IEnumerable<T> FindByPredicate(Func<T, bool> predicate)
674
+ {
675
+ return _items.Where(predicate);
676
+ }
677
+
678
+ public TResult? Transform<TResult>(T item, Func<T, TResult> transformer)
679
+ where TResult : class
680
+ {
681
+ return item != null ? transformer(item) : null;
682
+ }
683
+ }
684
+
685
+ public interface IEntity
686
+ {
687
+ int Id { get; }
688
+ string Name { get; }
689
+ }
690
+
691
+ public class Customer : IEntity
692
+ {
693
+ public int Id { get; set; }
694
+ public string Name { get; set; } = string.Empty;
695
+ public string Email { get; set; } = string.Empty;
696
+ }
697
+
698
+ public class LinqOperations
699
+ {
700
+ public void ComplexLinqQuery(List<Customer> customers)
701
+ {
702
+ var result = customers
703
+ .Where(c => c.Email.Contains("@gmail.com"))
704
+ .GroupBy(c => c.Name.Substring(0, 1))
705
+ .Select(g => new
706
+ {
707
+ FirstLetter = g.Key,
708
+ Count = g.Count(),
709
+ Customers = g.Select(c => c.Name).ToList()
710
+ })
711
+ .OrderBy(x => x.FirstLetter)
712
+ .ToList();
713
+
714
+ var emailDomains = customers
715
+ .Select(c => c.Email.Split('@').LastOrDefault())
716
+ .Where(domain => !string.IsNullOrEmpty(domain))
717
+ .GroupBy(domain => domain)
718
+ .ToDictionary(g => g.Key, g => g.Count());
719
+ }
720
+
721
+ public IEnumerable<TResult> ProcessItems<TSource, TResult>(
722
+ IEnumerable<TSource> source,
723
+ Func<TSource, bool> filter,
724
+ Func<TSource, TResult> selector)
725
+ {
726
+ return source.Where(filter).Select(selector);
727
+ }
728
+ }
729
+
730
+ // Delegates and Events
731
+ public delegate void DataChangedEventHandler<T>(T oldValue, T newValue);
732
+
733
+ public class DataContainer<T>
734
+ {
735
+ private T _value = default(T)!;
736
+
737
+ public event DataChangedEventHandler<T>? ValueChanged;
738
+ public event Action<string>? LogMessage;
739
+
740
+ public T Value
741
+ {
742
+ get => _value;
743
+ set
744
+ {
745
+ var oldValue = _value;
746
+ _value = value;
747
+ OnValueChanged(oldValue, value);
748
+ LogMessage?.Invoke($"Value changed from {oldValue} to {value}");
749
+ }
750
+ }
751
+
752
+ protected virtual void OnValueChanged(T oldValue, T newValue)
753
+ {
754
+ ValueChanged?.Invoke(oldValue, newValue);
755
+ }
756
+ }
757
+
758
+ // Properties and Indexers
759
+ public class SmartCollection<T>
760
+ {
761
+ private readonly Dictionary<string, T> _items = new();
762
+
763
+ public T this[string key]
764
+ {
765
+ get => _items.TryGetValue(key, out var value) ? value : default(T)!;
766
+ set => _items[key] = value;
767
+ }
768
+
769
+ public int Count => _items.Count;
770
+
771
+ public IEnumerable<string> Keys => _items.Keys;
772
+
773
+ public bool IsEmpty => _items.Count == 0;
774
+ }
775
+ }
776
+ "#;
777
+
778
+ fs::write(&test_file, content)?;
779
+
780
+ let ctx = TestContext::new();
781
+
782
+ // Test LINQ detection
783
+ let output = ctx.run_probe(&[
784
+ "search",
785
+ "Where",
786
+ test_file.to_str().unwrap(),
787
+ "--format",
788
+ "outline",
789
+ ])?;
790
+
791
+ assert!(
792
+ output.contains("Where")
793
+ && (output.contains("Select") || output.contains("LINQ") || output.contains("linq")),
794
+ "Should detect LINQ operations - output: {}",
795
+ output
796
+ );
797
+
798
+ // Test generics
799
+ let output = ctx.run_probe(&[
800
+ "search",
801
+ "Repository",
802
+ test_file.to_str().unwrap(),
803
+ "--format",
804
+ "outline",
805
+ ])?;
806
+
807
+ assert!(
808
+ output.contains("Repository") && output.contains("<T>"),
809
+ "Should detect generic types - output: {}",
810
+ output
811
+ );
812
+
813
+ // Test delegates
814
+ let output = ctx.run_probe(&[
815
+ "search",
816
+ "delegate",
817
+ test_file.to_str().unwrap(),
818
+ "--format",
819
+ "outline",
820
+ ])?;
821
+
822
+ assert!(
823
+ output.contains("delegate") || output.contains("DataChangedEventHandler"),
824
+ "Should detect delegates - output: {}",
825
+ output
826
+ );
827
+
828
+ // Test events with more specific search
829
+ let output = ctx.run_probe(&[
830
+ "search",
831
+ "ValueChanged",
832
+ test_file.to_str().unwrap(),
833
+ "--format",
834
+ "outline",
835
+ ])?;
836
+
837
+ assert!(
838
+ output.contains("ValueChanged") || output.contains("DataChangedEventHandler"),
839
+ "Should detect events - output: {}",
840
+ output
841
+ );
842
+
843
+ Ok(())
844
+ }
845
+
846
+ #[test]
847
+ fn test_csharp_outline_array_truncation_with_keyword_preservation() -> Result<()> {
848
+ let temp_dir = TempDir::new()?;
849
+ let test_file = temp_dir.path().join("large_arrays.cs");
850
+
851
+ let content = r#"using System;
852
+ using System.Collections.Generic;
853
+ using System.Linq;
854
+
855
+ namespace ArrayTruncation
856
+ {
857
+ public class ConfigurationManager
858
+ {
859
+ /// Configuration data that should be truncated but preserve the 'important' keyword.
860
+ public static readonly string[] ImportantConfiguration = {
861
+ "setting1=value1",
862
+ "setting2=value2",
863
+ "important=critical_value",
864
+ "setting3=value3",
865
+ "setting4=value4",
866
+ "setting5=value5",
867
+ "setting6=value6",
868
+ "setting7=value7",
869
+ "setting8=value8",
870
+ "setting9=value9",
871
+ "setting10=value10",
872
+ "setting11=value11",
873
+ "setting12=value12",
874
+ "important_backup=backup_value",
875
+ "setting13=value13",
876
+ "setting14=value14",
877
+ "setting15=value15",
878
+ "setting16=value16",
879
+ "setting17=value17",
880
+ "setting18=value18",
881
+ "setting19=value19",
882
+ "setting20=value20",
883
+ "final_important_setting=final_value"
884
+ };
885
+
886
+ public void ProcessLargeDataSet()
887
+ {
888
+ var keywords = new List<string> {
889
+ "abstract", "as", "base", "bool", "break", "byte", "case", "catch", "char",
890
+ "checked", "class", "const", "continue", "decimal", "default", "delegate",
891
+ "do", "double", "else", "enum", "event", "explicit", "extern", "false",
892
+ "finally", "fixed", "float", "for", "foreach", "goto", "if", "implicit",
893
+ "in", "int", "interface", "internal", "is", "lock", "long", "namespace",
894
+ "new", "null", "object", "operator", "out", "override", "params", "private",
895
+ "protected", "public", "readonly", "ref", "return", "sbyte", "sealed",
896
+ "short", "sizeof", "stackalloc", "static", "string", "struct", "switch",
897
+ "this", "throw", "true", "try", "typeof", "uint", "ulong", "unchecked",
898
+ "unsafe", "ushort", "using", "virtual", "void", "volatile", "while"
899
+ };
900
+
901
+ var filteredKeywords = keywords.Where(k => k.Contains("important")).ToList();
902
+ }
903
+ }
904
+ }
905
+ "#;
906
+
907
+ fs::write(&test_file, content)?;
908
+
909
+ let ctx = TestContext::new();
910
+ let output = ctx.run_probe(&[
911
+ "search",
912
+ "important",
913
+ test_file.to_str().unwrap(),
914
+ "--format",
915
+ "outline",
916
+ ])?;
917
+
918
+ // Should find the keyword even in truncated arrays
919
+ assert!(
920
+ output.contains("important"),
921
+ "Should preserve 'important' keyword in truncated arrays - output: {}",
922
+ output
923
+ );
924
+
925
+ // Should show truncation with ellipsis
926
+ assert!(
927
+ output.contains("...") || output.contains("/*"),
928
+ "Should show array truncation - output: {}",
929
+ output
930
+ );
931
+
932
+ // Should have reasonable length (not show entire massive array)
933
+ let line_count = output.lines().count();
934
+ assert!(
935
+ line_count < 100,
936
+ "Output should be truncated to reasonable size, got {} lines",
937
+ line_count
938
+ );
939
+
940
+ Ok(())
941
+ }