Claude
Skills
Sign in
Back

mise-task-managing

Included with Lifetime
$97 forever

Conventions for creating and managing development workflow tasks.Use 1) when asked to create a mise task, 2) when adding a tasks to node package file, pnpm, bun, 3) when creating or modifying a script, 4) to encapsulate a complex workflow or chain of commands.

Backend & APIs

What this skill does

# Mise Task Conventions

## Mandatory

- Every project root _MUST_ contain a `mise.toml`
- If a project root does _NOT_ contain a `mise.toml` then copy the [base](./references/base-mise.toml) to the project root as `mise.toml`

## Progressive Discovery Reference Map

**When you see a relevant match to your current task, STOP!**
Read no further and load the applicable reference.

- Are you starting a fresh project? See [starting-fresh](./references/starting-fresh.md)
- Are you integrating mise in a brownfield project? See [brownfield](./references/brownfield.md)
- Were you asked to encapsulate a multi-step custom workflow? See [custom-workflows](./references/workflows.md)

- Did you create a new script, add a new CLI command, or get asked to expose or make available any of the former as a convenience task? See [wraping-an-interface](./references/wrapping-an-interface.md)

- Are you implementing or adapting one of the supported common workflows (`Database`, `Build`, `CI`, `Test`, `Deploy`, `Lint`)? See [common-workflows](./references/common-workflows.md)

## If you didn't find a match, here are the general rules to follow

1. If defining a simple task like a one-liner, use TOML Tasks

Then, define tasks directly in `mise.toml` under the `[tasks.*]` section:

```toml
[tasks.build]
description = "Build the project"
run = "cargo build"

[tasks.test]
description = "Run tests"
run = "cargo test"
depends = ["build"]
```

Execute: `mise run build` or `mise build`

1. If your task is multi-line and looks more like inline code, use File Tasks

Implement the task as an executable shell or python script in `.mise/tasks/` directory:

```bash
#!/usr/bin/env bash
#MISE description="Build the project"
#MISE depends=["lint"]
cargo build
```

Place in `.mise/tasks/build` (no extension), make executable, and run identically: `mise run build`

1. Configuration File Structure

```
project-root/
├── mise.toml              # Primary config with [tasks.*] section
├── .mise/tasks/            # Directory for file-based tasks
│   ├── build             # Executable task script
│   ├── test              # Executable task script
│   └── deploy            # Executable task script
```

1. TOML Task Structure

```toml
[tasks.task-name]
description = "Task description shown in mise tasks"
run = "command to execute"
depends = ["other-task"]
env = { VAR = "value" }
dir = "{{ config_root }}"
sources = ["src/**/*.rs"]
outputs = ["target/release/binary"]
```

1. File Task Metadata

Use `#MISE` comments for task configuration:

```bash
#!/usr/bin/env bash
#MISE description="Deploy application"
#MISE depends=["build", "test"]
#MISE sources=["dist/**/*"]
#MISE env={ENVIRONMENT="production"}

# Task implementation
./deploy.sh
```

1. Task Configuration Options

**Essential Fields**:

**`run`** (TOML tasks only, required)

- String: `run = "cargo build"`
- Array: `run = ["cargo build", "cargo test"]`
- Mixed with task refs: `run = [{ task = "lint" }, "cargo build"]`

**`description`**

- Used in help output, completions, and `mise tasks` listing
- Visible to users as documentation

**`depends`**

- Tasks that run before this task
- `depends = ["lint", "test"]`

**`depends_post`**

- Tasks that run after this task completes
- `depends_post = ["cleanup"]`

1. Environment & Execution

**`env`**

- Task-specific environment variables
- Not propagated to dependent tasks
- `env = { NODE_ENV = "production", API_KEY = "secret" }`

**`tools`**

- Tools to install/activate before task
- Only for this task, not dependencies
- `tools = ["node@20", "[email protected]"]`

**`dir`**

- Working directory for execution
- Default: `"{{ config_root }}"` (where mise.toml lives)
- `dir = "{{ cwd }}/subdir"`

**`shell`**

- Override default shell for inline execution
- TOML tasks only
- `shell = "bash -c"`

1. Caching with Sources & Outputs

**`sources`**

- Input files/globs that this task uses
- Mise skips execution if sources unchanged and outputs are newer
- `sources = ["src/**/*.rs", "Cargo.toml"]`

