#!/usr/bin/env bash set -euo pipefail DOTFILES_DIR="$(cd "$(dirname "$0")" && pwd)" # --- Цвета --- RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' info() { echo -e "${GREEN}[+]${NC} $*"; } warn() { echo -e "${YELLOW}[!]${NC} $*"; } error() { echo -e "${RED}[✗]${NC} $*"; } # --- Проверка stow --- if ! command -v stow &>/dev/null; then error "stow не найден. Установите: sudo apt install stow" exit 1 fi # --- Stow пакеты --- PACKAGES=(bash tmux vim zed vscode agents opencode codex claude gemini) info "Применяю stow пакеты..." cd "$DOTFILES_DIR" for pkg in "${PACKAGES[@]}"; do if [ -d "$pkg" ]; then stow -v --restow "$pkg" 2>&1 | sed "s/^/ /" else warn "Пакет $pkg не найден, пропускаю" fi done # --- Claude: settings.local.json --- CLAUDE_LOCAL="$HOME/.claude/settings.local.json" if [ ! -f "$CLAUDE_LOCAL" ]; then info "Создаю $CLAUDE_LOCAL (локальные настройки Claude)..." cat > "$CLAUDE_LOCAL" <<'EOF' { "model": "opus", "effortLevel": "high" } EOF else warn "$CLAUDE_LOCAL уже существует, пропускаю" fi # --- Claude: защита settings.json от перезаписи --- CLAUDE_SETTINGS="$DOTFILES_DIR/claude/.claude/settings.json" if [ -f "$CLAUDE_SETTINGS" ]; then chmod 444 "$CLAUDE_SETTINGS" info "settings.json защищён от записи (chmod 444)" fi # --- Bash: подключение в .bashrc --- BASHRC="$HOME/.bashrc" BASHRC_LINE='[ -f ~/.bash_custom ] && source ~/.bash_custom' if grep -q 'bash_custom' "$BASHRC" 2>/dev/null; then warn "~/.bashrc уже содержит bash_custom, пропускаю" else echo "" >> "$BASHRC" echo "# dotfiles" >> "$BASHRC" echo "$BASHRC_LINE" >> "$BASHRC" info "Добавлено в ~/.bashrc: $BASHRC_LINE" fi # --- WSL: hproxy.local (автоматический резолв при старте) --- if [ -n "${WSL_DISTRO_NAME:-}" ]; then HPROXY_SCRIPT="$DOTFILES_DIR/scripts/setup-hproxy.sh" if grep -q "hproxy.local" /etc/wsl.conf 2>/dev/null; then warn "/etc/wsl.conf уже содержит hproxy.local, пропускаю" else echo "" info "Обнаружен WSL. Скрипт $HPROXY_SCRIPT может автоматически" info "прописывать hproxy.local в /etc/hosts при каждом старте WSL (NAT mode)." echo -ne "${YELLOW}[?]${NC} Добавить boot command в /etc/wsl.conf? [y/N] " read -r answer if [[ "$answer" =~ ^[Yy]$ ]]; then # Добавляем [boot] секцию, если её нет if ! grep -q '^\[boot\]' /etc/wsl.conf 2>/dev/null; then printf '\n[boot]\n' | sudo tee -a /etc/wsl.conf > /dev/null fi sudo sed -i "/^\[boot\]/a command = \"$HPROXY_SCRIPT\"" /etc/wsl.conf info "Добавлено в /etc/wsl.conf. Перезапустите WSL: wsl --shutdown" else warn "Пропущено. Можно настроить вручную — см. README.md" fi fi fi info "Готово!"