feat: автоопределение BIN_DIR — ~/bin если есть в PATH, иначе ~/.local/bin

- BIN_DIR теперь определяется по наличию ~/bin в PATH (для Mint, где нет .bashrc)
- source путей в генерируемых скриптах заменены на self-referential (через BASH_SOURCE)
- agy_bin подменяется post-generation sed при нестандартном BIN_DIR
- add_path_to_rc() формирует PATH динамически с учётом BIN_DIR
- при миграции на ~/bin старые скрипты из ~/.local/bin удаляются

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Виталий Никитенко
2026-06-08 13:39:29 +03:00
parent cb8c3c9544
commit 4ae5ca149a
2 changed files with 28 additions and 12 deletions

View File

@@ -5,7 +5,12 @@
# ============================================================
CONFIG_DIR="$HOME/.config/ai-setup"
BIN_DIR="$HOME/.local/bin"
# Автоопределение: ~/bin если есть в PATH, иначе ~/.local/bin
if [[ ":$PATH:" == *":$HOME/bin:"* ]]; then
BIN_DIR="$HOME/bin"
else
BIN_DIR="$HOME/.local/bin"
fi
NPM_GLOBAL="$HOME/.npm-global"
PROXY_BIN="$BIN_DIR/claude-code-proxy"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
@@ -744,13 +749,14 @@ clean_rc "$HOME/.zshrc"
add_path_to_rc() {
local rc_file="$1"
local bin_rel="${BIN_DIR#$HOME/}"
if [ -f "$rc_file" ]; then
if ! grep -q 'NPM_GLOBAL' "$rc_file" 2>/dev/null; then
cat >> "$rc_file" << 'PATHEOF'
cat >> "$rc_file" << PATHEOF
# Claude Code Launcher PATH
export NPM_GLOBAL="$HOME/.npm-global"
export PATH="$NPM_GLOBAL/bin:$HOME/.local/bin:$PATH"
export NPM_GLOBAL="\$HOME/.npm-global"
export PATH="\$NPM_GLOBAL/bin:\$HOME/${bin_rel}:\$PATH"
PATHEOF
success "PATH добавлен в $rc_file"
fi
@@ -1027,7 +1033,7 @@ chmod +x "$HELPERS_FILE"
cat > "$BIN_DIR/ai-gpt" << 'GPTEOF'
#!/usr/bin/env bash
# ai-gpt - запуск нативного OpenAI Codex
source "$HOME/.local/bin/ai-api-helpers.sh" 2>/dev/null || true
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/ai-api-helpers.sh" 2>/dev/null || true
codex_bin="$HOME/.npm-global/bin/codex"
[ ! -f "$codex_bin" ] && codex_bin="$(command -v codex 2>/dev/null)"
@@ -1060,7 +1066,7 @@ chmod +x "$BIN_DIR/ai-gpt"
# === ai-deepseek ===
cat > "$BIN_DIR/ai-deepseek" << 'DEEPSEEKEOF'
#!/usr/bin/env bash
source "$HOME/.local/bin/ai-api-helpers.sh" 2>/dev/null || true
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/ai-api-helpers.sh" 2>/dev/null || true
key_file="$HOME/.config/ai-setup/deepseek_key"
api_key=""
@@ -1135,7 +1141,7 @@ chmod +x "$BIN_DIR/ai-deepseek"
cat > "$BIN_DIR/ai-kimi" << 'KIMIEOF'
#!/usr/bin/env bash
# ai-kimi - запуск Claude Code через официальный Kimi Code API
source "$HOME/.local/bin/ai-api-helpers.sh" 2>/dev/null || true
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/ai-api-helpers.sh" 2>/dev/null || true
key_file="$HOME/.config/ai-setup/kimi_key"
api_key=""
@@ -1207,7 +1213,7 @@ chmod +x "$BIN_DIR/ai-kimi"
cat > "$BIN_DIR/ai-openrouter" << 'OPENROUTEREOF'
#!/usr/bin/env bash
# ai-openrouter - запуск Claude Code через OpenRouter (любые модели)
source "$HOME/.local/bin/ai-api-helpers.sh" 2>/dev/null || true
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/ai-api-helpers.sh" 2>/dev/null || true
key_file="$HOME/.config/ai-setup/openrouter_key"
api_key=""
@@ -1297,19 +1303,21 @@ if [ -z "$agy_bin" ] || [ ! -f "$agy_bin" ]; then
exit 1
fi
source "$HOME/.local/bin/ai-api-helpers.sh" 2>/dev/null || true
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/ai-api-helpers.sh" 2>/dev/null || true
# agy нативно подтягивает правила и проектные .md файлы,
# поэтому ручная инъекция SYS_PROMPT больше не требуется.
exec "$agy_bin" --dangerously-skip-permissions "$@"
GEMINIEOF
chmod +x "$BIN_DIR/ai-gemini"
# Подменяем путь к agy, если BIN_DIR отличается от ~/.local/bin
[ "$BIN_DIR" != "$HOME/.local/bin" ] && sed -i "s|\$HOME/\.local/bin|\$HOME/${BIN_DIR#$HOME/}|g" "$BIN_DIR/ai-gemini"
# === ai-claude ===
cat > "$BIN_DIR/ai-claude" << 'CLAUDEEOF'
#!/usr/bin/env bash
# ai-claude - запуск оригинального Claude Code (Anthropic)
source "$HOME/.local/bin/ai-api-helpers.sh" 2>/dev/null || true
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/ai-api-helpers.sh" 2>/dev/null || true
_PROMPT_FILE=$(mktemp /tmp/ai-sys-prompt.XXXXXX)
trap 'rm -f "$_PROMPT_FILE"' EXIT INT TERM
_build_ai_sys_prompt > "$_PROMPT_FILE"
@@ -1332,6 +1340,14 @@ fi
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"
# Если переехали на ~/bin — удаляем старые скрипты из ~/.local/bin
if [ "$BIN_DIR" != "$HOME/.local/bin" ]; then
warn "BIN_DIR=$BIN_DIR — удаляю старые скрипты из ~/.local/bin/ ..."
rm -f "$HOME/.local/bin/ai-gpt" "$HOME/.local/bin/ai-deepseek" "$HOME/.local/bin/ai-kimi" \
"$HOME/.local/bin/ai-openrouter" "$HOME/.local/bin/ai-gemini" "$HOME/.local/bin/ai-claude" \
"$HOME/.local/bin/ai-api-helpers.sh" "$HOME/.local/bin/claude-gpt-effort-proxy.py"
fi
success "Скрипты сгенерированы."
# ── 9. Итог ──────────────────────────────────────────────────
@@ -1340,7 +1356,7 @@ echo -e "${GREEN}═════════════════════
echo -e "${GREEN} Установка завершена!${NC}"
echo -e "${GREEN}════════════════════════════════════════════════════${NC}"
echo ""
echo "Доступные команды (теперь это независимые скрипты в ~/.local/bin):"
echo "Доступные команды (теперь это независимые скрипты в ~/${BIN_DIR#$HOME/}):"
echo ""
echo " На базе Claude Code:"
echo -e " ${CYAN}ai-claude${NC} - Оригинальный Claude Code (Anthropic)"

View File

@@ -56,7 +56,7 @@ else
echo -e " ${GRY}Тесты маршрутизации: .ru напрямую, остальное через Amnezia.${CLR}"
echo ""
echo -e " ${BLD}7) Обновить${CLR}"
echo -e " ${GRY}git pull + перегенерация всех скриптов в ~/.local/bin.${CLR}"
echo -e " ${GRY}git pull + перегенерация всех скриптов в ~/bin (или ~/.local/bin).${CLR}"
echo ""
echo -n "Выбери [1-7] или Enter для выхода: "
read -r choice