jdx/mise · error · eyre::Report

command does not exist: {}

Error message

command does not exist: {}

What it means

When the first element of engine_command (or the prefix of command) is an absolute path, resolve_command verifies it names an existing file before using it. If the path does not exist (typo, wrong prefix, dangling symlink, not installed), mise refuses with this error instead of exec'ing a nonexistent binary. Relative program names go through PATH lookup instead and produce the sibling "command not found" error.

Source

Thrown at src/system/compose.rs:1045

        .into_iter()
        .map(|path| {
            if path.is_absolute() {
                path
            } else {
                project_dir.join(path)
            }
        })
        .collect()
}

fn resolve_command(command: &[String]) -> Result<Vec<String>> {
    let (program, args) = command
        .split_first()
        .ok_or_else(|| eyre!("command cannot be empty"))?;
    let resolved = if Path::new(program).is_absolute() {
        let path = PathBuf::from(program);
        if !path.is_file() {
            bail!("command does not exist: {}", path.display());
        }
        path
    } else {
        crate::file::which(program).ok_or_else(|| eyre!("command not found: {program}"))?
    };
    Ok(std::iter::once(resolved.to_string_lossy().to_string())
        .chain(args.iter().cloned())
        .collect())
}

fn validate_project_name(name: Option<&str>) -> Result<()> {
    let Some(name) = name else {
        return Ok(());
    };
    if name.is_empty()
        || !name
            .chars()
            .next()

View on GitHub (pinned to 9dcfcaa0dc)

Solutions

  1. Find the real location with `command -v podman` and correct the absolute path
  2. Or drop the path and use a bare name (engine_command = ["podman"]) so PATH resolution applies
  3. Reinstall the engine if it was removed
  4. Prefer bare names in shared config; reserve absolute paths for machine-local config

Example fix

# before
engine_command = ["/usr/local/bin/podman"]  # Homebrew Intel path, wrong on Linux

# after
engine_command = ["podman"]
Defensive patterns

Strategy: validation

Validate before calling

# before apply, confirm every absolute program in the config exists
for p in /usr/local/bin/podman /opt/homebrew/bin/docker; do
  [ -f "$p" ] || echo "configured engine path missing: $p" >&2
done

Prevention

When it happens

Trigger: engine_command = ["/usr/bin/podman"] when podman actually lives at /usr/local/bin/podman; the absolute path points to a directory, a symlink whose target is gone, or a binary that was uninstalled/renamed after config was written.

Common situations: Copying mise.toml between machines with different install prefixes (Homebrew /usr/local vs /opt/homebrew vs /usr); uninstalling the engine but leaving the config; path typos after manual editing.

Related errors


AI-assisted analysis of jdx/mise@9dcfcaa0dc (2026-08-17). Data as JSON: /api/errors/a5491f64ba6b08bb. Report an issue: GitHub.