package cli import ( "fmt" "sort" "github.com/spf13/cobra" ) func newConfigCmd(app *appState) *cobra.Command { cmd := &cobra.Command{ Use: "config", Short: "Inspect or modify global config fields", } cmd.AddCommand( newConfigShowCmd(app), newConfigSetCmd(app), newConfigGetCmd(app), ) return cmd } func newConfigShowCmd(app *appState) *cobra.Command { return &cobra.Command{ Use: "show", Short: "Print the current config (env values masked)", RunE: func(cmd *cobra.Command, args []string) error { fmt.Fprintf(app.stdout, "# %s\n", app.configPath) // Build a display copy: mask or mark each env value. type provView struct { desc string env map[string]string } disp := map[string]provView{} for n, p := range app.cfg.Providers { ev := make(map[string]string, len(p.Env)) for k, v := range p.Env { ev[k] = displayValue(v) } disp[n] = provView{desc: p.Description, env: ev} } if app.cfg.ClaudePath != "" { fmt.Fprintf(app.stdout, "claude_path: %s\n", app.cfg.ClaudePath) } if app.cfg.DefaultProvider != "" { fmt.Fprintf(app.stdout, "default_provider: %s\n", app.cfg.DefaultProvider) } if len(disp) == 0 { fmt.Fprintln(app.stdout, "providers: {}") return nil } fmt.Fprintln(app.stdout, "providers:") names := make([]string, 0, len(disp)) for n := range disp { names = append(names, n) } sort.Strings(names) for _, n := range names { v := disp[n] fmt.Fprintf(app.stdout, " %s:\n", n) if v.desc != "" { fmt.Fprintf(app.stdout, " description: %s\n", v.desc) } fmt.Fprintln(app.stdout, " env:") keys := make([]string, 0, len(v.env)) for k := range v.env { keys = append(keys, k) } sort.Strings(keys) for _, k := range keys { fmt.Fprintf(app.stdout, " %s: %s\n", k, v.env[k]) } } return nil }, } } func newConfigSetCmd(app *appState) *cobra.Command { cmd := &cobra.Command{ Use: "set ", Short: "Set a top-level config field (claude-path | default)", Args: cobra.ExactArgs(2), RunE: func(cmd *cobra.Command, args []string) error { key, value := args[0], args[1] switch key { case "claude-path": if err := app.cfg.SetClaudePath(value); err != nil { return err } case "default": if err := app.cfg.SetDefault(value); err != nil { return err } default: return fmt.Errorf("unknown config key %q (allowed: claude-path, default)", key) } if err := app.save(); err != nil { return err } fmt.Fprintf(app.stdout, "set %s\n", key) return nil }, } return cmd } func newConfigGetCmd(app *appState) *cobra.Command { return &cobra.Command{ Use: "get ", Short: "Print a top-level config field (claude-path | default)", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { switch args[0] { case "claude-path": fmt.Fprintln(app.stdout, app.cfg.ClaudePath) case "default": fmt.Fprintln(app.stdout, app.cfg.DefaultProvider) default: return fmt.Errorf("unknown config key %q (allowed: claude-path, default)", args[0]) } return nil }, } }