karnel-termux 4.13.2 → 4.13.3

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.
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-4.13.0-0078D4?style=for-the-badge" alt="Version">
11
+ <img src="https://img.shields.io/badge/version-4.13.3-0078D4?style=for-the-badge" 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">
@@ -33,7 +33,7 @@
33
33
 
34
34
  Created by **Israel Marques**.
35
35
 
36
- - **37 AI agents** for coding — Claude, Gemini, OpenCode, Qoder, Ollama, Goose, Factory Droid, Cline, OmniRoute and more
36
+ - **39 AI agents** for coding — Claude, Gemini, OpenCode, Qoder, Ollama, Goose, Factory Droid, Cline, Puter, OmniRoute and more
37
37
  - **8 languages** — Node.js, Python, Go, Rust, C/C++, PHP, Perl, Bun
38
38
  - **5 databases** — PostgreSQL, MariaDB, SQLite, MongoDB, Redis
39
39
  - **22 dev tools** — gh, curl, fzf, bat, lsd, jq, tmux, openssh, snyk and more
@@ -114,7 +114,7 @@ karnel
114
114
  |--------|-------------|--------------|
115
115
  | `lang` | Node.js, Python, Go, Rust, C/C++, PHP, Perl, Bun | `karnel install lang` |
116
116
  | `db` | PostgreSQL, MariaDB, SQLite, MongoDB, Redis | `karnel install db` |
117
- | `ai` | 37 AI agents for coding | `karnel install ai` |
117
+ | `ai` | 39 AI agents for coding | `karnel install ai` |
118
118
  | `editor` | code-server (VS Code in browser) | `karnel install editor` |
119
119
  | `dev` | gh, curl, fzf, bat, lsd, jq and more | `karnel install dev` |
120
120
  | `npm` | TypeScript, NestJS CLI, Prettier and more | `karnel install npm` |
@@ -172,6 +172,32 @@ The installed plugin directory is `${XDG_DATA_HOME:-$HOME/.local/share}/karnel-d
172
172
  See the [official plugin registry](https://github.com/israelmarques1024-dotcom/karnel-plugins)
173
173
  for schemas, review policy, and safe publication requirements.
174
174
 
175
+ ## AI CLIs
176
+
177
+ Supercode CLI and Puter CLI are available in the `ai` module. They require
178
+ Node.js 18 or newer and install their official npm packages.
179
+
180
+ ```bash
181
+ karnel install ai --supercode-cli
182
+ supercode
183
+ ```
184
+
185
+ ## Puter CLI
186
+
187
+ Puter CLI is available in the `ai` module for managing Puter sites and workers.
188
+
189
+ ```bash
190
+ karnel install ai --puter
191
+ puter login
192
+ puter whoami
193
+ puter site deploy [directory] [subdomain]
194
+ puter worker deploy [file] [name]
195
+ ```
196
+
197
+ For noninteractive automation, configure `PUTER_AUTH_TOKEN` in your own
198
+ environment. Do not place tokens in the repository, shell history, screenshots,
199
+ or issue reports.
200
+
175
201
  ## Security Tools
176
202
 
177
203
  Install security auditing tools:
@@ -181,7 +207,9 @@ karnel install security # Install all
181
207
  karnel install security --nmap --hydra --sqlmap # Install specific ones
182
208
  ```
183
209
 
184
- Includes: Nmap, Hydra, Nikto, SQLMap, Gobuster, Dirb, WPScan, John the Ripper, Aircrack-ng, Metasploit.
210
+ Includes 30 tools: Nmap, Hydra, Nikto, SQLMap, Gobuster, Dirb, WPScan, John the
211
+ Ripper, Aircrack-ng, Metasploit, Burp Suite, OWASP ZAP, FFUF, Amass, Hashcat and
212
+ more. Use only on systems you own or are authorized to test.
185
213
 
186
214
  ---
187
215
 
@@ -492,7 +520,7 @@ karnel/
492
520
  │ │ └── karnel.sh # Main CLI (with TUI)
493
521
  │ ├── modules/ # Module orchestrators
494
522
  │ ├── tools/ # Tool installers
495
- │ │ ├── ai/ # 37 AI agents
523
+ │ │ ├── ai/ # 39 AI agents
496
524
  │ │ ├── lang/ # 8 languages
497
525
  │ │ ├── db/ # 5 databases
498
526
  │ │ ├── dev/ # 22 dev tools
@@ -503,7 +531,7 @@ karnel/
503
531
  │ │ ├── auto/ # 1 automation tool
504
532
  │ │ ├── network/ # 2 network tools
505
533
  │ │ ├── utils/ # 11 utility tools
506
- │ │ ├── games/ # 7 games
534
+ │ │ ├── games/ # 6 games
507
535
  │ │ ├── security/ # 30 security tools
508
536
  │ │ └── deploy/ # 4 deploy CLIs
509
537
  │ └── utils/ # Utilities (banner, log, env, etc.)
@@ -540,6 +568,26 @@ The framework checks for updates every 24 hours in background.
540
568
  karnel update karnel # Update the framework
