diff --git a/README.md b/README.md index 5e14d48..91c0844 100644 --- a/README.md +++ b/README.md @@ -168,6 +168,47 @@ bash tests/test_network.sh # полные тесты - `~/.config/ai-setup/global_rules.md` и native rule-файлы (`~/.claude/CLAUDE.md`, `~/.codex/AGENTS.md`, `~/.kimi-code/AGENTS.md`, `~/.gemini/GEMINI.md`) - Скиллы из `home-configs/claude/skills/` в `~/.claude/skills/` и `~/.gemini/config/plugins/local-setup/skills/` +## Android CLI + +`scripts/ai-setup.sh` также устанавливает [Google Android CLI](https://d.android.com/tools/agents) (preview) - официальный терминальный инструмент для Android-разработки, заточенный под AI-агентов. + +Что устанавливается: +- `android` - бинарь CLI в `~/.local/bin/` (или `~/bin` через symlink) +- `android-cli` skill в `~/.claude/skills/` для Claude Code + +Поддерживаемые платформы: +- Linux: `x86_64`, `arm64` +- macOS: `x86_64`, `arm64` +- Windows: `x86_64` (ограниченная поддержка, `android emulator` отключён в v0.7) + +Ключевые команды: + +```bash +android --version # версия CLI +android info # информация об SDK и путях +android sdk list # список доступных SDK-пакетов +android sdk install ... # установить пакеты SDK +android create ... # создать новый Android-проект +android emulator start # запустить эмулятор +android run --apks ... # установить и запустить APK +android update # обновить сам Android CLI +``` + +Интеграция с Claude Code: + +```bash +# После установки ai-setup.sh выполняется автоматически: +android init +``` + +Это разворачивает `android-cli` skill в `~/.claude/skills/`, после чего Claude Code понимает Android CLI и может использовать его для SDK, эмулятора и сборок. + +Ограничения: +- Android CLI находится в preview, API/команды могут меняться. +- На Windows в v0.7 отключена команда `android emulator`. +- Если уже установлен Android Studio, Android CLI может использовать тот же SDK или создать новый в `~/.android/sdk`. Проверяй активный путь через `android info`. +- Android CLI - нативный бинарь, который спавнит дочерние процессы (emulator, gradle, adb), поэтому он не оборачивается в `proxychains4`. + ## VLESS / Xray (опционально) При запуске `scripts/ai-setup.sh` спрашивает, нужен ли VLESS-прокси для AI API запросов. diff --git a/home-configs/claude/skills/android-cli/SKILL.md b/home-configs/claude/skills/android-cli/SKILL.md new file mode 100644 index 0000000..f6f6eac --- /dev/null +++ b/home-configs/claude/skills/android-cli/SKILL.md @@ -0,0 +1,88 @@ +--- +name: android-cli +description: Google Android CLI - официальный терминальный инструмент для Android-разработки, SDK, эмуляторов и проектов +--- + +# Android CLI + +## Назначение + +Google Android CLI (preview) - официальный инструмент от Google для Android-разработки через терминал. Он создан специально для AI-агентов, CI/CD и автоматизации. Позволяет управлять SDK, создавать проекты, запускать эмуляторы и собирать APK без необходимости вручную разбираться с `sdkmanager`, `adb` и Gradle. + +## Установка и обновление + +```bash +# Установка (выполняется ai-setup.sh) +curl -fsSL https://dl.google.com/android/cli/latest/linux_x86_64/install.sh | bash + +# Обновление +android update +``` + +## Ключевые команды + +| Команда | Назначение | +|---------|------------| +| `android --version` | Версия Android CLI | +| `android info` | Информация об SDK, путях, эмуляторах | +| `android sdk list` | Список доступных SDK-пакетов | +| `android sdk install ` | Установить пакет SDK | +| `android create --name="App" --output=./app` | Создать новый Android-проект | +| `android emulator create` | Создать виртуальное устройство | +| `android emulator start` | Запустить эмулятор | +| `android run --apks ` | Установить и запустить APK на устройстве/эмуляторе | +| `android init` | Развернуть skills для AI-агентов в `~/.claude/skills/` | +| `android update` | Обновить сам Android CLI | + +## Workflow с Claude Code + +1. **Проверь окружение**: + ```bash + android info + ``` + +2. **Установи нужные SDK-компоненты**: + ```bash + android sdk install platforms/android-35 build-tools/35.0.0 + ``` + +3. **Создай проект** (если нужен новый): + ```bash + android create --name="MyApp" --output=./myapp + ``` + +4. **Собери проект**: + ```bash + ./gradlew assembleDebug + ``` + +5. **Запусти на эмуляторе или устройстве**: + ```bash + android emulator start + android run --apks app/build/outputs/apk/debug/app-debug.apk + ``` + +## Когда использовать Android CLI + +- Для управления SDK и установки build-tools/platforms без Android Studio. +- Для создания новых Android-проектов из терминала. +- Для запуска эмулятора и установки APK одной командой. +- Для работы в CI/CD или внутри AI-агентов. + +## Когда НЕ нужен Android CLI + +- Для визуального редактирования UI/Layout - используй Android Studio. +- Для отладки с breakpoints, Layout Inspector, Compose Preview - используй Android Studio. +- Для сложного рефакторинга больших проектов - используй Claude Code в паре с Android Studio. + +## Ограничения + +- **Preview-версия**: API и команды могут меняться. Обновляй через `android update`. +- **Windows**: `android emulator` отключён в v0.7. +- **Существующий SDK**: если уже установлен Android Studio или `sdkmanager`, Android CLI может использовать тот же SDK или создать новый в `~/.android/sdk`. Проверяй активный путь через `android info`. +- **Прокси**: Android CLI - нативный бинарь, который спавнит дочерние процессы (emulator, gradle, adb). Не оборачивай его в `proxychains4`, это может сломать child-процессы. + +## Полезные ссылки + +- Официальная документация: https://d.android.com/tools/agents +- Android CLI skills: https://github.com/android/skills diff --git a/scripts/ai-setup.sh b/scripts/ai-setup.sh index 71fd2b7..9dfa348 100755 --- a/scripts/ai-setup.sh +++ b/scripts/ai-setup.sh @@ -596,6 +596,56 @@ 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 + # ── 6. Папка для конфигов ──────────────────────────────────── mkdir -p "$CONFIG_DIR" @@ -1669,4 +1719,7 @@ echo " Нативные CLI:" echo -e " ${CYAN}ai-gpt${NC} - OpenAI Codex (нативный CLI, автоустановка)" echo -e " ${CYAN}ai-gemini${NC} - Gemini (нативный agy CLI, автоустановка)" echo "" +echo " Android CLI:" +echo -e " ${CYAN}android${NC} - Google Android CLI (SDK, эмулятор, проекты)" +echo "" echo -e "Чтобы команды были доступны сразу, выполните: ${GREEN}exec bash${NC}" diff --git a/setup.sh b/setup.sh index 4f4d1e7..ba47d11 100755 --- a/setup.sh +++ b/setup.sh @@ -14,7 +14,7 @@ _log() { printf '%s [%s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$1" "$2" >> "$LOG if command -v whiptail >/dev/null 2>&1; then choice=$(whiptail --title "AI Setup" \ - --menu "Выбери действие (стрелки + Enter):" 22 70 9 \ + --menu "Выбери действие (стрелки + Enter):" 24 70 10 \ "1" "AI-инструменты (установить лаунчеры + ключи)" \ "2" "Сеть: ru-bypass + kill switch" \ "" "─── Дополнительно ───────────────────────────" \ @@ -23,6 +23,7 @@ if command -v whiptail >/dev/null 2>&1; then "5" "Статус (Amnezia, UFW, AI инструменты, ключи)" \ "6" "Проверить сеть (маршрутизация, geo)" \ "7" "Обновить (git pull + перегенерация скриптов)" \ + "8" "Android CLI (установить Google Android CLI)" \ 3>&1 1>&2 2>&3) || exit 0 echo "" else @@ -58,7 +59,10 @@ else echo -e " ${BLD}7) Обновить${CLR}" echo -e " ${GRY}git pull + перегенерация всех скриптов в ~/bin (или ~/.local/bin).${CLR}" echo "" - echo -n "Выбери [1-7] или Enter для выхода: " + echo -e " ${BLD}8) Android CLI${CLR}" + echo -e " ${GRY}Установить Google Android CLI для Android-разработки.${CLR}" + echo "" + echo -n "Выбери [1-8] или Enter для выхода: " read -r choice echo "" fi @@ -169,7 +173,7 @@ case "$choice" in echo "" echo -e "${BLD}AI инструменты:${CLR}" - for cmd in ai-claude ai-gpt ai-deepseek ai-kimi ai-openrouter ai-gemini; do + for cmd in ai-claude ai-gpt ai-deepseek ai-kimi ai-openrouter ai-gemini android; do if command -v "$cmd" &>/dev/null; then echo -e " ${GRN}✓${CLR} $cmd" else @@ -221,6 +225,9 @@ case "$choice" in echo -e "${BLD}Перегенерация скриптов...${CLR}" bash "$REPO_DIR/scripts/ai-setup.sh" ;; + 8) + bash scripts/ai-setup.sh + ;; "") exit 0 ;; diff --git a/tests/test_fixes.sh b/tests/test_fixes.sh index 4ecda4e..025e815 100755 --- a/tests/test_fixes.sh +++ b/tests/test_fixes.sh @@ -127,6 +127,48 @@ test_script_syntax() { fi } +# ── Android CLI: install block exists ───────────────────────────────────── +test_android_cli_install_url() { + if grep -q 'dl.google.com/android/cli/latest' "$SCRIPT"; then + ok "android-cli: install URL for Android CLI is present" + else + fail "android-cli: missing install URL for Android CLI" + fi +} + +test_android_init_called() { + if grep -q 'android init' "$SCRIPT"; then + ok "android-cli: android init is invoked after install" + else + fail "android-cli: missing android init invocation" + fi +} + +test_android_symlink_to_bin_dir() { + if grep -q 'ln -sf "$HOME/.local/bin/android" "$BIN_DIR/android"' "$SCRIPT"; then + ok "android-cli: symlink to BIN_DIR is handled" + else + fail "android-cli: missing symlink to BIN_DIR" + fi +} + +test_no_proxychains_for_android() { + if grep -q 'proxychains4.*android' "$SCRIPT"; then + fail "android-cli: should not be wrapped in proxychains4 (breaks child processes)" + else + ok "android-cli: not wrapped in proxychains4" + fi +} + +test_android_skill_exists() { + skill_file="$(cd "$(dirname "$0")/.." && pwd)/home-configs/claude/skills/android-cli/SKILL.md" + if [ -f "$skill_file" ]; then + ok "android-cli: custom skill file exists" + else + fail "android-cli: custom skill file is missing" + fi +} + # ── run all tests ───────────────────────────────────────────────────────────── test_script_syntax test_gpt_autoinstall @@ -138,6 +180,11 @@ test_gemini_native_launcher test_global_rules_include_quality_guidelines test_native_rule_files_generated test_fix7_trap_tmp +test_android_cli_install_url +test_android_init_called +test_android_symlink_to_bin_dir +test_no_proxychains_for_android +test_android_skill_exists echo "" echo "Results: $PASS passed, $FAIL failed"