Package ownership and convergence
One owner per executable
Section titled “One owner per executable”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.
| Owner | Manifest | Intended contents |
|---|---|---|
| Homebrew | packages/Brewfile | system tools, formulae, casks, development SDKs |
| cargo-binstall | packages/cargo.txt | release-binary Rust CLIs |
| npm under nvm | packages/npm.txt | Node CLI tools, Codex, browser CLIs |
| uv tool | packages/pip.txt | isolated Python CLI environments |
| Go | packages/go.txt | Go command-line tools |
| agent config | package lists beside installers | plugins, 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).
How convergence works
Section titled “How convergence works”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.
# Inspect declared ownership before changing it.rg -n '(^|/)tool-name([ @#]|$)' packages install home./tests/ci.sh full