karnel-termux 4.7.7 → 4.8.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 (49) hide show
  1. package/README.md +39 -4
  2. package/karnel/cli/commands/backup.sh +8 -0
  3. package/karnel/cli/commands/doctor/system.sh +2 -0
  4. package/karnel/cli/commands/doctor.sh +8 -0
  5. package/karnel/cli/commands/install.sh +139 -84
  6. package/karnel/cli/commands/list.sh +32 -0
  7. package/karnel/cli/commands/open.sh +10 -6
  8. package/karnel/cli/commands/reinstall.sh +11 -0
  9. package/karnel/cli/commands/robin.sh +656 -0
  10. package/karnel/cli/commands/show.sh +1 -0
  11. package/karnel/cli/commands/start.sh +5 -0
  12. package/karnel/cli/commands/status.sh +11 -0
  13. package/karnel/cli/commands/uninstall.sh +9 -0
  14. package/karnel/cli/commands/update.sh +9 -0
  15. package/karnel/cli/commands/version.sh +2 -0
  16. package/karnel/cli/karnel.sh +35 -25
  17. package/karnel/modules/dev.sh +19 -46
  18. package/karnel/modules/osint.sh +123 -0
  19. package/karnel/tools/ai/crush/install.sh +1 -1
  20. package/karnel/tools/ai/omni-route/install.sh +1 -1
  21. package/karnel/tools/deploy/railway/install.sh +1 -1
  22. package/karnel/tools/dev/all.sh +45 -2
  23. package/karnel/tools/dev/fzf/install.sh +36 -9
  24. package/karnel/tools/npm/turbopack/install.sh +2 -0
  25. package/karnel/tools/osint/all.sh +65 -0
  26. package/karnel/tools/osint/robin/README.md +99 -0
  27. package/karnel/tools/osint/robin/common.sh +258 -0
  28. package/karnel/tools/osint/robin/install.sh +548 -0
  29. package/karnel/tools/osint/robin/requirements-termux.txt +33 -0
  30. package/karnel/utils/env.sh +16 -2
  31. package/karnel/utils/tools.sh +9 -2
  32. package/package.json +6 -1
  33. package/scripts/check-package.js +45 -0
  34. package/scripts/completion.bash +8 -3
  35. package/scripts/completion.zsh +8 -1
  36. package/karnel/tools/dev/applaunch/__pycache__/applaunch.cpython-314.pyc +0 -0
  37. package/karnel/tools/dev/fconv/__pycache__/fconv.cpython-314.pyc +0 -0
  38. package/karnel/tools/dev/filecheck/__pycache__/filecheck.cpython-314.pyc +0 -0
  39. package/karnel/tools/dev/notes/__pycache__/notes.cpython-314.pyc +0 -0
  40. package/karnel/tools/dev/passman/__pycache__/passman.cpython-314.pyc +0 -0
  41. package/karnel/tools/dev/splash/__pycache__/splash.cpython-314.pyc +0 -0
  42. package/karnel/tools/dev/websites/__pycache__/websites.cpython-314.pyc +0 -0
  43. package/karnel/tools/games/arcade/__pycache__/arcade.cpython-314.pyc +0 -0
  44. package/karnel/tools/games/buzz/__pycache__/buzz.cpython-314.pyc +0 -0
  45. package/karnel/tools/games/ctfgod/__pycache__/ctfgod.cpython-314.pyc +0 -0
  46. package/karnel/tools/games/detective/__pycache__/detective.cpython-314.pyc +0 -0
  47. package/karnel/tools/games/pet-friends/__pycache__/pet-friends.cpython-314.pyc +0 -0
  48. package/karnel/tools/games/tamagotchi/__pycache__/tamagotchi.cpython-314.pyc +0 -0
  49. package/karnel/tools/games/terminal-arcade/__pycache__/terminal-arcade.cpython-314.pyc +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,6 +21,7 @@ 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)"
