{"record":{"id":"402fdfa93990ac33","repo":"jdx/mise","slug":"brew-cask-command-wrapper-has-unsupported-option","errorCode":null,"errorMessage":"brew-cask: command_wrapper has unsupported option {}","messagePattern":"brew-cask: command_wrapper has unsupported option (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/system/packages/brew/cask.rs","lineNumber":5138,"sourceCode":"        .ok_or_else(|| eyre!(\"brew-cask: command_wrapper requires a command name\"))?;\n    let name_path = Path::new(name);\n    if name_path.file_name().and_then(|name| name.to_str()) != Some(name)\n        || matches!(name, \".\" | \"..\")\n    {\n        bail!(\"brew-cask: command_wrapper requires a command name without path components\");\n    }\n    let options = values\n        .get(1)\n        .and_then(Value::as_object)\n        .ok_or_else(|| eyre!(\"brew-cask: command_wrapper requires options\"))?;\n    let mut unsupported = options\n        .keys()\n        .filter(|key| !matches!(key.as_str(), \"content\" | \"executable\" | \"args\" | \"env\"))\n        .cloned()\n        .collect::<Vec<_>>();\n    unsupported.sort();\n    if !unsupported.is_empty() {\n        bail!(\n            \"brew-cask: command_wrapper has unsupported option {}\",\n            unsupported.join(\", \")\n        );\n    }\n    let content = options\n        .get(\"content\")\n        .and_then(Value::as_str)\n        .map(str::to_string);\n    let executable = options\n        .get(\"executable\")\n        .and_then(Value::as_str)\n        .map(str::to_string);\n    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\")","sourceCodeStart":5120,"sourceCodeEnd":5156,"githubUrl":"https://github.com/jdx/mise/blob/6f52dcdf99e282ef7a7db68c81301fa4618d0f79/src/system/packages/brew/cask.rs#L5120-L5156","documentation":"The options object of a command_wrapper artifact accepts exactly four keys: content, executable, args, env. mise collects any other keys, sorts them, and bails listing them, so schema drift or typos fail loudly instead of being silently ignored. The whitelist check runs before any option is read.","triggerScenarios":"A wrapper options object containing keys like 'dir', 'link', 'description', 'working_dir', or a key from a newer metadata schema — anything outside {content, executable, args, env} at src/system/packages/brew/cask.rs:5138.","commonSituations":"Typos ('envs' for 'env', 'arguments' for 'args'); metadata written for a different tool's wrapper schema; newer metadata revisions adding options this mise version does not know.","solutions":["Remove or rename the listed unsupported keys to the four accepted ones (content, executable, args, env).","Update mise in case a newer release understands the option.","If generating metadata programmatically, validate keys against the whitelist before emitting."],"exampleFix":"# before\ncommand_wrapper: [[\"tool\", {\"executable\": \"bin/tool\", \"arguments\": [\"--fast\"]}]]\n\n# after\ncommand_wrapper: [[\"tool\", {\"executable\": \"bin/tool\", \"args\": [\"--fast\"]}]]","handlingStrategy":"type-guard","validationCode":"const KNOWN = new Set([\"content\",\"executable\",\"args\",\"env\"]);\nfunction validWrapperOptions(o) { return Object.keys(o).every(k => KNOWN.has(k)); }","typeGuard":"const KNOWN_KEYS = new Set([\"content\", \"executable\", \"args\", \"env\"]);\nfunction hasOnlyKnownWrapperKeys(options) {\n  return Object.keys(options ?? {}).every(k => KNOWN_KEYS.has(k));\n}","tryCatchPattern":null,"preventionTips":["Validate wrapper option keys against {content, executable, args, env} in your generator.","Run mise's latest release before assuming a new option is supported.","Watch for near-miss typos: 'arguments', 'envs', 'cmd'."],"tags":["brew-cask","command-wrapper","schema-validation","mise"],"backgroundTag":"unsupported-config-option","analyzedSha":"6f52dcdf99e282ef7a7db68c81301fa4618d0f79","analyzedAt":"2026-08-22T10:14:23.840Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}