Orchestrate workflows with mise [tasks]. TRIGGERS - mise tasks, mise run, task runner, depends, depends_post, workflow automation, task dependencies.
Orchestrate multi-step project workflows using mise [tasks] section with dependency management, argument handling, and file tracking.
Self-Evolving Skill: This skill improves through use. If instructions are wrong, parameters drifted, or a workaround was needed — fix this file immediately, don't defer. Only update for real, reproducible issues.
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 |
| Property | Purpose | Example |
|---|---|---|
description |
AI-agent discoverability (CRITICAL) | "Run pytest with coverage. Exits non-zero on failure." |
alias |
Short name | alias = "t" |
dir |
Working directory | dir = "packages/frontend" |
env |
Task-specific env vars (NOT passed to deps) | env = { LOG_LEVEL = "debug" } |
hide |
Hidden from mise tasks output |
hide = true |
sources |
File tracking for caching | sources = ["src/**/*.rs"] |
outputs |
Skip if newer than sources | outputs = ["target/release/myapp"] |
confirm |
Prompt before execution | confirm = "Delete all data?" |
quiet |
Suppress mise output | quiet = true |
silent |
Suppress ALL output | silent = true |
raw |
Direct stdin/stdout (disables parallelism) | raw = true |
tools |
Task-specific tool versions | tools = { python = "3.9" } |
shell |
Custom shell | shell = "pwsh -c" |
usage |
Argument spec (preferred over Tera) | See Task Arguments |
mise run 'test:*' # All tasks starting with test:
mise run 'db:**' # Nested: db:migrate:up, db:seed:test
mise tasks --hidden # View hidden tasks (prefixed with _)
For detailed examples and patterns for all levels, see Task Levels Reference.
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/
Tasks in subdirectories are auto-discovered with path prefix (packages/api/.mise.toml tasks become packages/api:taskname).
For complete monorepo documentation, see: advanced.md
For Python-heavy polyglot monorepos (10-50 packages), combine mise for runtime management with Pants for build orchestration and native affected detection.
| Tool | Responsibility |
|---|---|
| mise | Runtime versions (Python, Node, Rust) + environment variables |
| Pants | Build orchestration + native affected detection + dependency inference |
# Native affected detection (no manual git scripts)
pants --changed-since=origin/main test
pants --changed-since=origin/main lint
pants --changed-since=origin/main package
| Scale | Recommendation |
|---|---|
| < 10 packages | mise + custom affected (Level 10 patterns) |
| 10-50 packages (Python-heavy) | Pants + mise (this section) |
| 50+ packages | Consider Bazel |
See polyglot-affected.md for complete Pants + mise integration guide and tool comparison.
Tasks automatically inherit [env] values. Use _.file for external env files and redact = true for secrets.
[env]
DATABASE_URL = "postgresql://localhost/mydb"
_.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" # $DATABASE_URL and $API_KEY available
For full env integration patterns, see Environment Integration.
| 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 or minimal description |
AI agents cannot infer task purpose from name alone | Write rich descriptions: what it does, requires, produces, when to run |
Publish without build depends |
Runtime failure instead of DAG prevention | Add depends = ["build"] to publish tasks |
| Orchestrator without all phases | "Run X next" messages get ignored | Include all phases in release:full depends array |
For release-specific anti-patterns and patterns, see Release Workflow Patterns.
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| Issue | Cause | Solution |
|---|---|---|
| Task not found | Typo or wrong mise.toml | Run mise tasks to list available tasks |
| Dependencies not run | Circular dependency | Check task depends arrays for cycles |
| Sources not working | Wrong glob pattern | Use relative paths from mise.toml location |
| Watch not triggering | File outside sources list | Add file pattern to sources array |
| Env vars not available | Task in wrong directory | Ensure mise.toml is in cwd or parent |
| Run fails with error | Script path issue | Use absolute path or relative to mise.toml |
After this skill completes, check before closing:
Only update if the issue is real and reproducible — not speculative.