jdx/mise · error

mise daemons tui opens the dashboard; pass TUI flags, not…

Error message

mise daemons tui opens the dashboard; pass TUI flags, not daemon names

What it means

`mise daemons tui` launches the pitchfork TUI dashboard, which is global to the supervisor. Positional arguments after `tui` are TUI flags; if the first argument doesn't start with '-' the command assumes a daemon name was passed, which this subcommand does not support, and bails with guidance.

Solutions

  1. Run `mise daemons tui` with no positional daemon name; pass only flag-style TUI options.
  2. To act on a specific daemon, use `mise daemons start|stop|restart|logs|status <name>` instead.
  3. Use `pitchfork tui` directly if you need pitchfork-specific TUI targeting.

Example fix

// before
$ mise daemons tui webdaemon
// after
$ mise daemons tui          # opens global dashboard
$ mise daemons logs webdaemon  # daemon-specific action
Defensive patterns

Strategy: validation

Validate before calling

case "$arg" in -*) mise daemons tui "$arg" ;; *) echo "tui takes flags only" ;; esac

Prevention

When it happens

Trigger: Run `mise daemons tui <name>` — e.g. `mise daemons tui mydaemon` — where `args.first()` exists and does not begin with '-' while `action == "tui"`.

Common situations: Users pattern-matching from `mise daemons start|stop|logs <name>` and trying `mise daemons tui <name>`; scripting `tui` with a daemon argument copied from other daemon subcommands.

Understand the failure class

Background: "Unknown argument", "Invalid value", and "must be one of": invalid CLI argument errors explained — this error's family across 35 libraries.

Related errors


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

Appendix: source

Thrown at src/cli/daemons.rs:102

            }
            Some(Commands::Start(args)) => ("start", args.args, false),
            Some(Commands::Stop(args)) => ("stop", args.args, false),
            Some(Commands::Restart(args)) => ("restart", args.args, false),
            Some(Commands::Logs(args)) => ("logs", args.args, false),
            Some(Commands::Status(args)) => ("status", args.args, false),
            Some(Commands::Tui(args)) => ("tui", args.args, false),
            Some(Commands::Ls(list)) => ("ls", vec![], list.json),
            None => ("ls", vec![], self.list.json),
        };
        let config = Config::get().await?;
        let root = config
            .project_root
            .as_deref()
            .ok_or_else(|| eyre::eyre!("mise daemons requires a project configuration"))?;
        // The dashboard is global to the supervisor, not one invocation per daemon root.
        if action == "tui" {
            if args.first().is_some_and(|arg| !arg.starts_with('-')) {
                bail!("mise daemons tui opens the dashboard; pass TUI flags, not daemon names");
            }
            let previous = runtime::read_state(root)?;
            let (config, ts) = runtime::toolset(&config, false).await?;
            let runtime = Runtime::from_toolset(&config, &ts, Some(&previous.bin)).await?;
            if !runtime.supervisor_up(root).await? {
                bail!("pitchfork supervisor is not running; run mise daemons start");
            }
            return runtime
                .exec(root, [vec!["tui".into()], args].concat())
                .await;
        }
        let loaded = config.daemons()?;
        let mut roots = loaded.roots();
        if !roots.iter().any(|r| r == root) {
            roots.push(root.to_path_buf());
        }
        let (names, flags) = split_args(action, &args)?;
        let install = matches!(action, "start" | "restart");

View on GitHub (pinned to 533346cc37)