diff --git a/pkg/cli/commands/root.go b/pkg/cli/commands/root.go index f58b224..418d7ae 100644 --- a/pkg/cli/commands/root.go +++ b/pkg/cli/commands/root.go @@ -1,8 +1,8 @@ package commands import ( + "bytes" "context" - "os" "github.com/LazyBachelor/LazyPM/internal/service" "github.com/charmbracelet/fang" @@ -10,35 +10,53 @@ import ( "github.com/spf13/cobra" ) +// svc is a global variable that holds beads, config and stats services. +// Must be called before executing any commands to ensure services are available. var svc *service.Services +// rootCmd is the base command for the CLI application. var rootCmd = &cobra.Command{ Short: "Project Management CLI", Long: `Project Management CLI for managing issues and tasks.`, } -func Execute(services *service.Services) error { - SetServices(services) - return fang.Execute(context.Background(), rootCmd, - fang.WithColorSchemeFunc(fang.AnsiColorScheme), - fang.WithNotifySignal(os.Interrupt, os.Kill)) -} - +// SetServices sets the global services variable for use in command execution. +// Must be called before executing any commands to ensure services are available. func SetServices(services *service.Services) { svc = services rootCmd.Use = svc.Config.RootCmd } -func ExecuteWithArgs(args []string) error { +// Execute executes the root command using the fang library. +func Execute() error { + return fang.Execute(context.Background(), rootCmd, + fang.WithColorSchemeFunc(fang.AnsiColorScheme)) +} + +// ExecuteArgs executes the command with the given arguments using the fang library. +func ExecuteArgs(args []string) error { rootCmd.SetArgs(args) return fang.Execute(context.Background(), rootCmd, fang.WithColorSchemeFunc(fang.AnsiColorScheme)) } +// ExecuteArgsString executes the command with the given arguments and returns the output as a string. +// This is useful for testing command outputs and used in the REPL +func ExecuteArgsString(args []string) (string, error) { + buf := new(bytes.Buffer) + + rootCmd.SetOut(buf) + rootCmd.SetErr(buf) + rootCmd.SetArgs(args) + + err := rootCmd.Execute() + + return buf.String(), err +} + +// init function to set up the command hierarchy and options. func init() { - rootCmd.AddCommand(createCmd) - rootCmd.AddCommand(deleteCmd) - rootCmd.CompletionOptions.DisableDefaultCmd = false + rootCmd.CompletionOptions.DisableDefaultCmd = true rootCmd.AddGroup(&cobra.Group{ID: "help", Title: "Helping Commands"}) rootCmd.SetCompletionCommandGroupID("help") rootCmd.SetHelpCommandGroupID("help")