@@ -6,7 +6,6 @@ import (
66 "io"
77 "log/slog"
88 "os"
9− "strings"
109
1110 tea "github.com/charmbracelet/bubbletea/v2"
1211 "github.com/charmbracelet/crush/internal/app"
@@ -26,7 +25,6 @@ func init() {
2625 rootCmd.Flags().BoolP("help", "h", false, "Help")
2726 rootCmd.Flags().BoolP("yolo", "y", false, "Automatically accept all permissions (dangerous mode)")
2827
29− runCmd.Flags().BoolP("quiet", "q", false, "Hide spinner")
3028 rootCmd.AddCommand(runCmd)
3129}
3230
@@ -81,51 +79,6 @@ crush -y
8179 },
8280}
8381
84−var runCmd = &cobra.Command{
85− Use: "run [prompt...]",
86− Short: "Run a single non-interactive prompt",
87− Long: `Run a single prompt in non-interactive mode and exit.
88−The prompt can be provided as arguments or piped from stdin.`,
89− Example: `
90−# Run a simple prompt
91−crush run Explain the use of context in Go
92−
93−# Pipe input from stdin
94−echo "What is this code doing?" | crush run
95−
96−# Run with quiet mode (no spinner)
97−crush run -q "Generate a README for this project"
98− `,
99− RunE: func(cmd *cobra.Command, args []string) error {
100− quiet, _ := cmd.Flags().GetBool("quiet")
101−
102− app, err := setupApp(cmd)
103− if err != nil {
104− return err
105− }
106− defer app.Shutdown()
107−
108− if !app.Config().IsConfigured() {
109− return fmt.Errorf("no providers configured - please run 'crush' to set up a provider interactively")
110− }
111−
112− prompt := strings.Join(args, " ")
113−
114− prompt, err = maybePrependStdin(prompt)
115− if err != nil {
116− slog.Error("Failed to read from stdin", "error", err)
117− return err
118− }
119−
120− if prompt == "" {
121− return fmt.Errorf("no prompt provided")
122− }
123−
124− // Run non-interactive flow using the App method
125− return app.RunNonInteractive(cmd.Context(), prompt, quiet)
126− },
127−}
128−
12982func Execute() {
13083 if err := fang.Execute(
13184 context.Background(),
@@ -144,7 +97,7 @@ func setupApp(cmd *cobra.Command) (*app.App, error) {
14497 yolo, _ := cmd.Flags().GetBool("yolo")
14598 ctx := cmd.Context()
14699
147− cwd, err := resolveCwd(cmd)
100+ cwd, err := ResolveCwd(cmd)
148101 if err != nil {
149102 return nil, err
150103 }
@@ -174,7 +127,7 @@ func setupApp(cmd *cobra.Command) (*app.App, error) {
174127 return appInstance, nil
175128}
176129
177−func maybePrependStdin(prompt string) (string, error) {
130+func MaybePrependStdin(prompt string) (string, error) {
178131 if term.IsTerminal(os.Stdin.Fd()) {
179132 return prompt, nil
180133 }
@@ -192,7 +145,7 @@ func maybePrependStdin(prompt string) (string, error) {
192145 return string(bts) + "\n\n" + prompt, nil
193146}
194147
195−func resolveCwd(cmd *cobra.Command) (string, error) {
148+func ResolveCwd(cmd *cobra.Command) (string, error) {
196149 cwd, _ := cmd.Flags().GetString("cwd")
197150 if cwd != "" {
198151 err := os.Chdir(cwd)