{"record":{"id":"4e7ba28a1d86dbea","repo":"jdx/mise","slug":"pitchfork-supervisor-is-not-running-run-mise-daemons-start","errorCode":null,"errorMessage":"pitchfork supervisor is not running; run mise daemons start","messagePattern":"pitchfork supervisor is not running; run mise daemons start","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/cli/daemons.rs","lineNumber":108,"sourceCode":"            Some(Commands::Tui(args)) => (\"tui\", args.args, false),\n            Some(Commands::Ls(list)) => (\"ls\", vec![], list.json),\n            None => (\"ls\", vec![], self.list.json),\n        };\n        let config = Config::get().await?;\n        let root = config\n            .project_root\n            .as_deref()\n            .ok_or_else(|| eyre::eyre!(\"mise daemons requires a project configuration\"))?;\n        // The dashboard is global to the supervisor, not one invocation per daemon root.\n        if action == \"tui\" {\n            if args.first().is_some_and(|arg| !arg.starts_with('-')) {\n                bail!(\"mise daemons tui opens the dashboard; pass TUI flags, not daemon names\");\n            }\n            let previous = runtime::read_state(root)?;\n            let (config, ts) = runtime::toolset(&config, false).await?;\n            let runtime = Runtime::from_toolset(&config, &ts, Some(&previous.bin)).await?;\n            if !runtime.supervisor_up(root).await? {\n                bail!(\"pitchfork supervisor is not running; run mise daemons start\");\n            }\n            return runtime\n                .exec(root, [vec![\"tui\".into()], args].concat())\n                .await;\n        }\n        let loaded = config.daemons()?;\n        let mut roots = loaded.roots();\n        if !roots.iter().any(|r| r == root) {\n            roots.push(root.to_path_buf());\n        }\n        let (names, flags) = split_args(action, &args)?;\n        let install = matches!(action, \"start\" | \"restart\");\n        let mut root_ids = Vec::new();\n        for root in &roots {\n            let previous = runtime::read_state(root)?;\n            let namespace = if previous.namespace.is_empty() {\n                runtime::namespace(root)?\n            } else {","sourceCodeStart":90,"sourceCodeEnd":126,"githubUrl":"https://github.com/jdx/mise/blob/533346cc374382b41ec5ff70536252b2e96e725c/src/cli/daemons.rs#L90-L126","documentation":"Before opening the TUI dashboard, `mise daemons tui` verifies that the pitchfork supervisor process is up via `runtime.supervisor_up(root)`. If the supervisor isn't running there is no runtime to attach the dashboard to, so mise bails and tells the user to start it.","triggerScenarios":"Run `mise daemons tui` inside a project with a valid root while no pitchfork supervisor has been started for that root (no prior `mise daemons start` / supervisor not reachable).","commonSituations":"New shell or machine reboot where the supervisor died; first-time user running `tui` before ever running `mise daemons start`; supervisor crashed and wasn't restarted.","solutions":["Run `mise daemons start` in the project to bring up the pitchfork supervisor.","Re-run `mise daemons tui` after confirming `mise daemons status` works.","Check pitchfork state/logs if `start` claims success but the supervisor immediately dies."],"exampleFix":"// before\n$ mise daemons tui   // \"pitchfork supervisor is not running\"\n// after\n$ mise daemons start\n$ mise daemons tui","handlingStrategy":"validation","validationCode":"mise daemons status >/dev/null 2>&1 || mise daemons start","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Run `mise daemons start` as part of project setup.","After reboots, check supervisor status before opening the TUI."],"tags":["cli","daemons","supervisor","pitchfork"],"backgroundTag":"missing-dependency","analyzedSha":"533346cc374382b41ec5ff70536252b2e96e725c","analyzedAt":"2026-09-17T13:35:38.149Z","contentChangedAt":"2026-09-17T13:35:38.149Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}