@@ -18,11 +18,13 @@ import (
18 "github.com/charmbracelet/crush/internal/config"
18 "github.com/charmbracelet/crush/internal/config"
19 "github.com/charmbracelet/crush/internal/db"
19 "github.com/charmbracelet/crush/internal/db"
20 "github.com/charmbracelet/crush/internal/event"
20 "github.com/charmbracelet/crush/internal/event"
21+ termutil "github.com/charmbracelet/crush/internal/term"
21 "github.com/charmbracelet/crush/internal/tui"
22 "github.com/charmbracelet/crush/internal/tui"
22 "github.com/charmbracelet/crush/internal/version"
23 "github.com/charmbracelet/crush/internal/version"
23 "github.com/charmbracelet/fang"
24 "github.com/charmbracelet/fang"
24 "github.com/charmbracelet/lipgloss/v2"
25 "github.com/charmbracelet/lipgloss/v2"
25 uv "github.com/charmbracelet/ultraviolet"
26 uv "github.com/charmbracelet/ultraviolet"
27+ "github.com/charmbracelet/x/ansi"
26 "github.com/charmbracelet/x/exp/charmtone"
28 "github.com/charmbracelet/x/exp/charmtone"
27 "github.com/charmbracelet/x/term"
29 "github.com/charmbracelet/x/term"
28 "github.com/spf13/cobra"
30 "github.com/spf13/cobra"
@@ -32,7 +34,6 @@ func init() {
32 rootCmd.PersistentFlags().StringP("cwd", "c", "", "Current working directory")
34 rootCmd.PersistentFlags().StringP("cwd", "c", "", "Current working directory")
33 rootCmd.PersistentFlags().StringP("data-dir", "D", "", "Custom crush data directory")
35 rootCmd.PersistentFlags().StringP("data-dir", "D", "", "Custom crush data directory")
34 rootCmd.PersistentFlags().BoolP("debug", "d", false, "Debug")
36 rootCmd.PersistentFlags().BoolP("debug", "d", false, "Debug")
36 rootCmd.Flags().BoolP("help", "h", false, "Help")
37 rootCmd.Flags().BoolP("help", "h", false, "Help")
37 rootCmd.Flags().BoolP("yolo", "y", false, "Automatically accept all permissions (dangerous mode)")
38 rootCmd.Flags().BoolP("yolo", "y", false, "Automatically accept all permissions (dangerous mode)")
@@ -74,7 +75,7 @@ crush run "Explain the use of context in Go"
76 RunE: func(cmd *cobra.Command, args []string) error {
77 RunE: func(cmd *cobra.Command, args []string) error {
77− app, err := setupApp(cmd)
78+ app, err := setupAppWithProgressBar(cmd)
78 if err != nil {
79 if err != nil {
79 return err
80 return err
@@ -92,7 +93,6 @@ crush -y
92 tea.WithEnvironment(env),
93 tea.WithEnvironment(env),
93 tea.WithContext(cmd.Context()),
94 tea.WithContext(cmd.Context()),
94 tea.WithFilter(tui.MouseEventFilter)) // Filter mouse events based on focus state
95 tea.WithFilter(tui.MouseEventFilter)) // Filter mouse events based on focus state
96 go app.Subscribe(program)
96 go app.Subscribe(program)
98 if _, err := program.Run(); err != nil {
98 if _, err := program.Run(); err != nil {
@@ -150,6 +150,15 @@ func Execute() {
153+func setupAppWithProgressBar(cmd *cobra.Command) (*app.App, error) {
154+ if termutil.SupportsProgressBar() {
155+ _, _ = fmt.Fprintf(os.Stderr, ansi.SetIndeterminateProgressBar)
156+ defer func() { _, _ = fmt.Fprintf(os.Stderr, ansi.ResetProgressBar) }()
159+ return setupApp(cmd)
153// setupApp handles the common setup logic for both interactive and non-interactive modes.
162// setupApp handles the common setup logic for both interactive and non-interactive modes.
154// It returns the app instance, config, cleanup function, and any error.
163// It returns the app instance, config, cleanup function, and any error.
155func setupApp(cmd *cobra.Command) (*app.App, error) {
164func setupApp(cmd *cobra.Command) (*app.App, error) {