{"record":{"id":"9703853e6a0dc183","repo":"charmbracelet/crush","slug":"s-s-requires-a-key-and-value","errorCode":null,"errorMessage":"%s: --%s requires a key and value","messagePattern":"(.+?): --(.+?) requires a key and value","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/shellconfig/flags.go","lineNumber":151,"sourceCode":"\t\tif err != nil {\n\t\t\treturn nil, 0, fmt.Errorf(\"%s: --%s expects an integer, got %q\", args[0], name, v)\n\t\t}\n\t\treturn n, i + 2, nil\n\n\tcase flagFloat:\n\t\tv, err := nextArg(args, i, name)\n\t\tif err != nil {\n\t\t\treturn nil, 0, err\n\t\t}\n\t\tf, err := strconv.ParseFloat(v, 64)\n\t\tif err != nil {\n\t\t\treturn nil, 0, fmt.Errorf(\"%s: --%s expects a number, got %q\", args[0], name, v)\n\t\t}\n\t\treturn f, i + 2, nil\n\n\tcase flagKeyValue:\n\t\tif i+2 >= len(args) {\n\t\t\treturn nil, 0, fmt.Errorf(\"%s: --%s requires a key and value\", args[0], name)\n\t\t}\n\t\treturn [2]string{args[i+1], args[i+2]}, i + 3, nil\n\n\tcase flagJSONObject:\n\t\tv, err := nextArg(args, i, name)\n\t\tif err != nil {\n\t\t\treturn nil, 0, err\n\t\t}\n\t\tvar object map[string]any\n\t\tif err := json.Unmarshal([]byte(v), &object); err != nil || object == nil {\n\t\t\treturn nil, 0, fmt.Errorf(\"%s: --%s expects a JSON object, got %q\", args[0], name, v)\n\t\t}\n\t\treturn object, i + 2, nil\n\n\tcase flagJSONAny:\n\t\tv, err := nextArg(args, i, name)\n\t\tif err != nil {\n\t\t\treturn nil, 0, err","sourceCodeStart":133,"sourceCodeEnd":169,"githubUrl":"https://github.com/charmbracelet/crush/blob/7944b8e52225d8805e31eacbf7ef24856b0dfb7a/internal/shellconfig/flags.go#L133-L169","documentation":"This error is thrown by parseFlagValue in internal/shellconfig/flags.go when a flag declared with kind flagKeyValue (which consumes exactly two arguments, KEY VALUE, e.g. --env NAME VALUE) does not have both arguments available. The bounds check `i+2 >= len(args)` fails, meaning only the flag itself, or the flag plus a key but no value, was supplied on the command line. applyFlags surfaces it as a usage error naming the invoking builtin command.","triggerScenarios":"Running a shell-config builtin (via applyFlags) with a flagKeyValue flag like --env given only the flag name (`--env` alone), or with a key but no value (`--env FOO`), or with the value accidentally consumed by shell quoting/expansion so only one trailing arg remains.","commonSituations":"Typing `provider add ... --env API_KEY` and forgetting the secret value; a shell variable like `--env FOO $BAR` expanding to empty so $BAR disappears; pasting an example and dropping the second token; using `=` syntax (`--env FOO=bar`) which this parser does not support, leaving only one arg.","solutions":["Supply both a key and a value as two separate arguments: `--env FOO bar`.","Check that any shell variables used for the value are non-empty (`echo \"$BAR\"`) and quote them.","Do not use `=` syntax for key/value flags; pass key and value as separate tokens.","Run the builtin's help/usage to confirm which flags require KEY VALUE pairs."],"exampleFix":"// before\ncrushrc provider add anthropic --env ANTHROPIC_API_KEY\n// after\ncrushrc provider add anthropic --env ANTHROPIC_API_KEY sk-ant-...","handlingStrategy":"validation","validationCode":"# POSIX shell guard before invoking a key/value flag\n[ $# -ge 2 ] || { echo \"--env requires KEY and VALUE\" >&2; exit 2; }\n# verify expansion non-empty\n: \"${VALUE:?--env value is empty}\"","typeGuard":"func hasKeyValueArgs(args []string, i int) bool { return i+2 < len(args) }","tryCatchPattern":"if err := applyFlags(specs, args, start, target, cmd, stderr); err != nil {\n    if strings.Contains(err.Error(), \"requires a key and value\") {\n        fmt.Fprintln(stderr, \"Usage: --env KEY VALUE (two separate arguments)\")\n    }\n    return err\n}","preventionTips":["Always pass key and value as two separate tokens, never KEY=VALUE.","Quote variable expansions and use ${VAR:?} to fail fast on empty values.","Count trailing arguments in wrapper scripts before dispatching to the builtin.","Read the builtin's usage text to confirm which flags are KEY VALUE pairs."],"tags":["cli","argument-parsing","shell-config","missing-argument"],"backgroundTag":"missing-flag-value","analyzedSha":"7944b8e52225d8805e31eacbf7ef24856b0dfb7a","analyzedAt":"2026-08-29T12:48:59.079Z","schemaVersion":2},"datasetVersion":"2026-08-29T17:17:51.833Z"}