jdx/mise · error · eyre::Report

artifactbundle_asset must end with .artifactbundle.zip, got

Error message

artifactbundle_asset must end with .artifactbundle.zip, got {name}

What it means

When a spm tool pins `artifactbundle_asset`, the asset name must end with `.artifactbundle.zip` (checked case-insensitively elsewhere). This error means the configured name fails that suffix check, so mise rejects the selection before looking at the release.

Source

Thrown at src/backend/spm.rs:924

                        })
                        .collect()
                })
        }
    };
    let Some(assets) = assets else {
        return Ok(None);
    };
    select_artifactbundle_asset(assets, opts)
}

fn select_artifactbundle_asset(
    assets: Vec<ArtifactBundleReleaseAsset>,
    opts: &SpmOptions<'_>,
) -> eyre::Result<Option<ArtifactBundleReleaseAsset>> {
    let artifactbundle_asset = opts.artifactbundle_asset(None);
    if let Some(name) = artifactbundle_asset {
        if !is_artifactbundle_zip(&name) {
            bail!("artifactbundle_asset must end with .artifactbundle.zip, got {name}");
        }
        return assets
            .into_iter()
            .find(|a| a.name == name)
            .map(Some)
            .ok_or_else(|| {
                eyre::eyre!("artifactbundle_asset not found in release assets: {name}")
            });
    }

    let candidates = assets
        .into_iter()
        .filter(|a| is_artifactbundle_zip(&a.name))
        .collect::<Vec<_>>();
    match candidates.len() {
        0 => Ok(None),
        1 => Ok(candidates.into_iter().next()),
        _ => bail!(

View on GitHub (pinned to 6f52dcdf99)

Solutions

  1. Copy the exact asset filename from the release; it must end with .artifactbundle.zip
  2. If the release only has a plain tarball/zip, that asset cannot be used as a bundle — remove artifactbundle_asset and use source build or another backend
  3. Check for trailing spaces or wrong extension when hand-typing the name

Example fix

# before
[tools."spm:foo/bar"]
version = "1.0.0"
artifactbundle_asset = "Bar-macos.artifactbundle"

# after
[tools."spm:foo/bar"]
version = "1.0.0"
artifactbundle_asset = "Bar-macos.artifactbundle.zip"
Defensive patterns

Strategy: validation

Validate before calling

name='Bar-macos.artifactbundle.zip'; case "${name,,}" in *.artifactbundle.zip) echo ok;; *) echo 'must end with .artifactbundle.zip';; esac

Type guard

fn is_artifactbundle_zip(name: &str) -> bool { name.to_lowercase().ends_with(".artifactbundle.zip") }

Prevention

When it happens

Trigger: `artifactbundle_asset = "Repo-1.0.0.tar.gz"`, `"Repo.artifactbundle.tar.gz"`, or `"Repo.artifactbundle"` — anything not ending in .artifactbundle.zip.

Common situations: Guessing the asset name instead of copying it from the GitHub release page, or targeting a plain zip the project publishes alongside its bundles.

Understand the failure class

Background: Config validation failed: what "invalid value for {key}" and settings-rejection errors mean across 19 open-source libraries — this error's family across 19 libraries.

Related errors


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