jdx/mise · error

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

Error message

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

What it means

`mise dot` bootstrapping aborts because the remote repository setup step reported a conflict (`setup_held`) or the sync status file contains unresolved conflicts. Nothing was changed/bootstrapped, so the user must inspect the conflict state first. mise deliberately refuses to guess at a resolution.

Solutions

  1. Run `mise dot status` to list the conflicts and their files.
  2. Resolve or discard the conflicting local/remote changes indicated by the status output.
  3. Clear the conflict state (re-sync or reset via mise dot subcommands) and re-run the bootstrap.
  4. Use --dry-run first to inspect what setup would do before applying it.

Example fix

// before
mise dot   # fails: setup has conflicts
// after
mise dot status        # inspect conflicts
mise dot sync --resolve theirs   # or resolve manually
mise dot               # re-run bootstrap
Defensive patterns

Strategy: validation

Validate before calling

const status = JSON.parse(require('child_process').execSync('mise dot status --output json').toString());
if (status.conflicts?.length) { throw new Error('resolve conflicts before bootstrap: ' + status.conflicts.join(', ')); }

Type guard

function hasConflicts(status) { return Array.isArray(status?.conflicts) && status.conflicts.length > 0; }

Prevention

When it happens

Trigger: Running `mise dot` (ssh/remote repository bootstrap) when the setup outcome is 'held' (setup_held) or `read_status(store.state_dir()).conflicts` is non-empty.

Common situations: A previous sync or bootstrap left the remote repository state file in a conflicted state; two machines edited the same managed files; a partial/failed prior bootstrap left status conflicts behind.

Understand the failure class

Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.

Related errors


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

Appendix: source

Thrown at src/cli/ssh.rs:126

                )
                .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 dot 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 533346cc37)