Use when user mentions "mise tasks", "task runner", "depends", "depends_post", "mise run", task dependencies, workflow automation, or needs to orchestrate multi-step project workflows. Also invoke when mise-configuration detects workflow opportunities.
Inherits all available tools
Additional assets for this skill
This skill inherits all available tools. When active, it can use any tool Claude has access to.
references/advanced.mdreferences/arguments.mdreferences/patterns.mdOrchestrate multi-step project workflows using mise [tasks] section with dependency management, argument handling, and file tracking.
Explicit triggers:
mise tasks, mise run, [tasks] sectiondepends, depends_post.mise.tomlusage specAI Discovery trigger (prescriptive):
When
mise-configurationskill detects multi-step workflows (test suites, build pipelines, migrations), prescriptively invoke this skill to generate appropriate[tasks]definitions.
[tasks.build]
description = "Build the project"
run = "cargo build --release"
mise run build # Run single task
mise run test build # Run multiple tasks
mise run test ::: build # Run in parallel
mise r build # Short form
| Type | Syntax | When |
|---|---|---|
depends | depends = ["lint", "test"] | Run BEFORE task |
depends_post | depends_post = ["notify"] | Run AFTER task succeeds |
wait_for | wait_for = ["db"] | Wait only if running |
[tasks.hello]
run = "echo 'Hello, World!'"
[tasks.test]
description = "Run test suite"
run = "pytest tests/"
[tasks.test]
description = "Run test suite"
alias = "t"
run = "pytest tests/"
Now mise run t works.
[tasks.frontend]
dir = "packages/frontend"
run = "npm run build"
[tasks.test]
env = { RUST_BACKTRACE = "1", LOG_LEVEL = "debug" }
run = "cargo test"
Note: env values are NOT passed to dependency tasks.
[tasks.setup]
run = [
"npm install",
"npm run build",
"npm run migrate"
]
[tasks.deploy]
depends = ["test", "build"]
run = "kubectl apply -f deployment.yaml"
Tasks test and build run BEFORE deploy.
[tasks.release]
depends = ["test"]
depends_post = ["notify", "cleanup"]
run = "npm publish"
After release succeeds, notify and cleanup run automatically.
[tasks.migrate]
wait_for = ["database"]
run = "./migrate.sh"
If database task is already running, wait for it. Otherwise, proceed.
[tasks.ci]
description = "Full CI pipeline"
depends = ["lint", "test", "build"]
depends_post = ["coverage-report"]
run = "echo 'CI passed'"
Single command: mise run ci executes entire chain.
Dependencies without inter-dependencies run in parallel:
[tasks.validate]
depends = ["lint", "typecheck", "test"] # These can run in parallel
run = "echo 'All validations passed'"
[tasks._check-credentials]
description = "Verify credentials are set"
hide = true
run = '''
if [ -z "$API_KEY" ]; then
echo "ERROR: API_KEY not set"
exit 1
fi
'''
[tasks.deploy]
depends = ["_check-credentials"]
run = "deploy.sh"
Hidden tasks don't appear in mise tasks output but can be dependencies.
View hidden tasks: mise tasks --hidden
[tasks.test]
run = "pytest"
[tasks."test:unit"]
run = "pytest tests/unit/"
[tasks."test:integration"]
run = "pytest tests/integration/"
[tasks."test:e2e"]
run = "playwright test"
Run all test tasks: mise run 'test:*'
mise run 'test:*' # All tasks starting with test:
mise run 'db:**' # Nested: db:migrate:up, db:seed:test
[tasks.deploy]
description = "Deploy to environment"
usage = '''
arg "<environment>" help="Target environment" {
choices "dev" "staging" "prod"
}
flag "-f --force" help="Skip confirmation"
flag "--region <region>" default="us-east-1" env="AWS_REGION"
'''
run = '''
echo "Deploying to ${usage_environment}"
[ "$usage_force" = "true" ] && echo "Force mode enabled"
echo "Region: ${usage_region}"
'''
Required positional:
usage = 'arg "<file>" help="Input file"'
Optional positional:
usage = 'arg "[file]" default="config.toml"'
Variadic (multiple values):
usage = 'arg "<files>" var=#true'
Boolean flag:
usage = 'flag "-v --verbose"'
# Access: ${usage_verbose:-false}
Flag with value:
usage = 'flag "-o --output <file>" default="out.txt"'
# Access: ${usage_output}
Environment-backed flag:
usage = 'flag "--port <port>" env="PORT" default="8080"'
In run scripts, arguments become usage_<name> environment variables:
${usage_environment} # Required arg value
${usage_verbose:-false} # Boolean flag with default
${usage_output} # Flag with value
DEPRECATION WARNING: The Tera template method ({{arg(name="...")}}) will be removed in mise 2026.11.0. Use usage spec instead.
For complete argument syntax, see: arguments.md
[tasks.build]
sources = ["Cargo.toml", "src/**/*.rs"]
run = "cargo build"
Task re-runs only when source files change.
[tasks.build]
sources = ["Cargo.toml", "src/**/*.rs"]
outputs = ["target/release/myapp"]
run = "cargo build --release"
If outputs are newer than sources, task is skipped.
mise run build --force # Bypass caching
[tasks.compile]
outputs = { auto = true } # Default behavior
run = "gcc -o app main.c"
[tasks.drop-database]
confirm = "This will DELETE all data. Continue?"
run = "dropdb myapp"
[tasks.quiet-task]
quiet = true # Suppress mise's output (not task output)
run = "echo 'This still prints'"
[tasks.silent-task]
silent = true # Suppress ALL output
run = "background-job.sh"
[tasks.silent-stderr]
silent = "stderr" # Only suppress stderr
run = "noisy-command"
[tasks.edit-config]
raw = true # Direct stdin/stdout/stderr
run = "vim config.yaml"
Warning: raw = true disables parallel execution.
[tasks.legacy-test]
tools = { python = "3.9", node = "18" }
run = "pytest && npm test"
Use specific tool versions for this task only.
[tasks.powershell-task]
shell = "pwsh -c"
run = "Get-Process | Select-Object -First 5"
mise watch build # Re-run on source changes
Requires watchexec: mise use -g watchexec@latest
mise watch build --debounce 500ms # Wait before re-run
mise watch build --restart # Kill and restart on change
mise watch build --clear # Clear screen before run
mise watch build --on-busy-update=queue # Queue changes
mise watch build --on-busy-update=restart # Restart immediately
mise watch build --on-busy-update=do-nothing # Ignore (default)
Requires: MISE_EXPERIMENTAL=1 and experimental_monorepo_root = true
mise run //projects/frontend:build # Absolute from root
mise run :build # Current config_root
mise run //...:test # All projects
mise run '//projects/...:build' # Build all under projects/
mise run '//projects/frontend:*' # All tasks in frontend
Tasks in subdirectories are auto-discovered with path prefix:
packages/api/.mise.toml tasks → packages/api:tasknameFor complete monorepo documentation, see: advanced.md
Tasks automatically inherit [env] values:
[env]
DATABASE_URL = "postgresql://localhost/mydb"
_.file = ".env" # Load additional env vars
[tasks.migrate]
run = "diesel migration run" # $DATABASE_URL available
[env]
_.file = { path = ".env.secrets", redact = true }
[tasks._check-env]
hide = true
run = '[ -n "$API_KEY" ] || { echo "Missing API_KEY"; exit 1; }'
[tasks.deploy]
depends = ["_check-env"]
run = "deploy.sh"
| Anti-Pattern | Why Bad | Instead |
|---|---|---|
| Replace /itp:go with mise tasks | No TodoWrite, no ADR tracking, no checkpoints | Use mise tasks for project workflows, /itp:go for ADR-driven development |
| Hardcode secrets in tasks | Security risk | Use _.file = ".env.secrets" with redact = true |
| Giant monolithic tasks | Hard to debug, no reuse | Break into small tasks with dependencies |
Skip description | Poor discoverability | Always add descriptions |
Prerequisites: Before defining tasks, ensure [env] section is configured.
PRESCRIPTIVE: After defining tasks, invoke
mise-configurationskill to ensure [env] SSoT patterns are applied.
The mise-configuration skill covers:
[env] - Environment variables with defaults[settings] - mise behavior configuration[tools] - Version pinning_.file, _.path, _.python.venv