package cmd import ( "fmt" "os" "github.com/spf13/cobra" "github.com/spf13/viper" ) var ( cfgFile string dbPath string apiURL string apiKey string siteID string ) var rootCmd = &cobra.Command{ Use: "insertr", Short: "Insertr - The Tailwind of CMS", Long: `Insertr adds editing capabilities to static HTML sites by detecting editable elements and injecting content management functionality. The unified tool handles both build-time content injection (enhance command) and runtime API server (serve command) for complete CMS functionality.`, Version: "0.1.0", } func Execute() { if err := rootCmd.Execute(); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } } func init() { cobra.OnInitialize(initConfig) // Global flags rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is ./insertr.yaml)") rootCmd.PersistentFlags().StringVar(&dbPath, "db", "./insertr.db", "database path (SQLite file or PostgreSQL connection string)") rootCmd.PersistentFlags().StringVar(&apiURL, "api-url", "", "content API URL") rootCmd.PersistentFlags().StringVar(&apiKey, "api-key", "", "API key for authentication") rootCmd.PersistentFlags().StringVarP(&siteID, "site-id", "s", "demo", "site ID for content lookup") // Bind flags to viper viper.BindPFlag("database.path", rootCmd.PersistentFlags().Lookup("db")) viper.BindPFlag("api.url", rootCmd.PersistentFlags().Lookup("api-url")) viper.BindPFlag("api.key", rootCmd.PersistentFlags().Lookup("api-key")) viper.BindPFlag("site_id", rootCmd.PersistentFlags().Lookup("site-id")) rootCmd.AddCommand(enhanceCmd) rootCmd.AddCommand(serveCmd) } func initConfig() { if cfgFile != "" { viper.SetConfigFile(cfgFile) } else { viper.AddConfigPath(".") viper.SetConfigName("insertr") viper.SetConfigType("yaml") } // Environment variables viper.SetEnvPrefix("INSERTR") viper.AutomaticEnv() // Read config file if err := viper.ReadInConfig(); err == nil { fmt.Fprintln(os.Stderr, "Using config file:", viper.ConfigFileUsed()) } }