Skip to content

Package ownership and convergence

Package lists are declarations, not a list of commands to run manually. A package should have one manager owner so upgrades and PATH selection stay predictable.

OwnerManifestIntended contents
Homebrewpackages/Brewfilesystem tools, formulae, casks, development SDKs
cargo-binstallpackages/cargo.txtrelease-binary Rust CLIs
npm under nvmpackages/npm.txtNode CLI tools, Codex, browser CLIs
uv toolpackages/pip.txtisolated Python CLI environments
Gopackages/go.txtGo command-line tools
agent configpackage lists beside installersplugins, extensions, MCP endpoints, skills

The Cargo manifest states why it excludes tools without release binaries (source). The npm manifest similarly makes Codex npm-owned while install/codex.sh owns its configuration and health check (source).

Bootstrap installs Homebrew before language runtimes, then invokes Python, Node, Rust, Go, Julia, Lean, and TeX in a fixed order (source). The Node installer keeps nvm’s selected binary ahead of a Homebrew Node, because native npm add-ons are tied to the Node ABI (source). The Python installer puts each CLI tool in its own uv environment, while the managed python wrapper uses one interactive environment (source).

When adding a tool, identify the executable, the owner, the supported platform, and a meaningful health check before changing a list. Do not install the same CLI with both Homebrew and npm, pip and uv, or Cargo and a tap merely because both work. Use package setup for current commands and updates for routine reconciliation.

Terminal window
# Inspect declared ownership before changing it.
rg -n '(^|/)tool-name([ @#]|$)' packages install home
./tests/ci.sh full