23
25
  list_item "shell - ZSH + Oh My Zsh + plugins"
24
26
  list_item "ui - Termux UI (font, cursor, extra-keys, banner)"
25
27
  list_item "auto - Automation Tools (n8n)"
@@ -134,6 +136,10 @@ _install_full_module() {
134
136
  import "@/modules/games"
135
137
  install_games
136
138
  ;;
139
+ osint)
140
+ import "@/modules/osint"
141
+ install_osint
142
+ ;;
137
143
  *)
138
144
  log_warn "Unknown install target: $target"
139
145
  echo "Run 'karnel install' to see available targets"
@@ -152,6 +158,7 @@ _install_specific_tools() {
152
158
  import "@/tools/ai/all"
153
159
  local installed_count=0
154
160
  local failed_count=0
161
+ local skipped_count=0
155
162
 
156
163
  # These entries MUST stay in sync with AI_TOOLS_REGISTRY in karnel/tools/ai/all.sh
157
164
  # To add a new tool: 1) create install.sh 2) add to AI_TOOLS_REGISTRY 3) add case here
@@ -201,9 +208,9 @@ _install_specific_tools() {
201
208
  1)
202
209
  ((failed_count++))
203
210
  ;;
204
- 2)
211
+ 2)
205
212
  # Already installed (skipped)
206
- ((installed_count++))
213
+ ((skipped_count++))
207
214
  ;;
208
215
  esac
209
216
  else
@@ -216,6 +223,9 @@ _install_specific_tools() {
216
223
  if [[ $installed_count -gt 0 ]]; then
217
224
  log_success "$installed_count AI tool(s) installed"
218
225
  fi
226
+ if [[ $skipped_count -gt 0 ]]; then
227
+ log_info "$skipped_count AI tool(s) already installed"
228
+ fi
219
229
  if [[ $failed_count -gt 0 ]]; then
220
230
  log_warn "$failed_count tool(s) failed to install"
221
231
  fi
@@ -225,28 +235,29 @@ _install_specific_tools() {
225
235
  import "@/tools/db/all"
226
236
  local installed_count=0
227
237
  local failed_count=0
238
+ local skipped_count=0
228
239
 
229
240
  for tool in "${tools[@]}"; do
230
241
  case "$tool" in
231
242
  postgresql)
232
243
  install_postgresql
233
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
244
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
234
245
  ;;
235
246
  mariadb)
236
247
  install_mariadb
237
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
248
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
238
249
  ;;
239
250
  sqlite)
240
251
  install_sqlite
241
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
252
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
242
253
  ;;
243
254
  mongodb)
244
255
  install_mongodb
245
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
256
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
246
257
  ;;
247
258
  redis)
248
259
  install_redis
249
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
260
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
250
261
  ;;
251
262
  *)
252
263
  log_warn "Unknown database: --$tool"
@@ -258,6 +269,9 @@ _install_specific_tools() {
258
269
  if [[ $installed_count -gt 0 ]]; then
259
270
  log_success "$installed_count database(s) installed"
260
271
  fi
272
+ if [[ $skipped_count -gt 0 ]]; then
273
+ log_info "$skipped_count database(s) already installed"
274
+ fi
261
275
  if [[ $failed_count -gt 0 ]]; then
262
276
  log_warn "$failed_count database(s) failed to install"
263
277
  fi
@@ -267,136 +281,137 @@ _install_specific_tools() {
267
281
  import "@/tools/dev/all"
268
282
  local installed_count=0
269
283
  local failed_count=0
284
+ local skipped_count=0
270
285
 
271
286
  for tool in "${tools[@]}"; do
272
287
  case "$tool" in
273
288
  gh)
274
289
  install_gh
275
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
290
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
276
291
  ;;
277
292
  wget)
278
293
  install_wget
279
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
294
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
280
295
  ;;
281
296
  curl)
282
297
  install_curl
283
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
298
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
284
299
  ;;
285
300
  lsd)
