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
- Install an official, unmodified release of Crush; a stock binary always registers --data-dir.
- If building from source, check the serverCmd flag registration in internal/cmd/server.go is intact (flags.String("data-dir", ...)).
- 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
- Use official Crush binaries or verify flag registration survives your forks.
- Add a smoke test that executes serverCmd with a flag set.
- Never call a command's RunE from code without registering its flags first.
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
- failed to get current working directory: %v
- failed to get data directory: %v
- failed to get follow flag: %v
- failed to get tail flag: %v
- failed to get debug flag: %v
AI-assisted analysis of charmbracelet/crush@7944b8e522 (2026-08-29).
Data as JSON: /api/errors/b96491d3d4a9f42e.
Report an issue: GitHub.