Every package manager on your machine, one command.
repoke finds Homebrew, npm, pnpm, pip, cargo, apt, winget and the rest of what you have installed, shows what is outdated and upgrades what you pick. In a terminal it asks first. In scripts, schedules and AI agents it runs without asking and answers in JSON.
Install
brew tap paveldelpozo/tap && brew trust paveldelpozo/tap
brew install repoke
or with Rust
cargo install repoke
Or download the binary for macOS, Linux or Windows from the releases. repoke self-update keeps it current.
It finds what you use
Every manager repoke knows is looked for, and the ones that aren't there are skipped. This is repoke list on the Mac where repoke is written:
brew Homebrew 7.0.11-24-g2833c25
mas Mac App Store not found
npm npm (global) 12.2.1
pnpm pnpm (global) 12.15.0
fnm fnm (Node.js) 1.39.0
nvm nvm (Node.js) not found
pip pip (user) 26.2.2
uv uv (tools) 0.13.6
cargo cargo (installed crates) 1.99.1
rustup rustup (toolchains) 1.29.2
gem RubyGems not found
composer Composer (global) 2.10.2
mise mise (tools) not found
omz oh-my-zsh 17a2b4c
vscode VS Code extensions 1.143.1
System
Homebrew, Mac App Store, APT, DNF, pacman, zypper, Snap, Flatpak, WinGet, Scoop, Chocolatey
Languages and tools
npm and pnpm globals, Node through fnm or nvm, pip, uv, cargo, rustup, RubyGems, Composer, mise
The last two lines above are plugins, which is how anything else gets in.
Check first, upgrade what you choose
repoke check # what is outdated; nothing changes
repoke upgrade # pick from a list, everything preselected
repoke upgrade --dry-run # the commands it would run
repoke upgrade --hold eslint # leave a package where it is
Each package gets a line with its result and how long it took, and a failure shows the command with the end of its output. Managers run side by side while checking and one after another while upgrading. npm installs the exact version it listed, so a newer release can't break the Node you have. Node versions under fnm or nvm move to the newest release of their major line and take your global packages with them.
A new machine, and updates while you sleep
repoke export # what you installed, and your config files if you want
repoke init --from snapshot # on the new machine, only what is missing
repoke init # or pick tools from a catalog
Values that look like secrets, such as registry tokens in .npmrc, are taken out before a snapshot is saved, and a restore never replaces one of your files without asking first and keeping yours as a backup.
repoke schedule install # every day at 03:00, upgrades what needs no sudo
repoke schedule install --check-only # or only check, and notify
repoke schedule status # when it runs, and how the last run went
repoke schedule run # run the job now
repoke schedule remove
The schedule goes through the system's own scheduler: launchd on macOS, a systemd timer on Linux, Task Scheduler on Windows. A run missed while the machine slept happens when it wakes up. Each run keeps its output and a history, and you get a system notification when something was upgraded, failed or is waiting.
For scripts, agents and plugins
repoke check --json # exits 100 when something is outdated
repoke upgrade --yes --no-sudo --json # one JSON event per line
repoke mcp # MCP server over stdio
Without a terminal, repoke never waits for input: a manager that wants a password is skipped or fails at once. repoke mcp gives AI agents four tools: list_managers, check_updates, upgrade and schedule_status. upgrade only previews until it is told otherwise, and never uses sudo. In Claude Code:
/plugin install repoke --marketplace paveldelpozo/repoke
Codex and other MCP clients run repoke mcp as a stdio server; the reference has the configuration.
repoke plugin search # official plugins: oh-my-zsh, VS Code extensions…
repoke plugin install vscode # shows its code and asks before installing
repoke plugin new my-tool # start your own from a template
Any other manager can be added with a TOML file or a small executable. The plugin guide explains both.
All commands
list | The managers repoke supports here, installed or not |
check | What is outdated, without changing anything |
upgrade | Upgrade what you pick, or everything with --yes |
export | Save what is installed, and your config, to restore elsewhere |
init | Set up a machine from a snapshot or a catalog |
schedule | install, status, run and remove a periodic run |
self-update | Update repoke itself |
mcp | Serve repoke's tools to AI agents |
plugin | list, new, search, install and remove plugins |
The command reference has every option, the configuration file, the JSON output and the exit codes.