{"record":{"id":"1920b160562b6b8e","repo":"JuliusBrussee/caveman","slug":"unknown-usage-source-s","errorCode":null,"errorMessage":"unknown usage source: %s","messagePattern":"unknown usage source: (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"proxy/cmd/caveman-proxy/main.go","lineNumber":498,"sourceCode":"\t\t\tfatalJSON(logger, fmt.Errorf(\"usage: caveman-proxy usage import codex|claude\"))\n\t\t}\n\t\tpath := argFlag(args, \"--path\", \"\")\n\t\tsince := argFlag(args, \"--since\", \"\")\n\t\tswitch provider {\n\t\tcase \"codex\":\n\t\t\tout, err := spend.ImportCodex(path, since)\n\t\t\tif err != nil {\n\t\t\t\tfatalJSON(logger, err)\n\t\t\t}\n\t\t\tprintJSON(out)\n\t\tcase \"claude\":\n\t\t\tout, err := spend.ImportClaude(path, since)\n\t\t\tif err != nil {\n\t\t\t\tfatalJSON(logger, err)\n\t\t\t}\n\t\t\tprintJSON(out)\n\t\tdefault:\n\t\t\tfatalJSON(logger, fmt.Errorf(\"unknown usage source: %s\", provider))\n\t\t}\n\tcase \"link\", \"refresh\":\n\t\tswitch provider {\n\t\tcase \"\", \"claude\":\n\t\t\tout, err := spend.RefreshClaudeUsageFromEnv()\n\t\t\tif err != nil {\n\t\t\t\tfatalJSON(logger, err)\n\t\t\t}\n\t\t\tprintJSON(out)\n\t\tcase \"codex\":\n\t\t\tout, err := spend.ImportCodex(argFlag(args, \"--path\", \"\"), argFlag(args, \"--since\", \"\"))\n\t\t\tif err != nil {\n\t\t\t\tfatalJSON(logger, err)\n\t\t\t}\n\t\t\tprintJSON(out)\n\t\tdefault:\n\t\t\tfatalJSON(logger, fmt.Errorf(\"unknown usage link source: %s\", provider))\n\t\t}","sourceCodeStart":480,"sourceCodeEnd":516,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/27d5a3981a347890211bb1bf2439e5c821a63bc9/proxy/cmd/caveman-proxy/main.go#L480-L516","documentation":"Inside `usage import`, the provider positional matched neither \"codex\" nor \"claude\", so the switch fell to default and the process exited 1 with the offending value echoed back. This is strict provider validation: no fuzzy matching, no silent default provider.","triggerScenarios":"Typos or alternative names: `usage import Claude` (case), `usage import anthropic`, `usage import openai`. The import path only accepts the two canonical provider keys, unlike link/unlink which accept aliases.","commonSituations":"Users assuming alias names accepted elsewhere (anthropic/openai work for unlink but not import); renamed providers in wrappers; case differences from templated scripts.","solutions":["Use exactly codex or claude (lowercase) for import","If you meant linking/unlinking aliases, those live under the link/unlink subcommands","Normalize provider strings in your wrapper: lowercase and map aliases before calling the CLI"],"exampleFix":"# before\ncaveman-proxy usage import anthropic\n\n# after\ncaveman-proxy usage import claude","handlingStrategy":"validation","validationCode":"case \"$PROVIDER\" in codex|claude) caveman-proxy usage import \"$PROVIDER\";; *) echo \"unsupported provider: $PROVIDER\" >&2;; esac","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Import accepts only canonical lowercase codex/claude — aliases like anthropic/openai are for unlink only","Lowercase and normalize provider strings in wrappers","Keep a single provider-name mapping in your tooling, not ad-hoc strings"],"tags":["cli","usage-error","provider-validation","exit-1"],"backgroundTag":null,"analyzedSha":"27d5a3981a347890211bb1bf2439e5c821a63bc9","analyzedAt":"2026-08-15T09:26:11.751Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}