286
301
  install_lsd
287
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
302
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
288
303
  ;;
289
304
  bat)
290
305
  install_bat
291
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
306
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
292
307
  ;;
293
308
  proot)
294
309
  install_proot
295
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
310
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
296
311
  ;;
297
312
  ncurses)
298
313
  install_ncurses
299
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
314
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
300
315
  ;;
301
316
  tmate)
302
317
  install_tmate
303
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
318
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
304
319
  ;;
305
320
  openssh)
306
321
  install_openssh
307
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
322
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
308
323
  ;;
309
324
  tmux)
310
325
  install_tmux
311
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
326
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
312
327
  ;;
313
328
  cloudflared)
314
329
  install_cloudflared
315
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
330
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
316
331
  ;;
317
332
  translate)
318
333
  install_translate
319
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
334
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
320
335
  ;;
321
336
  html2text)
322
337
  install_html2text
323
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
338
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
324
339
  ;;
325
340
  jq)
326
341
  install_jq
327
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
342
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
328
343
  ;;
329
344
  bc)
330
345
  install_bc
331
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
346
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
332
347
  ;;
333
348
  tree)
334
349
  install_tree
335
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
350
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
336
351
  ;;
337
352
  fzf)
338
353
  install_fzf
339
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
354
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
340
355
  ;;
341
356
  imagemagick)
342
357
  install_imagemagick
343
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
358
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
344
359
  ;;
345
360
  shfmt)
346
361
  install_shfmt
347
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
362
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
348
363
  ;;
349
364
  make)
350
365
  install_make
351
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
366
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
352
367
  ;;
353
368
  udocker)
354
369
  install_udocker
355
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
370
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
356
371
  ;;
357
372
  snyk)
358
373
  install_snyk
359
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
374
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
360
375
  ;;
361
376
  httptmux)
362
377
  install_httptmux
363
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
378
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
364
379
  ;;
365
380
  zork)
366
381
  install_zork
367
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
382
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
368
383
  ;;
369
384
  fconv)
370
385
  install_fconv
371
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
386
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
372
387
  ;;
373
388
  filecheck)
374
389
  install_filecheck
375
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
390
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
376
391
  ;;
377
392
  websites)
378
393
  install_websites
379
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
394
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
380
395
  ;;
381
396
  notes)
382
397
  install_notes
383
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
398
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
384
399
  ;;
385
400
  treex)
386
401
  install_treex
387
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
402
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
388
403
  ;;
389
404
  passman)
390
405
  install_passman
391
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
406
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
392
407
  ;;
393
408
  applaunch)
394
409
  install_applaunch
395
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
410
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
396
411
  ;;
397
412
  splash)
398
413
  install_splash
399
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
414
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
400
415
  ;;
401
416
  *)
402
417
  log_warn "Unknown tool: --$tool"
@@ -408,6 +423,9 @@ _install_specific_tools() {
408
423
  if [[ $installed_count -gt 0 ]]; then
409
424
  log_success "$installed_count tool(s) installed"
410
425
  fi
426
+ if [[ $skipped_count -gt 0 ]]; then
427
+ log_info "$skipped_count tool(s) already installed"
428
+ fi
411
429
  if [[ $failed_count -gt 0 ]]; then
412
430
  log_warn "$failed_count tool(s) failed to install"
413
431
  fi
@@ -417,32 +435,33 @@ _install_specific_tools() {
417
435
  import "@/tools/games/all"
418
436
  local installed_count=0
419
437
  local failed_count=0
438
+ local skipped_count=0
420
439
 
421
440
  for tool in "${tools[@]}"; do
422
441
  case "$tool" in
423
442
  buzz)
424
443
  install_buzz
425
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
444
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
426
445
  ;;
427
446
  ctfgod)
428
447
  install_ctfgod
429
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
448
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
430
449
  ;;
431
450
  detective)
432
451
  install_detective
433
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
452
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
434
453
  ;;
