jdx/mise · error

brew-cask:{token}: Homebrew metadata exists, but no installe

Error message

brew-cask:{token}: Homebrew metadata exists, but no installed Caskroom version was found; repair it with `brew reinstall --cask {token}`

What it means

homebrew_installed_version resolves the single installed Caskroom version for a token. When Homebrew's own metadata exists but the Caskroom directory contains no version directory, the cask state is inconsistent, so mise bails and asks the user to repair via Homebrew. mise never guesses a version when Homebrew claims ownership but nothing is installed.

Source

Thrown at src/system/packages/brew/cask/state.rs:80

                path.display()
            )
        })?;
        if file_type.is_dir() && name != ".metadata" && !name.starts_with(".mise-") {
            versions.push(name);
        }
    }
    Ok(versions)
}

pub(super) fn homebrew_installed_version(token: &str) -> Result<Option<String>> {
    if !homebrew_metadata_present(token)? {
        return Ok(None);
    }

    let versions = homebrew_installed_versions(token)?;
    match versions.as_slice() {
        [version] => Ok(Some(version.clone())),
        [] => bail!(
            "brew-cask:{token}: Homebrew metadata exists, but no installed Caskroom version was found; repair it with `brew reinstall --cask {token}`"
        ),
        versions => bail!(
            "brew-cask:{token}: Homebrew metadata exists with multiple Caskroom versions ({}); repair it with Homebrew",
            {
                let mut versions = versions.to_vec();
                versions.sort();
                versions.join(", ")
            }
        ),
    }
}

pub(super) fn ensure_homebrew_did_not_take_ownership(token: &str, stage: &Path) -> Result<()> {
    let metadata_present = match homebrew_metadata_present(token) {
        Ok(present) => present,
        Err(err) => {
            file::remove_all(stage).wrap_err_with(|| {

View on GitHub (pinned to afd2eddd3a)

Solutions

  1. Run `brew reinstall --cask <token>` to restore the missing Caskroom version
  2. If the cask is unwanted, run `brew uninstall --cask <token>` to clear the stale metadata, then let mise reinstall
  3. Run `brew cleanup --cask` and retry the mise operation

Example fix

// terminal, not code
// before: broken state (metadata exists, no Caskroom dir)
// after:
brew reinstall --cask <token>
Defensive patterns

Strategy: try-catch

Validate before calling

// before installing via mise, check consistency
ls "$(brew --repository)/Caskroom/<token>" 2>/dev/null
brew info --cask <token> >/dev/null 2>&1 && echo metadata-ok

Try / catch

match result {
    Ok(v) => v,
    Err(e) if e.to_string().contains("no installed Caskroom version") => {
        run("brew reinstall --cask <token>")?; retry()
    }
    Err(e) => return Err(e),
}

Prevention

When it happens

Trigger: homebrew_installed_version is called (from install_one_with_ancestors or package_state), homebrew_installed_versions(token) returns an empty list while Homebrew metadata (e.g. the caskroom metadata dir / receipt) is still present.

Common situations: A previous `brew uninstall --cask` or `brew cleanup` partially removed the Caskroom version directory but left metadata; interrupted brew operations; manually deleting ~/Caskroom subdirectories.

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