Files
dotfiles/rebuild.sh
T
Lap Tran a35c0bb744 Manage opencode 1.x config via home-manager and isolate opencode2
- Symlink ~/.config/opencode/opencode.json and skills/ from dotfiles
  so opencode 1.x config survives rebuild with zap cleanup
- Track cloud-deploy, cloudflared, github-cli, no-mistakes,
  playwright-cli, and read-tweet skills in repo
- Update opencode2 model to opencode/muse-spark-1.2-contributor-free
- Rotate opencode.json/skills in rebuild.sh alongside existing
  managed paths
2026-09-21 21:55:00 -04:00

76 lines
2.6 KiB
Bash
Executable File

#!/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