435
454
  pet-friends)
436
455
  install_pet_friends
437
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
456
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
438
457
  ;;
439
458
  tamagotchi)
440
459
  install_tamagotchi
441
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
460
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
442
461
  ;;
443
462
  arcade)
444
463
  install_arcade
445
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
464
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
446
465
  ;;
447
466
  *)
448
467
  log_warn "Unknown game: --$tool"
@@ -454,6 +473,9 @@ _install_specific_tools() {
454
473
  if [[ $installed_count -gt 0 ]]; then
455
474
  log_success "$installed_count game(s) installed"
456
475
  fi
476
+ if [[ $skipped_count -gt 0 ]]; then
477
+ log_info "$skipped_count game(s) already installed"
478
+ fi
457
479
  if [[ $failed_count -gt 0 ]]; then
458
480
  log_warn "$failed_count game(s) failed to install"
459
481
  fi
@@ -463,52 +485,53 @@ _install_specific_tools() {
463
485
  import "@/tools/npm/all"
464
486
  local installed_count=0
465
487
  local failed_count=0
488
+ local skipped_count=0
466
489
 
467
490
  for tool in "${tools[@]}"; do
468
491
  case "$tool" in
469
492
  typescript)
470
493
  install_typescript
471
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
494
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
472
495
  ;;
473
496
  nestjs)
474
497
  install_nestjs
475
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
498
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
476
499
  ;;
477
500
  prettier)
478
501
  install_prettier
479
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
502
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
480
503
  ;;
481
504
  live-server)
482
505
  install_live_server
483
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
506
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
484
507
  ;;
485
508
  localtunnel)
486
509
  install_localtunnel
487
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
510
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
488
511
  ;;
489
512
  vercel)
490
513
  install_vercel
491
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
514
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
492
515
  ;;
493
516
  markserv)
494
517
  install_markserv
495
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
518
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
496
519
  ;;
497
520
  psqlformat)
498
521
  install_psqlformat
499
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
522
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
500
523
  ;;
501
524
  ncu)
502
525
  install_ncu
503
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
526
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
504
527
  ;;
505
528
  ngrok)
506
529
  install_ngrok
507
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
530
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
508
531
  ;;
509
532
  turbopack)
510
533
  install_turbopack
511
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
534
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
512
535
  ;;
513
536
  *)
514
537
  log_warn "Unknown node module: --$tool"
@@ -520,6 +543,9 @@ _install_specific_tools() {
520
543
  if [[ $installed_count -gt 0 ]]; then
521
544
  log_success "$installed_count Node.js module(s) installed"
522
545
  fi
546
+ if [[ $skipped_count -gt 0 ]]; then
547
+ log_info "$skipped_count Node.js module(s) already installed"
548
+ fi
523
549
  if [[ $failed_count -gt 0 ]]; then
524
550
  log_warn "$failed_count module(s) failed to install"
525
551
  fi
@@ -529,36 +555,37 @@ _install_specific_tools() {
529
555
  import "@/tools/lang/all"
530
556
  local installed_count=0
531
557
  local failed_count=0
558
+ local skipped_count=0
532
559
 
533
560
  for tool in "${tools[@]}"; do
534
561
  case "$tool" in
535
562
  nodejs)
536
563
  install_nodejs
537
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
564
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
538
565
  ;;
539
566
  python)
540
567
  install_python
541
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
568
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
542
569
  ;;
543
570
  perl)
544
571
  install_perl
545
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
572
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
546
573
  ;;
547
574
  php)
548
575
  install_php
549
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
576
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
550
577
  ;;
551
578
  rust)
552
579
  install_rust
553
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
580
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
554
581
  ;;
555
582
  clang)
556
583
  install_clang
557
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
584
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
558
585
  ;;
559
586
  golang)
560
587
  install_golang
561
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
588
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
562
589
  ;;
563
590
  *)
564
591
  log_warn "Unknown language: --$tool"
