jdx/mise · error

setup has conflicts; nothing was bootstrapped; use `mise boo

Error message

setup has conflicts; nothing was bootstrapped; use `mise bootstrap dotfiles status` to resolve them

What it means

`mise ssh` (src/cli/ssh.rs:125) aborts bootstrapping when onboarding finished but left unresolved state: the onboarding outcome was `setup_held` or the sync status still lists conflicts, and the command was not a dry run. Nothing is installed; the user is directed to `mise bootstrap dotfiles status` to inspect and resolve the conflicts first.

Source

Thrown at src/cli/ssh.rs:125

                )
                .await?;
                if let Some(directory) = &self.repository_preview_directory {
                    let preview = outcome
                        .preview_config
                        .as_ref()
                        .ok_or_else(|| eyre::eyre!("missing setup configuration preview"))?;
                    // The remote runner supplies a new directory inside its
                    // private staging area; never overwrite an existing tree.
                    std::fs::create_dir(directory)?;
                    crate::file::copy_dir_all_preserve_symlinks(preview.path(), directory)?;
                }
                if !self.repository_dry_run
                    && (outcome.setup_held
                        || !crate::system::history::sync::run::read_status(store.state_dir())?
                            .conflicts
                            .is_empty())
                {
                    bail!(
                        "setup has conflicts; nothing was bootstrapped; use `mise bootstrap dotfiles status` to resolve them"
                    );
                }
                return Ok(());
            }
            crate::system::remote_repository::install(
                &bundle,
                &origin,
                &revision,
                self.repository_update,
                self.repository_yes,
                self.repository_dry_run,
            )?;
            return Ok(());
        }
        let scope = crate::github_relay::Scope::from_flags(
            self.github_relay_read_only,
            &self.github_relay_repo,

View on GitHub (pinned to afd2eddd3a)

Solutions

  1. Run `mise bootstrap dotfiles status` to list the conflicts and resolve each one.
  2. Move aside or merge the conflicting local files, then rerun the bootstrap.
  3. Use `--repository-dry-run` first to preview what would conflict.
  4. If a prior bootstrap was interrupted, finish or roll back that onboarding before retrying.

Example fix

// before
mise ssh host --bootstrap-dotfiles ...

// after: inspect and resolve first
mise bootstrap dotfiles status
# resolve reported conflicts
mise ssh host --bootstrap-dotfiles ...
Defensive patterns

Strategy: try-catch

Validate before calling

# detect conflicts before a real run
mise ssh host --repository-dry-run ... || true
mise bootstrap dotfiles status | grep -i conflict

Try / catch

try {
  await $`mise ssh host --bootstrap-dotfiles ...`;
} catch (e) {
  if (String(e).includes('setup has conflicts')) {
    await $`mise bootstrap dotfiles status`; // inspect & resolve
  }
}

Prevention

When it happens

Trigger: Running a non-dry-run `mise ssh` bootstrap where `onboard::run` reports `setup_held`, or `read_status(store.state_dir()).conflicts` is non-empty after onboarding.

Common situations: Dotfiles repository whose setup files conflict with existing local files (existing configs that would be overwritten); a previously interrupted bootstrap leaving held/conflicted entries; re-running bootstrap on a machine with divergent dotfiles.

Related errors


AI-assisted analysis of jdx/mise@afd2eddd3a (2026-09-09). Data as JSON: /api/errors/39ac53ed1aa99935. Report an issue: GitHub.