diff --git a/internal/cmd/root.go b/internal/cmd/root.go index ace464844b8ba599130b9a92a47f5ccbc11b964d..a940382a634bf9f2ffc5f03af49e474a2d19a01b 100644 --- a/internal/cmd/root.go +++ b/internal/cmd/root.go @@ -12,6 +12,7 @@ import ( "github.com/charmbracelet/crush/internal/client" "github.com/charmbracelet/crush/internal/log" "github.com/charmbracelet/crush/internal/proto" + "github.com/charmbracelet/crush/internal/server" "github.com/charmbracelet/crush/internal/tui" "github.com/charmbracelet/crush/internal/version" "github.com/charmbracelet/fang" @@ -19,6 +20,8 @@ import ( "github.com/spf13/cobra" ) +var clientHost string + func init() { rootCmd.PersistentFlags().StringP("cwd", "c", "", "Current working directory") rootCmd.PersistentFlags().StringP("data-dir", "D", "", "Custom crush data directory") @@ -27,6 +30,8 @@ func init() { rootCmd.Flags().BoolP("help", "h", false, "Help") rootCmd.Flags().BoolP("yolo", "y", false, "Automatically accept all permissions (dangerous mode)") + rootCmd.Flags().StringVar(&clientHost, "host", server.DefaultAddr(), "Connect to a specific crush server host (for advanced users)") + rootCmd.AddCommand(runCmd) rootCmd.AddCommand(updateProvidersCmd) } @@ -65,7 +70,10 @@ crush -y return err } - m := tui.New(c) + m, err := tui.New(c) + if err != nil { + return fmt.Errorf("failed to create TUI model: %v", err) + } defer func() { c.DeleteInstance(cmd.Context(), c.ID()) }() @@ -138,12 +146,13 @@ func setupApp(cmd *cobra.Command) (*client.Client, error) { return nil, err } - c, err := client.DefaultClient(cwd) + c, err := client.NewClient(cwd, "unix", clientHost) if err != nil { return nil, err } if _, err := c.CreateInstance(ctx, proto.Instance{ + Path: cwd, DataDir: dataDir, Debug: debug, YOLO: yolo, diff --git a/internal/cmd/run.go b/internal/cmd/run.go index 219239298bfe89cc8085e1021a0d510ad760898c..d50ddef40bc824a3963bac16f4f709f7d579dced 100644 --- a/internal/cmd/run.go +++ b/internal/cmd/run.go @@ -26,13 +26,18 @@ crush run -q "Generate a README for this project" RunE: func(cmd *cobra.Command, args []string) error { quiet, _ := cmd.Flags().GetBool("quiet") - app, err := setupApp(cmd) + c, err := setupApp(cmd) if err != nil { return err } - defer app.Shutdown() + defer func() { c.DeleteInstance(cmd.Context(), c.ID()) }() - if !app.Config().IsConfigured() { + cfg, err := c.GetConfig(cmd.Context()) + if err != nil { + return fmt.Errorf("failed to get config: %v", err) + } + + if !cfg.IsConfigured() { return fmt.Errorf("no providers configured - please run 'crush' to set up a provider interactively") } @@ -49,7 +54,10 @@ crush run -q "Generate a README for this project" } // Run non-interactive flow using the App method - return app.RunNonInteractive(cmd.Context(), prompt, quiet) + // return c.RunNonInteractive(cmd.Context(), prompt, quiet) + // TODO: implement non-interactive run + _ = quiet + return nil }, } diff --git a/internal/cmd/server.go b/internal/cmd/server.go index d540247524e6366fd2c7c90f94655da655a39fe9..afcd2b3eaa2a49fabebc998f2f0e4b4d9d72de94 100644 --- a/internal/cmd/server.go +++ b/internal/cmd/server.go @@ -15,6 +15,8 @@ import ( "github.com/spf13/cobra" ) +var serverHost string + var serverCmd = &cobra.Command{ Use: "server", Short: "Start the Crush server", @@ -41,7 +43,7 @@ var serverCmd = &cobra.Command{ slog.SetLogLoggerLevel(slog.LevelDebug) } - srv := server.NewServer(cfg, "unix", server.DefaultAddr()) + srv := server.NewServer(cfg, "unix", serverHost) srv.SetLogger(slog.Default()) slog.Info("Starting Crush server...", "addr", srv.Addr) @@ -81,5 +83,6 @@ var serverCmd = &cobra.Command{ } func init() { + serverCmd.Flags().StringVar(&serverHost, "host", server.DefaultAddr(), "Server host (TCP or Unix socket)") rootCmd.AddCommand(serverCmd) }