jdx/mise · error

backend min_version requires version_order = "semver"

Error message

backend min_version requires version_order = "semver"

What it means

Registry tools can specify `version_order = "source"` (default) or `"semver"`. Backend-level `min_version` constraints rely on semver comparisons, so mise requires that any backend with a `min_version` be defined on a tool whose version_order is "semver". Using min_version under source ordering would silently do nothing sensible, so it is rejected at parse time.

Source

Thrown at src/registry.rs:428

        .ok_or_else(|| eyre::eyre!("registry tool must be a TOML table"))?;
    let backends = table
        .get("backends")
        .and_then(toml::Value::as_array)
        .ok_or_else(|| eyre::eyre!("backends must be an array"))?
        .iter()
        .map(parse_registry_backend)
        .collect::<Result<Vec<_>>>()?;
    ensure!(!backends.is_empty(), "backends must not be empty");

    let missing_version_order = !table.contains_key("version_order");
    let version_order = match table.get("version_order").and_then(toml::Value::as_str) {
        Some("source") => VersionOrder::Source,
        Some("semver") => VersionOrder::Semver,
        Some(_) => bail!("version_order must be \"source\" or \"semver\""),
        None => VersionOrder::Source,
    };

    ensure!(
        version_order == VersionOrder::Semver || backends.iter().all(|b| b.min_version.is_none()),
        "backend min_version requires version_order = \"semver\""
    );
    let aliases = string_array(table.get("aliases"), "aliases")?;
    let bins = if table.contains_key("bins") {
        string_array(table.get("bins"), "bins")?
    } else {
        BAKED_REGISTRY
            .get(short)
            .map(|tool| tool.bins.to_vec())
            .unwrap_or_default()
    };
    let overrides = string_array(table.get("overrides"), "overrides")?;
    let os = string_array(table.get("os"), "os")?;
    let idiomatic_files = parse_registry_idiomatic_files(table.get("idiomatic_files"))?;
    let detect = string_array(table.get("detect"), "detect")?;
    let description = table
        .get("description")

View on GitHub (pinned to afd2eddd3a)

Solutions

  1. Add `version_order = "semver"` to the tool's TOML table if its versions are semver-compatible.
  2. Otherwise remove the backend's `min_version` field, since source-ordered tools cannot use it.
  3. If the tool mixes version schemes, keep min_version only on backends whose tool is semver-ordered.

Example fix

// before
[deno]
[[backends]]
type = "github"
source = "denoland/deno"
min_version = "1.40.0"

// after
[deno]
version_order = "semver"

[[backends]]
type = "github"
source = "denoland/deno"
min_version = "1.40.0"
Defensive patterns

Strategy: validation

Validate before calling

// pre-check: min_version only allowed with semver ordering
let order = table.get("version_order").and_then(toml::Value::as_str).unwrap_or("source");
if order != "semver" && backends.iter().any(|b| b.min_version.is_some()) {
    return Err("set version_order = \"semver\" or drop min_version".into());
}

Prevention

When it happens

Trigger: parse_registry_tool finding a backend entry with a `min_version` field while the tool's `version_order` is unset or "source".

Common situations: A registry contributor copies a backend block (with min_version) from a semver-ordered tool into a source-ordered tool (e.g. tools with date-based or named versions), or adds min_version without realizing version_order defaults to "source".

Related errors


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