package main import ( "context" "fmt" "os" "os/signal" "syscall" "github.com/spf13/cobra" "gitea.oblak.solutions/dimitar/gitFlow/internal/version" ) // newRootCmd builds the top-level gitflow command. func newRootCmd() *cobra.Command { root := &cobra.Command{ Use: "gitflow", Short: "Scan Git repositories and get suggested next steps", Long: `gitflow discovers every Git repository under a parent directory, scans each one's status, and presents the findings. It can rescan on a schedule and, when enabled, uses an AI agent to suggest next actions for repositories that need attention.`, SilenceUsage: true, SilenceErrors: true, } root.AddCommand( newScanCmd(), newWatchCmd(), newConfigCmd(), newVersionCmd(), newCompletionCmd(root), ) return root } // newCompletionCmd generates shell completion scripts for the root command. func newCompletionCmd(root *cobra.Command) *cobra.Command { return &cobra.Command{ Use: "completion [bash|zsh|fish|powershell]", Short: "Generate a shell completion script", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { switch args[0] { case "bash": return root.GenBashCompletion(os.Stdout) case "zsh": return root.GenZshCompletion(os.Stdout) case "fish": return root.GenFishCompletion(os.Stdout, true) case "powershell": return root.GenPowerShellCompletion(os.Stdout) default: return fmt.Errorf("unknown shell %q (want bash, zsh, fish, or powershell)", args[0]) } }, } } // signalContext returns a context that is cancelled on SIGINT/SIGTERM so // scans and watch loops shut down gracefully. func signalContext() (context.Context, context.CancelFunc) { return signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) } // newVersionCmd prints the build version. func newVersionCmd() *cobra.Command { return &cobra.Command{ Use: "version", Short: "Print version information", Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, _ []string) error { fmt.Printf("gitflow %s\n", version.Version) return nil }, } }