1#!/usr/bin/env bash
2set -euo pipefail
3ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
4source "$ROOT/lib.sh"
5
6need_cmd brew
7
8#──────────────────────────────────────────────────────────────
9# STATE: Cask applications to install (edit this list)
10#──────────────────────────────────────────────────────────────
11CASKS=(
12 orion
13 ghostty
14 raycast
15 obsidian
16 iina
17 zed
18 font-jetbrains-mono-nerd-font
19 protonvpn
20 proton-drive
21 proton-pass
22 libreoffice
23 logi-options+
24)
25
26#──────────────────────────────────────────────────────────────
27# LOGIC: Idempotent convergence (strict mode)
28#──────────────────────────────────────────────────────────────
29
30log "Syncing casks (strict mode)"
31
32mapfile -t installed < <(brew list --cask 2>/dev/null || true)
33
34# Install missing
35for cask in "${CASKS[@]}"; do
36 if ! brew list --cask "$cask" &>/dev/null; then
37 log "Installing: $cask"
38 brew install --cask "$cask"
39 else
40 log "Already installed: $cask"
41 fi
42done
43
44# Remove extras (strict convergence)
45for pkg in "${installed[@]}"; do
46 [[ -z "$pkg" ]] && continue
47 keep=false
48 for cask in "${CASKS[@]}"; do
49 [[ "$cask" == "$pkg" ]] && keep=true && break
50 done
51 if [[ "$keep" == "false" ]]; then
52 log "Removing: $pkg (not in state)"
53 brew uninstall --cask "$pkg" || true
54 fi
55done
56
57brew cleanup
58log "Casks synced"