karnel-termux 4.7.7 → 4.9.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 (215) hide show
  1. package/README.md +46 -5
  2. package/install.sh +2 -2
  3. package/karnel/cli/commands/backup.sh +13 -2
  4. package/karnel/cli/commands/doctor/fixes.sh +111 -13
  5. package/karnel/cli/commands/doctor.sh +112 -10
  6. package/karnel/cli/commands/init.sh +2 -2
  7. package/karnel/cli/commands/install.sh +155 -118
  8. package/karnel/cli/commands/list.sh +106 -13
  9. package/karnel/cli/commands/open.sh +28 -8
  10. package/karnel/cli/commands/reinstall.sh +79 -46
  11. package/karnel/cli/commands/restore.sh +16 -0
  12. package/karnel/cli/commands/robin.sh +656 -0
  13. package/karnel/cli/commands/search.sh +1 -0
  14. package/karnel/cli/commands/show.sh +1 -0
  15. package/karnel/cli/commands/start.sh +12 -2
  16. package/karnel/cli/commands/status.sh +11 -0
  17. package/karnel/cli/commands/uninstall.sh +47 -0
  18. package/karnel/cli/commands/update.sh +43 -0
  19. package/karnel/cli/commands/version.sh +2 -0
  20. package/karnel/cli/commands/voice.sh +11 -6
  21. package/karnel/cli/karnel.sh +115 -69
  22. package/karnel/modules/ai.sh +21 -6
  23. package/karnel/modules/deploy.sh +4 -0
  24. package/karnel/modules/dev.sh +19 -46
  25. package/karnel/modules/games.sh +81 -4
  26. package/karnel/modules/network.sh +88 -0
  27. package/karnel/modules/osint.sh +123 -0
  28. package/karnel/modules/shell.sh +1 -1
  29. package/karnel/modules/ui.sh +4 -0
  30. package/karnel/modules/utils.sh +88 -0
  31. package/karnel/modules/voice.sh +8 -2
  32. package/karnel/tools/ai/all.sh +1 -0
  33. package/karnel/tools/ai/antigravity-cli/install.sh +0 -0
  34. package/karnel/tools/ai/claude-code/install.sh +0 -0
  35. package/karnel/tools/ai/cline/install.sh +8 -8
  36. package/karnel/tools/ai/codegraph/install.sh +8 -5
  37. package/karnel/tools/ai/codex/install.sh +0 -0
  38. package/karnel/tools/ai/command-code/install.sh +0 -0
  39. package/karnel/tools/ai/copilot-termux/install.sh +0 -0
  40. package/karnel/tools/ai/crush/install.sh +1 -1
  41. package/karnel/tools/ai/ctx7/install.sh +0 -0
  42. package/karnel/tools/ai/engram/install.sh +5 -2
  43. package/karnel/tools/ai/freebuff/install.sh +0 -0
  44. package/karnel/tools/ai/gemini-cli/install.sh +0 -0
  45. package/karnel/tools/ai/gentle-ai/install.sh +1 -1
  46. package/karnel/tools/ai/hermes-agent/install.sh +0 -0
  47. package/karnel/tools/ai/kilocode-cli/install.sh +0 -0
  48. package/karnel/tools/ai/kimchi-code/install.sh +3 -1
  49. package/karnel/tools/ai/kimi-code/install.sh +0 -0
  50. package/karnel/tools/ai/kiro/install.sh +0 -0
  51. package/karnel/tools/ai/mimocode/install.sh +0 -0
  52. package/karnel/tools/ai/minimax-cli/install.sh +0 -0
  53. package/karnel/tools/ai/mistral-vibe/install.sh +0 -0
  54. package/karnel/tools/ai/odysseus/install.sh +0 -0
  55. package/karnel/tools/ai/ollama/install.sh +0 -0
  56. package/karnel/tools/ai/omni-route/install.sh +1 -1
  57. package/karnel/tools/ai/openclaude/install.sh +0 -0
  58. package/karnel/tools/ai/openclaw/install.sh +0 -0
  59. package/karnel/tools/ai/opencode/install.sh +0 -0
  60. package/karnel/tools/ai/openspec/install.sh +0 -0
  61. package/karnel/tools/ai/pi/install.sh +0 -0
  62. package/karnel/tools/ai/qoder/README.md +50 -0
  63. package/karnel/tools/ai/qoder/bin/qodercli +28 -0
  64. package/karnel/tools/ai/qoder/helper/qoder_helper.c +47 -0
  65. package/karnel/tools/ai/qoder/install.sh +367 -0
  66. package/karnel/tools/ai/qwen-code/install.sh +0 -0
  67. package/karnel/tools/auto/all.sh +1 -1
  68. package/karnel/tools/auto/n8n/install.sh +0 -0
  69. package/karnel/tools/db/all.sh +1 -1
  70. package/karnel/tools/db/mariadb/install.sh +0 -0
  71. package/karnel/tools/db/mongodb/install.sh +0 -0
  72. package/karnel/tools/db/postgresql/install.sh +0 -0
  73. package/karnel/tools/db/sqlite/install.sh +0 -0
  74. package/karnel/tools/deploy/all.sh +2 -2
  75. package/karnel/tools/deploy/netlify/install.sh +0 -0
  76. package/karnel/tools/deploy/railway/install.sh +1 -1
  77. package/karnel/tools/deploy/vercel/install.sh +0 -0
  78. package/karnel/tools/dev/all.sh +36 -13
  79. package/karnel/tools/dev/bat/install.sh +0 -0
  80. package/karnel/tools/dev/bc/install.sh +0 -0
  81. package/karnel/tools/dev/cloudflared/install.sh +0 -0
  82. package/karnel/tools/dev/curl/install.sh +0 -0
  83. package/karnel/tools/dev/fzf/install.sh +36 -9
  84. package/karnel/tools/dev/gh/install.sh +0 -0
  85. package/karnel/tools/dev/html2text/install.sh +0 -0
  86. package/karnel/tools/dev/imagemagick/install.sh +0 -0
  87. package/karnel/tools/dev/jq/install.sh +0 -0
  88. package/karnel/tools/dev/lsd/install.sh +0 -0
  89. package/karnel/tools/dev/make/install.sh +0 -0
  90. package/karnel/tools/dev/ncurses/install.sh +0 -0
  91. package/karnel/tools/dev/proot/install.sh +0 -0
  92. package/karnel/tools/dev/shfmt/install.sh +0 -0
  93. package/karnel/tools/dev/snyk/install.sh +0 -0
  94. package/karnel/tools/dev/tmate/install.sh +0 -0
  95. package/karnel/tools/dev/translate/install.sh +0 -0
  96. package/karnel/tools/dev/tree/install.sh +0 -0
  97. package/karnel/tools/dev/udocker/install.sh +0 -0
  98. package/karnel/tools/dev/wget/install.sh +0 -0
  99. package/karnel/tools/editor/all.sh +1 -1
  100. package/karnel/tools/editor/code-server/install.sh +0 -0
  101. package/karnel/tools/games/all.sh +1 -1
  102. package/karnel/tools/games/arcade/install.sh +0 -0
  103. package/karnel/tools/games/buzz/install.sh +0 -0
  104. package/karnel/tools/games/ctfgod/install.sh +0 -0
  105. package/karnel/tools/games/detective/install.sh +0 -0
  106. package/karnel/tools/games/pet-friends/install.sh +0 -0
  107. package/karnel/tools/games/tamagotchi/install.sh +0 -0
  108. package/karnel/tools/lang/all.sh +2 -1
  109. package/karnel/tools/lang/bun/bin/bun +27 -0
  110. package/karnel/tools/lang/bun/install.sh +318 -0
  111. package/karnel/tools/lang/bun/src/bun-shim.c +352 -0
  112. package/karnel/tools/lang/bun/src/bun_wrapper.c +55 -0
  113. package/karnel/tools/lang/clang/install.sh +0 -0
  114. package/karnel/tools/lang/golang/install.sh +0 -0
  115. package/karnel/tools/lang/nodejs/install.sh +0 -0
  116. package/karnel/tools/lang/perl/install.sh +0 -0
  117. package/karnel/tools/lang/php/install.sh +0 -0
  118. package/karnel/tools/lang/python/install.sh +0 -0
  119. package/karnel/tools/lang/rust/install.sh +0 -0
  120. package/karnel/tools/network/all.sh +65 -0
  121. package/karnel/tools/network/dark/README.md +45 -0
  122. package/karnel/tools/network/dark/dark.py +709 -0
  123. package/karnel/tools/network/dark/install.sh +51 -0
  124. package/karnel/tools/network/dedsec-network/README.md +42 -0
  125. package/karnel/tools/network/dedsec-network/dedsec-network.py +709 -0
  126. package/karnel/tools/network/dedsec-network/install.sh +50 -0
  127. package/karnel/tools/npm/all.sh +1 -1
  128. package/karnel/tools/npm/live-server/install.sh +0 -0
  129. package/karnel/tools/npm/localtunnel/install.sh +0 -0
  130. package/karnel/tools/npm/markserv/install.sh +0 -0
  131. package/karnel/tools/npm/ncu/install.sh +0 -0
  132. package/karnel/tools/npm/nestjs/install.sh +0 -0
  133. package/karnel/tools/npm/ngrok/install.sh +0 -0
  134. package/karnel/tools/npm/prettier/install.sh +0 -0
  135. package/karnel/tools/npm/psqlformat/install.sh +0 -0
  136. package/karnel/tools/npm/turbopack/install.sh +2 -0
  137. package/karnel/tools/npm/typescript/install.sh +0 -0
  138. package/karnel/tools/npm/vercel/install.sh +0 -0
  139. package/karnel/tools/osint/all.sh +65 -0
  140. package/karnel/tools/osint/robin/README.md +99 -0
  141. package/karnel/tools/osint/robin/common.sh +258 -0
  142. package/karnel/tools/osint/robin/install.sh +548 -0
  143. package/karnel/tools/osint/robin/requirements-termux.txt +33 -0
  144. package/karnel/tools/shell/all.sh +1 -1
  145. package/karnel/tools/shell/better-npm/install.sh +0 -0
  146. package/karnel/tools/shell/fzf-tab/install.sh +0 -0
  147. package/karnel/tools/shell/history-substring/install.sh +0 -0
  148. package/karnel/tools/shell/powerlevel10k/install.sh +0 -0
  149. package/karnel/tools/shell/you-should-use/install.sh +0 -0
  150. package/karnel/tools/shell/zsh-autopair/install.sh +0 -0
  151. package/karnel/tools/shell/zsh-autosuggestions/install.sh +0 -0
  152. package/karnel/tools/shell/zsh-completions/install.sh +0 -0
  153. package/karnel/tools/shell/zsh-defer/install.sh +0 -0
  154. package/karnel/tools/shell/zsh-syntax-highlighting/install.sh +0 -0
  155. package/karnel/tools/ui/all.sh +1 -1
  156. package/karnel/tools/ui/banner/install.sh +0 -0
  157. package/karnel/tools/ui/cursor/install.sh +0 -0
  158. package/karnel/tools/ui/extra-keys/install.sh +0 -0
  159. package/karnel/tools/ui/font/install.sh +0 -0
  160. package/karnel/tools/utils/all.sh +88 -0
  161. package/karnel/tools/utils/applaunch/README.md +43 -0
  162. package/karnel/tools/{dev → utils}/applaunch/install.sh +3 -3
  163. package/karnel/tools/utils/fconv/README.md +41 -0
  164. package/karnel/tools/{dev → utils}/fconv/install.sh +3 -3
  165. package/karnel/tools/utils/filecheck/README.md +41 -0
  166. package/karnel/tools/{dev → utils}/filecheck/install.sh +3 -3
  167. package/karnel/tools/utils/httptmux/README.md +42 -0
  168. package/karnel/tools/{dev → utils}/httptmux/install.sh +0 -0
  169. package/karnel/tools/utils/notes/README.md +41 -0
  170. package/karnel/tools/{dev → utils}/notes/install.sh +3 -3
  171. package/karnel/tools/utils/passman/README.md +42 -0
  172. package/karnel/tools/{dev → utils}/passman/install.sh +3 -3
  173. package/karnel/tools/utils/qrcode/README.md +41 -0
  174. package/karnel/tools/utils/qrcode/install.sh +50 -0
  175. package/karnel/tools/utils/qrcode/qrcode.py +89 -0
  176. package/karnel/tools/utils/splash/README.md +41 -0
  177. package/karnel/tools/{dev → utils}/splash/install.sh +3 -3
  178. package/karnel/tools/utils/treex/README.md +41 -0
  179. package/karnel/tools/{dev → utils}/treex/install.sh +3 -3
  180. package/karnel/tools/utils/websites/README.md +41 -0
  181. package/karnel/tools/{dev → utils}/websites/install.sh +3 -3
  182. package/karnel/tools/utils/zork/README.md +43 -0
  183. package/karnel/tools/{dev → utils}/zork/install.sh +3 -3
  184. package/karnel/utils/banner.sh +8 -6
  185. package/karnel/utils/bootstrap.sh +1 -1
  186. package/karnel/utils/env.sh +16 -2
  187. package/karnel/utils/log.sh +0 -1
  188. package/karnel/utils/tools.sh +9 -2
  189. package/package.json +6 -1
  190. package/scripts/check-package.js +45 -0
  191. package/scripts/completion.bash +8 -3
  192. package/scripts/completion.zsh +8 -13
  193. package/karnel/cli/commands/doctor/system.sh +0 -87
  194. package/karnel/tools/dev/applaunch/__pycache__/applaunch.cpython-314.pyc +0 -0
  195. package/karnel/tools/dev/fconv/__pycache__/fconv.cpython-314.pyc +0 -0
  196. package/karnel/tools/dev/filecheck/__pycache__/filecheck.cpython-314.pyc +0 -0
  197. package/karnel/tools/dev/notes/__pycache__/notes.cpython-314.pyc +0 -0
  198. package/karnel/tools/dev/passman/__pycache__/passman.cpython-314.pyc +0 -0
  199. package/karnel/tools/dev/splash/__pycache__/splash.cpython-314.pyc +0 -0
  200. package/karnel/tools/dev/websites/__pycache__/websites.cpython-314.pyc +0 -0
  201. package/karnel/tools/games/arcade/__pycache__/arcade.cpython-314.pyc +0 -0
  202. package/karnel/tools/games/buzz/__pycache__/buzz.cpython-314.pyc +0 -0
  203. package/karnel/tools/games/ctfgod/__pycache__/ctfgod.cpython-314.pyc +0 -0
  204. package/karnel/tools/games/detective/__pycache__/detective.cpython-314.pyc +0 -0
  205. package/karnel/tools/games/pet-friends/__pycache__/pet-friends.cpython-314.pyc +0 -0
  206. package/karnel/tools/games/tamagotchi/__pycache__/tamagotchi.cpython-314.pyc +0 -0
  207. package/karnel/tools/games/terminal-arcade/__pycache__/terminal-arcade.cpython-314.pyc +0 -0
  208. /package/karnel/tools/{dev → utils}/applaunch/applaunch.py +0 -0
  209. /package/karnel/tools/{dev → utils}/fconv/fconv.py +0 -0
  210. /package/karnel/tools/{dev → utils}/filecheck/filecheck.py +0 -0
  211. /package/karnel/tools/{dev → utils}/notes/notes.py +0 -0
  212. /package/karnel/tools/{dev → utils}/passman/passman.py +0 -0
  213. /package/karnel/tools/{dev → utils}/splash/splash.py +0 -0
  214. /package/karnel/tools/{dev → utils}/treex/treex.py +0 -0
  215. /package/karnel/tools/{dev → utils}/websites/websites.py +0 -0
