From c74a435d8998487a653f90b862646a66835822c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B8=D1=82=D0=B0=D0=BB=D0=B8=D0=B9=20=D0=9D=D0=B8?= =?UTF-8?q?=D0=BA=D0=B8=D1=82=D0=B5=D0=BD=D0=BA=D0=BE?= Date: Wed, 21 Oct 2026 11:49:53 +0700 Subject: [PATCH] feat(android): install Android CLI only on demand (setup.sh item 8) ai-setup.sh no longer installs Google Android CLI or runs android init, so menu items 1 and 7 (setup / update) leave it alone. The install block moved verbatim into scripts/android-cli-setup.sh, which menu item 8 now runs instead of the whole ai-setup.sh. The final summary of ai-setup.sh points to item 8, README describes the opt-in install, tests check the new script and that ai-setup.sh does not install Android CLI any more. Co-Authored-By: Claude Opus 5.5 --- README.md | 4 +- scripts/ai-setup.sh | 54 +-------------------------- scripts/android-cli-setup.sh | 72 ++++++++++++++++++++++++++++++++++++ setup.sh | 4 +- tests/test_fixes.sh | 37 ++++++++++++++++-- 5 files changed, 111 insertions(+), 60 deletions(-) create mode 100755 scripts/android-cli-setup.sh diff --git a/README.md b/README.md index 90e3753..656dbe4 100644 --- a/README.md +++ b/README.md @@ -179,7 +179,7 @@ bash tests/test_network.sh # полные тесты ## Android CLI -`scripts/ai-setup.sh` также устанавливает [Google Android CLI](https://d.android.com/tools/agents) (preview) - официальный терминальный инструмент для Android-разработки, заточенный под AI-агентов. +[Google Android CLI](https://d.android.com/tools/agents) (preview) - официальный терминальный инструмент для Android-разработки, заточенный под AI-агентов. По умолчанию **не устанавливается**: `scripts/ai-setup.sh` (пункты меню 1 и 7) его не трогает. Ставится только по выбору - `bash setup.sh` → пункт `8) Android CLI` (или напрямую `bash scripts/android-cli-setup.sh`). Что устанавливается: - `android` - бинарь CLI в `~/.local/bin/` (или `~/bin` через symlink) @@ -206,7 +206,7 @@ android update # обновить сам Android CLI Интеграция с Claude Code: ```bash -# После установки ai-setup.sh выполняется автоматически: +# После установки android-cli-setup.sh выполняется автоматически: android init ``` diff --git a/scripts/ai-setup.sh b/scripts/ai-setup.sh index 7c89849..918084e 100755 --- a/scripts/ai-setup.sh +++ b/scripts/ai-setup.sh @@ -267,56 +267,6 @@ else success "agy уже установлен: $(agy --version 2>/dev/null | head -1)" fi -# ── 4d. Google Android CLI ─────────────────────────────────── -info "Проверяю Android CLI..." -ANDROID_BIN="$HOME/.local/bin/android" -[ ! -f "$ANDROID_BIN" ] && ANDROID_BIN="$(command -v android 2>/dev/null || true)" - -if [ -z "$ANDROID_BIN" ] || [ ! -f "$ANDROID_BIN" ]; then - info "Устанавливаю Android CLI..." - _uname_s=$(uname -s) - _uname_m=$(uname -m) - ANDROID_PLATFORM="" - case "${_uname_s}-${_uname_m}" in - Linux-x86_64) ANDROID_PLATFORM="linux_x86_64" ;; - Linux-aarch64) ANDROID_PLATFORM="linux_arm64" ;; - Linux-arm64) ANDROID_PLATFORM="linux_arm64" ;; - Darwin-x86_64) ANDROID_PLATFORM="darwin_x86_64" ;; - Darwin-arm64) ANDROID_PLATFORM="darwin_arm64" ;; - Darwin-aarch64) ANDROID_PLATFORM="darwin_arm64" ;; - MINGW*|MSYS*|CYGWIN*-x86_64) ANDROID_PLATFORM="windows_x86_64" ;; - esac - - if [ -n "$ANDROID_PLATFORM" ]; then - ANDROID_INSTALL_URL="https://dl.google.com/android/cli/latest/${ANDROID_PLATFORM}/install.sh" - if curl -fsSL "$ANDROID_INSTALL_URL" | bash; then - success "Android CLI установлен" - else - warn "Не удалось установить Android CLI через официальный скрипт" - fi - else - warn "Неизвестная платформа ${_uname_s} ${_uname_m}. Пропускаю Android CLI." - fi -else - success "Android CLI уже установлен: $($ANDROID_BIN --version 2>/dev/null | head -1)" -fi - -# Официальный install.sh ставит бинарь в ~/.local/bin/android. -# Если пользователь использует ~/bin вместо ~/.local/bin - symlink. -if [ "$BIN_DIR" != "$HOME/.local/bin" ] && [ -f "$HOME/.local/bin/android" ] && [ ! -f "$BIN_DIR/android" ]; then - ln -sf "$HOME/.local/bin/android" "$BIN_DIR/android" - success "Android CLI symlink -> $BIN_DIR/android" -fi - -# Разворачиваем Android CLI skills для агентов (Claude Code и др.) -if command -v android &>/dev/null; then - info "Запускаю android init для деплоя skills..." - mkdir -p "$HOME/.claude/skills" - android init || warn "android init завершился с ошибкой" -else - info "Android CLI не найден в PATH, пропускаю android init" -fi - # ── 5. routatic-proxy (OpenCode Go → Claude Code) ────────── info "Проверяю routatic-proxy..." ROUTATIC_BIN="$HOME/.local/bin/routatic-proxy" @@ -2606,7 +2556,7 @@ echo -e " ${CYAN}ai-gpt${NC} - OpenAI Codex (нативный CLI echo -e " ${CYAN}ai-gemini${NC} - Gemini (нативный agy CLI, автоустановка)" echo -e " ${CYAN}ai-cursor${NC} - Cursor (нативный Cursor CLI, автоустановка)" echo "" -echo " Android CLI:" -echo -e " ${CYAN}android${NC} - Google Android CLI (SDK, эмулятор, проекты)" +echo " Android CLI (не ставится по умолчанию):" +echo -e " ${CYAN}android${NC} - Google Android CLI: bash setup.sh → пункт 8" echo "" echo -e "Чтобы команды были доступны сразу, выполните: ${GREEN}exec bash${NC}" diff --git a/scripts/android-cli-setup.sh b/scripts/android-cli-setup.sh new file mode 100755 index 0000000..e87109d --- /dev/null +++ b/scripts/android-cli-setup.sh @@ -0,0 +1,72 @@ +#!/usr/bin/env bash +# Copyright (c) 2026 Виталий Никитенко. MIT License. +# android-cli-setup.sh — установка Google Android CLI (по выбору, пункт 8 в setup.sh) +# Запуск: bash scripts/android-cli-setup.sh + +# Автоопределение: ~/bin если есть в PATH, иначе ~/.local/bin +if [[ ":$PATH:" == *":$HOME/bin:"* ]]; then + BIN_DIR="$HOME/bin" +else + BIN_DIR="$HOME/.local/bin" +fi + +RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; CYAN='\033[0;36m'; NC='\033[0m' +info() { echo -e "${CYAN}[INFO]${NC} $*"; } +success() { echo -e "${GREEN}[OK]${NC} $*"; } +warn() { echo -e "${YELLOW}[WARN]${NC} $*"; } + +# Запрет запуска от root +if [ "$EUID" -eq 0 ]; then + echo -e "${RED}Не запускайте этот скрипт через sudo!${NC}" + echo "Запустите просто: bash scripts/android-cli-setup.sh" + exit 1 +fi + +info "Проверяю Android CLI..." +ANDROID_BIN="$HOME/.local/bin/android" +[ ! -f "$ANDROID_BIN" ] && ANDROID_BIN="$(command -v android 2>/dev/null || true)" + +if [ -z "$ANDROID_BIN" ] || [ ! -f "$ANDROID_BIN" ]; then + info "Устанавливаю Android CLI..." + _uname_s=$(uname -s) + _uname_m=$(uname -m) + ANDROID_PLATFORM="" + case "${_uname_s}-${_uname_m}" in + Linux-x86_64) ANDROID_PLATFORM="linux_x86_64" ;; + Linux-aarch64) ANDROID_PLATFORM="linux_arm64" ;; + Linux-arm64) ANDROID_PLATFORM="linux_arm64" ;; + Darwin-x86_64) ANDROID_PLATFORM="darwin_x86_64" ;; + Darwin-arm64) ANDROID_PLATFORM="darwin_arm64" ;; + Darwin-aarch64) ANDROID_PLATFORM="darwin_arm64" ;; + MINGW*|MSYS*|CYGWIN*-x86_64) ANDROID_PLATFORM="windows_x86_64" ;; + esac + + if [ -n "$ANDROID_PLATFORM" ]; then + ANDROID_INSTALL_URL="https://dl.google.com/android/cli/latest/${ANDROID_PLATFORM}/install.sh" + if curl -fsSL "$ANDROID_INSTALL_URL" | bash; then + success "Android CLI установлен" + else + warn "Не удалось установить Android CLI через официальный скрипт" + fi + else + warn "Неизвестная платформа ${_uname_s} ${_uname_m}. Пропускаю Android CLI." + fi +else + success "Android CLI уже установлен: $($ANDROID_BIN --version 2>/dev/null | head -1)" +fi + +# Официальный install.sh ставит бинарь в ~/.local/bin/android. +# Если пользователь использует ~/bin вместо ~/.local/bin - symlink. +if [ "$BIN_DIR" != "$HOME/.local/bin" ] && [ -f "$HOME/.local/bin/android" ] && [ ! -f "$BIN_DIR/android" ]; then + ln -sf "$HOME/.local/bin/android" "$BIN_DIR/android" + success "Android CLI symlink -> $BIN_DIR/android" +fi + +# Разворачиваем Android CLI skills для агентов (Claude Code и др.) +if command -v android &>/dev/null; then + info "Запускаю android init для деплоя skills..." + mkdir -p "$HOME/.claude/skills" + android init || warn "android init завершился с ошибкой" +else + info "Android CLI не найден в PATH, пропускаю android init" +fi diff --git a/setup.sh b/setup.sh index dc4c62e..162eb41 100755 --- a/setup.sh +++ b/setup.sh @@ -107,7 +107,7 @@ else echo -e " ${GRY}git pull + перегенерация всех скриптов в ~/bin (или ~/.local/bin).${CLR}" echo "" echo -e " ${BLD}8) Android CLI${CLR}" - echo -e " ${GRY}Установить Google Android CLI для Android-разработки.${CLR}" + echo -e " ${GRY}Установить Google Android CLI для Android-разработки (пункт 1 его не ставит).${CLR}" echo "" echo -n "Выбери [1-8] или Enter для выхода: " read -r choice @@ -279,7 +279,7 @@ case "$choice" in do_update ;; 8) - bash scripts/ai-setup.sh + bash scripts/android-cli-setup.sh ;; "") exit 0 diff --git a/tests/test_fixes.sh b/tests/test_fixes.sh index 5f84d48..da17a14 100755 --- a/tests/test_fixes.sh +++ b/tests/test_fixes.sh @@ -8,6 +8,8 @@ set -euo pipefail SCRIPT="$(cd "$(dirname "$0")/.." && pwd)/scripts/ai-setup.sh" GLOBAL_RULES_SOURCE="$(cd "$(dirname "$0")/.." && pwd)/home-configs/GLOBAL_RULES.md" ADD_HOOK="$(cd "$(dirname "$0")/.." && pwd)/home-configs/claude/hooks/add-account-hook.sh" +ANDROID_SCRIPT="$(cd "$(dirname "$0")/.." && pwd)/scripts/android-cli-setup.sh" +SETUP_MENU="$(cd "$(dirname "$0")/.." && pwd)/setup.sh" PASS=0; FAIL=0 ok() { echo "[PASS] $1"; PASS=$((PASS+1)); } @@ -555,9 +557,33 @@ test_script_syntax() { fi } -# ── Android CLI: install block exists ───────────────────────────────────── +# ── Android CLI: opt-in install (setup.sh item 8), not part of ai-setup.sh ─ +test_android_script_syntax() { + if bash -n "$ANDROID_SCRIPT" 2>&1; then + ok "android-cli: android-cli-setup.sh passes 'bash -n'" + else + fail "android-cli: android-cli-setup.sh has syntax errors" + fi +} + +test_android_not_installed_by_default() { + if ! grep -q 'dl.google.com/android/cli' "$SCRIPT" && ! grep -q 'android init' "$SCRIPT"; then + ok "android-cli: ai-setup.sh does not install Android CLI by default" + else + fail "android-cli: ai-setup.sh still installs Android CLI" + fi +} + +test_android_menu_item_runs_script() { + if awk '/^ 8\)/,/;;/' "$SETUP_MENU" | grep -q 'bash scripts/android-cli-setup.sh'; then + ok "android-cli: setup.sh item 8 runs android-cli-setup.sh" + else + fail "android-cli: setup.sh item 8 does not run android-cli-setup.sh" + fi +} + test_android_cli_install_url() { - if grep -q 'dl.google.com/android/cli/latest' "$SCRIPT"; then + if grep -q 'dl.google.com/android/cli/latest' "$ANDROID_SCRIPT"; then ok "android-cli: install URL for Android CLI is present" else fail "android-cli: missing install URL for Android CLI" @@ -565,7 +591,7 @@ test_android_cli_install_url() { } test_android_init_called() { - if grep -q 'android init' "$SCRIPT"; then + if grep -q 'android init' "$ANDROID_SCRIPT"; then ok "android-cli: android init is invoked after install" else fail "android-cli: missing android init invocation" @@ -573,7 +599,7 @@ test_android_init_called() { } test_android_symlink_to_bin_dir() { - if grep -q 'ln -sf "$HOME/.local/bin/android" "$BIN_DIR/android"' "$SCRIPT"; then + if grep -q 'ln -sf "$HOME/.local/bin/android" "$BIN_DIR/android"' "$ANDROID_SCRIPT"; then ok "android-cli: symlink to BIN_DIR is handled" else fail "android-cli: missing symlink to BIN_DIR" @@ -702,6 +728,9 @@ test_global_rules_source_installed test_native_rule_files_generated test_codex_sound_hooks_detach_stdio test_fix7_trap_tmp +test_android_script_syntax +test_android_not_installed_by_default +test_android_menu_item_runs_script test_android_cli_install_url test_android_init_called test_android_symlink_to_bin_dir