jdx/mise · error

packslip artifact must declare extensions.mise.plugin = vfox

Error message

packslip artifact must declare extensions.mise.plugin = vfox

What it means

`validate_artifact` in src/plugins/packslip.rs enforces that a packslip artifact used as a vfox plugin declares `extensions.mise.plugin = "vfox"` in its release manifest. This marks the artifact as a plugin payload so mise treats it as vfox plugin code rather than an ordinary binary release. A manifest missing or mis-typing that key fails validation.

Source

Thrown at src/plugins/packslip.rs:177

    }
    if let Err(error) = file::rename(payload, destination) {
        if existed {
            file::rename(backup, destination).wrap_err("restoring previous plugin")?;
        }
        return Err(error);
    }
    if let Err(error) = commit() {
        file::rename(destination, payload)?;
        if existed {
            file::rename(backup, destination).wrap_err("restoring previous plugin")?;
        }
        return Err(error);
    }
    Ok(())
}

pub(crate) fn validate_artifact(artifact: &packslip::model::Artifact) -> Result<()> {
    ensure!(
        artifact
            .extensions
            .get("mise")
            .and_then(|v| v.get("plugin"))
            .and_then(|v| v.as_str())
            == Some("vfox"),
        "packslip artifact must declare extensions.mise.plugin = vfox"
    );
    ensure!(
        artifact.bin.is_empty(),
        "vfox plugin artifacts must not declare executables"
    );
    ensure!(
        artifact.os.is_none() && artifact.arch.is_none() && artifact.libc.is_none(),
        "vfox plugin artifact must be portable"
    );
    ensure!(
        artifact.requires.is_none(),

View on GitHub (pinned to afd2eddd3a)

Solutions

  1. Add `extensions.mise.plugin = "vfox"` to the artifact's manifest and republish the release manifest.
  2. Ensure the value is exactly the string "vfox" (not null, number, or another name).
  3. If the artifact is actually a regular binary tool, install it via the normal packslip tool source rather than the plugin path.

Example fix

// before (manifest)
[artifacts.plugin]
format = "tar.gz"

// after (manifest)
[artifacts.plugin.extensions.mise]
plugin = "vfox"
format = "tar.gz"
Defensive patterns

Strategy: validation

Validate before calling

// pre-check manifest before publishing
jq -e '.artifacts[] | select(.extensions.mise.plugin == "vfox")' manifest.json \
  || { echo "missing extensions.mise.plugin = vfox"; exit 1; }

Prevention

When it happens

Trigger: Publishing/installing via `plugin_artifact_contract` where the artifact's `extensions` map lacks a `mise` object, lacks a `plugin` key, or has a non-string/`non-"vfox"` value — e.g. a manifest generated for a regular binary tool being consumed as a plugin.

Common situations: Plugin author forgot to add the extensions block to the release manifest; a template generated plain tool manifests; the key was renamed or quoted with a different value (e.g. "vfox-plugin").

Understand the failure class

Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.

Related errors


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