On an Omarchy laptop, bootstrap left two copies of almost everything:
VS Code twice: pacman's visual-studio-code-bin (1.140.0) plus the dotfiles tarball (1.139.0). That meant two "Visual Studio Code" menu entries, with both builds using the same ~/.config/Code profile, so the older build ends up running on a profile the newer one already migrated.
CLIs twice: kubectl, helm, k9s, kubectx, yq, jq, node and ansible in ~/.local/bin, behind mise/pacman copies that always come first on PATH (Omarchy puts ~/.local/bin last). The dotfiles copies never ran.
zsh-only helpers: opr/opc/opd/opl/ops, grmb and secrets.env loading lived only in zsh/zshrc. The login shell is bash and zsh/ can't install zsh there (no dnf/apt), so the helpers were missing and vault variables were unset.
Changes
lib/fetch.sh: new shadowed <name> helper. It returns true when another copy of the tool comes earlier on PATH than ~/.local/bin, which means a copy there would never run. It's always false when ~/.local/bin is first (the VMs, via zshrc) or not on PATH yet (a fresh box), so VM installs are unchanged. A mise shim only counts if mise which resolves it.
bin/, node/, ansible/: skip shadowed tools. try now takes the binary name.
vscode/: defers to any system code on PATH. It skips the install and removes a tarball copy it put there earlier (recognized by its .desktopExec path). This replaces the old dnf/apt-only note, which also wouldn't match on Arch.
bash/ (new): a bash version of the zshrc helpers, copied to ~/.config/dotfiles/dotfiles.bash. One marked source block is added to ~/.bashrc, the same pattern mcp-config uses. It never owns ~/.bashrc and no-ops without one. Wired into bootstrap.sh after zsh; zsh/zshrc has a note to keep the two in sync.
README: documents all of the above.
Verification
shellcheck -s sh: no new findings; the only warnings are patterns the repo already uses (CDPATH= cd, SC1091 infos).
On the Omarchy box, bin/, node/, ansible/, vscode/ and bash/ each ran twice. The first run skipped the shadowed tools and cleaned up the VS Code tarball; the second run changed nothing. Tools that only dotfiles provides (stern, tofu, op, …) still report "already installed".
shadowed tested against: a VM-style PATH (~/.local/bin first → installs), ~/.local/bin off PATH (→ installs), a configured mise shim (→ skips), and a dead shim (→ ignored).
Bash helpers: loaded in a fresh interactive shell, validation errors behave, and opr read back a field matching secrets.env.
Not run: the Debian/Rocky container checks from verify-module.
On an Omarchy laptop, bootstrap left two copies of almost everything:
- **VS Code twice**: pacman's `visual-studio-code-bin` (1.140.0) plus the dotfiles tarball (1.139.0). That meant two "Visual Studio Code" menu entries, with both builds using the same `~/.config/Code` profile, so the older build ends up running on a profile the newer one already migrated.
- **CLIs twice**: kubectl, helm, k9s, kubectx, yq, jq, node and ansible in `~/.local/bin`, behind mise/pacman copies that always come first on PATH (Omarchy puts `~/.local/bin` last). The dotfiles copies never ran.
- **zsh-only helpers**: `opr`/`opc`/`opd`/`opl`/`ops`, `grmb` and `secrets.env` loading lived only in `zsh/zshrc`. The login shell is bash and `zsh/` can't install zsh there (no dnf/apt), so the helpers were missing and vault variables were unset.
## Changes
- **`lib/fetch.sh`**: new `shadowed <name>` helper. It returns true when another copy of the tool comes *earlier* on PATH than `~/.local/bin`, which means a copy there would never run. It's always false when `~/.local/bin` is first (the VMs, via zshrc) or not on PATH yet (a fresh box), so VM installs are unchanged. A mise shim only counts if `mise which` resolves it.
- **`bin/`, `node/`, `ansible/`**: skip shadowed tools. `try` now takes the binary name.
- **`vscode/`**: defers to any system `code` on PATH. It skips the install and removes a tarball copy it put there earlier (recognized by its `.desktop` `Exec` path). This replaces the old dnf/apt-only note, which also wouldn't match on Arch.
- **`bash/`** (new): a bash version of the zshrc helpers, copied to `~/.config/dotfiles/dotfiles.bash`. One marked source block is added to `~/.bashrc`, the same pattern mcp-config uses. It never owns `~/.bashrc` and no-ops without one. Wired into `bootstrap.sh` after `zsh`; `zsh/zshrc` has a note to keep the two in sync.
- **README**: documents all of the above.
## Verification
- `shellcheck -s sh`: no new findings; the only warnings are patterns the repo already uses (`CDPATH= cd`, SC1091 infos).
- On the Omarchy box, `bin/`, `node/`, `ansible/`, `vscode/` and `bash/` each ran twice. The first run skipped the shadowed tools and cleaned up the VS Code tarball; the second run changed nothing. Tools that only dotfiles provides (stern, tofu, op, …) still report "already installed".
- `shadowed` tested against: a VM-style PATH (`~/.local/bin` first → installs), `~/.local/bin` off PATH (→ installs), a configured mise shim (→ skips), and a dead shim (→ ignored).
- Bash helpers: loaded in a fresh interactive shell, validation errors behave, and `opr` read back a field matching `secrets.env`.
- **Not run:** the Debian/Rocky container checks from `verify-module`.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
On an Omarchy laptop bootstrap left two of almost everything: VS Code from
both pacman and the tarball (two menu entries, one shared ~/.config/Code
profile), and kubectl/helm/k9s/kubectx/yq/jq/node/ansible in ~/.local/bin
behind mise and pacman copies that always won on PATH. The zsh helpers
(op*, grmb, secrets.env) also never reached the bash login shell.
- lib/fetch.sh: add `shadowed`, true when another copy of a tool comes
earlier on PATH than ~/.local/bin. Always false where zshrc puts
~/.local/bin first, so VM installs are unchanged.
- bin/, node/, ansible/: skip tools that are shadowed.
- vscode/: defer to any system `code`, and remove a tarball copy this
module installed earlier.
- bash/: new module; bash port of the zshrc helpers, sourced from
~/.bashrc via a marked block. No-ops without ~/.bashrc.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
You are not authorized to merge this pull request.
This pull request can be merged automatically.
View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
On an Omarchy laptop, bootstrap left two copies of almost everything:
visual-studio-code-bin(1.140.0) plus the dotfiles tarball (1.139.0). That meant two "Visual Studio Code" menu entries, with both builds using the same~/.config/Codeprofile, so the older build ends up running on a profile the newer one already migrated.~/.local/bin, behind mise/pacman copies that always come first on PATH (Omarchy puts~/.local/binlast). The dotfiles copies never ran.opr/opc/opd/opl/ops,grmbandsecrets.envloading lived only inzsh/zshrc. The login shell is bash andzsh/can't install zsh there (no dnf/apt), so the helpers were missing and vault variables were unset.Changes
lib/fetch.sh: newshadowed <name>helper. It returns true when another copy of the tool comes earlier on PATH than~/.local/bin, which means a copy there would never run. It's always false when~/.local/binis first (the VMs, via zshrc) or not on PATH yet (a fresh box), so VM installs are unchanged. A mise shim only counts ifmise whichresolves it.bin/,node/,ansible/: skip shadowed tools.trynow takes the binary name.vscode/: defers to any systemcodeon PATH. It skips the install and removes a tarball copy it put there earlier (recognized by its.desktopExecpath). This replaces the old dnf/apt-only note, which also wouldn't match on Arch.bash/(new): a bash version of the zshrc helpers, copied to~/.config/dotfiles/dotfiles.bash. One marked source block is added to~/.bashrc, the same pattern mcp-config uses. It never owns~/.bashrcand no-ops without one. Wired intobootstrap.shafterzsh;zsh/zshrchas a note to keep the two in sync.Verification
shellcheck -s sh: no new findings; the only warnings are patterns the repo already uses (CDPATH= cd, SC1091 infos).bin/,node/,ansible/,vscode/andbash/each ran twice. The first run skipped the shadowed tools and cleaned up the VS Code tarball; the second run changed nothing. Tools that only dotfiles provides (stern, tofu, op, …) still report "already installed".shadowedtested against: a VM-style PATH (~/.local/binfirst → installs),~/.local/binoff PATH (→ installs), a configured mise shim (→ skips), and a dead shim (→ ignored).oprread back a field matchingsecrets.env.verify-module.🤖 Generated with Claude Code
View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.