diff --git a/.antigravitycli/ddb5132f-9552-4463-8aa2-f1eb9e72335f.json b/.antigravitycli/ddb5132f-9552-4463-8aa2-f1eb9e72335f.json new file mode 120000 index 0000000..6969652 --- /dev/null +++ b/.antigravitycli/ddb5132f-9552-4463-8aa2-f1eb9e72335f.json @@ -0,0 +1 @@ +/home/vitaly/.gemini/config/projects/ddb5132f-9552-4463-8aa2-f1eb9e72335f.json \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md index b5df837..81daee0 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -4,7 +4,7 @@ 1. **Никаких самостоятельных коммитов (No unauthorized commits):** ЗАПРЕЩЕНО выполнять команду `git commit`, если пользователь прямо и недвусмысленно не попросил об этом. Финальный коммит делает пользователь или вы — строго по его команде. -2. **Полная перегенерация standalone-скриптов при запуске сетап-скрипта (Full regeneration of standalone scripts on setup run):** При каждом запуске `claude_setup.sh` все генерируемые скрипты в `~/.local/bin/` (`claude_gpt`, `claude_deepseek`, `claude_kimi`, `claude_gemini`, `claude_api_helpers.sh`) должны быть **полностью перезаписаны** актуальными версиями. Запрещено выполнять слияние (merge) старого и нового содержимого или дополнение (append). Скрипт обязан привести все генерируемые файлы к эталонному виду, однозначно определяемому текущей конфигурацией. +2. **Полная перегенерация standalone-скриптов при запуске сетап-скрипта (Full regeneration of standalone scripts on setup run):** При каждом запуске `ai-setup.sh` все генерируемые скрипты в `~/.local/bin/` (`ai-gpt`, `ai-deepseek`, `ai-kimi`, `ai-gemini`, `ai-api-helpers.sh`, `ai-claude`) должны быть **полностью перезаписаны** актуальными версиями. Запрещено выполнять слияние (merge) старого и нового содержимого или дополнение (append). Скрипт обязан привести все генерируемые файлы к эталонному виду, однозначно определяемому текущей конфигурацией. 3. **Изменения должны быть видны через `git diff` (Changes must be visible via plain git diff):** Оставляйте изменённые файлы в рабочей директории (unstaged), чтобы пользователь мог увидеть их, просто написав `git diff` в консоли. Не добавляйте их в индекс (`git add`) без прямой команды, так как это скрывает изменения от стандартной команды `git diff`. diff --git a/Dockerfile.test b/Dockerfile.test index 7764cd9..f172992 100644 --- a/Dockerfile.test +++ b/Dockerfile.test @@ -29,4 +29,4 @@ WORKDIR /home/tester COPY --chown=tester:tester . /home/tester/project/ # Run setup script -CMD ["bash", "/home/tester/project/claude_setup.sh"] +CMD ["bash", "/home/tester/project/ai-setup.sh"] diff --git a/README.md b/README.md index a0bdcff..1d99649 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Claude Code Launcher -Скрипт `claude_setup.sh` предназначен для автоматизации установки и настройки `Claude Code` вместе с прокси-серверами для доступа к различным LLM (Anthropic, ChatGPT, DeepSeek, Kimi, Gemini). +Скрипт `ai-setup.sh` предназначен для автоматизации установки и настройки `Claude Code` вместе с прокси-серверами для доступа к различным LLM (Anthropic, ChatGPT, DeepSeek, Kimi, Gemini). ## Что делает скрипт @@ -17,18 +17,19 @@ ## Использование -После выполнения скрипта необходимо применить изменения: +После выполнения скрипта откройте новый терминал или выполните: ```bash -source ~/.bashrc +exec bash ``` ### Доступные команды запуска -* `claude_gpt`: Запуск нативного OpenAI Codex (автоустановка при первом запуске). -* `claude_deepseek`: Доступ к DeepSeek (требуется API ключ). -* `claude_kimi`: Запуск нативного Kimi K2.6 (автоустановка при первом запуске). -* `claude_gemini`: Доступ к Gemini (требует авторизации через веб-интерфейс `antigravity-claude-proxy`). +* `ai-claude`: Запуск оригинального Claude Code (Anthropic). +* `ai-gpt`: Запуск нативного OpenAI Codex (автоустановка при первом запуске). +* `ai-deepseek`: Доступ к DeepSeek (требуется API ключ). +* `ai-kimi`: Запуск нативного Kimi K2.6 (автоустановка при первом запуске). +* `ai-gemini`: Запуск нативного Antigravity CLI / agy (автоустановка при первом запуске). ## Важные замечания diff --git a/claude_setup.sh b/ai-setup.sh similarity index 98% rename from claude_setup.sh rename to ai-setup.sh index 4bc7f40..19feae2 100755 --- a/claude_setup.sh +++ b/ai-setup.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash # ============================================================ # Claude Code Setup — GPT-5.5 / DeepSeek / Kimi / Gemini -# Запуск: bash claude_setup.sh +# Запуск: bash ai-setup.sh # ============================================================ CONFIG_DIR="$HOME/.config/claude-launcher" @@ -18,7 +18,7 @@ err() { echo -e "${RED}[ERR]${NC} $*"; exit 1; } # Запрет запуска от root if [ "$EUID" -eq 0 ]; then echo -e "${RED}Не запускайте этот скрипт через sudo!${NC}" - echo "Запустите просто: bash claude_setup.sh" + echo "Запустите просто: bash ai-setup.sh" exit 1 fi @@ -556,7 +556,7 @@ CLAUDEEOF chmod +x "$BIN_DIR/ai-claude" info "Удаляю старые версии скриптов (claude_*)..." -rm -f "$BIN_DIR/claude_gpt" "$BIN_DIR/claude_deepseek" "$BIN_DIR/claude_kimi" "$BIN_DIR/claude_gemini" "$BIN_DIR/claude_api_helpers.sh" +rm -f "$BIN_DIR/ai-gpt" "$BIN_DIR/claude_deepseek" "$BIN_DIR/ai-kimi" "$BIN_DIR/claude_gemini" "$BIN_DIR/claude_api_helpers.sh" success "Скрипты сгенерированы." diff --git a/test_isolated.sh b/test_isolated.sh index 9b657dd..1868c1e 100644 --- a/test_isolated.sh +++ b/test_isolated.sh @@ -7,21 +7,21 @@ set -euo pipefail TMPDIR=$(mktemp -d) trap 'rm -rf "$TMPDIR"' EXIT -# Генерируем скрипты из claude_setup.sh в изолированную директорию +# Генерируем скрипты из ai-setup.sh в изолированную директорию BIN_DIR="$TMPDIR/bin" mkdir -p "$BIN_DIR" -# Извлекаем claude_gpt -awk '/^cat > "\$BIN_DIR\/claude_gpt"/,/^GPTEOF/' claude_setup.sh | \ +# Извлекаем ai-gpt +awk '/^cat > "\$BIN_DIR\/ai-gpt"/,/^GPTEOF/' ai-setup.sh | \ sed "s|\\\$BIN_DIR|$BIN_DIR|g" | bash -chmod +x "$BIN_DIR/claude_gpt" +chmod +x "$BIN_DIR/ai-gpt" -# Извлекаем claude_kimi -awk '/^cat > "\$BIN_DIR\/claude_kimi"/,/^KIMIEOF/' claude_setup.sh | \ +# Извлекаем ai-kimi +awk '/^cat > "\$BIN_DIR\/ai-kimi"/,/^KIMIEOF/' ai-setup.sh | \ sed "s|\\\$BIN_DIR|$BIN_DIR|g" | bash -chmod +x "$BIN_DIR/claude_kimi" +chmod +x "$BIN_DIR/ai-kimi" -echo "=== Test 1: claude_gpt calls codex install URL when missing ===" +echo "=== Test 1: ai-gpt calls codex install URL when missing ===" MOCK_LOG="$TMPDIR/mock_curl.log" # Создаём mock curl, который логирует вызовы @@ -38,20 +38,20 @@ fi CURLEOF chmod +x "$TMPDIR/curl" -# Запускаем claude_gpt с mock curl (чистый PATH, без системного codex) -HOME="$TMPDIR" PATH="$TMPDIR:/usr/bin:/bin" "$BIN_DIR/claude_gpt" --version 2>&1 || true +# Запускаем ai-gpt с mock curl (чистый PATH, без системного codex) +HOME="$TMPDIR" PATH="$TMPDIR:/usr/bin:/bin" "$BIN_DIR/ai-gpt" --version 2>&1 || true if grep -q "chatgpt.com/codex/install.sh" "$MOCK_LOG"; then - echo "[PASS] claude_gpt вызвал установку Codex" + echo "[PASS] ai-gpt вызвал установку Codex" else - echo "[FAIL] claude_gpt НЕ вызвал установку Codex" + echo "[FAIL] ai-gpt НЕ вызвал установку Codex" echo "curl log:" cat "$MOCK_LOG" 2>/dev/null || echo "(пусто)" exit 1 fi echo "" -echo "=== Test 2: claude_kimi calls kimi install URL when missing ===" +echo "=== Test 2: ai-kimi calls kimi install URL when missing ===" MOCK_LOG="$TMPDIR/mock_curl2.log" cat > "$TMPDIR/curl" << CURLEOF @@ -66,12 +66,12 @@ fi CURLEOF chmod +x "$TMPDIR/curl" -HOME="$TMPDIR" PATH="$TMPDIR:/usr/bin:/bin" "$BIN_DIR/claude_kimi" --version 2>&1 || true +HOME="$TMPDIR" PATH="$TMPDIR:/usr/bin:/bin" "$BIN_DIR/ai-kimi" --version 2>&1 || true if grep -q "code.kimi.com/kimi-code/install.sh" "$MOCK_LOG"; then - echo "[PASS] claude_kimi вызвал установку Kimi" + echo "[PASS] ai-kimi вызвал установку Kimi" else - echo "[FAIL] claude_kimi НЕ вызвал установку Kimi" + echo "[FAIL] ai-kimi НЕ вызвал установку Kimi" echo "curl log:" cat "$MOCK_LOG" 2>/dev/null || echo "(пусто)" exit 1 diff --git a/tests/test_fixes.sh b/tests/test_fixes.sh index 2063b52..6409c34 100755 --- a/tests/test_fixes.sh +++ b/tests/test_fixes.sh @@ -1,53 +1,53 @@ #!/usr/bin/env bash -# tests/test_fixes.sh — unit tests for code-review fixes in claude_setup.sh +# tests/test_fixes.sh — unit tests for code-review fixes in ai-setup.sh # Run: bash tests/test_fixes.sh set -euo pipefail -SCRIPT="$(cd "$(dirname "$0")/.." && pwd)/claude_setup.sh" +SCRIPT="$(cd "$(dirname "$0")/.." && pwd)/ai-setup.sh" PASS=0; FAIL=0 ok() { echo "[PASS] $1"; PASS=$((PASS+1)); } fail() { echo "[FAIL] $1"; FAIL=$((FAIL+1)); } # Extract sections -GPT_SECTION=$(awk '/^cat > "\$BIN_DIR\/claude_gpt"/,/^GPTEOF/' "$SCRIPT") -KIMI_SECTION=$(awk '/^cat > "\$BIN_DIR\/claude_kimi"/,/^KIMIEOF/' "$SCRIPT") +GPT_SECTION=$(awk '/^cat > "\$BIN_DIR\/ai-gpt"/,/^GPTEOF/' "$SCRIPT") +KIMI_SECTION=$(awk '/^cat > "\$BIN_DIR\/ai-kimi"/,/^KIMIEOF/' "$SCRIPT") GEMINI_SECTION=$(awk '/^cat > "\$BIN_DIR\/claude_gemini"/,/^GEMINIEOF/' "$SCRIPT") -# ── claude_gpt: auto-install codex ──────────────────────────────────────────── +# ── ai-gpt: auto-install codex ──────────────────────────────────────────── test_gpt_autoinstall() { if echo "$GPT_SECTION" | grep -q 'curl -fsSL https://chatgpt.com/codex/install.sh'; then - ok "claude_gpt: auto-installs codex via official install script" + ok "ai-gpt: auto-installs codex via official install script" else - fail "claude_gpt: missing codex auto-install" + fail "ai-gpt: missing codex auto-install" fi } -# ── claude_gpt: no proxy logic (simplified launcher) ────────────────────────── +# ── ai-gpt: no proxy logic (simplified launcher) ────────────────────────── test_gpt_no_proxy() { if echo "$GPT_SECTION" | grep -q 'ANTHROPIC_BASE_URL'; then - fail "claude_gpt: still contains proxy logic (ANTHROPIC_BASE_URL)" + fail "ai-gpt: still contains proxy logic (ANTHROPIC_BASE_URL)" else - ok "claude_gpt: proxy logic removed (no ANTHROPIC_BASE_URL)" + ok "ai-gpt: proxy logic removed (no ANTHROPIC_BASE_URL)" fi } -# ── claude_kimi: auto-install kimi ──────────────────────────────────────────── +# ── ai-kimi: auto-install kimi ──────────────────────────────────────────── test_kimi_autoinstall() { if echo "$KIMI_SECTION" | grep -q 'curl -fsSL https://code.kimi.com/kimi-code/install.sh'; then - ok "claude_kimi: auto-installs kimi via official install script" + ok "ai-kimi: auto-installs kimi via official install script" else - fail "claude_kimi: missing kimi auto-install" + fail "ai-kimi: missing kimi auto-install" fi } -# ── claude_kimi: no proxy logic (simplified launcher) ───────────────────────── +# ── ai-kimi: no proxy logic (simplified launcher) ───────────────────────── test_kimi_no_proxy() { if echo "$KIMI_SECTION" | grep -q 'ANTHROPIC_BASE_URL'; then - fail "claude_kimi: still contains proxy logic (ANTHROPIC_BASE_URL)" + fail "ai-kimi: still contains proxy logic (ANTHROPIC_BASE_URL)" else - ok "claude_kimi: proxy logic removed (no ANTHROPIC_BASE_URL)" + ok "ai-kimi: proxy logic removed (no ANTHROPIC_BASE_URL)" fi } @@ -74,9 +74,9 @@ test_fix7_trap_tmp() { # ── bash syntax of the whole script ───────────────────────────────────────── test_script_syntax() { if bash -n "$SCRIPT" 2>&1; then - ok "syntax: claude_setup.sh passes 'bash -n'" + ok "syntax: ai-setup.sh passes 'bash -n'" else - fail "syntax: claude_setup.sh has syntax errors" + fail "syntax: ai-setup.sh has syntax errors" fi }