package config import ( "os" "path/filepath" "github.com/spf13/viper" ) // Load initializes the configuration from Viper func Load() { home, err := os.UserHomeDir() if err != nil { // Fall back to current directory if home not found home = "." } configPath := filepath.Join(home, ".config", "grokkit") viper.SetConfigName("config") viper.SetConfigType("toml") viper.AddConfigPath(configPath) viper.AddConfigPath(".") viper.AutomaticEnv() viper.SetDefault("default_model", "grok-4") viper.SetDefault("temperature", 0.7) viper.SetDefault("log_level", "info") viper.SetDefault("timeout", 60) viper.SetDefault("commands.agent.model", "grok-4") viper.SetDefault("commands.chat.model", "grok-4") viper.SetDefault("commands.commit.model", "grok-4") viper.SetDefault("commands.commitmsg.model", "grok-4") viper.SetDefault("commands.edit.model", "grok-4") viper.SetDefault("commands.history.model", "grok-4") viper.SetDefault("commands.lint.model", "grok-4-1-fast-non-reasoning") viper.SetDefault("commands.prdescribe.model", "grok-4") viper.SetDefault("commands.review.model", "grok-4") viper.SetDefault("commands.docs.model", "grok-4") viper.SetDefault("commands.query.model", "grok-4-1-fast-non-reasoning") // Config file is optional, so we ignore read errors _ = viper.ReadInConfig() } // GetModel returns the model to use for a specific command, considering flags and aliases func GetModel(commandName string, flagModel string) string { if flagModel != "" { if alias := viper.GetString("aliases." + flagModel); alias != "" { return alias } return flagModel } cmdModel := viper.GetString("commands." + commandName + ".model") if cmdModel != "" { return cmdModel } return viper.GetString("default_model") } // GetTemperature returns the temperature from the configuration func GetTemperature() float64 { return viper.GetFloat64("temperature") } // GetTimeout returns the timeout from the configuration func GetTimeout() int { timeout := viper.GetInt("timeout") if timeout <= 0 { return 60 // Default 60 seconds } return timeout } // GetLogLevel returns the log level from the configuration func GetLogLevel() string { return viper.GetString("log_level") }