karnel-termux 4.17.9 → 4.17.13

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 (63) hide show
  1. package/README.md +30 -12
  2. package/docs/ARCHITECTURE/index.md +7 -1
  3. package/docs/CHANGELOG.md +52 -0
  4. package/docs/_config.yml +0 -2
  5. package/docs/_layouts/base.html +21 -0
  6. package/docs/assets/css/style.scss +34 -0
  7. package/docs/cli/index.md +13 -7
  8. package/docs/doctor/index.md +6 -0
  9. package/docs/index.md +14 -13
  10. package/docs/karnel/ai/index.md +17 -0
  11. package/docs/karnel/auto/index.md +17 -0
  12. package/docs/karnel/db/index.md +17 -0
  13. package/docs/karnel/deploy/index.md +17 -0
  14. package/docs/karnel/dev/index.md +17 -0
  15. package/docs/karnel/editor/index.md +17 -0
  16. package/docs/karnel/games/index.md +17 -0
  17. package/docs/karnel/lang/index.md +17 -0
  18. package/docs/karnel/network/index.md +17 -0
  19. package/docs/karnel/npm/index.md +17 -0
  20. package/docs/karnel/osint/index.md +17 -0
  21. package/docs/karnel/plugin/index.md +17 -0
  22. package/docs/karnel/security/index.md +17 -0
  23. package/docs/karnel/shell/index.md +17 -0
  24. package/docs/karnel/ui/index.md +17 -0
  25. package/docs/karnel/utils/index.md +21 -0
  26. package/docs/karnel/voice/index.md +17 -0
  27. package/docs/troubleshooting/index.md +7 -1
  28. package/karnel/RELEASE_COMMIT +1 -1
  29. package/karnel/bin/karnel +1 -1
  30. package/karnel/cli/commands/brain.sh +2 -2
  31. package/karnel/cli/commands/doctor/code_exec.sh +4 -0
  32. package/karnel/cli/commands/doctor/code_langs.sh +1 -1
  33. package/karnel/cli/commands/doctor/fixes.sh +14 -2
  34. package/karnel/cli/commands/doctor.sh +33 -8
  35. package/karnel/cli/commands/open.sh +31 -74
  36. package/karnel/cli/commands/pg.sh +22 -5
  37. package/karnel/cli/commands/show.sh +5 -0
  38. package/karnel/cli/commands/update.sh +3 -3
  39. package/karnel/modules/shell.sh +1 -1
  40. package/karnel/tools/ai/cline/install.sh +9 -1
  41. package/karnel/tools/ai/cursor-cli/install.sh +2 -1
  42. package/karnel/tools/ai/goose/install.sh +1 -1
  43. package/karnel/tools/ai/hermes-agent/install.sh +1 -1
  44. package/karnel/tools/ai/kiro/install.sh +9 -1
  45. package/karnel/tools/deploy/supabase/install.sh +1 -1
  46. package/karnel/tools/plugins/install.sh +17 -3
  47. package/karnel/tools/security/amass/install.sh +1 -1
  48. package/karnel/tools/security/burpsuite/install.sh +1 -1
  49. package/karnel/tools/security/ffuf/install.sh +1 -1
  50. package/karnel/tools/security/gobuster/install.sh +1 -1
  51. package/karnel/tools/security/subfinder/install.sh +1 -1
  52. package/karnel/tools/security/zap/install.sh +1 -1
  53. package/karnel/tools/utils/all.sh +2 -0
  54. package/karnel/tools/utils/herdr/README.md +33 -0
  55. package/karnel/tools/utils/herdr/install.sh +160 -0
  56. package/karnel/tools/utils/zork/zork.sh +8 -3
  57. package/karnel/utils/agent_actions.sh +12 -4
  58. package/karnel/utils/log.sh +1 -1
  59. package/karnel/utils/tools.sh +1 -1
  60. package/karnel/utils/version.sh +1 -1
  61. package/package.json +2 -2
  62. package/scripts/completion.bash +1 -1
  63. package/scripts/completion.zsh +1 -1
