jdx/mise · error

additional asset ' ' is not an archive

Error message

additional asset '{}' is not an archive

What it means

Additional assets configured for a GitHub-backend tool are extracted into the install directory after download, so each must be a recognized archive format (tar, zip, etc.). If `ExtractionFormat::from_file_name` cannot identify the file as an archive, mise refuses to process it.

Solutions

  1. Point the additional-asset pattern at an archived asset (.tar.gz, .tgz, .zip, etc.)
  2. Ask the upstream project to publish the file with a recognized archive extension
  3. Download the raw file out-of-band (e.g. a task/link step) instead of using additional assets

Example fix

// before (mise.toml)
[tools."github:owner/repo"]
additional_assets = ["bintool"]
// after
additional_assets = ["bintool-linux-x64.tar.gz"]
Defensive patterns

Strategy: validation

Validate before calling

// bash: check each configured additional asset is a recognized archive
for a in $ADDITIONAL_ASSETS; do
  case "$a" in *.tar.gz|*.tgz|*.tar.xz|*.tar.bz2|*.zip) ;; *) echo "not an archive: $a"; exit 1;; esac
done

Prevention

When it happens

Trigger: additional_assets/additional patterns pointing at a raw binary, plain text file, or extension-less file that ExtractionFormat::from_file_name does not recognize during additional-asset extraction.

Common situations: Configuring `extra Binaries` style patterns that match a bare executable published alongside the release; upstream renamed an asset losing its .tar.gz/.zip extension.

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@533346cc37 (2026-09-17). Data as JSON: /api/errors/ecf038797c23e05b. Report an issue: GitHub.

Appendix: source

Thrown at src/backend/github.rs:1859

                );
            }
        } else if Settings::get().lockfile_enabled() {
            artifact.size = Some(file_path.metadata()?.len());
        }
        Ok(())
    }

    fn install_additional_archive(
        &self,
        install_path: &Path,
        file_path: &Path,
        pr: Option<&dyn crate::ui::progress_report::SingleReport>,
    ) -> Result<()> {
        let format = file::ExtractionFormat::from_file_name(
            &file_path.file_name().unwrap_or_default().to_string_lossy(),
        );
        if !format.is_archive() {
            eyre::bail!(
                "additional asset '{}' is not an archive",
                file_path.display()
            );
        }
        let extract_opts = file::ExtractOptions {
            pr,
            ..Default::default()
        };
        file::extract_archive(file_path, install_path, format, &extract_opts)
    }

    /// Discovers bin paths in the installation directory
    fn discover_bin_paths(&self, tv: &ToolVersion) -> Result<Vec<std::path::PathBuf>> {
        let raw_opts = tv.request.options();
        let opts = self.options(&raw_opts);
        if let Some(bin_path_template) = opts.bin_path() {
            let bin_path = template_string(&bin_path_template, tv);
            return Ok(vec![tv.install_path().join(&bin_path)]);

View on GitHub (pinned to 533346cc37)