package cmd import ( "fmt" "log" "os" "path/filepath" "system_setup_tool/internal/tui" "github.com/spf13/cobra" "github.com/spf13/viper" ) var RootCmd = &cobra.Command{ Use: "system_setup_tool", Short: "Installs packages based on TOML configuration", Version: "0.6.0", Run: tui.Run, } func init() { cobra.OnInitialize(initConfig) RootCmd.PersistentFlags().StringP("config", "c", "", "Path to the configuration file") viper.BindPFlag("config", RootCmd.PersistentFlags().Lookup("config")) addCmd.Flags().StringP("name", "n", "", "The name of the package you want to add") addCmd.Flags().StringP("manager", "m", "", "The package manager you want to add the package to (homebrew|cargo|flatpak|pipx|go)") addCmd.Flags().Bool("system", false, "Add as a system package") addCmd.Flags().Bool("headless", false, "Add as a headless system package (only used with --system)") deleteCmd.Flags().StringP("name", "n", "", "The name of the package you want to delete") deleteCmd.Flags().StringP("manager", "m", "", "The package manager you want to delete the package from (homebrew|cargo|flatpak|pipx|go)") deleteCmd.Flags().Bool("system", false, "Delete from system packages") deleteCmd.Flags().Bool("headless", false, "Delete from headless system packages (only used with --system)") enableCmd.Flags().Bool("value", true, "Set to true to enable, false to disable") installCmd.Flags().StringP("manager", "m", "os", "The package manager you want to install a package with. (Options: os|homebrew|pipx|flatpak|cargo)") removeCmd.Flags().StringP("manager", "m", "os", "The package manager you want to remove a package with. (Options: os|homebrew|pipx|flatpak|cargo)") searchCmd.Flags().StringP("manager", "m", "", "The package manager you want to search a package with. (Options: os|homebrew|flatpak)") updateCmd.Flags().StringP("manager", "m", "os", "The package manager you want to update packages with. (Options: os|homebrew|pipx|flatpak)") checkCmd.Flags().StringP("manager", "m", "os", "The package manager you want to check for a packages with. (Options: os|homebrew|pipx|flatpak)") packageCmd.AddCommand( addCmd, deleteCmd, showCmd, enableCmd, ) RootCmd.AddCommand( packageCmd, searchCmd, installCmd, removeCmd, updateCmd, updateAllCmd, historyCmd, checkCmd, ) } func initConfig() { if cfgFile := viper.GetString("config"); cfgFile != "" { viper.SetConfigFile(cfgFile) } else { viper.SetConfigName("config") viper.SetConfigType("toml") dirname, err := os.UserConfigDir() if err != nil { log.Println("cant obtain config dir") } else { viper.AddConfigPath(filepath.Join(dirname, "sst")) } } if err := viper.ReadInConfig(); err != nil { if _, ok := err.(viper.ConfigFileNotFoundError); ok { fmt.Println("no config file found, creating a new one...") if err := createDefaultConfig(); err != nil { log.Printf("error creating default config: %v\n", err) os.Exit(1) } } else { log.Printf("error reading config file: %v\n", err) os.Exit(1) } } } func createDefaultConfig() error { v := viper.New() v.SetDefault("config", "") v.SetDefault("headless", true) v.SetDefault("dotfiles.enable", false) v.SetDefault("dotfiles.git_repo", "") v.SetDefault("package_managers.cargo.enable", false) v.SetDefault("package_managers.cargo.packages", []string{}) v.SetDefault("package_managers.flatpak.enable", false) v.SetDefault("package_managers.flatpak.packages", []string{}) v.SetDefault("package_managers.go.enable", false) v.SetDefault("package_managers.go.packages", []string{}) v.SetDefault("package_managers.homebrew.enable", false) v.SetDefault("package_managers.homebrew.packages", []string{}) v.SetDefault("package_managers.pipx.enable", false) v.SetDefault("package_managers.pipx.packages", []string{}) v.SetDefault("package_managers.os.enable", true) v.SetDefault("package_managers.os.packages", []string{}) configDir := filepath.Join(os.Getenv("HOME"), ".config", "sst") if err := os.MkdirAll(configDir, 0755); err != nil { return fmt.Errorf("error creating config dir: %w", err) } configPath := filepath.Join(configDir, "config.toml") v.SetConfigFile(configPath) v.SetConfigType("toml") if err := v.WriteConfig(); err != nil { return fmt.Errorf("error writing default config: %w", err) } fmt.Println("default config created:", configPath) return nil }