{"record":{"id":"fbe7d1671ea17388","repo":"jdx/mise","slug":"daemons-name-requires-run-or-preset","errorCode":null,"errorMessage":"[daemons.{name}] requires run or preset","messagePattern":"\\[daemons\\.(.+?)\\] requires run or preset","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/daemons/mod.rs","lineNumber":101,"sourceCode":"        }\n        let (preset, version, mut table) = match declaration {\n            Declaration::Preset(version) => (Some(name.clone()), Some(version), toml::Table::new()),\n            Declaration::Definition(mut table) => {\n                let preset = take_string(&mut table, \"preset\")?;\n                let version = take_string(&mut table, \"version\")?;\n                (preset, version, table)\n            }\n        };\n        let daemon = if let Some(preset) = preset {\n            let version = version\n                .ok_or_else(|| eyre::eyre!(\"[daemons.{name}] requires version with preset\"))?;\n            presets::expand(&name, &preset, &version, table, &source, &root)?\n        } else {\n            if version.is_some() || table.contains_key(\"options\") {\n                bail!(\"[daemons.{name}] requires preset when specifying version or options\");\n            }\n            if table.get(\"run\").and_then(toml::Value::as_str).is_none() {\n                bail!(\"[daemons.{name}] requires run or preset\");\n            }\n            if let Some(port) = table.get(\"port\").and_then(toml::Value::as_integer) {\n                if !(1..=65535).contains(&port) {\n                    bail!(\"daemon port must be an integer from 1 to 65535\");\n                }\n                table.insert(\n                    \"port\".into(),\n                    toml::Value::Table(toml::Table::from_iter([\n                        (\n                            \"expect\".into(),\n                            toml::Value::Array(vec![toml::Value::Integer(port)]),\n                        ),\n                        (\"bump\".into(), toml::Value::Boolean(false)),\n                    ])),\n                );\n            }\n            table\n                .entry(\"mise\".to_string())","sourceCodeStart":83,"sourceCodeEnd":119,"githubUrl":"https://github.com/jdx/mise/blob/533346cc374382b41ec5ff70536252b2e96e725c/src/daemons/mod.rs#L83-L119","documentation":"Every daemon declaration must either reference a `preset` or provide a `run` command string. If a `[daemons.<name>]` table has neither a preset (checked earlier) nor a string-valued `run` key, mise cannot know what to start and bails during load.","triggerScenarios":"Declaring `[daemons.foo]` with no `run` and no `preset`, or with a `run` key whose value is not a TOML string (e.g. an array or integer) — `toml::Value::as_str()` returns None and the check fails.","commonSituations":"Empty daemon stubs left in config; `run` defined with wrong TOML type (unquoted or as a table); config edited to remove the command but keep the daemon block.","solutions":["Add `run = \"<command>\"` to the daemon table.","Add `preset = \"<name>\"` if you want a predefined daemon template.","Verify `run` is a quoted TOML string, not an array or table."],"exampleFix":"# before\n[daemons.web]\nport = 3000\n\n# after\n[daemons.web]\nrun = \"npm run dev\"\nport = 3000","handlingStrategy":"validation","validationCode":"# shell: each daemons block must have run or preset\nawk '/^\\[daemons\\./{name=$0; has=0} /^(run|preset) /= {has=1} /^\\[/{if (name && !has) print \"missing run/preset: \" name}' mise.toml","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always pair a [daemons.*] header with a `run = \"...\"` string or `preset = \"...\"`.","Quote run commands as TOML strings; never leave run as an array/table.","Delete daemon stubs you don't use instead of leaving empty tables."],"tags":["config","toml","daemons","validation"],"backgroundTag":"missing-required-config-field","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"}