diff --git a/pkg/cmd/config/config.go b/pkg/cmd/config/config.go new file mode 100644 index 000000000..8c020ad82 --- /dev/null +++ b/pkg/cmd/config/config.go @@ -0,0 +1,36 @@ +// Copyright (c) 2026 Probo Inc . +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +// OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +// PERFORMANCE OF THIS SOFTWARE. + +package config + +import ( + "github.com/spf13/cobra" + "go.probo.inc/probo/pkg/cmd/cmdutil" + configget "go.probo.inc/probo/pkg/cmd/config/get" + configlist "go.probo.inc/probo/pkg/cmd/config/list" + configset "go.probo.inc/probo/pkg/cmd/config/set" +) + +func NewCmdConfig(f *cmdutil.Factory) *cobra.Command { + cmd := &cobra.Command{ + Use: "config ", + Short: "Manage configuration for proboctl", + } + + cmd.AddCommand(configget.NewCmdConfigGet(f)) + cmd.AddCommand(configset.NewCmdConfigSet(f)) + cmd.AddCommand(configlist.NewCmdConfigList(f)) + + return cmd +} diff --git a/pkg/cmd/config/get/get.go b/pkg/cmd/config/get/get.go new file mode 100644 index 000000000..4352eebcd --- /dev/null +++ b/pkg/cmd/config/get/get.go @@ -0,0 +1,51 @@ +// Copyright (c) 2026 Probo Inc . +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +// OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +// PERFORMANCE OF THIS SOFTWARE. + +package get + +import ( + "fmt" + + "github.com/spf13/cobra" + "go.probo.inc/probo/pkg/cmd/cmdutil" +) + +func NewCmdConfigGet(f *cmdutil.Factory) *cobra.Command { + return &cobra.Command{ + Use: "get ", + Short: "Print the value of a given configuration key", + Long: "Print the value of a given configuration key.\n\nAvailable keys: editor, browser, pager, prompt, http_timeout", + Example: ` # Get the configured editor + proboctl config get editor + + # Get the HTTP timeout + proboctl config get http_timeout`, + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + cfg, err := f.Config() + if err != nil { + return err + } + + val, err := cfg.Get(args[0]) + if err != nil { + return err + } + + _, _ = fmt.Fprintln(f.IOStreams.Out, val) + + return nil + }, + } +} diff --git a/pkg/cmd/config/list/list.go b/pkg/cmd/config/list/list.go new file mode 100644 index 000000000..e660fc2ff --- /dev/null +++ b/pkg/cmd/config/list/list.go @@ -0,0 +1,48 @@ +// Copyright (c) 2026 Probo Inc . +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +// OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +// PERFORMANCE OF THIS SOFTWARE. + +package list + +import ( + "fmt" + + "github.com/spf13/cobra" + "go.probo.inc/probo/pkg/cli/config" + "go.probo.inc/probo/pkg/cmd/cmdutil" +) + +func NewCmdConfigList(f *cmdutil.Factory) *cobra.Command { + return &cobra.Command{ + Use: "list", + Short: "Print a list of configuration keys and values", + Aliases: []string{"ls"}, + Args: cobra.NoArgs, + RunE: func(cmd *cobra.Command, args []string) error { + cfg, err := f.Config() + if err != nil { + return err + } + + for _, key := range config.ValidKeys { + val, _ := cfg.Get(key) + if val == "" { + val = "" + } + _, _ = fmt.Fprintf(f.IOStreams.Out, "%s=%s\n", key, val) + } + + return nil + }, + } +} diff --git a/pkg/cmd/config/set/set.go b/pkg/cmd/config/set/set.go new file mode 100644 index 000000000..2de39fd72 --- /dev/null +++ b/pkg/cmd/config/set/set.go @@ -0,0 +1,62 @@ +// Copyright (c) 2026 Probo Inc . +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +// OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +// PERFORMANCE OF THIS SOFTWARE. + +package set + +import ( + "fmt" + + "github.com/spf13/cobra" + "go.probo.inc/probo/pkg/cmd/cmdutil" +) + +func NewCmdConfigSet(f *cmdutil.Factory) *cobra.Command { + return &cobra.Command{ + Use: "set ", + Short: "Update configuration with a value for the given key", + Long: "Update configuration with a value for the given key.\n\nAvailable keys: editor, browser, pager, prompt, http_timeout", + Example: ` # Set the default editor + proboctl config set editor vim + + # Set the HTTP timeout to 60 seconds + proboctl config set http_timeout 60s + + # Disable interactive prompts + proboctl config set prompt disabled`, + Args: cobra.ExactArgs(2), + RunE: func(cmd *cobra.Command, args []string) error { + cfg, err := f.Config() + if err != nil { + return err + } + + if err := cfg.Set(args[0], args[1]); err != nil { + return err + } + + if err := cfg.Save(); err != nil { + return err + } + + _, _ = fmt.Fprintf( + f.IOStreams.ErrOut, + "Set %s to %s\n", + args[0], + args[1], + ) + + return nil + }, + } +}