{"record":{"id":"80c20377b2a689c2","repo":"jdx/mise","slug":"skill-asset-name-is-not-an-archive-mise-can-unpa","errorCode":null,"errorMessage":"skill asset {name} is not an archive mise can unpack","messagePattern":"skill asset (.+?) is not an archive mise can unpack","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/packslip.rs","lineNumber":411,"sourceCode":"/// An executable of the install, by the name the packslip gave it.\nfn installed_bin(install_path: &Path, program: &str) -> Option<PathBuf> {\n    if !is_safe_relative(program) {\n        return None;\n    }\n    let linked = install_path.join(MISE_BINS_DIR).join(program);\n    if linked.exists() {\n        return Some(linked);\n    }\n    locate_in_install(install_path, program)\n}\n\n/// Unpack a skill shipped as its own archive, dropping a lone top-level\n/// directory the way artifacts are unpacked.\nfn unpack_skill(archive: &Path, dir: &Path, pr: &dyn SingleReport) -> Result<()> {\n    let name = archive.file_name().unwrap_or_default().to_string_lossy();\n    let format = file::ExtractionFormat::from_file_name(&name);\n    if !format.is_archive() {\n        bail!(\"skill asset {name} is not an archive mise can unpack\");\n    }\n    let strip_components = usize::from(file::should_strip_components(archive, format)?);\n    let staging = staging_dir(dir)?;\n    let unpacked = file::extract_archive(\n        archive,\n        &staging,\n        format,\n        &file::ExtractOptions {\n            strip_components,\n            pr: Some(pr),\n            ..Default::default()\n        },\n    );\n    into_place(&staging, dir, unpacked)\n}\n\n/// A fresh sibling directory to build a skill in, so `dir` only ever\n/// exists once it is complete and an interrupted attempt cannot pass for","sourceCodeStart":393,"sourceCodeEnd":429,"githubUrl":"https://github.com/jdx/mise/blob/afd2eddd3a50c16190efc1c7e94404b48f72af57/src/packslip.rs#L393-L429","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Check the asset's actual file name/extension; ensure the packslip points at the archive variant of the skill","If the upstream changed extension to a supported one (.tar.gz, .zip, ...), update the packslip reference","If it's a genuinely new archive format, extract manually and adjust the packslip, or request support for the format in mise","Verify the release assets weren't renamed in a recent upstream release"],"exampleFix":"// packslip before: skill points at a raw asset\n\"skill\": \"myskill\"\n// after: point at the archive asset mise can unpack\n\"skill\": \"myskill-1.0.0.tar.gz\"","handlingStrategy":"validation","validationCode":"// pre-flight: check the skill asset name has a supported archive extension\nconst SUPPORTED: [&str; 4] = [\".tar.gz\", \".tgz\", \".zip\", \".tar.xz\"];\nif !SUPPORTED.iter().any(|ext| asset_name.ends_with(ext)) {\n    bail!(\"skill asset {asset_name} has an unsupported archive extension; update the packslip to point at an archive\");\n}","typeGuard":null,"tryCatchPattern":"match result {\n    Err(e) if e.to_string().contains(\"is not an archive mise can unpack\") => {\n        eprintln!(\"skill asset is not a recognized archive; check upstream release naming\");\n        Err(e)\n    }\n    other => other,\n}","preventionTips":["Verify skill assets are published as .tar.gz/.zip archives before adding them to a packslip","Watch upstream releases for asset-naming changes","Don't list checksum files or raw binaries as skill assets","Prefer widely-used archive formats when publishing your own skills"],"tags":["packslip","skill","archive","unsupported-format","extraction"],"backgroundTag":"unsupported-operation","analyzedSha":"afd2eddd3a50c16190efc1c7e94404b48f72af57","analyzedAt":"2026-09-09T01:38:25.179Z","contentChangedAt":"2026-09-09T01:38:25.179Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}