{"record":{"id":"c320310abc0a86bc","repo":"jdx/mise","slug":"vfox-plugin-artifacts-currently-require-tar-gz-for","errorCode":null,"errorMessage":"vfox plugin artifacts currently require tar.gz format","messagePattern":"vfox plugin artifacts currently require tar\\.gz format","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/plugins/packslip.rs","lineNumber":198,"sourceCode":"            .get(\"mise\")\n            .and_then(|v| v.get(\"plugin\"))\n            .and_then(|v| v.as_str())\n            == Some(\"vfox\"),\n        \"packslip artifact must declare extensions.mise.plugin = vfox\"\n    );\n    ensure!(\n        artifact.bin.is_empty(),\n        \"vfox plugin artifacts must not declare executables\"\n    );\n    ensure!(\n        artifact.os.is_none() && artifact.arch.is_none() && artifact.libc.is_none(),\n        \"vfox plugin artifact must be portable\"\n    );\n    ensure!(\n        artifact.requires.is_none(),\n        \"vfox plugin artifacts must not declare host requirements\"\n    );\n    ensure!(\n        matches!(artifact.format.as_deref(), Some(\"tar.gz\" | \"tgz\")),\n        \"vfox plugin artifacts currently require tar.gz format\"\n    );\n    Ok(())\n}\n\n/// Reject links and special files before extraction, including links whose\n/// targets might otherwise be resolved while unpacking a later archive entry.\npub(crate) fn validate_archive(path: &Path) -> Result<()> {\n    let reader = flate2::read::GzDecoder::new(std::fs::File::open(path)?);\n    let mut archive = jdx_tar::Archive::new(reader);\n    for entry in archive.entries()? {\n        let entry = entry?;\n        ensure!(\n            matches!(\n                entry.entry_type(),\n                jdx_tar::EntryType::File | jdx_tar::EntryType::Directory\n            ),","sourceCodeStart":180,"sourceCodeEnd":216,"githubUrl":"https://github.com/jdx/mise/blob/afd2eddd3a50c16190efc1c7e94404b48f72af57/src/plugins/packslip.rs#L180-L216","documentation":"`validate_artifact` requires vfox plugin artifacts to be packaged as `tar.gz` (accepting the aliases \"tar.gz\" and \"tgz\"). Any other or missing `format` value in the manifest fails this check, since mise extracts the plugin payload expecting a gzipped tarball.","triggerScenarios":"A packslip plugin artifact manifest sets `format` to something else (\"zip\", \"tar.xz\", \"tar.zst\", null/absent) and the artifact goes through `plugin_artifact_contract` validation.","commonSituations":"Release automation zips the plugin directory; author switched compression to reduce size (xz/zst); format field left out of a hand-written manifest.","solutions":["Package the plugin as a gzipped tarball and set `format = \"tar.gz\"` (or \"tgz\") in the manifest, then republish.","Change release CI to use `tar -czf` instead of zip/xz/zst packaging.","Add the missing `format` key if it was simply omitted."],"exampleFix":"// before (manifest)\n[artifacts.plugin]\nformat = \"zip\"\n\n// after (manifest)\n[artifacts.plugin]\nformat = \"tar.gz\"","handlingStrategy":"validation","validationCode":"jq -e '.artifacts[] | select(.extensions.mise.plugin == \"vfox\" and (.format == \"tar.gz\" or .format == \"tgz\"))' manifest.json \\\n  || { echo \"vfox plugin artifact must be tar.gz\"; exit 1; }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always package plugins with `tar -czf` and declare format = \"tar.gz\".","Avoid zip/xz/zst in plugin release CI scripts.","Add the format check to the release checklist or CI manifest lint."],"tags":["packslip","vfox","artifact-format","validation"],"backgroundTag":"invalid-enum-value","analyzedSha":"afd2eddd3a50c16190efc1c7e94404b48f72af57","analyzedAt":"2026-09-09T01:38:25.179Z","contentChangedAt":"2026-09-09T01:38:25.179Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}