https://github.com/mxcl/package-manager-manager
How many Packages would a Package Manager manage if a Package Manager could manage Package Managers?
https://github.com/mxcl/package-manager-manager
Last synced: 9 days ago
JSON representation
How many Packages would a Package Manager manage if a Package Manager could manage Package Managers?
- Host: GitHub
- URL: https://github.com/mxcl/package-manager-manager
- Owner: mxcl
- Created: 2026-07-02T13:23:09.000Z (23 days ago)
- Default Branch: main
- Last Pushed: 2026-07-14T12:30:00.000Z (11 days ago)
- Last Synced: 2026-07-14T14:23:40.692Z (11 days ago)
- Language: Swift
- Homepage: https://mxcl.dev/package-manager-manager/
- Size: 50 MB
- Stars: 3
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Agents: AGENTS.md
Awesome Lists containing this project
README

# Package Manager Manager
The time when one package manager was all you needed is long gone. pkg⋅mgr²
inventories your package managers and their packages, so you can see what you
have, what’s outdated, and what’s taking up space.
Use whatever you want without compromising visibility into what’s going on.
> [!TIP]
> No need to remember to `npx ***@latest` anymore. We update `npx`’d stuff too.
## Quickstart
```sh
brew install --cask mxcl/made/package-manager-manager
```
> No brew? [Download the `.dmg` from `./releases/`](https://github.com/mxcl/pmm/releases/latest).

## Manage Your Other Macs
pkg⋅mgr² can update and uninstall packages on any Mac you already reach over
SSH, including Macs on your local network or Tailscale network.
1. Install Package Manager Manager in `/Applications` on each Mac.
2. Make sure SSH works non-interactively and the host key is trusted:
```sh
ssh pangolin true
```
3. Choose **Package Manager Manager → Add / Edit Hosts…** and add the SSH host
or an alias from `~/.ssh/config`.
Each Mac gets its own Installed and Outdated sections in the sidebar. You can
update one package, update everything outdated, or uninstall a package from the
remote Mac.
pkg⋅mgr² uses OpenSSH directly. Your keys, agent, host aliases, and
`known_hosts` stay where they already live; the app stores no SSH credentials.
## What It Finds
pkg⋅mgr² currently inventories:
- Homebrew formulae and casks
- tools and runtimes installed with `mise`
- global npm packages
- npx cache entries
- global agent skills installed with `skills` or `npx skills`
- `uv tool` tools and `uv` Python installs
- `uvx` cached environments
- `cargo install` binaries
- `rustup` and installed Rust toolchains
It also pulls package summaries, categories, URLs, and latest-version metadata
where the project has a source for it. If metadata is missing, the package still
shows up. It just looks less informed.
## Adding New Package Managers
Get your agent to add new package managers and give us a PR.
> [!NOTE]
>
> We want to support everything! Yes! Everything!
### Instructions to Agents
Keep new manager support boring and off the main thread. The menu bar helper
runs `PackageScanner.inventory(database:)` in the background, writes a
`PackageHostSnapshot`, and the main app renders that snapshot. Do not add package
manager scans, network loads, or shell commands to SwiftUI views or main-window
models.
Checklist:
- Add the manager to `PackageManagerKind` in `Sources/PMMCore/Models.swift`.
- Add one `scanX(database:)` method to `Sources/PMMCore/PackageScanner.swift`
and call it from `inventory(database:)`. Return `[]` when the tool is missing
or the manager has no local state.
- Build `ManagedPackage` values with stable `identifier` prefixes, readable
`displayName`, `installedVersion`, optional `latestVersion`, and install or
binary paths when cheap to find.
- Wire update/uninstall only when the native command is obvious:
`PackageUpdater`, `PackageUninstaller`, and their `supports(_:)` methods.
Inventory-only support is fine.
- Put the manager in a sidebar group in `MainWindowModel.swift` and give it a
dashboard SF Symbol in `MainWindowDashboardView.swift`.
- Map it in `PackageDossierClient.provider(for:)` only if AutomIC Vault has a
matching provider.
- Update the README lists under "What It Finds" and "Updating and Removing".
- Add focused tests beside the touched code: scanner parsing in
`PackageScannerTests`, action commands in `PackageUpdaterTests` or
`PackageUninstallerTests`, and UI grouping in `MainWindowModelTests` when a
new section changes.
## Caveats
pkg⋅mgr² shells out to your package managers. It does not replace them, normalize
their data perfectly, or pretend their caches are a coherent database.
Homebrew metadata requires `brew update` in the helper refresh path. Network
metadata is best-effort; local inventory should still work when that data is
unavailable.
Remote management requires a compatible version of Package Manager Manager in
`/Applications` on the other Mac. Interactive SSH passwords and first-connection
host-key prompts are not supported inside the app; connect once in Terminal
before adding the host.