jdx/mise · warning

{err:#}

Error message

{err:#}

What it means

Mas (Mac App Store) backend's unavailable_reason_async in src/system/packages/mas.rs maps an error from self.bin().await into a human-readable unavailable reason via format!("{err:#}"), preserving the full cause chain. The package is reported unavailable (rather than erroring the whole operation) when the mas CLI cannot be located/executed.

Solutions

  1. Install the mas CLI (e.g. `brew install mas`) so the binary lookup succeeds.
  2. If on non-macOS, remove mas package entries from the config or gate them to macOS environments.
  3. Verify mas is on PATH for the environment running mise (`which mas`).

Example fix

# before (CI on linux)
[pkg]
mas = { "Xcode" = "497799835" }
# after: only on macOS hosts
[pkg.mas]
"Xcode" = "497799835"  # ensure `brew install mas` on macOS runners
Defensive patterns

Strategy: validation

Validate before calling

# verify mas is usable before resolving mas packages
command -v mas >/dev/null 2>&1 || { echo "mas CLI not installed; skip mas packages"; exit 0; }

Try / catch

match backend.unavailable_reason().await {
    Some(reason) => eprintln!("skipping mas package: {reason}"),
    None => proceed_with_install(),
}

Prevention

When it happens

Trigger: Resolving mas-managed packages on a system where the `mas` binary lookup fails — mas not installed, not on PATH, or running on non-macOS where mas cannot work.

Common situations: A mise.toml referencing `mas`-sourced apps is used on Linux or in CI without mas installed; or mas exists but is broken/incompatible with the macOS version.

Related errors


AI-assisted analysis of jdx/mise@533346cc37 (2026-09-17). Data as JSON: /api/errors/6654f023595a681b. Report an issue: GitHub.

Appendix: source

Thrown at src/system/packages/mas.rs:243

impl SystemPackageManager for MasManager {
    fn name(&self) -> &str {
        "mas"
    }

    fn is_available(&self) -> bool {
        cfg!(target_os = "macos") && crate::file::which_non_pristine("mas").is_some()
    }

    fn unavailable_reason(&self) -> String {
        if cfg!(target_os = "macos") {
            "mas not found".to_string()
        } else {
            "only available on macos".to_string()
        }
    }

    async fn unavailable_reason_async(&self) -> Option<String> {
        self.bin().await.err().map(|err| format!("{err:#}"))
    }

    fn supports_version_pins(&self) -> bool {
        false
    }

    async fn installed(&self, pkgs: &[PackageRequest]) -> Result<Vec<PackageStatus>> {
        let apps = mas_list(self.bin().await?).await?;
        Ok(statuses_from_apps(&apps, pkgs))
    }

    async fn install(&self, pkgs: &[PackageRequest], opts: &InstallOpts) -> Result<()> {
        if let Some(p) = pkgs.iter().find(|p| p.version.is_some()) {
            bail!("mas cannot install a pinned version ('{p}')");
        }
        if let Some(p) = pkgs.iter().find(|p| !is_adam_id(&p.name)) {
            bail!("mas install requires a numeric ADAM ID ('{p}'); use `mas search` to find it");
        }

View on GitHub (pinned to 533346cc37)