jdx/mise · error

remote host ' ' must set at most one of mise_bin…

Error message

remote host '{}' must set at most one of mise_bin, remote_mise, or bootstrap_command

What it means

A remote host may specify at most one way to obtain mise on the remote machine: a local mise_bin, a remote_mise path already on the host, or a bootstrap_command. validate_with_source counts how many of these are configured and bails when more than one is set, because the provisioning strategies conflict.

Solutions

  1. Pick one provisioning strategy and delete the other fields from the host entry.
  2. If mise already exists on the host, keep only remote_mise and remove mise_bin/bootstrap_command.
  3. If you want to upload a local binary, keep only mise_bin.
  4. If you need custom setup steps, keep only bootstrap_command.

Example fix

// before
[[remote_host]]
name = "builder"
remote_mise = "/usr/local/bin/mise"
bootstrap_command = "curl https://mise.run | sh"
// after
[[remote_host]]
name = "builder"
remote_mise = "/usr/local/bin/mise"
Defensive patterns

Strategy: validation

Validate before calling

function assertSingleStrategy(host) {
  const set = ['mise_bin', 'remote_mise', 'bootstrap_command'].filter(k => host[k] != null);
  if (set.length > 1) throw new Error(`remote host '${host.name}' sets multiple provisioning strategies: ${set}`);
}

Prevention

When it happens

Trigger: A remote host entry sets two or more of mise_bin, remote_mise, bootstrap_command simultaneously; validate() or apply_overrides() detect provisioning_strategies > 1 and bail.

Common situations: Merging host config snippets from different setups; adding remote_mise on top of an existing bootstrap_command while iterating; copy-pasting a full example block that sets several fields.

Related errors


AI-assisted analysis of jdx/mise@533346cc37 (2026-09-17). Data as JSON: /api/errors/1d0a30c613685878. Report an issue: GitHub.

Appendix: source

Thrown at src/system/remote.rs:369

        if let Some(binary) = &self.mise_bin
            && !binary.is_file()
        {
            bail!(
                "remote host '{}' mise binary does not exist: {}",
                self.name,
                binary.display()
            );
        }
        let provisioning_strategies = [
            self.mise_bin.is_some(),
            self.remote_mise.is_some(),
            self.bootstrap_command.is_some(),
        ]
        .into_iter()
        .filter(|configured| *configured)
        .count();
        if provisioning_strategies > 1 {
            bail!(
                "remote host '{}' must set at most one of mise_bin, remote_mise, or bootstrap_command",
                self.name
            );
        }
        if let Some(install_mise) = &self.install_mise {
            if self.remote_mise.is_some() || self.bootstrap_command.is_some() {
                bail!(
                    "remote host '{}' cannot combine install_mise with remote_mise or bootstrap_command, which already provide mise on the host",
                    self.name
                );
            }
            validate_install_mise_path(install_mise).wrap_err_with(|| {
                format!("remote host '{}' has an invalid install_mise", self.name)
            })?;
        }
        for option in &self.ssh_options {
            validate_value("SSH option", option)?;
        }

View on GitHub (pinned to 533346cc37)