karnel-termux 0.0.3 → 4.7.5

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 (45) hide show
  1. package/README.md +9 -11
  2. package/install.sh +9 -0
  3. package/karnel/bin/karnel +1 -1
  4. package/karnel/cli/commands/backup.sh +100 -0
  5. package/karnel/cli/commands/doctor/fixes.sh +310 -0
  6. package/karnel/cli/commands/doctor/system.sh +87 -0
  7. package/karnel/cli/commands/doctor.sh +7 -308
  8. package/karnel/cli/commands/install.sh +21 -2
  9. package/karnel/cli/commands/list.sh +2 -0
  10. package/karnel/cli/commands/reinstall.sh +5 -1
  11. package/karnel/cli/commands/restore.sh +83 -0
  12. package/karnel/cli/commands/search.sh +62 -0
  13. package/karnel/cli/commands/show.sh +102 -38
  14. package/karnel/cli/commands/uninstall.sh +3 -551
  15. package/karnel/cli/commands/update.sh +3 -551
  16. package/karnel/cli/karnel.sh +5 -0
  17. package/karnel/modules/db.sh +2 -0
  18. package/karnel/modules/dev.sh +9 -3
  19. package/karnel/tools/ai/antigravity-cli/bin/agy +1 -1
  20. package/karnel/tools/ai/claude-code/bin/claude +1 -1
  21. package/karnel/tools/ai/codegraph/bin/codegraph +1 -1
  22. package/karnel/tools/ai/freebuff/bin/freebuff +1 -1
  23. package/karnel/tools/ai/kilocode-cli/bin/kilocode +1 -1
  24. package/karnel/tools/ai/kilocode-cli/install.sh +1 -1
  25. package/karnel/tools/ai/kimchi-code/bin/kimchi +1 -1
  26. package/karnel/tools/ai/mimocode/bin/mimo +1 -1
  27. package/karnel/tools/ai/omni-route/README.md +17 -15
  28. package/karnel/tools/ai/opencode/bin/opencode +1 -1
  29. package/karnel/tools/db/redis/install.sh +1 -1
  30. package/karnel/tools/dev/all.sh +3 -0
  31. package/karnel/tools/dev/httptmux/install.sh +75 -0
  32. package/karnel/tools/dev/openssh/install.sh +1 -1
  33. package/karnel/tools/dev/snyk/install.sh +75 -0
  34. package/karnel/tools/dev/tmux/install.sh +1 -1
  35. package/karnel/tools/dev/zork/install.sh +122 -0
  36. package/karnel/tools/editor/neovim/install.sh +1 -1
  37. package/karnel/tools/editor/nvchad/install.sh +1 -1
  38. package/karnel/tools/npm/turbopack/bin/next-turbopack +1 -1
  39. package/karnel/tools/npm/turbopack/bin/node-glibc.sh +1 -1
  40. package/karnel/utils/log.sh +70 -0
  41. package/karnel/utils/tools.sh +34 -0
  42. package/karnel/utils/version.sh +1 -1
  43. package/package.json +1 -1
  44. package/scripts/completion.bash +28 -0
  45. package/scripts/completion.zsh +90 -0
package/README.md CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  <p align="center">
10
10
  <a href="https://github.com/israelmarques1024-dotcom/karnel-termux">
11
- <img src="https://img.shields.io/badge/version-0.0.1-0078D4?style=for-the-badge&logo=appveyor" alt="Version">
11
+ <img src="https://img.shields.io/badge/version-0.0.4-0078D4?style=for-the-badge&logo=appveyor" alt="Version">
12
12
  </a>
13
13
  <a href="https://www.npmjs.com/package/karnel-termux">
14
14
  <img src="https://img.shields.io/npm/v/karnel-termux?style=for-the-badge&logo=npm&color=cb3837" alt="npm">
@@ -23,21 +23,19 @@
23
23
  <img src="https://img.shields.io/badge/platform-Termux%20%7C%20Android-0078D4?style=for-the-badge&logo=android" alt="Platform">
24
24
  </a>
25
25
  <a href="https://kerneltermux.vercel.app">
26
- <img src="https://img.shields.io/badge/%F0%9F%8C%90%20Site-karnel--termux.vercel.app-0078D4?style=for-the-badge" alt="Website">
26
+ <img src="https://img.shields.io/badge/%F0%9F%8C%90%20Site-kerneltermux.vercel.app-0078D4?style=for-the-badge" alt="Website">
27
27
  </a>
