{"record":{"id":"e8a6cedc4b22139a","repo":"jdx/mise","slug":"mas-cannot-install-a-pinned-version-p","errorCode":null,"errorMessage":"mas cannot install a pinned version ('{p}')","messagePattern":"mas cannot install a pinned version \\('(.+?)'\\)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/system/packages/mas.rs","lineNumber":257,"sourceCode":"        }\n    }\n\n    async fn unavailable_reason_async(&self) -> Option<String> {\n        self.bin().await.err().map(|err| format!(\"{err:#}\"))\n    }\n\n    fn supports_version_pins(&self) -> bool {\n        false\n    }\n\n    async fn installed(&self, pkgs: &[PackageRequest]) -> Result<Vec<PackageStatus>> {\n        let apps = mas_list(self.bin().await?).await?;\n        Ok(statuses_from_apps(&apps, pkgs))\n    }\n\n    async fn install(&self, pkgs: &[PackageRequest], opts: &InstallOpts) -> Result<()> {\n        if let Some(p) = pkgs.iter().find(|p| p.version.is_some()) {\n            bail!(\"mas cannot install a pinned version ('{p}')\");\n        }\n        if let Some(p) = pkgs.iter().find(|p| !is_adam_id(&p.name)) {\n            bail!(\"mas install requires a numeric ADAM ID ('{p}'); use `mas search` to find it\");\n        }\n        let mut args = vec![\"install\".to_string()];\n        args.extend(pkgs.iter().map(|p| p.name.clone()));\n        if opts.dry_run {\n            miseprintln!(\"mas {}\", args.join(\" \"));\n            return Ok(());\n        }\n        debug!(\"$ mas {}\", args.join(\" \"));\n        let output = tokio::process::Command::new(self.bin().await?)\n            .args(&args)\n            .stdin(Stdio::null())\n            .output()\n            .await?;\n        if !output.status.success() {\n            let stderr = String::from_utf8_lossy(&output.stderr);","sourceCodeStart":239,"sourceCodeEnd":275,"githubUrl":"https://github.com/jdx/mise/blob/afd2eddd3a50c16190efc1c7e94404b48f72af57/src/system/packages/mas.rs#L239-L275","documentation":"The mas backend cannot install a specific app version: the Mac App Store only serves the latest version of an app. install() rejects any PackageRequest carrying a version pin up front with this error.","triggerScenarios":"Calling the mas package provider's install (via mise packages/tool config) with any request whose `version` field is Some, e.g. `mas@1234567:1.2.3` or a lockfile/mise.toml declaring a pinned version for an ADAM ID.","commonSituations":"Porting a package config from brew/cargo-style tools to mas; a lockfile generated from another machine pinned a version; users expecting App Store apps to be version-pinnable like casks.","solutions":["Remove the version pin so the request contains only the ADAM ID (e.g. `mas:497799835` instead of `mas:497799835:2.1`)","Accept that App Store apps always resolve to the latest available version","If a specific version is required, install it manually via the App Store app or an external mechanism"],"exampleFix":"// before\n[[packages]]\nprovider = \"mas\"\nname = \"497799835\"\nversion = \"2.1.0\"\n// after\n[[packages]]\nprovider = \"mas\"\nname = \"497799835\"\n# version omitted: mas always installs latest","handlingStrategy":"validation","validationCode":"fn assert_no_pin(reqs: &[PackageRequest]) -> Result<()> {\n    reqs.iter().find(|p| p.version.is_some())\n        .map_or(Ok(()), |p| Err(eyre!(\"mas cannot pin versions: {p}\")))\n}","typeGuard":null,"tryCatchPattern":"if let Err(e) = provider.install(&pkgs, &opts).await {\n    if e.to_string().contains(\"pinned version\") {\n        eprintln!(\"retrying without version pins\");\n        let unpinned: Vec<_> = pkgs.iter().map(|p| p.without_version()).collect();\n        provider.install(&unpinned, &opts).await?;\n    } else { return Err(e); }\n}","preventionTips":["Never set version fields on mas package entries","Use lockfiles only for providers that support pinning","Document that App Store apps track latest"],"tags":["macos","mas","version-pinning","unsupported-operation"],"backgroundTag":"unsupported-operation","analyzedSha":"afd2eddd3a50c16190efc1c7e94404b48f72af57","analyzedAt":"2026-09-09T01:38:25.179Z","contentChangedAt":"2026-09-09T01:38:25.179Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}