@@ -2,6 +2,7 @@
2
2
 
3
3
  import "@/utils/log"
4
4
  import "@/utils/colors"
5
+ import "@/utils/tools"
5
6
 
6
7
  install_main() {
7
8
 
@@ -20,11 +21,16 @@ install_main() {
20
21
  list_item "editor - Code editor (code-server, neovim, nvchad)"
21
22
  list_item "dev - Development tools"
22
23
  list_item "npm - Node.js global modules (npm packages)"
24
+ list_item "osint - OSINT tools (Robin — Dark Web + LLM)"
25
+ list_item "network - Network tools (Dark Web OSINT, DedSec Network)"
26
+ list_item "utils - Utility scripts (File Converter, Notes, QR Code, etc.)"
23
27
  list_item "shell - ZSH + Oh My Zsh + plugins"
24
28
  list_item "ui - Termux UI (font, cursor, extra-keys, banner)"
25
29
  list_item "auto - Automation Tools (n8n)"
26
30
  list_item "deploy - Deploy CLIs (Vercel, Railway, Netlify)"
27
-
31
+ list_item "games - Games (Buzz, CTF God, Detective, etc.)"
32
+ list_item "voice - Voice command (speech-to-agent)"
33
+
28
34
  echo
29
35
  log_info "Install specific tools with flags:"
30
36
  echo
@@ -134,6 +140,18 @@ _install_full_module() {
134
140
  import "@/modules/games"
135
141
  install_games
136
142
  ;;
143
+ osint)
144
+ import "@/modules/osint"
145
+ install_osint
146
+ ;;
147
+ network)
148
+ import "@/modules/network"
149
+ install_network
150
+ ;;
151
+ utils)
152
+ import "@/modules/utils"
153
+ install_utils
154
+ ;;
137
155
  *)
