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
- Run `mise daemons status` with no names to list the daemon ids configured for the project.
- Fix the daemon name spelling or add the missing daemon under `[daemons]` in mise.toml.
- 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
- List configured daemon ids with `mise daemons status` before scripting actions.
- Keep daemon names consistent between mise.toml and scripts/CI.
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
- no matching project daemons; define [daemons] in mise.toml
- cannot export ' ': use a shorthand attribute such as…
- Check command must not be empty
- collection updates require scalar or array values
- config file not found
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)