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
- Drop the version from the cask request — mise installs the cask's current version as published in its API metadata
- 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
- 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
- Never put version pins on entries routed to brew-cask
- Use unpinned cask entries and rely on upgrades for updates
- Reserve version pinning for managers that support it (apt, brew formulae)
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
- brew-cask: requested token
- brew-cask: : conflicts with installed cask
- brew-cask: : dependency cycle detected
- brew-cask: : Homebrew owns this cask; remove it with…
- brew-cask: : Homebrew took ownership of this cask while…
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)