138
156
  log_warn "Unknown install target: $target"
139
157
  echo "Run 'karnel install' to see available targets"
@@ -152,6 +170,7 @@ _install_specific_tools() {
152
170
  import "@/tools/ai/all"
153
171
  local installed_count=0
154
172
  local failed_count=0
173
+ local skipped_count=0
155
174
 
156
175
  # These entries MUST stay in sync with AI_TOOLS_REGISTRY in karnel/tools/ai/all.sh
157
176
  # To add a new tool: 1) create install.sh 2) add to AI_TOOLS_REGISTRY 3) add case here
@@ -201,9 +220,9 @@ _install_specific_tools() {
201
220
  1)
202
221
  ((failed_count++))
203
222
  ;;
204
- 2)
223
+ 2)
205
224
  # Already installed (skipped)
206
- ((installed_count++))
225
+ ((skipped_count++))
207
226
  ;;
208
227
  esac
209
228
  else
@@ -216,6 +235,9 @@ _install_specific_tools() {
216
235
  if [[ $installed_count -gt 0 ]]; then
217
236
  log_success "$installed_count AI tool(s) installed"
218
237
  fi
238
+ if [[ $skipped_count -gt 0 ]]; then
239
+ log_info "$skipped_count AI tool(s) already installed"
240
+ fi
219
241
  if [[ $failed_count -gt 0 ]]; then
220
242
  log_warn "$failed_count tool(s) failed to install"
221
243
  fi
@@ -225,28 +247,29 @@ _install_specific_tools() {
225
247
  import "@/tools/db/all"
226
248
  local installed_count=0
227
249
  local failed_count=0
250
+ local skipped_count=0
228
251
 
229
252
  for tool in "${tools[@]}"; do
230
253
  case "$tool" in
231
254
  postgresql)
232
255
  install_postgresql
233
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
256
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
234
257
  ;;
235
258
  mariadb)
