{"record":{"id":"a3eb06e2cc5a6927","repo":"jdx/mise","slug":"invalid-system-package-spec-expected-manager","errorCode":null,"errorMessage":"invalid system package spec: expected '<manager>:<package>[@version]'","messagePattern":"invalid system package spec: expected '<manager>:<package>\\[@version\\]'","errorType":"validation","errorClass":"eyre::Report","httpStatus":null,"severity":"error","filePath":"src/system/mod.rs","lineNumber":1872,"sourceCode":"        [token] if !token.is_empty() => Some(format!(\"homebrew/cask/{token}\")),\n        _ => None,\n    }\n}\n\nfn is_brew_manager(mgr: &str) -> bool {\n    matches!(mgr, \"brew\" | \"brew-cask\")\n}\n\nfn is_opaque_package_manager(mgr: &str) -> bool {\n    is_brew_manager(mgr) || matches!(mgr, \"mas\" | \"nix\")\n}\n\nfn normalize_use_spec_package_name<'a>(mgr: &str, name: &'a str) -> eyre::Result<&'a str> {\n    if mgr == \"mas\"\n        && let Some(name) = name.strip_suffix(\"@latest\")\n    {\n        if name.is_empty() {\n            bail!(\"invalid system package spec: expected '<manager>:<package>[@version]'\");\n        }\n        return Ok(name);\n    }\n    Ok(name)\n}\n\nfn validate_package_name(mgr: &str, name: &str) -> eyre::Result<()> {\n    if mgr == \"nix\" {\n        packages::nix::Installable::parse(name)?;\n    }\n    if mgr == \"mas\" && !packages::mas::is_adam_id(name) {\n        bail!(\"mas app IDs must be numeric ADAM IDs (e.g. \\\"mas:497799835\\\")\");\n    }\n    Ok(())\n}\n\n/// Collect export declarations before manager validation can warn and skip an\n/// invalid entry. Export must either represent the entire selection or fail.","sourceCodeStart":1854,"sourceCodeEnd":1890,"githubUrl":"https://github.com/jdx/mise/blob/533346cc374382b41ec5ff70536252b2e96e725c/src/system/mod.rs#L1854-L1890","documentation":"For the mas (Mac App Store) manager, package names ending in '@latest' are special-cased: after stripping the '@latest' suffix the remaining name must be non-empty, otherwise the spec is meaningless and mise bails.","triggerScenarios":"Passing 'mas:@latest' to normalize_use_spec_package_name — a mas spec whose name is exactly '@latest' with no ADAM ID.","commonSituations":"Template or scripted spec generation that omits the app ID; misunderstanding that mas supports 'latest' as a version for an unnamed app.","solutions":["Provide the numeric ADAM ID, e.g. mas:497799835","Remove the '@latest' suffix and specify the app ID directly","Drop the entry if no specific app is intended"],"exampleFix":"// before\nmise bootstrap packages use mas:@latest\n// after\nmise bootstrap packages use mas:497799835","handlingStrategy":"validation","validationCode":"function masSpecOk(spec) {\n  const name = spec.split(\":\")[1] ?? \"\";\n  return !(name === \"@latest\" || name === \"\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Never emit mas specs with an empty package name","Always pair @latest handling with a real ADAM ID","Validate generated specs in scripts before invoking mise"],"tags":["cli","system-packages","mas","parsing"],"backgroundTag":"invalid-identifier-format","analyzedSha":"533346cc374382b41ec5ff70536252b2e96e725c","analyzedAt":"2026-09-17T13:35:38.149Z","contentChangedAt":"2026-09-17T13:35:38.149Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}