jdx/mise · error

{} runtime symlink repair(s) failed: {}

Error message

{} runtime symlink repair(s) failed:
{}

What it means

`runtime_symlinks::run_all_rebuilds` collects every individual rebuild error into a vector and, if any failed, returns a single aggregated error "N runtime symlink repair(s) failed:" followed by each error's full chain. It is an aggregation wrapper over per-item symlink repairs, not a root-cause error itself.

Source

Thrown at src/runtime_symlinks.rs:49

        rebuild_symlinks_in_dir(config, ts, &backend, &installs_dir).wrap_err_with(|| {
            format!(
                "failed to rebuild runtime symlinks for {} in {}",
                backend.ba().short,
                installs_dir.display()
            )
        })
    })
}

fn run_all_rebuilds<T>(
    rebuilds: impl IntoIterator<Item = T>,
    mut rebuild: impl FnMut(T) -> Result<()>,
) -> Result<()> {
    let errors = rebuilds
        .into_iter()
        .filter_map(|item| rebuild(item).err())
        .collect_vec();
    if errors.is_empty() {
        return Ok(());
    }
    Err(eyre::eyre!(
        "{} runtime symlink repair(s) failed:\n{}",
        errors.len(),
        errors.iter().map(|err| format!("{err:#}")).join("\n")
    ))
}

pub(crate) async fn migrate_real_dirs(config: &Config) -> Result<()> {
    for backend in backend::list() {
        for installs_dir in install_dirs_for(&backend) {
            migrate_real_dirs_in_dir(config, &backend, &installs_dir)?;
        }
    }
    Ok(())
}

View on GitHub (pinned to afd2eddd3a)

Solutions

  1. Read each line of the aggregated error to see which tools failed repair.
  2. Reinstall the affected tool (`mise install <tool>`), then re-run the command or `mise reshim`.
  3. Check symlink/privilege support on the installs directory (Windows Developer Mode, or avoid network filesystems).
  4. Wipe stale state for the failing tool and reinstall from scratch.

Example fix

// before
# node runtime symlinks broken after manual delete
// after
mise install node && mise reshim
Defensive patterns

Strategy: validation

Validate before calling

mise ls --json | jq '.[] | select(.installed == null)'  # find tools with missing install paths before commands that trigger repair

Prevention

When it happens

Trigger: Any command that triggers runtime symlink repair where one or more `rebuild(item)` calls return Err — typically broken/unwritable symlink targets or missing tool install paths.

Common situations: Core tools (node/python/go) whose install paths were moved or deleted; HOME or installs dir on a filesystem without symlink permission (some Windows configs); stale mise state after restores from backup.

Understand the failure class

Background: "File not found" and ENOENT errors: why libraries can't find a file that should exist — this error's family across 50 libraries.

Related errors


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