Back to list
terrylica

mise-tasks

by terrylica

Claude Code Skills Marketplace: plugins, skills for ADR-driven development, DevOps automation, ClickHouse management, semantic versioning, and productivity workflows

7🍴 1📅 Jan 24, 2026

SKILL.md


name: mise-tasks description: Orchestrate workflows with mise [tasks]. TRIGGERS - mise tasks, mise run, task runner, depends, depends_post, workflow automation, task dependencies. allowed-tools: Read, Bash, Glob, Grep, Edit, Write

mise Tasks Orchestration

Orchestrate multi-step project workflows using mise [tasks] section with dependency management, argument handling, and file tracking.

When to Use This Skill

Explicit triggers:

  • User mentions mise tasks, mise run, [tasks] section
  • User needs task dependencies: depends, depends_post
  • User wants workflow automation in .mise.toml
  • User mentions task arguments or usage spec

AI Discovery trigger (prescriptive):

When mise-configuration skill detects multi-step workflows (test suites, build pipelines, migrations), prescriptively invoke this skill to generate appropriate [tasks] definitions.

Quick Reference

Task Definition

[tasks.build]
description = "Build the project"
run = "cargo build --release"

Running Tasks

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

Dependency Types

TypeSyntaxWhen
dependsdepends = ["lint", "test"]Run BEFORE task
depends_postdepends_post = ["notify"]Run AFTER task succeeds
wait_forwait_for = ["db"]Wait only if running

Level 1-2: Basic Tasks

Minimal Task

[tasks.hello]
run = "echo 'Hello, World!'"

With Description

[tasks.test]
description = "Run test suite"
run = "pytest tests/"

With Alias

[tasks.test]
description = "Run test suite"
alias = "t"
run = "pytest tests/"

Now mise run t works.

Working Directory

[tasks.frontend]
dir = "packages/frontend"
run = "npm run build"

Task-Specific Environment

[tasks.test]
env = { RUST_BACKTRACE = "1", LOG_LEVEL = "debug" }
run = "cargo test"

Note: env values are NOT passed to dependency tasks.

GitHub Token Verification Task

For multi-account GitHub setups, add a verification task:

[tasks._verify-gh-auth]
description = "Verify GitHub token matches expected account"
hide = true  # Hidden helper task
run = """
expected="${GH_ACCOUNT:-}"
if [ -z "$expected" ]; then
  echo "GH_ACCOUNT not set - skipping verification"
  exit 0
fi
actual=$(gh api user --jq '.login' 2>/dev/null || echo "")
if [ "$actual" != "$expected" ]; then
  echo "ERROR: GH_TOKEN authenticates as '$actual', expected '$expected'"
  exit 1
fi
echo "✓ GitHub auth verified: $actual"
"""

[tasks.release]
description = "Create semantic release"
depends = ["_verify-gh-auth"]  # Verify before release
run = "npx semantic-release --no-ci"

See mise-configuration skill for GH_TOKEN setup.

SSH ControlMaster Warning: If using multi-account SSH, ensure ControlMaster no is set for GitHub hosts in ~/.ssh/config. Cached connections can authenticate with the wrong account.

Multi-Command Tasks

[tasks.setup]
run = [
  "npm install",
  "npm run build",
  "npm run migrate"
]

Level 3-4: Dependencies & Orchestration

Pre-Execution Dependencies

[tasks.deploy]
depends = ["test", "build"]
run = "kubectl apply -f deployment.yaml"

Tasks test and build run BEFORE deploy.

Post-Execution Tasks

[tasks.release]
depends = ["test"]
depends_post = ["notify", "cleanup"]
run = "npm publish"

After release succeeds, notify and cleanup run automatically.

Soft Dependencies

[tasks.migrate]
wait_for = ["database"]
run = "./migrate.sh"

If database task is already running, wait for it. Otherwise, proceed.

Task Chaining Pattern

