{"record":{"id":"6ca5d2ea9a694cb4","repo":"jdx/mise","slug":"version-order-must-be-source-or-semver-6ca5d2","errorCode":null,"errorMessage":"version_order must be \"source\" or \"semver\"","messagePattern":"version_order must be \"source\" or \"semver\"","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/registry.rs","lineNumber":371,"sourceCode":"\nfn parse_registry_tool(short: &str, value: &toml::Value) -> Result<(RegistryTool, bool)> {\n    let table = value\n        .as_table()\n        .ok_or_else(|| eyre::eyre!(\"registry tool must be a TOML table\"))?;\n    let backends = table\n        .get(\"backends\")\n        .and_then(toml::Value::as_array)\n        .ok_or_else(|| eyre::eyre!(\"backends must be an array\"))?\n        .iter()\n        .map(parse_registry_backend)\n        .collect::<Result<Vec<_>>>()?;\n    ensure!(!backends.is_empty(), \"backends must not be empty\");\n\n    let missing_version_order = !table.contains_key(\"version_order\");\n    let version_order = match table.get(\"version_order\").and_then(toml::Value::as_str) {\n        Some(\"source\") => VersionOrder::Source,\n        Some(\"semver\") => VersionOrder::Semver,\n        Some(_) => bail!(\"version_order must be \\\"source\\\" or \\\"semver\\\"\"),\n        None => VersionOrder::Source,\n    };\n\n    let aliases = string_array(table.get(\"aliases\"), \"aliases\")?;\n    let bins = string_array(table.get(\"bins\"), \"bins\")?;\n    let overrides = string_array(table.get(\"overrides\"), \"overrides\")?;\n    let os = string_array(table.get(\"os\"), \"os\")?;\n    let idiomatic_files = parse_registry_idiomatic_files(table.get(\"idiomatic_files\"))?;\n    let detect = string_array(table.get(\"detect\"), \"detect\")?;\n    let description = table\n        .get(\"description\")\n        .map(|value| {\n            value\n                .as_str()\n                .map(|value| leak_string(value.to_string()))\n                .ok_or_else(|| eyre::eyre!(\"description must be a string\"))\n        })\n        .transpose()?;","sourceCodeStart":353,"sourceCodeEnd":389,"githubUrl":"https://github.com/jdx/mise/blob/9dcfcaa0dc8747a2577d3270b69bb9d8313b2807/src/registry.rs#L353-L389","documentation":"While parsing a registry TOML entry, mise's parse_registry_tool only accepts version_order = \"source\" (order versions as the backend reports them, the default when the key is absent) or version_order = \"semver\" (sort with semver semantics). Any other string — including different casing like \"Semver\" — causes an immediate bail with this message. The value controls how mise orders a tool's versions when resolving 'latest'.","triggerScenarios":"Adding or editing a file in registry/ (or a custom registry) with e.g. version_order = \"date\", \"natural\", \"SemVer\", or \"semver \" (trailing whitespace). Parsing runs when the registry is loaded at startup or when running registry validation/tests, and the whole registry load fails.","commonSituations":"Contributing a new tool to mise's registry and guessing a version_order value; copy-pasting an entry from another registry that supports richer ordering; changing casing during a refactor.","solutions":["Set version_order = \"source\" if the backend already returns newest-first versions (most common), or version_order = \"semver\" only for strictly semver tools.","Delete the version_order key entirely — the default is Source, which is usually what you want.","Re-run `cargo test registry` (or the registry validation task) to confirm the entry parses.","Check for invisible issues: the match is exact and case-sensitive, so verify no quotes/whitespace/casing drift."],"exampleFix":"# before\n[tools]\nmytool = \"1.2.3\"\nversion_order = \"date\"\n# after\nversion_order = \"source\"","handlingStrategy":"validation","validationCode":"# validate version_order before submitting a registry entry\norder=$(tomlq -r '.version_order // \"source\"' registry/mytool.toml)\n[ \"$order\" = \"source\" ] || [ \"$order\" = \"semver\" ] || { echo \"bad version_order: $order\" >&2; exit 1; }","typeGuard":"fn is_valid_version_order(v: &str) -> bool { v == \"source\" || v == \"semver\" }","tryCatchPattern":null,"preventionTips":["Omit version_order unless you know the backend's ordering is wrong; the default is Source.","Copy a recent, passing registry entry as your template.","Run the registry test suite locally before opening a PR."],"tags":["mise","registry","toml","config-validation","version-order"],"backgroundTag":"invalid-config-value","analyzedSha":"9dcfcaa0dc8747a2577d3270b69bb9d8313b2807","analyzedAt":"2026-08-17T14:28:50.624Z","schemaVersion":2},"datasetVersion":"2026-08-21T18:17:14.833Z"}