jdx/mise · error

no matching project daemons; define [daemons] in mise.toml

Error message

no matching project daemons; define [daemons] in mise.toml

What it means

After iterating over all project roots and selected daemons, if no daemon was matched at all (`matched == false`), mise concludes the project has no daemons configured and bails, pointing at the `[daemons]` section of mise.toml.

Solutions

  1. Add a `[daemons]` section with daemon definitions to your project's mise.toml.
  2. Run the command from the project root that contains the daemon config.
  3. Run `mise daemons status` to see whether any daemons are recognized.

Example fix

// before (mise.toml without daemons)
$ mise daemons start  // no matching project daemons
// after
# mise.toml
[daemons.web]
run = "npm start"
$ mise daemons start
Defensive patterns

Strategy: validation

Validate before calling

grep -q '^\[daemons' mise.toml || echo "no [daemons] defined"

Prevention

When it happens

Trigger: Run any `mise daemons <action>` where the current project's mise.toml has no `[daemons]` table (or names matched nothing across all roots), so the `matched` flag stays false.

Common situations: Running `mise daemons start` in a repo that never defined daemons; `[daemons]` placed in the wrong file or a non-project config; forgetting to define daemons before managing them.

Understand the failure class

Background: EmptyResultError / "no results found": when an API or scraper succeeds but returns zero rows — this error's family across 9 libraries.

Related errors


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

Appendix: source

Thrown at src/cli/daemons.rs:247

            }
        }
        if action == "ls" {
            if json {
                miseprintln!("{}", serde_json::to_string_pretty(&rows)?);
            } else {
                let mut table =
                    crate::ui::table::MiseTable::new(false, &["Daemon", "Status", "Source"]);
                for row in rows {
                    table.add_row(vec![
                        comfy_table::Cell::new(row["id"].as_str().unwrap_or_default()),
                        comfy_table::Cell::new(row["status"].as_str().unwrap_or_default()),
                        comfy_table::Cell::new(row["source"].as_str().unwrap_or_default()),
                    ]);
                }
                table.print()?;
            }
        } else if !matched {
            bail!("no matching project daemons; define [daemons] in mise.toml");
        }
        Ok(())
    }
}

fn matches_name(id: &str, name: &str) -> bool {
    id == name || id.rsplit('/').next() == Some(name)
}

/// Separate positional IDs from pitchfork options before matching project roots.
/// Value-taking options must retain their values even when a value is a daemon name.
fn split_args(action: &str, args: &[String]) -> Result<(Vec<String>, Vec<String>)> {
    let mut names = Vec::new();
    let mut flags = Vec::new();
    let mut args = args.iter();
    while let Some(arg) = args.next() {
        if arg == "--" {
            names.extend(args.cloned());

View on GitHub (pinned to 533346cc37)