ADR 002 — Homebrew Bundle for declarative packages
Status
Accepted
Context
The workstation needs a sizeable, evolving set of CLI tools, casks and fonts. Installing them with a hand-maintained list of brew install commands is verbose, non-declarative, and awkward to diff. Two packages (the container runtime and the browser) are machine-specific choices that should not be hard-coded into the shared list.
Decision
Declare the base package set in a Brewfile and install it with brew bundle. At run time, build_effective_brewfile copies the tracked Brewfile to a temp file and appends the interactive selections (container runtime, browser), so the base file stays generic while per-machine choices are layered on and then discarded. brew bundle failures are tolerated (see ADR 001).
Consequences
- Pros: The package set is a single declarative file, trivially diffable and reviewable.
brew bundleis idempotent — already-installed packages are skipped. The effective-Brewfile pattern keeps machine-specific choices out of version control. - Cons / trade-offs: Homebrew is the single point of dependency for the whole toolset; a Homebrew outage or a renamed cask breaks a run (mitigated by fail-soft). Casks that install into
/Applicationscan raise asudoprompt outside Ponos's control. The base Brewfile already pinsdocker-desktop, so the container choice mainly addsdocker-compose/colimarather than gating Docker itself. - Alternatives rejected: A shell loop over
brew install(imperative, no idempotency guarantees) and MacPorts / manual.dmginstalls (less declarative, no bundle concept).