jdx/mise · error

the setup from is paused; nothing was bootstrapped. `mise…

Error message

the setup from {url} is paused; nothing was bootstrapped. `mise dot status` lists the paths that need attention. Existing files that differ are kept until you decide: `mise dot pull --take-remote-all` chooses the repository's version for every conflict, or `mise dot pull --take-remote <path>` and `mise dot pull --keep-local <path>` decide one at a time. A path held for another reason, such as a directory where the repository has a file, says so in `mise dot status` and needs that fix instead. Then run `mise bootstrap`

What it means

After pulling the configured setup from the remote, at least one path was held for a decision (setup_held). Because bootstrapping from a partially-held configuration would run the wrong tasks/installations, mise aborts with guidance to resolve conflicts via `mise dot status` / `mise dot pull` flags.

Solutions

  1. Run `mise dot status` to list held paths and their reasons.
  2. Resolve file conflicts: `mise dot pull --take-remote-all`, or per-path `--take-remote <path>` / `--keep-local <path>`.
  3. Fix structural holds (e.g. remove the local directory where the repo has a file), then re-run `mise bootstrap`.

Example fix

// before
mise bootstrap --from https://github.com/me/dotfiles  # paused: conflicts
// after
mise dot status
mise dot pull --take-remote-all
mise bootstrap --from https://github.com/me/dotfiles
Defensive patterns

Strategy: validation

Validate before calling

mise dot status | grep -i held && echo "resolve holds before bootstrap"

Try / catch

mise bootstrap --from "$URL" || { mise dot status; mise dot pull --take-remote-all; mise bootstrap --from "$URL"; }

Prevention

When it happens

Trigger: Running `mise bootstrap --from <url>` where the dotfile sync outcome flagged setup_held — local files differ from the repo and no take-remote/keep-local decision has been recorded.

Common situations: First bootstrap onto a machine with existing dotfiles that conflict; a directory exists where the repo has a file, or vice versa.

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/6f68521d4971526d. Report an issue: GitHub.

Appendix: source

Thrown at src/cli/bootstrap.rs:1879

                url,
                self.yes,
                self.dry_run,
                self.replace_history,
            )
            .await?
        {
            if self.dry_run {
                if let Some(preview) = outcome.preview_config.as_ref() {
                    self.run_child_bootstrap(preview.path().to_path_buf())
                        .await?;
                }
                return Ok(());
            }
            // the configuration that arrived is what to bootstrap from; one
            // held for a decision leaves the existing one, whose tasks and
            // installations are not what was asked for
            if outcome.setup_held {
                bail!(
                    "the setup from {url} is paused; nothing was bootstrapped. `mise dot status` lists the paths that need attention. Existing files that differ are kept until you decide: `mise dot pull --take-remote-all` chooses the repository's version for every conflict, or `mise dot pull --take-remote <path>` and `mise dot pull --keep-local <path>` decide one at a time. A path held for another reason, such as a directory where the repository has a file, says so in `mise dot status` and needs that fix instead. Then run `mise bootstrap`"
                );
            }
            let config_dir = system::history::tracked::global_config_dir();
            self.run_child_bootstrap(config_dir).await?;
            if !outcome.durable_access {
                warn!("ongoing synchronization still needs credentials on this host (see above)");
            }
            return Ok(());
        }
        let (url, checkout) = if let Some(url) = expanded.as_deref() {
            let checkout = crate::env::MISE_GLOBAL_CONFIG_FILE
                .as_deref()
                .map(|path| {
                    path.parent()
                        .filter(|parent| !parent.as_os_str().is_empty())
                        .unwrap_or_else(|| Path::new("."))
                })

View on GitHub (pinned to 533346cc37)