@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,508 @@
1
+ # Probe - Code Search Tool Installer for Windows
2
+ # PowerShell version of the install.sh script
3
+
4
+ # Set error action preference to stop on any error
5
+ $ErrorActionPreference = "Stop"
6
+
7
+ # Function to write colored output
8
+ function Write-ColorOutput {
9
+ param (
10
+ [Parameter(Mandatory=$true)]
11
+ [string]$Message,
12
+
13
+ [Parameter(Mandatory=$false)]
14
+ [string]$Color = "White"
15
+ )
16
+
17
+ Write-Host $Message -ForegroundColor $Color
18
+ }
19
+
20
+ # Print banner
21
+ Write-ColorOutput -Message "+-----------------------------------------------+" -Color 'Cyan'
22
+ Write-ColorOutput -Message "| |" -Color 'Cyan'
23
+ Write-ColorOutput -Message "| Probe - Code Search Tool Installer |" -Color 'Cyan'
24
+ Write-ColorOutput -Message "| |" -Color 'Cyan'
25
+ Write-ColorOutput -Message "+-----------------------------------------------+" -Color 'Cyan'
26
+
27
+ # GitHub repository information
28
+ $RepoOwner = "probelabs"
29
+ $RepoName = "probe"
30
+ $BinaryName = "probe"
31
+ $DefaultSystemDir = "$env:ProgramFiles\Probe" # Default system-wide install directory
32
+
33
+ $DefaultUserDir = "$env:LOCALAPPDATA\Probe" # Default user-level install directory
34
+ $InstallDir = $DefaultUserDir # Default to user-level installation
35
+ $InstallMode = "user" # Default installation mode
36
+
37
+ # Parse command-line arguments
38
+ for ($i = 0; $i -lt $args.Count; $i++) {
39
+ if ($args[$i] -eq "--system" -or $args[$i] -eq "-s") {
40
+ $InstallDir = $DefaultSystemDir
41
+ $InstallMode = "system"
42
+ Write-ColorOutput -Message "System-wide installation selected (requires admin privileges)" -Color 'Yellow'
43
+ }
44
+ elseif ($args[$i] -eq "--user" -or $args[$i] -eq "-u") {
45
+ $InstallDir = $DefaultUserDir
46
+ $InstallMode = "user"
47
+ Write-ColorOutput -Message "User-level installation selected" -Color 'Green'
48
+ }
49
+ elseif ($args[$i] -eq "--dir" -or $args[$i] -eq "-d") {
50
+ if ($i + 1 -lt $args.Count) {
51
+ $InstallDir = $args[$i + 1]
52
+ $i++
53
+ Write-ColorOutput -Message "Custom installation directory: $InstallDir" -Color 'Yellow'
54
+ }
55
+ }
56
+ elseif ($args[$i] -eq "--help" -or $args[$i] -eq "-h") {
57
+ Write-ColorOutput -Message "Usage: .\install.ps1 [options]" -Color 'Cyan'
58
+ Write-ColorOutput -Message "Options:" -Color 'Cyan'
59
+ Write-ColorOutput -Message " --system, -s Install system-wide (requires admin privileges)" -Color 'Cyan'
60
+ Write-ColorOutput -Message " --user, -u Install for current user only (default)" -Color 'Cyan'
61
+ Write-ColorOutput -Message " --dir, -d DIR Install to a custom directory" -Color 'Cyan'
62
+ Write-ColorOutput -Message " --help, -h Show this help message" -Color 'Cyan'
63
+ exit 0
64
+ }
65
+
66
+ }
67
+
68
+ # Check for administrator privileges
69
+ $IsAdmin = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
70
+ if (-not $IsAdmin) {
71
+ if ($InstallMode -eq "system") {
72
+ Write-ColorOutput -Message 'Error: System-wide installation requires administrator privileges' -Color 'Red'
73
+ Write-Host 'Please run PowerShell as Administrator and try again, or use --user for user-level installation.'
74
+ exit 1
75
+ }
76
+ Write-ColorOutput -Message 'Running in user mode - installing to user directory' -Color 'Yellow'
77
+
78
+ }
79
+
80
+ # Detect architecture
81
+ function Get-SystemArchitecture {
82
+ $Arch = [System.Environment]::GetEnvironmentVariable("PROCESSOR_ARCHITECTURE")
83
+
84
+ if ($Arch -eq "AMD64") {
85
+ $ArchType = "x86_64"
86
+ $ArchKeywords = @("x86_64", "amd64", "x64", "64bit", "64-bit")
87
+ }
88
+ elseif ($Arch -eq "ARM64") {
89
+ $ArchType = "aarch64"
90
+ $ArchKeywords = @("arm64", "aarch64", "arm", "ARM")
91
+ }
92
+ else {
93
+ Write-ColorOutput -Message "Unsupported architecture: $Arch" -Color 'Red'
94
+ exit 1
95
+ }
96
+
97
+ Write-ColorOutput -Message "Detected OS: windows, Architecture: $ArchType" -Color 'Green'
98
+
99
+ return @{
100
+ ArchType = $ArchType
101
+ ArchKeywords = $ArchKeywords
102
+ OSType = "windows"
103
+ OSKeywords = @("windows", "Windows", "win", "Win")
104
+ }
105
+ }
106
+
107
+ # Get the latest release information
108
+ function Get-LatestRelease {
109
+ Write-ColorOutput -Message 'Fetching latest release information...' -Color 'Cyan'
110
+
111
+ try {
112
+ $ReleaseResponse = Invoke-RestMethod -Uri "https://api.github.com/repos/$RepoOwner/$RepoName/releases/latest" -ErrorAction Stop
113
+
114
+ if ($null -eq $ReleaseResponse) {
115
+ Write-ColorOutput -Message 'Latest release not found, trying to fetch all releases...' -Color 'Yellow'
116
+
117
+ $AllReleases = Invoke-RestMethod -Uri "https://api.github.com/repos/$RepoOwner/$RepoName/releases" -ErrorAction SilentlyContinue
118
+
119
+ if ($null -eq $AllReleases -or $AllReleases.Count -eq 0) {
120
+ Write-ColorOutput -Message "No releases found for $RepoOwner/$RepoName" -Color 'Red'
121
+ Write-ColorOutput -Message 'Checking if repository exists...' -Color 'Yellow'
122
+
123
+ try {
124
+ $RepoInfo = Invoke-RestMethod -Uri "https://api.github.com/repos/$RepoOwner/$RepoName" -ErrorAction SilentlyContinue
125
+
126
+ if ($null -ne $RepoInfo) {
127
+ Write-ColorOutput -Message 'Repository exists but has no releases. Using default branch.' -Color 'Yellow'
128
+
129
+ $DefaultBranch = $RepoInfo.default_branch
130
+ $LatestRelease = $DefaultBranch
131
+
132
+ Write-ColorOutput -Message "Using default branch: $LatestRelease" -Color 'Green'
133
+ Write-ColorOutput -Message 'No release assets available. Please download the source code manually.' -Color 'Yellow'
134
+ exit 1
135
+ }
136
+ }
137
+ catch {
138
+ Write-ColorOutput -Message "Repository $RepoOwner/$RepoName not found" -Color 'Red'
139
+ exit 1
140
+ }
141
+ }
142
+ else {
143
+ $ReleaseResponse = $AllReleases[0]
144
+ }
145
+ }
146
+
147
+ $LatestRelease = $ReleaseResponse.tag_name
148
+ Write-ColorOutput -Message "Latest release: $LatestRelease" -Color 'Green'
149
+
150
+ $AssetsList = $ReleaseResponse.assets | ForEach-Object { $_.browser_download_url }
151
+
152
+ if ($null -eq $AssetsList -or $AssetsList.Count -eq 0) {
153
+ Write-ColorOutput -Message "No assets found for release $LatestRelease" -Color 'Red'
154
+ exit 1
155
+ }
156
+
157
+ Write-ColorOutput -Message "Found $($AssetsList.Count) assets for release $LatestRelease" -Color 'Green'
158
+
159
+ return @{
160
+ LatestRelease = $LatestRelease
161
+ AssetsList = $AssetsList
162
+ }
163
+ }
164
+ catch {
165
+ Write-ColorOutput -Message 'Failed to fetch release information' -Color 'Red'
166
+ Write-Host 'Error details: ' -NoNewline
167
+ Write-Host $_
168
+ exit 1
169
+ }
170
+ }
171
+
172
+ # Find the best matching asset for the current OS and architecture
173
+ function Find-BestAsset {
174
+ param (
175
+ [string[]]$AssetsList,
176
+ [string[]]$OSKeywords,
177
+ [string[]]$ArchKeywords,
178
+ [string]$ArchType
179
+ )
180
+
181
+ Write-ColorOutput -Message "Finding appropriate binary for Windows $ArchType..." -Color 'Cyan'
182
+
183
+ if ($null -eq $AssetsList -or $AssetsList.Count -eq 0) {
184
+ Write-ColorOutput -Message 'Error: Assets list is empty' -Color 'Red'
185
+ Write-ColorOutput -Message 'This could be due to an issue with the GitHub API response' -Color 'Yellow'
186
+ exit 1
187
+ }
188
+
189
+ $BestAsset = $null
190
+ $BestScore = 0
191
+ $AssetName = $null
192
+
193
+ foreach ($AssetUrl in $AssetsList) {
194
+ $AssetBaseName = Split-Path -Leaf $AssetUrl
195
+ $Score = 0
196
+
197
+ # Skip checksum files
198
+ if ($AssetBaseName -match '\.sha256$|\.md5$|\.asc$') {
199
+ continue
200
+ }
201
+
202
+ # Skip non-Windows binaries (darwin = macOS, linux = Linux)
203
+ if ($AssetBaseName -match 'darwin|linux') {
204
+ Write-ColorOutput -Message "Skipping non-Windows binary: $AssetBaseName" -Color 'Yellow'
205
+ continue
206
+ }
207
+
208
+ # Check for OS match
209
+ foreach ($Keyword in $OSKeywords) {
210
+ if ($AssetBaseName -match [regex]::Escape($Keyword)) {
211
+ $Score += 5
212
+ break
213
+ }
214
+ }
215
+
216
+ # Check for architecture match
217
+ foreach ($Keyword in $ArchKeywords) {
218
+ if ($AssetBaseName -match [regex]::Escape($Keyword)) {
219
+ $Score += 5
220
+ break
221
+ }
222
+ }
223
+
224
+ # Prefer exact matches for binary name
225
+ if ($AssetBaseName -match "^$BinaryName-") {
226
+ $Score += 3
227
+ }
228
+
229
+ # If we have a perfect match, use it immediately
230
+ if ($Score -eq 13) {
231
+ $BestAsset = $AssetUrl
232
+ $AssetName = $AssetBaseName
233
+ Write-ColorOutput -Message "Found perfect match: $AssetBaseName" -Color 'Green'
234
+ return @{
235
+ AssetUrl = $BestAsset
236
+ AssetName = $AssetName
237
+ }
238
+ }
239
+
240
+ # Otherwise, keep track of the best match so far
241
+ if ($Score -gt $BestScore) {
242
+ $BestScore = $Score
243
+ $BestAsset = $AssetUrl
244
+ $AssetName = $AssetBaseName
245
+ }
246
+ }
247
+
248
+ if ($null -eq $BestAsset) {
249
+ Write-ColorOutput -Message "Could not find a suitable binary for windows $ArchType" -Color 'Red'
250
+ Write-ColorOutput -Message 'Available assets:' -Color 'Yellow'
251
+ $AssetsList | ForEach-Object { $AssetName = Split-Path -Leaf $_; Write-Host "- $AssetName" }
252
+ exit 1
253
+ }
254
+
255
+ Write-ColorOutput -Message "Selected asset: $AssetName (score: $BestScore)" -Color 'Green'
256
+
257
+ return @{
258
+ AssetUrl = $BestAsset
259
+ AssetName = $AssetName
260
+ }
261
+ }
262
+
263
+ # Save the asset
264
+ function Save-Asset {
265
+ param (
266
+ [string]$AssetUrl,
267
+ [string]$AssetName
268
+ )
269
+
270
+ $TempDir = Join-Path -Path $env:TEMP -ChildPath ([System.Guid]::NewGuid().ToString())
271
+ New-Item -ItemType Directory -Path $TempDir -Force | Out-Null
272
+
273
+ if ([string]::IsNullOrEmpty($AssetUrl)) {
274
+ Write-ColorOutput -Message 'Error: Asset URL is empty' -Color 'Red'
275
+ Write-ColorOutput -Message 'This could be due to an issue with the GitHub API response or asset selection' -Color 'Yellow'
276
+ exit 1
277
+ }
278
+
279
+ if ([string]::IsNullOrEmpty($AssetName)) {
280
+ Write-ColorOutput -Message 'Error: Asset name is empty' -Color 'Red'
281
+ Write-ColorOutput -Message 'This could be due to an issue with the asset selection process' -Color 'Yellow'
282
+ exit 1
283
+ }
284
+
285
+ $ChecksumUrl = "$AssetUrl.sha256"
286
+ $AssetPath = Join-Path -Path $TempDir -ChildPath $AssetName
287
+ $ChecksumPath = "$AssetPath.sha256"
288
+
289
+ Write-ColorOutput -Message "Downloading $AssetName..." -Color 'Cyan'
290
+ try {
291
+ Invoke-WebRequest -Uri $AssetUrl -OutFile $AssetPath -ErrorAction Stop
292
+ }
293
+ catch {
294
+ Write-ColorOutput -Message "Failed to download $AssetName" -Color 'Red'
295
+ Write-Host 'Error details: ' -NoNewline
296
+ Write-Host $_
297
+ exit 1
298
+ }
299
+
300
+ Write-ColorOutput -Message 'Downloading checksum...' -Color 'Cyan'
301
+ try {
302
+ Invoke-WebRequest -Uri $ChecksumUrl -OutFile $ChecksumPath -ErrorAction SilentlyContinue
303
+ $HasChecksum = $?
304
+ }
305
+ catch {
306
+ Write-ColorOutput -Message 'No checksum file found, skipping verification' -Color 'Yellow'
307
+ $HasChecksum = $false
308
+ }
309
+
310
+ return @{
311
+ TempDir = $TempDir
312
+ AssetPath = $AssetPath
313
+ ChecksumPath = $ChecksumPath
314
+ HasChecksum = $HasChecksum
315
+ }
316
+ }
317
+
318
+ # Verify the checksum
319
+ function Test-AssetChecksum {
320
+ param (
321
+ [string]$AssetPath,
322
+ [string]$ChecksumPath,
323
+ [bool]$HasChecksum
324
+ )
325
+
326
+ if (-not $HasChecksum) {
327
+ return $true
328
+ }
329
+
330
+ Write-ColorOutput -Message 'Verifying checksum...' -Color 'Cyan'
331
+
332
+ # Get the expected checksum from the file
333
+ $ExpectedChecksum = Get-Content -Path $ChecksumPath -Raw
334
+ $ExpectedChecksum = $ExpectedChecksum.Trim()
335
+
336
+ # Calculate the actual checksum
337
+ $ActualChecksum = (Get-FileHash -Path $AssetPath -Algorithm SHA256).Hash.ToLower()
338
+
339
+ if ($ExpectedChecksum -notmatch $ActualChecksum) {
340
+ Write-ColorOutput -Message 'Checksum verification failed!' -Color 'Red'
341
+ Write-Host "Expected: $ExpectedChecksum"
342
+ Write-Host "Actual: $ActualChecksum"
343
+ exit 1
344
+ }
345
+
346
+ Write-ColorOutput -Message 'Checksum verified successfully' -Color 'Green'
347
+ return $true
348
+ }
349
+
350
+ # Install the binary
351
+ function Install-Binary {
352
+ param (
353
+ [string]$TempDir,
354
+ [string]$AssetPath,
355
+ [string]$AssetName,
356
+ [string]$InstallDir
357
+ )
358
+
359
+ Write-ColorOutput -Message "Installing $BinaryName to $InstallDir..." -Color 'Cyan'
360
+
361
+ # Create the installation directory if it doesn't exist
362
+ if (-not (Test-Path -Path $InstallDir)) {
363
+ New-Item -ItemType Directory -Path $InstallDir -Force | Out-Null
364
+ }
365
+
366
+ # Determine file type and extract accordingly
367
+ if ($AssetName -match '\.tar\.gz$|\.tgz$') {
368
+ # Extract using tar (Windows 10 has built-in tar support)
369
+ tar -xzf $AssetPath -C $TempDir -ErrorAction Stop
370
+ }
371
+ elseif ($AssetName -match '\.zip$') {
372
+ Expand-Archive -Path $AssetPath -DestinationPath $TempDir -Force -ErrorAction Stop
373
+ }
374
+ elseif ($AssetName -match '\.tar\.bz2$|\.tbz2$') {
375
+ tar -xjf $AssetPath -C $TempDir -ErrorAction Stop
376
+ }
377
+ elseif ($AssetName -match '\.tar\.xz$|\.txz$') {
378
+ tar -xf $AssetPath -C $TempDir -ErrorAction Stop
379
+ }
380
+ else {
381
+ # Assume it's a direct binary
382
+ $BinaryFile = Join-Path -Path $InstallDir -ChildPath "$BinaryName.exe"
383
+ Copy-Item -Path $AssetPath -Destination $BinaryFile -Force
384
+ Write-ColorOutput -Message "Successfully installed $BinaryName to $BinaryFile" -Color 'Green'
385
+ return $BinaryFile
386
+ }
387
+
388
+ # Find the binary in the extracted files
389
+ $BinaryFile = Get-ChildItem -Path $TempDir -Recurse -Filter "$BinaryName.exe" -ErrorAction SilentlyContinue | Select-Object -First 1 -ExpandProperty FullName
390
+
391
+ if ([string]::IsNullOrEmpty($BinaryFile)) {
392
+ # Look for any .exe file
393
+ $BinaryFile = Get-ChildItem -Path $TempDir -Recurse -Filter "*.exe" -ErrorAction SilentlyContinue | Select-Object -First 1 -ExpandProperty FullName
394
+ }
395
+
396
+ if ([string]::IsNullOrEmpty($BinaryFile)) {
397
+ Write-ColorOutput -Message 'Binary not found in the archive' -Color 'Red'
398
+ Write-ColorOutput -Message 'Archive contents:' -Color 'Yellow'
399
+ Get-ChildItem -Path $TempDir -Recurse | ForEach-Object { Write-Host " $_" }
400
+ exit 1
401
+ }
402
+
403
+ $DestBinaryFile = Join-Path -Path $InstallDir -ChildPath "$BinaryName.exe"
404
+ Copy-Item -Path $BinaryFile -Destination $DestBinaryFile -Force -ErrorAction Stop
405
+
406
+ Write-ColorOutput -Message "Successfully installed $BinaryName to $DestBinaryFile" -Color 'Green'
407
+
408
+ # Clean up
409
+ Remove-Item -Path $TempDir -Recurse -Force
410
+
411
+ return $DestBinaryFile
412
+ }
413
+
414
+ # Check PATH availability
415
+ function Test-PathAvailability {
416
+ param (
417
+ [string]$InstallDir,
418
+ [string]$BinaryFile
419
+ )
420
+
421
+ $EnvPath = [System.Environment]::GetEnvironmentVariable("PATH", "Machine")
422
+
423
+ $UserPath = [System.Environment]::GetEnvironmentVariable("PATH", "User")
424
+ $PathScope = "Machine"
425
+
426
+ # For user-level installation, check and modify user PATH
427
+ if ($InstallMode -eq "user" -or -not $IsAdmin) {
428
+ $EnvPath = $UserPath
429
+ $PathScope = "User"
430
+ }
431
+
432
+ # Check if already in PATH
433
+ if (($EnvPath -split ';' -contains $InstallDir) -or ($UserPath -split ';' -contains $InstallDir)) {
434
+ Write-ColorOutput -Message "$BinaryName is now available in your PATH" -Color 'Green'
435
+ Write-ColorOutput -Message "You can run it with: $BinaryName" -Color 'Cyan'
436
+
437
+ # Display version if available
438
+ try {
439
+ $Version = & $BinaryFile --version 2>$null
440
+ if ($? -and $LASTEXITCODE -eq 0) {
441
+ Write-ColorOutput -Message "Installed version: $Version" -Color 'Green'
442
+ }
443
+ else {
444
+ $Version = & $BinaryFile version -ErrorAction SilentlyContinue 2>$null
445
+ if ($LASTEXITCODE -eq 0) {
446
+ Write-ColorOutput -Message "Installed version: $Version" -Color 'Green'
447
+ }
448
+ }
449
+ }
450
+ catch {
451
+ # Unable to get version
452
+ }
453
+ }
454
+ else {
455
+
456
+
457
+ Write-ColorOutput -Message "Warning: $InstallDir is not in your PATH" -Color 'Yellow'
458
+ Write-Host "You can run the binary with: $BinaryFile"
459
+ Write-Host "To add it to your $PathScope PATH, run this command:"
460
+ $pathCmd = @"
461
+ [Environment]::SetEnvironmentVariable('PATH', [Environment]::GetEnvironmentVariable('PATH', '$PathScope') + ';$InstallDir', '$PathScope')
462
+ "@
463
+ Write-ColorOutput -Message $pathCmd -Color 'Cyan'
464
+
465
+
466
+ Write-Host 'Then restart your terminal for the changes to take effect.'
467
+ }
468
+ }
469
+
470
+ # Main installation process
471
+ function Start-Installation {
472
+ try {
473
+ $ArchInfo = Get-SystemArchitecture
474
+ $ArchType = $ArchInfo.ArchType
475
+ $ArchKeywords = $ArchInfo.ArchKeywords
476
+ $OSKeywords = $ArchInfo.OSKeywords
477
+
478
+ $ReleaseInfo = Get-LatestRelease
479
+ $AssetsList = $ReleaseInfo.AssetsList
480
+
481
+ $AssetInfo = Find-BestAsset -AssetsList $AssetsList -OSKeywords $OSKeywords -ArchKeywords $ArchKeywords -ArchType $ArchType
482
+ $AssetUrl = $AssetInfo.AssetUrl
483
+ $AssetName = $AssetInfo.AssetName
484
+
485
+ $DownloadInfo = Save-Asset -AssetUrl $AssetUrl -AssetName $AssetName
486
+ $TempDir = $DownloadInfo.TempDir
487
+ $AssetPath = $DownloadInfo.AssetPath
488
+ $ChecksumPath = $DownloadInfo.ChecksumPath
489
+ $HasChecksum = $DownloadInfo.HasChecksum
490
+
491
+ Test-AssetChecksum -AssetPath $AssetPath -ChecksumPath $ChecksumPath -HasChecksum $HasChecksum
492
+
493
+ $BinaryFile = Install-Binary -TempDir $TempDir -AssetPath $AssetPath -AssetName $AssetName -InstallDir $InstallDir
494
+
495
+ Test-PathAvailability -InstallDir $InstallDir -BinaryFile $BinaryFile
496
+
497
+ Write-ColorOutput -Message 'Installation completed successfully!' -Color 'Green'
498
+ }
499
+ catch {
500
+ Write-ColorOutput -Message 'An error occurred during installation' -Color 'Red'
501
+ Write-Host 'Error details: ' -NoNewline
502
+ Write-Host $_
503
+ exit 1
504
+ }
505
+ }
506
+
507
+ # Run the installation
508
+ Start-Installation