repoke

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

listThe managers repoke supports here, installed or not
checkWhat is outdated, without changing anything
upgradeUpgrade what you pick, or everything with --yes
exportSave what is installed, and your config, to restore elsewhere
initSet up a machine from a snapshot or a catalog
scheduleinstall, status, run and remove a periodic run
self-updateUpdate repoke itself
mcpServe repoke's tools to AI agents
pluginlist, new, search, install and remove plugins

The command reference has every option, the configuration file, the JSON output and the exit codes.