jdx/mise · error

brew-cask:{}: unsupported {kind} step type {}

Error message

brew-cask:{}: unsupported {kind} step type {}

What it means

The catch-all arm of parse_flight_step. Each step object in preflight_steps/postflight_steps needs a "type", and mise implements exactly six: move, remove, copy, symlink, run, terminate_process. Any other type string — e.g. set_permissions, delete, launchctl — is unsupported and fails the whole cask parse with the cask token and offending type in the message.

Source

Thrown at src/system/packages/brew/cask.rs:5787

            let failure_message = match object.get("failure_message") {
                None | Some(Value::Null) => None,
                Some(Value::String(value)) => Some(value.clone()),
                Some(_) => bail!(
                    "brew-cask:{}: {kind} terminate_process failure_message must be a string",
                    cask.token
                ),
            };
            Ok(FlightStep::TerminateProcess {
                name: name.to_string(),
                match_mode,
                sudo,
                attempts,
                must_succeed,
                notices,
                failure_message,
            })
        }
        _ => bail!(
            "brew-cask:{}: unsupported {kind} step type {}",
            cask.token,
            step_type
        ),
    }
}

fn parse_flight_sudo(cask: &Cask, kind: &str, value: Option<&Value>) -> Result<FlightSudo> {
    match value {
        None | Some(Value::Bool(false)) => Ok(FlightSudo::Never),
        Some(Value::Bool(true)) => Ok(FlightSudo::Always),
        Some(Value::String(value)) if value == "if_needed" => Ok(FlightSudo::IfNeeded),
        _ => bail!("brew-cask:{}: unsupported {kind} sudo setting", cask.token),
    }
}

fn parse_flight_guards(cask: &Cask, kind: &str, value: Option<&Value>) -> Result<Vec<FlightGuard>> {
    value

View on GitHub (pinned to 6f52dcdf99)

Solutions

  1. Replace the unsupported step with one of the implemented types (move, remove, copy, symlink, run, terminate_process) if the effect can be expressed that way
  2. Update mise — new step types are added over time; retest after upgrading
  3. Otherwise install the cask with native brew instead of mise and report the cask token to the mise issue tracker

Example fix

// before
{"steps": [{"type": "set_permissions", "path": "bin/tool", "mode": "755"}]}
// after
{"steps": [{"type": "run", "command": {"path": "chmod", "args": ["755", "bin/tool"]}}]}
Defensive patterns

Strategy: validation

Validate before calling

const SUPPORTED_STEP_TYPES: &[&str] = &["move", "remove", "copy", "symlink", "run", "terminate_process"];

fn flight_steps_ok(v: &serde_json::Value, kind: &str) -> bool {
    let Some(groups) = v.get(kind).and_then(|g| g.as_array()) else { return true; };
    groups.iter().all(|g| g.get("steps").and_then(|s| s.as_array()).map(|steps| {
        steps.iter().all(|s| {
            s.get("type").and_then(|t| t.as_str())
                .map(|t| SUPPORTED_STEP_TYPES.contains(&t))
                .unwrap_or(false)
        })
    }).unwrap_or(false))
}

Type guard

fn is_supported_step_type(v: &serde_json::Value) -> bool {
    v.as_str().map(|t| ["move", "remove", "copy", "symlink", "run", "terminate_process"].contains(&t)).unwrap_or(false)
}

Try / catch

match parse_flight_steps(&cask, &artifact, kind) {
    Ok(steps) => { /* proceed */ }
    Err(e) if e.to_string().contains("step type") => {
        eprintln!("cask {} uses a flight step type mise does not implement; update mise or use brew directly", cask.token);
    }
    Err(e) => return Err(e),
}

Prevention

When it happens

Trigger: {"type": "set_permissions", ...} or any unrecognized type string inside a steps array of preflight_steps/postflight_steps; also triggered by step objects whose type key is present but names a Homebrew feature mise has not implemented.

Common situations: Homebrew casks using newer or rarer flight features (permissions, launchd management) that mise's Rust parser has not implemented yet; hand-written steps inventing types; version skew between Homebrew metadata and mise.

Related errors


AI-assisted analysis of jdx/mise@6f52dcdf99 (2026-08-22). Data as JSON: /api/errors/7bc07ba48255fc80. Report an issue: GitHub.