**`outputs`**

- Output files/directories produced by task
- Enable automatic change detection with `outputs = [{ auto = true }]`
- `outputs = ["target/release/binary"]`

**Caching behavior:**

- Mise compares modification times of oldest output vs newest source
- If outputs are newer, task is skipped
- Use `mise run --force` to bypass cache

1. Control & Visibility

**`hide`**

- Hide from `mise tasks` output, help, and completions
- Useful for internal/deprecated tasks
- `hide = true`

**`quiet`**

- Suppress mise's own output (like command being run)
- `quiet = true`

**`silent`**

- Suppress all task output
- Options: `true` (both), `"stdout"`, `"stderr"`
- `silent = "stdout"`

**`raw`**

- Connect task directly to shell stdin/stdout/stderr
- Disables parallel execution
- Required for interactive tasks
- `raw = true`

**`confirm`**

- Prompt user before running
- `confirm = "Are you sure you want to deploy?"`

1. Advanced: Task Arguments

Define formal arguments and flags in `usage` field:

```toml
[tasks.deploy]
run = "deploy.sh"
usage = """
{usage} [OPTIONS] <environment>

Arguments:
  <environment>  Target environment [env: ENVIRONMENT]

Options:
  --force       Skip confirmation
"""
```

## Running Tasks

### Basic Execution

```bash
mise run task-name          # Full command
mise r task-name            # Short alias
mise task-name              # Shorthand (avoid in scripts)
```

### Passing Arguments

Extra arguments pass through to the task:

```bash
mise run build --release
mise run test -- --nocapture
```

### Multiple Tasks

Run sequentially:

```bash
mise run lint build test
```

Run separate sequences with `:::` delimiter:

```bash
mise run build arg1 ::: test arg2
```

1. Advanced: Parallel Execution

Default: 4 parallel jobs. Control via:

- `--jobs N` flag
- `MISE_JOBS` environment variable
- `jobs` setting in mise.toml

```bash
mise run -j 8 task1 task2 task3
```

Output is line-prefixed to prevent interleaving. Use `--interleave` for direct stdout/stderr.

1. Listing Tasks

```bash
mise tasks                    # List all tasks
mise tasks --hidden           # Include hidden tasks
mise tasks deps [tasks]...    # Show task dependencies
```

1. Watching for Changes

```bash
mise watch task-name          # Re-run on file changes
```

Uses watchexec internally to monitor source files.

1. Common Pattern: Task Orchestration

```toml
[tasks.ci]
description = "Run CI checks"
depends = ["lint", "test", "build"]

[tasks.deploy]
description = "Deploy application"
depends = ["ci"]
depends_post = ["notify"]
run = "./deploy.sh"
```

1. Common Pattern: Environment-Specific Tasks

```toml
[tasks.build]
description = "Build for development"
run = "npm run build"
env = { NODE_ENV = "development" }

[tasks."build:prod"]
description = "Build for production"
run = "npm run build"
env = { NODE_ENV = "production" }
```

1. Common Pattern: Conditional Execution with Sources

```toml
[tasks.compile]
description = "Compile only if sources changed"
run = "gcc src/*.c -o bin/app"
sources = ["src/*.c", "src/*.h"]
outputs = ["bin/app"]
```

1. Common Pattern: File Task with Dependencies

```bash
#!/usr/bin/env bash
#MISE description="Full CI pipeline"
#MISE depends=["lint", "test"]
#MISE sources=["src/**/*"]

set -euo pipefail

echo "Running build..."
cargo build --release

echo "Running integration tests..."
cargo test --release
```

### Cross-Language Task Runner

```toml
[tasks.backend]
description = "Start backend server"
dir = "{{ config_root }}/backend"
run = "cargo run"

[tasks.frontend]
description = "Start frontend dev server"
dir = "{{ config_root }}/frontend"
run = "npm run dev"

[tasks.dev]
description = "Start full development environment"
depends = ["backend", "frontend"]
```

1. Mise automatically injects these globals:

- `MISE_ORIGINAL_CWD` - Initial working directory
- `MISE_CONFIG_ROOT` - Directory containing mise.toml
- `MISE_PROJECT_ROOT` - Project root directory
- `MISE_TASK_NAME` - Current task identifier
-
Files: 7
Size: 64.0 KB
Complexity: 50/100
Category: Backend & APIs

Related in Backend & APIs