jdx/mise · error

skill asset {name} is not an archive mise can unpack

Error message

skill asset {name} is not an archive mise can unpack

What it means

Thrown by unpack_skill when a skill asset shipped as its own archive has a file name whose format mise cannot recognize as an archive (via ExtractionFormat::from_file_name). mise only unpacks archives with extensions it knows (.tar.gz, .zip, etc.); anything else cannot be safely extracted.

Source

Thrown at src/packslip.rs:411

/// An executable of the install, by the name the packslip gave it.
fn installed_bin(install_path: &Path, program: &str) -> Option<PathBuf> {
    if !is_safe_relative(program) {
        return None;
    }
    let linked = install_path.join(MISE_BINS_DIR).join(program);
    if linked.exists() {
        return Some(linked);
    }
    locate_in_install(install_path, program)
}

/// Unpack a skill shipped as its own archive, dropping a lone top-level
/// directory the way artifacts are unpacked.
fn unpack_skill(archive: &Path, dir: &Path, pr: &dyn SingleReport) -> Result<()> {
    let name = archive.file_name().unwrap_or_default().to_string_lossy();
    let format = file::ExtractionFormat::from_file_name(&name);
    if !format.is_archive() {
        bail!("skill asset {name} is not an archive mise can unpack");
    }
    let strip_components = usize::from(file::should_strip_components(archive, format)?);
    let staging = staging_dir(dir)?;
    let unpacked = file::extract_archive(
        archive,
        &staging,
        format,
        &file::ExtractOptions {
            strip_components,
            pr: Some(pr),
            ..Default::default()
        },
    );
    into_place(&staging, dir, unpacked)
}

/// A fresh sibling directory to build a skill in, so `dir` only ever
/// exists once it is complete and an interrupted attempt cannot pass for

View on GitHub (pinned to afd2eddd3a)

Solutions

  1. Check the asset's actual file name/extension; ensure the packslip points at the archive variant of the skill
  2. If the upstream changed extension to a supported one (.tar.gz, .zip, ...), update the packslip reference
  3. If it's a genuinely new archive format, extract manually and adjust the packslip, or request support for the format in mise
  4. Verify the release assets weren't renamed in a recent upstream release

Example fix

// packslip before: skill points at a raw asset
"skill": "myskill"
// after: point at the archive asset mise can unpack
"skill": "myskill-1.0.0.tar.gz"
Defensive patterns

Strategy: validation

Validate before calling

// pre-flight: check the skill asset name has a supported archive extension
const SUPPORTED: [&str; 4] = [".tar.gz", ".tgz", ".zip", ".tar.xz"];
if !SUPPORTED.iter().any(|ext| asset_name.ends_with(ext)) {
    bail!("skill asset {asset_name} has an unsupported archive extension; update the packslip to point at an archive");
}

Try / catch

match result {
    Err(e) if e.to_string().contains("is not an archive mise can unpack") => {
        eprintln!("skill asset is not a recognized archive; check upstream release naming");
        Err(e)
    }
    other => other,
}

Prevention

When it happens

Trigger: fetch_files downloads a skill asset whose filename has no recognized archive extension — e.g. a raw binary, a .sha256 file mistakenly listed, an unusual extension like .txz/.tgz variants mise doesn't map, or an extensionless release asset declared as a skill.

Common situations: Upstream project changed its release asset naming; packslip lists a non-archive asset as the skill; typo'd or new extension not covered by ExtractionFormat; skill published as a single-file script rather than an archive.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


AI-assisted analysis of jdx/mise@afd2eddd3a (2026-09-09). Data as JSON: /api/errors/80c20377b2a689c2. Report an issue: GitHub.