@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
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "@crownpeak/dqm-react-component-dev-mcp",
3
+ "version": "1.2.0",
4
+ "description": "MCP Server for Crownpeak DQM React Component documentation - powered by Probe",
5
+ "author": "Crownpeak Technology GmbH",
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "main": "src/index.js",
9
+ "bin": {
10
+ "dqm-dev-mcp": "bin/mcp"
11
+ },
12
+ "files": [
13
+ "bin",
14
+ "src",
15
+ "data",
16
+ "docs-mcp.config.json"
17
+ ],
18
+ "scripts": {
19
+ "build": "node scripts/build.js",
20
+ "start": "node src/index.js",
21
+ "prepublishOnly": "npm run build"
22
+ },
23
+ "dependencies": {
24
+ "@probelabs/probe": "^0.6.0-rc128",
25
+ "@modelcontextprotocol/sdk": "^1.6.0",
26
+ "axios": "^1.6.0",
27
+ "fs-extra": "^11.2.0",
28
+ "glob": "^10.3.0",
29
+ "minimist": "^1.2.8",
30
+ "simple-git": "^3.22.0",
31
+ "tar": "^7.0.0"
32
+ },
33
+ "repository": {
34
+ "type": "git",
35
+ "url": "git+https://github.com/Crownpeak/dqm-react-component.git",
36
+ "directory": "mcp-server"
37
+ },
38
+ "bugs": {
39
+ "url": "https://github.com/Crownpeak/dqm-react-component/issues"
40
+ },
41
+ "homepage": "https://github.com/Crownpeak/dqm-react-component/tree/main/mcp-server#readme",
42
+ "keywords": [
43
+ "mcp",
44
+ "model-context-protocol",
45
+ "crownpeak",
46
+ "dqm",
47
+ "quality-management",
48
+ "ai",
49
+ "copilot",
50
+ "documentation",
51
+ "probe"
52
+ ],
53
+ "engines": {
54
+ "node": ">=18.0.0"
55
+ }
56
+ }
package/src/config.js ADDED
@@ -0,0 +1,111 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ import minimist from 'minimist';
5
+
6
+ // Get the directory of the current module
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = path.dirname(__filename);
9
+
10
+ // Default configuration
11
+ const defaultConfig = {
12
+ // Directory to include in the package (for static docs)
13
+ includeDir: null,
14
+
15
+ // Git repository URL (for dynamic docs)
16
+ gitUrl: null,
17
+
18
+ // Git branch or tag to checkout
19
+ gitRef: 'main',
20
+
21
+ // Auto-update interval in minutes (0 to disable)
22
+ autoUpdateInterval: 0,
23
+
24
+ // Data directory for searching
25
+ dataDir: path.resolve(__dirname, '..', 'data'),
26
+
27
+ // MCP Tool configuration
28
+ toolName: 'search_dqm_docs',
29
+ toolDescription: 'Search the Crownpeak DQM React Component documentation. Use this to find information about DQMSidebar props, configuration options, overlay detection, backend authentication, widget bundle integration, and troubleshooting.',
30
+
31
+ // Ignore patterns
32
+ ignorePatterns: [
33
+ 'node_modules',
34
+ '.git',
35
+ 'dist',
36
+ 'build',
37
+ 'coverage',
38
+ '*.log',
39
+ '*.lock',
40
+ '*.tgz',
41
+ 'dump.rdb'
42
+ ],
43
+
44
+ // Enable build cleanup (remove large files)
45
+ enableBuildCleanup: true
46
+ };
47
+
48
+ /**
49
+ * Load configuration from config file and environment variables
50
+ * @returns {Object} Configuration object
51
+ */
52
+ export function loadConfig() {
53
+ // Parse command line arguments
54
+ const args = minimist(process.argv.slice(2));
55
+
56
+ // Check for config file path in arguments
57
+ const configPath = args.config || path.resolve(__dirname, '..', 'docs-mcp.config.json');
58
+
59
+ let config = { ...defaultConfig };
60
+
61
+ // Load configuration from file if it exists
62
+ if (fs.existsSync(configPath)) {
63
+ try {
64
+ const fileConfig = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
65
+ config = { ...config, ...fileConfig };
66
+ console.error(`Loaded configuration from ${configPath}`);
67
+ } catch (error) {
68
+ console.error(`Error loading configuration from ${configPath}:`, error);
69
+ }
70
+ } else {
71
+ console.error(`No configuration file found at ${configPath}, using defaults`);
72
+ }
73
+
74
+ // Override with environment variables
75
+ if (process.env.INCLUDE_DIR) config.includeDir = process.env.INCLUDE_DIR;
76
+ if (process.env.GIT_URL) config.gitUrl = process.env.GIT_URL;
77
+ if (process.env.GIT_REF) config.gitRef = process.env.GIT_REF;
78
+ if (process.env.AUTO_UPDATE_INTERVAL) config.autoUpdateInterval = parseInt(process.env.AUTO_UPDATE_INTERVAL, 10);
79
+ if (process.env.DATA_DIR) config.dataDir = process.env.DATA_DIR;
80
+ if (process.env.TOOL_NAME) config.toolName = process.env.TOOL_NAME;
81
+ if (process.env.TOOL_DESCRIPTION) config.toolDescription = process.env.TOOL_DESCRIPTION;
82
+ if (process.env.IGNORE_PATTERNS) config.ignorePatterns = process.env.IGNORE_PATTERNS.split(',').map(p => p.trim());
83
+
84
+ // Override with command line arguments (highest priority)
85
+ if (args.includeDir) config.includeDir = args.includeDir;
86
+ if (args.gitUrl) config.gitUrl = args.gitUrl;
87
+ if (args.gitRef) config.gitRef = args.gitRef;
88
+ if (args.autoUpdateInterval !== undefined) config.autoUpdateInterval = parseInt(args.autoUpdateInterval, 10);
89
+ if (args.dataDir) config.dataDir = args.dataDir;
90
+ if (args.toolName) config.toolName = args.toolName;
91
+ if (args.toolDescription) config.toolDescription = args.toolDescription;
92
+ if (args.ignorePatterns) config.ignorePatterns = Array.isArray(args.ignorePatterns) ? args.ignorePatterns : args.ignorePatterns.split(',').map(p => p.trim());
93
+ if (args.enableBuildCleanup !== undefined) config.enableBuildCleanup = args.enableBuildCleanup === true || args.enableBuildCleanup === 'true';
94
+
95
+ // Ensure dataDir is an absolute path
96
+ if (!path.isAbsolute(config.dataDir)) {
97
+ config.dataDir = path.resolve(process.cwd(), config.dataDir);
98
+ }
99
+
100
+ // Ensure includeDir is an absolute path if provided
101
+ if (config.includeDir && !path.isAbsolute(config.includeDir)) {
102
+ config.includeDir = path.resolve(process.cwd(), config.includeDir);
103
+ }
104
+
105
+ // Validate configuration
106
+ if (config.includeDir && config.gitUrl) {
107
+ console.warn('Both includeDir and gitUrl provided. gitUrl will take precedence.');
108
+ }
109
+
110
+ return config;
111
+ }
package/src/index.js ADDED
@@ -0,0 +1,395 @@
1
+ #!/usr/bin/env node
2
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import {
5
+ CallToolRequestSchema,
6
+ ErrorCode,
7
+ ListToolsRequestSchema,
8
+ McpError,
9
+ } from '@modelcontextprotocol/sdk/types.js';
10
+ import path from 'path';
11
+ import fs from 'fs-extra';
12
+ import { fileURLToPath } from 'url';
13
+ import { search } from '@probelabs/probe';
14
+ import simpleGit from 'simple-git';
15
+ import axios from 'axios';
16
+ import * as tar from 'tar';
17
+ import { loadConfig } from './config.js';
18
+ import minimist from 'minimist';
19
+
20
+ // Get the package.json to determine the version
21
+ const __filename = fileURLToPath(import.meta.url);
22
+ const __dirname = path.dirname(__filename);
23
+ const packageJsonPath = path.resolve(__dirname, '..', 'package.json');
24
+
25
+ // Get version from package.json
26
+ let packageVersion = '1.0.0';
27
+ try {
28
+ if (fs.existsSync(packageJsonPath)) {
29
+ console.error(`Found package.json at: ${packageJsonPath}`);
30
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
31
+ if (packageJson.version) {
32
+ packageVersion = packageJson.version;
33
+ console.error(`Using version from package.json: ${packageVersion}`);
34
+ }
35
+ }
36
+ } catch (error) {
37
+ console.error(`Error reading package.json:`, error);
38
+ }
39
+
40
+ // Load configuration (handles defaults, file, env, args precedence)
41
+ const config = loadConfig();
42
+
43
+ // Git instance - initialize lazily only if needed for auto-updates
44
+ let git = null;
45
+
46
+ // Ensure the data directory exists (might be empty initially)
47
+ try {
48
+ fs.ensureDirSync(config.dataDir);
49
+ console.error(`Ensured data directory exists: ${config.dataDir}`);
50
+ } catch (err) {
51
+ console.error(`Failed to ensure data directory exists: ${config.dataDir}`, err);
52
+ process.exit(1);
53
+ }
54
+
55
+ // Auto-update timer
56
+ let updateTimer = null;
57
+
58
+ /**
59
+ * @typedef {Object} SearchDocsArgs
60
+ * @property {string|string[]} query - The search query using Elasticsearch syntax. Focus on keywords.
61
+ */
62
+
63
+ class DocsMcpServer {
64
+ constructor() {
65
+ /**
66
+ * @type {Server}
67
+ * @private
68
+ */
69
+ this.server = new Server(
70
+ {
71
+ name: '@crownpeak/dqm-react-component-dev-mcp',
72
+ version: packageVersion,
73
+ },
74
+ {
75
+ capabilities: {
76
+ tools: {},
77
+ },
78
+ }
79
+ );
80
+
81
+ this.setupToolHandlers();
82
+
83
+ // Error handling
84
+ this.server.onerror = (error) => console.error('[MCP Error]', error);
85
+ process.on('SIGINT', async () => {
86
+ if (updateTimer) clearTimeout(updateTimer);
87
+ await this.server.close();
88
+ process.exit(0);
89
+ });
90
+ }
91
+
92
+ /**
93
+ * Set up the tool handlers for the MCP server
94
+ * @private
95
+ */
96
+ setupToolHandlers() {
97
+ this.server.setRequestHandler(ListToolsRequestSchema, async () => ({
98
+ tools: [
99
+ {
100
+ name: config.toolName,
101
+ description: config.toolDescription,
102
+ inputSchema: {
103
+ type: 'object',
104
+ properties: {
105
+ query: {
106
+ type: 'string',
107
+ description: 'Elasticsearch query string. Focus on keywords and use ES syntax (e.g., "overlay AND config", "DQMSidebar props", "backend authentication").',
108
+ },
109
+ page: {
110
+ type: 'number',
111
+ description: 'Optional page number for pagination of results (e.g., 1, 2, 3...). Default is 1.',
112
+ default: 1,
113
+ }
114
+ },
115
+ required: ['query']
116
+ },
117
+ },
118
+ ],
119
+ }));
120
+
121
+ this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
122
+ // Check against the configured tool name
123
+ if (request.params.name !== config.toolName) {
124
+ throw new McpError(
125
+ ErrorCode.MethodNotFound,
126
+ `Unknown tool: ${request.params.name}. Expected: ${config.toolName}`
127
+ );
128
+ }
129
+
130
+ try {
131
+ // Log the incoming request for debugging
132
+ console.error(`Received request for tool: ${request.params.name}`);
133
+ console.error(`Request arguments: ${JSON.stringify(request.params.arguments)}`);
134
+
135
+ // Ensure arguments is an object
136
+ if (!request.params.arguments || typeof request.params.arguments !== 'object') {
137
+ throw new Error("Arguments must be an object");
138
+ }
139
+
140
+ const args = request.params.arguments;
141
+
142
+ // Validate required fields
143
+ if (!args.query) {
144
+ throw new Error("Query is required in arguments");
145
+ }
146
+
147
+ const result = await this.executeDocsSearch(args);
148
+
149
+ return {
150
+ content: [
151
+ {
152
+ type: 'text',
153
+ text: result,
154
+ },
155
+ ],
156
+ };
157
+ } catch (error) {
158
+ console.error(`Error executing ${request.params.name}:`, error);
159
+ return {
160
+ content: [
161
+ {
162
+ type: 'text',
163
+ text: `Error executing ${request.params.name}: ${error instanceof Error ? error.message : String(error)}`,
164
+ },
165
+ ],
166
+ isError: true,
167
+ };
168
+ }
169
+ });
170
+ }
171
+
172
+ /**
173
+ * Execute a documentation search
174
+ * @param {SearchDocsArgs} args - Search arguments
175
+ * @returns {Promise<string>} Search results
176
+ * @private
177
+ */
178
+ async executeDocsSearch(args) {
179
+ try {
180
+ // Always use the configured data directory
181
+ const searchPath = config.dataDir;
182
+
183
+ // Create a clean options object
184
+ const options = {
185
+ path: searchPath,
186
+ query: args.query,
187
+ maxTokens: 10000
188
+ };
189
+
190
+ console.error("Executing search with options:", JSON.stringify(options, null, 2));
191
+
192
+ // Call search with the options object
193
+ const result = await search(options);
194
+ return result;
195
+ } catch (error) {
196
+ console.error('Error executing docs search:', error);
197
+ throw new McpError(
198
+ ErrorCode.MethodNotFound,
199
+ `Error executing docs search: ${error.message || String(error)}`
200
+ );
201
+ }
202
+ }
203
+
204
+ /**
205
+ * Check for updates in the Git repository and pull changes.
206
+ * @private
207
+ */
208
+ async checkForUpdates() {
209
+ if (!config.gitUrl || !git) return;
210
+
211
+ console.log('Checking for documentation updates...');
212
+ try {
213
+ const isRepo = await git.checkIsRepo();
214
+ if (!isRepo) {
215
+ console.error(`Data directory ${config.dataDir} is not a Git repository. Skipping update.`);
216
+ return;
217
+ }
218
+
219
+ await git.fetch();
220
+ const status = await git.status();
221
+
222
+ if (status.behind > 0) {
223
+ console.log(`Local branch is ${status.behind} commits behind origin/${status.tracking}. Pulling updates...`);
224
+ await git.pull('origin', config.gitRef);
225
+ console.log('Documentation updated successfully.');
226
+ } else {
227
+ console.log('Documentation is up-to-date.');
228
+ }
229
+ } catch (error) {
230
+ console.error('Error checking for updates:', error);
231
+ } finally {
232
+ if (config.autoUpdateInterval > 0) {
233
+ updateTimer = setTimeout(() => this.checkForUpdates(), config.autoUpdateInterval * 60 * 1000);
234
+ }
235
+ }
236
+ }
237
+
238
+ /**
239
+ * Downloads and extracts a tarball archive from a Git repository URL.
240
+ * @private
241
+ */
242
+ async downloadAndExtractTarballRuntime() {
243
+ const match = config.gitUrl.match(/github\.com\/([^/]+)\/([^/]+?)(\.git)?$/);
244
+ if (!match) {
245
+ console.error(`Cannot determine tarball URL from gitUrl: ${config.gitUrl}. Cannot proceed.`);
246
+ throw new Error('Invalid or unsupported Git URL for tarball download.');
247
+ }
248
+
249
+ const owner = match[1];
250
+ const repo = match[2];
251
+ let ref = config.gitRef || 'main';
252
+
253
+ const downloadAttempt = async (currentRef) => {
254
+ const tarballUrl = `https://github.com/${owner}/${repo}/archive/${currentRef}.tar.gz`;
255
+ console.log(`Attempting to download archive (${currentRef}) from ${tarballUrl} to ${config.dataDir}...`);
256
+
257
+ await fs.emptyDir(config.dataDir);
258
+
259
+ const response = await axios({
260
+ method: 'get',
261
+ url: tarballUrl,
262
+ responseType: 'stream',
263
+ validateStatus: (status) => status >= 200 && status < 300,
264
+ });
265
+
266
+ await new Promise((resolve, reject) => {
267
+ response.data
268
+ .pipe(
269
+ tar.x({
270
+ strip: 1,
271
+ C: config.dataDir,
272
+ })
273
+ )
274
+ .on('finish', resolve)
275
+ .on('error', reject);
276
+ });
277
+ console.log(`Successfully downloaded and extracted archive (${currentRef}) to ${config.dataDir}`);
278
+ };
279
+
280
+ try {
281
+ await downloadAttempt(ref);
282
+ } catch (error) {
283
+ if (ref === 'main' && error.response && error.response.status === 404) {
284
+ console.warn(`Download failed for ref 'main' (404). Retrying with 'master'...`);
285
+ ref = 'master';
286
+ try {
287
+ await downloadAttempt(ref);
288
+ } catch (retryError) {
289
+ console.error(`Retry with 'master' also failed: ${retryError.message}`);
290
+ throw new Error(`Failed to download archive for both 'main' and 'master' refs.`);
291
+ }
292
+ } else {
293
+ console.error(`Error downloading or extracting tarball (${ref}): ${error.message}`);
294
+ throw error;
295
+ }
296
+ }
297
+ }
298
+
299
+ async run() {
300
+ try {
301
+ console.error("Starting DQM Docs MCP server...");
302
+ console.error(`Using data directory: ${config.dataDir}`);
303
+ console.error(`MCP Tool Name: ${config.toolName}`);
304
+ console.error(`MCP Tool Description: ${config.toolDescription}`);
305
+ if (config.gitUrl) {
306
+ console.error(`Using Git repository: ${config.gitUrl} (ref: ${config.gitRef})`);
307
+ console.error(`Auto-update interval: ${config.autoUpdateInterval} minutes`);
308
+ } else if (config.includeDir) {
309
+ console.error(`Using static directory: ${config.includeDir}`);
310
+ }
311
+
312
+ // Check for runtime overrides and pre-built data
313
+ const args = minimist(process.argv.slice(2));
314
+ const runtimeOverride = args.dataDir || args.gitUrl || args.includeDir ||
315
+ process.env.DATA_DIR || process.env.GIT_URL || process.env.INCLUDE_DIR;
316
+
317
+ let usePrebuiltData = false;
318
+ if (!runtimeOverride) {
319
+ try {
320
+ if (fs.existsSync(config.dataDir)) {
321
+ const items = await fs.readdir(config.dataDir);
322
+ if (items.length > 0) {
323
+ usePrebuiltData = true;
324
+ console.error(`Detected non-empty default data directory. Using pre-built content from ${config.dataDir}.`);
325
+ } else {
326
+ console.error(`Default data directory ${config.dataDir} exists but is empty. Will attempt fetch based on config.`);
327
+ }
328
+ } else {
329
+ console.error(`Default data directory ${config.dataDir} does not exist. Will attempt fetch based on config.`);
330
+ }
331
+ } catch (readDirError) {
332
+ console.error(`Error checking default data directory ${config.dataDir}:`, readDirError);
333
+ }
334
+ } else {
335
+ console.error('Runtime content source override detected. Ignoring pre-built data check.');
336
+ }
337
+
338
+ // Handle content source initialization
339
+ if (usePrebuiltData) {
340
+ console.error("Skipping content fetch, using pre-built data.");
341
+ if (updateTimer) clearTimeout(updateTimer);
342
+ updateTimer = null;
343
+ } else if (config.gitUrl) {
344
+ if (config.autoUpdateInterval > 0) {
345
+ console.error(`Auto-update enabled. Initializing Git for ${config.dataDir}...`);
346
+ if (!git) git = simpleGit(config.dataDir);
347
+ const isRepo = await git.checkIsRepo();
348
+
349
+ if (!isRepo) {
350
+ console.error(`Directory ${config.dataDir} is not a Git repository. Attempting initial clone...`);
351
+ try {
352
+ await fs.emptyDir(config.dataDir);
353
+ await simpleGit().clone(config.gitUrl, config.dataDir, ['--branch', config.gitRef, '--depth', '1']);
354
+ console.error(`Successfully cloned ${config.gitUrl} to ${config.dataDir}`);
355
+ } catch (cloneError) {
356
+ console.error(`Error during initial clone:`, cloneError);
357
+ process.exit(1);
358
+ }
359
+ }
360
+ console.error(`Directory ${config.dataDir} is a Git repository. Proceeding with update check.`);
361
+ await this.checkForUpdates();
362
+ } else {
363
+ console.error(`Auto-update disabled. Initializing content from tarball for ${config.gitUrl}...`);
364
+ try {
365
+ await this.downloadAndExtractTarballRuntime();
366
+ } catch (tarballError) {
367
+ console.error(`Failed to initialize from tarball:`, tarballError);
368
+ process.exit(1);
369
+ }
370
+ if (updateTimer) clearTimeout(updateTimer);
371
+ updateTimer = null;
372
+ }
373
+ } else if (config.includeDir && !runtimeOverride) {
374
+ console.error(`Warning: Config specifies includeDir (${config.includeDir}) but data dir (${config.dataDir}) is empty/missing and no runtime override provided.`);
375
+ if (updateTimer) clearTimeout(updateTimer);
376
+ updateTimer = null;
377
+ } else if (!runtimeOverride) {
378
+ console.error(`No content source specified and no pre-built data found in ${config.dataDir}. Server may have no data to search.`);
379
+ if (updateTimer) clearTimeout(updateTimer);
380
+ updateTimer = null;
381
+ }
382
+
383
+ // Connect the server to the transport
384
+ const transport = new StdioServerTransport();
385
+ await this.server.connect(transport);
386
+ console.error('DQM Docs MCP server running on stdio');
387
+ } catch (error) {
388
+ console.error('Error starting server:', error);
389
+ process.exit(1);
390
+ }
391
+ }
392
+ }
393
+
394
+ const server = new DocsMcpServer();
395
+ server.run().catch(console.error);