Refactor: rename setup script to ai-setup.sh and update all references
This commit is contained in:
1
.antigravitycli/ddb5132f-9552-4463-8aa2-f1eb9e72335f.json
Symbolic link
1
.antigravitycli/ddb5132f-9552-4463-8aa2-f1eb9e72335f.json
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
/home/vitaly/.gemini/config/projects/ddb5132f-9552-4463-8aa2-f1eb9e72335f.json
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
1. **Никаких самостоятельных коммитов (No unauthorized commits):** ЗАПРЕЩЕНО выполнять команду `git commit`, если пользователь прямо и недвусмысленно не попросил об этом. Финальный коммит делает пользователь или вы — строго по его команде.
|
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`.
|
3. **Изменения должны быть видны через `git diff` (Changes must be visible via plain git diff):** Оставляйте изменённые файлы в рабочей директории (unstaged), чтобы пользователь мог увидеть их, просто написав `git diff` в консоли. Не добавляйте их в индекс (`git add`) без прямой команды, так как это скрывает изменения от стандартной команды `git diff`.
|
||||||
|
|
||||||
|
|||||||
@@ -29,4 +29,4 @@ WORKDIR /home/tester
|
|||||||
COPY --chown=tester:tester . /home/tester/project/
|
COPY --chown=tester:tester . /home/tester/project/
|
||||||
|
|
||||||
# Run setup script
|
# Run setup script
|
||||||
CMD ["bash", "/home/tester/project/claude_setup.sh"]
|
CMD ["bash", "/home/tester/project/ai-setup.sh"]
|
||||||
|
|||||||
15
README.md
15
README.md
@@ -1,6 +1,6 @@
|
|||||||
# Claude Code Launcher
|
# 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
|
```bash
|
||||||
source ~/.bashrc
|
exec bash
|
||||||
```
|
```
|
||||||
|
|
||||||
### Доступные команды запуска
|
### Доступные команды запуска
|
||||||
|
|
||||||
* `claude_gpt`: Запуск нативного OpenAI Codex (автоустановка при первом запуске).
|
* `ai-claude`: Запуск оригинального Claude Code (Anthropic).
|
||||||
* `claude_deepseek`: Доступ к DeepSeek (требуется API ключ).
|
* `ai-gpt`: Запуск нативного OpenAI Codex (автоустановка при первом запуске).
|
||||||
* `claude_kimi`: Запуск нативного Kimi K2.6 (автоустановка при первом запуске).
|
* `ai-deepseek`: Доступ к DeepSeek (требуется API ключ).
|
||||||
* `claude_gemini`: Доступ к Gemini (требует авторизации через веб-интерфейс `antigravity-claude-proxy`).
|
* `ai-kimi`: Запуск нативного Kimi K2.6 (автоустановка при первом запуске).
|
||||||
|
* `ai-gemini`: Запуск нативного Antigravity CLI / agy (автоустановка при первом запуске).
|
||||||
|
|
||||||
## Важные замечания
|
## Важные замечания
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# ============================================================
|
# ============================================================
|
||||||
# Claude Code Setup — GPT-5.5 / DeepSeek / Kimi / Gemini
|
# Claude Code Setup — GPT-5.5 / DeepSeek / Kimi / Gemini
|
||||||
# Запуск: bash claude_setup.sh
|
# Запуск: bash ai-setup.sh
|
||||||
# ============================================================
|
# ============================================================
|
||||||
|
|
||||||
CONFIG_DIR="$HOME/.config/claude-launcher"
|
CONFIG_DIR="$HOME/.config/claude-launcher"
|
||||||
@@ -18,7 +18,7 @@ err() { echo -e "${RED}[ERR]${NC} $*"; exit 1; }
|
|||||||
# Запрет запуска от root
|
# Запрет запуска от root
|
||||||
if [ "$EUID" -eq 0 ]; then
|
if [ "$EUID" -eq 0 ]; then
|
||||||
echo -e "${RED}Не запускайте этот скрипт через sudo!${NC}"
|
echo -e "${RED}Не запускайте этот скрипт через sudo!${NC}"
|
||||||
echo "Запустите просто: bash claude_setup.sh"
|
echo "Запустите просто: bash ai-setup.sh"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -556,7 +556,7 @@ CLAUDEEOF
|
|||||||
chmod +x "$BIN_DIR/ai-claude"
|
chmod +x "$BIN_DIR/ai-claude"
|
||||||
|
|
||||||
info "Удаляю старые версии скриптов (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 "Скрипты сгенерированы."
|
success "Скрипты сгенерированы."
|
||||||
|
|
||||||
@@ -7,21 +7,21 @@ set -euo pipefail
|
|||||||
TMPDIR=$(mktemp -d)
|
TMPDIR=$(mktemp -d)
|
||||||
trap 'rm -rf "$TMPDIR"' EXIT
|
trap 'rm -rf "$TMPDIR"' EXIT
|
||||||
|
|
||||||
# Генерируем скрипты из claude_setup.sh в изолированную директорию
|
# Генерируем скрипты из ai-setup.sh в изолированную директорию
|
||||||
BIN_DIR="$TMPDIR/bin"
|
BIN_DIR="$TMPDIR/bin"
|
||||||
mkdir -p "$BIN_DIR"
|
mkdir -p "$BIN_DIR"
|
||||||
|
|
||||||
# Извлекаем claude_gpt
|
# Извлекаем ai-gpt
|
||||||
awk '/^cat > "\$BIN_DIR\/claude_gpt"/,/^GPTEOF/' claude_setup.sh | \
|
awk '/^cat > "\$BIN_DIR\/ai-gpt"/,/^GPTEOF/' ai-setup.sh | \
|
||||||
sed "s|\\\$BIN_DIR|$BIN_DIR|g" | bash
|
sed "s|\\\$BIN_DIR|$BIN_DIR|g" | bash
|
||||||
chmod +x "$BIN_DIR/claude_gpt"
|
chmod +x "$BIN_DIR/ai-gpt"
|
||||||
|
|
||||||
# Извлекаем claude_kimi
|
# Извлекаем ai-kimi
|
||||||
awk '/^cat > "\$BIN_DIR\/claude_kimi"/,/^KIMIEOF/' claude_setup.sh | \
|
awk '/^cat > "\$BIN_DIR\/ai-kimi"/,/^KIMIEOF/' ai-setup.sh | \
|
||||||
sed "s|\\\$BIN_DIR|$BIN_DIR|g" | bash
|
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_LOG="$TMPDIR/mock_curl.log"
|
||||||
|
|
||||||
# Создаём mock curl, который логирует вызовы
|
# Создаём mock curl, который логирует вызовы
|
||||||
@@ -38,20 +38,20 @@ fi
|
|||||||
CURLEOF
|
CURLEOF
|
||||||
chmod +x "$TMPDIR/curl"
|
chmod +x "$TMPDIR/curl"
|
||||||
|
|
||||||
# Запускаем claude_gpt с mock curl (чистый PATH, без системного codex)
|
# Запускаем ai-gpt с mock curl (чистый PATH, без системного codex)
|
||||||
HOME="$TMPDIR" PATH="$TMPDIR:/usr/bin:/bin" "$BIN_DIR/claude_gpt" --version 2>&1 || true
|
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
|
if grep -q "chatgpt.com/codex/install.sh" "$MOCK_LOG"; then
|
||||||
echo "[PASS] claude_gpt вызвал установку Codex"
|
echo "[PASS] ai-gpt вызвал установку Codex"
|
||||||
else
|
else
|
||||||
echo "[FAIL] claude_gpt НЕ вызвал установку Codex"
|
echo "[FAIL] ai-gpt НЕ вызвал установку Codex"
|
||||||
echo "curl log:"
|
echo "curl log:"
|
||||||
cat "$MOCK_LOG" 2>/dev/null || echo "(пусто)"
|
cat "$MOCK_LOG" 2>/dev/null || echo "(пусто)"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo ""
|
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"
|
MOCK_LOG="$TMPDIR/mock_curl2.log"
|
||||||
|
|
||||||
cat > "$TMPDIR/curl" << CURLEOF
|
cat > "$TMPDIR/curl" << CURLEOF
|
||||||
@@ -66,12 +66,12 @@ fi
|
|||||||
CURLEOF
|
CURLEOF
|
||||||
chmod +x "$TMPDIR/curl"
|
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
|
if grep -q "code.kimi.com/kimi-code/install.sh" "$MOCK_LOG"; then
|
||||||
echo "[PASS] claude_kimi вызвал установку Kimi"
|
echo "[PASS] ai-kimi вызвал установку Kimi"
|
||||||
else
|
else
|
||||||
echo "[FAIL] claude_kimi НЕ вызвал установку Kimi"
|
echo "[FAIL] ai-kimi НЕ вызвал установку Kimi"
|
||||||
echo "curl log:"
|
echo "curl log:"
|
||||||
cat "$MOCK_LOG" 2>/dev/null || echo "(пусто)"
|
cat "$MOCK_LOG" 2>/dev/null || echo "(пусто)"
|
||||||
exit 1
|
exit 1
|
||||||
|
|||||||
@@ -1,53 +1,53 @@
|
|||||||
#!/usr/bin/env bash
|
#!/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
|
# Run: bash tests/test_fixes.sh
|
||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
SCRIPT="$(cd "$(dirname "$0")/.." && pwd)/claude_setup.sh"
|
SCRIPT="$(cd "$(dirname "$0")/.." && pwd)/ai-setup.sh"
|
||||||
PASS=0; FAIL=0
|
PASS=0; FAIL=0
|
||||||
|
|
||||||
ok() { echo "[PASS] $1"; PASS=$((PASS+1)); }
|
ok() { echo "[PASS] $1"; PASS=$((PASS+1)); }
|
||||||
fail() { echo "[FAIL] $1"; FAIL=$((FAIL+1)); }
|
fail() { echo "[FAIL] $1"; FAIL=$((FAIL+1)); }
|
||||||
|
|
||||||
# Extract sections
|
# Extract sections
|
||||||
GPT_SECTION=$(awk '/^cat > "\$BIN_DIR\/claude_gpt"/,/^GPTEOF/' "$SCRIPT")
|
GPT_SECTION=$(awk '/^cat > "\$BIN_DIR\/ai-gpt"/,/^GPTEOF/' "$SCRIPT")
|
||||||
KIMI_SECTION=$(awk '/^cat > "\$BIN_DIR\/claude_kimi"/,/^KIMIEOF/' "$SCRIPT")
|
KIMI_SECTION=$(awk '/^cat > "\$BIN_DIR\/ai-kimi"/,/^KIMIEOF/' "$SCRIPT")
|
||||||
GEMINI_SECTION=$(awk '/^cat > "\$BIN_DIR\/claude_gemini"/,/^GEMINIEOF/' "$SCRIPT")
|
GEMINI_SECTION=$(awk '/^cat > "\$BIN_DIR\/claude_gemini"/,/^GEMINIEOF/' "$SCRIPT")
|
||||||
|
|
||||||
# ── claude_gpt: auto-install codex ────────────────────────────────────────────
|
# ── ai-gpt: auto-install codex ────────────────────────────────────────────
|
||||||
test_gpt_autoinstall() {
|
test_gpt_autoinstall() {
|
||||||
if echo "$GPT_SECTION" | grep -q 'curl -fsSL https://chatgpt.com/codex/install.sh'; then
|
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
|
else
|
||||||
fail "claude_gpt: missing codex auto-install"
|
fail "ai-gpt: missing codex auto-install"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# ── claude_gpt: no proxy logic (simplified launcher) ──────────────────────────
|
# ── ai-gpt: no proxy logic (simplified launcher) ──────────────────────────
|
||||||
test_gpt_no_proxy() {
|
test_gpt_no_proxy() {
|
||||||
if echo "$GPT_SECTION" | grep -q 'ANTHROPIC_BASE_URL'; then
|
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
|
else
|
||||||
ok "claude_gpt: proxy logic removed (no ANTHROPIC_BASE_URL)"
|
ok "ai-gpt: proxy logic removed (no ANTHROPIC_BASE_URL)"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# ── claude_kimi: auto-install kimi ────────────────────────────────────────────
|
# ── ai-kimi: auto-install kimi ────────────────────────────────────────────
|
||||||
test_kimi_autoinstall() {
|
test_kimi_autoinstall() {
|
||||||
if echo "$KIMI_SECTION" | grep -q 'curl -fsSL https://code.kimi.com/kimi-code/install.sh'; then
|
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
|
else
|
||||||
fail "claude_kimi: missing kimi auto-install"
|
fail "ai-kimi: missing kimi auto-install"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# ── claude_kimi: no proxy logic (simplified launcher) ─────────────────────────
|
# ── ai-kimi: no proxy logic (simplified launcher) ─────────────────────────
|
||||||
test_kimi_no_proxy() {
|
test_kimi_no_proxy() {
|
||||||
if echo "$KIMI_SECTION" | grep -q 'ANTHROPIC_BASE_URL'; then
|
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
|
else
|
||||||
ok "claude_kimi: proxy logic removed (no ANTHROPIC_BASE_URL)"
|
ok "ai-kimi: proxy logic removed (no ANTHROPIC_BASE_URL)"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,9 +74,9 @@ test_fix7_trap_tmp() {
|
|||||||
# ── bash syntax of the whole script ─────────────────────────────────────────
|
# ── bash syntax of the whole script ─────────────────────────────────────────
|
||||||
test_script_syntax() {
|
test_script_syntax() {
|
||||||
if bash -n "$SCRIPT" 2>&1; then
|
if bash -n "$SCRIPT" 2>&1; then
|
||||||
ok "syntax: claude_setup.sh passes 'bash -n'"
|
ok "syntax: ai-setup.sh passes 'bash -n'"
|
||||||
else
|
else
|
||||||
fail "syntax: claude_setup.sh has syntax errors"
|
fail "syntax: ai-setup.sh has syntax errors"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user