charmbracelet/crush · error

failed to get data directory: %v

Error message

failed to get data directory: %v

What it means

The `crush server` command reads its --data-dir flag via cmd.Flags().GetString. This error wraps any failure of that lookup, which only happens if the flag was not registered (or registered with the wrong type) on the command — a wiring bug, not a user input problem.

Source

Thrown at internal/cmd/server.go:33

	"github.com/charmbracelet/crush/internal/server"
	"github.com/charmbracelet/x/term"
	"github.com/spf13/cobra"
)

var serverHost string

func init() {
	serverCmd.Flags().StringVarP(&serverHost, "host", "H", server.DefaultHost(), "Server host (TCP or Unix socket)")
	rootCmd.AddCommand(serverCmd)
}

var serverCmd = &cobra.Command{
	Use:   "server",
	Short: "Start the Crush server",
	RunE: func(cmd *cobra.Command, _ []string) error {
		dataDir, err := cmd.Flags().GetString("data-dir")
		if err != nil {
			return fmt.Errorf("failed to get data directory: %v", err)
		}
		debug, err := cmd.Flags().GetBool("debug")
		if err != nil {
			return fmt.Errorf("failed to get debug flag: %v", err)
		}

		cfg, err := config.Load(config.GlobalWorkspaceDir(), dataDir, debug)
		if err != nil {
			return fmt.Errorf("failed to load configuration: %v", err)
		}

		hostURL, err := server.ParseHostURL(serverHost)
		if err != nil {
			return fmt.Errorf("invalid server host: %v", err)
		}

		logFile := filepath.Join(config.GlobalCacheDir(), "server-"+safeHostName(hostURL), "crush.log")

View on GitHub (pinned to 7944b8e522)

Solutions

  1. Install an official, unmodified release of Crush; a stock binary always registers --data-dir.
  2. If building from source, check the serverCmd flag registration in internal/cmd/server.go is intact (flags.String("data-dir", ...)).
  3. If invoking RunE programmatically, define the flag on the command first via serverCmd.Flags().String(...).

Example fix

// before
// flag never registered
serverCmd.RunE(cmd, args)
// after
serverCmd.Flags().String("data-dir", "", "data directory")
serverCmd.RunE(cmd, args)
Defensive patterns

Strategy: validation

Validate before calling

if serverCmd.Flags().Lookup("data-dir") == nil {
    return fmt.Errorf("data-dir flag not registered on this build")
}

Type guard

func hasFlag(cmd *cobra.Command, name string) bool { return cmd.Flags().Lookup(name) != nil }

Try / catch

if err := serverCmd.RunE(serverCmd, args); err != nil {
    if strings.HasPrefix(err.Error(), "failed to get data directory") {
        return fmt.Errorf("binary is missing the data-dir flag; use an official build")
    }
    return err
}

Prevention

When it happens

Trigger: Running `crush server` with a binary where the `data-dir` flag registration was removed/renamed in init(), or invoking the RunE logic on a different command that lacks the flag.

Common situations: Custom builds or forks with modified flag setup; calling serverCmd's RunE from tests or other commands without the flag bound; mix-and-match binary/plugin versions.

Related errors


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