Skip to content

Repository files navigation

run

One command. Any project. Zero configuration.

CIReleaseLicense

run test

That's it. Whether your project uses npm, yarn, pnpm, bun, cargo, poetry, gradle, or any of 20+ other tools — run figures it out.

Why?

Every project has its own package manager. Every time you switch projects, you ask yourself:

"Was this npm or yarn? pnpm? Does it have a Makefile?"

run eliminates this friction. Just type run <command> and it works.

Install

# Linux/macOS
curl -fsSL install.cat/verseles/run | bash
# Windows (PowerShell)
irm install.cat/verseles/run | iex
# Or via Cargo
cargo install run-cli

Usage

run test# Runs test with detected tool
run build # Runs build
run lint # Runs lint
run dev # Runs dev server# Pass arguments after --
run test -- --coverage --watch
# Works from any subdirectorycd src/components && run test# Finds package.json in parent dirs

Supported Tools

EcosystemTools (priority order)
Monoreponx → turbo → lerna
Node.jsbun → pnpm → yarn → npm
Denodeno
Pythonuv → poetry → pipenv → pip
Rustcargo
PHPcomposer
Gotask → go
Rubybundler → rake
Javagradle → maven
.NETdotnet
Elixirmix
Swiftswift (SPM)
Zigzig
Genericjust → make

Detection is based on lockfiles first (more specific), then manifest files.

Options

run test --dry-run # Show command without executing
run test --verbose # Show detection details
run test --quiet # Suppress output except errors
run test --levels=5 # Search up to 5 parent directories (default: 3)
run test --ignore=npm,yarn # Skip specific runners
run --update # Force update check

Configuration

Create ~/.config/run/config.toml for global settings:

max_levels = 5auto_update = trueignore_tools = ["npm"]
# Advanced update settings (optional)
[update]
enabled = true# Enable auto-update (default: true)check_interval_hours = 2# Hours between update checks (default: 2)

Or run.toml in your project for local overrides.

Precedence: CLI args > local config > global config > defaults

Conflict Resolution

When multiple lockfiles exist (e.g., package-lock.json + yarn.lock):

  1. Corepack — If package.json has a packageManager field, uses that tool
  2. If only one tool is installed → uses it with a warning
  3. If multiple tools installed → error with suggested action
  4. If no tools installed → shows installation instructions

Exit Codes

CodeMeaning
0Success (passes through original exit code)
1Generic error
2No runner found
3Lockfile conflict
127Tool not installed

Auto-Update

Updates happen silently in the background after commands complete (every 2 hours by default).

Disable with:

  • Environment variable: RUN_NO_UPDATE=1
  • Legacy config: auto_update = false
  • New config section: [update] enabled = false

Shell Completions

# Bash
run completions bash >~/.local/share/bash-completion/completions/run
# Zsh
run completions zsh >~/.zsh/completion/_run
# Fish
run completions fish >~/.config/fish/completions/run.fish
# PowerShell
run completions powershell >>$PROFILE

Development

git clone https://github.com/verseles/run.git
cd run
make precommit # Format, lint, test, audit
cargo build --release

License

AGPL-3.0. See LICENSE.


Made with mass production by Verseles

About

One command. Any project. Zero configuration.

Topics

Resources

Stars

11 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages