Universal task runner for modern development
βββββββ βββ βββββββ βββ
βββββββββββ ββββββββ βββ
βββββββββββ βββββββββ βββ
βββββββββββ βββββββββββββ
βββ βββββββββββββββ ββββββ
βββ βββ βββββββ βββ βββββ
Universal Task Runner
run automatically detects your project's package manager or build tool and executes commands through the appropriate tool. No more remembering if a project uses npm, yarn, pnpm, bun, poetry, cargo, or any other tool!
- π Auto-detection - Automatically detects 20+ package managers and build tools
- π Recursive search - Works from any subdirectory
- β‘ Fast - Cold start < 50ms
- π§ Zero config - Works out of the box
- π Auto-update - Keeps itself up to date in the background
- π¨ Beautiful output - Colored output with clear status messages
- π Shell completions - Bash, Zsh, Fish, and PowerShell support
Linux/macOS:
curl -fsSL https://raw.githubusercontent.com/verseles/run/main/install.sh | bashWindows (PowerShell):
irm https://raw.githubusercontent.com/verseles/run/main/install.ps1 | iexcargo install run-cliDownload the latest release from the Releases page.
| Ecosystem | Tool | Detection | Command |
|---|---|---|---|
| Node.js | Bun | bun.lockb / bun.lock |
bun run <cmd> |
| PNPM | pnpm-lock.yaml |
pnpm run <cmd> |
|
| Yarn | yarn.lock |
yarn run <cmd> |
|
| NPM | package-lock.json / package.json |
npm run <cmd> |
|
| Python | UV | uv.lock |
uv run <cmd> |
| Poetry | poetry.lock |
poetry run <cmd> |
|
| Pipenv | Pipfile.lock |
pipenv run <cmd> |
|
| Pip | requirements.txt |
python -m <cmd> |
|
| Rust | Cargo | Cargo.toml |
cargo <cmd> |
| PHP | Composer | composer.lock |
composer run <cmd> |
| Go | Task | Taskfile.yml |
task <cmd> |
| Go | go.mod |
go <cmd> |
|
| Ruby | Bundler | Gemfile.lock |
bundle exec <cmd> |
| Rake | Rakefile |
rake <cmd> |
|
| Java | Gradle | build.gradle |
gradle <cmd> |
| Maven | pom.xml |
mvn <cmd> |
|
| .NET | dotnet | *.csproj / *.sln |
dotnet <cmd> |
| Elixir | Mix | mix.exs |
mix <cmd> |
| Swift | SPM | Package.swift |
swift run <cmd> |
| Zig | Zig | build.zig |
zig build <cmd> |
| Generic | Make | Makefile |
make <cmd> |
# Run a script from your project
run test
# Run build
run build
# Run any command
run lintUse -- to pass arguments to the underlying command:
# Pass arguments to the test command
run test -- --coverage --verbose
# Build with specific flags
run build -- --productionrun automatically searches up the directory tree to find your project's configuration:
cd src/components
run test # Finds package.json in parent directories# Search up to 5 levels (default: 3)
run test --levels=5
# Ignore specific runners
run start --ignore=npm,yarn
# Show detailed detection info
run build --verbose
# Suppress all output except errors
run test --quiet
# Show command without executing (dry run)
run deploy --dry-run
# Force update check
run --updateCreate ~/.config/run/config.toml:
# Maximum levels to search above current directory
max_levels = 5
# Enable auto-update (default: true)
auto_update = true
# Tools to always ignore
ignore_tools = ["npm"]
# Enable verbose output by default
verbose = false
# Enable quiet mode by default
quiet = falseCreate run.toml in your project root:
# Override global settings for this project
max_levels = 2
ignore_tools = ["yarn"]- CLI arguments (highest priority)
- Project config (
./run.toml) - Global config (
~/.config/run/config.toml) - Built-in defaults
Generate completions for your shell:
# Bash (add to ~/.bashrc)
mkdir -p ~/.local/share/bash-completion/completions
run completions bash > ~/.local/share/bash-completion/completions/run
# Zsh (add to ~/.zshrc)
mkdir -p ~/.zsh/completion
run completions zsh > ~/.zsh/completion/_run
fpath=(~/.zsh/completion $fpath)
autoload -Uz compinit && compinit
# Fish
mkdir -p ~/.config/fish/completions
run completions fish > ~/.config/fish/completions/run.fish
# PowerShell (add to $PROFILE)
if (!(Test-Path -Path $PROFILE)) { New-Item -ItemType File -Path $PROFILE -Force }
run completions powershell >> $PROFILErun automatically updates itself in the background after each command. Updates are silent and non-blocking.
- Updates happen after your command finishes
- Failed updates are silently ignored
- Disable with
RUN_NO_UPDATE=1orauto_update = falsein config
After an update, you'll see a notification on the next run:
β¬ run was updated: v0.1.0 β v0.2.0
Main changes:
- Added support for Zig and Swift
- Improved conflict detection
See full changelog: https://github.com/verseles/run/releases/tag/v0.2.0
When multiple lockfiles from the same ecosystem are detected:
- Only one tool installed: Uses that tool with a warning
- Multiple tools installed: Shows an error with suggested actions
- No tools installed: Shows installation instructions
Example conflict message:
β Detected Node.js with multiple lockfiles (package-lock.json, yarn.lock).
Both tools (npm, yarn) are installed.
Action needed: Remove the outdated lockfile or use --ignore=npm
| Code | Meaning |
|---|---|
| 0 | Success (or original command exit code) |
| 1 | Generic error |
| 2 | Runner not found |
| 3 | Lockfile conflict |
| 127 | Tool not installed |
git clone https://github.com/verseles/run.git
cd run
cargo build --releasecargo test --all-features./scripts/pre-push.shOr install as a git hook:
ln -s ../../scripts/pre-push.sh .git/hooks/pre-push- MVP with 20+ runners
- Auto-update via GitHub Releases
- Configuration system
- Shell completions
- Cache detection results
- Workspace/monorepo support (Nx, Turborepo)
- Plugin system for custom runners
- VS Code extension
This project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).
See LICENSE for details.
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Made with π€ by Verseles