karnel-termux 4.17.33 → 4.17.35

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.17.33-0078D4?style=for-the-badge" alt="Version">
11
+ <img src="https://img.shields.io/badge/version-4.17.35-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">
@@ -78,7 +78,7 @@ Why it's great:
78
78
  ### Via checksummed GitHub release (recommended)
79
79
 
80
80
  ```bash
81
- version=4.17.33
81
+ version=4.17.35
82
82
  tmpdir=$(mktemp -d) && trap 'rm -rf "$tmpdir"' EXIT
83
83
  base="https://github.com/israelmarques1024-dotcom/karnel-termux/releases/download/v$version"
84
84
  curl -fsSL "$base/karnel-termux-install.sh" -o "$tmpdir/karnel-termux-install.sh"
@@ -104,6 +104,22 @@ After installation, run:
104
104
  karnel
105
105
  ```
106
106
 
107
+ ### Noninteractive mode
108
+
109
+ Use `--auto` before or after a command to approve supported confirmations and
110
+ select the recommended installation method without prompting. With no tool
111
+ flags, the whole module is installed:
112
+
113
+ ```bash
114
+ karnel --auto install ai
115
+ karnel install security --auto
116
+ karnel --auto update ai
117
+ ```
118
+
119
+ `--auto` does not invent required values such as API tokens, passwords, project
120
+ names, or voice input. It also does not replace explicit trust and legal opt-in
121
+ flags such as `--unsafe` or `--accept-responsible-use`.
122
+
107
123
  In a terminal, running `karnel` without a command opens a curated menu for
108
124
  common workflows. The menu is not a complete inventory of CLI commands,
109
125
  aliases, or options; use `karnel help` and the CLI reference for the full set.
@@ -650,8 +666,9 @@ once every 24 hours; the check can use npm or GitHub and writes state under
650
666
 
651
667
  The repository CI validates Bash/Zsh syntax, ShellCheck errors, CLI smoke tests,
652
668
  version behavior, Robin contracts, plugin lifecycle contracts, and npm package
653
- contents. The documentation site is built by the `Publish Docs` workflow with
654
- `actions/jekyll-build-pages`, so a broken Jekyll page fails that build.
669
+ contents. The `Publish Docs` workflow builds the GitHub Pages documentation
670
+ mirror with `actions/jekyll-build-pages`; the official Vite documentation site
671
+ is built and deployed separately through Vercel.
655
672
 
656
673
  These checks do not install every external tool or prove behavior on every Android
657
674
  device. Before relying on a new installer, test it in native Termux aarch64 with
@@ -33,7 +33,7 @@ karnel-termux/
33
33
  │ │ ├── dev.sh # Dev tools installer
34
34
  │ │ └── ...
35
35
  │ ├── tools/ # Individual tool installers
36
- │ │ ├── ai/ # 45 AI tools
36
+ │ │ ├── ai/ # 46 AI tools
37
37
  │ │ ├── lang/ # 8 languages
38
38
  │ │ ├── db/ # 5 databases
39
39
  │ │ ├── dev/ # 22 dev tools
package/docs/cli/index.md CHANGED
@@ -29,7 +29,7 @@ karnel install <module> --tool1 --tool2 # Install specific tools only
29
29
  |-----------|-------------|
30
30
  | `lang` | Node.js, Python, Go, Rust, C/C++, PHP, Perl, Bun |
31
31
  | `db` | PostgreSQL, MariaDB, SQLite, MongoDB, Redis |
32
- | `ai` | 45 AI tools (OpenCode, Cactus, Hugging Face, Claude Code, KeelCode, Goose, Factory Droid, Ollama, etc.) |
32
+ | `ai` | 46 AI tools (OpenCode, Cactus, Hugging Face, Claude Code, KeelCode, Goose, Factory Droid, 10Router, Ollama, etc.) |
33
33
  | `editor` | code-server (VS Code in browser), Neovim, NvChad |
34
34
  | `dev` | gh, curl, fzf, bat, lsd, jq, tmux, openssh, snyk (22 tools) |
35
35
  | `npm` | TypeScript, NestJS CLI, Prettier, Vercel CLI, etc. |
@@ -143,7 +143,7 @@ binary/command name, and current install status.
143
143
  |-----------|-------|
144
144
  | `lang` | 8 languages |
145
145
  | `db` | 5 databases |
146
- | `ai` | 45 AI tools |
146
+ | `ai` | 46 AI tools |
147
147
  | `editor` | 3 editor components |
148
148
  | `dev` | 22 development tools |
149
149
  | `npm` | 11 npm global modules |
package/docs/index.md CHANGED
@@ -9,7 +9,7 @@ layout: base
9
9
  ## What is Karnel?
10
10
 
11
11
  Karnel Termux transforms your Android device into a complete development workstation.
12
- With a single CLI (`karnel`), you can install and manage 45 AI tools, 3 editors,
12
+ With a single CLI (`karnel`), you can install and manage 46 AI tools, 3 editors,
13
13
  8 languages, 5 databases, 22 dev tools, 11 npm packages, 10 shell plugins,
14
14
  4 UI components, 4 deploy CLIs, 6 games, 2 network tools, 13 utility tools,
15
15
  30 security tools, 1 automation tool, responsible OSINT, a second brain,
@@ -1 +1 @@
1
- 90bb3622bf61156e730dea73a6e700e4d98c9b13
1
+ ef4116e544713bea8b0551b4c62eeecb8dd13e0e
package/karnel/bin/karnel CHANGED
@@ -20,6 +20,20 @@ KARNEL_PATH="$(cd "$BIN_DIR/.." 2>/dev/null && pwd)" || {
20
20
  # cargar bootstrap
21
21
  source "$KARNEL_PATH/utils/bootstrap.sh"
22
22
 
23
+ # --auto is global and may be supplied before or after the command. Remove it
24
+ # before dispatch because module lifecycle parsers treat every --flag as a tool.
25
+ _karnel_args=()
26
+ for _karnel_arg in "$@"; do
27
+ if [[ "$_karnel_arg" == "--auto" ]]; then
28
+ export KARNEL_AUTO=1
29
+ export KARNEL_NONINTERACTIVE=1
30
+ export KARNEL_REMOVE_DEFAULT=y
31
+ else
32
+ _karnel_args+=("$_karnel_arg")
33
+ fi
34
+ done
35
+ set -- "${_karnel_args[@]}"
36
+
23
37
  # Informational flags must not initialize user state or trigger update checks.
24
38
  case "${1:-}" in
25
39
  --help|-h|--version|help|version|list|show) KARNEL_READ_ONLY=1 ;;
@@ -129,4 +143,9 @@ fi
129
143
  # cargar CLI unificado (com TUI + help)
130
144
  import "@/cli/karnel"
131
145
 
