Skip to content
The Rune logo

One task file. Humans and agents.

Rune runs your project's commands from one readable Runefile — lint, test, build, deploy. You run them from the CLI; your AI agents and editors run the very same tasks through MCP. A single static binary, no runtime dependencies.
Terminal window
curl -fsSL https://raw.githubusercontent.com/rune-task-runner/rune/main/scripts/install.sh | sh

Or see every installation method — Homebrew, Docker, go install, or a release archive.

# Build the project.
build target="release": fetch
go build -tags {{quote(target)}} ./...
# Fetch dependencies.
fetch:
@go mod download
# Run tests.
test: build
go test ./...
Terminal window
rune # show the version + available tasks (runs nothing)
rune build # run the `build` task
rune test # runs `build` (a dependency), then `test`
rune --list # shows documented tasks

A command runner, not a build system

Tasks always run when asked. No .PHONY traps, no timestamp guessing. Content-hash caching exists as an explicit per-task [cache(...)] opt-in.

Errors are a feature

Undefined variables, unknown dependencies, dependency cycles and arity mismatches are caught before anything runs, with file:line:col and caret-underlined diagnostics.

Agents are first-class

Every task is an MCP tool — read-only by default, gated when destructive. Your agent and your terminal run the same definitions. See AI agents (MCP).

Polyglot task bodies

Shell, Python, Node — or an AI agent — as the body of a task, chosen per task with executors.

Secrets stay secret

Values of sensitive-looking variables are masked as *** in all output, and are never exposed to agents. See secret masking.

Know what you want

The how-to guides cover one capability per page, each with a runnable example.