[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.

Parallel Dependencies

Dependencies without inter-dependencies run in parallel:

[tasks.validate]
depends = ["lint", "typecheck", "test"]  # These can run in parallel
run = "echo 'All validations passed'"

Level 5: Hidden Tasks & Organization

Hidden Tasks

[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

Colon-Prefixed Namespacing

[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:*'

Wildcard Patterns

mise run 'test:*'      # All tasks starting with test:
mise run 'db:**'       # Nested: db:migrate:up, db:seed:test

Level 6: Task Arguments

Usage Specification (Preferred Method)

[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}"
'''

Argument Types

Required positional:

usage = 'arg "<file>" help="Input file"'

Optional positional:

usage = 'arg "[file]" default="config.toml"'

Variadic (multiple values):

usage = 'arg "<files>" var=#true'

Flag Types

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"'

Accessing Arguments

In run scripts, arguments become usage_<name> environment variables:

/usr/bin/env bash << 'SKILL_SCRIPT_EOF'
${usage_environment}      # Required arg value
${usage_verbose:-false}   # Boolean flag with default
${usage_output}           # Flag with value
SKILL_SCRIPT_EOF

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


Level 7: File Tracking & Caching

Source Files

[tasks.build]
sources = ["Cargo.toml", "src/**/*.rs"]
run = "cargo build"

Task re-runs only when source files change.

Output Files

[tasks.build]
sources = ["Cargo.toml", "src/**/*.rs"]
outputs = ["target/release/myapp"]
run = "cargo build --release"

If outputs are newer than sources, task is skipped.

Force Execution

mise run build --force  # Bypass caching

Auto Output Detection

[tasks.compile]
outputs = { auto = true }  # Default behavior
run = "gcc -o app main.c"

Level 8: Advanced Execution

Confirmation Prompts

[tasks.drop-database]
confirm = "This will DELETE all data. Continue?"
run = "dropdb myapp"

Output Control

[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"

Raw Mode (Interactive)

[tasks.edit-config]
raw = true  # Direct stdin/stdout/stderr
run = "vim config.yaml"

Warning: raw = true disables parallel execution.

Task-Specific Tools

[tasks.legacy-test]
tools = { python = "3.9", node = "18" }
run = "pytest && npm test"

Use specific tool versions for this task only.

Custom Shell

[tasks.powershell-task]
shell = "pwsh -c"
run = "Get-Process | Select-Object -First 5"

Level 9: Watch Mode

Basic Watch

mise watch build  # Re-run on source changes

Requires watchexec: mise use -g watchexec@latest

Watch Options

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

On-Busy Behavior

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)

Level 10: Monorepo (Experimental)

Requires: MISE_EXPERIMENTAL=1 and experimental_monorepo_root = true

Path Syntax

mise run //projects/frontend:build    # Absolute from root
mise run :build                       # Current config_root
mise run //...:test                   # All projects

Wildcards

mise run '//projects/...:build'       # Build all under projects/
mise run '//projects/frontend:*'      # All tasks in frontend

Discovery

Tasks in subdirectories are auto-discovered with path prefix:

  • packages/api/.mise.toml tasks → packages/api:taskname

For complete monorepo documentation, see: advanced.md


Level 11: Polyglot Monorepo with Pants + mise

For Python-heavy polyglot monorepos (10-50 packages), combine mise for runtime management with Pants for build orchestration and native affected detection.

Division of Responsibility

ToolResponsibility
miseRuntime versions (Python, Node, Rust) + environment variables
PantsBuild orchestration + native affected detection + dependency inference

Architecture

monorepo/
├── mise.toml                    # Runtime versions + env vars (SSoT)
├── pants.toml                   # Pants configuration
├── BUILD                        # Root BUILD file (minimal)
├── packages/
│   ├── core-python/
│   │   ├── mise.toml           # Package-specific env (optional)
│   │   └── BUILD               # Auto-generated: python_sources()
│   ├── core-rust/
│   │   └── BUILD               # cargo-pants plugin
│   └── core-bun/
│       └── BUILD               # pants-js plugin

Pants Native Affected Detection

No more manual git scripts - Pants has native affected detection:

# Test only affected packages (NATIVE)
pants --changed-since=origin/main test

# Lint only affected packages
pants --changed-since=origin/main lint

# Build only affected packages
pants --changed-since=origin/main package

# See what's affected (dry run)
pants --changed-since=origin/main list

mise.toml Wrapper Tasks (Optional Convenience)

[tasks."test:affected"]
description = "Test affected packages via Pants"
run = "pants --changed-since=origin/main test"

[tasks."lint:affected"]
description = "Lint affected packages via Pants"
run = "pants --changed-since=origin/main lint"

[tasks.test-all]
description = "Test all packages"
run = "pants test ::"

[tasks."pants:tailor"]
description = "Generate BUILD files"
run = "pants tailor"

pants.toml Minimal Config

[GLOBAL]
pants_version = "<version>"
backend_packages = [
    "pants.backend.python",
    "pants.backend.python.lint.ruff",
    "pants.backend.experimental.rust",
    "pants.backend.experimental.javascript",
]

[python]
interpreter_constraints = [">=3.11"]

[source]
root_patterns = ["packages/*"]

[python-bootstrap]
# Use mise-managed Python (mise sets PATH)
search_path = ["<PATH>"]

When to Use Pants + mise

ScaleRecommendation
< 10 packagesmise + custom affected (Level 10 patterns)
10-50 packages (Python-heavy)Pants + mise (this section)
50+ packagesConsider Bazel

→ See polyglot-affected.md for complete Pants + mise integration guide and tool comparison


Integration with [env]

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

Credential Loading Pattern

[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-Patterns

Anti-PatternWhy BadInstead
Replace /itp:go with mise tasksNo TodoWrite, no ADR tracking, no checkpointsUse mise tasks for project workflows, /itp:go for ADR-driven development
Hardcode secrets in tasksSecurity riskUse _.file = ".env.secrets" with redact = true
Giant monolithic tasksHard to debug, no reuseBreak into small tasks with dependencies
Skip descriptionPoor discoverabilityAlways add descriptions

Cross-Reference: mise-configuration

Prerequisites: Before defining tasks, ensure [env] section is configured.

PRESCRIPTIVE: After defining tasks, invoke mise-configuration skill to ensure [env] SSoT patterns are applied.

The mise-configuration skill covers:

  • [env] - Environment variables with defaults
  • [settings] - mise behavior configuration
  • [tools] - Version pinning
  • Special directives: _.file, _.path, _.python.venv

Additional Resources

Score

Total Score

65/100

Based on repository quality metrics

SKILL.md

SKILL.mdファイルが含まれている

+20
LICENSE

ライセンスが設定されている

0/10
説明文

100文字以上の説明がある

+10
人気

GitHub Stars 100以上

0/15
最近の活動

1ヶ月以内に更新

+10
フォーク

10回以上フォークされている

0/5
Issue管理

オープンIssueが50未満

+5
言語

プログラミング言語が設定されている

+5
タグ

1つ以上のタグが設定されている

+5

Reviews

💬

Reviews coming soon