{"record":{"id":"1920b160562b6b8e","repo":"JuliusBrussee/caveman","slug":"unknown-usage-source-s","errorCode":null,"errorMessage":"unknown usage source: %s","messagePattern":"unknown usage source: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"proxy/cmd/caveman-proxy/main.go","lineNumber":620,"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":602,"sourceCodeEnd":638,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/3ee70a102609e550bd2e68004bf5990a9341c851/proxy/cmd/caveman-proxy/main.go#L602-L638","documentation":"Thrown by runUsage's import branch: after the provider positional is present, it must be exactly `codex` or `claude`; the default case rejects anything else with `unknown usage source: <provider>`. The importer only has adapters for those two local session stores.","triggerScenarios":"`caveman-proxy usage import gemini`, `usage import anthropic` (alias not accepted on import), `usage import openai`, or a typo like `usage import codex-cli`.","commonSituations":"Assuming `anthropic` works as an alias for `claude` (it does on `unlink` but not on `import`); trying to import usage for a provider with no importer (gemini/opencode/aider); typos in the provider name.","solutions":["Use `codex` or `claude` exactly: `caveman-proxy usage import claude`.","For `anthropic`, use `claude`; for `openai`, use `codex`.","To link/refresh quota for other providers use the `link` or `refresh` subcommands instead of `import`."],"exampleFix":"// before\ncaveman-proxy usage import anthropic\n// after\ncaveman-proxy usage import claude","handlingStrategy":"validation","validationCode":"// shell\ncase \"$PROVIDER\" in claude|anthropic) PROVIDER=claude;; codex|openai) PROVIDER=codex;; *) echo \"unsupported import source: $PROVIDER\" >&2; exit 2;; esac\ncaveman-proxy usage import \"$PROVIDER\"","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Normalize aliases (anthropic→claude, openai→codex) in wrapper scripts.","Only codex and claude importers exist; route other providers to link/refresh.","Avoid free-form provider variables; hardcode the two valid values."],"tags":["cli","invalid-enum-value","usage-import"],"backgroundTag":"invalid-enum-value","analyzedSha":"3ee70a102609e550bd2e68004bf5990a9341c851","analyzedAt":"2026-09-20T15:53:39.229Z","contentChangedAt":"2026-09-20T15:53:39.229Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}