@@ -570,6 +597,9 @@ _install_specific_tools() {
570
597
  if [[ $installed_count -gt 0 ]]; then
571
598
  log_success "$installed_count language(s) installed"
572
599
  fi
600
+ if [[ $skipped_count -gt 0 ]]; then
601
+ log_info "$skipped_count language(s) already installed"
602
+ fi
573
603
  if [[ $failed_count -gt 0 ]]; then
574
604
  log_warn "$failed_count language(s) failed to install"
575
605
  fi
@@ -579,48 +609,49 @@ _install_specific_tools() {
579
609
  import "@/tools/shell/all"
580
610
  local installed_count=0
581
611
  local failed_count=0
612
+ local skipped_count=0
582
613
 
583
614
  for tool in "${tools[@]}"; do
584
615
  case "$tool" in
585
616
  powerlevel10k)
586
617
  install_powerlevel10k
587
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
618
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
588
619
  ;;
589
620
  zsh-defer)
590
621
  install_zsh_defer
591
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
622
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
592
623
  ;;
593
624
  zsh-autosuggestions)
594
625
  install_zsh_autosuggestions
595
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
626
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
596
627
  ;;
597
628
  zsh-syntax-highlighting)
598
629
  install_zsh_syntax_highlighting
599
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
630
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
600
631
  ;;
601
632
  history-substring)
602
633
  install_history_substring
603
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
634
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
604
635
  ;;
605
636
  zsh-completions)
606
637
  install_zsh_completions
607
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
638
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
608
639
  ;;
609
640
  fzf-tab)
610
641
  install_fzf_tab
611
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
642
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
612
643
  ;;
613
644
  you-should-use)
614
645
  install_you_should_use
615
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
646
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
616
647
  ;;
617
648
  zsh-autopair)
618
649
  install_zsh_autopair
619
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
650
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
620
651
  ;;
621
652
  better-npm)
622
653
  install_better_npm
623
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
654
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
624
655
  ;;
625
656
  *)
626
657
  log_warn "Unknown plugin: --$tool"
@@ -632,6 +663,9 @@ _install_specific_tools() {
632
663
  if [[ $installed_count -gt 0 ]]; then
633
664
  log_success "$installed_count plugin(s) installed"
634
665
  fi
666
+ if [[ $skipped_count -gt 0 ]]; then
667
+ log_info "$skipped_count plugin(s) already installed"
668
+ fi
635
669
  if [[ $failed_count -gt 0 ]]; then
636
670
  log_warn "$failed_count plugin(s) failed to install"
637
671
  fi
@@ -641,20 +675,21 @@ _install_specific_tools() {
641
675
  import "@/tools/editor/all"
642
676
  local installed_count=0
643
677
  local failed_count=0
678
+ local skipped_count=0
644
679
 
645
680
  for tool in "${tools[@]}"; do
646
681
  case "$tool" in
647
682
  code-server)
648
683
  install_code_server
649
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
684
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
650
685
  ;;
651
686
  neovim)
652
687
  install_neovim
653
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
688
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
654
689
  ;;
655
690
  nvchad)
656
691
  install_nvchad
657
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
692
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
658
693
  ;;
659
694
  *)
660
695
  log_warn "Unknown editor component: --$tool"
@@ -666,6 +701,9 @@ _install_specific_tools() {
666
701
  if [[ $installed_count -gt 0 ]]; then
667
702
  log_success "$installed_count editor component(s) installed"
668
703
  fi
704
+ if [[ $skipped_count -gt 0 ]]; then
705
+ log_info "$skipped_count editor component(s) already installed"
706
+ fi
669
707
  if [[ $failed_count -gt 0 ]]; then
670
708
  log_warn "$failed_count component(s) failed to install"
671
709
  fi
@@ -675,24 +713,25 @@ _install_specific_tools() {
675
713
  import "@/tools/ui/all"
676
714
  local installed_count=0
677
715
  local failed_count=0
716
+ local skipped_count=0
678
717
 
679
718
  for tool in "${tools[@]}"; do
680
719
  case "$tool" in
681
720
  font)
682
721
  install_font
683
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
722
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
684
723
  ;;
685
724
  extra-keys)
