jdx/mise · error

no matching project daemons for

Error message

no matching project daemons for {name:?}

What it means

`mise daemons <action> <names...>` validates, before touching any root or installing tools, that every requested name matches at least one daemon id declared in the project's `[daemons]` configuration across discovered roots. A name that matches nothing aborts the whole request.

Solutions

  1. Run `mise daemons status` with no names to list the daemon ids configured for the project.
  2. Fix the daemon name spelling or add the missing daemon under `[daemons]` in mise.toml.
  3. cd into the correct project root that defines the daemon.

Example fix

// before (mise.toml has [daemons.web])
$ mise daemons restart webserv  // no match
// after
$ mise daemons restart web
Defensive patterns

Strategy: validation

Validate before calling

mise daemons status | awk '{print $1}' | grep -qx "$name" || echo "unknown daemon: $name"

Prevention

When it happens

Trigger: Run `mise daemons <action> <name>` where `<name>` is not found in any root's daemon id list (`root_ids`), checked via `matches_name(id, name)`.

Common situations: Typo in a daemon name; daemon renamed or removed from mise.toml `[daemons]`; running the command in the wrong project directory; name casing mismatch.

Understand the failure class

Background: Record Not Found Errors: "not found", RecordNotFound, and "was not found" — what they mean and how to fix them — this error's family across 28 libraries.

Related errors


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

Appendix: source

Thrown at src/cli/daemons.rs:142

            let namespace = if previous.namespace.is_empty() {
                runtime::namespace(root)?
            } else {
                previous.namespace.clone()
            };
            let mut ids = if install { Vec::new() } else { previous.ids };
            ids.extend(
                loaded
                    .for_root(root)
                    .daemons
                    .keys()
                    .map(|name| format!("{namespace}/{name}")),
            );
            root_ids.push(ids);
        }
        // Validate the entire request before any root installs tools or changes state.
        for name in &names {
            if !root_ids.iter().flatten().any(|id| matches_name(id, name)) {
                bail!("no matching project daemons for {name:?}");
            }
        }
        let mut rows = Vec::new();
        let mut matched = false;
        for (root, ids) in roots.into_iter().zip(root_ids) {
            if !names.is_empty()
                && !ids
                    .iter()
                    .any(|id| names.iter().any(|name| matches_name(id, name)))
            {
                continue;
            }
            let scoped = runtime::config_for_root(&config, &root).await?;
            let set = scoped.daemons()?.for_root(&root);
            let previous = runtime::read_state(&root)?;
            if set.daemons.is_empty() && previous.ids.is_empty() {
                continue;
            }

View on GitHub (pinned to 533346cc37)