236
259
  install_mariadb
237
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
260
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
238
261
  ;;
239
262
  sqlite)
240
263
  install_sqlite
241
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
264
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
242
265
  ;;
243
266
  mongodb)
244
267
  install_mongodb
245
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
268
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
246
269
  ;;
247
270
  redis)
248
271
  install_redis
249
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
272
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
250
273
  ;;
251
274
  *)
252
275
  log_warn "Unknown database: --$tool"
@@ -258,6 +281,9 @@ _install_specific_tools() {
258
281
  if [[ $installed_count -gt 0 ]]; then
259
282
  log_success "$installed_count database(s) installed"
260
283
  fi
284
+ if [[ $skipped_count -gt 0 ]]; then
285
+ log_info "$skipped_count database(s) already installed"
286
+ fi
261
287
  if [[ $failed_count -gt 0 ]]; then
262
288
  log_warn "$failed_count database(s) failed to install"
263
289
  fi
@@ -267,140 +293,101 @@ _install_specific_tools() {
267
293
  import "@/tools/dev/all"
268
294
  local installed_count=0
269
295
  local failed_count=0
296
+ local skipped_count=0
270
297
 
271
298
  for tool in "${tools[@]}"; do
272
299
  case "$tool" in
273
300
  gh)
274
301
  install_gh
275
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
302
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
276
303
  ;;
277
304
  wget)
