Omnes is a universal package manager CLI. One command to rule them all.
Omnes — Latin for "all of them."
Stop context-switching between npm run, yarn, pnpm, and bun. Omnes detects your project's package manager and proxies commands through it. Muscle memory stays intact. Workflows stay consistent.
- One command, every manager — the same verbs work across npm, yarn, pnpm, and bun
- Auto-detection — reads your project's lockfile to pick the right manager, with zero config
- Transparent proxy — passes commands straight through, so muscle memory and scripts stay intact
- Monorepo aware — resolves the correct workspace in multi-package repos
- Full verb set — covers install, run, add, exec, and dlx
- Single global CLI — one tiny binary, installed once
npm install -g omnes-cli
yarn global add omnes-cli
pnpm add -g omnes-cli
bun add -g omnes-cli
omnes <command> [args...]
Omnes passes your command directly to the detected package manager. No configuration. No setup. It just works.
# Install dependencies omnes install # Run scripts omnes run dev omnes run build omnes run test # Add packages omnes add react omnes add -D typescript # Execute binaries omnes exec vitest omnes dlx create-next-app
Without Omnes, you need to remember which package manager each project uses:
# Project A (uses npm) npm install npm run dev # Project B (uses pnpm) pnpm install pnpm dev # Project C (uses bun) bun install bun run dev
With Omnes:
# Any project
omnes install
omnes run devOmnes walks up from the current directory to the filesystem root. In each directory it checks two signals, in order, and the closest directory with a match wins:
- Corepack
packageManagerfield inpackage.json(e.g."packageManager": "pnpm@9.1.0"). This is the most explicit signal, so it takes precedence over a lockfile in the same directory. - Lockfile presence. When several lockfiles sit in one directory, the first by priority wins:
| Priority | Lockfile | Package Manager |
|---|---|---|
| 1 | bun.lockb |
bun |
| 2 | bun.lock |
bun |
| 3 | pnpm-lock.yaml |
pnpm |
| 4 | yarn.lock |
yarn |
| 5 | package-lock.json |
npm |
No signal found anywhere up the tree? Falls back to npm.
| Flag | Description |
|---|---|
--help, -h |
Display help message |
--version, -v |
Display version number |
Omnes handles npm's quirk of requiring run for custom scripts. Built-in npm commands work without it:
# These work as expected omnes test # → npm test omnes start # → npm start omnes install # → npm install # Custom scripts automatically get 'run' prefix for npm omnes dev # → npm run dev (if npm detected) omnes dev # → bun dev (if bun detected)
The following commands are recognized as npm built-ins and don't receive the run prefix:
| Category | Commands |
|---|---|
| Lifecycle | test, start, stop, restart |
| Dependencies | install, uninstall, update, link, dedupe, prune |
| Publishing | publish, pack, version |
| Info | ls, outdated, audit, view, search |
| Execution | exec, run, ci |
| Config | config, set, get, cache |
| Auth | login, logout, whoami |
| Other | init, doctor, rebuild, help |
Omnes traverses the directory tree upward to find lockfiles. This means it works seamlessly in monorepo structures where the lockfile lives at the repository root.
my-monorepo/
├── pnpm-lock.yaml ← Omnes finds this
├── packages/
│ ├── web/
│ │ └── package.json
│ └── api/
│ └── package.json ← Running omnes here still works
cd my-monorepo/packages/api omnes install # → pnpm install (detected from root)
| Code | Description |
|---|---|
0 |
Success (or child process success) |
1 |
General error |
127 |
Package manager not found in PATH |
* |
Proxied from child process |
Informational messages go to stderr, keeping stdout clean for piping:
# stderr: "Using bun: bun install" # stdout: [actual command output] omnes install
# Piping works as expected omnes run build 2>/dev/null | head -n 10
Omnes passes arguments directly to spawn() without shell interpolation. No command injection. No glob expansion surprises. What you type is what gets executed.
# Arguments with spaces are preserved omnes run script "hello world" # Passed correctly as single argument # Special characters are safe omnes add "package@^1.0.0" # No shell interpretation
Error: 'pnpm' is not installed or not in PATH
Install the detected package manager or remove its lockfile to fall back to another.
If multiple lockfiles exist (common during migrations), Omnes uses the first match by priority. Remove stale lockfiles or manually specify your package manager in npm scripts.
If a custom script isn't running with npm:
# Explicit run prefix always works omnes run my-script # Or add to npm built-ins recognition won't help—use run prefix
One command. Any project. Zero configuration.
Omnes exists because developer tooling should reduce friction, not add it. Switching between projects shouldn't require mental overhead about which package manager to use.