@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,402 @@
1
+ /**
2
+ * Integration tests for examples/chat ProbeChat with MCP support
3
+ *
4
+ * NOTE: This test requires examples/chat dependencies to be installed.
5
+ * It tests the integration between the npm package and the examples/chat application.
6
+ */
7
+
8
+ import { jest } from '@jest/globals';
9
+ import { join, dirname } from 'path';
10
+ import { fileURLToPath } from 'url';
11
+ import { mkdtemp, writeFile, rm } from 'fs/promises';
12
+ import { tmpdir } from 'os';
13
+ import { existsSync } from 'fs';
14
+
15
+ // Check if examples/chat exists and has node_modules
16
+ const examplesPath = join(dirname(dirname(dirname(dirname(fileURLToPath(import.meta.url))))), 'examples', 'chat');
17
+ const examplesNodeModules = join(examplesPath, 'node_modules');
18
+
19
+ // Skip these tests if examples/chat dependencies are not installed
20
+ const skipTests = !existsSync(examplesNodeModules);
21
+
22
+ // Only import ProbeChat if we can run the tests
23
+ let ProbeChat;
24
+ if (!skipTests) {
25
+ // Mock dotenv/config before importing modules that use it
26
+ jest.unstable_mockModule('dotenv/config', () => ({}));
27
+
28
+ // Import ProbeChat only if we'll run the tests
29
+ const module = await import('../../../examples/chat/probeChat.js');
30
+ ProbeChat = module.ProbeChat;
31
+ }
32
+
33
+ const __filename = fileURLToPath(import.meta.url);
34
+ const __dirname = dirname(__filename);
35
+
36
+ const describeOrSkip = skipTests ? describe.skip : describe;
37
+
38
+ describeOrSkip('ProbeChat MCP Integration', () => {
39
+ let tempDir;
40
+
41
+ if (skipTests) {
42
+ test('Tests skipped - examples/chat dependencies not installed', () => {
43
+ console.log('Skipping ProbeChat tests as examples/chat dependencies are not installed');
44
+ console.log(`Checked path: ${examplesNodeModules}`);
45
+ expect(true).toBe(true);
46
+ });
47
+ return;
48
+ }
49
+
50
+ beforeEach(async () => {
51
+ tempDir = await mkdtemp(join(tmpdir(), 'probe-chat-mcp-test-'));
52
+ });
53
+
54
+ afterEach(async () => {
55
+ if (tempDir) {
56
+ await rm(tempDir, { recursive: true, force: true });
57
+ }
58
+ // Clean up environment variables
59
+ delete process.env.ENABLE_MCP;
60
+ delete process.env.MCP_CONFIG_PATH;
61
+ delete process.env.ANTHROPIC_API_KEY;
62
+ delete process.env.OPENAI_API_KEY;
63
+ delete process.env.GOOGLE_API_KEY;
64
+ delete process.env.PROBE_NON_INTERACTIVE;
65
+ delete process.env.DEBUG_CHAT;
66
+ });
67
+
68
+ describe('ProbeChat Initialization', () => {
69
+ test('should initialize ProbeChat without MCP by default', async () => {
70
+ process.env.PROBE_NON_INTERACTIVE = '1'; // Suppress logs in tests
71
+
72
+ const chat = new ProbeChat({
73
+ isNonInteractive: true,
74
+ debug: false
75
+ });
76
+
77
+ expect(chat.agent.enableMcp).toBe(false);
78
+ expect(chat.agent.mcpBridge).toBeNull();
79
+
80
+ await chat.cleanup();
81
+ });
82
+
83
+ test('should initialize ProbeChat with MCP enabled via options', async () => {
84
+ process.env.PROBE_NON_INTERACTIVE = '1';
85
+
86
+ const chat = new ProbeChat({
87
+ enableMcp: true,
88
+ isNonInteractive: true,
89
+ debug: false
90
+ });
91
+
92
+ expect(chat.agent.enableMcp).toBe(true);
93
+
94
+ await chat.cleanup();
95
+ });
96
+
97
+ test('should initialize ProbeChat with MCP enabled via environment', async () => {
98
+ process.env.ENABLE_MCP = '1';
99
+ process.env.PROBE_NON_INTERACTIVE = '1';
100
+
101
+ const chat = new ProbeChat({
102
+ isNonInteractive: true,
103
+ debug: false
104
+ });
105
+
106
+ expect(chat.agent.enableMcp).toBe(true);
107
+
108
+ await chat.cleanup();
109
+ });
110
+
111
+ test('should pass MCP server configurations to ProbeAgent', async () => {
112
+ process.env.PROBE_NON_INTERACTIVE = '1';
113
+
114
+ const mcpServers = [
115
+ {
116
+ name: 'test-server',
117
+ command: 'node',
118
+ args: ['test.js']
119
+ }
120
+ ];
121
+
122
+ const chat = new ProbeChat({
123
+ enableMcp: true,
124
+ mcpServers: mcpServers,
125
+ isNonInteractive: true,
126
+ debug: false
127
+ });
128
+
129
+ expect(chat.agent.enableMcp).toBe(true);
130
+ expect(chat.agent.mcpServers).toEqual(mcpServers);
131
+
132
+ await chat.cleanup();
133
+ });
134
+ });
135
+
136
+ describe('ProbeChat API Integration', () => {
137
+ test('should maintain ProbeChat API compatibility', async () => {
138
+ process.env.PROBE_NON_INTERACTIVE = '1';
139
+ process.env.ANTHROPIC_API_KEY = 'test-key';
140
+
141
+ const chat = new ProbeChat({
142
+ enableMcp: true,
143
+ isNonInteractive: true,
144
+ debug: false
145
+ });
146
+
147
+ // Verify all expected methods exist
148
+ expect(typeof chat.chat).toBe('function');
149
+ expect(typeof chat.getSessionId).toBe('function');
150
+ expect(typeof chat.getUsageSummary).toBe('function');
151
+ expect(typeof chat.clearHistory).toBe('function');
152
+ expect(typeof chat.exportHistory).toBe('function');
153
+ expect(typeof chat.saveHistory).toBe('function');
154
+ expect(typeof chat.cancel).toBe('function');
155
+ expect(typeof chat.cleanup).toBe('function');
156
+
157
+ // Test basic functionality
158
+ expect(chat.getSessionId()).toBeDefined();
159
+ expect(chat.getUsageSummary()).toBeDefined();
160
+ expect(chat.exportHistory()).toEqual([]);
161
+
162
+ chat.clearHistory();
163
+ expect(chat.exportHistory()).toEqual([]);
164
+
165
+ await chat.cleanup();
166
+ });
167
+
168
+ test('should handle image URL extraction', async () => {
169
+ process.env.PROBE_NON_INTERACTIVE = '1';
170
+
171
+ const chat = new ProbeChat({
172
+ isNonInteractive: true,
173
+ debug: false
174
+ });
175
+
176
+ // Test that ProbeChat can be instantiated without errors
177
+ // Image extraction is tested in the ProbeChat source, here we just verify integration
178
+ expect(chat).toBeDefined();
179
+
180
+ await chat.cleanup();
181
+ });
182
+ });
183
+
184
+ describe('Token Usage and Display', () => {
185
+ test('should initialize token usage tracking', async () => {
186
+ process.env.PROBE_NON_INTERACTIVE = '1';
187
+
188
+ const chat = new ProbeChat({
189
+ isNonInteractive: true,
190
+ debug: false
191
+ });
192
+
193
+ expect(chat.tokenUsage).toBeDefined();
194
+ expect(typeof chat.tokenUsage.updateFromTokenCounter).toBe('function');
195
+ expect(typeof chat.tokenUsage.display).toBe('function');
196
+ expect(typeof chat.tokenUsage.clear).toBe('function');
197
+
198
+ await chat.cleanup();
199
+ });
200
+
201
+ test('should handle telemetry configuration', async () => {
202
+ process.env.PROBE_NON_INTERACTIVE = '1';
203
+
204
+ const chat = new ProbeChat({
205
+ isNonInteractive: true,
206
+ debug: false
207
+ });
208
+
209
+ expect(chat.telemetryConfig).toBeDefined();
210
+
211
+ await chat.cleanup();
212
+ });
213
+ });
214
+
215
+ describe('History Management', () => {
216
+ test('should save and load conversation history', async () => {
217
+ process.env.PROBE_NON_INTERACTIVE = '1';
218
+
219
+ const chat = new ProbeChat({
220
+ isNonInteractive: true,
221
+ debug: false
222
+ });
223
+
224
+ // Test history export/import
225
+ const initialHistory = chat.exportHistory();
226
+ expect(Array.isArray(initialHistory)).toBe(true);
227
+
228
+ // Test history saving (filename generation)
229
+ const filename = join(tempDir, 'test-history.json');
230
+ const savedFile = chat.saveHistory(filename);
231
+ expect(savedFile).toBe(filename);
232
+
233
+ await chat.cleanup();
234
+ });
235
+
236
+ test('should generate automatic history filenames', async () => {
237
+ process.env.PROBE_NON_INTERACTIVE = '1';
238
+
239
+ const chat = new ProbeChat({
240
+ isNonInteractive: true,
241
+ debug: false
242
+ });
243
+
244
+ // Test automatic filename generation
245
+ const sessionId = chat.getSessionId();
246
+ const filename = chat.saveHistory();
247
+
248
+ expect(filename).toContain(sessionId);
249
+ expect(filename).toContain('.json');
250
+
251
+ await chat.cleanup();
252
+ });
253
+ });
254
+
255
+ describe('Mock Server Integration', () => {
256
+ test('should work with mock MCP server configuration', async () => {
257
+ // Create MCP configuration with mock server
258
+ const mcpConfig = {
259
+ mcpServers: {
260
+ 'mock-chat-test': {
261
+ command: 'node',
262
+ args: [join(__dirname, '../mcp/mockMcpServer.js')],
263
+ transport: 'stdio',
264
+ enabled: true
265
+ }
266
+ }
267
+ };
268
+
269
+ const configPath = join(tempDir, 'chat-mcp-config.json');
270
+ await writeFile(configPath, JSON.stringify(mcpConfig, null, 2));
271
+
272
+ process.env.MCP_CONFIG_PATH = configPath;
273
+ process.env.PROBE_NON_INTERACTIVE = '1';
274
+ process.env.ANTHROPIC_API_KEY = 'test-key';
275
+
276
+ const chat = new ProbeChat({
277
+ enableMcp: true,
278
+ isNonInteractive: true,
279
+ debug: true
280
+ });
281
+
282
+ // Wait for MCP initialization
283
+ await new Promise(resolve => setTimeout(resolve, 3000));
284
+
285
+ // Verify MCP integration is working
286
+ expect(chat.agent.enableMcp).toBe(true);
287
+
288
+ if (chat.agent.mcpBridge && chat.agent.mcpBridge.getToolNames().length > 0) {
289
+ const toolNames = chat.agent.mcpBridge.getToolNames();
290
+ console.log('ProbeChat successfully connected to mock server with tools:', toolNames);
291
+
292
+ // Verify expected tools
293
+ expect(toolNames.some(name => name.includes('foobar'))).toBe(true);
294
+ expect(toolNames.some(name => name.includes('calculator'))).toBe(true);
295
+ } else {
296
+ console.warn('Mock server connection failed in ProbeChat - may be expected in test environment');
297
+ }
298
+
299
+ await chat.cleanup();
300
+ }, 20000); // Extended timeout for server startup
301
+ });
302
+
303
+ describe('Error Handling', () => {
304
+ test('should handle MCP initialization errors gracefully', async () => {
305
+ // Create invalid MCP configuration
306
+ const mcpConfig = {
307
+ mcpServers: {
308
+ 'invalid-chat-server': {
309
+ command: 'nonexistent-command',
310
+ args: ['--invalid'],
311
+ transport: 'stdio',
312
+ enabled: true
313
+ }
314
+ }
315
+ };
316
+
317
+ const configPath = join(tempDir, 'invalid-chat-config.json');
318
+ await writeFile(configPath, JSON.stringify(mcpConfig, null, 2));
319
+
320
+ process.env.MCP_CONFIG_PATH = configPath;
321
+ process.env.PROBE_NON_INTERACTIVE = '1';
322
+
323
+ // Should not crash during initialization
324
+ const chat = new ProbeChat({
325
+ enableMcp: true,
326
+ isNonInteractive: true,
327
+ debug: false
328
+ });
329
+
330
+ // Wait for initialization attempt
331
+ await new Promise(resolve => setTimeout(resolve, 2000));
332
+
333
+ expect(chat).toBeDefined();
334
+ expect(chat.agent.enableMcp).toBe(true);
335
+ // MCP bridge should be null due to failed connection
336
+ expect(chat.agent.mcpBridge).toBeNull();
337
+
338
+ await chat.cleanup();
339
+ }, 10000);
340
+
341
+ test('should handle cleanup errors gracefully', async () => {
342
+ process.env.PROBE_NON_INTERACTIVE = '1';
343
+
344
+ const chat = new ProbeChat({
345
+ enableMcp: true,
346
+ isNonInteractive: true,
347
+ debug: false
348
+ });
349
+
350
+ // Mock the agent cleanup to throw an error
351
+ const originalCleanup = chat.agent.cleanup;
352
+ chat.agent.cleanup = jest.fn().mockRejectedValue(new Error('Cleanup failed'));
353
+
354
+ // Should not throw even if underlying cleanup fails
355
+ await expect(chat.cleanup()).resolves.not.toThrow();
356
+
357
+ // Restore original cleanup
358
+ chat.agent.cleanup = originalCleanup;
359
+ await chat.cleanup();
360
+ });
361
+ });
362
+
363
+ describe('Environment Variable Handling', () => {
364
+ test('should respect ENABLE_MCP environment variable', async () => {
365
+ process.env.ENABLE_MCP = '1';
366
+ process.env.PROBE_NON_INTERACTIVE = '1';
367
+ process.env.DEBUG_CHAT = '1';
368
+
369
+ const chat = new ProbeChat({
370
+ isNonInteractive: true
371
+ });
372
+
373
+ expect(chat.agent.enableMcp).toBe(true);
374
+ expect(chat.debug).toBe(true);
375
+
376
+ await chat.cleanup();
377
+ });
378
+
379
+ test('should respect DEBUG_CHAT environment variable', async () => {
380
+ process.env.DEBUG_CHAT = '1';
381
+ process.env.PROBE_NON_INTERACTIVE = '1';
382
+
383
+ const chat = new ProbeChat({
384
+ isNonInteractive: true
385
+ });
386
+
387
+ expect(chat.debug).toBe(true);
388
+
389
+ await chat.cleanup();
390
+ });
391
+
392
+ test('should handle non-interactive mode properly', async () => {
393
+ process.env.PROBE_NON_INTERACTIVE = '1';
394
+
395
+ const chat = new ProbeChat();
396
+
397
+ expect(chat.isNonInteractive).toBe(true);
398
+
399
+ await chat.cleanup();
400
+ });
401
+ });
402
+ });
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Integration tests for MCP Server .env file loading
3
+ */
4
+
5
+ import { jest } from '@jest/globals';
6
+ import { spawn } from 'child_process';
7
+ import { join } from 'path';
8
+ import { mkdtemp, writeFile, rm } from 'fs/promises';
9
+ import { tmpdir } from 'os';
10
+ import { fileURLToPath } from 'url';
11
+ import { dirname } from 'path';
12
+
13
+ const __filename = fileURLToPath(import.meta.url);
14
+ const __dirname = dirname(__filename);
15
+
16
+ describe('MCP Server .env Support', () => {
17
+ let tempDir;
18
+
19
+ beforeEach(async () => {
20
+ tempDir = await mkdtemp(join(tmpdir(), 'mcp-dotenv-test-'));
21
+ });
22
+
23
+ afterEach(async () => {
24
+ if (tempDir) {
25
+ await rm(tempDir, { recursive: true, force: true });
26
+ }
27
+ });
28
+
29
+ test('should load environment variables from .env file', async () => {
30
+ // Create a .env file in the temp directory
31
+ const envContent = `
32
+ TEST_VAR=from_dotenv
33
+ PROBE_PATH=/custom/probe/path
34
+ DEBUG=true
35
+ `.trim();
36
+
37
+ await writeFile(join(tempDir, '.env'), envContent);
38
+
39
+ // Test using dotenv directly (simulating what MCP server does)
40
+ const dotenv = await import('dotenv');
41
+ const result = dotenv.config({ path: join(tempDir, '.env') });
42
+
43
+ expect(result.error).toBeUndefined();
44
+ expect(result.parsed).toEqual({
45
+ TEST_VAR: 'from_dotenv',
46
+ PROBE_PATH: '/custom/probe/path',
47
+ DEBUG: 'true'
48
+ });
49
+ });
50
+
51
+ test('should not fail if .env file does not exist', async () => {
52
+ // Test using dotenv with non-existent file (simulating what MCP server does)
53
+ const dotenv = await import('dotenv');
54
+ const result = dotenv.config({ path: join(tempDir, '.env') });
55
+
56
+ // dotenv.config() should not throw when file doesn't exist
57
+ // It returns an error object but doesn't throw
58
+ expect(result.error).toBeDefined();
59
+ expect(result.error.code).toBe('ENOENT');
60
+ // When there's an error, parsed is an empty object
61
+ expect(result.parsed).toEqual({});
62
+ });
63
+
64
+ test('should prioritize existing environment variables over .env', async () => {
65
+ // Create a .env file
66
+ const envContent = `
67
+ TEST_PRIORITY=from_dotenv
68
+ `.trim();
69
+
70
+ await writeFile(join(tempDir, '.env'), envContent);
71
+
72
+ // Set an environment variable
73
+ const originalValue = process.env.TEST_PRIORITY;
74
+ process.env.TEST_PRIORITY = 'from_environment';
75
+
76
+ try {
77
+ // Test using dotenv
78
+ const dotenv = await import('dotenv');
79
+ const result = dotenv.config({ path: join(tempDir, '.env') });
80
+
81
+ expect(result.error).toBeUndefined();
82
+ // dotenv by default does not override existing env vars
83
+ expect(process.env.TEST_PRIORITY).toBe('from_environment');
84
+ } finally {
85
+ // Clean up
86
+ if (originalValue !== undefined) {
87
+ process.env.TEST_PRIORITY = originalValue;
88
+ } else {
89
+ delete process.env.TEST_PRIORITY;
90
+ }
91
+ }
92
+ });
93
+
94
+ test('MCP server should have dotenv loaded at startup', async () => {
95
+ // This test verifies that the MCP server index.ts has dotenv import
96
+ const { readFile } = await import('fs/promises');
97
+ const mcpIndexPath = join(__dirname, '..', '..', 'src', 'mcp', 'index.ts');
98
+
99
+ const content = await readFile(mcpIndexPath, 'utf8');
100
+
101
+ // Check that dotenv is imported
102
+ expect(content).toContain("import { config } from 'dotenv'");
103
+
104
+ // Check that config() is called
105
+ expect(content).toContain('config()');
106
+
107
+ // Check that the dotenv import is near the top (before other imports)
108
+ const lines = content.split('\n');
109
+ const dotenvImportLine = lines.findIndex(line => line.includes("import { config } from 'dotenv'"));
110
+ const configCallLine = lines.findIndex(line => line.includes('config()'));
111
+ const firstRegularImport = lines.findIndex(line =>
112
+ line.includes('import') &&
113
+ !line.includes('dotenv') &&
114
+ !line.includes('#!/usr/bin/env node')
115
+ );
116
+
117
+ // dotenv should be imported and called before other imports
118
+ expect(dotenvImportLine).toBeGreaterThan(-1);
119
+ expect(configCallLine).toBeGreaterThan(-1);
120
+ expect(dotenvImportLine).toBeLessThan(firstRegularImport);
121
+ });
122
+
123
+ test('ProbeAgent should have dotenv loaded at startup', async () => {
124
+ // This test verifies that ProbeAgent.js has dotenv import
125
+ const { readFile } = await import('fs/promises');
126
+ const probeAgentPath = join(__dirname, '..', '..', 'src', 'agent', 'ProbeAgent.js');
127
+
128
+ const content = await readFile(probeAgentPath, 'utf8');
129
+
130
+ // Check that dotenv is imported
131
+ expect(content).toContain("import dotenv from 'dotenv'");
132
+
133
+ // Check that config() is called
134
+ expect(content).toContain('dotenv.config()');
135
+
136
+ // Check that the dotenv import is near the top (before other imports)
137
+ const lines = content.split('\n');
138
+ const dotenvImportLine = lines.findIndex(line => line.includes("import dotenv from 'dotenv'"));
139
+ const configCallLine = lines.findIndex(line => line.includes('dotenv.config()'));
140
+
141
+ // dotenv should be imported and called at the top
142
+ expect(dotenvImportLine).toBeGreaterThan(-1);
143
+ expect(configCallLine).toBeGreaterThan(-1);
144
+ expect(dotenvImportLine).toBeLessThan(10); // Should be in first 10 lines
145
+ });
146
+
147
+ test('Main package index should have dotenv loaded at startup', async () => {
148
+ // This test verifies that index.js has dotenv import
149
+ const { readFile } = await import('fs/promises');
150
+ const indexPath = join(__dirname, '..', '..', 'src', 'index.js');
151
+
152
+ const content = await readFile(indexPath, 'utf8');
153
+
154
+ // Check that dotenv is imported
155
+ expect(content).toContain("import dotenv from 'dotenv'");
156
+
157
+ // Check that config() is called
158
+ expect(content).toContain('dotenv.config()');
159
+ });
160
+
161
+ test('Agent CLI index should have dotenv loaded at startup', async () => {
162
+ // This test verifies that agent/index.js has dotenv import
163
+ const { readFile } = await import('fs/promises');
164
+ const agentIndexPath = join(__dirname, '..', '..', 'src', 'agent', 'index.js');
165
+
166
+ const content = await readFile(agentIndexPath, 'utf8');
167
+
168
+ // Check that dotenv is imported
169
+ expect(content).toContain("import dotenv from 'dotenv'");
170
+
171
+ // Check that config() is called
172
+ expect(content).toContain('dotenv.config()');
173
+ });
174
+ });