{"record":{"id":"831447220c863705","repo":"jdx/mise","slug":"brew-cask-invalid-command-wrapper-environment-nam-831447","errorCode":null,"errorMessage":"brew-cask: invalid command_wrapper environment name '{key}'","messagePattern":"brew-cask: invalid command_wrapper environment name '(.+?)'","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/system/packages/brew/cask/artifacts.rs","lineNumber":235,"sourceCode":"    match (content.is_some(), executable.is_some()) {\n        (false, false) => {\n            bail!(\"brew-cask: command_wrapper requires content or executable\")\n        }\n        (true, true) => {\n            bail!(\"brew-cask: command_wrapper requires content or executable, not both\")\n        }\n        _ => {}\n    }\n    let args = string_args(options, \"command_wrapper\")?;\n    let env = options\n        .get(\"env\")\n        .map(|env| {\n            env.as_object()\n                .ok_or_else(|| eyre!(\"brew-cask: command_wrapper env must be an object\"))?\n                .iter()\n                .map(|(key, value)| {\n                    if !is_shell_env_name(key) {\n                        bail!(\"brew-cask: invalid command_wrapper environment name '{key}'\");\n                    }\n                    value\n                        .as_str()\n                        .map(|value| (key.clone(), value.to_string()))\n                        .ok_or_else(|| {\n                            eyre!(\"brew-cask: command_wrapper environment values must be strings\")\n                        })\n                })\n                .collect::<Result<BTreeMap<_, _>>>()\n        })\n        .transpose()?\n        .unwrap_or_default();\n    if content.is_some() && (!args.is_empty() || !env.is_empty()) {\n        bail!(\"brew-cask: command_wrapper args and env require executable\");\n    }\n    Ok(Some(CommandWrapperArtifact {\n        name: name.to_string(),\n        target: artifact_target(value, values),","sourceCodeStart":217,"sourceCodeEnd":253,"githubUrl":"https://github.com/jdx/mise/blob/533346cc374382b41ec5ff70536252b2e96e725c/src/system/packages/brew/cask/artifacts.rs#L217-L253","documentation":"The `env` object of a `command_wrapper` artifact contains a key that is not a valid shell environment-variable name (as checked by `is_shell_env_name`, e.g. disallowing characters like `=` or leading digits). mise refuses to emit an invalid environment assignment into generated wrappers.","triggerScenarios":"A cask command_wrapper with `env` keys like `\"1PATH\"`, `\"MY VAR\"`, `\"FOO=BAR\"`, or empty keys; hand-written or corrupted cask metadata.","commonSituations":"Typoed or copy-pasted env entries in custom taps; attempts to smuggle shell syntax through env names.","solutions":["Rename the env key to a valid shell identifier (`[A-Za-z_][A-Za-z0-9_]*`)","Move values that are not simple assignments out of `env`","Fix or report the cask upstream"],"exampleFix":"// before\nenv: { \"1BAD-VAR\": \"x\" }\n// after\nenv: { \"BAD_VAR\": \"x\" }","handlingStrategy":"validation","validationCode":"const isShellEnvName = (k) => /^[A-Za-z_][A-Za-z0-9_]*$/.test(k);\nObject.keys(envObj).forEach(k => { if (!isShellEnvName(k)) throw new Error(`invalid env name ${k}`); });","typeGuard":"const hasValidEnvNames = (o) => Object.keys(o).every(k => /^[A-Za-z_][A-Za-z0-9_]*$/.test(k));","tryCatchPattern":null,"preventionTips":["Use POSIX identifier rules for env keys","No `=` or spaces in env names","Sanitize generated cask metadata"],"tags":["brew","homebrew-cask","command-wrapper","env","validation"],"backgroundTag":"invalid-env-var-value","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"}