686
725
  install_extra_keys
687
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
726
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
688
727
  ;;
689
728
  cursor)
690
729
  install_cursor
691
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
730
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
692
731
  ;;
693
732
  banner)
694
733
  install_banner
695
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
734
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
696
735
  ;;
697
736
  *)
698
737
  log_warn "Unknown UI component: --$tool"
@@ -704,6 +743,9 @@ _install_specific_tools() {
704
743
  if [[ $installed_count -gt 0 ]]; then
705
744
  log_success "$installed_count UI component(s) installed"
706
745
  fi
746
+ if [[ $skipped_count -gt 0 ]]; then
747
+ log_info "$skipped_count UI component(s) already installed"
748
+ fi
707
749
  if [[ $failed_count -gt 0 ]]; then
708
750
  log_warn "$failed_count component(s) failed to install"
709
751
  fi
@@ -713,12 +755,13 @@ _install_specific_tools() {
713
755
  import "@/tools/auto/all"
714
756
  local installed_count=0
715
757
  local failed_count=0
758
+ local skipped_count=0
716
759
 
717
760
  for tool in "${tools[@]}"; do
718
761
  case "$tool" in
719
762
  n8n)
720
763
  install_n8n
721
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
764
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
722
765
  ;;
723
766
  *)
724
767
  log_warn "Unknown automation tool: --$tool"
@@ -730,6 +773,9 @@ _install_specific_tools() {
730
773
  if [[ $installed_count -gt 0 ]]; then
731
774
  log_success "$installed_count automation tool(s) installed"
732
775
  fi
776
+ if [[ $skipped_count -gt 0 ]]; then
777
+ log_info "$skipped_count automation tool(s) already installed"
778
+ fi
733
779
  if [[ $failed_count -gt 0 ]]; then
734
780
  log_warn "$failed_count tool(s) failed to install"
735
781
  fi
@@ -739,20 +785,21 @@ _install_specific_tools() {
739
785
  import "@/tools/deploy/all"
740
786
  local installed_count=0
741
787
  local failed_count=0
788
+ local skipped_count=0
742
789
 
743
790
  for tool in "${tools[@]}"; do
744
791
  case "$tool" in
745
792
  vercel)
746
793
  install_vercel
747
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
794
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
748
795
  ;;
749
796
  railway)
750
797
  install_railway
751
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
798
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
752
799
  ;;
753
800
  netlify)
754
801
  install_netlify
755
- case $? in 0|2) ((installed_count++));; 1) ((failed_count++));; esac
802
+ case $? in 0) ((installed_count++));; 2) ((skipped_count++));; 1) ((failed_count++));; esac
756
803
  ;;
757
804
  *)
758
805
  log_warn "Unknown deploy tool: --$tool"
@@ -764,11 +811,19 @@ _install_specific_tools() {
764
811
  if [[ $installed_count -gt 0 ]]; then
765
812
  log_success "$installed_count deploy CLI(s) installed"
766
813
  fi
814
+ if [[ $skipped_count -gt 0 ]]; then
815
+ log_info "$skipped_count deploy CLI(s) already installed"
816
+ fi
767
817
  if [[ $failed_count -gt 0 ]]; then
768
818
  log_warn "$failed_count CLI(s) failed to install"
769
819
  fi
770
820
  echo
771
821
  ;;
822
+ osint)
823
+ import "@/tools/osint/robin/common"
824
+ _robin_print_disclaimer
825
+ _batch_tool_action "osint" "install" "${tools[@]}"
826
+ ;;
772
827
  *)
773
828
  log_warn "Unknown install target: $module"
774
829
  echo "Run 'karnel install' to see available targets"