charmbracelet/crush · error

invalid source %q, must be 'catwalk' or 'hyper'

Error message

invalid source %q, must be 'catwalk' or 'hyper'

What it means

The `crush update-providers` command validates the --source flag against a closed set: only "catwalk" or "hyper" are accepted (each dispatching to a different config updater). Any other value is rejected with this error before any network call is made. It is a pure flag-validation error, not a fetch failure.

Source

Thrown at internal/cmd/update_providers.go:54

crush update-providers --source=hyper https://hyper.example.com
`,
	RunE: func(cmd *cobra.Command, args []string) error {
		// NOTE(@andreynering): We want to skip logging output do stdout here.
		slog.SetDefault(slog.New(slog.DiscardHandler))

		var pathOrURL string
		if len(args) > 0 {
			pathOrURL = args[0]
		}

		var err error
		switch updateProvidersSource {
		case "catwalk":
			err = config.UpdateProviders(pathOrURL)
		case "hyper":
			err = config.UpdateHyper(pathOrURL)
		default:
			return fmt.Errorf("invalid source %q, must be 'catwalk' or 'hyper'", updateProvidersSource)
		}

		if err != nil {
			return err
		}

		// NOTE(@andreynering): This style is more-or-less copied from Fang's
		// error message, adapted for success.
		headerStyle := lipgloss.NewStyle().
			Foreground(charmtone.Butter).
			Background(charmtone.Guac).
			Bold(true).
			Padding(0, 1).
			Margin(1).
			MarginLeft(2).
			SetString("SUCCESS")
		textStyle := lipgloss.NewStyle().
			MarginLeft(2).

View on GitHub (pinned to 7944b8e522)

Solutions

  1. Use exactly `--source catwalk` (default provider catalog) or `--source hyper`.
  2. Check spelling and case — the match is exact and case-sensitive.
  3. Run `crush update-providers --help` to see the accepted values.

Example fix

// before
crush update-providers --source Catwalk --url ./providers.json
// after
crush update-providers --source catwalk --url ./providers.json
Defensive patterns

Strategy: validation

Validate before calling

# shell check before invoking
source="catwalk"
case "$source" in catwalk|hyper) ;; *) echo "invalid --source: $source"; exit 1 ;; esac
crush update-providers --source "$source" --url "$url"

Prevention

When it happens

Trigger: Running `crush update-providers` with --source set to anything other than catwalk or hyper — e.g. a typo (`catwalks`), different casing (`Catwalk`), or an empty value if the flag is passed without one.

Common situations: Misspelling or miscapitalizing the source name; copy-pasting an example that used a different source name; forgetting that hyper is a separate source.

Related errors


AI-assisted analysis of charmbracelet/crush@7944b8e522 (2026-08-29). Data as JSON: /api/errors/2db087028dfb4cf3. Report an issue: GitHub.