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 +54 -6
- package/install.sh +21 -2
- package/karnel/cli/commands/doctor.sh +1 -1
- package/karnel/cli/commands/ia.sh +2 -2
- package/karnel/cli/commands/install.sh +3 -1
- package/karnel/cli/commands/list.sh +22 -2
- package/karnel/cli/commands/reinstall.sh +8 -0
- package/karnel/cli/commands/uninstall.sh +1 -0
- package/karnel/cli/commands/update.sh +30 -16
- package/karnel/cli/commands/upgrade.sh +4 -1
- package/karnel/cli/karnel.sh +3 -1
- package/karnel/modules/ai.sh +3 -0
- package/karnel/modules/auto.sh +7 -3
- package/karnel/modules/db.sh +7 -3
- package/karnel/modules/deploy.sh +4 -0
- package/karnel/modules/dev.sh +6 -2
- package/karnel/modules/editor.sh +4 -0
- package/karnel/modules/games.sh +4 -0
- package/karnel/modules/lang.sh +7 -3
- package/karnel/modules/network.sh +4 -0
- package/karnel/modules/npm.sh +8 -4
- package/karnel/modules/shell.sh +6 -2
- package/karnel/modules/ui.sh +9 -5
- package/karnel/modules/utils.sh +4 -0
- package/karnel/modules/voice.sh +4 -0
- package/karnel/tools/ai/all.sh +2 -0
- package/karnel/tools/ai/puter/README.md +28 -0
- package/karnel/tools/ai/puter/install.sh +71 -0
- package/karnel/tools/ai/supercode-cli/README.md +34 -0
- package/karnel/tools/ai/supercode-cli/install.sh +80 -0
- package/karnel/tools/security/all.sh +23 -9
- package/karnel/utils/install.sh +13 -1
- package/package.json +1 -1
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.
|
|
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
|
-
- **
|
|
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` |
|
|
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
|
|
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/ #
|
|
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/ #
|
|
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" ]]
|
|
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
|
|
@@ -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
|
-
#
|
|
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"
|
package/karnel/cli/karnel.sh
CHANGED
|
@@ -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
|
-
|
|
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)
|
package/karnel/modules/ai.sh
CHANGED
|
@@ -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
|
}
|
package/karnel/modules/auto.sh
CHANGED
|
@@ -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
|
-
|
|
107
|
-
|
|
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
|
+
}
|
package/karnel/modules/db.sh
CHANGED
|
@@ -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
|
-
|
|
127
|
-
|
|
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
|
+
}
|
package/karnel/modules/deploy.sh
CHANGED
|
@@ -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
|
}
|
package/karnel/modules/dev.sh
CHANGED
|
@@ -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
|
-
|
|
105
|
-
|
|
107
|
+
_show_dev_summary
|
|
108
|
+
echo
|
|
109
|
+
return "$rc"
|
|
106
110
|
}
|
|
107
111
|
|
|
108
112
|
_reinstall_dev_wrapper() {
|
package/karnel/modules/editor.sh
CHANGED
|
@@ -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() {
|
package/karnel/modules/games.sh
CHANGED
|
@@ -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
|
}
|
package/karnel/modules/lang.sh
CHANGED
|
@@ -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
|
-
|
|
117
|
-
|
|
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
|
}
|
package/karnel/modules/npm.sh
CHANGED
|
@@ -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
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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
|
+
}
|
package/karnel/modules/shell.sh
CHANGED
|
@@ -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
|
-
|
|
331
|
-
|
|
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() {
|
package/karnel/modules/ui.sh
CHANGED
|
@@ -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
|
-
|
|
43
|
-
|
|
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
|
-
|
|
136
|
-
|
|
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
|
+
}
|
package/karnel/modules/utils.sh
CHANGED
|
@@ -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
|
}
|
package/karnel/modules/voice.sh
CHANGED
|
@@ -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() {
|
package/karnel/tools/ai/all.sh
CHANGED
|
@@ -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
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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) ((
|
|
53
|
-
2) ((
|
|
54
|
-
*) ((
|
|
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
|
-
|
|
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; }
|
package/karnel/utils/install.sh
CHANGED
|
@@ -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 -
|
|
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