541
569
  ```
542
570
 
571
+ `karnel update` requires a target such as `karnel`, `ai`, or `security`.
572
+ `karnel update karnel` first runs the official curl installer, then falls back to
573
+ the local Git checkout and package-manager installs if needed. The framework
574
+ checks for a new version in the background at most once every 24 hours; the check
575
+ can use npm or GitHub and writes state under `$KARNEL_CACHE`.
576
+
577
+ ---
578
+
579
+ ## Verification And Limits
580
+
581
+ The repository CI validates Bash/Zsh syntax, ShellCheck errors, CLI smoke tests,
582
+ version behavior, Robin contracts, plugin lifecycle contracts, and npm package
583
+ contents. The official documentation site validates its catalog contracts,
584
+ TypeScript, formatting, tests, and production build.
585
+
586
+ These checks do not install every external tool or prove behavior on every Android
587
+ device. Before relying on a new installer, test it in native Termux aarch64 with a
588
+ disposable environment and verify network, storage, PRoot, and Termux:API behavior
589
+ for your device.
590
+
543
591
  ---
544
592
 
545
593
  ## Support the Project
package/install.sh CHANGED
@@ -66,13 +66,21 @@ log_info() {
66
66
  }
67
67
 
68
68
  _INSTALL_CREATED_KARNEL_REPO=false
69
+ _INSTALL_CREATED_KARNEL_SYMLINK=false
70
+ _INSTALL_PREVIOUS_KARNEL_SYMLINK=""
69
71
 
70
72
  _cleanup_failed() {
71
73
  echo -e "\n ${P_FAIL}✖${P_NC} Installation failed at step ${CURRENT_STEP}. Cleaning up..."
72
74
  if $_INSTALL_CREATED_KARNEL_REPO && [[ -d "$KARNEL_REPO" ]]; then
73
75
  rm -rf "$KARNEL_REPO"
74
76
  fi
75
- [[ -L "$PREFIX/bin/karnel" ]] && rm -f "$PREFIX/bin/karnel"
77
+ if $_INSTALL_CREATED_KARNEL_SYMLINK && [[ -L "$PREFIX/bin/karnel" ]]; then
78
+ if [[ -n "$_INSTALL_PREVIOUS_KARNEL_SYMLINK" ]]; then
79
+ ln -sfn "$_INSTALL_PREVIOUS_KARNEL_SYMLINK" "$PREFIX/bin/karnel"
80
+ else
81
+ rm -f "$PREFIX/bin/karnel"
82
+ fi
83
+ fi
76
84
  echo -e " ${P_DIM}Run install.sh again to retry${P_NC}"
77
85
  exit 1
78
86
  }
@@ -195,7 +203,10 @@ clone_repo() {
195
203
  log_ok "Using local repository"
196
204
  elif [[ -d "$KARNEL_REPO/.git" ]]; then
197
205
  progress_bar 3 10
198
- git -C "$KARNEL_REPO" pull origin "$BRANCH" &>/dev/null
206
+ if ! git -C "$KARNEL_REPO" pull origin "$BRANCH" &>/dev/null; then
207
+ log_fail "Failed to update existing repository"
208
+ return 1
209
+ fi
199
210
  progress_bar 10 10
200
211
  echo
201
212
  log_ok "Repository updated"
@@ -235,10 +246,18 @@ create_symlink() {
235
246
 
236
247
  command -v termux-fix-shebang &>/dev/null && termux-fix-shebang "$KARNEL_REPO/karnel/bin/karnel" &>/dev/null
237
248
 
249
+ if [[ -e "$PREFIX/bin/karnel" && ! -L "$PREFIX/bin/karnel" ]]; then
250
+ log_fail "Refusing to replace existing non-symlink: $PREFIX/bin/karnel"
251
+ return 1
252
+ fi
253
+ if [[ -L "$PREFIX/bin/karnel" ]]; then
254
+ _INSTALL_PREVIOUS_KARNEL_SYMLINK="$(readlink "$PREFIX/bin/karnel")"
255
+ fi
238
256
  rm -f "$PREFIX/bin/karnel"
239
257
  ln -sf "$KARNEL_REPO/karnel/bin/karnel" "$PREFIX/bin/karnel"
240
258
 
241
259
  if [[ -L "$PREFIX/bin/karnel" ]]; then
260
+ _INSTALL_CREATED_KARNEL_SYMLINK=true
242
261
  log_ok "Symlink created: karnel → ${KARNEL_REPO}/karnel/bin/karnel"
243
262
  else
244
263
  log_fail "Failed to create symlink"
@@ -594,7 +594,7 @@ doctor_termux() {
594
594
  separator_section "AI Tools Installed"
595
595
  echo
596
596
 
597
- local -a ai_cmds=("opencode" "claude" "gemini" "codex" "qwen" "vibe" "mimo" "hermes" "kimi" "ollama" "freebuff" "pi" "agy" "mmx" "gentle-ai" "gga" "engram" "codegraph" "kilocode" "kiro" "crush" "odysseus" "openclaude" "openclaw" "command-code" "kimchi" "cline" "omni-route" "ctx7" "openspec" "copilot")
597
+ local -a ai_cmds=("opencode" "claude" "gemini" "codex" "qwen" "vibe" "mimo" "hermes" "kimi" "ollama" "freebuff" "pi" "agy" "mmx" "gentle-ai" "gga" "engram" "codegraph" "kilocode" "kiro" "crush" "odysseus" "openclaude" "openclaw" "command-code" "kimchi" "cline" "omni-route" "ctx7" "openspec" "copilot" "supercode" "puter")
598
598
  local ai_count=0
599
599
 
600
600
  for cmd in "${ai_cmds[@]}"; do
@@ -431,7 +431,7 @@ ia_routes() {
431
431
  local -a routes=()
432
432
 
433
433
  # Collect all available AI CLIs (em sincronia com AI_TOOLS_REGISTRY em tools/ai/all.sh)
434
- for cmd in qwen gemini claude vibe openclaude openclaw ollama codex opencode mimo engram codegraph pi agy mmx gentle-ai gga hermes kimi command-code freebuff kilocode kiro cline crush odysseus kimchi omni-route ctx7 openspec copilot amp cursor omp goose droid; do
434
+ for cmd in qwen gemini claude vibe openclaude openclaw ollama codex opencode mimo engram codegraph pi agy mmx gentle-ai gga hermes kimi command-code freebuff kilocode kiro cline crush odysseus kimchi omni-route ctx7 openspec copilot amp cursor omp goose droid supercode puter; do
435
435
  if command -v "$cmd" &>/dev/null; then
436
436
  local path
437
437
  path=$(command -v "$cmd")
@@ -509,4 +509,4 @@ ia_main() {
509
509
  return 1
510
510
  ;;
511
511
  esac
512
- }
512
+ }
@@ -167,6 +167,7 @@ _install_full_module() {
167
167
  *)
168
168
  log_warn "Unknown install target: $target"
169
169
  echo "Run 'karnel install' to see available targets"
170
+ return 1
170
171
  ;;
171
172
  esac
172
173
  }
@@ -833,6 +834,7 @@ _install_specific_tools() {
833
834
  *)
834
835
  log_warn "Unknown install target: $module"
835
836
  echo "Run 'karnel install' to see available targets"
836
- ;;
837
+ return 1
838
+ ;;
837
839
  esac
838
840
  }
@@ -204,6 +204,8 @@ _list_ai() {
204
204
  table_row "Goose CLI" "--goose" "goose" "$(_check_cmd "goose")"
205
205
  table_row "Factory Droid" "--droid" "droid" "$(_check_cmd "droid")"
206
206
  table_row "Copilot-Termux" "--copilot-termux" "copilot" "$(_check_cmd "copilot")"
207
+ table_row "Supercode CLI" "--supercode-cli" "supercode" "$(_check_cmd "supercode")"
208
+ table_row "Puter CLI" "--puter" "puter" "$(_check_cmd "puter")"
207
209
  table_end
208
210
 
209
211
  echo
@@ -555,6 +557,26 @@ _list_security() {
555
557
  table_row "John the Ripper" "--john" "john" "$(_check_cmd "john")"
556
558
  table_row "Aircrack-ng" "--aircrack-ng" "aircrack-ng" "$(_check_cmd "aircrack-ng")"
557
559
  table_row "Metasploit" "--metasploit" "msfconsole" "$(_check_cmd "msfconsole")"
560
+ table_row "Burp Suite" "--burpsuite" "burpsuite" "$(_check_cmd "burpsuite")"
561
+ table_row "OWASP ZAP" "--zap" "zap" "$(_check_cmd "zap")"
562
+ table_row "Enum4linux" "--enum4linux" "enum4linux" "$(_check_cmd "enum4linux")"
563
+ table_row "SMB client" "--smbclient" "smbclient" "$(_check_cmd "smbclient")"
564
+ table_row "FFUF" "--ffuf" "ffuf" "$(_check_cmd "ffuf")"
565
+ table_row "WhatWeb" "--whatweb" "whatweb" "$(_check_cmd "whatweb")"
566
+ table_row "WAFW00F" "--wafw00f" "wafw00f" "$(_check_cmd "wafw00f")"
567
+ table_row "DNSRecon" "--dnsrecon" "dnsrecon" "$(_check_cmd "dnsrecon")"
568
+ table_row "theHarvester" "--theharvester" "theHarvester" "$(_check_cmd "theHarvester")"
569
+ table_row "Subfinder" "--subfinder" "subfinder" "$(_check_cmd "subfinder")"
570
+ table_row "Amass" "--amass" "amass" "$(_check_cmd "amass")"
571
+ table_row "Masscan" "--masscan" "masscan" "$(_check_cmd "masscan")"
572
+ table_row "Netcat" "--netcat" "nc" "$(_check_cmd "nc")"
573
+ table_row "Tcpdump" "--tcpdump" "tcpdump" "$(_check_cmd "tcpdump")"
574
+ table_row "Whois" "--whois" "whois" "$(_check_cmd "whois")"
575
+ table_row "Hashcat" "--hashcat" "hashcat" "$(_check_cmd "hashcat")"
576
+ table_row "Binwalk" "--binwalk" "binwalk" "$(_check_cmd "binwalk")"
577
+ table_row "Foremost" "--foremost" "foremost" "$(_check_cmd "foremost")"
578
+ table_row "Steghide" "--steghide" "steghide" "$(_check_cmd "steghide")"
579
+ table_row "ExifTool" "--exiftool" "exiftool" "$(_check_cmd "exiftool")"
558
580
  table_end
559
581
  echo
560
582
  log_info "Install all: ${D_CYAN}karnel install security${NC}"
@@ -571,5 +593,3 @@ _list_voice() {
571
593
  list_item "Usage: ${D_CYAN}karnel install voice${NC}"
572
594
  echo
573
595
  }
574
-
575
-
@@ -283,6 +283,14 @@ _reinstall_specific_tools() {
283
283
  reinstall_openspec
284
284
  case $? in 0) ((reinstalled_count++));; 1) ((failed_count++));; esac
285
285
  ;;
286
+ supercode-cli)
287
+ reinstall_supercode_cli
288
+ case $? in 0) ((reinstalled_count++));; 1) ((failed_count++));; esac
289
+ ;;
290
+ puter)
291
+ reinstall_puter
292
+ case $? in 0) ((reinstalled_count++));; 1) ((failed_count++));; esac
293
+ ;;
286
294
  copilot-termux)
287
295
  reinstall_copilot_termux
288
296
  case $? in 0) ((reinstalled_count++));; 1) ((failed_count++));; esac
@@ -164,6 +164,7 @@ _uninstall_full_module() {
164
164
  *)
165
165
  log_warn "Unknown uninstall target: $target"
166
166
  echo "Run 'karnel uninstall' to see available targets"
167
+ return 1
167
168
  ;;
168
169
  esac
169
170
  }
@@ -168,6 +168,7 @@ _update_full_module() {
168
168
  *)
169
169
  log_warn "Unknown update target: $target"
170
170
  echo "Run 'karnel update' to see available targets"
171
+ return 1
171
172
  ;;
172
173
  esac
173
174
  }
@@ -190,23 +191,49 @@ update_karnel() {
190
191
  separator
191
192
  echo
192
193
 
193
- # Tries every method in order until one succeeds
194
+ # The official installer keeps all installation layouts consistent.
195
+ _update_try_curl && { _update_cleanup; return 0; }
194
196
  _update_try_git && { _update_cleanup; return 0; }
195
197
  _update_try_npm && { _update_cleanup; return 0; }
196
198
  _update_try_npm_install && { _update_cleanup; return 0; }
197
199
  _update_try_pnpm && { _update_cleanup; return 0; }
198
- _update_try_curl && { _update_cleanup; return 0; }
199
200
 
200
201
  log_error "All update methods failed"
201
202
  _update_show_manual
202
203
 
203
204
  echo
205
+ return 1
204
206
  }
205
207
 
206
208
  _update_cleanup() {
207
209
  rm -f "$KARNEL_CACHE/new_version" "$KARNEL_CACHE/last_version_check"
208
210
  }
209
211
 
212
+ _update_try_curl() {
213
+ command -v curl &>/dev/null || return 1
214
+
215
+ local installer
216
+ installer=$(mktemp "${TMPDIR:-/tmp}/karnel-install.XXXXXX") || return 1
217
+
218
+ log_info "Trying the official curl installer..."
219
+ if ! curl --fail --silent --show-error --location \
220
+ "https://raw.githubusercontent.com/israelmarques1024-dotcom/karnel-termux/main/install.sh" \
221
+ -o "$installer"; then
222
+ rm -f "$installer"
223
+ return 1
224
+ fi
225
+
226
+ if bash "$installer"; then
227
+ rm -f "$installer"
228
+ log_success "Karnel-Termux updated via curl"
229
+ return 0
230
+ fi
231
+
232
+ rm -f "$installer"
233
+ log_error "Curl update failed"
234
+ return 1
235
+ }
236
+
210
237
  _update_try_git() {
211
238
  [[ -d "$KARNEL_PATH/../.git" ]] || return 1
212
239
  loading "Updating via git" _update_karnel_repo
@@ -261,25 +288,12 @@ _update_try_pnpm() {
261
288
  return 1
262
289
  }
263
290
 
264
- _update_try_curl() {
265
- command -v curl &>/dev/null || return 1
266
- log_info "Trying curl reinstall..."
267
- local tmp_install
268
- tmp_install=$(mktemp "${TMPDIR:-/tmp}/karnel.XXXXXX")
269
- if curl -fsSL "https://raw.githubusercontent.com/israelmarques1024-dotcom/karnel-termux/main/install.sh" -o "$tmp_install" 2>/dev/null; then
270
- head -5 "$tmp_install" | grep -qi "karnel" || { rm -f "$tmp_install"; log_error "Downloaded file is not a valid Karnel installer"; return 1; }
271
- bash "$tmp_install" 2>/dev/null && { rm -f "$tmp_install"; log_success "Updated via curl"; return 0; }
272
- fi
273
- rm -f "$tmp_install"
274
- return 1
275
- }
276
-
277
291
  _update_show_manual() {
278
292
  log_info "Update manually with one of these:"
279
293
  echo
294
+ echo ' bash -c "$(curl -fsSL https://raw.githubusercontent.com/israelmarques1024-dotcom/karnel-termux/main/install.sh)"'
280
295
  echo " npm install -g karnel-termux@latest"
281
296
  echo " pnpm add -g karnel-termux@latest"
282
- echo " bash -c \"\$(curl -fsSL https://raw.githubusercontent.com/israelmarques1024-dotcom/karnel-termux/main/install.sh)\""
283
297
  echo
284
298
  }
285
299
 
@@ -10,7 +10,10 @@ upgrade_main() {
10
10
  echo
11
11
 
12
12
  import "@/cli/commands/update"
13
- update_karnel
13
+ if ! update_karnel; then
14
+ log_error "Karnel upgrade failed"
15
+ return 1
16
+ fi
14
17
 
15
18
  source "$KARNEL_PATH/utils/env.sh" 2>/dev/null
16
19
  log_success "Karnel upgraded to v$KARNEL_VERSION"
@@ -110,7 +110,7 @@ karnel_help() {
110
110
  echo
111
111
  log_info "Use with: karnel install|update|reinstall|uninstall <target> [--tool...]"
112
112
  echo
113
- printf " ${D_GREEN}%-10s${NC} %s\n" "ai" "37 AI tools (OpenCode, Claude, Ollama, Copilot-Termux, Goose, etc.)"
113
+ printf " ${D_GREEN}%-10s${NC} %s\n" "ai" "38 AI tools (OpenCode, Claude, Ollama, Copilot-Termux, Goose, etc.)"
114
114
  printf " ${D_GREEN}%-10s${NC} %s\n" "auto" "Automation (n8n)"
115
115
  printf " ${D_GREEN}%-10s${NC} %s\n" "db" "PostgreSQL, MariaDB, SQLite, MongoDB, Redis"
116
116
  printf " ${D_GREEN}%-10s${NC} %s\n" "deploy" "Vercel, Railway, Netlify, Supabase CLIs"
@@ -791,6 +791,8 @@ _tui_install_checklist() {
791
791
  "oh-my-pi" "Oh-My-Pi" OFF
792
792
  "goose" "Goose CLI" OFF
793
793
  "droid" "Factory Droid" OFF
794
+ "supercode-cli" "Supercode CLI" OFF
795
+ "puter" "Puter CLI" OFF
794
796
  )
795
797
  ;;
796
798
  dev)
@@ -89,6 +89,7 @@ uninstall_ai() {
89
89
  else
90
90
  log_warn "AI tools uninstalled with $rc failure(s)"
91
91
  fi
92
+ return "$rc"
92
93
  }
93
94
 
94
95
  _uninstall_ai_tools_wrapper() {
@@ -111,6 +112,7 @@ update_ai() {
111
112
  else
112
113
  log_warn "AI tools updated with $rc failure(s)"
113
114
  fi
115
+ return "$rc"
114
116
  }
115
117
 
116
118
  _update_ai_tools_wrapper() {
@@ -147,4 +149,5 @@ reinstall_ai() {
147
149
  log_warn "AI tools reinstalled with $rc failure(s)"
148
150
  fi
149
151
  echo
152
+ return "$rc"
150
153
  }
@@ -26,6 +26,7 @@ install_auto() {
26
26
  echo
27
27
  list_item "n8n"
28
28
  echo
29
+ return "$rc"
29
30
  }
30
31
 
31
32
  _install_auto_wrapper() {
@@ -53,6 +54,7 @@ uninstall_auto() {
53
54
  else
54
55
  log_warn "$rc automation tool(s) failed to uninstall"
55
56
  fi
57
+ return "$rc"
56
58
  }
57
59
 
58
60
  _uninstall_auto_wrapper() {
@@ -76,6 +78,7 @@ update_auto() {
76
78
  else
77
79
  log_warn "$rc automation tool(s) failed to update"
78
80
  fi
81
+ return "$rc"
79
82
  }
80
83
 
81
84
  _update_auto_wrapper() {
@@ -103,12 +106,13 @@ reinstall_auto() {
103
106
  fi
104
107
  separator
105
108
  echo
106
- list_item "n8n"
107
- echo
109
+ list_item "n8n"
110
+ echo
111
+ return "$rc"
108
112
  }
109
113
 
110
114
  _reinstall_auto_wrapper() {
111
115
  import "@/tools/auto/all"
112
116
  reinstall_all_auto_tools
113
117
  return $?
114
- }
118
+ }
@@ -35,6 +35,7 @@ install_db() {
35
35
  list_item "MongoDB"
36
36
  list_item "Redis"
37
37
  echo
38
+ return "$install_rc"
38
39
  }
39
40
 
40
41
  _install_db_tools_wrapper() {
@@ -65,6 +66,7 @@ uninstall_db() {
65
66
  else
66
67
  log_warn "$rc database(s) failed to uninstall"
67
68
  fi
69
+ return "$rc"
68
70
  }
69
71
 
70
72
  _uninstall_db_tools_wrapper() {
@@ -91,6 +93,7 @@ update_db() {
91
93
  else
92
94
  log_warn "$rc database(s) failed to update"
93
95
  fi
96
+ return "$rc"
94
97
  }
95
98
 
96
99
  _update_db_tools_wrapper() {
@@ -123,12 +126,13 @@ reinstall_db() {
123
126
  list_item "MariaDB (MySQL)"
124
127
  list_item "SQLite"
125
128
  list_item "MongoDB"
126
- list_item "Redis"
127
- echo
129
+ list_item "Redis"
130
+ echo
131
+ return "$rc"
128
132
  }
129
133
 
130
134
  _reinstall_db_tools_wrapper() {
131
135
  import "@/tools/db/all"
132
136
  reinstall_all_db_tools
133
137
  return $?
134
- }
138
+ }
@@ -20,6 +20,7 @@ install_deploy() {
20
20
  else
21
21
  log_warn "$rc deploy tool(s) failed to install"
22
22
  fi
23
+ return "$rc"
23
24
  }
24
25
 
25
26
  _install_deploy_wrapper() {
@@ -45,6 +46,7 @@ uninstall_deploy() {
45
46
  else
46
47
  log_warn "$rc deploy tool(s) failed to uninstall"
47
48
  fi
49
+ return "$rc"
48
50
  }
49
51
 
50
52
  update_deploy() {
@@ -60,6 +62,7 @@ update_deploy() {
60
62
  else
61
63
  log_warn "$rc deploy tool(s) failed to update"
62
64
  fi
65
+ return "$rc"
63
66
  }
64
67
 
65
68
  reinstall_deploy() {
@@ -75,4 +78,5 @@ reinstall_deploy() {
75
78
  else
76
79
  log_warn "$rc deploy tool(s) failed to reinstall"
77
80
  fi
81
+ return "$rc"
78
82
  }
@@ -26,6 +26,7 @@ install_dev() {
26
26
  echo
27
27
  _show_dev_summary
28
28
  echo
29
+ return "$rc"
29
30
  }
30
31
 
31
32
  _install_dev_wrapper() {
@@ -53,6 +54,7 @@ uninstall_dev() {
53
54
  else
54
55
  log_warn "$rc tool(s) failed to uninstall"
55
56
  fi
57
+ return "$rc"
56
58
  }
57
59
 
58
60
  _uninstall_dev_wrapper() {
@@ -76,6 +78,7 @@ update_dev() {
76
78
  else
77
79
  log_warn "$rc tool(s) failed to update"
78
80
  fi
81
+ return "$rc"
79
82
  }
80
83
 
81
84
  _update_dev_wrapper() {
@@ -101,8 +104,9 @@ reinstall_dev() {
101
104
  fi
102
105
  separator
103
106
  echo
104
- _show_dev_summary
105
- echo
107
+ _show_dev_summary
108
+ echo
109
+ return "$rc"
106
110
  }
107
111
 
108
112
  _reinstall_dev_wrapper() {
@@ -28,6 +28,7 @@ install_editor() {
28
28
  list_item "Access at http://localhost:8080"
29
29
  list_item "Set password: ${D_CYAN}code-server --auth password${NC}"
30
30
  echo
31
+ return "$rc"
31
32
  }
32
33
 
33
34
  uninstall_editor() {
@@ -49,6 +50,7 @@ uninstall_editor() {
49
50
  else
50
51
  log_warn "$rc editor component(s) failed to uninstall"
51
52
  fi
53
+ return "$rc"
52
54
  }
53
55
 
54
56
  update_editor() {
@@ -66,6 +68,7 @@ update_editor() {
66
68
  else
67
69
  log_warn "$rc editor component(s) failed to update"
68
70
  fi
71
+ return "$rc"
69
72
  }
70
73
 
71
74
  reinstall_editor() {
@@ -88,6 +91,7 @@ reinstall_editor() {
88
91
  list_item "code-server (VS Code in browser)"
89
92
  list_item "Access at http://localhost:8080"
90
93
  echo
94
+ return "$rc"
91
95
  }
92
96
 
93
97
  _install_editor_wrapper() {
@@ -25,6 +25,7 @@ install_games() {
25
25
  fi
26
26
  separator
27
27
  echo
28
+ return "$rc"
28
29
  }
29
30
 
30
31
  uninstall_games() {
@@ -47,6 +48,7 @@ uninstall_games() {
47
48
  else
48
49
  log_warn "$rc game(s) failed to uninstall"
49
50
  fi
51
+ return "$rc"
50
52
  }
51
53
 
52
54
  update_games() {
@@ -65,6 +67,7 @@ update_games() {
65
67
  else
66
68
  log_warn "$rc game(s) failed to update"
67
69
  fi
70
+ return "$rc"
68
71
  }
69
72
 
70
73
  reinstall_games() {
@@ -85,4 +88,5 @@ reinstall_games() {
85
88
  fi
86
89
  separator
87
90
  echo
91
+ return "$rc"
88
92
  }
@@ -32,6 +32,7 @@ install_lang() {
32
32
  list_item "C/C++ (clang)"
33
33
  list_item "Go (golang)"
34
34
  echo
35
+ return "$rc"
35
36
  }
36
37
 
37
38
  _install_lang_wrapper() {
@@ -59,6 +60,7 @@ uninstall_lang() {
59
60
  else
60
61
  log_warn "$rc language package(s) failed to uninstall"
61
62
  fi
63
+ return "$rc"
62
64
  }
63
65
 
64
66
  _uninstall_lang_wrapper() {
@@ -82,6 +84,7 @@ update_lang() {
82
84
  else
83
85
  log_warn "$rc language package(s) failed to update"
84
86
  fi
87
+ return "$rc"
85
88
  }
86
89
 
87
90
  _update_lang_wrapper() {
@@ -113,12 +116,13 @@ reinstall_lang() {
113
116
  list_item "PHP"
114
117
  list_item "Rust"
115
118
  list_item "C/C++ (clang)"
116
- list_item "Go (golang)"
117
- echo
119
+ list_item "Go (golang)"
120
+ echo
121
+ return "$rc"
118
122
  }
119
123
 
120
124
  _reinstall_lang_wrapper() {
121
125
  import "@/tools/lang/all"
122
126
  reinstall_all_lang_packages
123
127
  return $?
124
- }
128
+ }
@@ -25,6 +25,7 @@ install_network() {
25
25
  fi
26
26
  separator
27
27
  echo
28
+ return "$rc"
28
29
  }
29
30
 
30
31
  uninstall_network() {
@@ -47,6 +48,7 @@ uninstall_network() {
47
48
  else
48
49
  log_warn "$rc network tool(s) failed to uninstall"
49
50
  fi
51
+ return "$rc"
50
52
  }
51
53
 
52
54
  update_network() {
@@ -65,6 +67,7 @@ update_network() {
65
67
  else
66
68
  log_warn "$rc network tool(s) failed to update"
67
69
  fi
70
+ return "$rc"
68
71
  }
69
72
 
70
73
  reinstall_network() {
@@ -85,4 +88,5 @@ reinstall_network() {
85
88
  fi
86
89
  separator
87
90
  echo
91
+ return "$rc"
88
92
  }
@@ -38,6 +38,7 @@ install_npm() {
38
38
  fi
39
39
  separator
40
40
  echo
41
+ return "$install_rc"
41
42
  }
42
43
 
43
44
  _install_npm_wrapper() {
@@ -70,6 +71,7 @@ uninstall_npm() {
70
71
  fi
71
72
  separator
72
73
  echo
74
+ return "$rc"
73
75
  }
74
76
 
75
77
  _uninstall_npm_wrapper() {
@@ -98,6 +100,7 @@ update_npm() {
98
100
  fi
99
101
  separator
100
102
  echo
103
+ return "$rc"
101
104
  }
102
105
 
103
106
  _update_npm_wrapper() {
@@ -134,13 +137,14 @@ reinstall_npm() {
134
137
  log_success "Node.js modules reinstallation completed"
135
138
  else
136
139
  log_warn "$rc Node.js module(s) failed to reinstall"
137
- fi
138
- separator
139
- echo
140
+ fi
141
+ separator
142
+ echo
143
+ return "$rc"
140
144
  }
141
145
 
142
146
  _reinstall_npm_wrapper() {
143
147
  import "@/tools/npm/all"
144
148
  reinstall_all_npm_packages
145
149
  return $?
146
- }
150
+ }
@@ -172,6 +172,7 @@ install_shell() {
172
172
  echo
173
173
  log_warn "Please restart Termux or run: exec zsh"
174
174
  echo
175
+ return "$rc"
175
176
  }
176
177
 
177
178
  _install_shell_plugins_wrapper() {
@@ -258,6 +259,7 @@ uninstall_shell() {
258
259
  fi
259
260
  separator
260
261
  echo
262
+ return "$rc"
261
263
  }
262
264
 
263
265
  _uninstall_shell_plugins_wrapper() {
@@ -289,6 +291,7 @@ update_shell() {
289
291
  log_success "ZSH update completed"
290
292
  separator
291
293
  echo
294
+ return "$rc"
292
295
  }
293
296
 
294
297
  _update_shell_plugins_wrapper() {
@@ -327,8 +330,9 @@ reinstall_shell() {
327
330
  fi
328
331
  separator
329
332
  echo
330
- log_warn "Please restart Termux or run: exec zsh"
331
- echo
333
+ log_warn "Please restart Termux or run: exec zsh"
334
+ echo
335
+ return "$rc"
332
336
  }
333
337
 
334
338
  _reinstall_shell_plugins_wrapper() {
@@ -39,8 +39,9 @@ setup_ui() {
39
39
  list_item "Font: Meslo Nerd Font"
40
40
  list_item "Banner: Karnel startup banner"
41
41
  echo
42
- log_warn "Please restart Termux to apply all changes"
43
- echo
42
+ log_warn "Please restart Termux to apply all changes"
43
+ echo
44
+ return "$rc"
44
45
  }
45
46
 
46
47
  _setup_ui_wrapper() {
@@ -74,6 +75,7 @@ uninstall_ui() {
74
75
  echo
75
76
  log_warn "Please restart Termux to apply changes"
76
77
  echo
78
+ return "$rc"
77
79
  }
78
80
 
79
81
  _uninstall_ui_wrapper() {
@@ -101,6 +103,7 @@ update_ui() {
101
103
  fi
102
104
  separator
103
105
  echo
106
+ return "$rc"
104
107
  }
105
108
 
106
109
  _update_ui_wrapper() {
@@ -132,12 +135,13 @@ reinstall_ui() {
132
135
  list_item "Font: Meslo Nerd Font"
133
136
  list_item "Banner: Karnel startup banner"
134
137
  echo
135
- log_warn "Please restart Termux to apply all changes"
136
- echo
138
+ log_warn "Please restart Termux to apply all changes"
139
+ echo
140
+ return "$rc"
137
141
  }
138
142
 
139
143
  _reinstall_ui_wrapper() {
140
144
  import "@/tools/ui/all"
141
145
  reinstall_all_ui_components
142
146
  return $?
143
- }
147
+ }
@@ -25,6 +25,7 @@ install_utils() {
25
25
  fi
26
26
  separator
27
27
  echo
28
+ return "$rc"
28
29
  }
29
30
 
30
31
  uninstall_utils() {
@@ -47,6 +48,7 @@ uninstall_utils() {
47
48
  else
48
49
  log_warn "$rc utility tool(s) failed to uninstall"
49
50
  fi
51
+ return "$rc"
50
52
  }
51
53
 
52
54
  update_utils() {
@@ -65,6 +67,7 @@ update_utils() {
65
67
  else
66
68
  log_warn "$rc utility tool(s) failed to update"
67
69
  fi
70
+ return "$rc"
68
71
  }
69
72
 
70
73
  reinstall_utils() {
@@ -85,4 +88,5 @@ reinstall_utils() {
85
88
  fi
86
89
  separator
87
90
  echo
91
+ return "$rc"
88
92
  }
@@ -37,6 +37,7 @@ install_voice() {
37
37
  list_item "Voice CLI: ${D_CYAN}karnel voice [agent]${NC}"
38
38
  list_item "Install Termux:API app from: ${D_CYAN}https://karneltermux.vercel.app/termux/api${NC}"
39
39
  echo
40
+ return "$rc"
40
41
  }
41
42
 
42
43
  _install_voice_deps() {
@@ -65,6 +66,7 @@ uninstall_voice() {
65
66
  else
66
67
  log_warn "$rc voice component(s) failed to uninstall"
67
68
  fi
69
+ return "$rc"
68
70
  }
69
71
 
70
72
  _uninstall_voice_wrapper() {
@@ -87,6 +89,7 @@ update_voice() {
87
89
  else
88
90
  log_warn "$rc voice component(s) failed to update"
89
91
  fi
92
+ return "$rc"
90
93
  }
91
94
 
92
95
  _update_voice_wrapper() {
@@ -115,6 +118,7 @@ reinstall_voice() {
115
118
  list_item "Termux:API (speech-to-text, clipboard)"
116
119
  list_item "Voice CLI: ${D_CYAN}karnel voice [agent]${NC}"
117
120
  echo
121
+ return "$rc"
118
122
  }
119
123
 
120
124
  _reinstall_voice_wrapper() {
@@ -58,6 +58,8 @@ AI_TOOLS_REGISTRY=(
58
58
  "omni-route:omniRoute:omni-route"
59
59
  "ctx7:Context7 Documentation Provider:ctx7"
60
60
  "openspec:OpenSpec SDD Framework:openspec"
61
+ "supercode-cli:Supercode CLI:supercode"
62
+ "puter:Puter CLI:puter"
61
63
  "copilot-termux:Copilot-Termux:copilot"
62
64
  "qoder:Qoder:qodercli"
63
65
  "ampcode:AMP Code CLI:amp"
@@ -0,0 +1,28 @@
1
+ # Puter CLI
2
+
3
+ CLI for managing Puter sites and workers from the terminal.
4
+
5
+ **Package:** `@heyputer/cli`
6
+ **Command:** `puter`
7
+ **Requires:** Node.js 18+
8
+
9
+ ## Install
10
+
11
+ ```bash
12
+ karnel install ai --puter
13
+ ```
14
+
15
+ Equivalent npm command:
16
+
17
+ ```bash
18
+ npm install -g @heyputer/cli
19
+ ```
20
+
21
+ ## Usage
22
+
23
+ ```bash
24
+ puter login
25
+ puter whoami
26
+ puter site deploy [directory] [subdomain]
27
+ puter worker deploy [file] [name]
28
+ ```
@@ -0,0 +1,71 @@
1
+ #!/usr/bin/env bash
2
+
3
+ import "@/utils/log"
4
+ import "@/utils/version"
5
+
6
+ PUTER_PACKAGE="@heyputer/cli"
7
+
8
+ install_puter() {
9
+ if command -v puter &>/dev/null; then
10
+ log_info "Puter CLI is already installed"
11
+ return 2
12
+ fi
13
+
14
+ log_info "Installing Puter CLI..."
15
+ local output rc
16
+ output="$(npm install -g "$PUTER_PACKAGE" 2>&1)"
17
+ rc=$?
18
+ printf '%s\n' "$output" | tail -3
19
+ if ((rc != 0)); then
20
+ log_error "Failed to install Puter CLI"
21
+ return 1
22
+ fi
23
+ if ! command -v puter &>/dev/null; then
24
+ log_error "Puter CLI binary was not found after npm installation"
25
+ return 1
26
+ fi
27
+ command -v termux-fix-shebang &>/dev/null && termux-fix-shebang "$(command -v puter)" &>/dev/null || true
28
+ log_success "Puter CLI installed"
29
+ }
30
+
31
+ uninstall_puter() {
32
+ if ! command -v puter &>/dev/null; then
33
+ log_info "Puter CLI is not installed"
34
+ return 2
35
+ fi
36
+
37
+ log_info "Uninstalling Puter CLI..."
38
+ local output rc
39
+ output="$(npm uninstall -g "$PUTER_PACKAGE" 2>&1)"
40
+ rc=$?
41
+ printf '%s\n' "$output" | tail -3
42
+ if ((rc != 0)); then
43
+ log_error "Failed to uninstall Puter CLI"
44
+ return 1
45
+ fi
46
+ log_success "Puter CLI uninstalled"
47
+ }
48
+
49
+ update_puter() {
50
+ _check_update_needed "Puter CLI" \
51
+ "$(_get_installed_npm_version "$PUTER_PACKAGE")" \
52
+ "$(_get_remote_npm_version "$PUTER_PACKAGE")" \
53
+ _do_update_puter
54
+ }
55
+
56
+ _do_update_puter() {
57
+ local output rc
58
+ output="$(npm update -g "$PUTER_PACKAGE" 2>&1)"
59
+ rc=$?
60
+ printf '%s\n' "$output" | tail -3
61
+ if ((rc != 0)); then
62
+ log_error "Failed to update Puter CLI"
63
+ return 1
64
+ fi
65
+ command -v termux-fix-shebang &>/dev/null && termux-fix-shebang "$(command -v puter)" &>/dev/null || true
66
+ }
67
+
68
+ reinstall_puter() {
69
+ uninstall_puter || [[ $? -eq 2 ]] || return 1
70
+ install_puter
71
+ }
@@ -0,0 +1,34 @@
1
+ # Supercode CLI
2
+
3
+ AI-powered coding assistant that runs in your terminal
4
+
5
+ **Package:** supercode-cli
6
+ **Author:** israel marques
7
+ **Repository:** https://github.com/israelmarques1024-dotcom/karnel-termux
8
+ **Type:** AI coding CLI (npm package)
9
+
10
+ ## Description
11
+
12
+ Supercode CLI is an AI coding agent powered by multiple LLM providers (Google Gemini, OpenAI, Anthropic Claude, etc.). It provides intelligent code generation, refactoring, and terminal-based AI assistance.
13
+
14
+ ## Dependencies
15
+
16
+ - Node.js (installed automatically as dependency)
17
+
18
+ ## Install
19
+
20
+ ```bash
21
+ karnel install ai --supercode-cli
22
+ ```
23
+
24
+ ## Uninstall
25
+
26
+ ```bash
27
+ karnel uninstall ai --supercode-cli
28
+ ```
29
+
30
+ ## Update
31
+
32
+ ```bash
33
+ karnel update ai --supercode-cli
34
+ ```
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env bash
2
+
3
+ import "@/utils/log"
4
+ import "@/utils/version"
5
+
6
+ install_supercode_cli() {
7
+ if command -v supercode &>/dev/null; then
8
+ log_info "Supercode CLI is already installed"
9
+ return 2
10
+ fi
11
+ log_info "Installing Supercode CLI..."
12
+ local output rc
13
+ output="$(npm install -g supercode-cli 2>&1)"
14
+ rc=$?
15
+ printf '%s\n' "$output" | tail -3
16
+ if ((rc != 0)); then
17
+ log_error "Failed to install Supercode CLI"
18
+ return 1
19
+ fi
20
+ _fix_supercode_shebang || return 1
21
+ log_success "Supercode CLI installed"
22
+ return 0
23
+ }
24
+
25
+ _fix_supercode_shebang() {
26
+ local binary
27
+ binary="$(command -v supercode 2>/dev/null)"
28
+ if [[ -z "$binary" || ! -f "$binary" ]]; then
29
+ log_error "Supercode CLI binary was not found after npm operation"
30
+ return 1
31
+ fi
32
+ if command -v termux-fix-shebang &>/dev/null; then
33
+ termux-fix-shebang "$binary" &>/dev/null || return 1
34
+ else
35
+ sed -i '1s|#!/usr/bin/env|#!/data/data/com.termux/files/usr/bin/env|' "$binary" || return 1
36
+ fi
37
+ }
38
+
39
+ uninstall_supercode_cli() {
40
+ if ! command -v supercode &>/dev/null; then
41
+ log_info "Supercode CLI is not installed"
42
+ return 2
43
+ fi
44
+ log_info "Uninstalling Supercode CLI..."
45
+ local output rc
46
+ output="$(npm uninstall -g supercode-cli 2>&1)"
47
+ rc=$?
48
+ printf '%s\n' "$output" | tail -3
49
+ if ((rc != 0)); then
50
+ log_error "Failed to uninstall Supercode CLI"
51
+ return 1
52
+ fi
53
+ log_success "Supercode CLI uninstalled"
54
+ return 0
55
+ }
56
+
57
+ update_supercode_cli() {
58
+ _check_update_needed "Supercode CLI" \
59
+ "$(_get_installed_npm_version supercode-cli)" \
60
+ "$(_get_remote_npm_version supercode-cli)" \
61
+ _do_update_supercode_cli
62
+ }
63
+
64
+ _do_update_supercode_cli() {
65
+ local output rc
66
+ output="$(npm update -g supercode-cli 2>&1)"
67
+ rc=$?
68
+ printf '%s\n' "$output" | tail -3
69
+ if ((rc != 0)); then
70
+ log_error "Failed to update Supercode CLI"
71
+ return 1
72
+ fi
73
+ _fix_supercode_shebang || return 1
74
+ return 0
75
+ }
76
+
77
+ reinstall_supercode_cli() {
78
+ uninstall_supercode_cli
79
+ install_supercode_cli
80
+ }
@@ -40,27 +40,41 @@ done
40
40
  _batch_security() {
41
41
  local action="$1"
42
42
  local action_past="$2"
43
- if [[ "$3" != "_unused" ]]; then
44
- local -n count_var="$3"
45
- else
46
- local count_var
47
- fi
43
+ local count_var="$3"
44
+ local skipped_var="${4:-_unused}"
45
+ local failed_var="${5:-_unused}"
46
+ local count=0
47
+ local skipped=0
48
+ local failed=0
49
+ local func_name
48
50
  for tool in "${SECURITY_TOOLS[@]}"; do
49
51
  func_name="${action}_${tool//-/_}"
50
52
  loading "${action_past^}ing ${tool}" "$func_name"
51
53
  case $? in
52
- 0) ((count_var++)) 2>/dev/null || true;;
53
- 2) ((skipped_count++));;
54
- *) ((failed_count++));;
54
+ 0) ((count += 1));;
55
+ 2) ((skipped += 1));;
56
+ *) ((failed += 1));;
55
57
  esac
56
58
  done
59
+ if [[ "$count_var" != "_unused" ]]; then
60
+ printf -v "$count_var" '%s' "$count"
61
+ fi
62
+ if [[ "$skipped_var" != "_unused" ]]; then
63
+ printf -v "$skipped_var" '%s' "$skipped"
64
+ fi
65
+ if [[ "$failed_var" != "_unused" ]]; then
66
+ printf -v "$failed_var" '%s' "$failed"
67
+ fi
68
+ (( failed == 0 ))
57
69
  }
58
70
 
59
71
  install_all_security() {
60
72
  local installed_count=0 skipped_count=0 failed_count=0
61
- _batch_security "install" "install" installed_count
73
+ local rc=0
74
+ _batch_security "install" "install" installed_count skipped_count failed_count || rc=$?
62
75
  echo
63
76
  log_success "Security: $installed_count installed, $skipped_count skipped, $failed_count failed"
77
+ return "$rc"
64
78
  }
65
79
 
66
80
  uninstall_all_security() { _batch_security "uninstall" "uninstall" _unused; }
@@ -52,7 +52,7 @@ github_download_release() {
52
52
  local url="https://github.com/$repo/releases/download/$version/$asset"
53
53
  local tmpfile="$outdir/$(basename "$asset")"
54
54
  mkdir -p "$outdir"
55
- if ! curl -fsSL "$url" -o "$tmpfile" &>>"$LOG_FILE"; then
55
+ if ! curl --fail --silent --show-error --location "$url" -o "$tmpfile" &>>"$LOG_FILE"; then
56
56
  log_error "Failed to download $asset from $repo"
57
57
  return 1
58
58
  fi
@@ -61,6 +61,18 @@ github_download_release() {
61
61
 
62
62
  extract_tarball() {
63
63
  local tarball="$1" outdir="$2"
64
+ local member
65
+ while IFS= read -r member; do
66
+ case "$member" in
67
+ /*|../*|*/../*|..)
68
+ log_error "Refusing unsafe archive member: $member"
69
+ return 1
70
+ ;;
71
+ esac
72
+ done < <(tar -tzf "$tarball" 2>>"$LOG_FILE") || {
73
+ log_error "Failed to inspect $tarball"
74
+ return 1
75
+ }
64
76
  if ! tar -zxf "$tarball" -C "$outdir" &>>"$LOG_FILE"; then
65
77
  log_error "Failed to extract $tarball"
66
78
  return 1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "karnel-termux",
3
- "version": "4.13.2",
3
+ "version": "4.13.3",
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"