28
28
  </p>
29
29
 
30
-
31
-
32
30
  ---
33
31
 
34
32
  **KARNEL TERMUX** é um ambiente de desenvolvimento modular que transforma o Termux em uma workstation completa. Com um único CLI (`karnel`), instale e gerencie:
35
33
 
36
- Criado por **israel marques** (tenho 12 anos).
34
+ Criado por **israel marques** (12 anos).
37
35
 
38
36
  - **30 agentes de IA** para coding — Claude, Gemini, OpenCode, Ollama, Cline, karnelRoute e mais
39
37
  - **7 linguagens** — Node.js, Python, Go, Rust, C/C++, PHP, Perl
40
- - **4 bancos de dados** — PostgreSQL, MariaDB, SQLite, MongoDB
38
+ - **5 bancos de dados** — PostgreSQL, MariaDB, SQLite, MongoDB, Redis
41
39
  - **19 ferramentas dev** — gh, curl, fzf, bat, lsd, jq e muito mais
42
40
  - **3 CLIs de deploy** — Vercel, Railway, Netlify
43
41
  - **Editor profissional** — code-server (VS Code no navegador)
@@ -47,6 +45,9 @@ Criado por **israel marques** (tenho 12 anos).
47
45
  > [!IMPORTANT]
48
46
  > Projetado exclusivamente para **Termux no Android**. Não funciona em outras plataformas.
49
47
 