@@ -19,7 +19,7 @@ _install_gobuster_bin() (
19
19
  x86_64) checksum="871be404ce5f80c96b864586b3caa90f894598d1a8222ae316c19e5f70e04cfc" ;;
20
20
  esac
21
21
  local url="https://github.com/OJ/gobuster/releases/download/v${_GOBUSTER_VERSION}/$asset"
22
- tmpdir=$(mktemp -d "${TMPDIR:-/tmp}/gobuster.XXXXXX") || return 1
22
+ tmpdir=$(mktemp -d "${TMPDIR:-${KARNEL_CACHE:-$HOME/.cache/karnel}}/gobuster.XXXXXX") || return 1
23
23
  staged_bin=""
24
24
  trap 'rm -rf "$tmpdir"; [ -z "$staged_bin" ] || rm -f "$staged_bin"' EXIT
25
25
  archive="$tmpdir/gobuster.tar.gz"
@@ -47,7 +47,7 @@ install_subfinder() (
47
47
  esac
48
48
  url="https://github.com/projectdiscovery/subfinder/releases/download/v${_SUBFINDER_VERSION}/$asset"
49
49
 
50
- tmpdir=$(mktemp -d "${TMPDIR:-/tmp}/subfinder.XXXXXX") || return 1
50
+ tmpdir=$(mktemp -d "${TMPDIR:-${KARNEL_CACHE:-$HOME/.cache/karnel}}/subfinder.XXXXXX") || return 1
51
51
  staged_bin=""
52
52
  trap 'rm -rf "$tmpdir"; [ -z "$staged_bin" ] || rm -f "$staged_bin"' EXIT
53
53
  archive="$tmpdir/subfinder.zip"
@@ -34,7 +34,7 @@ install_zap() (
34
34
 
35
35
  local url="https://github.com/zaproxy/zaproxy/releases/download/v${_ZAP_VERSION}/$ZAP_ASSET"
36
36
 
37
- tmpdir=$(mktemp -d "${TMPDIR:-/tmp}/zap.XXXXXX") || {
37
+ tmpdir=$(mktemp -d "${TMPDIR:-${KARNEL_CACHE:-$HOME/.cache/karnel}}/zap.XXXXXX") || {
38
38
  log_error "Falha ao criar diretório temporário"
39
39
  return 1
40
40
  }
@@ -19,6 +19,7 @@ TOOLS_PACKAGES=(
19
19
  "zork"
20
20
  "qrcode"
21
21
  "superfile"
22
+ "herdr"
22
23
  )
23
24
 
24
25
  TOOLS_DISPLAY=(
@@ -34,6 +35,7 @@ TOOLS_DISPLAY=(
34
35
  "Zork (text adventure games I, II, III)"
35
36
  "QR Code (link-to-QR generator)"
36
37
  "SuperFile (terminal file manager)"
38
+ "Herdr (terminal AI assistant CLI)"
37
39
  )
38
40
 
39
41
  for _tool in "${TOOLS_PACKAGES[@]}"; do
@@ -0,0 +1,33 @@
1
+ # Herdr — terminal AI assistant
2
+
3
+ [Herdr](https://herdr.dev) is a fast terminal AI assistant CLI, distributed by the
4
+ Herdr project and integrated into Karnel Termux as a managed utility.
5
+
6
+ ## Install
7
+
8
+ ```bash
9
+ karnel install utils --herdr
10
+ ```
11
+
12
+ The installer:
13
+ - Resolves the latest release via the official manifest at `https://herdr.dev/latest.json`.
14
+ - Verifies the SHA-256 checksum before extracting.
15
+ - Installs atomically into `$PREFIX/bin/herdr` and writes a Karnel ownership marker
16
+ (`.karnel-wrapper-herdr`) so the binary is tracked.
17
+ - Honors `TMPDIR` / `KARNEL_CACHE` (never hardcodes `/tmp`, which is broken on Termux).
18
+
19
+ ## Uninstall / Update
20
+
21
+ ```bash
22
+ karnel uninstall utils --herdr # clean removal, only the managed binary
23
+ karnel update utils --herdr # re-fetch and re-verify latest release
24
+ ```
25
+
26
+ ## Usage
27
+
28
+ ```bash
29
+ herdr --help
30
+ herdr --version
31
+ ```
32
+
33
+ See https://herdr.dev for full documentation.
@@ -0,0 +1,160 @@
1
+ #!/usr/bin/env bash
2
+
3
+ import "@/utils/log"
4
+
5
+ HERDR_BIN="$PREFIX/bin/herdr"
6
+ HERDR_DATA_DIR="$KARNEL_DATA/herdr"
7
+ HERDR_MARKER="$HERDR_DATA_DIR/.karnel-managed"
8
+ HERDR_WRAPPER_MARKER="$HERDR_DATA_DIR/.karnel-wrapper-herdr"
9
+ HERDR_MANIFEST_URL="https://herdr.dev/latest.json"
10
+
11
+ _herdr_binary_owned() {
12
+ [[ -f "$HERDR_WRAPPER_MARKER" && -f "$HERDR_BIN" ]] || return 1
13
+ [[ "$(sha256sum "$HERDR_BIN" 2>/dev/null)" == "$(<"$HERDR_WRAPPER_MARKER")" ]]
14
+ }
15
+
16
+ _herdr_verify_ownership() {
17
+ if [[ -e "$HERDR_DATA_DIR" && ! -f "$HERDR_MARKER" ]]; then
18
+ log_error "Refusing to replace unowned data directory: $HERDR_DATA_DIR"
19
+ return 1
20
+ fi
21
+ if [[ -e "$HERDR_BIN" ]] && ! _herdr_binary_owned; then
22
+ log_error "Refusing to replace unowned command: $HERDR_BIN"
23
+ return 1
24
+ fi
25
+ }
26
+
27
+ _herdr_detect_target() {
28
+ local os arch
29
+ os="$(uname -s | tr '[:upper:]' '[:lower:]')"
30
+ [[ "$os" == "linux" ]] || {
31
+ log_error "Herdr supports Linux/macOS; this system reports: $os"
32
+ return 1
33
+ }
34
+ arch="$(uname -m)"
35
+ case "$arch" in
36
+ aarch64 | arm64) arch="aarch64" ;;
37
+ x86_64 | amd64) arch="x86_64" ;;
38
+ *) log_error "Unsupported architecture for Herdr: $arch"; return 1 ;;
39
+ esac
40
+ printf 'linux-%s' "$arch"
41
+ }
42
+
43
+ _herdr_resolve() {
44
+ local target="$1" manifest tmpf rc
45
+ manifest="$(curl -fsSL --retry 3 --connect-timeout 10 --max-time 20 "$HERDR_MANIFEST_URL" 2>/dev/null)" || return 1
46
+ tmpf="$(mktemp "${KARNEL_CACHE}/.herdr-manifest.XXXXXX")" || return 1
47
+ printf '%s' "$manifest" >"$tmpf"
48
+ python3 -c '
49
+ import sys, json
50
+ with open(sys.argv[1]) as fh:
51
+ data = json.load(fh)
52
+ target = sys.argv[2]
53
+ assets = data.get("assets", {})
54
+ sha = data.get("sha256", {})
55
+ url = assets.get(target)
56
+ digest = sha.get(target)
57
+ version = data.get("version")
58
+ if not url or not digest:
59
+ sys.exit(1)
60
+ print(url)
61
+ print(digest)
62
+ print(version or "")
63
+ ' "$tmpf" "$target"
64
+ rc=$?
65
+ rm -f "$tmpf"
66
+ return $rc
67
+ }
68
+
69
+ _herdr_download_and_install() {
70
+ local target="$1" info url sha version tmp actual temporary_bin
71
+
72
+ info="$(_herdr_resolve "$target")" || {
73
+ log_error "Failed to resolve the Herdr release for $target"
74
+ return 1
75
+ }
76
+ url="$(printf '%s' "$info" | sed -n '1p')"
77
+ sha="$(printf '%s' "$info" | sed -n '2p')"
78
+ version="$(printf '%s' "$info" | sed -n '3p')"
79
+
80
+ if [[ ! "$sha" =~ ^[0-9a-fA-F]{64}$ ]]; then
81
+ log_error "Herdr release manifest did not include a valid SHA-256 for $target"
82
+ return 1
83
+ fi
84
+ sha="${sha,,}"
85
+
86
+ mkdir -p "$KARNEL_DATA" "$PREFIX/bin" "${KARNEL_CACHE}" || return 1
87
+ _herdr_verify_ownership || return 1
88
+
89
+ tmp="$(mktemp -d "${KARNEL_CACHE}/.herdr.XXXXXX")" || return 1
90
+ if ! curl -fsSL --retry 3 --connect-timeout 10 --max-time 120 "$url" -o "$tmp/herdr"; then
91
+ rm -rf "$tmp"
92
+ log_error "Failed to download Herdr from $url"
93
+ return 1
94
+ fi
95
+
96
+ actual="$(sha256sum "$tmp/herdr" 2>/dev/null | awk '{print $1}')"
97
+ if [[ "$actual" != "$sha" ]]; then
98
+ rm -rf "$tmp"
99
+ log_error "Herdr checksum verification failed (expected $sha, got $actual)"
100
+ return 1
101
+ fi
102
+
103
+ temporary_bin="$(mktemp "$PREFIX/bin/.herdr.XXXXXX")" || { rm -rf "$tmp"; return 1; }
104
+ if ! install -m 755 "$tmp/herdr" "$temporary_bin" || ! mv -f "$temporary_bin" "$HERDR_BIN"; then
105
+ rm -f "$temporary_bin"
106
+ rm -rf "$tmp"
107
+ log_error "Failed to install the Herdr binary"
108
+ return 1
109
+ fi
110
+
111
+ mkdir -p "$HERDR_DATA_DIR" || return 1
112
+ sha256sum "$HERDR_BIN" >"$HERDR_WRAPPER_MARKER" || return 1
113
+ : >"$HERDR_MARKER"
114
+ rm -rf "$tmp"
115
+ }
116
+
117
+ install_herdr() {
118
+ if command -v herdr &>/dev/null; then
119
+ log_info "Herdr is already installed"
120
+ return 2
121
+ fi
122
+
123
+ local target
124
+ target="$(_herdr_detect_target)" || return 1
125
+
126
+ log_info "Installing Herdr..."
127
+ _herdr_download_and_install "$target" || return 1
128
+ log_success "Herdr installed"
129
+ }
130
+
131
+ uninstall_herdr() {
132
+ if [[ ! -e "$HERDR_BIN" && ! -d "$HERDR_DATA_DIR" ]]; then
133
+ log_info "Herdr is not installed"
134
+ return 2
135
+ fi
136
+
137
+ if _herdr_binary_owned && ! rm -f "$HERDR_BIN"; then
138
+ log_error "Failed to remove the Herdr command"
139
+ return 1
140
+ fi
141
+ if [[ -f "$HERDR_MARKER" ]] && ! rm -rf "$HERDR_DATA_DIR"; then
142
+ log_error "Failed to uninstall Herdr"
143
+ return 1
144
+ fi
145
+ log_success "Herdr uninstalled"
146
+ }
147
+
148
+ update_herdr() {
149
+ local target
150
+ target="$(_herdr_detect_target)" || return 1
151
+
152
+ log_info "Updating Herdr..."
153
+ _herdr_download_and_install "$target" || return 1
154
+ log_success "Herdr updated"
155
+ }
156
+
157
+ reinstall_herdr() {
158
+ uninstall_herdr || [[ $? -eq 2 ]] || return 1
159
+ install_herdr
160
+ }
@@ -3,8 +3,13 @@ ZORK_DIR="$HOME/.local/share/karnel-data/zork"
3
3
  if [ ! -f "$ZORK_DIR/zork1.dat" ]; then
4
4
  mkdir -p "$ZORK_DIR"
5
5
  echo "Baixando Zork I..."
6
- curl -sL "https://www.infocom-if.org/downloads/zork1.zip" -o /tmp/zork1.zip
7
- unzip -o /tmp/zork1.zip -d "$ZORK_DIR" 2>/dev/null
8
- rm -f /tmp/zork1.zip
6
+ tmpdir="$(mktemp -d "${TMPDIR:-${KARNEL_CACHE:-$HOME/.cache/karnel}}/zork.XXXXXX")" || exit 1
7
+ curl -fsSL "https://www.infocom-if.org/downloads/zork1.zip" -o "$tmpdir/zork1.zip"
8
+ if unzip -l "$tmpdir/zork1.zip" 2>/dev/null | grep -qE '\.\.[/\\]|^/|[A-Za-z]:\\'; then
9
+ echo "Refusing potentially unsafe Zork archive" >&2
10
+ rm -rf "$tmpdir"; exit 1
11
+ fi
12
+ unzip -o "$tmpdir/zork1.zip" -d "$ZORK_DIR" 2>/dev/null
13
+ rm -rf "$tmpdir"
9
14
  fi
10
15
  exec frotz "$ZORK_DIR/zork1.dat" "$@"
@@ -481,8 +481,10 @@ _agent_exec_to_file() {
481
481
  # ------------------------------------------------------------
482
482
  _agent_cmd_is_write() {
483
483
  local cmd="$1"
484
- # file redirections: >file >>file 2>file 1>>file &>file (excludes fd-to-fd like >&2 and comparisons >=)
485
- if printf '%s\n' "$cmd" | grep -qE '(^|[;&|[:space:]])(>|>>|&>|[0-9]>|[0-9]>>)([^&=]|$)'; then
484
+ # file redirections: >file >>file 2>file 1>>file &>file (also without a
485
+ # preceding space, e.g. echo x>file). Excludes fd-to-fd like >&2 and
486
+ # numeric comparisons >= / =>.
487
+ if printf '%s\n' "$cmd" | grep -qE '(^|[;&|[:space:]]|[A-Za-z0-9])(>|>>|&>)([^&=]|$)'; then
486
488
  return 0
487
489
  fi
488
490
  # command substitution / backticks execute arbitrary code → write
@@ -497,8 +499,14 @@ _agent_cmd_is_write() {
497
499
  if printf '%s\n' "$cmd" | grep -qiE '(^|[;&|[:space:]])(vim|nvim|emacs|ed|ex|vi|nano)[[:space:]]'; then
498
500
  return 0
499
501
  fi
502
+ # interpreters that can execute arbitrary code / spawn processes / modify
503
+ # files even without a trailing redirection or -i flag (sed 'w', perl
504
+ # open(">"), awk system(), env/setsid/nohup running a command, make, xargs)
505
+ if printf '%s\n' "$cmd" | grep -qiE '(^|[;&|[:space:]])(sed|awk|perl|xargs|make|env|nohup|setsid)[[:space:]]'; then
506
+ return 0
507
+ fi
500
508
  # blocklist of commands that write to disk / change state / spawn a shell
501
- printf '%s\n' "$cmd" | grep -qiE '(^|[;&|[:space:]])(rm|rmdir|unlink|mv|cp|mkdir|touch|ln|chmod|chown|chgrp|install|truncate|tee|dd|mkfs|mount|umount|tar|gzip|gunzip|bzip2|xz|zstd|curl|wget|python3|python|node|npm|bun|yarn|pnpm|cargo|go |rustc|git (add|commit|push|pull|merge|rebase|reset|checkout|switch|restore|clean|stash|tag|clone|init|rm|mv)|pkg (install|uninstall|upgrade|reinstall|update)|apt( |-)|apt-get|dpkg|yum|dnf|pacman|brew|pip|pip3|uv|conda|mysql|psql|sqlite3|redis-cli|mongosh|kill|pkill|killall|service|systemctl|halt|reboot|shutdown|sudo|doas|su|pkexec|chroot|bash|sh|dash|zsh|ksh|eval|source|exec|screen|tmux|ssh|scp|sftp|rsync|telnet|nc|ncat|ftp|lftp|rsh|sshpass|socat|crontab|at |iptables|nft|ufw|docker|podman|kubectl|helm)[[:space:]]' && return 0
509
+ printf '%s\n' "$cmd" | grep -qiE '(^|[;&|[:space:]])(rm|rmdir|unlink|mv|cp|mkdir|touch|ln|chmod|chown|chgrp|install|truncate|tee|dd|mkfs|mount|umount|tar|gzip|gunzip|bzip2|xz|zstd|curl|wget|python3|python|node|npm|bun|yarn|pnpm|cargo|go |rustc|git (add|commit|push|pull|merge|rebase|reset|checkout|switch|restore|clean|stash|tag|clone|init|rm|mv|apply|am|worktree|read-tree|update-index|write-tree|checkout-index)|pkg (install|uninstall|upgrade|reinstall|update)|apt( |-)|apt-get|dpkg|yum|dnf|pacman|brew|pip|pip3|uv|conda|mysql|psql|sqlite3|redis-cli|mongosh|kill|pkill|killall|service|systemctl|halt|reboot|shutdown|sudo|doas|su|pkexec|chroot|bash|sh|dash|zsh|ksh|eval|source|exec|screen|tmux|ssh|scp|sftp|rsync|telnet|nc|ncat|ftp|lftp|rsh|sshpass|socat|crontab|at |iptables|nft|ufw|docker|podman|kubectl|helm)[[:space:]]' && return 0
502
510
  return 1
503
511
  }
504
512
 
@@ -898,7 +906,7 @@ agent_exec_loading() {
898
906
  local delay=0.08
899
907
  local tmpfile
900
908
  local _ktmpdir="${KARNEL_CACHE:-${XDG_CACHE_HOME:-$HOME/.cache}/karnel}"
901
- mkdir -p "$_ktmpdir" 2>/dev/null || _ktmpdir="${TMPDIR:-/tmp}"
909
+ mkdir -p "$_ktmpdir" 2>/dev/null || _ktmpdir="${TMPDIR:-${KARNEL_CACHE:-$HOME/.cache/karnel}}"
902
910
  tmpfile="$(mktemp "$_ktmpdir/karnel.XXXXXX" 2>/dev/null)" || tmpfile="$(mktemp 2>/dev/null)"
903
911
 
904
912
  local stty_saved=""
@@ -430,7 +430,7 @@ loading() {
430
430
  local delay=0.08
431
431
  local tmpfile
432
432
  local _ktmpdir="${KARNEL_CACHE:-${XDG_CACHE_HOME:-$HOME/.cache}/karnel}"
433
- mkdir -p "$_ktmpdir" 2>/dev/null || _ktmpdir="${TMPDIR:-/tmp}"
433
+ mkdir -p "$_ktmpdir" 2>/dev/null || _ktmpdir="${TMPDIR:-${KARNEL_CACHE:-$HOME/.cache/karnel}}"
434
434
  tmpfile="$(mktemp "$_ktmpdir/karnel.XXXXXX" 2>/dev/null)" || tmpfile="$(mktemp 2>/dev/null)"
435
435
  local cmd_pid=""
436
436
 
@@ -59,7 +59,7 @@ _run_tool_lifecycle_action() {
59
59
  fi
60
60
  "$uninstall_handler"
61
61
  rc=$?
62
- (( rc == 0 )) || return "$rc"
62
+ (( rc == 0 || rc == 2 )) || return "$rc"
63
63
  "$install_handler"
64
64
  rc=$?
65
65
  if (( rc == 0 && protected )); then
@@ -52,7 +52,7 @@ _spin_capture() {
52
52
  local frames=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
53
53
  local tmp
54
54
  local _ktmpdir="${KARNEL_CACHE:-${XDG_CACHE_HOME:-$HOME/.cache}/karnel}"
55
- mkdir -p "$_ktmpdir" 2>/dev/null || _ktmpdir="${TMPDIR:-/tmp}"
55
+ mkdir -p "$_ktmpdir" 2>/dev/null || _ktmpdir="${TMPDIR:-${KARNEL_CACHE:-$HOME/.cache/karnel}}"
56
56
  tmp=$(mktemp "$_ktmpdir/karnel.XXXXXX" 2>/dev/null) || tmp=$(mktemp 2>/dev/null)
57
57
  local spinner_fd
58
58
  if [ -c /dev/tty ] 2>/dev/null; then
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "karnel-termux",
3
- "version": "4.17.9",
3
+ "version": "4.17.13",
4
4
  "description": "Modular Dev Environment for Termux — install languages, databases, AI agents, editors, and more with one command",
5
5
  "bin": {
6
6
  "karnel": "karnel/bin/karnel"
@@ -46,5 +46,5 @@
46
46
  "bugs": {
47
47
  "url": "https://github.com/israelmarques1024-dotcom/karnel-termux/issues"
48
48
  },
49
- "homepage": "https://karneltermux.vercel.app"
49
+ "homepage": "https://israelmarques1024-dotcom.github.io/karnel-termux"
50
50
  }
@@ -20,7 +20,7 @@ _karnel_tool_flags() {
20
20
  security) tools="aircrack-ng amass binwalk burpsuite dirb dnsrecon enum4linux exiftool ffuf foremost gobuster hashcat hydra john masscan metasploit netcat nikto nmap smbclient sqlmap steghide subfinder tcpdump theharvester wafw00f whatweb whois wpscan zap" ;;
21
21
  shell) tools="powerlevel10k zsh-defer zsh-autosuggestions zsh-syntax-highlighting history-substring zsh-completions fzf-tab you-should-use zsh-autopair better-npm" ;;
22
22
  ui) tools="font extra-keys cursor banner" ;;
23
- utils) tools="fconv filecheck websites notes treex passman applaunch splash httptmux zork qrcode superfile" ;;
23
+ utils) tools="fconv filecheck websites notes treex passman applaunch splash httptmux zork qrcode superfile herdr" ;;
24
24
  esac
25
25
 
26
26
  local flags=""
@@ -82,7 +82,7 @@ _karnel_tool_flags() {
82
82
  security) tools="aircrack-ng amass binwalk burpsuite dirb dnsrecon enum4linux exiftool ffuf foremost gobuster hashcat hydra john masscan metasploit netcat nikto nmap smbclient sqlmap steghide subfinder tcpdump theharvester wafw00f whatweb whois wpscan zap" ;;
83
83
  shell) tools="powerlevel10k zsh-defer zsh-autosuggestions zsh-syntax-highlighting history-substring zsh-completions fzf-tab you-should-use zsh-autopair better-npm" ;;
84
84
  ui) tools="font extra-keys cursor banner" ;;
85
- utils) tools="fconv filecheck websites notes treex passman applaunch splash httptmux zork qrcode superfile" ;;
85
+ utils) tools="fconv filecheck websites notes treex passman applaunch splash httptmux zork qrcode superfile herdr" ;;
86
86
  esac
87
87
 
88
88
  local -a flags=()