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

  1. Use exactly codex or claude (lowercase) for import
  2. If you meant linking/unlinking aliases, those live under the link/unlink subcommands
  3. 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

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


AI-assisted analysis of JuliusBrussee/caveman@27d5a3981a (2026-08-15). Data as JSON: /api/errors/1920b160562b6b8e. Report an issue: GitHub.