48
+ > [!NOTE]
49
+ > 💻 **Também disponível para Desktop:** [Karnel Desktop CLI](https://github.com/israelmarques1024-dotcom/karnel-termux-desktop-cli) — Gerenciador multiplataforma para Linux, macOS e Windows. Mesmo CLI, mesmos comandos, gerenciadores de pacote nativos.
50
+
50
51
  ---
51
52
 
52
53
  ## 📦 Instalação
@@ -105,7 +106,7 @@ karnel
105
106
  | Módulo | Descrição | Instalação |
106
107
  |--------|-----------|------------|
107
108
  | `lang` | Node.js, Python, Go, Rust, C/C++, PHP, Perl | `karnel install lang` |
108
- | `db` | PostgreSQL, MariaDB, SQLite, MongoDB | `karnel install db` |
109
+ | `db` | PostgreSQL, MariaDB, SQLite, MongoDB, Redis | `karnel install db` |
109
110
  | `ai` | 30 agentes de IA para coding | `karnel install ai` |
110
111
  | `editor` | code-server (VS Code no navegador) | `karnel install editor` |
111
112
  | `dev` | gh, curl, fzf, bat, lsd, jq e mais | `karnel install dev` |
@@ -448,7 +449,4 @@ MIT © israel marques
448
449
  <a href="https://kerneltermux.vercel.app">
449
450
  <img src="https://img.shields.io/badge/%F0%9F%8C%90%20Documenta%C3%A7%C3%A3o%20Completa-0078D4?style=for-the-badge" alt="Documentação">
450
451
  </a>
451
- <a href="https://github.com/israelmarques1024-dotcom/karnel-termux-site">
452
- <img src="https://img.shields.io/badge/%F0%9F%93%B1%20Site%20Repo-0078D4?style=for-the-badge" alt="Site Repo">
453
- </a>
454
- </p>
452
+ </p>
package/install.sh CHANGED
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env bash
2
2
 
3
3
  set -e
4
+ trap '_cleanup_failed' ERR
4
5
 
5
6
  readonly P_BORDER='\e[38;5;33m'
6
7
  readonly P_PRIMARY='\e[38;5;39m'
@@ -64,6 +65,14 @@ log_info() {
64
65
  echo -e " ${P_BORDER}→${P_NC} $1"
65
66
  }
66
67
 
68
+ _cleanup_failed() {
69
+ echo -e "\n ${P_FAIL}✖${P_NC} Installation failed at step ${CURRENT_STEP}. Cleaning up..."
70
+ [[ -d "$KARNEL_REPO" ]] && rm -rf "$KARNEL_REPO"
71
+ [[ -L "$PREFIX/bin/karnel" ]] && rm -f "$PREFIX/bin/karnel"
72
+ echo -e " ${P_DIM}Run install.sh again to retry${P_NC}"
73
+ exit 1
74
+ }
75
+
67
76
  separator() {
68
77
  local cols=$(_cols)
69
78
  local line=$(printf "%${cols}s")
package/karnel/bin/karnel CHANGED
@@ -1,4 +1,4 @@
1
- #!/data/data/com.termux/files/usr/bin/bash
1
+ #!/usr/bin/env bash
2
2
 
3
3
  SOURCE="${BASH_SOURCE[0]}"
4
4
 
@@ -0,0 +1,100 @@
1
+ #!/usr/bin/env bash
2
+
3
+ import "@/utils/log"
4
+ import "@/utils/colors"
5
+
6
+ backup_main() {
7
+ if [[ "$1" == "--help" || "$1" == "-h" ]]; then
8
+ echo
9
+ box "◈ KARNEL BACKUP ◈"
10
+ echo
11
+ log_info "Save ALL your Termux configs + installed tools"
12
+ echo
13
+ list_item "karnel backup Backup local"
14
+ list_item "karnel backup --cloud Backup + upload to Google Drive"
15
+ list_item "karnel restore Restore latest backup"
16
+ list_item "karnel restore --cloud Restore from Google Drive"
17
+ echo
18
+ return
19
+ fi
20
+
21
+ local cloud=false
22
+ [[ "$1" == "--cloud" ]] && cloud=true
23
+
24
+ local dir="${KARNEL_DATA}/backups"
25
+ mkdir -p "$dir"
26
+ local ts
27
+ ts=$(date +%Y%m%d_%H%M%S)
28
+ local file="$dir/termux-$ts.tar.gz"
29
+
30
+ echo
31
+ box "◈ KARNEL BACKUP ◈"
32
+ echo
33
+
34
+ # Package list
35
+ dpkg --get-selections > "$dir/packages-$ts.list" 2>/dev/null
36
+ local pkgs
37
+ pkgs=$(wc -l < "$dir/packages-$ts.list")
38
+ log_success "Saved $pkgs installed packages"
39
+
40
+ # Karnel tool manifest
41
+ local tools=()
42
+ for m in "$KARNEL_PATH/tools/"*/; do
43
+ local mod
44
+ mod=$(basename "${m%/}")
45
+ for t in "$m"*/; do
46
+ local tool
47
+ tool=$(basename "${t%/}")
48
+ local bins
49
+ bins=$(grep "\"$tool:" "$m/all.sh" 2>/dev/null | cut -d: -f3 | tr -d '"')
50
+ local found=false
51
+ for b in ${bins//,/ }; do
52
+ command -v "$b" &>/dev/null && found=true && break
53
+ done
54
+ $found && tools+=("$mod:$tool")
55
+ done
56
+ done
57
+ printf "%s\n" "${tools[@]}" > "$dir/manifest-$ts.list"
58
+ log_success "Saved ${#tools[@]} Karnel tools"
59
+
60
+ # Configs
61
+ local tmp
62
+ tmp=$(mktemp -d)
63
+ mkdir -p "$tmp/config"/{home,termux,ssh,config,prefix-etc}
64
+
65
+ for f in .bashrc .zshrc .profile .zshenv .inputrc; do
66
+ [[ -f "$HOME/$f" ]] && cp "$HOME/$f" "$tmp/config/home/"
67
+ done
68
+ [[ -d "$HOME/.termux" ]] && cp -r "$HOME/.termux" "$tmp/config/termux/" 2>/dev/null
69
+ [[ -d "$HOME/.ssh" ]] && cp "$HOME/.ssh/id_"* "$HOME/.ssh/config" "$HOME/.ssh/known_hosts" "$tmp/config/ssh/" 2>/dev/null
70
+ for d in "$HOME/.config"/*; do
71
+ [[ -d "$d" ]] && cp -r "$d" "$tmp/config/config/" 2>/dev/null
72
+ done
73
+ [[ -f "$PREFIX/etc/apt/sources.list" ]] && cp "$PREFIX/etc/apt/sources.list" "$tmp/config/prefix-etc/" 2>/dev/null
74
+
75
+ tar -czf "$file" -C "$tmp" . 2>/dev/null
76
+ rm -rf "$tmp"
77
+
78
+ local size
79
+ size=$(du -h "$file" | awk '{print $1}')
80
+ log_success "Backup: $(basename "$file") ($size)"
81
+
82
+ # Cloud
83
+ if $cloud; then
84
+ if ! command -v rclone &>/dev/null; then
85
+ pkg install rclone -y &>/dev/null || log_warn "Install rclone: pkg install rclone"
86
+ fi
87
+ if command -v rclone &>/dev/null; then
88
+ if rclone listremotes 2>/dev/null | grep -q "^karnel:"; then
89
+ loading "Uploading" rclone copy "$file" "karnel:backups/"
90
+ log_success "Uploaded to Google Drive"
91
+ else
92
+ log_warn "Run 'rclone config' and name the remote 'karnel'"
93
+ fi
94
+ fi
95
+ fi
96
+
97
+ echo
98
+ log_success "Done! Restore with: karnel restore"
99
+ echo
100
+ }
@@ -0,0 +1,310 @@
1
+ #!/usr/bin/env bash
2
+
3
+ import "@/utils/log"
4
+ import "@/utils/colors"
5
+
6
+ _fix_storage() {
7
+ termux-setup-storage 2>/dev/null
8
+ return $?
9
+ }
10
+
11
+ _fix_mkdir() {
12
+ for dir in "$KARNEL_CONFIG" "$KARNEL_CACHE" "$KARNEL_DATA"; do
13
+ mkdir -p "$dir" 2>/dev/null
14
+ chmod 755 "$dir" 2>/dev/null
15
+ done
16
+ return 0
17
+ }
18
+
19
+ _fix_pkg_install() {
20
+ local pkg_to_install=""
21
+ case "$1" in
22
+ pkg) pkg_to_install="$2" ;;
23
+ *) pkg_to_install="${fix_commands[$i]:-}" ;;
24
+ esac
25
+ local pkg_name=""
26
+ if [[ "$pkg_to_install" =~ pkg\ install\ -y\ (.+) ]]; then
27
+ pkg_name="${BASH_REMATCH[1]}"
28
+ fi
29
+ if [[ -n "$pkg_name" ]]; then
30
+ pkg install -y "$pkg_name" 2>/dev/null
31
+ return $?
32
+ fi
33
+ return 1
34
+ }
35
+
36
+ _fix_dpkg() {
37
+ dpkg --configure -a 2>/dev/null
38
+ apt-get -f install -y 2>/dev/null
39
+ return $?
40
+ }
41
+
42
+ _fix_apt_update() {
43
+ pkg update -y 2>/dev/null
44
+ return $?
45
+ }
46
+
47
+ _fix_npm_prefix() {
48
+ mkdir -p "$HOME/.npm-global"
49
+ npm config set prefix "$HOME/.npm-global" 2>/dev/null
50
+ return $?
51
+ }
52
+
53
+ _fix_pip() {
54
+ local py_cmd=""
55
+ for py in python3.12 python3.11 python3.10 python3.9 python3 python; do
56
+ if command -v "$py" &>/dev/null; then py_cmd="$py"; break; fi
57
+ done
58
+ if [[ -n "$py_cmd" ]]; then
59
+ "$py_cmd" -m ensurepip 2>/dev/null
60
+ "$py_cmd" -m pip install --upgrade pip 2>/dev/null
61
+ return $?
62
+ fi
63
+ return 1
64
+ }
65
+
66
+ _fix_pg_init() {
67
+ source "$KARNEL_PATH/utils/env.sh" 2>/dev/null
68
+ import "@/modules/db" 2>/dev/null
69
+ if type pg_init &>/dev/null; then
70
+ pg_init 2>/dev/null
71
+ pg_start 2>/dev/null
72
+ return $?
73
+ fi
74
+ local pg_data="$HOME/.local/share/postgresql/data"
75
+ mkdir -p "$pg_data" 2>/dev/null
76
+ if command -v initdb &>/dev/null; then
77
+ initdb -D "$pg_data" 2>/dev/null
78
+ pg_ctl -D "$pg_data" -l "$HOME/.cache/karnel/postgresql.log" start 2>/dev/null
79
+ return $?
80
+ fi
81
+ return 1
82
+ }
83
+
84
+ _fix_pg_start() {
85
+ local pg_data=""
86
+ for dir in "$PREFIX/var/lib/postgresql/data" "$PREFIX/var/lib/postgresql" "$HOME/.termux/postgresql/data" "$HOME/.termux/postgresql" "$HOME/.local/share/postgresql/data"; do
87
+ if [[ -d "$dir" ]] && [[ -f "$dir/PG_VERSION" ]]; then
88
+ pg_data="$dir"
89
+ break
90
+ fi
91
+ done
92
+ if [[ -n "$pg_data" ]] && command -v pg_ctl &>/dev/null; then
93
+ pg_ctl -D "$pg_data" -l "$HOME/.cache/karnel/postgresql.log" start 2>/dev/null
94
+ return $?
95
+ fi
96
+ return 1
97
+ }
98
+
99
+ _fix_pg_install() {
100
+ source "$KARNEL_PATH/utils/env.sh" 2>/dev/null
101
+ import "@/modules/db" 2>/dev/null
102
+ if type install_db &>/dev/null; then
103
+ install_db 2>/dev/null
104
+ return $?
105
+ fi
106
+ pkg install -y postgresql 2>/dev/null
107
+ return $?
108
+ }
109
+
110
+ _fix_symlinks() {
111
+ ln -sf "$KARNEL_PATH/bin/karnel" "$PREFIX/bin/karnel" 2>/dev/null
112
+ [[ -L "$PREFIX/bin/karnel" ]]
113
+ }
114
+
115
+ _fix_banner() {
116
+ local shell_config=""
117
+ if [[ -f "$HOME/.zshrc" ]]; then
118
+ shell_config="$HOME/.zshrc"
119
+ elif [[ -f "$HOME/.bashrc" ]]; then
120
+ shell_config="$HOME/.bashrc"
121
+ fi
122
+ if [[ -z "$shell_config" ]]; then
123
+ shell_config="$HOME/.zshrc"
124
+ touch "$shell_config"
125
+ fi
126
+ local marker="# ===== Karnel Banner ====="
127
+ if ! grep -qF "$marker" "$shell_config" 2>/dev/null; then
128
+ cat >>"$shell_config" <<EOF
129
+
130
+ $marker
131
+ source "$KARNEL_UTILS/banner.sh"
132
+ EOF
133
+ return 0
134
+ fi
135
+ return 0
136
+ }
137
+
138
+ _fix_ai_install() {
139
+ log_info "Installing AI tools (this may take a while)..."
140
+ source "$KARNEL_PATH/utils/env.sh" 2>/dev/null
141
+ import "@/modules/ai" 2>/dev/null
142
+ if type install_ai &>/dev/null; then
143
+ install_ai 2>/dev/null
144
+ return $?
145
+ fi
146
+ return 1
147
+ }
148
+
149
+ _fix_shell_syntax() {
150
+ local config=""
151
+ if [[ -f "$HOME/.zshrc" ]]; then
152
+ config="$HOME/.zshrc"
153
+ elif [[ -f "$HOME/.bashrc" ]]; then
154
+ config="$HOME/.bashrc"
155
+ fi
156
+ if [[ -n "$config" ]]; then
157
+ cp "$config" "${config}.bak" 2>/dev/null
158
+ local marker="# ===== Karnel Banner ====="
159
+ local banner_block=""
160
+ if grep -qF "$marker" "$config" 2>/dev/null; then
161
+ local marker_line
162
+ marker_line=$(grep -nF "$marker" "$config" | head -1 | cut -d: -f1)
163
+ if [[ -n "$marker_line" ]]; then
164
+ banner_block=$(sed -n "$((marker_line - 1)),\$p" "$config" 2>/dev/null)
165
+ fi
166
+ fi
167
+ local tmpconfig
168
+ tmpconfig=$(mktemp)
169
+ sed '/^source.*\/dev\/null$/d; /^#.*syntax error/d' "$config" > "$tmpconfig" 2>/dev/null
170
+ if [[ -n "$banner_block" ]]; then
171
+ echo "" >> "$tmpconfig"
172
+ echo "$banner_block" >> "$tmpconfig"
173
+ fi
174
+ cp "$tmpconfig" "$config" 2>/dev/null
175
+ rm -f "$tmpconfig"
176
+ return 0
177
+ fi
178
+ return 1
179
+ }
180
+
181
+ _fix_ssh_key() {
182
+ mkdir -p "$HOME/.ssh"
183
+ chmod 700 "$HOME/.ssh"
184
+ ssh-keygen -t ed25519 -f "$HOME/.ssh/id_ed25519" -N '' 2>/dev/null
185
+ return $?
186
+ }
187
+
188
+ _fix_disk_cleanup() {
189
+ rm -rf ~/.cache/karnel/install_*.log 2>/dev/null
190
+ if command -v pkg &>/dev/null; then
191
+ pkg clean -y 2>/dev/null
192
+ fi
193
+ return $?
194
+ }
195
+
196
+ _fix_mkdir_single() {
197
+ for dir in "$KARNEL_CONFIG" "$KARNEL_CACHE" "$KARNEL_DATA" "$HOME/.local/share/karnel-data"; do
198
+ [[ -d "$dir" ]] || mkdir -p "$dir" 2>/dev/null
199
+ done
200
+ return 0
201
+ }
202
+
203
+ # ===== NEW FIX CALLBACKS =====
204
+
205
+ _fix_psutil() {
206
+ local tmp="$PREFIX/tmp/psutil_patch"
207
+ mkdir -p "$tmp"
208
+ pip download psutil==7.2.2 --no-binary :all: --no-deps -d "$tmp" 2>/dev/null || return 1
209
+ tar xzf "$tmp/psutil-7.2.2.tar.gz" -C "$tmp"
210
+ sed -i 's/LINUX = sys.platform.startswith("linux")/LINUX = sys.platform.startswith(("linux", "android"))/' "$tmp/psutil-7.2.2/psutil/_common.py"
211
+ pip install "$tmp/psutil-7.2.2" 2>/dev/null
212
+ local rc=$?
213
+ rm -rf "$tmp"
214
+ return $rc
215
+ }
216
+
217
+ _fix_pip_check() {
218
+ local broken
219
+ broken=$(pip check 2>&1 | grep -oP '^\S+' | head -3)
220
+ if [[ -n "$broken" ]]; then
221
+ pip install --upgrade --force-reinstall $broken 2>/dev/null
222
+ fi
223
+ return 0
224
+ }
225
+
226
+ _fix_npm_shebangs() {
227
+ local fixed=0
228
+ for f in "$PREFIX/bin/"*; do
229
+ [[ -f "$f" ]] || continue
230
+ local shebang
231
+ shebang=$(head -1 "$f" 2>/dev/null | tr -d '\0')
232
+ if [[ "$shebang" == "#!/usr/bin/env node" ]]; then
233
+ sed -i "1s|^.*$|#!$PREFIX/bin/node|" "$f"
234
+ ((fixed++))
235
+ elif [[ "$shebang" == "#!/usr/bin/env bash" ]] || [[ "$shebang" == "#!/usr/bin/env sh" ]]; then
236
+ sed -i "1s|^.*$|#!$PREFIX/bin/bash|" "$f"
237
+ ((fixed++))
238
+ fi
239
+ done
240
+ return 0
241
+ }
242
+
243
+ _fix_broken_symlinks() {
244
+ find "$PREFIX/bin" -type l ! -exec test -e {} \; -delete 2>/dev/null
245
+ return 0
246
+ }
247
+
248
+ _fix_npm_cache() {
249
+ npm cache clean --force 2>/dev/null
250
+ return $?
251
+ }
252
+
253
+ _fix_pip_cache() {
254
+ pip cache purge 2>/dev/null
255
+ return $?
256
+ }
257
+
258
+ _fix_pycache() {
259
+ find "$PREFIX/lib/python3.*" -name "__pycache__" -exec rm -rf {} + 2>/dev/null
260
+ return 0
261
+ }
262
+
263
+ _fix_proot_ubuntu() {
264
+ if command -v proot-distro &>/dev/null; then
265
+ proot-distro install ubuntu 2>/dev/null
266
+ return $?
267
+ fi
268
+ return 1
269
+ }
270
+
271
+ _fix_dns() {
272
+ echo 'nameserver 8.8.8.8' > "$PREFIX/etc/resolv.conf" 2>/dev/null
273
+ return $?
274
+ }
275
+
276
+ _fix_mirror() {
277
+ if command -v termux-change-repo &>/dev/null; then
278
+ termux-change-repo 2>/dev/null
279
+ return $?
280
+ fi
281
+ return 1
282
+ }
283
+
284
+ _fix_locale() {
285
+ local config="$HOME/.zshrc"
286
+ if [[ ! -f "$config" ]] && [[ -f "$HOME/.bashrc" ]]; then
287
+ config="$HOME/.bashrc"
288
+ fi
289
+ echo 'export LANG=en_US.UTF-8' >> "$config" 2>/dev/null
290
+ return $?
291
+ }
292
+
293
+
294
+ _fix_zombies() {
295
+ ps aux 2>/dev/null | awk '$8 ~ /^Z/ {print $2}' | xargs kill -9 2>/dev/null
296
+ return 0
297
+ }
298
+
299
+ _fix_url_quote_magic() {
300
+ local uqm_file="$PREFIX/share/zsh/functions/Zle/url-quote-magic"
301
+ if [[ ! -f "$uqm_file" ]]; then
302
+ return 1
303
+ fi
304
+ # Fix double-paren case patterns: (( -> ( for localschema and otherschema
305
+ sed -i \
306
+ -e 's/((${~localschema})/(${~localschema})/g' \
307
+ -e 's/((${~otherschema})/(${~otherschema})/g' \
308
+ "$uqm_file" 2>/dev/null
309
+ return $?
310
+ }
@@ -0,0 +1,87 @@
1
+ _doctor_system() {
2
+ local arch
3
+ arch=$(uname -m)
4
+
5
+ local android_ver
6
+ android_ver=$(getprop ro.build.version.release 2>/dev/null)
7
+ android_ver="${android_ver:-Unknown}"
8
+
9
+ local termux_ver=""
10
+ if command -v termux-info &>/dev/null; then
11
+ termux_ver=$(timeout 5 termux-info 2>/dev/null | grep -i "termux_version" | head -n1 | cut -d'=' -f2)
12
+ fi
13
+ if [[ -z "$termux_ver" ]]; then
14
+ termux_ver=$(dpkg -s termux-tools 2>/dev/null | grep -i version | awk '{print $2}')
15
+ fi
16
+ termux_ver="${termux_ver:-Unknown}"
17
+
18
+ log_success "Android Version: $android_ver"
19
+ log_success "Termux Version: $termux_ver"
20
+ log_success "CPU Architecture: $arch"
21
+
22
+ echo
23
+ separator_section "System Resources"
24
+ echo
25
+
26
+ local free_space
27
+ free_space=$(df -h "$HOME" | awk 'NR==2 {print $4}')
28
+ log_success "Available disk space: $free_space"
29
+
30
+ local ram_total="Unknown"
31
+ local ram_free="Unknown"
32
+ if [[ -f /proc/meminfo ]]; then
33
+ local total_kb free_kb
34
+ total_kb=$(grep MemTotal /proc/meminfo | awk '{print $2}')
35
+ ram_total="$((total_kb / 1024)) MB"
36
+ free_kb=$(grep MemAvailable /proc/meminfo | awk '{print $2}')
37
+ ram_free="$((free_kb / 1024)) MB"
38
+ log_success "RAM: Total: $ram_total | Available: $ram_free"
39
+
40
+ local free_mb=$((free_kb / 1024))
41
+ if (( free_mb < 200 )); then
42
+ log_warn "Low available memory (${ram_free}). Some tools may fail."
43
+ ((warnings++))
44
+ fi
45
+ else
46
+ log_warn "Could not read RAM details"
47
+ ((warnings++))
48
+ fi
49
+ }
50
+
51
+ _doctor_storage() {
52
+ echo
53
+ separator_section "Storage & Permissions"
54
+ echo
55
+
56
+ local storage_status="Accessible"
57
+ if ls /sdcard &>/dev/null || [ -d "$HOME/storage" ]; then
58
+ log_success "Shared storage is accessible"
59
+ else
60
+ log_warn "Shared storage is not linked"
61
+ storage_status="Not Linked"
62
+ ((warnings++))
63
+ fix_commands+=("termux-setup-storage")
64
+ fix_descriptions+=("Link shared storage for file access")
65
+ fix_callbacks+=("_fix_storage")
66
+ fi
67
+
68
+ if [ -w "$KARNEL_PATH" ]; then
69
+ log_success "Write permission in Karnel path: $KARNEL_PATH"
70
+ else
71
+ log_error "No write permission in Karnel path!"
72
+ ((errors++))
73
+ fi
74
+
75
+ local dirs=("$KARNEL_CONFIG" "$KARNEL_CACHE" "$KARNEL_DATA")
76
+ for dir in "${dirs[@]}"; do
77
+ if [ -d "$dir" ] && [ -w "$dir" ]; then
78
+ log_success "Directory OK: $(basename "$dir")"
79
+ else
80
+ log_warn "Directory missing or read-only: $(basename "$dir")"
81
+ ((warnings++))
82
+ fix_commands+=("mkdir -p \"$dir\" && chmod 755 \"$dir\"")
83
+ fix_descriptions+=("Recreate directory: $(basename "$dir")")
84
+ fix_callbacks+=("_fix_mkdir")
85
+ fi
86
+ done
87
+ }