jdx/mise · error

brew casks are installed at their current version

Error message

brew casks are installed at their current version ('{p}')

What it means

BrewCaskManager::install_with_manager_options (src/system/packages/brew/cask.rs:377) rejects any PackageRequest that carries a version before doing any work. Homebrew casks are versionless from mise's perspective: the cask JSON pins exactly one current version and mise always installs that, so version pinning is unsupported and the request fails fast, naming the offending package.

Solutions

  1. Drop the version from the cask request — mise installs the cask's current version as published in its API metadata
  2. If a specific older app version is required, install it manually (vendor installer or a tap carrying the old cask) and manage it outside mise
  3. Remember version pinning works for brew formulae and other managers — make sure the entry is not routed to the cask manager

Example fix

# before
$ mise install brew-cask:firefox@127.0

# after
$ mise install brew-cask:firefox
Defensive patterns

Strategy: validation

Validate before calling

fn ensure_versionless(pkgs: &[PackageRequest]) -> Result<()> {
    if let Some(p) = pkgs.iter().find(|p| p.version.is_some()) {
        eyre::bail!("cask {p} cannot carry a version; brew casks install at their current version");
    }
    Ok(())
}

Type guard

fn is_valid_cask_request(p: &PackageRequest) -> bool { p.version.is_none() }

Prevention

When it happens

Trigger: A cask install or bootstrap request that includes a version pin — e.g. mise install brew-cask:firefox@127.0 or a packages entry with both name routed to brew-cask and a version field. The find over pkgs locates the first request with version.is_some() and bails immediately.

Common situations: Users copying versioned syntax that works for brew formulae or apt packages into cask entries; shared CI config templates reused across formulae and casks; tools that auto-generate versioned package manifests.

Related errors


AI-assisted analysis of jdx/mise@6f52dcdf99 (2026-08-22). Data as JSON: /api/errors/f3161711103e8d8c. Report an issue: GitHub.

Appendix: source

Thrown at src/system/packages/brew/cask.rs:377

impl CaskPrunePlan {
    pub(crate) fn is_empty(&self) -> bool {
        self.remove.is_empty()
    }
}

impl BrewCaskManager {
    pub(crate) fn new() -> Self {
        Self {}
    }

    async fn install_with_manager_options(
        &self,
        pkgs: &[PackageRequest],
        opts: &InstallOpts,
        manager_options: &ManagerPackageOptions,
    ) -> Result<()> {
        if let Some(p) = pkgs.iter().find(|p| p.version.is_some()) {
            bail!("brew casks are installed at their current version ('{p}')");
        }
        if opts.dry_run {
            prefix::bootstrap(true)?;
            for pkg in pkgs {
                self.install_one(pkg, opts, None, manager_options).await?;
            }
            return Ok(());
        }
        let mpr = MultiProgressReport::get();
        mpr.init_footer(false, "install", pkgs.len());
        for pkg in pkgs {
            let pr: Box<dyn SingleReport> = mpr.add(&format!("brew-cask:{}", pkg.name));
            match self
                .install_one(pkg, opts, Some(&*pr), manager_options)
                .await
            {
                Ok(version) => {
                    pr.finish_with_message(version);

View on GitHub (pinned to 6f52dcdf99)