278
305
  install_wget
279
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
306
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
280
307
  ;;
281
308
  curl)
282
309
  install_curl
283
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
310
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
284
311
  ;;
285
312
  lsd)
286
313
  install_lsd
287
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
314
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
288
315
  ;;
289
316
  bat)
290
317
  install_bat
291
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
318
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
292
319
  ;;
293
320
  proot)
294
321
  install_proot
295
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
322
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
296
323
  ;;
297
324
  ncurses)
298
325
  install_ncurses
299
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
326
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
300
327
  ;;
301
328
  tmate)
302
329
  install_tmate
303
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
330
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
304
331
  ;;
305
332
  openssh)
306
333
  install_openssh
307
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
334
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
308
335
  ;;
309
336
  tmux)
310
337
  install_tmux
311
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
338
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
312
339
  ;;
313
340
  cloudflared)
314
341
  install_cloudflared
315
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
342
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
316
343
  ;;
317
344
  translate)
318
345
  install_translate
319
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
346
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
320
347
  ;;
321
348
  html2text)
322
349
  install_html2text
323
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
350
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
324
351
  ;;
325
352
  jq)
326
353
  install_jq
327
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
354
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
328
355
  ;;
329
356
  bc)
330
357
  install_bc
331
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
358
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
332
359
  ;;
333
360
  tree)
334
361
  install_tree
335
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
362
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
336
363
  ;;
337
364
  fzf)
338
365
  install_fzf
339
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
366
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
340
367
  ;;
341
368
  imagemagick)
342
369
  install_imagemagick
343
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
370
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
344
371
  ;;
345
372
  shfmt)
346
373
  install_shfmt
347
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
374
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
348
375
  ;;
349
376
  make)
350
377
  install_make
351
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
378
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
352
379
  ;;
353
380
  udocker)
354
381
  install_udocker
355
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
382
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
356
383
  ;;
357
384
  snyk)
358
385
  install_snyk
