jdx/mise · error

Dock application is unavailable

Error message

Dock application is unavailable: {}

What it means

The Dock reconciliation in `src/system/defaults/dock.rs` refuses to rearrange macOS Dock tiles when any application path declared in the desired layout does not exist on disk or is not a directory. This is a safety precondition: arranging the Dock around an app that is missing would silently drop or mis-place its tile. mise throws it via `eyre::ensure!` before touching the Dock.

Solutions

  1. Install the missing application or restore it at the declared path (verify with `ls <path>`).
  2. Remove or correct the stale path in the dock defaults configuration so every listed path exists.
  3. If the app lives elsewhere, point the config at the actual `.app` bundle location instead of the old path.

Example fix

// before (config)
[[dock.entries]]
path = "/Applications/OldApp.app"

// after
[[dock.entries]]
path = "/Applications/RenamedApp.app"
Defensive patterns

Strategy: validation

Validate before calling

for path in dock_paths {
    if !std::path::Path::new(path).is_dir() {
        eprintln!("dock app missing: {path}");
    }
}

Prevention

When it happens

Trigger: Call `reconcile(value, current)` (directly or via `match_symlinked_apps_and_preserve_declared_paths` / `refuse_unreadable_layout_and_missing_apps`) with a `[settings.dock]`-style DefaultsValue whose `paths(value)` list contains a path where `path.is_dir()` is false — missing app, deleted app, typo'd path, or a symlink pointing at a non-existent target.

Common situations: A mise config references an app like `/Applications/Firefox.app` that was uninstalled or renamed; an app is inside a user-specific folder not present on a new machine; a symlinked .app has a dangling target after a migration; macOS version upgrade moved an app.

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@533346cc37 (2026-09-17). Data as JSON: /api/errors/c9189b264e950daa. Report an issue: GitHub.

Appendix: source

Thrown at src/system/defaults/dock.rs:94

pub(super) fn matches(value: &DefaultsValue, current: &plist::Value) -> Result<bool> {
    Ok(paths(value)?
        .iter()
        .map(|path| crate::file::canonicalize_or_self(path))
        .eq(tiles(Some(current))?
            .iter()
            .filter_map(app_path)
            .map(|path| crate::file::canonicalize_or_self(&path))))
}

#[cfg(any(target_os = "macos", test))]
pub(super) fn reconcile(
    value: &DefaultsValue,
    current: Option<&plist::Value>,
) -> Result<plist::Value> {
    let desired = paths(value)?;
    for path in &desired {
        eyre::ensure!(
            path.is_dir(),
            "Dock application is unavailable: {}",
            path.display()
        );
    }
    arrange(&desired, tiles(current)?)
}

#[cfg(any(target_os = "macos", test))]
fn new_tile(path: &Path, guid: u64) -> Result<plist::Value> {
    let url = url::Url::from_directory_path(path)
        .map_err(|_| eyre::eyre!("invalid Dock application path: {}", path.display()))?;
    let mut file = plist::Dictionary::new();
    file.insert("_CFURLString".into(), url.to_string().into());
    file.insert("_CFURLStringType".into(), 15u64.into());
    let mut data = plist::Dictionary::new();
    data.insert("file-data".into(), file.into());
    data.insert(

View on GitHub (pinned to 533346cc37)