#!/usr/bin/env bash # Rebuild nix-darwin + home-manager. Rotates stale home-manager *.backup files # so a second switch never fails with "would be clobbered". # Also upgrades grok-build and installs OpenCode 1.x (stable CLI for free-tier). set -euo pipefail DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)" ln -sfn "$DIR" ~/.dotfiles # Upgrade grok-build to latest (Homebrew cask). # Skip if Homebrew API is unreachable (DNS/network issues). echo "==> Upgrading grok-build..." if brew upgrade grok-build 2>&1; then echo "==> grok-build upgrade complete" else echo "==> WARNING: grok-build upgrade failed (network issue). Skipping." fi # Install OpenCode 1.x (stable CLI, binary "opencode") if absent. # Required for free-tier models; opencode2 beta returns HTTP 426 on those endpoints. # Uses Homebrew's npm (not Nix's npm) to avoid EACCES on the store. # Skip if npm is unavailable (e.g., network issues preventing fetch). OPENCODE_BIN=/opt/homebrew/bin/opencode if [ ! -x "$OPENCODE_BIN" ]; then echo "==> Installing OpenCode 1.x (stable) via Homebrew npm..." if /opt/homebrew/bin/npm install -g --allow-scripts=opencode-ai opencode-ai@1.18 2>&1; then echo "==> OpenCode 1.x installed successfully" else echo "==> WARNING: OpenCode 1.x installation failed (network issue). Skipping." fi else echo "==> OpenCode 1.x already installed: $(${OPENCODE_BIN} --version)" fi stamp="$(date +%Y%m%d-%H%M%S)" # Paths home-manager manages via home.file (regular files become out-of-store symlinks). managed=( "$HOME/.grok/config.toml" "$HOME/.grok/AGENTS.md" "$HOME/.claude/settings.json" "$HOME/.claude/CLAUDE.md" "$HOME/.codex/AGENTS.md" "$HOME/.config/opencode/AGENTS.md" "$HOME/.config/opencode/opencode.json" "$HOME/.config/opencode2/opencode.json" "$HOME/.config/opencode2/AGENTS.md" "$HOME/.local/bin/oc2" "$HOME/.pi/agent/settings.json" "$HOME/.pi/agent/models.json" "$HOME/.pi/agent/AGENTS.md" "$HOME/.pi/agent/extensions/terminal-status-title.js" ) for path in "${managed[@]}"; do bak="${path}.backup" if [ -e "$bak" ] || [ -L "$bak" ]; then mv "$bak" "${bak}.${stamp}" echo "rotated stale backup: ${bak} -> ${bak}.${stamp}" fi done # Directory targets use the same backup suffix on collision. for path in \ "$HOME/.config/wezterm" \ "$HOME/.config/nvim" \ "$HOME/.config/herdr" \ "$HOME/.config/opencode/skills" \ "$HOME/.pi/agent/themes" \ "$HOME/.pi/agent/extensions/calm" do bak="${path}.backup" if [ -e "$bak" ] || [ -L "$bak" ]; then mv "$bak" "${bak}.${stamp}" echo "rotated stale backup: ${bak} -> ${bak}.${stamp}" fi done exec sudo darwin-rebuild switch --flake ~/.dotfiles#lt-mbp