JuliusBrussee/caveman · error
unknown usage source: %s
Error message
unknown usage source: %s
What it means
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.
Source
Thrown at proxy/cmd/caveman-proxy/main.go:498
fatalJSON(logger, fmt.Errorf("usage: caveman-proxy usage import codex|claude"))
}
path := argFlag(args, "--path", "")
since := argFlag(args, "--since", "")
switch provider {
case "codex":
out, err := spend.ImportCodex(path, since)
if err != nil {
fatalJSON(logger, err)
}
printJSON(out)
case "claude":
out, err := spend.ImportClaude(path, since)
if err != nil {
fatalJSON(logger, err)
}
printJSON(out)
default:
fatalJSON(logger, fmt.Errorf("unknown usage source: %s", provider))
}
case "link", "refresh":
switch provider {
case "", "claude":
out, err := spend.RefreshClaudeUsageFromEnv()
if err != nil {
fatalJSON(logger, err)
}
printJSON(out)
case "codex":
out, err := spend.ImportCodex(argFlag(args, "--path", ""), argFlag(args, "--since", ""))
if err != nil {
fatalJSON(logger, err)
}
printJSON(out)
default:
fatalJSON(logger, fmt.Errorf("unknown usage link source: %s", provider))
}View on GitHub (pinned to 27d5a3981a)
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
Example fix
# before caveman-proxy usage import anthropic # after caveman-proxy usage import claude
Defensive patterns
Strategy: validation
Validate before calling
case "$PROVIDER" in codex|claude) caveman-proxy usage import "$PROVIDER";; *) echo "unsupported provider: $PROVIDER" >&2;; esac
Prevention
- 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
When it happens
Trigger: 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.
Common situations: Users assuming alias names accepted elsewhere (anthropic/openai work for unlink but not import); renamed providers in wrappers; case differences from templated scripts.
Related errors
- unknown usage link source: %s
- usage unlink needs claude|codex
- usage: caveman-proxy trial promote <optimizer_id> --trial-id
- unknown trial subcommand: %s
- usage: caveman-proxy usage import|link|refresh|unlink <provi
AI-assisted analysis of JuliusBrussee/caveman@27d5a3981a (2026-08-15).
Data as JSON: /api/errors/1920b160562b6b8e.
Report an issue: GitHub.