One command. Any project. Zero configuration.
devrunner test
# or the short alias:
dr test
That's it. Whether your project uses npm, yarn, pnpm, bun, cargo, poetry, gradle, or any of 20+ other tools — devrunner (or dr) figures it out.
Modern development involves constantly context-switching between different ecosystems.
- "What command do I run?" Is this project using
npm,yarn,pnpm,cargo,poetry, ormake?devrunnereliminates this friction. Just typedr buildand it works. - "I don't have that tool installed." Thanks to our Zero-Install Architecture, if you clone a project and don't have
cargoornpminstalled,devrunnerwill seamlessly proxy tomiseorprototo silently provision the correct toolchain in the background.
One command. No manual tool installations.
# Linux/macOS
curl -fsSL install.cat/princepal9120/devrunner | bash
# Windows (PowerShell)
irm install.cat/princepal9120/devrunner | iex
# Or via Cargo
cargo install devrunner-clidevrunner test # Runs test with detected tool
devrunner build # Runs build
devrunner lint # Runs lint
devrunner dev # Runs dev server
# Pass arguments after --
devrunner test -- --coverage --watch
# Works from any subdirectory
cd src/components && devrunner test # Finds package.json in parent dirs| Ecosystem | Tools (priority order) |
|---|---|
| Monorepo | nx → turbo → lerna |
| Node.js | bun → pnpm → yarn → npm |
| Deno | deno |
| Python | uv → poetry → pipenv → pip |
| Rust | cargo |
| PHP | composer |
| Go | task → go |
| Ruby | bundler → rake |
| Java | gradle → maven |
| .NET | dotnet |
| Elixir | mix |
| Swift | swift (SPM) |
| Zig | zig |
| Generic | just → make |
Detection is based on lockfiles first (more specific), then manifest files.
devrunner test --dry-run # Show command without executing
devrunner test --verbose # Show detection details
devrunner test --quiet # Suppress output except errors
devrunner test --levels=5 # Search up to 5 parent directories (default: 3)
devrunner test --ignore=npm,yarn # Skip specific runners
devrunner test --no-auto-install # Skip auto-install, show hint only
devrunner --update # Force update checkCreate ~/.config/devrunner/config.toml for global settings:
max_levels = 5
auto_update = true
ignore_tools = ["npm"]
# Advanced update settings (optional)
[update]
enabled = true # Enable auto-update (default: true)
check_interval_hours = 2 # Hours between update checks (default: 2)
# Toolchain auto-install via mise/proto (optional)
[toolchain]
auto_install = true # Auto-install missing tools (default: true)
backend = "auto" # "auto" | "mise" | "proto" | "none"Or devrunner.toml in your project for local overrides.
Precedence: CLI args > local config > global config > defaults
When a project's tool is detected but not installed (e.g. Cargo.toml found but cargo missing), devrunner tries to auto-install it transparently via mise or proto before falling back to a manual install hint.
# User installs only devrunner + mise (once)
curl https://mise.run | sh # install mise
# Then on any project, just:
dr build # ← devrunner auto-installs cargo/npm/etc. via mise if missingThe fallback chain is:
- Tool installed → use it directly (fast path)
- Tool missing + mise available →
mise exec -- <tool> <cmd>(auto-installs) - Tool missing + proto available →
proto run <tool> -- <cmd>(auto-installs) - Nothing available → show install hint + suggest installing mise
Disable for a single run:
dr build --no-auto-install # show hint only, don't delegate to mise/protoDisable globally:
# ~/.config/devrunner/config.toml
[toolchain]
auto_install = falseWhen multiple lockfiles exist (e.g., package-lock.json + yarn.lock):
- Corepack — If
package.jsonhas apackageManagerfield, uses that tool - If only one tool is installed → uses it with a warning
- If multiple tools installed → error with suggested action
- If no tools installed → shows installation instructions
| Code | Meaning |
|---|---|
| 0 | Success (passes through original exit code) |
| 1 | Generic error |
| 2 | No runner found |
| 3 | Lockfile conflict |
| 127 | Tool not installed |
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
# Bash
devrunner completions bash > ~/.local/share/bash-completion/completions/devrunner
# Zsh
devrunner completions zsh > ~/.zsh/completion/_devrunner
# Fish
devrunner completions fish > ~/.config/fish/completions/devrunner.fish
# PowerShell
devrunner completions powershell >> $PROFILE
# Alias completions are also available
dr completions bash > ~/.local/share/bash-completion/completions/dr
dr completions zsh > ~/.zsh/completion/_drThe installer automatically configures AI coding assistants (Claude Code, OpenCode, Codex) to use dr as the universal task runner.
If you installed manually or want to reconfigure, add this to your AI tool's global config:
Claude Code (~/.claude/CLAUDE.md):
## devrunner
Use `dr <command>` or `devrunner <command>` as the universal task runner.
Do NOT call npm run, cargo, make, etc. directly — use `dr <command>` instead.
Examples: `dr test`, `dr build`, `dr lint`, `dr dev`OpenCode / Codex (~/.config/opencode/AGENTS.md or ~/.codex/AGENTS.md): same content.
npx skills — install devrunner as an agent skill in any project:
npx skills add princepal9120/devrunnerThis installs SKILL.md into .claude/skills/ (or .agents/skills/) so any agent in that project automatically knows to use dr.
git clone https://github.com/princepal9120/devrunner.git
cd devrunner
make precommit # Format, lint, test, audit
cargo build --releaseContributions are welcome. Good first contributions include new ecosystem detection tests, clearer error messages, install-script fixes, and documentation improvements.
Before opening a PR, run:
make precommitSee CONTRIBUTING.md for setup, testing guidance, and the pull request checklist. Please also read the Code of Conduct and report vulnerabilities through the private process in SECURITY.md.
AGPL-3.0. See LICENSE.
Made with mass production by princepal9120