jdx/mise · error

provider ' ' is inactive

Error message

provider '{}' is inactive: {reason}

What it means

mise validates that every dependency provider selected in a project's deps configuration is currently active. A provider reports its applicability, and when it is `Inactive(reason)` — e.g. its required tool is unavailable or the platform/feature doesn't apply — mise refuses to proceed rather than silently skipping it. The reason string explains exactly why the provider is unusable.

Solutions

  1. Read the `{reason}` in the message and fix the underlying condition (install the missing tool, enable the backend/feature)
  2. Remove or comment out the inactive provider from the deps configuration
  3. Run `mise doctor` to see why the provider reports inactive
  4. Pin/use a provider variant that is active on your platform

Example fix

// before (mise.toml)
[deps]
provider = "cargo"   # inactive: cargo toolchain not installed
// after
mise use cargo        # install the toolchain so the provider is active
Defensive patterns

Strategy: validation

Validate before calling

let inactive: Vec<_> = providers.iter().filter(|p| matches!(p.applicability(), DepsProviderApplicability::Inactive(_))).map(|p| p.id().to_string()).collect();
if !inactive.is_empty() { eprintln!("inactive deps providers: {inactive:?}"); }
// run `mise doctor` first to inspect provider applicability

Prevention

When it happens

Trigger: Calling `validate_provider_selection` (during deps resolution/run) while a provider listed in the deps config returns `DepsProviderApplicability::Inactive(reason)` from `provider.applicability()`.

Common situations: A deps provider configured in mise.toml depends on a tool or backend that is not installed/disabled; config copied from another machine or OS where the provider applies but here it doesn't.

Related errors


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

Appendix: source

Thrown at src/deps/engine.rs:589

    }

    fn validate_provider_selection(
        providers: &[Box<dyn DepsProvider>],
        only: Option<&[String]>,
        skip: &[String],
    ) -> Result<()> {
        let Some(only) = only else {
            return Ok(());
        };
        for id in only {
            if skip.contains(id) {
                continue;
            }
            let Some(provider) = providers.iter().find(|provider| provider.id() == id) else {
                continue;
            };
            if let DepsProviderApplicability::Inactive(reason) = provider.applicability() {
                bail!("provider '{}' is inactive: {reason}", provider.id());
            }
        }
        Ok(())
    }

    /// Run all stale deps steps, respecting dependency ordering
    pub(crate) async fn run(&self, opts: DepsOptions) -> Result<DepsResult> {
        let mut results = vec![];

        Self::validate_provider_selection(&self.providers, opts.only.as_deref(), &opts.skip)?;

        let is_selected = |provider: &dyn DepsProvider| {
            (!opts.auto_only || provider.is_auto())
                && !opts.skip.iter().any(|id| id == provider.id())
                && opts
                    .only
                    .as_ref()
                    .is_none_or(|only| only.iter().any(|id| id == provider.id()))

View on GitHub (pinned to 533346cc37)