{"record":{"id":"9977f219c47f5916","repo":"jdx/mise","slug":"trimprefix-requires-exactly-2-arguments","errorCode":null,"errorMessage":"trimPrefix requires exactly 2 arguments","messagePattern":"trimPrefix requires exactly 2 arguments","errorType":"validation","errorClass":"eyre::Report","httpStatus":null,"severity":"error","filePath":"crates/aqua-registry/src/template.rs","lineNumber":367,"sourceCode":"    registry.insert(\"title\", |args| {\n        if args.len() != 1 {\n            bail!(\"title requires exactly 1 argument\");\n        }\n        Ok(Box::new(StringValue(args[0].as_string().to_title_case())) as Box<dyn Value>)\n    });\n\n    registry.insert(\"trimV\", |args| {\n        if args.len() != 1 {\n            bail!(\"trimV requires exactly 1 argument\");\n        }\n        Ok(Box::new(StringValue(\n            args[0].as_string().trim_start_matches('v').to_string(),\n        )) as Box<dyn Value>)\n    });\n\n    registry.insert(\"trimPrefix\", |args| {\n        if args.len() != 2 {\n            bail!(\"trimPrefix requires exactly 2 arguments\");\n        }\n        let prefix = args[0].as_string();\n        let text = args[1].as_string();\n        Ok(Box::new(StringValue(\n            text.strip_prefix(&prefix).unwrap_or(&text).to_string(),\n        )) as Box<dyn Value>)\n    });\n\n    registry.insert(\"trimSuffix\", |args| {\n        if args.len() != 2 {\n            bail!(\"trimSuffix requires exactly 2 arguments\");\n        }\n        let suffix = args[0].as_string();\n        let text = args[1].as_string();\n        Ok(Box::new(StringValue(\n            text.strip_suffix(&suffix).unwrap_or(&text).to_string(),\n        )) as Box<dyn Value>)\n    });","sourceCodeStart":349,"sourceCodeEnd":385,"githubUrl":"https://github.com/jdx/mise/blob/9dcfcaa0dc8747a2577d3270b69bb9d8313b2807/crates/aqua-registry/src/template.rs#L349-L385","documentation":"Each key of a command_wrapper 'env' mapping is validated by is_shell_env_name: it must start with an ASCII letter or underscore, and every following character must be ASCII alphanumeric or underscore (classic shell identifier rules). Keys like 'FOO-BAR', '1FOO', '' or 'FOO.BAR' are rejected.","triggerScenarios":"env mappings with hyphenated, dotted, digit-leading, empty, or non-ASCII keys in command_wrapper metadata.","commonSituations":"Copying env names from YAML configs where dashes are legal; prefixed variables like 'tool.VERSION'; Unicode key names from generated JSON.","solutions":["Rename the env key to match [_A-Za-z][_A-Za-z0-9]* (e.g. FOO_BAR instead of FOO-BAR)","If the wrapped tool truly requires a weird env name, set it inside the 'content' script instead of the env map"],"exampleFix":"# before\n{\"command_wrapper\": [\"tool\", {\"executable\": \"bin/tool\", \"env\": {\"my-tool-mode\": \"1\"}}]}\n# after\n{\"command_wrapper\": [\"tool\", {\"executable\": \"bin/tool\", \"env\": {\"MY_TOOL_MODE\": \"1\"}}]}","handlingStrategy":"validation","validationCode":"fn is_shell_env_name(v: &str) -> bool {\n    let mut cs = v.chars();\n    cs.next().is_some_and(|c| c == '_' || c.is_ascii_alphabetic())\n        && cs.all(|c| c == '_' || c.is_ascii_alphanumeric())\n}\n// pre-check every env key before install\nassert!(env.keys().all(|k| is_shell_env_name(k)));","typeGuard":"fn is_shell_env_name(v: &str) -> bool {\n    let mut cs = v.chars();\n    cs.next().is_some_and(|c| c == '_' || c.is_ascii_alphabetic())\n        && cs.all(|c| c == '_' || c.is_ascii_alphanumeric())\n}","tryCatchPattern":null,"preventionTips":["Use UPPER_SNAKE_CASE names for wrapper env keys","Put non-identifier env names inside the content script, not the env map"],"tags":["rust","mise","brew-cask","command-wrapper","env-vars","validation"],"backgroundTag":"invalid-env-var-name","analyzedSha":"9dcfcaa0dc8747a2577d3270b69bb9d8313b2807","analyzedAt":"2026-08-17T14:28:50.624Z","schemaVersion":2},"datasetVersion":"2026-08-21T13:17:26.733Z"}