@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,460 @@
1
+ #!/bin/bash
2
+ set -e
3
+
4
+ # Enable command printing for debugging
5
+ # set -x
6
+
7
+ # Colors for output
8
+ RED='\033[0;31m'
9
+ GREEN='\033[0;32m'
10
+ BLUE='\033[0;34m'
11
+ YELLOW='\033[0;33m'
12
+ NC='\033[0m' # No Color
13
+
14
+ # Print banner
15
+ echo -e "${BLUE}"
16
+ echo "╔═══════════════════════════════════════════╗"
17
+ echo "║ ║"
18
+ echo "║ Probe - Code Search Tool Installer ║"
19
+ echo "║ ║"
20
+ echo "╚═══════════════════════════════════════════╝"
21
+ echo -e "${NC}"
22
+
23
+ # GitHub repository information
24
+ REPO_OWNER="probelabs"
25
+ REPO_NAME="probe"
26
+ BINARY_NAME="probe"
27
+ INSTALL_DIR="/usr/local/bin"
28
+
29
+ # Allow overriding the installation directory with the first argument
30
+ if [ -n "$1" ]; then
31
+ INSTALL_DIR="$1"
32
+ echo -e "${YELLOW}Custom installation directory: $INSTALL_DIR${NC}"
33
+ fi
34
+
35
+ # Check if running with sudo
36
+ if [ "$EUID" -ne 0 ]; then
37
+ if command -v sudo > /dev/null; then
38
+ SUDO="sudo"
39
+ echo -e "${YELLOW}This script will use sudo to install to $INSTALL_DIR${NC}"
40
+ else
41
+ echo -e "${RED}Error: This script needs to be run with root privileges to install to $INSTALL_DIR${NC}"
42
+ echo "Please run with sudo or as root"
43
+ exit 1
44
+ fi
45
+ else
46
+ SUDO=""
47
+ fi
48
+
49
+ # Detect OS and architecture
50
+ detect_os_arch() {
51
+ OS="$(uname -s)"
52
+ ARCH="$(uname -m)"
53
+
54
+ case "$OS" in
55
+ Linux)
56
+ OS_TYPE="linux"
57
+ # Accept both musl and gnu-named assets; prefer match by 'linux'
58
+ OS_KEYWORDS=("linux" "Linux" "musl" "gnu")
59
+ ;;
60
+ Darwin)
61
+ OS_TYPE="darwin"
62
+ OS_KEYWORDS=("darwin" "Darwin" "mac" "Mac" "apple" "Apple" "osx" "OSX")
63
+ ;;
64
+ MINGW*|MSYS*|CYGWIN*)
65
+ OS_TYPE="windows"
66
+ OS_KEYWORDS=("windows" "Windows" "win" "Win")
67
+ ;;
68
+ *)
69
+ echo -e "${RED}Unsupported operating system: $OS${NC}"
70
+ exit 1
71
+ ;;
72
+ esac
73
+
74
+ case "$ARCH" in
75
+ x86_64|amd64)
76
+ ARCH_TYPE="x86_64"
77
+ ARCH_KEYWORDS=("x86_64" "amd64" "x64" "64bit" "64-bit")
78
+ ;;
79
+ arm64|aarch64)
80
+ ARCH_TYPE="aarch64"
81
+ ARCH_KEYWORDS=("arm64" "aarch64" "arm" "ARM")
82
+ ;;
83
+ *)
84
+ echo -e "${RED}Unsupported architecture: $ARCH${NC}"
85
+ exit 1
86
+ ;;
87
+ esac
88
+
89
+ echo -e "${GREEN}Detected OS: $OS_TYPE, Architecture: $ARCH_TYPE${NC}"
90
+ }
91
+
92
+ # Get the latest release information
93
+ get_latest_release() {
94
+ echo -e "${BLUE}Fetching latest release information...${NC}"
95
+
96
+ # Get the latest release data with headers
97
+ RELEASE_RESPONSE=$(curl -s -i "https://api.github.com/repos/$REPO_OWNER/$REPO_NAME/releases/latest")
98
+
99
+ # Check for rate limiting
100
+ if echo "$RELEASE_RESPONSE" | grep -q "API rate limit exceeded"; then
101
+ echo -e "${RED}GitHub API rate limit exceeded${NC}"
102
+ echo -e "${YELLOW}Try again later${NC}"
103
+ exit 1
104
+ fi
105
+
106
+ # Extract the response body
107
+ RELEASE_DATA=$(echo "$RELEASE_RESPONSE" | sed '1,/^\r$/d')
108
+
109
+ # Check if we got a valid response
110
+ if echo "$RELEASE_RESPONSE" | grep -q "404 Not Found"; then
111
+ echo -e "${YELLOW}Latest release not found, trying to fetch all releases...${NC}"
112
+
113
+ # Try to get all releases instead
114
+ ALL_RELEASES=$(curl -s "https://api.github.com/repos/$REPO_OWNER/$REPO_NAME/releases")
115
+
116
+ # Extract the first release tag
117
+ LATEST_RELEASE=$(echo "$ALL_RELEASES" | grep -m 1 '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
118
+
119
+ if [ -z "$LATEST_RELEASE" ]; then
120
+ echo -e "${RED}No releases found for $REPO_OWNER/$REPO_NAME${NC}"
121
+ echo -e "${YELLOW}Checking if repository exists...${NC}"
122
+
123
+ REPO_INFO=$(curl -s "https://api.github.com/repos/$REPO_OWNER/$REPO_NAME")
124
+ if echo "$REPO_INFO" | grep -q '"message": "Not Found"'; then
125
+ echo -e "${RED}Repository $REPO_OWNER/$REPO_NAME not found${NC}"
126
+ exit 1
127
+ else
128
+ echo -e "${YELLOW}Repository exists but has no releases. Using default branch.${NC}"
129
+
130
+ # Get the default branch
131
+ DEFAULT_BRANCH=$(echo "$REPO_INFO" | grep '"default_branch":' | sed -E 's/.*"default_branch": "([^"]+)".*/\1/')
132
+ LATEST_RELEASE="$DEFAULT_BRANCH"
133
+
134
+ echo -e "${GREEN}Using default branch: $LATEST_RELEASE${NC}"
135
+
136
+ # For default branch, we'll need to use a different approach to get files
137
+ echo -e "${YELLOW}No release assets available. Please download the source code manually.${NC}"
138
+ exit 1
139
+ fi
140
+ else
141
+ # Extract assets from the first release
142
+ RELEASE_DATA=$(echo "$ALL_RELEASES" | sed -n "/\"tag_name\": \"$LATEST_RELEASE\"/,/\"url\"/p")
143
+ fi
144
+ else
145
+ # Extract the tag name from the latest release
146
+ LATEST_RELEASE=$(echo "$RELEASE_DATA" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
147
+ fi
148
+
149
+ if [ -z "$LATEST_RELEASE" ]; then
150
+ echo -e "${RED}Failed to fetch latest release tag${NC}"
151
+ echo -e "${YELLOW}API Response:${NC}"
152
+ echo "$RELEASE_DATA" | head -20
153
+ exit 1
154
+ fi
155
+
156
+ echo -e "${GREEN}Latest release: $LATEST_RELEASE${NC}"
157
+
158
+ # Extract the assets list using a more robust method
159
+ ASSETS_LIST=$(echo "$RELEASE_DATA" | grep -o '"browser_download_url": "[^"]*"' | sed -E 's/"browser_download_url": "([^"]+)"/\1/')
160
+
161
+ if [ -z "$ASSETS_LIST" ]; then
162
+ echo -e "${RED}No assets found for release $LATEST_RELEASE${NC}"
163
+ echo -e "${YELLOW}Trying alternative parsing method...${NC}"
164
+
165
+ # Try an alternative parsing method
166
+ ASSETS_LIST=$(echo "$RELEASE_DATA" | grep -A 2 '"browser_download_url"' | grep 'https://' | sed -E 's/.*"(https:[^"]+)".*/\1/')
167
+
168
+ # Debug: Print extracted assets from alternative method
169
+ echo "$ASSETS_LIST"
170
+
171
+ if [ -z "$ASSETS_LIST" ]; then
172
+ echo -e "${RED}Still no assets found. API response may be different than expected.${NC}"
173
+ echo -e "${YELLOW}API Response (first 20 lines):${NC}"
174
+ echo "$RELEASE_DATA" | head -20
175
+ exit 1
176
+ fi
177
+ fi
178
+
179
+ echo -e "${GREEN}Found $(echo "$ASSETS_LIST" | wc -l | tr -d ' ') assets for release $LATEST_RELEASE${NC}"
180
+ }
181
+
182
+ # Find the best matching asset for the current OS and architecture
183
+ find_best_asset() {
184
+ echo -e "${BLUE}Finding appropriate binary for $OS_TYPE $ARCH_TYPE...${NC}"
185
+
186
+ # Check if ASSETS_LIST is empty
187
+ if [ -z "$ASSETS_LIST" ]; then
188
+ echo -e "${RED}Error: Assets list is empty${NC}"
189
+ echo -e "${YELLOW}This could be due to an issue with the GitHub API response${NC}"
190
+ exit 1
191
+ fi
192
+
193
+ # Debug: Check if ASSETS_LIST contains valid URLs
194
+ if ! echo "$ASSETS_LIST" | grep -q "http"; then
195
+ echo -e "${RED}Error: Assets list does not contain valid URLs${NC}"
196
+ echo -e "${YELLOW}Assets list content:${NC}"
197
+ echo "$ASSETS_LIST"
198
+ exit 1
199
+ fi
200
+
201
+ # Initialize variables
202
+ BEST_ASSET=""
203
+ BEST_SCORE=0
204
+
205
+ # Process each asset
206
+ while IFS= read -r asset_url; do
207
+ asset_name=$(basename "$asset_url")
208
+ score=0
209
+
210
+ # Skip checksum files
211
+ if [[ "$asset_name" == *.sha256 || "$asset_name" == *.md5 || "$asset_name" == *.asc ]]; then
212
+ continue
213
+ fi
214
+
215
+ # Check for OS match
216
+ for keyword in "${OS_KEYWORDS[@]}"; do
217
+ if [[ "$asset_name" == *"$keyword"* ]]; then
218
+ score=$((score + 5))
219
+ break
220
+ fi
221
+ done
222
+
223
+ # Check for architecture match
224
+ for keyword in "${ARCH_KEYWORDS[@]}"; do
225
+ if [[ "$asset_name" == *"$keyword"* ]]; then
226
+ score=$((score + 5))
227
+ break
228
+ fi
229
+ done
230
+
231
+ # Prefer exact matches for binary name
232
+ if [[ "$asset_name" == "$BINARY_NAME-"* ]]; then
233
+ score=$((score + 3))
234
+ fi
235
+
236
+ # If we have a perfect match, use it immediately
237
+ if [ $score -eq 13 ]; then
238
+ BEST_ASSET="$asset_url"
239
+ ASSET_NAME="$asset_name"
240
+ echo -e "${GREEN}Found perfect match: $asset_name${NC}"
241
+
242
+ # Set ASSET_URL before returning
243
+ ASSET_URL="$BEST_ASSET"
244
+
245
+ return 0
246
+ fi
247
+
248
+ # Otherwise, keep track of the best match so far
249
+ if [ $score -gt $BEST_SCORE ]; then
250
+ BEST_SCORE=$score
251
+ BEST_ASSET="$asset_url"
252
+ ASSET_NAME="$asset_name"
253
+ fi
254
+ done <<< "$ASSETS_LIST"
255
+
256
+ # Debug: Print assets list
257
+ echo "$ASSETS_LIST"
258
+
259
+ # Check if we found a suitable asset
260
+ if [ -z "$BEST_ASSET" ]; then
261
+ echo -e "${RED}Could not find a suitable binary for $OS_TYPE $ARCH_TYPE${NC}"
262
+ echo -e "${YELLOW}Available assets:${NC}"
263
+ echo "$ASSETS_LIST"
264
+ exit 1
265
+ fi
266
+
267
+ echo -e "${GREEN}Selected asset: $ASSET_NAME (score: $BEST_SCORE)${NC}"
268
+
269
+ # Debug: Print best asset before assignment
270
+
271
+ # Ensure BEST_ASSET is not empty
272
+ if [ -z "$BEST_ASSET" ]; then
273
+ echo -e "${RED}Error: Best asset is empty even though we passed the earlier check${NC}"
274
+ exit 1
275
+ fi
276
+
277
+ ASSET_URL="$BEST_ASSET"
278
+
279
+ # Debug: Print selected asset URL
280
+ }
281
+
282
+ # Download the asset and checksum
283
+ download_asset() {
284
+ TEMP_DIR=$(mktemp -d)
285
+
286
+ # Debug: Print asset URL and name
287
+
288
+ # Check if ASSET_URL or ASSET_NAME is empty
289
+ if [ -z "$ASSET_URL" ]; then
290
+ echo -e "${RED}Error: Asset URL is empty${NC}"
291
+ echo -e "${YELLOW}This could be due to an issue with the GitHub API response or asset selection${NC}"
292
+ exit 1
293
+ fi
294
+
295
+ if [ -z "$ASSET_NAME" ]; then
296
+ echo -e "${RED}Error: Asset name is empty${NC}"
297
+ echo -e "${YELLOW}This could be due to an issue with the asset selection process${NC}"
298
+ exit 1
299
+ fi
300
+
301
+ # Check if ASSET_URL is a valid URL
302
+ if ! echo "$ASSET_URL" | grep -q "^https\?://"; then
303
+ echo -e "${RED}Error: Asset URL is not a valid URL: $ASSET_URL${NC}"
304
+ echo -e "${YELLOW}This could be due to an issue with the GitHub API response or asset selection${NC}"
305
+ exit 1
306
+ fi
307
+
308
+ CHECKSUM_URL="$ASSET_URL.sha256"
309
+
310
+ echo -e "${BLUE}Downloading $ASSET_NAME...${NC}"
311
+ curl -L -o "$TEMP_DIR/$ASSET_NAME" "$ASSET_URL" || {
312
+ echo -e "${RED}Failed to download $ASSET_NAME${NC}"
313
+ exit 1
314
+ }
315
+
316
+ echo -e "${BLUE}Downloading checksum...${NC}"
317
+ if curl -L -s -f -o "$TEMP_DIR/$ASSET_NAME.sha256" "$CHECKSUM_URL"; then
318
+ HAS_CHECKSUM=true
319
+ else
320
+ echo -e "${YELLOW}No checksum file found, skipping verification${NC}"
321
+ HAS_CHECKSUM=false
322
+ fi
323
+
324
+ return 0
325
+ }
326
+
327
+ # Verify the checksum
328
+ verify_checksum() {
329
+ if [ "$HAS_CHECKSUM" = false ]; then
330
+ return 0
331
+ fi
332
+
333
+ echo -e "${BLUE}Verifying checksum...${NC}"
334
+
335
+ cd "$TEMP_DIR"
336
+
337
+ if [ "$OS_TYPE" = "darwin" ] || [ "$OS_TYPE" = "linux" ]; then
338
+ # Get the expected checksum from the file
339
+ EXPECTED_CHECKSUM=$(cat "$ASSET_NAME.sha256" | awk '{print $1}')
340
+
341
+ # Calculate the actual checksum
342
+ if command -v shasum > /dev/null; then
343
+ ACTUAL_CHECKSUM=$(shasum -a 256 "$ASSET_NAME" | awk '{print $1}')
344
+ else
345
+ ACTUAL_CHECKSUM=$(sha256sum "$ASSET_NAME" | awk '{print $1}')
346
+ fi
347
+ else
348
+ # Windows
349
+ EXPECTED_CHECKSUM=$(cat "$ASSET_NAME.sha256")
350
+ ACTUAL_CHECKSUM=$(certutil -hashfile "$ASSET_NAME" SHA256 | grep -v "hash" | tr -d " \t\r\n")
351
+ fi
352
+
353
+ if [ "$EXPECTED_CHECKSUM" != "$ACTUAL_CHECKSUM" ]; then
354
+ echo -e "${RED}Checksum verification failed!${NC}"
355
+ echo "Expected: $EXPECTED_CHECKSUM"
356
+ echo "Actual: $ACTUAL_CHECKSUM"
357
+ exit 1
358
+ fi
359
+
360
+ echo -e "${GREEN}Checksum verified successfully${NC}"
361
+ }
362
+
363
+ # Extract and install the binary
364
+ install_binary() {
365
+ echo -e "${BLUE}Installing $BINARY_NAME to $INSTALL_DIR...${NC}"
366
+
367
+ cd "$TEMP_DIR"
368
+
369
+ # Determine file type and extract accordingly
370
+ if [[ "$ASSET_NAME" == *.tar.gz || "$ASSET_NAME" == *.tgz ]]; then
371
+ tar -xzf "$ASSET_NAME"
372
+ elif [[ "$ASSET_NAME" == *.zip ]]; then
373
+ unzip -q "$ASSET_NAME"
374
+ elif [[ "$ASSET_NAME" == *.tar.bz2 || "$ASSET_NAME" == *.tbz2 ]]; then
375
+ tar -xjf "$ASSET_NAME"
376
+ elif [[ "$ASSET_NAME" == *.tar.xz || "$ASSET_NAME" == *.txz ]]; then
377
+ tar -xJf "$ASSET_NAME"
378
+ else
379
+ # Assume it's a direct binary
380
+ chmod +x "$ASSET_NAME"
381
+ $SUDO mv "$ASSET_NAME" "$INSTALL_DIR/$BINARY_NAME"
382
+ echo -e "${GREEN}Successfully installed $BINARY_NAME to $INSTALL_DIR/$BINARY_NAME${NC}"
383
+ cd - > /dev/null
384
+ rm -rf "$TEMP_DIR"
385
+ return 0
386
+ fi
387
+
388
+ # Find the binary in the extracted files
389
+ if [ "$OS_TYPE" = "windows" ]; then
390
+ BINARY_FILE=$(find . -type f -name "$BINARY_NAME.exe" | head -1)
391
+ if [ -z "$BINARY_FILE" ]; then
392
+ BINARY_FILE=$(find . -type f -name "*.exe" | head -1)
393
+ fi
394
+ else
395
+ BINARY_FILE=$(find . -type f -name "$BINARY_NAME" | head -1)
396
+ if [ -z "$BINARY_FILE" ]; then
397
+ # Look for any executable file
398
+ BINARY_FILE=$(find . -type f -executable | grep -v "\.sh$" | head -1)
399
+ fi
400
+ fi
401
+
402
+ if [ -z "$BINARY_FILE" ]; then
403
+ echo -e "${RED}Binary not found in the archive${NC}"
404
+ echo -e "${YELLOW}Archive contents:${NC}"
405
+ find . -type f | sort
406
+ exit 1
407
+ fi
408
+
409
+ chmod +x "$BINARY_FILE"
410
+ $SUDO mv "$BINARY_FILE" "$INSTALL_DIR/$BINARY_NAME"
411
+
412
+ echo -e "${GREEN}Successfully installed $BINARY_NAME to $INSTALL_DIR/$BINARY_NAME${NC}"
413
+
414
+ # Clean up
415
+ cd - > /dev/null
416
+ rm -rf "$TEMP_DIR"
417
+ }
418
+
419
+ # Check if the binary is in PATH
420
+ check_path() {
421
+ if command -v "$BINARY_NAME" > /dev/null; then
422
+ echo -e "${GREEN}$BINARY_NAME is now available in your PATH${NC}"
423
+ echo -e "${BLUE}You can run it with: ${GREEN}$BINARY_NAME${NC}"
424
+
425
+ # Display version if available
426
+ if $BINARY_NAME --version &>/dev/null; then
427
+ echo -e "${BLUE}Installed version: ${GREEN}$($BINARY_NAME --version)${NC}"
428
+ elif $BINARY_NAME version &>/dev/null; then
429
+ echo -e "${BLUE}Installed version: ${GREEN}$($BINARY_NAME version)${NC}"
430
+ fi
431
+ else
432
+ echo -e "${YELLOW}Warning: $INSTALL_DIR is not in your PATH${NC}"
433
+ echo -e "You can run the binary with: ${GREEN}$INSTALL_DIR/$BINARY_NAME${NC}"
434
+ echo -e "To add it to your PATH, add this line to your shell profile:"
435
+ echo -e "${BLUE}export PATH=\$PATH:$INSTALL_DIR${NC}"
436
+ fi
437
+ }
438
+
439
+ # Main installation process
440
+ main() {
441
+ detect_os_arch
442
+ get_latest_release
443
+ find_best_asset
444
+
445
+ # Debug: Check if ASSET_URL is set before proceeding
446
+ if [ -z "$ASSET_URL" ]; then
447
+ echo -e "${RED}Error: Asset URL is not set after find_best_asset${NC}"
448
+ exit 1
449
+ fi
450
+
451
+ download_asset
452
+ verify_checksum
453
+ install_binary
454
+ check_path
455
+
456
+ echo -e "${GREEN}Installation completed successfully!${NC}"
457
+ }
458
+
459
+ # Run the installation
460
+ main