146
+ if [[ "${KARNEL_AUTO:-0}" == "1" && $# -eq 0 ]]; then
147
+ karnel_help
148
+ exit 0
149
+ fi
150
+
132
151
  karnel_main "$@"
@@ -276,11 +276,7 @@ _update_try_curl() {
276
276
  return 0
277
277
  fi
278
278
  else
279
- if bash "$installer" --ref "$tag"; then
280
- rm -f "$installer"
281
- log_success "Karnel-Termux updated via curl ($tag)"
282
- return 0
283
- fi
279
+ log_error "Could not verify the immutable commit for $tag"
284
280
  fi
285
281
 
286
282
  rm -f "$installer"
@@ -421,7 +417,17 @@ _update_show_manual() {
421
417
 
422
418
  _update_karnel_repo() {
423
419
  local repo_dir="$KARNEL_PATH/.."
424
- local old_head
420
+ local old_head origin
421
+
422
+ origin=$(git -C "$repo_dir" remote get-url origin 2>/dev/null) || return 1
423
+ case "${origin%.git}" in
424
+ https://github.com/israelmarques1024-dotcom/karnel-termux|git@github.com:israelmarques1024-dotcom/karnel-termux) ;;
425
+ *) log_error "Refusing git update from an untrusted origin: $origin"; return 1 ;;
426
+ esac
427
+ if [[ -n "$(git -C "$repo_dir" status --porcelain --untracked-files=all 2>/dev/null)" ]]; then
428
+ log_error "Refusing git update with uncommitted framework changes"
429
+ return 1
430
+ fi
425
431
 
426
432
  old_head=$(git -C "$repo_dir" rev-parse HEAD 2>/dev/null)
427
433
 
@@ -88,7 +88,8 @@ karnel_help() {
88
88
  echo
89
89
  box "◈ KARNEL v${KARNEL_VERSION} ◈"
90
90
  echo
91
- log_info "Usage: karnel <command> [options]"
91
+ log_info "Usage: karnel <command> [options]"
92
+ log_info "Global option: --auto Run supported confirmations and selections without prompts"
92
93
  echo
93
94
  separator_section "Available Commands"
94
95
  echo
@@ -33,7 +33,7 @@ _n8n_dependencies() {
33
33
  }
34
34
 
35
35
  _install_n8n_impl() {
36
- _n8n_dependencies
36
+ _n8n_dependencies || return 1
37
37
 
38
38
  mkdir -p "$(dirname "$LOG_FILE")"
39
39
  export GYP_DEFINES="android_ndk_path=''"
@@ -88,7 +88,15 @@ _install_railway_manual() {
88
88
  }
89
89
 
90
90
  _install_railway_manual_impl() {
91
- mkdir -p "$RAILWAY_DATA_DIR"
91
+ if [[ -e "$RAILWAY_DATA_DIR" ]] && ! _railway_data_is_karnel_owned; then
92
+ log_error "Refusing to replace unowned Railway data: $RAILWAY_DATA_DIR"
93
+ return 1
94
+ fi
95
+ if [[ -e "$PREFIX/bin/railway" || -L "$PREFIX/bin/railway" ]] && ! _railway_command_is_karnel_owned; then
96
+ log_error "Refusing to replace unowned railway command: $PREFIX/bin/railway"
97
+ return 1
98
+ fi
99
+ mkdir -p "$RAILWAY_DATA_DIR" "$PREFIX/bin"
92
100
 
93
101
  local latest_version
94
102
  latest_version=$(curl -fsSL --connect-timeout 10 "https://api.github.com/repos/railwayapp/cli/releases/latest" 2>/dev/null | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
@@ -2,6 +2,7 @@
2
2
 
3
3
  _AMASS_MARKER="$PREFIX/share/karnel-installers/amass"
4
4
  _AMASS_VERSION="4.2.0"
5
+ _amass_package_owned() { [[ -f "$_AMASS_MARKER" && "$(<"$_AMASS_MARKER")" == 'pkg:amass' ]]; }
5
6
 
6
7
  _amass_arch() {
7
8
  local arch
@@ -16,7 +17,7 @@ _amass_arch() {
16
17
 
17
18
  install_amass() (
18
19
  if command -v amass &>/dev/null; then
19
- if ! installer_file_owned "$PREFIX/bin/amass" "$_AMASS_MARKER"; then
20
+ if ! installer_file_owned "$PREFIX/bin/amass" "$_AMASS_MARKER" && ! _amass_package_owned; then
20
21
  log_info "amass já está instalado"
21
22
  return 2
22
23
  fi
@@ -25,7 +26,7 @@ install_amass() (
25
26
  if [ ! -f "$_AMASS_MARKER" ] &&
26
27
  { pkg install -y amass 2>/dev/null || apt install -y amass 2>/dev/null; }; then
27
28
  local bin; bin="$(command -v amass)"
28
- [ -n "$bin" ] && sha256sum "$bin" > "$_AMASS_MARKER" 2>/dev/null
29
+ [ -n "$bin" ] && { mkdir -p "$(dirname "$_AMASS_MARKER")" && printf '%s\n' 'pkg:amass' >"$_AMASS_MARKER"; }
29
30
  log_success "amass instalado"
30
31
  return 0
31
32
  fi
@@ -66,7 +67,10 @@ install_amass() (
66
67
 
67
68
  uninstall_amass() {
68
69
  log_info "Removendo amass..."
69
- if [ -f "$_AMASS_MARKER" ]; then
70
+ if _amass_package_owned; then
71
+ pkg uninstall -y amass 2>/dev/null || apt remove -y amass 2>/dev/null || return 1
72
+ rm -f "$_AMASS_MARKER"
73
+ elif [ -f "$_AMASS_MARKER" ]; then
70
74
  [ "$(sha256sum "$PREFIX/bin/amass" 2>/dev/null)" = "$(<"$_AMASS_MARKER")" ] && rm -f "$PREFIX/bin/amass"
71
75
  rm -f "$_AMASS_MARKER"
72
76
  fi
@@ -4,6 +4,8 @@ _BURP_DIR="$PREFIX/share/burpsuite"
4
4
  _BURP_JAR="burpsuite_community.jar"
5
5
  _BURP_VERSION="2026.7.3"
6
6
  _BURP_SHA256="c8262dc5426f38bedc490d66c5d21b6ff77d6dc6d85cefe6a66c882690134069"
7
+ _BURP_PACKAGE_MARKER="$PREFIX/share/karnel-installers/burpsuite"
8
+ _burpsuite_package_owned() { [[ -f "$_BURP_PACKAGE_MARKER" && "$(<"$_BURP_PACKAGE_MARKER")" == 'pkg:burpsuite' ]]; }
7
9
 
8
10
  _burpsuite_owned() {
9
11
  installer_file_owned "$PREFIX/bin/burpsuite" "$_BURP_DIR/.karnel-wrapper"
@@ -11,7 +13,7 @@ _burpsuite_owned() {
11
13
 
12
14
  install_burpsuite() (
13
15
  if command -v burpsuite &>/dev/null; then
14
- if ! _burpsuite_owned; then
16
+ if ! _burpsuite_owned && ! _burpsuite_package_owned; then
15
17
  log_info "burpsuite já está instalado"
16
18
  return 2
17
19
  fi
@@ -20,6 +22,7 @@ install_burpsuite() (
20
22
 
21
23
  if [ ! -f "$_BURP_DIR/.karnel-wrapper" ] &&
22
24
  { pkg install -y burpsuite 2>/dev/null || apt install -y burpsuite 2>/dev/null; }; then
25
+ mkdir -p "$(dirname "$_BURP_PACKAGE_MARKER")" && printf '%s\n' 'pkg:burpsuite' >"$_BURP_PACKAGE_MARKER" || return 1
23
26
  log_success "burpsuite instalado"
24
27
  return 0
25
28
  fi
@@ -74,7 +77,10 @@ SCRIPT
74
77
 
75
78
  uninstall_burpsuite() {
76
79
  log_info "Removendo Burp Suite..."
77
- if [ -f "$_BURP_DIR/.karnel-wrapper" ]; then
80
+ if _burpsuite_package_owned; then
81
+ pkg uninstall -y burpsuite 2>/dev/null || apt remove -y burpsuite 2>/dev/null || return 1
82
+ rm -f "$_BURP_PACKAGE_MARKER"
83
+ elif [ -f "$_BURP_DIR/.karnel-wrapper" ]; then
78
84
  [ "$(sha256sum "$PREFIX/bin/burpsuite" 2>/dev/null)" = "$(<"$_BURP_DIR/.karnel-wrapper")" ] && rm -f "$PREFIX/bin/burpsuite"
79
85
  rm -rf "$_BURP_DIR"
80
86
  fi
@@ -2,6 +2,7 @@
2
2
 
3
3
  _FFUF_MARKER="$PREFIX/share/karnel-installers/ffuf"
4
4
  _FFUF_VERSION="2.1.0"
5
+ _ffuf_package_owned() { [[ -f "$_FFUF_MARKER" && "$(<"$_FFUF_MARKER")" == 'pkg:ffuf' ]]; }
5
6
 
6
7
  inc_ffuf_arch() {
7
8
  local arch
@@ -48,6 +49,7 @@ install_ffuf() {
48
49
  fi
49
50
  log_info "Instalando ffuf..."
50
51
  if pkg install -y ffuf 2>/dev/null || apt install -y ffuf 2>/dev/null; then
52
+ mkdir -p "$(dirname "$_FFUF_MARKER")" && printf '%s\n' 'pkg:ffuf' >"$_FFUF_MARKER" || return 1
51
53
  log_success "ffuf instalado"
52
54
  return 0
53
55
  fi
@@ -61,7 +63,10 @@ install_ffuf() {
61
63
 
62
64
  uninstall_ffuf() {
63
65
  log_info "Removendo ffuf..."
64
- if [ -f "$_FFUF_MARKER" ]; then
66
+ if _ffuf_package_owned; then
67
+ pkg uninstall -y ffuf 2>/dev/null || apt remove -y ffuf 2>/dev/null || return 1
68
+ rm -f "$_FFUF_MARKER"
69
+ elif [ -f "$_FFUF_MARKER" ]; then
65
70
  [ "$(sha256sum "$PREFIX/bin/ffuf" 2>/dev/null)" = "$(<"$_FFUF_MARKER")" ] && rm -f "$PREFIX/bin/ffuf"
66
71
  rm -f "$_FFUF_MARKER"
67
72
  fi
@@ -3,6 +3,7 @@
3
3
  _GOBUSTER_VERSION="3.6.0"
4
4
  _GOBUSTER_DIR="$PREFIX/share/gobuster"
5
5
  _GOBUSTER_MARKER="$PREFIX/share/karnel-installers/gobuster"
6
+ _gobuster_package_owned() { [[ -f "$_GOBUSTER_MARKER" && "$(<"$_GOBUSTER_MARKER")" == 'pkg:gobuster' ]]; }
6
7
 
7
8
  _install_gobuster_bin() (
8
9
  local arch asset checksum tmpdir archive staged_bin
@@ -36,7 +37,7 @@ _install_gobuster_bin() (
36
37
 
37
38
  install_gobuster() {
38
39
  if command -v gobuster &>/dev/null; then
39
- if ! installer_file_owned "$PREFIX/bin/gobuster" "$_GOBUSTER_MARKER"; then
40
+ if ! installer_file_owned "$PREFIX/bin/gobuster" "$_GOBUSTER_MARKER" && ! _gobuster_package_owned; then
40
41
  log_info "gobuster já está instalado"
41
42
  return 2
42
43
  fi
@@ -44,6 +45,7 @@ install_gobuster() {
44
45
  log_info "Instalando gobuster..."
45
46
  if [ ! -f "$_GOBUSTER_MARKER" ] &&
46
47
  { pkg install -y gobuster 2>/dev/null || apt install -y gobuster 2>/dev/null; }; then
48
+ mkdir -p "$(dirname "$_GOBUSTER_MARKER")" && printf '%s\n' 'pkg:gobuster' >"$_GOBUSTER_MARKER" || return 1
47
49
  log_success "gobuster instalado"
48
50
  return 0
49
51
  fi
@@ -57,7 +59,10 @@ install_gobuster() {
57
59
 
58
60
  uninstall_gobuster() {
59
61
  log_info "Removendo gobuster..."
60
- if [ -f "$_GOBUSTER_MARKER" ]; then
62
+ if _gobuster_package_owned; then
63
+ pkg uninstall -y gobuster 2>/dev/null || apt remove -y gobuster 2>/dev/null || return 1
64
+ rm -f "$_GOBUSTER_MARKER"
65
+ elif [ -f "$_GOBUSTER_MARKER" ]; then
61
66
  [ "$(sha256sum "$PREFIX/bin/gobuster" 2>/dev/null)" = "$(<"$_GOBUSTER_MARKER")" ] && rm -f "$PREFIX/bin/gobuster"
62
67
  rm -f "$_GOBUSTER_MARKER"
63
68
  fi
@@ -2,6 +2,7 @@
2
2
 
3
3
  _SUBFINDER_MARKER="$PREFIX/share/karnel-installers/subfinder"
4
4
  _SUBFINDER_VERSION="2.6.6"
5
+ _subfinder_package_owned() { [[ -f "$_SUBFINDER_MARKER" && "$(<"$_SUBFINDER_MARKER")" == 'pkg:subfinder' ]]; }
5
6
 
6
7
  _subfinder_arch() {
7
8
  local arch
@@ -16,7 +17,7 @@ _subfinder_arch() {
16
17
 
17
18
  install_subfinder() (
18
19
  if command -v subfinder &>/dev/null; then
19
- if ! installer_file_owned "$PREFIX/bin/subfinder" "$_SUBFINDER_MARKER"; then
20
+ if ! installer_file_owned "$PREFIX/bin/subfinder" "$_SUBFINDER_MARKER" && ! _subfinder_package_owned; then
20
21
  log_info "subfinder já está instalado"
21
22
  return 2
22
23
  fi
@@ -25,7 +26,7 @@ install_subfinder() (
25
26
  if [ ! -f "$_SUBFINDER_MARKER" ] &&
26
27
  { pkg install -y subfinder 2>/dev/null || apt install -y subfinder 2>/dev/null; }; then
27
28
  local bin; bin="$(command -v subfinder)"
28
- [ -n "$bin" ] && sha256sum "$bin" > "$_SUBFINDER_MARKER" 2>/dev/null
29
+ [ -n "$bin" ] && { mkdir -p "$(dirname "$_SUBFINDER_MARKER")" && printf '%s\n' 'pkg:subfinder' >"$_SUBFINDER_MARKER"; }
29
30
  log_success "subfinder instalado"
30
31
  return 0
31
32
  fi
@@ -65,7 +66,10 @@ install_subfinder() (
65
66
 
66
67
  uninstall_subfinder() {
67
68
  log_info "Removendo subfinder..."
68
- if [ -f "$_SUBFINDER_MARKER" ]; then
69
+ if _subfinder_package_owned; then
70
+ pkg uninstall -y subfinder 2>/dev/null || apt remove -y subfinder 2>/dev/null || return 1
71
+ rm -f "$_SUBFINDER_MARKER"
72
+ elif [ -f "$_SUBFINDER_MARKER" ]; then
69
73
  [ "$(sha256sum "$PREFIX/bin/subfinder" 2>/dev/null)" = "$(<"$_SUBFINDER_MARKER")" ] && rm -f "$PREFIX/bin/subfinder"
70
74
  rm -f "$_SUBFINDER_MARKER"
71
75
  fi
@@ -3,6 +3,8 @@
3
3
  _ZAP_DIR="$PREFIX/share/zap"
4
4
  _ZAP_VERSION="2.16.1"
5
5
  _ZAP_SHA256="5b2eb8319b085121a6e8ad50d69d67dbef8c867166f71a937bfc888d247a2ac1"
6
+ _ZAP_PACKAGE_MARKER="$PREFIX/share/karnel-installers/zaproxy"
7
+ _zap_package_owned() { [[ -f "$_ZAP_PACKAGE_MARKER" && "$(<"$_ZAP_PACKAGE_MARKER")" == 'pkg:zaproxy' ]]; }
6
8
 
7
9
  _zap_owned() {
8
10
  installer_file_owned "$PREFIX/bin/zap" "$_ZAP_DIR/.karnel-wrapper"
@@ -10,7 +12,7 @@ _zap_owned() {
10
12
 
11
13
  install_zap() (
12
14
  if command -v zap &>/dev/null; then
13
- if ! _zap_owned; then
15
+ if ! _zap_owned && ! _zap_package_owned; then
14
16
  log_info "zap já está instalado"
15
17
  return 2
16
18
  fi
@@ -19,6 +21,7 @@ install_zap() (
19
21
 
20
22
  if [ ! -f "$_ZAP_DIR/.karnel-wrapper" ] &&
21
23
  { pkg install -y zaproxy 2>/dev/null || apt install -y zaproxy 2>/dev/null; }; then
24
+ mkdir -p "$(dirname "$_ZAP_PACKAGE_MARKER")" && printf '%s\n' 'pkg:zaproxy' >"$_ZAP_PACKAGE_MARKER" || return 1
22
25
  log_success "zap instalado"
23
26
  return 0
24
27
  fi
@@ -102,7 +105,10 @@ SCRIPT
102
105
 
103
106
  uninstall_zap() {
104
107
  log_info "Removendo ZAP..."
105
- if [ -f "$_ZAP_DIR/.karnel-wrapper" ]; then
108
+ if _zap_package_owned; then
109
+ pkg uninstall -y zaproxy 2>/dev/null || apt remove -y zaproxy 2>/dev/null || return 1
110
+ rm -f "$_ZAP_PACKAGE_MARKER"
111
+ elif [ -f "$_ZAP_DIR/.karnel-wrapper" ]; then
106
112
  [ "$(sha256sum "$PREFIX/bin/zap" 2>/dev/null)" = "$(<"$_ZAP_DIR/.karnel-wrapper")" ] && rm -f "$PREFIX/bin/zap"
107
113
  rm -rf "$_ZAP_DIR"
108
114
  fi
@@ -1306,6 +1306,10 @@ agent_server_stop() {
1306
1306
  # ------------------------------------------------------------
1307
1307
  agent_confirm() {
1308
1308
  local prompt="$1" var="$2" _val
1309
+ if [[ "${KARNEL_AUTO:-0}" == "1" ]]; then
1310
+ read -r "$var" <<<"y"
1311
+ return 0
1312
+ fi
1309
1313
  while true; do
1310
1314
  printf ' %b%b [%b]%b\n' "$D_YELLOW" "$prompt" "${D_GREEN}y${GRAY}/${D_RED}n${NC}" "$NC" >&2
1311
1315
  printf ' > ' >&2
@@ -277,6 +277,11 @@ read_confirm() {
277
277
  local var="$2"
278
278
  local _val
279
279
 
280
+ if [[ "${KARNEL_AUTO:-0}" == "1" ]]; then
281
+ read -r "$var" <<<"y"
282
+ return 0
283
+ fi
284
+
280
285
  if [[ ! -t 0 ]]; then
281
286
  read -r "$var" <<<"n"
282
287
  return 1
@@ -310,6 +315,11 @@ read_confirm_default() {
310
315
  local var="$3"
311
316
  local _val
312
317
 
318
+ if [[ "${KARNEL_AUTO:-0}" == "1" ]]; then
319
+ read -r "$var" <<<"y"
320
+ return 0
321
+ fi
322
+
313
323
  if [[ ! -t 0 ]]; then
314
324
  read -r "$var" <<<"$default"
315
325
  [[ "$default" == "y" ]] && return 0 || return 1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "karnel-termux",
3
- "version": "4.17.33",
3
+ "version": "4.17.35",
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"
@@ -44,7 +44,7 @@ _karnel_completions() {
44
44
  local ai_tools="10router qwen-code gemini-cli claude-code mistral-vibe openclaude openclaw ollama codex opencode mimocode engram codegraph pi antigravity-cli minimax-cli gentle-ai gga hermes-agent kimi-code command-code codebuff freebuff kilocode-cli kiro crush cline odysseus kimchi-code omni-route ctx7 openspec supercode-cli puter keelcode copilot-termux qoder ampcode cursor-cli oh-my-pi goose droid cactus cactus-needle hugging-face walkie"
45
45
 
46
46
  if [[ $cword -eq 1 ]]; then
47
- COMPREPLY=($(compgen -W "$commands --help --version" -- "$cur"))
47
+ COMPREPLY=($(compgen -W "$commands --auto --help --version" -- "$cur"))
48
48
  return
49
49
  fi
50
50
 
@@ -53,14 +53,14 @@ _karnel_completions() {
53
53
  if [[ $cword -eq 2 ]]; then
54
54
  COMPREPLY=($(compgen -W "$install_targets" -- "$cur"))
55
55
  else
56
- COMPREPLY=($(compgen -W "$(_karnel_tool_flags "${words[2]}")" -- "$cur"))
56
+ COMPREPLY=($(compgen -W "$(_karnel_tool_flags "${words[2]}") --auto" -- "$cur"))
57
57
  fi
58
58
  ;;
59
59
  update)
60
60
  if [[ $cword -eq 2 ]]; then
61
61
  COMPREPLY=($(compgen -W "$update_targets" -- "$cur"))
62
62
  else
63
- COMPREPLY=($(compgen -W "$(_karnel_tool_flags "${words[2]}")" -- "$cur"))
63
+ COMPREPLY=($(compgen -W "$(_karnel_tool_flags "${words[2]}") --auto" -- "$cur"))
64
64
  fi
65
65
  ;;
66
66
  show)
@@ -98,15 +98,16 @@ _karnel() {
98
98
 
99
99
  if (( CURRENT == 2 )); then
100
100
  _karnel_commands
101
+ compadd -- --auto
101
102
  return
102
103
  fi
103
104
 
104
105
  case "$command" in
105
106
  install|uninstall|reinstall)
106
- if (( CURRENT == 3 )); then _karnel_modules; compadd -- supabase; else _karnel_tool_flags "${words[3]}"; fi
107
+ if (( CURRENT == 3 )); then _karnel_modules; compadd -- supabase; else _karnel_tool_flags "${words[3]}"; compadd -- --auto; fi
107
108
  ;;
108
109
  update)
109
- if (( CURRENT == 3 )); then _karnel_modules; compadd -- supabase karnel; else _karnel_tool_flags "${words[3]}"; fi
110
+ if (( CURRENT == 3 )); then _karnel_modules; compadd -- supabase karnel; else _karnel_tool_flags "${words[3]}"; compadd -- --auto; fi
110
111
  ;;
111
112
  show)
112
113
  if (( CURRENT == 3 )); then _karnel_modules; compadd -- backup restore; else _karnel_tool_flags "${words[3]}"; fi