359
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
360
- ;;
361
- httptmux)
362
- install_httptmux
363
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
364
- ;;
365
- zork)
366
- install_zork
367
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
368
- ;;
369
- fconv)
370
- install_fconv
371
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
372
- ;;
373
- filecheck)
374
- install_filecheck
375
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
376
- ;;
377
- websites)
378
- install_websites
379
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
380
- ;;
381
- notes)
382
- install_notes
383
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
384
- ;;
385
- treex)
386
- install_treex
387
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
388
- ;;
389
- passman)
390
- install_passman
391
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
392
- ;;
393
- applaunch)
394
- install_applaunch
395
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
396
- ;;
397
- splash)
398
- install_splash
399
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
400
- ;;
401
- *)
402
- log_warn "Unknown tool: --$tool"
386
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
403
387
  ;;
388
+ *)
389
+ log_warn "Unknown tool: --$tool"
390
+ ;;
404
391
  esac
405
392
  done
406
393
 
@@ -408,6 +395,9 @@ _install_specific_tools() {
408
395
  if [[ $installed_count -gt 0 ]]; then
409
396
  log_success "$installed_count tool(s) installed"
410
397
  fi
398
+ if [[ $skipped_count -gt 0 ]]; then
399
+ log_info "$skipped_count tool(s) already installed"
400
+ fi
411
401
  if [[ $failed_count -gt 0 ]]; then
412
402
  log_warn "$failed_count tool(s) failed to install"
413
403
  fi
@@ -417,32 +407,33 @@ _install_specific_tools() {
417
407
  import "@/tools/games/all"
418
408
  local installed_count=0
419
409
  local failed_count=0
410
+ local skipped_count=0
420
411
 
421
412
  for tool in "${tools[@]}"; do
422
413
  case "$tool" in
423
414
  buzz)
424
415
  install_buzz
425
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
416
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
426
417
  ;;
427
418
  ctfgod)
428
419
  install_ctfgod
429
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
420
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
430
421
  ;;
431
422
  detective)
432
423
  install_detective
433
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
424
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
434
425
  ;;
435
426
  pet-friends)
436
427
  install_pet_friends
437
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
428
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
438
429
  ;;
439
430
  tamagotchi)
440
431
  install_tamagotchi
441
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
432
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
442
433
  ;;
443
434
  arcade)
444
435
  install_arcade
445
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
436
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
446
437
  ;;
447
438
  *)
448
439
  log_warn "Unknown game: --$tool"
@@ -454,6 +445,9 @@ _install_specific_tools() {
454
445
  if [[ $installed_count -gt 0 ]]; then
455
446
  log_success "$installed_count game(s) installed"
456
447
  fi
448
+ if [[ $skipped_count -gt 0 ]]; then
449
+ log_info "$skipped_count game(s) already installed"
450
+ fi
457
451
  if [[ $failed_count -gt 0 ]]; then
458
452
  log_warn "$failed_count game(s) failed to install"
459
453
  fi
@@ -463,52 +457,53 @@ _install_specific_tools() {
463
457
  import "@/tools/npm/all"
464
458
  local installed_count=0
465
459
  local failed_count=0
460
+ local skipped_count=0
466
461
 
467
462
  for tool in "${tools[@]}"; do
468
463
  case "$tool" in
469
464
  typescript)
470
465
  install_typescript
471
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
466
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
472
467
  ;;
473
468
  nestjs)
474
469
  install_nestjs
475
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
470
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
476
471
  ;;
477
472
  prettier)
478
473
  install_prettier
479
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
474
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
480
475
  ;;
481
476
  live-server)
482
477
  install_live_server
483
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
478
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
484
479
  ;;
485
480
  localtunnel)
486
481
  install_localtunnel
487
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
482
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
488
483
  ;;
489
484
  vercel)
490
485
  install_vercel
491
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
486
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
492
487
  ;;
493
488
  markserv)
494
489
  install_markserv
495
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
490
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
496
491
  ;;
497
492
  psqlformat)
498
493
  install_psqlformat
499
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
494
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
500
495
  ;;
501
496
  ncu)
502
497
  install_ncu
503
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
498
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
504
499
  ;;
505
500
  ngrok)
506
501
  install_ngrok
507
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
502
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
508
503
  ;;
509
504
  turbopack)
510
505
  install_turbopack
511
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
506
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
512
507
  ;;
513
508
  *)
514
509
  log_warn "Unknown node module: --$tool"
