jdx/mise · error

Setting [ ] is not set

Error message

Setting [{}] is not set

What it means

`mise settings get <key>` walks dotted path segments through the settings TOML. When a segment resolves but the final key has no stored value in any settings file, mise checks whether the key is a known setting; if it is, it reports that the setting exists but is simply not set, rather than treating it as unknown. This distinguishes 'valid but unset' (user should set it or rely on the default) from an invalid key.

Solutions

  1. Set the value: `mise settings set <key> <value>`.
  2. If the default is acceptable, handle the unset case in your script instead of failing (check exit code or use a default).
  3. Check which config files exist with `mise settings ls` / inspect ~/.config/mise/settings.toml and project mise.toml [settings] blocks.

Example fix

// before
mise settings get experimental
// Setting [experimental] is not set

// after
mise settings set experimental true
mise settings get experimental
Defensive patterns

Strategy: fallback

Validate before calling

mise settings ls | grep -qx "${key}" || echo "${key} may be unset or unknown"

Try / catch

value=$(mise settings get "$key" 2>/dev/null) || value="$default_value"

Prevention

When it happens

Trigger: Running `mise settings get <known-setting>` where no settings file (global, local, or system) has written a value for that key — only the built-in default applies.

Common situations: Querying a setting you assumed was configured in ~/.config/mise/settings.toml but never saved; settings removed by `mise settings unset`; reading settings in CI where only defaults exist.

Related errors


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

Appendix: source

Thrown at src/cli/settings/get.rs:47

        let settings = if self.local {
            let partial = Settings::parse_settings_file(&config::local_toml_config_path())
                .unwrap_or_default();
            Settings::partial_as_dict(&partial)?
        } else {
            Settings::get().as_dict()?
        };
        let mut value = toml::Value::Table(settings);
        let mut key = Some(self.setting.as_str());
        while let Some(k) = key {
            let k = k
                .split_once('.')
                .map(|(a, b)| (a, Some(b)))
                .unwrap_or((k, None));
            if let Some(v) = value.as_table().and_then(|t| t.get(k.0)) {
                key = k.1;
                value = v.clone()
            } else if is_known_setting(&self.setting) {
                bail!("Setting [{}] is not set", self.setting);
            } else {
                bail!("Unknown setting: {}", self.setting);
            }
        }
        match value {
            toml::Value::String(s) => miseprintln!("{s}"),
            value => miseprintln!("{value}"),
        }

        Ok(())
    }
}

fn is_known_setting(key: &str) -> bool {
    if SETTINGS_META.contains_key(key) {
        return true;
    }
    let prefix = format!("{key}.");

View on GitHub (pinned to 533346cc37)