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
- Add a `[daemons]` section with daemon definitions to your project's mise.toml.
- Run the command from the project root that contains the daemon config.
- 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
- Define `[daemons]` in the project mise.toml before using `mise daemons`.
- Verify you're in the project root, not a subdirectory without daemon config.
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
- no matching project daemons for
- 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/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)