@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,379 @@
1
+ import { describe, test, expect, beforeEach, afterEach, jest } from '@jest/globals';
2
+ import { ProbeAgent } from '../../src/agent/ProbeAgent.js';
3
+
4
+ describe('ProbeAgent completionPrompt option', () => {
5
+ describe('constructor configuration', () => {
6
+ test('should store completionPrompt option in constructor', () => {
7
+ const agent = new ProbeAgent({
8
+ completionPrompt: 'Please double-check your answer',
9
+ path: process.cwd()
10
+ });
11
+
12
+ expect(agent.completionPrompt).toBe('Please double-check your answer');
13
+ });
14
+
15
+ test('should default to null when no completionPrompt option provided', () => {
16
+ const agent = new ProbeAgent({
17
+ path: process.cwd()
18
+ });
19
+
20
+ expect(agent.completionPrompt).toBeNull();
21
+ });
22
+
23
+ test('should handle empty string completionPrompt as null', () => {
24
+ const agent = new ProbeAgent({
25
+ completionPrompt: '',
26
+ path: process.cwd()
27
+ });
28
+
29
+ // Empty string is falsy, so it becomes null due to || operator
30
+ expect(agent.completionPrompt).toBeNull();
31
+ });
32
+
33
+ test('should preserve multi-line completionPrompt', () => {
34
+ const multiLinePrompt = `Please review the response:
35
+ 1. Check for accuracy
36
+ 2. Verify completeness
37
+ 3. Ensure proper formatting`;
38
+
39
+ const agent = new ProbeAgent({
40
+ completionPrompt: multiLinePrompt,
41
+ path: process.cwd()
42
+ });
43
+
44
+ expect(agent.completionPrompt).toBe(multiLinePrompt);
45
+ });
46
+ });
47
+
48
+ describe('clone behavior', () => {
49
+ test('should preserve completionPrompt in clone', () => {
50
+ const baseAgent = new ProbeAgent({
51
+ completionPrompt: 'Verify your response',
52
+ path: process.cwd()
53
+ });
54
+
55
+ const cloned = baseAgent.clone();
56
+
57
+ expect(cloned.completionPrompt).toBe(baseAgent.completionPrompt);
58
+ expect(cloned.completionPrompt).toBe('Verify your response');
59
+ });
60
+
61
+ test('should preserve absence of completionPrompt in clone', () => {
62
+ const baseAgent = new ProbeAgent({
63
+ path: process.cwd()
64
+ // No completionPrompt specified
65
+ });
66
+
67
+ const cloned = baseAgent.clone();
68
+
69
+ expect(cloned.completionPrompt).toBeNull();
70
+ expect(baseAgent.completionPrompt).toBeNull();
71
+ });
72
+
73
+ test('should allow override of completionPrompt in clone', () => {
74
+ const baseAgent = new ProbeAgent({
75
+ completionPrompt: 'Original prompt',
76
+ path: process.cwd()
77
+ });
78
+
79
+ const cloned = baseAgent.clone({
80
+ overrides: {
81
+ completionPrompt: 'Overridden prompt'
82
+ }
83
+ });
84
+
85
+ expect(cloned.completionPrompt).toBe('Overridden prompt');
86
+ expect(baseAgent.completionPrompt).toBe('Original prompt');
87
+ });
88
+ });
89
+
90
+ describe('integration with other options', () => {
91
+ test('should work alongside other agent options', () => {
92
+ const agent = new ProbeAgent({
93
+ completionPrompt: 'Review the answer',
94
+ systemPrompt: 'You are a helpful assistant',
95
+ allowEdit: true,
96
+ enableBash: false,
97
+ debug: false,
98
+ path: process.cwd()
99
+ });
100
+
101
+ expect(agent.completionPrompt).toBe('Review the answer');
102
+ expect(agent.customPrompt).toBe('You are a helpful assistant');
103
+ expect(agent.allowEdit).toBe(true);
104
+ expect(agent.enableBash).toBe(false);
105
+ });
106
+
107
+ test('should work with schema option', () => {
108
+ const agent = new ProbeAgent({
109
+ completionPrompt: 'Verify JSON structure',
110
+ path: process.cwd()
111
+ });
112
+
113
+ expect(agent.completionPrompt).toBe('Verify JSON structure');
114
+ });
115
+
116
+ test('should work with disableMermaidValidation', () => {
117
+ const agent = new ProbeAgent({
118
+ completionPrompt: 'Check diagrams',
119
+ disableMermaidValidation: true,
120
+ path: process.cwd()
121
+ });
122
+
123
+ expect(agent.completionPrompt).toBe('Check diagrams');
124
+ expect(agent.disableMermaidValidation).toBe(true);
125
+ });
126
+ });
127
+
128
+ describe('_completionPromptProcessed flag behavior', () => {
129
+ test('should not trigger completionPrompt when _completionPromptProcessed is true', async () => {
130
+ // This test verifies that the infinite loop prevention works
131
+ // by checking that _completionPromptProcessed flag is properly handled
132
+ const agent = new ProbeAgent({
133
+ completionPrompt: 'Review this',
134
+ path: process.cwd()
135
+ });
136
+
137
+ // The _completionPromptProcessed flag should prevent recursive calls
138
+ // This is tested indirectly through the logic in ProbeAgent.answer()
139
+ expect(agent.completionPrompt).toBe('Review this');
140
+ });
141
+ });
142
+ });
143
+
144
+ describe('completionPrompt message format', () => {
145
+ test('should format completion prompt message correctly', () => {
146
+ const completionPrompt = 'Please verify the accuracy of your response.';
147
+ const finalResult = 'This is the AI response.';
148
+
149
+ // Simulate the message format used in ProbeAgent
150
+ const formattedMessage = `${completionPrompt}
151
+
152
+ Here is the result to review:
153
+ <result>
154
+ ${finalResult}
155
+ </result>
156
+
157
+ After reviewing, provide your final answer using attempt_completion.`;
158
+
159
+ expect(formattedMessage).toContain(completionPrompt);
160
+ expect(formattedMessage).toContain(finalResult);
161
+ expect(formattedMessage).toContain('<result>');
162
+ expect(formattedMessage).toContain('</result>');
163
+ expect(formattedMessage).toContain('attempt_completion');
164
+ });
165
+ });
166
+
167
+ describe('completionPrompt with delegate tool', () => {
168
+ test('should preserve completionPrompt when enableDelegate is true', () => {
169
+ const agent = new ProbeAgent({
170
+ completionPrompt: 'Review the delegated response',
171
+ enableDelegate: true,
172
+ path: process.cwd()
173
+ });
174
+
175
+ expect(agent.completionPrompt).toBe('Review the delegated response');
176
+ expect(agent.enableDelegate).toBe(true);
177
+ });
178
+
179
+ test('should not inherit completionPrompt in delegate subagent by design', () => {
180
+ // The delegate tool creates its own ProbeAgent without completionPrompt
181
+ // This is by design - subagents should not have completion validation
182
+ const parentAgent = new ProbeAgent({
183
+ completionPrompt: 'Parent validation prompt',
184
+ enableDelegate: true,
185
+ path: process.cwd()
186
+ });
187
+
188
+ // When delegate creates a subagent, it should NOT have completionPrompt
189
+ // The subagent is created fresh with only specific options
190
+ const subagentOptions = {
191
+ path: process.cwd(),
192
+ enableDelegate: false, // Prevent recursion
193
+ disableMermaidValidation: true,
194
+ disableJsonValidation: true
195
+ // Note: completionPrompt is NOT passed to subagent
196
+ };
197
+
198
+ const subagent = new ProbeAgent(subagentOptions);
199
+ expect(subagent.completionPrompt).toBeNull();
200
+ expect(parentAgent.completionPrompt).toBe('Parent validation prompt');
201
+ });
202
+
203
+ test('should work with clone when both completionPrompt and enableDelegate are set', () => {
204
+ const baseAgent = new ProbeAgent({
205
+ completionPrompt: 'Verify response',
206
+ enableDelegate: true,
207
+ path: process.cwd()
208
+ });
209
+
210
+ const cloned = baseAgent.clone();
211
+
212
+ expect(cloned.completionPrompt).toBe('Verify response');
213
+ expect(cloned.enableDelegate).toBe(true);
214
+ });
215
+ });
216
+
217
+ describe('completionPrompt with validation options', () => {
218
+ test('should work with disableJsonValidation', () => {
219
+ const agent = new ProbeAgent({
220
+ completionPrompt: 'Check JSON output',
221
+ disableJsonValidation: true,
222
+ path: process.cwd()
223
+ });
224
+
225
+ expect(agent.completionPrompt).toBe('Check JSON output');
226
+ expect(agent.disableJsonValidation).toBe(true);
227
+ });
228
+
229
+ test('should work with both validation options disabled', () => {
230
+ const agent = new ProbeAgent({
231
+ completionPrompt: 'Final review',
232
+ disableMermaidValidation: true,
233
+ disableJsonValidation: true,
234
+ path: process.cwd()
235
+ });
236
+
237
+ expect(agent.completionPrompt).toBe('Final review');
238
+ expect(agent.disableMermaidValidation).toBe(true);
239
+ expect(agent.disableJsonValidation).toBe(true);
240
+ });
241
+
242
+ test('should preserve all validation options in clone', () => {
243
+ const baseAgent = new ProbeAgent({
244
+ completionPrompt: 'Review prompt',
245
+ disableMermaidValidation: true,
246
+ disableJsonValidation: true,
247
+ path: process.cwd()
248
+ });
249
+
250
+ const cloned = baseAgent.clone();
251
+
252
+ expect(cloned.completionPrompt).toBe('Review prompt');
253
+ expect(cloned.disableMermaidValidation).toBe(true);
254
+ expect(cloned.disableJsonValidation).toBe(true);
255
+ });
256
+ });
257
+
258
+ describe('completionPrompt with retry and fallback options', () => {
259
+ test('should work alongside retry configuration', () => {
260
+ const agent = new ProbeAgent({
261
+ completionPrompt: 'Verify with retry enabled',
262
+ retry: {
263
+ maxRetries: 3,
264
+ initialDelay: 1000
265
+ },
266
+ path: process.cwd()
267
+ });
268
+
269
+ expect(agent.completionPrompt).toBe('Verify with retry enabled');
270
+ expect(agent.retryConfig).toEqual({
271
+ maxRetries: 3,
272
+ initialDelay: 1000
273
+ });
274
+ });
275
+
276
+ test('should work alongside fallback configuration', () => {
277
+ const agent = new ProbeAgent({
278
+ completionPrompt: 'Review before fallback',
279
+ fallback: {
280
+ strategy: 'same-provider'
281
+ },
282
+ path: process.cwd()
283
+ });
284
+
285
+ expect(agent.completionPrompt).toBe('Review before fallback');
286
+ expect(agent.fallbackConfig).toEqual({
287
+ strategy: 'same-provider'
288
+ });
289
+ });
290
+ });
291
+
292
+ describe('completionPrompt edge cases', () => {
293
+ test('should handle special characters in completionPrompt', () => {
294
+ const specialPrompt = 'Review: Check <tags> and "quotes" and \'apostrophes\' and `backticks`';
295
+ const agent = new ProbeAgent({
296
+ completionPrompt: specialPrompt,
297
+ path: process.cwd()
298
+ });
299
+
300
+ expect(agent.completionPrompt).toBe(specialPrompt);
301
+ });
302
+
303
+ test('should handle very long completionPrompt', () => {
304
+ const longPrompt = 'Review the response. '.repeat(100);
305
+ const agent = new ProbeAgent({
306
+ completionPrompt: longPrompt,
307
+ path: process.cwd()
308
+ });
309
+
310
+ expect(agent.completionPrompt).toBe(longPrompt);
311
+ expect(agent.completionPrompt.length).toBeGreaterThan(2000);
312
+ });
313
+
314
+ test('should handle completionPrompt with newlines and formatting', () => {
315
+ const formattedPrompt = `
316
+ ## Review Checklist
317
+
318
+ 1. **Accuracy**: Verify all facts
319
+ 2. **Completeness**: Check nothing is missing
320
+ 3. **Format**: Ensure proper structure
321
+
322
+ ### Additional Notes
323
+ - Pay attention to edge cases
324
+ - Verify code examples work
325
+ `;
326
+ const agent = new ProbeAgent({
327
+ completionPrompt: formattedPrompt,
328
+ path: process.cwd()
329
+ });
330
+
331
+ expect(agent.completionPrompt).toBe(formattedPrompt);
332
+ expect(agent.completionPrompt).toContain('## Review Checklist');
333
+ expect(agent.completionPrompt).toContain('**Accuracy**');
334
+ });
335
+
336
+ test('should handle completionPrompt with unicode characters', () => {
337
+ const unicodePrompt = 'レビュー: 回答を確認してください 🔍 ✅';
338
+ const agent = new ProbeAgent({
339
+ completionPrompt: unicodePrompt,
340
+ path: process.cwd()
341
+ });
342
+
343
+ expect(agent.completionPrompt).toBe(unicodePrompt);
344
+ });
345
+ });
346
+
347
+ describe('completionPrompt isolation', () => {
348
+ test('should not affect other agents when set', () => {
349
+ const agentWithPrompt = new ProbeAgent({
350
+ completionPrompt: 'Review this',
351
+ path: process.cwd()
352
+ });
353
+
354
+ const agentWithoutPrompt = new ProbeAgent({
355
+ path: process.cwd()
356
+ });
357
+
358
+ expect(agentWithPrompt.completionPrompt).toBe('Review this');
359
+ expect(agentWithoutPrompt.completionPrompt).toBeNull();
360
+ });
361
+
362
+ test('should allow clearing completionPrompt via clone override', () => {
363
+ const baseAgent = new ProbeAgent({
364
+ completionPrompt: 'Original prompt',
365
+ path: process.cwd()
366
+ });
367
+
368
+ // Note: We can't set to null via override due to || operator, but empty string works
369
+ const cloned = baseAgent.clone({
370
+ overrides: {
371
+ completionPrompt: ''
372
+ }
373
+ });
374
+
375
+ // Empty string becomes null due to || operator in constructor
376
+ expect(cloned.completionPrompt).toBeNull();
377
+ expect(baseAgent.completionPrompt).toBe('Original prompt');
378
+ });
379
+ });
@@ -0,0 +1,287 @@
1
+ /**
2
+ * Tests for cwd/path options in extract, search, and query functions
3
+ * These tests verify that relative paths are resolved against the specified working directory
4
+ */
5
+
6
+ import { extract, search, query } from '../../src/index.js';
7
+ import { validateCwdPath, normalizePath } from '../../src/utils/path-validation.js';
8
+ import path from 'path';
9
+ import fs from 'fs';
10
+ import os from 'os';
11
+
12
+ // Get the project root directory (where the probe binary can find files)
13
+ const projectRoot = path.resolve(process.cwd(), '..');
14
+
15
+ describe('cwd/path options for workspace isolation', () => {
16
+ describe('extract() with cwd option', () => {
17
+ test('should resolve relative file paths against cwd option', async () => {
18
+ // Use the project root as the base path
19
+ const result = await extract({
20
+ files: ['npm/src/extract.js:1-10'],
21
+ cwd: projectRoot,
22
+ format: 'json'
23
+ });
24
+
25
+ expect(result).toBeDefined();
26
+ // Should successfully extract from the file
27
+ if (typeof result === 'object') {
28
+ expect(result.results).toBeDefined();
29
+ }
30
+ });
31
+
32
+ test('should work with absolute paths regardless of cwd option', async () => {
33
+ const absolutePath = path.join(projectRoot, 'npm/src/extract.js');
34
+
35
+ const result = await extract({
36
+ files: [`${absolutePath}:1-10`],
37
+ cwd: os.tmpdir(), // Different cwd, but absolute paths should still work
38
+ format: 'json'
39
+ });
40
+
41
+ expect(result).toBeDefined();
42
+ });
43
+
44
+ test('should use process.cwd() when cwd is not specified', async () => {
45
+ // This test verifies default behavior
46
+ const result = await extract({
47
+ files: ['src/extract.js:1-10'],
48
+ format: 'json'
49
+ });
50
+
51
+ expect(result).toBeDefined();
52
+ });
53
+
54
+ test('should handle content with cwd option', async () => {
55
+ const diffContent = `diff --git a/npm/src/extract.js b/npm/src/extract.js
56
+ index 123..456
57
+ --- a/npm/src/extract.js
58
+ +++ b/npm/src/extract.js
59
+ @@ -1,3 +1,4 @@
60
+ /**
61
+ - * old comment
62
+ + * new comment
63
+ */`;
64
+
65
+ const result = await extract({
66
+ content: diffContent,
67
+ cwd: projectRoot,
68
+ format: 'outline-xml'
69
+ });
70
+
71
+ expect(result).toBeDefined();
72
+ expect(typeof result).toBe('string');
73
+ });
74
+ });
75
+
76
+ describe('search() with cwd option', () => {
77
+ test('should resolve relative search path against cwd option', async () => {
78
+ const result = await search({
79
+ query: 'extract',
80
+ path: 'npm/src',
81
+ cwd: projectRoot,
82
+ maxResults: 5,
83
+ format: 'json'
84
+ });
85
+
86
+ expect(result).toBeDefined();
87
+ if (typeof result === 'object') {
88
+ expect(result.results).toBeDefined();
89
+ }
90
+ });
91
+
92
+ test('should work with absolute paths regardless of cwd option', async () => {
93
+ const absolutePath = path.join(projectRoot, 'npm/src');
94
+
95
+ const result = await search({
96
+ query: 'function',
97
+ path: absolutePath,
98
+ cwd: os.tmpdir(), // Different cwd, but absolute paths should still work
99
+ maxResults: 5,
100
+ format: 'json'
101
+ });
102
+
103
+ expect(result).toBeDefined();
104
+ });
105
+
106
+ test('should use process.cwd() when cwd is not specified', async () => {
107
+ const result = await search({
108
+ query: 'extract',
109
+ path: 'src',
110
+ maxResults: 5,
111
+ format: 'json'
112
+ });
113
+
114
+ expect(result).toBeDefined();
115
+ });
116
+ });
117
+
118
+ describe('query() with cwd option', () => {
119
+ test('should resolve relative query path against cwd option', async () => {
120
+ const result = await query({
121
+ pattern: 'function $NAME($$$ARGS) { $$$BODY }',
122
+ path: 'npm/src',
123
+ cwd: projectRoot,
124
+ language: 'javascript',
125
+ maxResults: 5,
126
+ format: 'json'
127
+ });
128
+
129
+ expect(result).toBeDefined();
130
+ });
131
+
132
+ test('should work with absolute paths regardless of cwd option', async () => {
133
+ const absolutePath = path.join(projectRoot, 'npm/src');
134
+
135
+ const result = await query({
136
+ pattern: 'function $NAME($$$ARGS) { $$$BODY }',
137
+ path: absolutePath,
138
+ cwd: os.tmpdir(), // Different cwd, but absolute paths should still work
139
+ language: 'javascript',
140
+ maxResults: 5,
141
+ format: 'json'
142
+ });
143
+
144
+ expect(result).toBeDefined();
145
+ });
146
+
147
+ test('should use process.cwd() when cwd is not specified', async () => {
148
+ const result = await query({
149
+ pattern: 'function $NAME($$$ARGS) { $$$BODY }',
150
+ path: 'src',
151
+ language: 'javascript',
152
+ maxResults: 5,
153
+ format: 'json'
154
+ });
155
+
156
+ expect(result).toBeDefined();
157
+ });
158
+ });
159
+
160
+ describe('workspace isolation scenario', () => {
161
+ let tempWorkspace;
162
+
163
+ beforeAll(() => {
164
+ // Create a temporary workspace directory
165
+ tempWorkspace = fs.mkdtempSync(path.join(os.tmpdir(), 'probe-test-workspace-'));
166
+
167
+ // Create a symlink to the npm/src directory in the temp workspace
168
+ const symlinkPath = path.join(tempWorkspace, 'probe-npm');
169
+ try {
170
+ fs.symlinkSync(path.join(projectRoot, 'npm'), symlinkPath);
171
+ } catch (e) {
172
+ // Symlink might fail on some systems, skip those tests
173
+ console.warn('Could not create symlink for test:', e.message);
174
+ }
175
+ });
176
+
177
+ afterAll(() => {
178
+ // Clean up temporary workspace
179
+ if (tempWorkspace && fs.existsSync(tempWorkspace)) {
180
+ fs.rmSync(tempWorkspace, { recursive: true, force: true });
181
+ }
182
+ });
183
+
184
+ test('should extract files from workspace using cwd option', async () => {
185
+ const symlinkPath = path.join(tempWorkspace, 'probe-npm');
186
+ if (!fs.existsSync(symlinkPath)) {
187
+ console.warn('Skipping test: symlink not available');
188
+ return;
189
+ }
190
+
191
+ const result = await extract({
192
+ files: ['probe-npm/src/extract.js:1-10'],
193
+ cwd: tempWorkspace,
194
+ format: 'json'
195
+ });
196
+
197
+ expect(result).toBeDefined();
198
+ });
199
+
200
+ test('should search files in workspace using cwd option', async () => {
201
+ const symlinkPath = path.join(tempWorkspace, 'probe-npm');
202
+ if (!fs.existsSync(symlinkPath)) {
203
+ console.warn('Skipping test: symlink not available');
204
+ return;
205
+ }
206
+
207
+ const result = await search({
208
+ query: 'extract',
209
+ path: 'probe-npm/src',
210
+ cwd: tempWorkspace,
211
+ maxResults: 5,
212
+ format: 'json'
213
+ });
214
+
215
+ expect(result).toBeDefined();
216
+ });
217
+ });
218
+
219
+ describe('path validation security', () => {
220
+ test('validateCwdPath should normalize paths with .. components', async () => {
221
+ const basePath = process.cwd();
222
+ const parentPath = path.dirname(basePath);
223
+
224
+ // Path with .. should be normalized
225
+ const result = await validateCwdPath(path.join(basePath, '..'));
226
+ expect(result).toBe(parentPath);
227
+ });
228
+
229
+ test('validateCwdPath should return absolute path', async () => {
230
+ const result = await validateCwdPath('.');
231
+ expect(path.isAbsolute(result)).toBe(true);
232
+ });
233
+
234
+ test('validateCwdPath should use default when path is not provided', async () => {
235
+ const result = await validateCwdPath(undefined);
236
+ expect(result).toBe(path.normalize(process.cwd()));
237
+ });
238
+
239
+ test('validateCwdPath should throw for non-existent path', async () => {
240
+ await expect(
241
+ validateCwdPath('/this/path/definitely/does/not/exist/12345')
242
+ ).rejects.toThrow('Path does not exist');
243
+ });
244
+
245
+ test('validateCwdPath should throw for file path (not directory)', async () => {
246
+ const filePath = path.join(projectRoot, 'npm/package.json');
247
+ await expect(
248
+ validateCwdPath(filePath)
249
+ ).rejects.toThrow('Path is not a directory');
250
+ });
251
+
252
+ test('normalizePath should normalize without requiring existence', () => {
253
+ // Use a path relative to cwd to avoid platform-specific absolute path issues
254
+ const testPath = path.join('some', 'path', '..', 'normalized');
255
+ const result = normalizePath(testPath);
256
+ // Result should be an absolute path containing 'some/normalized' (or 'some\normalized' on Windows)
257
+ expect(result).toContain(path.join('some', 'normalized'));
258
+ expect(path.isAbsolute(result)).toBe(true);
259
+ });
260
+
261
+ test('extract should reject non-existent cwd option', async () => {
262
+ await expect(extract({
263
+ files: ['some/file.js'],
264
+ cwd: '/this/path/does/not/exist/12345',
265
+ format: 'json'
266
+ })).rejects.toThrow('Path does not exist');
267
+ });
268
+
269
+ test('search should reject non-existent cwd option', async () => {
270
+ await expect(search({
271
+ query: 'test',
272
+ path: '.',
273
+ cwd: '/this/path/does/not/exist/12345',
274
+ format: 'json'
275
+ })).rejects.toThrow('Path does not exist');
276
+ });
277
+
278
+ test('query should reject non-existent cwd option', async () => {
279
+ await expect(query({
280
+ pattern: 'function $NAME() {}',
281
+ path: '.',
282
+ cwd: '/this/path/does/not/exist/12345',
283
+ format: 'json'
284
+ })).rejects.toThrow('Path does not exist');
285
+ });
286
+ });
287
+ });