jdx/mise · error

mise daemons selects project daemon names; use pitchfork…

Error message

mise daemons selects project daemon names; use pitchfork directly for --group operations

What it means

`mise daemons` scopes start/stop/restart to daemon names declared in project config. The `--group` flag is a pitchfork concept for operating on process groups, so when `split_args` sees `--group` (or `--group=...`) with a start/stop/restart action it bails and directs users to use pitchfork directly.

Solutions

  1. Use pitchfork directly: `pitchfork start --group <g>` (etc.) for group operations.
  2. List the daemon names explicitly: `mise daemons restart web worker db`.
  3. Model the group as multiple named daemons in mise.toml `[daemons]` if you want mise to manage them.

Example fix

// before
$ mise daemons restart --group workers
// after
$ pitchfork restart --group workers
// or
$ mise daemons restart worker1 worker2
Defensive patterns

Strategy: validation

Validate before calling

case " $args " in *' --group'* ) echo "use pitchfork directly for --group" ;; esac

Prevention

When it happens

Trigger: Run `mise daemons start|stop|restart --group <g>` or `--group=<g>`; `split_args` (called from `run` and tests) detects the flag for these actions.

Common situations: Users copying pitchfork CLI invocations into `mise daemons`; automations built around pitchfork groups being ported to mise daemons; attempting bulk operations across a group.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


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

Appendix: source

Thrown at src/cli/daemons.rs:275

/// 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());
            break;
        }
        if !arg.starts_with('-') {
            names.push(arg.clone());
            continue;
        }
        if matches!(action, "start" | "stop" | "restart")
            && (arg == "--group" || arg.starts_with("--group="))
        {
            bail!(
                "mise daemons selects project daemon names; use pitchfork directly for --group operations"
            );
        }
        flags.push(arg.clone());
        let takes_value = match action {
            "start" | "restart" => matches!(
                arg.as_str(),
                "--delay"
                    | "--output"
                    | "--http"
                    | "--port"
                    | "--cmd"
                    | "--health-cmd"
                    | "--health-http"
                    | "--health-port"
                    | "--expected-port"
                    | "--shell-pid"
            ),

View on GitHub (pinned to 533346cc37)