Skip to content

Commit 237ba74

Browse files
AnjanJclaude
andcommitted
add package group selection with work apps separation
Organize Brewfile into 16 @group sections (core, editors, work, databases, etc.) so users can select which groups to install in interactive mode. Work/enterprise apps (Slack, Zoom, Okta Verify, Windows App) are now a separate selectable group. Selections persist to ~/.dotfiles-packages. New --groups flag for CLI-level selection. Update script now snapshots to Brewfile.snapshot instead of overwriting the organized Brewfile. 85 new test assertions, 370 total across all suites — zero failures. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent a95823c commit 237ba74

File tree

8 files changed

+1133
-136
lines changed

8 files changed

+1133
-136
lines changed

.zshrc-work-completions

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ _dotfiles() {
5252
'--work-dir[Work directory]:directory:_directories' \
5353
'--theme[Theme]:theme:(tokyo-night aura catppuccin)' \
5454
'--ssh[SSH mode]:mode:(1password existing generate skip)' \
55+
'--groups[Package groups to install]:groups' \
5556
'--no-macos-defaults[Skip macOS defaults]' \
5657
'--help[Show help]'
5758
;;
@@ -131,6 +132,7 @@ _dotfiles_install() {
131132
'--work-dir[Work directory]:directory:_directories' \
132133
'--theme[Theme]:theme:(tokyo-night aura catppuccin)' \
133134
'--ssh[SSH mode]:mode:(1password existing generate skip)' \
135+
'--groups[Package groups to install]:groups' \
134136
'--no-macos-defaults[Skip macOS defaults]' \
135137
'--help[Show help]'
136138
}

Brewfile

Lines changed: 142 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# @group taps — Homebrew tap registries (always included)
12
tap "antoniorodr/memo"
23
tap "charmbracelet/tap"
34
tap "cloudflare/cloudflare"
@@ -9,95 +10,124 @@ tap "render-oss/render"
910
tap "steipete/tap"
1011
tap "supabase/tap"
1112
tap "yakitrak/yakitrak"
12-
brew "glib"
13+
14+
# @group core — Essential CLI tools (always installed)
1315
brew "bat"
14-
brew "cloudflared"
15-
brew "criterion"
1616
brew "direnv"
17-
brew "docker"
1817
brew "eza"
1918
brew "fd"
20-
brew "ffmpeg"
21-
brew "pango"
22-
brew "ffmpeg-full"
23-
brew "flyctl"
2419
brew "fzf"
25-
brew "gemini-cli"
2620
brew "gh"
2721
brew "git"
22+
brew "mas"
23+
brew "mise"
24+
brew "ripgrep"
25+
brew "shellcheck"
26+
brew "starship"
27+
brew "tree"
28+
brew "wget"
29+
brew "zoxide"
30+
31+
# @group editors — Code editors & terminals
32+
brew "neovim"
33+
cask "ghostty"
34+
cask "visual-studio-code"
35+
cask "warp"
36+
cask "wezterm"
37+
cask "zed"
38+
39+
# @group window-mgmt — Tiling window manager & status bar
40+
cask "nikitabobko/tap/aerospace"
41+
brew "felixkratz/formulae/borders"
42+
brew "felixkratz/formulae/sketchybar"
43+
44+
# @group terminal-tools — Terminal enhancements & TUI tools
2845
brew "git-delta"
2946
brew "gitui"
30-
brew "heroku"
3147
brew "httpie"
3248
brew "lazydocker"
3349
brew "lazygit"
34-
brew "lazysql"
35-
brew "libidn"
36-
brew "libre"
37-
brew "librsvg"
38-
brew "libxmlsec1"
39-
brew "libyaml"
40-
brew "litecli"
4150
brew "lnav"
4251
brew "lsd"
43-
brew "mas"
44-
brew "mise"
45-
brew "mycli"
46-
brew "mysql", restart_service: :changed
47-
brew "neovim"
48-
brew "openssl@1.1"
4952
brew "pandoc"
50-
brew "pgcli"
51-
brew "pgvector"
52-
brew "poppler"
53-
brew "postgresql@14", restart_service: :changed
54-
brew "putty"
55-
brew "redis", restart_service: :changed
56-
brew "render"
57-
brew "ripgrep"
58-
brew "shared-mime-info"
59-
brew "shellcheck"
60-
brew "starship"
6153
brew "tailspin"
6254
brew "tldr", link: false
6355
brew "tlrc"
6456
brew "tmux"
65-
brew "tree"
6657
brew "unar"
67-
brew "uv"
6858
brew "weasyprint"
69-
brew "wget"
7059
brew "yazi"
71-
brew "yt-dlp"
7260
brew "zellij"
73-
brew "zig"
74-
brew "zoxide"
75-
brew "antoniorodr/memo/memo"
76-
brew "charmbracelet/tap/freeze", link: false
77-
brew "felixkratz/formulae/borders"
78-
brew "felixkratz/formulae/sketchybar"
79-
brew "steipete/tap/bird"
80-
brew "steipete/tap/gifgrep"
81-
brew "steipete/tap/goplaces"
82-
brew "steipete/tap/imsg"
83-
brew "steipete/tap/peekaboo"
84-
brew "steipete/tap/remindctl"
85-
brew "steipete/tap/sag"
86-
brew "steipete/tap/songsee"
87-
brew "steipete/tap/summarize"
88-
brew "steipete/tap/wacli"
61+
62+
# @group databases — Database engines & GUI clients
63+
brew "litecli"
64+
brew "lazysql"
65+
brew "mycli"
66+
brew "mysql", restart_service: :changed
67+
brew "pgcli"
68+
brew "pgvector"
69+
brew "postgresql@14", restart_service: :changed
70+
brew "redis", restart_service: :changed
71+
cask "beekeeper-studio"
72+
cask "postico"
73+
cask "redis-insight"
74+
75+
# @group cloud-deploy — Cloud & deployment CLIs
76+
brew "cloudflared"
77+
brew "docker"
78+
brew "flyctl"
79+
brew "heroku"
80+
brew "render"
8981
brew "supabase/tap/supabase"
90-
brew "yakitrak/yakitrak/obsidian-cli"
82+
cask "docker-desktop"
83+
84+
# @group media — Media processing tools
85+
brew "ffmpeg"
86+
brew "ffmpeg-full"
87+
brew "glib"
88+
brew "librsvg"
89+
brew "pango"
90+
brew "poppler"
91+
brew "yt-dlp"
92+
cask "vlc"
93+
mas "Gifski", id: 1351639930
94+
mas "GIPHY CAPTURE", id: 668208984
95+
96+
# @group communication — Personal messaging
97+
cask "discord"
98+
cask "signal"
99+
cask "telegram"
100+
mas "WhatsApp", id: 310633997
101+
102+
# @group productivity — Personal productivity
91103
cask "1password"
92104
cask "1password-cli"
93-
cask "nikitabobko/tap/aerospace"
94-
cask "android-platform-tools"
95-
cask "beekeeper-studio"
96-
cask "bruno"
97-
cask "claude-code"
98-
cask "discord"
99-
cask "docker-desktop"
100-
cask "firefox"
105+
cask "notion"
106+
cask "obsidian"
107+
cask "proton-mail"
108+
cask "proton-pass"
109+
cask "protonvpn"
110+
cask "raycast"
111+
brew "antoniorodr/memo/memo"
112+
brew "yakitrak/yakitrak/obsidian-cli"
113+
mas "1Password for Safari", id: 1569813296
114+
mas "Dashlane", id: 517914548
115+
mas "Tailscale", id: 1475387142
116+
117+
# @group work — Enterprise & work apps
118+
cask "slack"
119+
cask "zoom"
120+
mas "Okta Verify", id: 490179405
121+
mas "Windows App", id: 1295203466
122+
123+
# @group languages — Language-specific tools
124+
brew "criterion"
125+
brew "uv"
126+
brew "zig"
127+
go "cmd/go"
128+
go "cmd/gofmt"
129+
130+
# @group fonts — Nerd Fonts collection
101131
cask "font-0xproto-nerd-font"
102132
cask "font-3270-nerd-font"
103133
cask "font-adwaita-mono-nerd-font"
@@ -175,52 +205,8 @@ cask "font-ubuntu-nerd-font"
175205
cask "font-ubuntu-sans-nerd-font"
176206
cask "font-victor-mono-nerd-font"
177207
cask "font-zed-mono-nerd-font"
178-
cask "freeze"
179-
cask "ghostty"
180-
cask "notion"
181-
cask "obsidian"
182-
cask "postico"
183-
cask "proton-mail"
184-
cask "proton-pass"
185-
cask "protonvpn"
186-
cask "raycast"
187-
cask "redis-insight"
188-
cask "requestly"
189-
cask "signal"
190-
cask "slack"
191-
cask "telegram"
192-
cask "visual-studio-code"
193-
cask "vlc"
194-
cask "warp"
195-
cask "wezterm"
196-
cask "zed"
197-
cask "zen"
198-
cask "zoom"
199-
mas "1Password for Safari", id: 1569813296
200-
mas "2FAS - Two Factor Authentication", id: 6443941139
201-
mas "Bandwidth+", id: 490461369
202-
mas "Dashlane", id: 517914548
203-
mas "Developer", id: 640199958
204-
mas "DuckDuckGo", id: 663592361
205-
mas "Gifski", id: 1351639930
206-
mas "GIPHY CAPTURE", id: 668208984
207-
mas "Hidden Bar", id: 1452453066
208-
mas "iStat Menus", id: 1319778037
209-
mas "Kindle", id: 302584613
210-
mas "LanguageTool", id: 1534275760
211-
mas "LocalSend", id: 1661733229
212-
mas "Menu Bar Calendar", id: 1558360383
213-
mas "Noir", id: 1592917505
214-
mas "Numbers", id: 409203825
215-
mas "Okta Verify", id: 490179405
216-
mas "Perplexity", id: 6714467650
217-
mas "Save to Raindrop.io", id: 1549370672
218-
mas "Tailscale", id: 1475387142
219-
mas "TextSniper", id: 1528890965
220-
mas "Tot", id: 1491071483
221-
mas "WhatsApp", id: 310633997
222-
mas "Windows App", id: 1295203466
223-
mas "Xcode", id: 497799835
208+
209+
# @group vscode-ext — VS Code extensions
224210
vscode "aaron-bond.better-comments"
225211
vscode "adpyke.codesnap"
226212
vscode "alefragnani.bookmarks"
@@ -331,5 +317,50 @@ vscode "xabikos.reactsnippets"
331317
vscode "yzhang.markdown-all-in-one"
332318
vscode "zh9528.file-size"
333319
vscode "zhuangtongfa.material-theme"
334-
go "cmd/go"
335-
go "cmd/gofmt"
320+
321+
# @group mac-apps — Mac App Store apps
322+
mas "2FAS - Two Factor Authentication", id: 6443941139
323+
mas "Bandwidth+", id: 490461369
324+
mas "Developer", id: 640199958
325+
mas "DuckDuckGo", id: 663592361
326+
mas "Hidden Bar", id: 1452453066
327+
mas "iStat Menus", id: 1319778037
328+
mas "Kindle", id: 302584613
329+
mas "LanguageTool", id: 1534275760
330+
mas "LocalSend", id: 1661733229
331+
mas "Menu Bar Calendar", id: 1558360383
332+
mas "Noir", id: 1592917505
333+
mas "Numbers", id: 409203825
334+
mas "Perplexity", id: 6714467650
335+
mas "Save to Raindrop.io", id: 1549370672
336+
mas "TextSniper", id: 1528890965
337+
mas "Tot", id: 1491071483
338+
mas "Xcode", id: 497799835
339+
340+
# @group extras — Miscellaneous utilities
341+
brew "gemini-cli"
342+
brew "libidn"
343+
brew "libre"
344+
brew "libxmlsec1"
345+
brew "libyaml"
346+
brew "openssl@1.1"
347+
brew "putty"
348+
brew "shared-mime-info"
349+
brew "charmbracelet/tap/freeze", link: false
350+
brew "steipete/tap/bird"
351+
brew "steipete/tap/gifgrep"
352+
brew "steipete/tap/goplaces"
353+
brew "steipete/tap/imsg"
354+
brew "steipete/tap/peekaboo"
355+
brew "steipete/tap/remindctl"
356+
brew "steipete/tap/sag"
357+
brew "steipete/tap/songsee"
358+
brew "steipete/tap/summarize"
359+
brew "steipete/tap/wacli"
360+
cask "android-platform-tools"
361+
cask "bruno"
362+
cask "claude-code"
363+
cask "firefox"
364+
cask "freeze"
365+
cask "requestly"
366+
cask "zen"

README.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ Both are **fully non-interactive** with sensible defaults. No prompts, no questi
157157
bash install.sh --name "AJ" --email "aj@example.com" --theme aura
158158
bash install.sh --work-email "aj@corp.com" --ssh generate
159159
bash install.sh --interactive # Prompt for every choice (old behavior)
160+
bash install.sh --groups "core,editors,databases" # Install only specific package groups
160161
bash install.sh --no-macos-defaults # Skip macOS system preferences
161162
bash install.sh --force # Force reinstall everything
162163
bash install.sh --help # Show all options
@@ -165,7 +166,7 @@ bash install.sh --help # Show all options
165166
### What it does
166167

167168
1. ✅ Install Homebrew (if not installed)
168-
2. ✅ Install all packages from Brewfile
169+
2. ✅ Install packages from Brewfile (interactive mode lets you select package groups; `--groups` to pick specific ones)
169170
3. ✅ Create symlinks to dotfiles (shell, tmux, Neovim, Zed, ~/bin)
170171
4. ✅ Apply your chosen theme (Tokyo Night, Aura Dark, or Catppuccin)
171172
5. ✅ Set up tmux plugins
@@ -515,14 +516,14 @@ All commands support tab-completion. Shorthand also works: `dotfiles-update`, `d
515516

516517
1. Pull latest changes from git
517518
2. `brew update` + `brew upgrade` + `brew cleanup`
518-
3. Snapshot Brewfile (captures any new apps you installed manually)
519+
3. Snapshot installed packages and show diff against Brewfile (without overwriting the organized Brewfile)
519520
4. Refresh all symlinks
520521
5. Upgrade mise tools
521522
6. Update tmux plugins
522523
7. Reload live configs (tmux, aerospace)
523524
8. Commit & push changes back to repo
524525

525-
**Your Brewfile stays in sync automatically.** Install apps with `brew install` or `mas install` anytime — the next `dotfiles update` captures them into the repo. One `Brewfile.backup` is kept for rollback.
526+
**Your Brewfile stays organized.** The Brewfile is organized into `@group` sections (core, editors, work, databases, etc.) and `dotfiles update` never overwrites it. The snapshot step shows you what's new or missing compared to your system. One `Brewfile.backup` is kept for rollback.
526527

527528
### Health Check
528529

WHAT_GETS_INSTALLED.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,13 @@ Installs [Homebrew](https://brew.sh/) (macOS package manager) if not already pre
1212

1313
## Step 2: Brewfile (~325 packages)
1414

15-
Runs `brew bundle install` which installs everything declared in the `Brewfile`. This includes Homebrew formulas, cask apps, VS Code extensions, Mac App Store apps (via `mas`), and Go tools:
15+
Runs `brew bundle install` which installs packages declared in the `Brewfile`. This includes Homebrew formulas, cask apps, VS Code extensions, Mac App Store apps (via `mas`), and Go tools.
16+
17+
The Brewfile is organized into **16 `@group` sections**: taps, core, editors, window-mgmt, terminal-tools, databases, cloud-deploy, media, communication, productivity, **work** (enterprise apps like Slack, Zoom, Okta Verify), languages, fonts, vscode-ext, mac-apps, and extras.
18+
19+
- **Non-interactive mode** installs everything (or respects previous selections saved in `~/.dotfiles-packages`)
20+
- **Interactive mode** (`--interactive`) lets you toggle groups on/off and exclude individual packages within groups
21+
- **`--groups "core,editors,databases"`** installs only the specified groups
1622

1723
### Taps (10 third-party repos)
1824

0 commit comments

Comments
 (0)