@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,459 @@
1
+ use anyhow::Result;
2
+ use probe_code::language::parser::parse_file_for_code_blocks;
3
+ use std::collections::HashSet;
4
+
5
+ /// Test line comment context extension across multiple programming languages
6
+ /// This ensures that when line comments are found by search, they are extended
7
+ /// to include their meaningful parent context (functions, methods, classes, etc.)
8
+ /// rather than being returned as isolated single-line snippets.
9
+
10
+ #[test]
11
+ fn test_rust_line_comment_context_extension() -> Result<()> {
12
+ let rust_code = r#"
13
+ pub fn process_tokens(text: &str) -> Vec<String> {
14
+ let tokens = tokenize(text);
15
+ tokens
16
+ .into_iter()
17
+ .map(|token| normalize(token)) // normalize each token
18
+ .collect()
19
+ }
20
+
21
+ #[cfg(test)]
22
+ mod tests {
23
+ use super::*;
24
+
25
+ #[test]
26
+ fn test_processing() {
27
+ let result = process_tokens("hello world");
28
+ assert_eq!(result.len(), 2); // should have two tokens
29
+ }
30
+ }
31
+ "#;
32
+
33
+ let mut line_numbers = HashSet::new();
34
+ line_numbers.insert(6); // Line with "// normalize each token"
35
+ line_numbers.insert(16); // Line with "// should have two tokens"
36
+
37
+ let result = parse_file_for_code_blocks(rust_code, "rs", &line_numbers, true, None)?;
38
+
39
+ println!("Rust results:");
40
+ for (i, block) in result.iter().enumerate() {
41
+ println!(
42
+ " Block {}: type='{}', lines={}-{}",
43
+ i,
44
+ block.node_type,
45
+ block.start_row + 1,
46
+ block.end_row + 1
47
+ );
48
+ }
49
+
50
+ // Line comment should be extended to include parent function
51
+ assert!(
52
+ result.iter().any(|block| {
53
+ block.node_type == "function_item"
54
+ && block.start_row <= 6
55
+ && block.end_row >= 6
56
+ && block.end_row > block.start_row // Not a single-line block
57
+ }),
58
+ "Rust line comment should be extended to parent function"
59
+ );
60
+
61
+ // Test function comment should be extended to include parent test function
62
+ assert!(
63
+ result.iter().any(|block| {
64
+ (block.node_type == "function_item" || block.node_type.contains("test"))
65
+ && block.start_row <= 16
66
+ && block.end_row >= 16
67
+ && block.end_row > block.start_row // Not a single-line block
68
+ }),
69
+ "Rust test comment should be extended to parent test function"
70
+ );
71
+
72
+ Ok(())
73
+ }
74
+
75
+ #[test]
76
+ fn test_javascript_line_comment_context_extension() -> Result<()> {
77
+ let js_code = r#"
78
+ function processData(data) {
79
+ const processed = data.map(item => {
80
+ return item.value * 2; // double the value
81
+ });
82
+ return processed;
83
+ }
84
+
85
+ class DataProcessor {
86
+ constructor() {
87
+ this.multiplier = 3; // default multiplier
88
+ }
89
+
90
+ process(value) {
91
+ return value * this.multiplier; // apply multiplier
92
+ }
93
+ }
94
+ "#;
95
+
96
+ let mut line_numbers = HashSet::new();
97
+ line_numbers.insert(4); // Line with "// double the value"
98
+ line_numbers.insert(10); // Line with "// default multiplier"
99
+ line_numbers.insert(14); // Line with "// apply multiplier"
100
+
101
+ let result = parse_file_for_code_blocks(js_code, "js", &line_numbers, true, None)?;
102
+
103
+ println!("JavaScript results:");
104
+ for (i, block) in result.iter().enumerate() {
105
+ println!(
106
+ " Block {}: type='{}', lines={}-{}",
107
+ i,
108
+ block.node_type,
109
+ block.start_row + 1,
110
+ block.end_row + 1
111
+ );
112
+ }
113
+
114
+ // Comments should be extended to their parent contexts
115
+ assert!(
116
+ result.iter().any(|block| {
117
+ (block.node_type == "function_declaration"
118
+ || block.node_type == "function"
119
+ || block.node_type == "statement_block")
120
+ && block.start_row <= 4
121
+ && block.end_row >= 4
122
+ && block.end_row > block.start_row
123
+ }),
124
+ "JavaScript function comment should be extended to parent function or block, got: {:?}",
125
+ result
126
+ .iter()
127
+ .map(|b| (&b.node_type, b.start_row + 1, b.end_row + 1))
128
+ .collect::<Vec<_>>()
129
+ );
130
+
131
+ // Note: The primary goal is that most comments get extended context.
132
+ // Some comments (like property identifiers) may remain single-line, which is acceptable.
133
+ // We mainly want to ensure function-level comments are extended.
134
+ let function_comment_extended = result.iter().any(|block| {
135
+ block.node_type == "statement_block"
136
+ && block.start_row <= 4
137
+ && block.end_row >= 4
138
+ && block.end_row > block.start_row
139
+ });
140
+ assert!(
141
+ function_comment_extended,
142
+ "JavaScript function comments should be extended, got: {:?}",
143
+ result
144
+ .iter()
145
+ .map(|b| (&b.node_type, b.start_row + 1, b.end_row + 1))
146
+ .collect::<Vec<_>>()
147
+ );
148
+
149
+ Ok(())
150
+ }
151
+
152
+ #[test]
153
+ fn test_python_line_comment_context_extension() -> Result<()> {
154
+ let python_code = r#"
155
+ def calculate_score(points):
156
+ total = sum(points)
157
+ average = total / len(points) # calculate average
158
+ return average * 1.2 # apply bonus multiplier
159
+
160
+ class ScoreCalculator:
161
+ def __init__(self):
162
+ self.bonus = 1.5 # default bonus factor
163
+
164
+ def process(self, data):
165
+ return data * self.bonus # apply bonus
166
+ "#;
167
+
168
+ let mut line_numbers = HashSet::new();
169
+ line_numbers.insert(4); // Line with "# calculate average"
170
+ line_numbers.insert(5); // Line with "# apply bonus multiplier"
171
+ line_numbers.insert(9); // Line with "# default bonus factor"
172
+ line_numbers.insert(12); // Line with "# apply bonus"
173
+
174
+ let result = parse_file_for_code_blocks(python_code, "py", &line_numbers, true, None)?;
175
+
176
+ println!("Python results:");
177
+ for (i, block) in result.iter().enumerate() {
178
+ println!(
179
+ " Block {}: type='{}', lines={}-{}",
180
+ i,
181
+ block.node_type,
182
+ block.start_row + 1,
183
+ block.end_row + 1
184
+ );
185
+ }
186
+
187
+ // Comments should be extended to their parent contexts
188
+ assert!(
189
+ result.iter().any(|block| {
190
+ (block.node_type == "function_definition"
191
+ || block.node_type == "function"
192
+ || block.node_type == "block")
193
+ && block.start_row <= 4
194
+ && block.end_row >= 4
195
+ && block.end_row > block.start_row
196
+ }),
197
+ "Python function comment should be extended to parent function or block, got: {:?}",
198
+ result
199
+ .iter()
200
+ .map(|b| (&b.node_type, b.start_row + 1, b.end_row + 1))
201
+ .collect::<Vec<_>>()
202
+ );
203
+
204
+ // Note: The primary goal is that most comments get extended context.
205
+ // Some comments may remain single-line, which is acceptable.
206
+ // We mainly want to ensure function-level comments are extended.
207
+ let function_comment_extended = result.iter().any(|block| {
208
+ block.node_type == "block"
209
+ && block.start_row <= 4
210
+ && block.end_row >= 4
211
+ && block.end_row > block.start_row
212
+ });
213
+ assert!(
214
+ function_comment_extended,
215
+ "Python function comments should be extended, got: {:?}",
216
+ result
217
+ .iter()
218
+ .map(|b| (&b.node_type, b.start_row + 1, b.end_row + 1))
219
+ .collect::<Vec<_>>()
220
+ );
221
+
222
+ Ok(())
223
+ }
224
+
225
+ #[test]
226
+ fn test_typescript_line_comment_context_extension() -> Result<()> {
227
+ let ts_code = r#"
228
+ interface User {
229
+ name: string;
230
+ age: number; // user's age in years
231
+ }
232
+
233
+ function processUser(user: User): string {
234
+ return `${user.name}: ${user.age}`; // format user info
235
+ }
236
+
237
+ class UserManager {
238
+ private users: User[] = []; // internal user storage
239
+
240
+ addUser(user: User): void {
241
+ this.users.push(user); // add to collection
242
+ }
243
+ }
244
+ "#;
245
+
246
+ let mut line_numbers = HashSet::new();
247
+ line_numbers.insert(4); // Line with "// user's age in years"
248
+ line_numbers.insert(8); // Line with "// format user info"
249
+ line_numbers.insert(12); // Line with "// internal user storage"
250
+ line_numbers.insert(15); // Line with "// add to collection"
251
+
252
+ let result = parse_file_for_code_blocks(ts_code, "ts", &line_numbers, true, None)?;
253
+
254
+ println!("TypeScript results:");
255
+ for (i, block) in result.iter().enumerate() {
256
+ println!(
257
+ " Block {}: type='{}', lines={}-{}",
258
+ i,
259
+ block.node_type,
260
+ block.start_row + 1,
261
+ block.end_row + 1
262
+ );
263
+ }
264
+
265
+ // Comments should be extended to their parent contexts
266
+ assert!(
267
+ result.iter().any(|block| {
268
+ block.node_type == "interface_declaration"
269
+ && block.start_row <= 4
270
+ && block.end_row >= 4
271
+ && block.end_row > block.start_row
272
+ }),
273
+ "TypeScript interface comment should be extended to parent interface"
274
+ );
275
+
276
+ assert!(
277
+ result.iter().any(|block| {
278
+ (block.node_type == "function_declaration" || block.node_type == "function")
279
+ && block.start_row <= 8
280
+ && block.end_row >= 8
281
+ && block.end_row > block.start_row
282
+ }),
283
+ "TypeScript function comment should be extended to parent function"
284
+ );
285
+
286
+ Ok(())
287
+ }
288
+
289
+ #[test]
290
+ fn test_go_line_comment_context_extension() -> Result<()> {
291
+ let go_code = r#"
292
+ package main
293
+
294
+ func calculateTotal(prices []float64) float64 {
295
+ var total float64
296
+ for _, price := range prices {
297
+ total += price // accumulate total
298
+ }
299
+ return total * 1.1 // add 10% tax
300
+ }
301
+
302
+ type Calculator struct {
303
+ taxRate float64 // tax rate as decimal
304
+ }
305
+
306
+ func (c *Calculator) Process(value float64) float64 {
307
+ return value * c.taxRate // apply tax rate
308
+ }
309
+ "#;
310
+
311
+ let mut line_numbers = HashSet::new();
312
+ line_numbers.insert(7); // Line with "// accumulate total"
313
+ line_numbers.insert(9); // Line with "// add 10% tax"
314
+ line_numbers.insert(13); // Line with "// tax rate as decimal"
315
+ line_numbers.insert(17); // Line with "// apply tax rate"
316
+
317
+ let result = parse_file_for_code_blocks(go_code, "go", &line_numbers, true, None)?;
318
+
319
+ println!("Go results:");
320
+ for (i, block) in result.iter().enumerate() {
321
+ println!(
322
+ " Block {}: type='{}', lines={}-{}",
323
+ i,
324
+ block.node_type,
325
+ block.start_row + 1,
326
+ block.end_row + 1
327
+ );
328
+ }
329
+
330
+ // Comments should be extended to their parent contexts
331
+ assert!(
332
+ result.iter().any(|block| {
333
+ (block.node_type == "function_declaration" || block.node_type == "func_declaration")
334
+ && block.start_row <= 7
335
+ && block.end_row >= 7
336
+ && block.end_row > block.start_row
337
+ }),
338
+ "Go function comment should be extended to parent function"
339
+ );
340
+
341
+ assert!(
342
+ result.iter().any(|block| {
343
+ (block.node_type == "type_declaration" || block.node_type == "struct_type")
344
+ && block.start_row <= 13
345
+ && block.end_row >= 13
346
+ && block.end_row > block.start_row
347
+ }),
348
+ "Go struct comment should be extended to parent type"
349
+ );
350
+
351
+ Ok(())
352
+ }
353
+
354
+ #[test]
355
+ fn test_java_line_comment_context_extension() -> Result<()> {
356
+ let java_code = r#"
357
+ public class Calculator {
358
+ private double rate = 0.1; // default tax rate
359
+
360
+ public double calculate(double amount) {
361
+ return amount * (1 + rate); // apply tax rate
362
+ }
363
+
364
+ public static void main(String[] args) {
365
+ Calculator calc = new Calculator();
366
+ double result = calc.calculate(100.0); // test calculation
367
+ System.out.println(result);
368
+ }
369
+ }
370
+ "#;
371
+
372
+ let mut line_numbers = HashSet::new();
373
+ line_numbers.insert(3); // Line with "// default tax rate"
374
+ line_numbers.insert(6); // Line with "// apply tax rate"
375
+ line_numbers.insert(11); // Line with "// test calculation"
376
+
377
+ let result = parse_file_for_code_blocks(java_code, "java", &line_numbers, true, None)?;
378
+
379
+ println!("Java results:");
380
+ for (i, block) in result.iter().enumerate() {
381
+ println!(
382
+ " Block {}: type='{}', lines={}-{}",
383
+ i,
384
+ block.node_type,
385
+ block.start_row + 1,
386
+ block.end_row + 1
387
+ );
388
+ }
389
+
390
+ // Comments should be extended to their parent contexts
391
+ assert!(
392
+ result.iter().any(|block| {
393
+ (block.node_type == "class_declaration" || block.node_type == "method_declaration")
394
+ && block.start_row <= 3
395
+ && block.end_row >= 3
396
+ && block.end_row > block.start_row
397
+ }),
398
+ "Java class field comment should be extended to parent class or method, got: {:?}",
399
+ result
400
+ .iter()
401
+ .map(|b| (&b.node_type, b.start_row + 1, b.end_row + 1))
402
+ .collect::<Vec<_>>()
403
+ );
404
+
405
+ assert!(
406
+ result.iter().any(|block| {
407
+ (block.node_type == "method_declaration"
408
+ || block.node_type == "function"
409
+ || block.node_type == "block")
410
+ && block.start_row <= 6
411
+ && block.end_row >= 6
412
+ && block.end_row > block.start_row
413
+ }),
414
+ "Java method comment should be extended to parent method or block, got: {:?}",
415
+ result
416
+ .iter()
417
+ .map(|b| (&b.node_type, b.start_row + 1, b.end_row + 1))
418
+ .collect::<Vec<_>>()
419
+ );
420
+
421
+ Ok(())
422
+ }
423
+
424
+ /// Test that verifies line comments are NOT returned as single-line blocks
425
+ /// This is the core issue - line comments should always be extended to their parent context
426
+ #[test]
427
+ fn test_no_single_line_comment_blocks() -> Result<()> {
428
+ let rust_code = r#"
429
+ fn example() {
430
+ let x = 42; // this is a comment
431
+ println!("{}", x);
432
+ }
433
+ "#;
434
+
435
+ let mut line_numbers = HashSet::new();
436
+ line_numbers.insert(3); // Line with comment
437
+
438
+ let result = parse_file_for_code_blocks(rust_code, "rs", &line_numbers, true, None)?;
439
+
440
+ // Verify no single-line blocks are returned for comment lines
441
+ for block in &result {
442
+ if block.start_row == 3 && block.end_row == 3 {
443
+ panic!(
444
+ "Found single-line block for comment line - this should not happen! Block type: {}",
445
+ block.node_type
446
+ );
447
+ }
448
+ }
449
+
450
+ // Should have at least one block that includes the comment line but extends beyond it
451
+ assert!(
452
+ result.iter().any(|block| {
453
+ block.start_row <= 3 && block.end_row >= 3 && block.end_row > block.start_row
454
+ }),
455
+ "Should have extended block containing the comment line"
456
+ );
457
+
458
+ Ok(())
459
+ }
@@ -0,0 +1,114 @@
1
+ use probe_code::language::parser::parse_file_for_code_blocks;
2
+ use std::collections::HashSet;
3
+
4
+ #[test]
5
+ fn test_line_map_cache() {
6
+ // Set up test content
7
+ let content = r#"
8
+ fn test_function() {
9
+ // This is a comment
10
+ let x = 42;
11
+ println!("Hello, world!");
12
+ }
13
+
14
+ struct TestStruct {
15
+ field1: i32,
16
+ field2: String,
17
+ }
18
+ "#;
19
+
20
+ // Create a set of line numbers to extract
21
+ let mut line_numbers = HashSet::new();
22
+ line_numbers.insert(3); // Comment line
23
+ line_numbers.insert(4); // Code line
24
+ line_numbers.insert(8); // Struct field line
25
+
26
+ // First call should be a cache miss
27
+ let result1 = parse_file_for_code_blocks(content, "rs", &line_numbers, true, None).unwrap();
28
+
29
+ // Print result1 details
30
+ println!("Cache miss result (result1) - {} blocks:", result1.len());
31
+ for (i, block) in result1.iter().enumerate() {
32
+ println!(
33
+ " Block {}: type='{}', lines={}-{}",
34
+ i,
35
+ block.node_type,
36
+ block.start_row + 1,
37
+ block.end_row + 1
38
+ );
39
+ }
40
+
41
+ // Second call should be a cache hit
42
+ let result2 = parse_file_for_code_blocks(content, "rs", &line_numbers, true, None).unwrap();
43
+
44
+ // Print result2 details
45
+ println!("Cache hit result (result2) - {} blocks:", result2.len());
46
+ for (i, block) in result2.iter().enumerate() {
47
+ println!(
48
+ " Block {}: type='{}', lines={}-{}",
49
+ i,
50
+ block.node_type,
51
+ block.start_row + 1,
52
+ block.end_row + 1
53
+ );
54
+ }
55
+
56
+ // Assert that the results from cache miss and cache hit are identical
57
+ assert_eq!(
58
+ result1, result2,
59
+ "Cache miss and cache hit results should be identical"
60
+ );
61
+
62
+ // Test with different allow_tests flag
63
+ let result3 = parse_file_for_code_blocks(content, "rs", &line_numbers, false, None).unwrap();
64
+
65
+ // Should be a different cache entry, but results should be similar since there are no tests
66
+ // Check that result3 covers all requested lines
67
+ let requested_lines: Vec<usize> = line_numbers.iter().cloned().collect(); // Define requested_lines here
68
+ for &line in &requested_lines {
69
+ let line_covered = result3
70
+ .iter()
71
+ .any(|block| line > block.start_row && line <= block.end_row + 1);
72
+ assert!(
73
+ line_covered,
74
+ "Line {line} not covered by any block in result3"
75
+ );
76
+ }
77
+ }
78
+
79
+ #[test]
80
+ fn test_line_map_cache_with_different_content() {
81
+ // Set up test content
82
+ let content1 = r#"
83
+ fn test_function() {
84
+ // This is a comment
85
+ let x = 42;
86
+ }
87
+ "#;
88
+
89
+ let content2 = r#"
90
+ fn test_function() {
91
+ // This is a different comment
92
+ let x = 100;
93
+ }
94
+ "#;
95
+
96
+ // Create a set of line numbers to extract
97
+ let mut line_numbers = HashSet::new();
98
+ line_numbers.insert(3); // Comment line
99
+
100
+ // First call with content1
101
+ let result1 = parse_file_for_code_blocks(content1, "rs", &line_numbers, true, None).unwrap();
102
+
103
+ // Second call with content2 (should be a cache miss due to different content)
104
+ let result2 = parse_file_for_code_blocks(content2, "rs", &line_numbers, true, None).unwrap();
105
+
106
+ // Results should be different (different comment text)
107
+ assert_eq!(result1.len(), result2.len()); // Same number of blocks
108
+ assert_eq!(result1[0].start_row, result2[0].start_row); // Same start row
109
+ assert_eq!(result1[0].end_row, result2[0].end_row); // Same end row
110
+ assert_eq!(result1[0].node_type, result2[0].node_type); // Same node type
111
+
112
+ // But the content is different, which we can't directly test here since we don't have access to the content
113
+ // In a real-world scenario, the extracted code blocks would contain different text
114
+ }