jdx/mise · error

artifact bundle executable does not exist

Error message

artifact bundle executable does not exist: {}

What it means

artifactbundle_binaries walks the selected artifact bundle variant and, for each declared binary, checks that the file exists on disk inside the extracted bundle. A declared executable missing from the archive means a corrupt/malformed bundle, so mise bails before wiring up shims.

Solutions

  1. Re-download / reinstall the tool to rule out a truncated archive
  2. Inspect the extracted bundle to see which binaries are actually present
  3. Report a broken artifact bundle upstream
  4. Fall back to a source build (unset artifactbundle_only) or pin another version

Example fix

// verify manually after failure
// unzip <tool>.artifactbundle.zip && ls <bundle>/<triple>/bin/
// if empty, report upstream or pin a working version
Defensive patterns

Strategy: retry

Validate before calling

// after extraction, verify binaries exist before use
unzip -q <bundle>.zip -d /tmp/b && find /tmp/b -type f -path '*/bin/*' | wc -l

Prevention

When it happens

Trigger: try_install_artifactbundle calls artifactbundle_binaries after matching a variant by supported_triples; bundle.join(&variant.path) is not a file (Info.plist lists an executable path that is absent from the downloaded/extracted archive).

Common situations: Upstream published a bundle whose Info.plist names binaries that weren't included; truncated/corrupt download; manually crafted bundle with wrong paths.

Understand the failure class

Background: "File not found" and ENOENT errors: why libraries can't find a file that should exist — this error's family across 50 libraries.

Related errors


AI-assisted analysis of jdx/mise@533346cc37 (2026-09-17). Data as JSON: /api/errors/72135518e2d8510f. Report an issue: GitHub.

Appendix: source

Thrown at src/backend/spm.rs:1017

) -> eyre::Result<Vec<ArtifactBundleBinary>> {
    let mut binaries = vec![];
    for bundle in artifactbundle_dirs(extract_dir)? {
        let info = file::read_to_string(bundle.join("info.json"))?;
        let manifest = serde_json::from_str::<ArtifactBundleInfo>(&info)
            .wrap_err("Failed to parse artifact bundle info.json")?;
        for (name, artifact) in manifest.artifacts {
            if artifact.r#type != "executable" {
                continue;
            }
            for variant in artifact.variants {
                if variant
                    .supported_triples
                    .iter()
                    .any(|triple| target_triples.contains(triple))
                {
                    let path = bundle.join(&variant.path);
                    if !path.is_file() {
                        bail!(
                            "artifact bundle executable does not exist: {}",
                            path.display()
                        );
                    }
                    binaries.push(ArtifactBundleBinary {
                        name: name.clone(),
                        path,
                    });
                    break;
                }
            }
        }
    }
    Ok(binaries)
}

fn artifactbundle_dirs(extract_dir: &Path) -> eyre::Result<Vec<PathBuf>> {
    let mut bundles = vec![];

View on GitHub (pinned to 533346cc37)