jdx/mise · error · eyre::Report

multiple SwiftPM artifact bundles found: {}. Set artifactbun

Error message

multiple SwiftPM artifact bundles found: {}. Set artifactbundle_asset to choose one

What it means

When no explicit artifactbundle_asset is configured, select_artifactbundle_asset looks for exactly one *.artifactbundle.zip in the release. If multiple match (e.g. macOS and Linux bundles, or x64/arm64 splits), mise cannot choose and asks you to disambiguate.

Source

Thrown at src/backend/spm.rs:942

            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!(
            "multiple SwiftPM artifact bundles found: {}. Set artifactbundle_asset to choose one",
            candidates
                .into_iter()
                .map(|a| a.name)
                .collect::<Vec<_>>()
                .join(", ")
        ),
    }
}

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

#[derive(Debug, Deserialize)]
struct SwiftTargetInfo {
    target: SwiftTarget,
}

View on GitHub (pinned to 6f52dcdf99)

Solutions

  1. Set artifactbundle_asset to the exact bundle filename for your platform from the release's assets list
  2. If you want cross-machine configs, use platform-specific config (mise.$OSTYPE.toml / [tools] per-platform sections) to pick the right bundle per host

Example fix

# before
[tools."spm:foo/bar"]
version = "2.0.0"

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

Strategy: validation

Validate before calling

gh release view <tag> --repo owner/repo --json assets -q '[.assets[].name | select(endswith("artifactbundle.zip"))] | length' # >1 means you must set artifactbundle_asset

Prevention

When it happens

Trigger: Installing an spm tool whose release contains two or more .artifactbundle.zip assets without setting artifactbundle_asset.

Common situations: Projects that publish per-platform or per-architecture bundles; the auto-selection only works when the release has a single bundle.

Related errors


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