{"record":{"id":"b1d703326acbc272","repo":"aaif-goose/goose","slug":"invalid-parameter-format-expected-format-k","errorCode":null,"errorMessage":"Invalid parameter format: '{}'. Expected format: key=value","messagePattern":"Invalid parameter format: '(.+?)'\\. Expected format: key=value","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/goose-cli/src/commands/recipe.rs","lineNumber":158,"sourceCode":"                            println!(\"    Title: {}\", title);\n                        }\n                        println!(\"    Path: {}\", recipe.path);\n                    } else {\n                        println!(\"{}\", output);\n                    }\n                }\n            }\n        }\n    }\n    Ok(())\n}\n\nfn parse_params(params: &[String]) -> Result<HashMap<String, String>> {\n    let mut params_map = HashMap::new();\n    for param in params {\n        let parts: Vec<&str> = param.splitn(2, '=').collect();\n        if parts.len() != 2 {\n            return Err(anyhow::anyhow!(\n                \"Invalid parameter format: '{}'. Expected format: key=value\",\n                param\n            ));\n        }\n        params_map.insert(parts[0].to_string(), parts[1].to_string());\n    }\n    Ok(params_map)\n}\n\nfn generate_deeplink(\n    recipe_name: &str,\n    params: HashMap<String, String>,\n) -> Result<(String, goose::recipe::Recipe)> {\n    let recipe_file = load_recipe_file(recipe_name)?;\n    // Load the recipe file first to validate it\n    let recipe = validate_recipe_template_from_file(&recipe_file)?;\n    match recipe_deeplink::encode(&recipe) {\n        Ok(encoded) => {","sourceCodeStart":140,"sourceCodeEnd":176,"githubUrl":"https://github.com/aaif-goose/goose/blob/3810898a7447ec3299be72e223d3570a7aabf0ab/crates/goose-cli/src/commands/recipe.rs#L140-L176","documentation":"Deeplink parameters are parsed by splitting each CLI argument at the first '=' (splitn(2, '=')). An argument containing no '=' cannot form a key/value pair and is rejected immediately with this message before any recipe is loaded.","triggerScenarios":"Passing a bare token to a recipe deeplink/open command, e.g. `goose recipe deeplink myrecipe verbose` instead of `verbose=true`; shell quoting mistakes that detach the key from the value.","commonSituations":"Scripts interpolating unset variables so only the key reaches argv; copy-pasted commands missing the '=value' side; assuming space-separated flags work like other CLIs.","solutions":["Pass every parameter as key=value","Quote the whole pair as one shell word: \"model=gpt-4o\"","Remember values may themselves contain '=' (only the first '=' splits) — only the key side is constrained"],"exampleFix":"# before\ngoose recipe deeplink code-reviewer verbose\n\n# after\ngoose recipe deeplink code-reviewer verbose=true","handlingStrategy":"validation","validationCode":"# Reject malformed params before calling goose\nfor p in \"$@\"; do\n  [[ \"$p\" == *=* ]] || { echo \"param '$p' must be key=value\" >&2; exit 2; }\ndone","typeGuard":"fn is_key_value(s: &str) -> bool {\n    match s.split_once('=') {\n        Some((key, _)) => !key.is_empty(),\n        None => false,\n    }\n}","tryCatchPattern":null,"preventionTips":["Quote each parameter pair as a single shell word","Validate args in wrapper scripts before delegating to goose","Remember values may contain '='; only the key side is constrained"],"tags":["recipe","deeplink","input-validation","cli"],"backgroundTag":null,"analyzedSha":"3810898a7447ec3299be72e223d3570a7aabf0ab","analyzedAt":"2026-08-16T10:14:26.282Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}