@@ -520,6 +515,9 @@ _install_specific_tools() {
520
515
  if [[ $installed_count -gt 0 ]]; then
521
516
  log_success "$installed_count Node.js module(s) installed"
522
517
  fi
518
+ if [[ $skipped_count -gt 0 ]]; then
519
+ log_info "$skipped_count Node.js module(s) already installed"
520
+ fi
523
521
  if [[ $failed_count -gt 0 ]]; then
524
522
  log_warn "$failed_count module(s) failed to install"
525
523
  fi
@@ -529,36 +527,41 @@ _install_specific_tools() {
529
527
  import "@/tools/lang/all"
530
528
  local installed_count=0
531
529
  local failed_count=0
530
+ local skipped_count=0
532
531
 
533
532
  for tool in "${tools[@]}"; do
534
533
  case "$tool" in
534
+ bun)
535
+ install_bun
536
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
537
+ ;;
535
538
  nodejs)
536
539
  install_nodejs
537
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
540
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
538
541
  ;;
539
542
  python)
540
543
  install_python
541
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
544
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
542
545
  ;;
543
546
  perl)
544
547
  install_perl
545
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
548
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
546
549
  ;;
547
550
  php)
548
551
  install_php
549
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
552
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
550
553
  ;;
551
554
  rust)
552
555
  install_rust
553
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
556
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
554
557
  ;;
555
558
  clang)
556
559
  install_clang
557
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
560
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
558
561
  ;;
559
562
  golang)
560
563
  install_golang
561
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
564
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
562
565
  ;;
563
566
  *)
564
567
  log_warn "Unknown language: --$tool"
@@ -570,6 +573,9 @@ _install_specific_tools() {
570
573
  if [[ $installed_count -gt 0 ]]; then
571
574
  log_success "$installed_count language(s) installed"
572
575
  fi
576
+ if [[ $skipped_count -gt 0 ]]; then
577
+ log_info "$skipped_count language(s) already installed"
578
+ fi
573
579
  if [[ $failed_count -gt 0 ]]; then
574
580
  log_warn "$failed_count language(s) failed to install"
575
581
  fi
@@ -579,48 +585,49 @@ _install_specific_tools() {
579
585
  import "@/tools/shell/all"
580
586
  local installed_count=0
581
587
  local failed_count=0
588
+ local skipped_count=0
582
589
 
583
590
  for tool in "${tools[@]}"; do
584
591
  case "$tool" in
585
592
  powerlevel10k)
586
593
  install_powerlevel10k
587
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
594
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
588
595
  ;;
589
596
  zsh-defer)
590
597
  install_zsh_defer
591
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
598
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
592
599
  ;;
593
600
  zsh-autosuggestions)
594
601
  install_zsh_autosuggestions
595
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
602
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
596
603
  ;;
597
604
  zsh-syntax-highlighting)
598
605
  install_zsh_syntax_highlighting
599
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
606
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
600
607
  ;;
601
608
  history-substring)
602
609
  install_history_substring
603
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
610
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
604
611
  ;;
605
612
  zsh-completions)
606
613
  install_zsh_completions
607
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
614
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
608
615
  ;;
609
616
  fzf-tab)
610
617
  install_fzf_tab
611
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
618
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
612
619
  ;;
613
620
  you-should-use)
614
621
  install_you_should_use
615
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
622
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
616
623
  ;;
617
624
  zsh-autopair)
618
625
  install_zsh_autopair
619
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
626
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
620
627
  ;;
621
628
  better-npm)
622
629
  install_better_npm
623
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
630
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
624
631
  ;;
625
632
  *)
626
633
  log_warn "Unknown plugin: --$tool"
@@ -632,6 +639,9 @@ _install_specific_tools() {
632
639
  if [[ $installed_count -gt 0 ]]; then
633
640
  log_success "$installed_count plugin(s) installed"
634
641
  fi
642
+ if [[ $skipped_count -gt 0 ]]; then
643
+ log_info "$skipped_count plugin(s) already installed"
644
+ fi
635
645
  if [[ $failed_count -gt 0 ]]; then
636
646
  log_warn "$failed_count plugin(s) failed to install"
637
647
  fi
@@ -641,20 +651,21 @@ _install_specific_tools() {
641
651
  import "@/tools/editor/all"
642
652
  local installed_count=0
643
653
  local failed_count=0
654
+ local skipped_count=0
644
655
 
645
656
  for tool in "${tools[@]}"; do
646
657
  case "$tool" in
647
658
  code-server)
648
659
  install_code_server
649
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
660
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
650
661
  ;;
651
662
  neovim)
652
663
  install_neovim
653
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
664
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
654
665
  ;;
655
666
  nvchad)
656
667
  install_nvchad
657
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
668
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
658
669
  ;;
659
670
  *)
660
671
  log_warn "Unknown editor component: --$tool"
