chore(packages): declare every tool the configs reference

Audit of configs, scripts, tmux-palette items and television cables
against installed packages. Adds the missing pacman/AUR/brew entries,
a [omarchy] repo list installed only where that repo is configured,
and cargo installs in 40-post. 10-packages filters lists with pacman -T
so provider packages (mise-bin, yazi-git) are not replaced, and uses
yay with paru as fallback. noctalia-shell -> noctalia-git (AUR name).
This commit is contained in:
Prad Nukala committed 2026-10-16 12:01:52 -04:00
1 parent 6f73aa2f82
commit 30314160f1
13 files changed
+156 -46

No files matched your search

+74 -5
View File
@@ -4,21 +4,33 @@ packages:
# shell + editors # shell + editors
- fish - fish
- neovim - neovim
- tmux - helix
- micro - micro
- tmux
# terminal # terminal
- kitty - kitty
# tui tools # tui tools (tmux-palette, television cables, fish functions)
- yazi - yazi
- lazygit - lazygit
- lazydocker - lazydocker
- docker
- docker-compose
- btop - btop
- fastfetch - fastfetch
- onefetch
- television
- serie
- tig
- gitui
- tldr
- navi
- mdfried
# vcs + forge # vcs + forge
- git - git
- github-cli - github-cli
- git-delta - git-delta
- diffnav - diffnav
- tea
# search / files # search / files
- fzf - fzf
- fd - fd
@@ -28,15 +40,21 @@ packages:
- bat - bat
- jq - jq
- duf - duf
# media / preview (yazi deps) # media / preview (yazi + tv deps)
- ffmpeg - ffmpeg
- ffmpegthumbnailer - ffmpegthumbnailer
- poppler - poppler
- resvg - resvg
- imagemagick - imagemagick
- chafa
- 7zip - 7zip
- unzip - unzip
# remote
- mosh
- sshfs
- tailscale
# misc cli # misc cli
- mise
- gum - gum
- glow - glow
- atuin - atuin
@@ -47,27 +65,74 @@ packages:
- ttf-victor-mono-nerd - ttf-victor-mono-nerd
aur: aur:
- topgrade - topgrade
- portop
desktop: desktop:
# linux desktop layer (role desktop|laptop) # linux desktop layer (role desktop|laptop)
pacman: pacman:
- niri - niri
- xwayland-satellite
- polkit-gnome
- uwsm
- xdg-user-dirs - xdg-user-dirs
# wayland utilities the compositor configs and ~/.local/bin scripts call
- wl-clipboard
- cliphist
- wtype
- ydotool
- grim
- slurp
- hyprpicker
- pamixer
- brightnessctl
- libnotify
# desktop apps bound in niri/hypr
- nautilus
- imv
- mpv
- evince
- chromium
- obsidian
aur: aur:
- noctalia-shell - noctalia-git
- vicinae-bin - vicinae-bin
- beeper-bin
- fastmail
- tldraw-offline-bin
# [omarchy] pacman repo (pkgs.omarchy.org); installed only when that repo
# is configured. Hyprland, waybar and the omarchy-* scripts come with
# the Omarchy install itself and are not listed.
omarchy:
- herdr
- flea
- voxtype-bin
- xdg-terminal-exec
- hyprland-preview-share-picker
- brave-origin-bin
- claude-desktop
- 1password
- spotify
darwin: darwin:
brew: brew:
- fish - fish
- neovim - neovim
- helix
- tmux - tmux
- yazi - yazi
- lazygit - lazygit
- lazydocker - lazydocker
- btop - btop
- fastfetch - fastfetch
- onefetch
- television
- serie
- tig
- gitui
- tldr
- navi
- git - git
- gh - gh
- git-delta - git-delta
- tea
- fzf - fzf
- fd - fd
- ripgrep - ripgrep
@@ -81,7 +146,10 @@ packages:
- poppler - poppler
- resvg - resvg
- imagemagick - imagemagick
- chafa
- sevenzip - sevenzip
- mosh
- mise
- gum - gum
- glow - glow
- atuin - atuin
@@ -97,6 +165,7 @@ packages:
- prdlk/gh-commit - prdlk/gh-commit
- dlvhdr/gh-dash - dlvhdr/gh-dash
- meiji163/gh-notify - meiji163/gh-notify
go: [] # cargo installs (run_onchange_after_40-post), skipped when cargo is absent
cargo: cargo:
- suvadu - suvadu
- mandible
@@ -7,3 +7,12 @@ if command -v bat >/dev/null 2>&1; then bat cache --build >/dev/null || true; fi
{{ if eq .chezmoi.os "linux" -}} {{ if eq .chezmoi.os "linux" -}}
if command -v fc-cache >/dev/null 2>&1; then fc-cache -f >/dev/null || true; fi if command -v fc-cache >/dev/null 2>&1; then fc-cache -f >/dev/null || true; fi
{{ end -}} {{ end -}}
# cargo installs from packages.shared.cargo; skipped when cargo is absent.
# cargo hash: {{ .packages.shared.cargo | toJson | sha256sum }}
if command -v cargo >/dev/null 2>&1; then
installed=$(cargo install --list | awk '/^[^ ]/{print $1}')
{{ range .packages.shared.cargo }}
echo "$installed" | grep -qx "{{ . }}" || cargo install --locked "{{ . }}"
{{ end }}
fi
@@ -6,26 +6,37 @@ set -eu
{{ if eq .chezmoi.os "linux" -}} {{ if eq .chezmoi.os "linux" -}}
if [ "$(id -u)" -eq 0 ]; then PACMAN="pacman"; else PACMAN="sudo pacman"; fi if [ "$(id -u)" -eq 0 ]; then PACMAN="pacman"; else PACMAN="sudo pacman"; fi
# shellcheck disable=SC2086 # word splitting intended # Install only what no installed package already provides (`pacman -T`), so a
$PACMAN -S --needed --noconfirm \ # machine with mise-bin or yazi-git is not asked to replace them with mise/yazi.
{{ range .packages.arch.pacman }} {{ . }} \ install_missing() {
{{ end }} && true missing=$(pacman -T "$@" || true)
# shellcheck disable=SC2086 # word splitting intended
[ -z "$missing" ] || $PACMAN -S --needed --noconfirm $missing
}
install_missing {{ range .packages.arch.pacman }}{{ . }} {{ end }}
{{ if or (eq .role "desktop") (eq .role "laptop") -}} {{ if or (eq .role "desktop") (eq .role "laptop") -}}
$PACMAN -S --needed --noconfirm \ install_missing {{ range .packages.arch.desktop.pacman }}{{ . }} {{ end }}
{{ range .packages.arch.desktop.pacman }} {{ . }} \
{{ end }} && true # [omarchy] repo packages — only where pacman.conf has that repo
if pacman-conf -l | grep -qx omarchy; then
install_missing {{ range .packages.arch.desktop.omarchy }}{{ . }} {{ end }}
fi
aur_pkgs="{{ range .packages.arch.desktop.aur }}{{ . }} {{ end }}{{ range .packages.arch.aur }}{{ . }} {{ end }}" aur_pkgs="{{ range .packages.arch.desktop.aur }}{{ . }} {{ end }}{{ range .packages.arch.aur }}{{ . }} {{ end }}"
{{ else -}} {{ else -}}
aur_pkgs="{{ range .packages.arch.aur }}{{ . }} {{ end }}" aur_pkgs="{{ range .packages.arch.aur }}{{ . }} {{ end }}"
{{ end -}} {{ end -}}
if [ -n "$(echo "$aur_pkgs" | tr -d ' ')" ]; then if [ -n "$(echo "$aur_pkgs" | tr -d ' ')" ]; then
if command -v paru >/dev/null 2>&1; then if command -v yay >/dev/null 2>&1; then AUR="yay"
elif command -v paru >/dev/null 2>&1; then AUR="paru"
else AUR=""; fi
if [ -n "$AUR" ]; then
# shellcheck disable=SC2086 # shellcheck disable=SC2086
paru -S --needed --noconfirm $aur_pkgs $AUR -S --needed --noconfirm $aur_pkgs
else else
echo "warning: paru not found — skipping AUR packages: $aur_pkgs" >&2 echo "warning: yay/paru not found — skipping AUR packages: $aur_pkgs" >&2
fi fi
fi fi
+15
View File
@@ -58,6 +58,21 @@ Pulling a remote change before the refresh window: `chezmoi apply --refresh-exte
4. `mv ~/.config/<app> /tmp/bak && chezmoi apply --force ~/.config/<app>`; diff against the repo, then delete the backup. 4. `mv ~/.config/<app> /tmp/bak && chezmoi apply --force ~/.config/<app>`; diff against the repo, then delete the backup.
5. Update `docs/` (the tool's page, `docs/terminal/index.mdx` or sibling index, `docs/chezmoi/externals-and-ignore.mdx`) and any alias pointing at the old source path (`dot_config/fish/conf.d/20-aliases.fish`, `.chezmoidata/aliases.yaml`). 5. Update `docs/` (the tool's page, `docs/terminal/index.mdx` or sibling index, `docs/chezmoi/externals-and-ignore.mdx`) and any alias pointing at the old source path (`dot_config/fish/conf.d/20-aliases.fish`, `.chezmoidata/aliases.yaml`).
## Packages: every referenced tool must be declared
`.chezmoidata/packages.yaml` is the install manifest; the goal is `chezmoi init --apply` on a fresh Arch (Omarchy) machine yields a working setup. When a config, script, tmux-palette item, television cable `requirements`, or compositor binding starts calling a new binary, declare its package in the same change:
| Key | Installed by | When |
| --- | --- | --- |
| `arch.pacman` / `arch.aur` | `10-packages` (pacman / `yay` or `paru`) | every Linux role |
| `arch.desktop.pacman` / `.aur` | same | roles `desktop`, `laptop` |
| `arch.desktop.omarchy` | pacman, only if `pacman-conf -l` lists `omarchy` | Omarchy machines |
| `darwin.brew` / `.cask` | Homebrew | macOS |
| `shared.cargo` | `40-post`, if `cargo` exists | every OS |
| `shared.gh_extensions` | `20-gh-extensions` | every OS |
Find the package with `pacman -Qo "$(command -v <bin>)"`; `pacman -Qm` lists AUR/foreign packages, `pacman -Si <pkg>` shows the repo (`extra` vs `omarchy`). Verify names before committing: `pacman -Si` for repo packages, `https://aur.archlinux.org/rpc/v5/info?arg[]=<pkg>` for AUR, `https://formulae.brew.sh/api/formula/<name>.json` for brew. Hyprland/Waybar/`omarchy-*` come with Omarchy and are not declared. Tools installed through `mise` (`~/.config/mise/config.toml`, local-only) are not covered by the manifest.
## Verify ## Verify
- `chezmoi diff` empty after apply. - `chezmoi diff` empty after apply.
+2 -2
View File
@@ -20,8 +20,8 @@ layer (niri, noctalia, fontconfig, systemd user units) — `mac` and
## Prerequisites ## Prerequisites
- **Arch**: `paru` for AUR packages (optional — the install script warns - **Arch**: `yay` or `paru` for AUR packages (optional — the install script
and skips AUR if missing). `sudo` for pacman. warns and skips AUR if missing). `sudo` for pacman.
- **macOS**: [Homebrew](https://brew.sh). - **macOS**: [Homebrew](https://brew.sh).
- **Secrets**: `age`-encrypted files need the key at - **Secrets**: `age`-encrypted files need the key at
`~/.config/chezmoi/key.txt`. Copy it there **before** `chezmoi apply` `~/.config/chezmoi/key.txt`. Copy it there **before** `chezmoi apply`
+2 -2
View File
@@ -40,7 +40,7 @@ The `*Once` functions only prompt when the key is missing from the existing conf
### Machine roles ### Machine roles
| Role | Intended platform | Linux desktop layer | Desktop packages (`niri`, `xdg-user-dirs`, `noctalia-shell`, `vicinae-bin`) | | Role | Intended platform | Linux desktop layer | Desktop packages (`packages.arch.desktop`) |
| --- | --- | --- | --- | | --- | --- | --- | --- |
| `desktop` | Arch Linux | Applied | Installed | | `desktop` | Arch Linux | Applied | Installed |
| `laptop` | Arch Linux | Applied | Installed | | `laptop` | Arch Linux | Applied | Installed |
@@ -82,7 +82,7 @@ The `[data]` table exposes `.name`, `.email`, and `.role` to every template. che
| `.role` | `.chezmoiscripts/run_onchange_before_10-packages.sh.tmpl` | Adds the `arch.desktop` pacman and AUR packages for `desktop`/`laptop` | | `.role` | `.chezmoiscripts/run_onchange_before_10-packages.sh.tmpl` | Adds the `arch.desktop` pacman and AUR packages for `desktop`/`laptop` |
| `.chezmoi.os` | `.chezmoi.toml.tmpl` | Role default (`mac` on darwin) | | `.chezmoi.os` | `.chezmoi.toml.tmpl` | Role default (`mac` on darwin) |
| `.chezmoi.os` | `.chezmoiignore.tmpl` | Desktop layer requires `linux` | | `.chezmoi.os` | `.chezmoiignore.tmpl` | Desktop layer requires `linux` |
| `.chezmoi.os` | `run_onchange_before_10-packages.sh.tmpl` | pacman/paru on `linux`, Homebrew on `darwin` | | `.chezmoi.os` | `run_onchange_before_10-packages.sh.tmpl` | pacman/yay on `linux`, Homebrew on `darwin` |
| `.chezmoi.os` | `run_once_after_30-user-services.sh.tmpl` | systemd user units on `linux` only | | `.chezmoi.os` | `run_once_after_30-user-services.sh.tmpl` | systemd user units on `linux` only |
| `.chezmoi.os` | `run_onchange_after_40-post.sh.tmpl` | `fc-cache` on `linux` only | | `.chezmoi.os` | `run_onchange_after_40-post.sh.tmpl` | `fc-cache` on `linux` only |
+16 -12
View File
@@ -13,7 +13,7 @@ Files in `.chezmoidata/` are merged into chezmoi's template data on every run. N
## packages.yaml [#packagesyaml] ## packages.yaml [#packagesyaml]
One manifest per platform, plus a `shared` block. Any edit to the file changes the hash embedded in the package script, so the next `chezmoi apply` re-runs the install. Installs are idempotent (`pacman --needed`, `paru --needed`, `brew install` on already-installed formulae). One manifest per platform, plus a `shared` block. Any edit to the file changes the hash embedded in the package script, so the next `chezmoi apply` re-runs the install. Installs are idempotent (`pacman --needed`, `yay`/`paru --needed`, `brew install` on already-installed formulae). The lists are derived from what the configs actually invoke: tmux-palette items, television cable `requirements`, fish functions, `~/.local/bin` scripts, and compositor bindings.
<Tabs> <Tabs>
<Tab title="Arch"> <Tab title="Arch">
@@ -22,34 +22,38 @@ One manifest per platform, plus a `shared` block. Any edit to the file changes t
| Group | Packages | | Group | Packages |
| --- | --- | | --- | --- |
| Shell and editors | `fish`, `neovim`, `tmux`, `micro` | | Shell and editors | `fish`, `neovim`, `helix`, `micro`, `tmux` |
| Terminal | `kitty` | | Terminal | `kitty` |
| TUI tools | `yazi`, `lazygit`, `lazydocker`, `btop`, `fastfetch` | | TUI tools (tmux-palette, television cables) | `yazi`, `lazygit`, `lazydocker`, `docker`, `docker-compose`, `btop`, `fastfetch`, `onefetch`, `television`, `serie`, `tig`, `gitui`, `tldr`, `navi`, `mdfried` |
| VCS and forge | `git`, `github-cli`, `git-delta`, `diffnav` | | VCS and forge | `git`, `github-cli`, `git-delta`, `diffnav`, `tea` |
| Search and files | `fzf`, `fd`, `ripgrep`, `zoxide`, `eza`, `bat`, `jq`, `duf` | | Search and files | `fzf`, `fd`, `ripgrep`, `zoxide`, `eza`, `bat`, `jq`, `duf` |
| Media and preview (yazi deps) | `ffmpeg`, `ffmpegthumbnailer`, `poppler`, `resvg`, `imagemagick`, `7zip`, `unzip` | | Media and preview (yazi and tv deps) | `ffmpeg`, `ffmpegthumbnailer`, `poppler`, `resvg`, `imagemagick`, `chafa`, `7zip`, `unzip` |
| Misc CLI | `gum`, `glow`, `atuin`, `wget`, `starship`, `zsh-syntax-highlighting` | | Remote | `mosh`, `sshfs`, `tailscale` |
| Misc CLI | `mise`, `gum`, `glow`, `atuin`, `wget`, `starship`, `zsh-syntax-highlighting` |
| Fonts | `ttf-victor-mono-nerd` | | Fonts | `ttf-victor-mono-nerd` |
`packages.arch.aur`, installed with `paru -S --needed --noconfirm` on every Linux machine: `topgrade`. `packages.arch.aur`, installed with `yay -S --needed --noconfirm` (or `paru`) on every Linux machine: `topgrade`, `portop`.
`packages.arch.desktop`, added only for roles `desktop` and `laptop`: `packages.arch.desktop`, added only for roles `desktop` and `laptop`:
| Source | Packages | | Source | Packages |
| --- | --- | | --- | --- |
| pacman | `niri`, `xdg-user-dirs` | | pacman | `niri`, `xwayland-satellite`, `polkit-gnome`, `uwsm`, `xdg-user-dirs`; Wayland utilities `wl-clipboard`, `cliphist`, `wtype`, `ydotool`, `grim`, `slurp`, `hyprpicker`, `pamixer`, `brightnessctl`, `libnotify`; apps `nautilus`, `imv`, `mpv`, `evince`, `chromium`, `obsidian` |
| AUR | `noctalia-shell`, `vicinae-bin` | | AUR | `noctalia-git`, `vicinae-bin`, `beeper-bin`, `fastmail`, `tldraw-offline-bin` |
| `[omarchy]` repo (`packages.arch.desktop.omarchy`, only when `pacman-conf -l` lists that repo) | `herdr`, `flea`, `voxtype-bin`, `xdg-terminal-exec`, `hyprland-preview-share-picker`, `brave-origin-bin`, `claude-desktop`, `1password`, `spotify` |
Hyprland, Waybar and the `omarchy-*` commands come with the Omarchy install and are not declared. `niri-dynamic-workspaces` (niri startup) has no package; install it by hand.
</Tab> </Tab>
<Tab title="macOS"> <Tab title="macOS">
`packages.darwin.brew`, installed with `brew install`: `packages.darwin.brew`, installed with `brew install`:
`fish`, `neovim`, `tmux`, `yazi`, `lazygit`, `lazydocker`, `btop`, `fastfetch`, `git`, `gh`, `git-delta`, `fzf`, `fd`, `ripgrep`, `zoxide`, `eza`, `bat`, `jq`, `duf`, `ffmpeg`, `ffmpegthumbnailer`, `poppler`, `resvg`, `imagemagick`, `sevenzip`, `gum`, `glow`, `atuin`, `starship`, `zsh-syntax-highlighting`, `topgrade` `fish`, `neovim`, `helix`, `tmux`, `yazi`, `lazygit`, `lazydocker`, `btop`, `fastfetch`, `onefetch`, `television`, `serie`, `tig`, `gitui`, `tldr`, `navi`, `git`, `gh`, `git-delta`, `tea`, `fzf`, `fd`, `ripgrep`, `zoxide`, `eza`, `bat`, `jq`, `duf`, `ffmpeg`, `ffmpegthumbnailer`, `poppler`, `resvg`, `imagemagick`, `chafa`, `sevenzip`, `mosh`, `mise`, `gum`, `glow`, `atuin`, `starship`, `zsh-syntax-highlighting`, `topgrade`
`packages.darwin.cask`, installed with `brew install --cask`: `kitty`, `font-victor-mono-nerd-font`. `packages.darwin.cask`, installed with `brew install --cask`: `kitty`, `font-victor-mono-nerd-font`.
Compared with Arch, macOS has no `micro`, `diffnav`, `unzip`, or `wget`, and gets `topgrade` from Homebrew instead of the AUR. The role does not change the macOS list. Compared with Arch, macOS has no `micro`, `diffnav`, `mdfried`, `docker`, `sshfs`, `tailscale`, `unzip`, or `wget`, and gets `topgrade` from Homebrew instead of the AUR. The role does not change the macOS list.
</Tab> </Tab>
<Tab title="Shared"> <Tab title="Shared">
@@ -63,7 +67,7 @@ Compared with Arch, macOS has no `micro`, `diffnav`, `unzip`, or `wget`, and get
| `dlvhdr/gh-dash` | `gh dash`: PR and issue dashboard | | `dlvhdr/gh-dash` | `gh dash`: PR and issue dashboard |
| `meiji163/gh-notify` | `gh notify`: notifications in the terminal | | `meiji163/gh-notify` | `gh notify`: notifications in the terminal |
`packages.shared.go` is an empty list. `packages.shared.cargo` lists `suvadu`. No script in the repo reads either key; they document intent only, and cargo installs are kept current by topgrade's `[cargo]` step. `packages.shared.cargo` lists `suvadu` and `mandible` (the tmux-palette "mandible" item runs `~/.local/bin/mandible-pick`). [`run_onchange_after_40-post.sh.tmpl`](/chezmoi/scripts#40-post) installs any that `cargo install --list` lacks, and skips the step when `cargo` is absent. `packages.shared.go` is an empty list that no script reads.
</Tab> </Tab>
</Tabs> </Tabs>
+7 -6
View File
@@ -15,7 +15,7 @@ Six scripts run during `chezmoi apply`. Four live in `.chezmoiscripts/`, a direc
<Step title="20-gh-extensions (after, onchange)">Install gh extensions.</Step> <Step title="20-gh-extensions (after, onchange)">Install gh extensions.</Step>
<Step title="25-skills (after, onchange)">Install and prune agent skills.</Step> <Step title="25-skills (after, onchange)">Install and prune agent skills.</Step>
<Step title="30-user-services (after, once)">Enable systemd user units on Linux (nirinit, kitty-day-save, projects-sync.timer).</Step> <Step title="30-user-services (after, once)">Enable systemd user units on Linux (nirinit, kitty-day-save, projects-sync.timer).</Step>
<Step title="40-post (after, onchange)">bat cache, font cache.</Step> <Step title="40-post (after, onchange)">bat cache, font cache, cargo installs.</Step>
<Step title="build-bat-cache (after, onchange)">Rebuild bat cache when its theme or config changes.</Step> <Step title="build-bat-cache (after, onchange)">Rebuild bat cache when its theme or config changes.</Step>
<Step title="install-yazi-plugins (after, onchange)">Reinstall yazi plugins when the manifest changes.</Step> <Step title="install-yazi-plugins (after, onchange)">Reinstall yazi plugins when the manifest changes.</Step>
</Steps> </Steps>
@@ -26,7 +26,7 @@ Six scripts run during `chezmoi apply`. Four live in `.chezmoiscripts/`, a direc
| `.chezmoiscripts/run_onchange_after_20-gh-extensions.sh.tmpl` | after | onchange | sha256 of `packages.shared.gh_extensions` as JSON | | `.chezmoiscripts/run_onchange_after_20-gh-extensions.sh.tmpl` | after | onchange | sha256 of `packages.shared.gh_extensions` as JSON |
| `.chezmoiscripts/run_onchange_after_25-skills.sh.tmpl` | after | onchange | sha256 of `.skills` as JSON | | `.chezmoiscripts/run_onchange_after_25-skills.sh.tmpl` | after | onchange | sha256 of `.skills` as JSON |
| `.chezmoiscripts/run_once_after_30-user-services.sh.tmpl` | after | once | Runs once per distinct rendered content | | `.chezmoiscripts/run_once_after_30-user-services.sh.tmpl` | after | once | Runs once per distinct rendered content |
| `.chezmoiscripts/run_onchange_after_40-post.sh.tmpl` | after | onchange | Only edits to the script itself (or an OS change) | | `.chezmoiscripts/run_onchange_after_40-post.sh.tmpl` | after | onchange | sha256 of `packages.shared.cargo` as JSON; also edits to the script itself or an OS change |
| `run_onchange_after_build-bat-cache.sh.tmpl` | after | onchange | sha256 of `dot_config/bat/themes/cyberdream.tmTheme` and `dot_config/bat/config` | | `run_onchange_after_build-bat-cache.sh.tmpl` | after | onchange | sha256 of `dot_config/bat/themes/cyberdream.tmTheme` and `dot_config/bat/config` |
| `run_onchange_after_install-yazi-plugins.sh.tmpl` | after | onchange | sha256 of `~/.config/yazi/package.toml` (empty when the file is absent) | | `run_onchange_after_install-yazi-plugins.sh.tmpl` | after | onchange | sha256 of `~/.config/yazi/package.toml` (empty when the file is absent) |
@@ -46,10 +46,10 @@ Six scripts run during `chezmoi apply`. Four live in `.chezmoiscripts/`, a direc
<Tab title="Linux"> <Tab title="Linux">
1. Uses `pacman` directly when running as root, otherwise `sudo pacman`. 1. Uses `pacman` directly when running as root, otherwise `sudo pacman`.
2. `pacman -S --needed --noconfirm` with every entry in `packages.arch.pacman`. 2. `pacman -T` filters each list down to names no installed package provides (so `mise-bin` satisfies `mise`, `yazi-git` satisfies `yazi`), then `pacman -S --needed --noconfirm` installs the rest of `packages.arch.pacman`.
3. For roles `desktop` and `laptop`, a second `pacman -S --needed --noconfirm` with `packages.arch.desktop.pacman`. 3. For roles `desktop` and `laptop`, the same for `packages.arch.desktop.pacman`, and, when `pacman-conf -l` lists an `omarchy` repo, for `packages.arch.desktop.omarchy`.
4. Builds the AUR list: `packages.arch.desktop.aur` plus `packages.arch.aur` for `desktop`/`laptop`, only `packages.arch.aur` for other roles. 4. Builds the AUR list: `packages.arch.desktop.aur` plus `packages.arch.aur` for `desktop`/`laptop`, only `packages.arch.aur` for other roles.
5. If the list is non-empty and `paru` exists, runs `paru -S --needed --noconfirm` on it. Without `paru` it prints `warning: paru not found — skipping AUR packages: …` and continues. 5. If the list is non-empty, runs `yay -S --needed --noconfirm` on it, falling back to `paru`. With neither it prints `warning: yay/paru not found — skipping AUR packages: …` and continues.
</Tab> </Tab>
<Tab title="macOS"> <Tab title="macOS">
@@ -101,12 +101,13 @@ Other personal automation units (brain-lens, omp-loop, rclone, hermes, voxtype)
## 40-post [#40-post] ## 40-post [#40-post]
`.chezmoiscripts/run_onchange_after_40-post.sh.tmpl` is post-apply housekeeping. It has no hash comment, so it only re-runs when the script itself is edited. `.chezmoiscripts/run_onchange_after_40-post.sh.tmpl` is post-apply housekeeping. It re-runs when the script is edited or `packages.shared.cargo` changes.
| Step | Condition | Action | | Step | Condition | Action |
| --- | --- | --- | | --- | --- | --- |
| bat cache | `bat` installed | `bat cache --build` | | bat cache | `bat` installed | `bat cache --build` |
| Font cache | Linux, `fc-cache` installed | `fc-cache -f` | | Font cache | Linux, `fc-cache` installed | `fc-cache -f` |
| cargo | `cargo` installed | `cargo install --locked <crate>` for each `packages.shared.cargo` entry missing from `cargo install --list` |
Each step ignores failures (`|| true`). tpm is cloned by [`.chezmoiexternal.toml`](/chezmoi/externals-and-ignore#externals), not here. Each step ignores failures (`|| true`). tpm is cloned by [`.chezmoiexternal.toml`](/chezmoi/externals-and-ignore#externals), not here.
+4 -3
View File
@@ -27,7 +27,8 @@ Two Wayland compositors are configured side by side. niri is the original setup,
| Source | Packages | | Source | Packages |
| --- | --- | | --- | --- |
| pacman | `niri`, `xdg-user-dirs` | | pacman | `niri`, `xwayland-satellite`, `polkit-gnome`, `uwsm`, `xdg-user-dirs`, Wayland utilities (`wl-clipboard`, `cliphist`, `wtype`, `ydotool`, `grim`, `slurp`, `hyprpicker`, `pamixer`, `brightnessctl`, `libnotify`) and the bound apps (`nautilus`, `imv`, `mpv`, `evince`, `chromium`, `obsidian`) |
| AUR (via `paru`) | `noctalia-shell`, `vicinae-bin` | | AUR (via `yay`/`paru`) | `noctalia-git`, `vicinae-bin`, `beeper-bin`, `fastmail`, `tldraw-offline-bin` |
| `[omarchy]` repo, when configured | `herdr`, `flea`, `voxtype-bin`, `xdg-terminal-exec`, `hyprland-preview-share-picker`, `brave-origin-bin`, `claude-desktop`, `1password`, `spotify` |
The script skips AUR packages with a warning if `paru` is not installed. Hyprland, Waybar, and the `omarchy-*` commands that the scripts call (`omarchy-menu`, `omarchy-launch-or-focus`, and others) come from an Omarchy install. This repo does not install them. See [chezmoi scripts](/chezmoi/scripts) for the full install flow. The script skips AUR packages with a warning if neither `yay` nor `paru` is installed. Hyprland, Waybar, and the `omarchy-*` commands that the scripts call (`omarchy-menu`, `omarchy-launch-or-focus`, and others) come from an Omarchy install. This repo does not install them. See [chezmoi scripts](/chezmoi/scripts) for the full install flow and [packages.yaml](/chezmoi/data#packagesyaml) for the complete lists.
+2 -2
View File
@@ -55,9 +55,9 @@ Linux `desktop` and `laptop` roles only. `.chezmoiignore.tmpl` skips `~/.config/
## Installation ## Installation
- `niri` and `xdg-user-dirs` from pacman, `noctalia-shell` and `vicinae-bin` from the AUR. Declared under `packages.arch.desktop` in `.chezmoidata/packages.yaml` and installed by `run_onchange_before_10-packages.sh.tmpl` for `desktop`/`laptop` roles. See [chezmoi scripts](/chezmoi/scripts). - `niri`, `xwayland-satellite`, `polkit-gnome`, `cliphist`, `wl-clipboard` and `xdg-user-dirs` from pacman, `noctalia-git` and `vicinae-bin` from the AUR. Declared under `packages.arch.desktop` in `.chezmoidata/packages.yaml` and installed by `run_onchange_before_10-packages.sh.tmpl` for `desktop`/`laptop` roles. See [chezmoi scripts](/chezmoi/scripts).
- `.chezmoiscripts/run_once_after_30-user-services.sh.tmpl` runs once on Linux. If `~/.config/systemd/user/nirinit.service` exists, it runs `systemctl --user daemon-reload` and `systemctl --user enable nirinit.service`. The script's comment says other personal units (brain-lens, omp-loop, rclone, hermes, voxtype) ship as files only and are enabled by hand. The repo does not currently contain `dot_config/systemd`, so the unit must come from elsewhere for the enable step to run. - `.chezmoiscripts/run_once_after_30-user-services.sh.tmpl` runs once on Linux. If `~/.config/systemd/user/nirinit.service` exists, it runs `systemctl --user daemon-reload` and `systemctl --user enable nirinit.service`. The script's comment says other personal units (brain-lens, omp-loop, rclone, hermes, voxtype) ship as files only and are enabled by hand. The repo does not currently contain `dot_config/systemd`, so the unit must come from elsewhere for the enable step to run.
- Tools the config calls but does not install: `cliphist`/`wl-paste`, `polkit-gnome`, `kbuildsycoca6`, `voxtype`, `niri-dynamic-workspaces`, `dot-screenshot`, `niri-smart-close`, `niri-smart-move`, and the `capitaine-cursors-light` cursor theme. `niri-smart-close`, `niri-smart-move`, and `dot-screenshot` are called by path or name but are not in this repo. [vicinae](/desktop/vicinae) is installed and configured here. - Tools the config calls but does not install: `kbuildsycoca6`, `niri-dynamic-workspaces`, `dot-screenshot`, `niri-smart-close`, `niri-smart-move`, and the `capitaine-cursors-light` cursor theme. `niri-smart-close`, `niri-smart-move`, and `dot-screenshot` are called by path or name but are not in this repo. `voxtype-bin` comes from the `[omarchy]` repo when present.
## Load order ## Load order
+2 -2
View File
@@ -23,7 +23,7 @@ The script checks the release tarball's SHA-256 before installing, as upstream d
<Steps> <Steps>
<Step title="Package manager"> <Step title="Package manager">
**Arch**: `sudo` for pacman. `paru` is needed for AUR packages (`topgrade`, and `noctalia-shell` / `vicinae-bin` on desktop roles); without it the package script prints a warning and skips them. **Arch**: `sudo` for pacman. `yay` (Omarchy ships it) or `paru` is needed for AUR packages (`topgrade`, `portop`, and the desktop apps on desktop roles); without one the package script prints a warning and skips them.
**macOS**: [Homebrew](https://brew.sh) is required; the package script exits with an error if `brew` is missing. **macOS**: [Homebrew](https://brew.sh) is required; the package script exits with an error if `brew` is missing.
</Step> </Step>
<Step title="GitHub access"> <Step title="GitHub access">
@@ -79,7 +79,7 @@ sh -c "$(curl -fsSL https://dots.prd.lk/install)" -- --version
`.chezmoi.toml.tmpl` asks once for **name**, **email**, and **role** (`desktop`, `laptop`, `mac`, `server`). Answers are stored in `~/.config/chezmoi/chezmoi.toml` and not asked again. See [Configuration](/chezmoi/config). `.chezmoi.toml.tmpl` asks once for **name**, **email**, and **role** (`desktop`, `laptop`, `mac`, `server`). Answers are stored in `~/.config/chezmoi/chezmoi.toml` and not asked again. See [Configuration](/chezmoi/config).
</Step> </Step>
<Step title="Packages"> <Step title="Packages">
`run_onchange_before_10-packages` installs everything in `.chezmoidata/packages.yaml` with pacman/paru or Homebrew before any file is written. See [Scripts](/chezmoi/scripts). `run_onchange_before_10-packages` installs everything in `.chezmoidata/packages.yaml` with pacman/yay or Homebrew before any file is written. See [Scripts](/chezmoi/scripts).
</Step> </Step>
<Step title="Files and externals"> <Step title="Files and externals">
Configs are linked into `$HOME` (symlink mode). The neovim config and a bat syntax are cloned as externals. See [Externals and ignore rules](/chezmoi/externals-and-ignore). Configs are linked into `$HOME` (symlink mode). The neovim config and a bat syntax are cloned as externals. See [Externals and ignore rules](/chezmoi/externals-and-ignore).
+1 -1
View File
@@ -63,7 +63,7 @@ These packages are declared in `.chezmoidata/packages.yaml` but have no config f
| `wget` | HTTP downloads | Not referenced by any config. | | `wget` | HTTP downloads | Not referenced by any config. |
| `zsh-syntax-highlighting` | zsh highlighting | Sourced by the zsh setup. See [Shell](/shell). | | `zsh-syntax-highlighting` | zsh highlighting | Sourced by the zsh setup. See [Shell](/shell). |
| `ttf-victor-mono-nerd` / `font-victor-mono-nerd-font` | Nerd Font | Terminal font. See [Terminal](/terminal). | | `ttf-victor-mono-nerd` / `font-victor-mono-nerd-font` | Nerd Font | Terminal font. See [Terminal](/terminal). |
| `suvadu` | Declared under `packages.shared.cargo` | No install script reads the `cargo` list, so it is not installed automatically. | | `suvadu`, `mandible` | Declared under `packages.shared.cargo` | Installed by [`40-post`](/chezmoi/scripts#40-post) when `cargo` exists. `mandible` backs the tmux-palette "mandible" item via `~/.local/bin/mandible-pick`. |
Tools with their own pages in other sections: [fish](/shell/fish), [starship](/shell/starship), and [atuin](/shell/atuin) under Shell; [kitty](/terminal/kitty) and [tmux](/terminal/tmux) under Terminal. Tools with their own pages in other sections: [fish](/shell/fish), [starship](/shell/starship), and [atuin](/shell/atuin) under Shell; [kitty](/terminal/kitty) and [tmux](/terminal/tmux) under Terminal.