{"record":{"id":"d3b1a779851ae90b","repo":"jdx/mise","slug":"invalid-daemon-name-name-use-letters-numbers-or","errorCode":null,"errorMessage":"invalid daemon name {name:?}; use letters, numbers, '.', '_' or '-'","messagePattern":"invalid daemon name (.+?); use letters, numbers, '\\.', '_' or '-'","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/daemons/mod.rs","lineNumber":82,"sourceCode":"                    cf.get_path().to_path_buf(),\n                    cf.project_root().unwrap_or_else(|| cf.config_root()),\n                ),\n            );\n        }\n    }\n    let mut set = DaemonSet::default();\n    for (name, (declaration, source, root)) in declarations {\n        if name.is_empty()\n            || name == \".\"\n            || name.contains(\"..\")\n            || name.contains(\"--\")\n            || name.starts_with('-')\n            || name.ends_with('-')\n            || !name\n                .chars()\n                .all(|c| c.is_ascii_alphanumeric() || matches!(c, '_' | '-' | '.'))\n        {\n            bail!(\"invalid daemon name {name:?}; use letters, numbers, '.', '_' or '-'\");\n        }\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() {","sourceCodeStart":64,"sourceCodeEnd":100,"githubUrl":"https://github.com/jdx/mise/blob/533346cc374382b41ec5ff70536252b2e96e725c/src/daemons/mod.rs#L64-L100","documentation":"Daemon declarations in `[daemons.<name>]` must have names made only of ASCII letters, digits, '_', '-', and '.', and must not start or end with '-'. The `load` function validates each daemon name and bails with this message for anything else. This keeps daemon names usable as identifiers/process labels.","triggerScenarios":"Declaring a daemon in mise.toml whose table key contains spaces, slashes, non-ASCII characters, or starts/ends with '-', parsed during config load (load is invoked by task/env expansion paths such as daemons_merge_before_expanding_tools_and_exports).","commonSituations":"Copy-pasting a service name like `my daemon` or `api/server` into a `[daemons.*]` key; trailing hyphens from templated names; quoting mistakes in TOML keys.","solutions":["Rename the daemon key to only use letters, numbers, '.', '_' or '-'.","Remove leading/trailing hyphens from the key.","If the name comes from templating or a variable, sanitize it before writing the config."],"exampleFix":"# before (mise.toml)\n[daemons.\"my api\"]\nrun = \"python server.py\"\n\n# after\n[daemons.my_api]\nrun = \"python server.py\"","handlingStrategy":"validation","validationCode":"# shell: validate daemon names in mise.toml before running mise\ngrep -E '^\\[daemons\\.[^]]+\\]' mise.toml | grep -vE '^\\[daemons\\.[A-Za-z0-9_.-]+\\]$' && echo \"invalid daemon name\"","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use snake_case or kebab-case daemon names without spaces or slashes.","Avoid generating daemon keys from arbitrary service labels; sanitize first.","Keep daemon table keys on one line and quoted only when necessary."],"tags":["config","toml","daemons","naming"],"backgroundTag":"invalid-identifier-format","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"}