#!/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 info "Готово!"