@@ -6,7 +6,6 @@ import (
11 tea "github.com/charmbracelet/bubbletea/v2"
10 tea "github.com/charmbracelet/bubbletea/v2"
12 "github.com/charmbracelet/crush/internal/app"
11 "github.com/charmbracelet/crush/internal/app"
@@ -26,7 +25,6 @@ func init() {
26 rootCmd.Flags().BoolP("help", "h", false, "Help")
25 rootCmd.Flags().BoolP("help", "h", false, "Help")
27 rootCmd.Flags().BoolP("yolo", "y", false, "Automatically accept all permissions (dangerous mode)")
26 rootCmd.Flags().BoolP("yolo", "y", false, "Automatically accept all permissions (dangerous mode)")
29− runCmd.Flags().BoolP("quiet", "q", false, "Hide spinner")
30 rootCmd.AddCommand(runCmd)
28 rootCmd.AddCommand(runCmd)
@@ -81,51 +79,6 @@ crush -y
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.`,
91−crush run Explain the use of context in Go
93−# Pipe input from stdin
94−echo "What is this code doing?" | crush run
96−# Run with quiet mode (no spinner)
97−crush run -q "Generate a README for this project"
99− RunE: func(cmd *cobra.Command, args []string) error {
100− quiet, _ := cmd.Flags().GetBool("quiet")
102− app, err := setupApp(cmd)
106− defer app.Shutdown()
108− if !app.Config().IsConfigured() {
109− return fmt.Errorf("no providers configured - please run 'crush' to set up a provider interactively")
112− prompt := strings.Join(args, " ")
114− prompt, err = maybePrependStdin(prompt)
116− slog.Error("Failed to read from stdin", "error", err)
121− return fmt.Errorf("no prompt provided")
124− // Run non-interactive flow using the App method
125− return app.RunNonInteractive(cmd.Context(), prompt, quiet)
129func Execute() {
82func Execute() {
130 if err := fang.Execute(
83 if err := fang.Execute(
131 context.Background(),
84 context.Background(),
@@ -144,7 +97,7 @@ func setupApp(cmd *cobra.Command) (*app.App, error) {
144 yolo, _ := cmd.Flags().GetBool("yolo")
97 yolo, _ := cmd.Flags().GetBool("yolo")
145 ctx := cmd.Context()
98 ctx := cmd.Context()
147− cwd, err := resolveCwd(cmd)
100+ cwd, err := ResolveCwd(cmd)
148 if err != nil {
101 if err != nil {
149 return nil, err
102 return nil, err
@@ -174,7 +127,7 @@ func setupApp(cmd *cobra.Command) (*app.App, error) {
174 return appInstance, nil
127 return appInstance, nil
177−func maybePrependStdin(prompt string) (string, error) {
130+func MaybePrependStdin(prompt string) (string, error) {
178 if term.IsTerminal(os.Stdin.Fd()) {
131 if term.IsTerminal(os.Stdin.Fd()) {
179 return prompt, nil
132 return prompt, nil
@@ -192,7 +145,7 @@ func maybePrependStdin(prompt string) (string, error) {
192 return string(bts) + "\n\n" + prompt, nil
145 return string(bts) + "\n\n" + prompt, nil
195−func resolveCwd(cmd *cobra.Command) (string, error) {
148+func ResolveCwd(cmd *cobra.Command) (string, error) {
196 cwd, _ := cmd.Flags().GetString("cwd")
149 cwd, _ := cmd.Flags().GetString("cwd")
197 if cwd != "" {
150 if cwd != "" {
198 err := os.Chdir(cwd)
151 err := os.Chdir(cwd)