@@ -666,6 +677,9 @@ _install_specific_tools() {
666
677
  if [[ $installed_count -gt 0 ]]; then
667
678
  log_success "$installed_count editor component(s) installed"
668
679
  fi
680
+ if [[ $skipped_count -gt 0 ]]; then
681
+ log_info "$skipped_count editor component(s) already installed"
682
+ fi
669
683
  if [[ $failed_count -gt 0 ]]; then
670
684
  log_warn "$failed_count component(s) failed to install"
671
685
  fi
@@ -675,24 +689,25 @@ _install_specific_tools() {
675
689
  import "@/tools/ui/all"
676
690
  local installed_count=0
677
691
  local failed_count=0
692
+ local skipped_count=0
678
693
 
679
694
  for tool in "${tools[@]}"; do
680
695
  case "$tool" in
681
696
  font)
682
697
  install_font
683
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
698
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
684
699
  ;;
685
700
  extra-keys)
686
701
  install_extra_keys
687
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
702
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
688
703
  ;;
689
704
  cursor)
690
705
  install_cursor
691
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
706
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
692
707
  ;;
693
708
  banner)
694
709
  install_banner
695
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
710
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
696
711
  ;;
697
712
  *)
698
713
  log_warn "Unknown UI component: --$tool"
@@ -704,6 +719,9 @@ _install_specific_tools() {
704
719
  if [[ $installed_count -gt 0 ]]; then
705
720
  log_success "$installed_count UI component(s) installed"
706
721
  fi
722
+ if [[ $skipped_count -gt 0 ]]; then
723
+ log_info "$skipped_count UI component(s) already installed"
724
+ fi
707
725
  if [[ $failed_count -gt 0 ]]; then
708
726
  log_warn "$failed_count component(s) failed to install"
709
727
  fi
@@ -713,12 +731,13 @@ _install_specific_tools() {
713
731
  import "@/tools/auto/all"
714
732
  local installed_count=0
715
733
  local failed_count=0
734
+ local skipped_count=0
716
735
 
717
736
  for tool in "${tools[@]}"; do
718
737
  case "$tool" in
719
738
  n8n)
720
739
  install_n8n
721
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
740
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
722
741
  ;;
723
742
  *)
724
743
  log_warn "Unknown automation tool: --$tool"
@@ -730,6 +749,9 @@ _install_specific_tools() {
730
749
  if [[ $installed_count -gt 0 ]]; then
731
750
  log_success "$installed_count automation tool(s) installed"
732
751
  fi
752
+ if [[ $skipped_count -gt 0 ]]; then
753
+ log_info "$skipped_count automation tool(s) already installed"
754
+ fi
733
755
  if [[ $failed_count -gt 0 ]]; then
734
756
  log_warn "$failed_count tool(s) failed to install"
735
757
  fi
@@ -739,20 +761,21 @@ _install_specific_tools() {
739
761
  import "@/tools/deploy/all"
740
762
  local installed_count=0
741
763
  local failed_count=0
764
+ local skipped_count=0
742
765
 
743
766
  for tool in "${tools[@]}"; do
744
767
  case "$tool" in
745
768
  vercel)
746
769
  install_vercel
747
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
770
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
748
771
  ;;
749
772
  railway)
750
773
  install_railway
751
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
774
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
752
775
  ;;
753
776
  netlify)
754
777
  install_netlify
755
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
778
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
756
779
  ;;
757
780
  *)
758
781
  log_warn "Unknown deploy tool: --$tool"
@@ -764,11 +787,25 @@ _install_specific_tools() {
764
787
  if [[ $installed_count -gt 0 ]]; then
765
788
  log_success "$installed_count deploy CLI(s) installed"
766
789
  fi
790
+ if [[ $skipped_count -gt 0 ]]; then
791
+ log_info "$skipped_count deploy CLI(s) already installed"
792
+ fi
767
793
  if [[ $failed_count -gt 0 ]]; then
768
794
  log_warn "$failed_count CLI(s) failed to install"
769
795
  fi
770
796
  echo
771
797
  ;;
798
+ osint)
799
+ import "@/tools/osint/robin/common"
800
+ _robin_print_disclaimer
801
+ _batch_tool_action "osint" "install" "${tools[@]}"
802
+ ;;
803
+ network)
804
+ _batch_tool_action "network" "install" "${tools[@]}"
805
+ ;;
806
+ utils)
807
+ _batch_tool_action "utils" "install" "${tools[@]}"
808
+ ;;
772
809
  *)
773
810
  log_warn "Unknown install target: $module"
774
811
  echo "Run 'karnel install' to see available targets"