@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,698 @@
1
+ use probe_code::path_resolver::{
2
+ resolve_path, GoPathResolver, JavaScriptPathResolver, PathResolver, RustPathResolver,
3
+ };
4
+ use std::fs;
5
+ use std::path::PathBuf;
6
+ use std::process::Command;
7
+
8
+ // Helper function to check if node is installed and a module exists
9
+ fn check_js_module(module: &str) -> bool {
10
+ if Command::new("node").arg("--version").output().is_err() {
11
+ return false;
12
+ }
13
+ let script = format!("try {{ require.resolve('{module}/package.json'); process.exit(0); }} catch (e) {{ process.exit(1); }}");
14
+ Command::new("node")
15
+ .arg("-e")
16
+ .arg(&script)
17
+ .status()
18
+ .is_ok_and(|s| s.success())
19
+ }
20
+
21
+ // Helper function to check if go is installed and a module exists
22
+ fn check_go_module(module: &str) -> bool {
23
+ if Command::new("go").arg("version").output().is_err() {
24
+ return false;
25
+ }
26
+ Command::new("go")
27
+ .args(["list", module])
28
+ .status()
29
+ .is_ok_and(|s| s.success())
30
+ }
31
+
32
+ #[test]
33
+ fn test_regular_path_no_prefix() {
34
+ // Use a relative path that should exist
35
+ let path = "Cargo.toml"; // Assumes test runs from project root
36
+ let result = resolve_path(path);
37
+ assert!(result.is_ok());
38
+ // Expect it to be returned as is
39
+ assert_eq!(result.unwrap(), PathBuf::from(path));
40
+
41
+ // Test with an absolute path (use temp dir for reliability)
42
+ let temp_dir = tempfile::tempdir().unwrap();
43
+ let abs_path_str = temp_dir
44
+ .path()
45
+ .join("somefile")
46
+ .to_str()
47
+ .unwrap()
48
+ .to_string();
49
+ let result_abs = resolve_path(&abs_path_str);
50
+ assert!(result_abs.is_ok());
51
+ assert_eq!(result_abs.unwrap(), PathBuf::from(&abs_path_str));
52
+ }
53
+
54
+ // --- Go Tests ---
55
+
56
+ #[test]
57
+ fn test_go_stdlib_resolution_no_subpath() {
58
+ if !check_go_module("fmt") {
59
+ println!("Skipping test_go_stdlib_resolution_no_subpath: Go or 'fmt' module not available");
60
+ return;
61
+ }
62
+ let result = resolve_path("go:fmt");
63
+ assert!(result.is_ok(), "Failed to resolve 'go:fmt': {result:?}");
64
+ let path = result.unwrap();
65
+ assert!(path.exists(), "Path does not exist: {path:?}");
66
+ assert!(path.is_dir(), "Path is not a directory: {path:?}");
67
+ assert!(
68
+ path.join("print.go").exists(),
69
+ "fmt/print.go not found in {path:?}"
70
+ ); // Check a known file
71
+ }
72
+
73
+ #[test]
74
+ fn test_go_stdlib_resolution_with_subpath_file() {
75
+ if !check_go_module("net/http") {
76
+ // Need a stdlib package with known files/subdirs
77
+ println!(
78
+ "Skipping test_go_stdlib_resolution_with_subpath_file: Go or 'net/http' not available"
79
+ );
80
+ return;
81
+ }
82
+ let result = resolve_path("go:net/http/server.go"); // Path is module=net/http, sub=server.go
83
+ assert!(
84
+ result.is_ok(),
85
+ "Failed to resolve 'go:net/http/server.go': {result:?}"
86
+ );
87
+ let path = result.unwrap();
88
+ assert!(path.exists(), "Path does not exist: {path:?}");
89
+ assert!(path.is_file(), "Path is not a file: {path:?}");
90
+ assert_eq!(path.file_name().unwrap(), "server.go");
91
+ }
92
+
93
+ #[test]
94
+ fn test_go_stdlib_resolution_with_subpath_dir() {
95
+ if !check_go_module("net/http/pprof") {
96
+ // Check if pprof sub-package is resolvable
97
+ println!("Skipping test_go_stdlib_resolution_with_subpath_dir: Go or 'net/http/pprof' not available");
98
+ return;
99
+ }
100
+ // Our current heuristic treats "net/http/pprof" as the module. Let's test that directly first.
101
+ let result_mod = resolve_path("go:net/http/pprof");
102
+ assert!(
103
+ result_mod.is_ok(),
104
+ "Failed to resolve 'go:net/http/pprof' as module: {result_mod:?}"
105
+ );
106
+ let path_mod = result_mod.unwrap();
107
+ assert!(path_mod.exists(), "Path does not exist: {path_mod:?}");
108
+ assert!(path_mod.is_dir(), "Path is not a directory: {path_mod:?}");
109
+ assert!(
110
+ path_mod.join("pprof.go").exists(),
111
+ "pprof.go not found in {path_mod:?}"
112
+ );
113
+ }
114
+
115
+ #[test]
116
+ fn test_go_external_resolution_no_subpath() {
117
+ let module = "github.com/stretchr/testify";
118
+ if !check_go_module(module) {
119
+ println!("Skipping test_go_external_resolution_no_subpath: Go or '{module}' not available");
120
+ return;
121
+ }
122
+ let result = resolve_path(&format!("go:{module}"));
123
+ assert!(
124
+ result.is_ok(),
125
+ "Failed to resolve 'go:{module}': {result:?}"
126
+ );
127
+ let path = result.unwrap();
128
+ assert!(path.exists(), "Path does not exist: {path:?}");
129
+ assert!(path.is_dir(), "Path is not a directory: {path:?}");
130
+ assert!(
131
+ path.join("assert").exists(),
132
+ "'assert' subdir not found in {path:?}"
133
+ ); // Check subdir
134
+ }
135
+
136
+ #[test]
137
+ fn test_go_external_resolution_with_subpath() {
138
+ let module = "github.com/stretchr/testify";
139
+ let subpath = "assert";
140
+ let full_module_path = format!("{module}/{subpath}"); // e.g. github.com/stretchr/testify/assert
141
+ if !check_go_module(&full_module_path) {
142
+ // Check if the sub-package itself is resolvable by go list
143
+ if !check_go_module(module) {
144
+ // If not, check if base module exists before skipping entirely
145
+ println!("Skipping test_go_external_resolution_with_subpath: Go or base module '{module}' not available");
146
+ return;
147
+ }
148
+ // Base module exists, but sub-package doesn't resolve directly. Our split logic should handle this.
149
+ println!(
150
+ "Note: '{full_module_path}' not directly resolvable by 'go list', testing split logic."
151
+ );
152
+ } else if !check_go_module(module) {
153
+ println!("Skipping test_go_external_resolution_with_subpath: Go or base module '{module}' not available");
154
+ return;
155
+ }
156
+
157
+ let input_path = format!("go:{module}/{subpath}"); // "go:github.com/stretchr/testify/assert"
158
+ let result = resolve_path(&input_path);
159
+ assert!(
160
+ result.is_ok(),
161
+ "Failed to resolve '{input_path}': {result:?}"
162
+ );
163
+ let path = result.unwrap();
164
+ assert!(path.exists(), "Path does not exist: {path:?}");
165
+ assert!(path.is_dir(), "Path is not a directory: {path:?}"); // assert is a directory
166
+ assert!(
167
+ path.file_name().unwrap() == subpath,
168
+ "Path should end with '{subpath}': {path:?}"
169
+ );
170
+ assert!(
171
+ path.join("assertions.go").exists(),
172
+ "assertions.go not found in {path:?}"
173
+ ); // Check known file
174
+ }
175
+
176
+ #[test]
177
+ fn test_go_nonexistent_package() {
178
+ if Command::new("go").arg("version").output().is_err() {
179
+ println!("Skipping test_go_nonexistent_package: Go not installed");
180
+ return;
181
+ }
182
+ let result = resolve_path("go:nonexistent_gopkg_xyz_123_abc");
183
+ assert!(
184
+ result.is_err(),
185
+ "Expected error for non-existent package, got Ok: {result:?}"
186
+ );
187
+ }
188
+
189
+ // --- JavaScript Tests ---
190
+
191
+ #[test]
192
+ fn test_js_resolution_no_subpath() {
193
+ // Use a commonly installed package like 'npm' itself or a dev dependency
194
+ let module = "npm"; // Or change to a dev dep of *this* project if available
195
+ if !check_js_module(module) {
196
+ println!("Skipping test_js_resolution_no_subpath: Node or '{module}' module not available");
197
+ return;
198
+ }
199
+ let result = resolve_path(&format!("js:{module}"));
200
+ assert!(
201
+ result.is_ok(),
202
+ "Failed to resolve 'js:{module}': {result:?}"
203
+ );
204
+ let path = result.unwrap();
205
+ assert!(path.exists(), "Path does not exist: {path:?}");
206
+ assert!(path.is_dir(), "Path is not a directory: {path:?}");
207
+ assert!(
208
+ path.join("package.json").exists(),
209
+ "package.json not found in {path:?}"
210
+ );
211
+ }
212
+
213
+ #[test]
214
+ fn test_js_resolution_with_subpath_file() {
215
+ let module = "npm"; // Assuming npm has a known file/structure
216
+ let subpath = "index.js"; // Common entry point, might exist
217
+ if !check_js_module(module) {
218
+ println!(
219
+ "Skipping test_js_resolution_with_subpath_file: Node or '{module}' module not available"
220
+ );
221
+ return;
222
+ }
223
+
224
+ let input_path = format!("js:{module}/{subpath}");
225
+ let result = resolve_path(&input_path);
226
+
227
+ // Check if the subpath *actually* exists before asserting Ok
228
+ let expected_path = match resolve_path(&format!("js:{module}")) {
229
+ Ok(p) => p.join(subpath),
230
+ Err(_) => {
231
+ // Can't resolve base module
232
+ println!(
233
+ "Skipping test_js_resolution_with_subpath_file: Cannot resolve base module '{module}'"
234
+ );
235
+ return;
236
+ }
237
+ };
238
+
239
+ if !expected_path.exists() {
240
+ println!("Skipping test_js_resolution_with_subpath_file: Expected subpath '{}' does not exist in module '{}'", expected_path.display(), module);
241
+ // Optional: Assert error instead? Or just skip? Let's skip.
242
+ return;
243
+ }
244
+
245
+ assert!(
246
+ result.is_ok(),
247
+ "Failed to resolve '{input_path}': {result:?}"
248
+ );
249
+ let path = result.unwrap();
250
+ assert!(path.exists(), "Path does not exist: {path:?}");
251
+ assert!(path.is_file(), "Path is not a file: {path:?}"); // Check if it's a file
252
+ assert!(
253
+ path.file_name().unwrap() == subpath,
254
+ "Path should end with '{subpath}': {path:?}"
255
+ );
256
+ }
257
+
258
+ #[test]
259
+ fn test_js_resolution_with_subpath_dir() {
260
+ let module = "npm";
261
+ let subpath = "lib"; // npm usually has a lib directory
262
+ if !check_js_module(module) {
263
+ println!(
264
+ "Skipping test_js_resolution_with_subpath_dir: Node or '{module}' module not available"
265
+ );
266
+ return;
267
+ }
268
+
269
+ let input_path = format!("js:{module}/{subpath}");
270
+ let result = resolve_path(&input_path);
271
+
272
+ // Check if the subpath *actually* exists
273
+ let expected_path = match resolve_path(&format!("js:{module}")) {
274
+ Ok(p) => p.join(subpath),
275
+ Err(_) => {
276
+ println!(
277
+ "Skipping test_js_resolution_with_subpath_dir: Cannot resolve base module '{module}'"
278
+ );
279
+ return;
280
+ }
281
+ };
282
+ if !expected_path.exists() || !expected_path.is_dir() {
283
+ println!("Skipping test_js_resolution_with_subpath_dir: Expected subpath dir '{}' does not exist in module '{}'", expected_path.display(), module);
284
+ return;
285
+ }
286
+
287
+ assert!(
288
+ result.is_ok(),
289
+ "Failed to resolve '{input_path}': {result:?}"
290
+ );
291
+ let path = result.unwrap();
292
+ assert!(path.exists(), "Path does not exist: {path:?}");
293
+ assert!(path.is_dir(), "Path is not a directory: {path:?}");
294
+ assert!(
295
+ path.file_name().unwrap() == subpath,
296
+ "Path should end with '{subpath}': {path:?}"
297
+ );
298
+ }
299
+
300
+ #[test]
301
+ fn test_js_scoped_resolution_no_subpath() {
302
+ // Requires a globally or locally installed scoped package
303
+ let module = "@npmcli/config"; // Example, check if installed
304
+ if !check_js_module(module) {
305
+ println!(
306
+ "Skipping test_js_scoped_resolution_no_subpath: Node or '{module}' module not available"
307
+ );
308
+ return;
309
+ }
310
+ let result = resolve_path(&format!("js:{module}"));
311
+ assert!(
312
+ result.is_ok(),
313
+ "Failed to resolve 'js:{module}': {result:?}"
314
+ );
315
+ let path = result.unwrap();
316
+ assert!(path.exists(), "Path does not exist: {path:?}");
317
+ assert!(path.is_dir(), "Path is not a directory: {path:?}");
318
+ assert!(
319
+ path.join("package.json").exists(),
320
+ "package.json not found in {path:?}"
321
+ );
322
+ }
323
+
324
+ #[test]
325
+ fn test_js_scoped_resolution_with_subpath() {
326
+ let module = "@npmcli/config";
327
+ let subpath = "lib/index.js"; // Check actual structure if test fails
328
+ if !check_js_module(module) {
329
+ println!(
330
+ "Skipping test_js_scoped_resolution_with_subpath: Node or '{module}' module not available"
331
+ );
332
+ return;
333
+ }
334
+
335
+ let input_path = format!("js:{module}/{subpath}");
336
+ let result = resolve_path(&input_path);
337
+
338
+ // Check if the subpath *actually* exists
339
+ let expected_path = match resolve_path(&format!("js:{module}")) {
340
+ Ok(p) => p.join(subpath),
341
+ Err(_) => {
342
+ println!(
343
+ "Skipping test_js_scoped_resolution_with_subpath: Cannot resolve base module '{module}'"
344
+ );
345
+ return;
346
+ }
347
+ };
348
+ if !expected_path.exists() {
349
+ println!("Skipping test_js_scoped_resolution_with_subpath: Expected subpath '{}' does not exist in module '{}'", expected_path.display(), module);
350
+ return;
351
+ }
352
+
353
+ assert!(
354
+ result.is_ok(),
355
+ "Failed to resolve '{input_path}': {result:?}"
356
+ );
357
+ let path = result.unwrap();
358
+ assert!(path.exists(), "Path does not exist: {path:?}");
359
+ // assert!(path.is_file(), "Path is not a file: {:?}", path); // Adjust if subpath is dir
360
+ assert!(
361
+ path.ends_with(subpath.replace('/', std::path::MAIN_SEPARATOR_STR)),
362
+ "Path should end with '{subpath}': {path:?}"
363
+ );
364
+ }
365
+
366
+ #[test]
367
+ fn test_js_nonexistent_package() {
368
+ if Command::new("node").arg("--version").output().is_err() {
369
+ println!("Skipping test_js_nonexistent_package: Node not installed");
370
+ return;
371
+ }
372
+ let result = resolve_path("js:nonexistent_jspkg_xyz_123_abc");
373
+ assert!(
374
+ result.is_err(),
375
+ "Expected error for non-existent package, got Ok: {result:?}"
376
+ );
377
+
378
+ // The error message might vary depending on the environment, so just check that it's an error
379
+ let err_msg = result.unwrap_err();
380
+ println!("Error message for nonexistent JS package: {err_msg}");
381
+ // Could contain "not found", "Cannot find module", "Failed to resolve", etc.
382
+ }
383
+
384
+ // --- Rust Tests ---
385
+
386
+ #[test]
387
+ fn test_rust_resolution() {
388
+ // Create a temporary directory with a Cargo.toml file
389
+ let temp_dir = tempfile::tempdir().unwrap();
390
+ let crate_root = temp_dir.path();
391
+ let cargo_toml_path = crate_root.join("Cargo.toml");
392
+
393
+ // Write a minimal Cargo.toml
394
+ fs::write(
395
+ &cargo_toml_path,
396
+ r#"[package]
397
+ name = "test-crate"
398
+ version = "0.1.0"
399
+ edition = "2021"
400
+ "#,
401
+ )
402
+ .expect("Failed to write Cargo.toml");
403
+
404
+ // Test with the path to the Cargo.toml file
405
+ // Use canonicalize to handle potential relative path issues in tests
406
+ let canonical_toml_path = fs::canonicalize(&cargo_toml_path).unwrap();
407
+ let path_str = format!("rust:{}", canonical_toml_path.to_str().unwrap());
408
+ let result = resolve_path(&path_str);
409
+
410
+ assert!(result.is_ok(), "Failed to resolve rust: path: {result:?}");
411
+ // Expect the parent directory of the Cargo.toml
412
+ let expected_path = fs::canonicalize(crate_root).unwrap();
413
+ assert_eq!(result.unwrap(), expected_path);
414
+ }
415
+
416
+ #[test]
417
+ fn test_rust_nonexistent_toml() {
418
+ let path_str = "rust:/non/existent/path/to/Cargo.toml";
419
+ let result = resolve_path(path_str);
420
+ assert!(
421
+ result.is_err(),
422
+ "Expected error for non-existent Cargo.toml, got Ok: {result:?}"
423
+ );
424
+ }
425
+
426
+ #[test]
427
+ fn test_rust_path_is_not_toml() {
428
+ // Create a temporary directory
429
+ let temp_dir = tempfile::tempdir().unwrap();
430
+ let dir_path = temp_dir.path();
431
+ let canonical_dir_path = fs::canonicalize(dir_path).unwrap();
432
+ let path_str = format!("rust:{}", canonical_dir_path.to_str().unwrap()); // Path to dir, not file
433
+
434
+ let result = resolve_path(&path_str);
435
+ // Resolve should fail because the path is not a file
436
+ assert!(
437
+ result.is_err(),
438
+ "Expected error for path not pointing to a file, got Ok: {result:?}"
439
+ );
440
+ }
441
+
442
+ // --- Dep Prefix Tests ---
443
+
444
+ #[test]
445
+ fn test_dep_go_resolution() {
446
+ if !check_go_module("fmt") {
447
+ println!("Skipping test_dep_go_resolution: Go or 'fmt' module not available");
448
+ return;
449
+ }
450
+
451
+ // Test with standard library package using /dep/go prefix
452
+ let result = resolve_path("/dep/go/fmt");
453
+
454
+ // Compare with traditional go: prefix
455
+ let traditional_result = resolve_path("go:fmt");
456
+
457
+ assert!(
458
+ result.is_ok(),
459
+ "Failed to resolve '/dep/go/fmt': {result:?}"
460
+ );
461
+ assert!(
462
+ traditional_result.is_ok(),
463
+ "Failed to resolve 'go:fmt': {traditional_result:?}"
464
+ );
465
+
466
+ // Both paths should resolve to the same location
467
+ assert_eq!(result.unwrap(), traditional_result.unwrap());
468
+ }
469
+
470
+ #[test]
471
+ fn test_dep_js_resolution() {
472
+ let module = "npm"; // Or change to a dev dep of *this* project if available
473
+ if !check_js_module(module) {
474
+ println!("Skipping test_dep_js_resolution: Node or '{module}' module not available");
475
+ return;
476
+ }
477
+
478
+ // Test with npm package using /dep/js prefix
479
+ let result = resolve_path(&format!("/dep/js/{module}"));
480
+
481
+ // Compare with traditional js: prefix
482
+ let traditional_result = resolve_path(&format!("js:{module}"));
483
+
484
+ assert!(
485
+ result.is_ok(),
486
+ "Failed to resolve '/dep/js/{module}': {result:?}"
487
+ );
488
+ assert!(
489
+ traditional_result.is_ok(),
490
+ "Failed to resolve 'js:{module}': {traditional_result:?}"
491
+ );
492
+
493
+ // Both paths should resolve to the same location
494
+ assert_eq!(result.unwrap(), traditional_result.unwrap());
495
+ }
496
+
497
+ #[test]
498
+ fn test_dep_rust_resolution() {
499
+ // Create a temporary directory with a Cargo.toml file
500
+ let temp_dir = tempfile::tempdir().unwrap();
501
+ let crate_root = temp_dir.path();
502
+ let cargo_toml_path = crate_root.join("Cargo.toml");
503
+
504
+ // Write a minimal Cargo.toml
505
+ fs::write(
506
+ &cargo_toml_path,
507
+ r#"[package]
508
+ name = "test-crate"
509
+ version = "0.1.0"
510
+ edition = "2021"
511
+ "#,
512
+ )
513
+ .expect("Failed to write Cargo.toml");
514
+
515
+ // Use canonicalize to handle potential relative path issues in tests
516
+ let canonical_toml_path = fs::canonicalize(&cargo_toml_path).unwrap();
517
+
518
+ // Test with /dep/rust prefix
519
+ let dep_path_str = format!("/dep/rust/{}", canonical_toml_path.to_str().unwrap());
520
+ let result = resolve_path(&dep_path_str);
521
+
522
+ // Compare with traditional rust: prefix
523
+ let traditional_path_str = format!("rust:{}", canonical_toml_path.to_str().unwrap());
524
+ let traditional_result = resolve_path(&traditional_path_str);
525
+
526
+ assert!(
527
+ result.is_ok(),
528
+ "Failed to resolve /dep/rust path: {result:?}"
529
+ );
530
+ assert!(
531
+ traditional_result.is_ok(),
532
+ "Failed to resolve rust: path: {traditional_result:?}"
533
+ );
534
+
535
+ // Both paths should resolve to the same location
536
+ assert_eq!(result.unwrap(), traditional_result.unwrap());
537
+ }
538
+
539
+ #[test]
540
+ fn test_invalid_dep_paths() {
541
+ // Test with invalid /dep/ path (missing language identifier)
542
+ let result = resolve_path("/dep/");
543
+ assert!(result.is_err());
544
+
545
+ // Test with unknown language identifier
546
+ let result = resolve_path("/dep/unknown/package");
547
+ assert!(result.is_err());
548
+
549
+ // Test with empty path after language identifier
550
+ let result = resolve_path("/dep/go/");
551
+ assert!(result.is_err());
552
+ }
553
+
554
+ // --- General/Error Tests ---
555
+ #[test]
556
+ fn test_invalid_prefix() {
557
+ let result = resolve_path("invalidprefix:some/path");
558
+ // Should be treated as a regular path
559
+ assert!(result.is_ok());
560
+ assert_eq!(result.unwrap(), PathBuf::from("invalidprefix:some/path"));
561
+ }
562
+
563
+ #[test]
564
+ fn test_empty_path_after_prefix_go() {
565
+ if Command::new("go").arg("version").output().is_err() {
566
+ return;
567
+ } // Skip if no go
568
+ let result = resolve_path("go:");
569
+ assert!(result.is_err());
570
+ assert!(result.unwrap_err().contains("cannot be empty"));
571
+ }
572
+
573
+ #[test]
574
+ fn test_empty_path_after_prefix_js() {
575
+ if Command::new("node").arg("--version").output().is_err() {
576
+ return;
577
+ } // Skip if no node
578
+ let result = resolve_path("js:");
579
+ assert!(result.is_err());
580
+ assert!(result.unwrap_err().contains("cannot be empty"));
581
+ }
582
+
583
+ #[test]
584
+ fn test_empty_path_after_prefix_rust() {
585
+ let result = resolve_path("rust:");
586
+ assert!(result.is_err());
587
+ assert!(result.unwrap_err().contains("cannot be empty"));
588
+ }
589
+
590
+ #[test]
591
+ fn test_path_with_dotdot_js() {
592
+ if Command::new("node").arg("--version").output().is_err() {
593
+ return;
594
+ } // Skip if no node
595
+ let result = resolve_path("js:lodash/../other");
596
+ assert!(result.is_err());
597
+ assert!(result.unwrap_err().contains("cannot contain '..'"));
598
+ }
599
+
600
+ #[test]
601
+ fn test_path_with_dotdot_go() {
602
+ if Command::new("go").arg("version").output().is_err() {
603
+ return;
604
+ } // Skip if no go
605
+ let result = resolve_path("go:fmt/../other");
606
+ assert!(result.is_err());
607
+ assert!(result.unwrap_err().contains("cannot contain '..'"));
608
+ }
609
+
610
+ // --- Split Module and Subpath Tests ---
611
+
612
+ #[test]
613
+ fn test_go_split_module_and_subpath() {
614
+ let resolver = GoPathResolver::new();
615
+
616
+ // Test stdlib
617
+ let (module, subpath) = resolver.split_module_and_subpath("fmt").unwrap();
618
+ assert_eq!(module, "fmt");
619
+ assert_eq!(subpath, None);
620
+
621
+ // Test stdlib with slashes
622
+ let (module, subpath) = resolver.split_module_and_subpath("net/http").unwrap();
623
+ assert_eq!(module, "net/http");
624
+ assert_eq!(subpath, None);
625
+
626
+ // Test GitHub repo
627
+ let (module, subpath) = resolver
628
+ .split_module_and_subpath("github.com/user/repo")
629
+ .unwrap();
630
+ assert_eq!(module, "github.com/user/repo");
631
+ assert_eq!(subpath, None);
632
+
633
+ // Test GitHub repo with subpath
634
+ let (module, subpath) = resolver
635
+ .split_module_and_subpath("github.com/user/repo/subpath")
636
+ .unwrap();
637
+ assert_eq!(module, "github.com/user/repo");
638
+ assert_eq!(subpath, Some("subpath".to_string()));
639
+
640
+ // Test GitHub repo with multi-segment subpath
641
+ let (module, subpath) = resolver
642
+ .split_module_and_subpath("github.com/user/repo/sub/path")
643
+ .unwrap();
644
+ assert_eq!(module, "github.com/user/repo");
645
+ assert_eq!(subpath, Some("sub/path".to_string()));
646
+
647
+ // Test error cases
648
+ assert!(resolver.split_module_and_subpath("").is_err());
649
+ assert!(resolver.split_module_and_subpath("fmt/../other").is_err());
650
+ }
651
+
652
+ #[test]
653
+ fn test_js_split_module_and_subpath() {
654
+ let resolver = JavaScriptPathResolver::new();
655
+
656
+ // Test regular package
657
+ let (module, subpath) = resolver.split_module_and_subpath("lodash").unwrap();
658
+ assert_eq!(module, "lodash");
659
+ assert_eq!(subpath, None);
660
+
661
+ // Test regular package with subpath
662
+ let (module, subpath) = resolver.split_module_and_subpath("lodash/get").unwrap();
663
+ assert_eq!(module, "lodash");
664
+ assert_eq!(subpath, Some("get".to_string()));
665
+
666
+ // Test scoped package
667
+ let (module, subpath) = resolver.split_module_and_subpath("@types/node").unwrap();
668
+ assert_eq!(module, "@types/node");
669
+ assert_eq!(subpath, None);
670
+
671
+ // Test scoped package with subpath
672
+ let (module, subpath) = resolver.split_module_and_subpath("@types/node/fs").unwrap();
673
+ assert_eq!(module, "@types/node");
674
+ assert_eq!(subpath, Some("fs".to_string()));
675
+
676
+ // Test error cases
677
+ assert!(resolver.split_module_and_subpath("").is_err());
678
+ assert!(resolver
679
+ .split_module_and_subpath("lodash/../other")
680
+ .is_err());
681
+ assert!(resolver.split_module_and_subpath("@types").is_err());
682
+ assert!(resolver.split_module_and_subpath("@/invalid").is_err());
683
+ }
684
+
685
+ #[test]
686
+ fn test_rust_split_module_and_subpath() {
687
+ let resolver = RustPathResolver::new();
688
+
689
+ // For Rust, the entire path is treated as the module identifier
690
+ let (module, subpath) = resolver
691
+ .split_module_and_subpath("/path/to/Cargo.toml")
692
+ .unwrap();
693
+ assert_eq!(module, "/path/to/Cargo.toml");
694
+ assert_eq!(subpath, None);
695
+
696
+ // Test error cases
697
+ assert!(resolver.split_module_and_subpath("").is_err());
698
+ }