Documentation
¶
Overview ¶
Package config loads and saves the pgedge CLI configuration at ~/.pgedge/cli/config.yaml with named profiles carrying per-module sections.
Index ¶
- func DefaultCacheDir() (string, error)
- func DefaultPath() (string, error)
- type Config
- func (c *Config) ControlplaneProfile(name string) *ControlplaneProfile
- func (c *Config) Path() string
- func (c *Config) ProfileNames() []string
- func (c *Config) ResolveProfile(flag string) string
- func (c *Config) Save() error
- func (c *Config) SavePath() string
- func (c *Config) SaveTo(path string) error
- func (c *Config) SetControlplaneProfile(name string, cp *ControlplaneProfile)
- func (c *Config) SetCurrentProfile(name string) error
- func (c *Config) SetStarfleetProfile(name string, cp *StarfleetProfile)
- func (c *Config) StarfleetProfile(name string) *StarfleetProfile
- func (c *Config) ValidateProfile(name string) error
- type ControlplaneProfile
- type OutputPrefs
- type Profile
- type StarfleetProfile
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func DefaultCacheDir ¶
DefaultCacheDir returns ~/.pgedge/cli/cache, which holds the token cache and selfupdate's sigstore cache. It lives here rather than in internal/auth so the config and cache paths derive from one root.
func DefaultPath ¶
DefaultPath returns ~/.pgedge/cli/config.yaml. The cli/ segment is deliberate: ~/.pgedge is shared with other pgEdge tools, and a file at its root is a file another tool may want (decided 2026-08-25).
Types ¶
type Config ¶
type Config struct {
CurrentProfile string `yaml:"current_profile,omitempty"`
Profiles map[string]Profile `yaml:"profiles,omitempty"`
Output OutputPrefs `yaml:"output,omitempty"`
// contains filtered or unexported fields
}
Config is the root of ~/.pgedge/cli/config.yaml.
func Load ¶
Load reads the config file, resolving its path by precedence: the explicit path argument (the --config flag) > DefaultPath.
A missing DEFAULT path is not an error — first run has no config file yet — but a missing EXPLICIT one is. Falling back silently would resolve the built-in default profile, whose api_url is PRODUCTION: failing open in the dangerous direction, indistinguishable from success.
func (*Config) ControlplaneProfile ¶
func (c *Config) ControlplaneProfile(name string) *ControlplaneProfile
ControlplaneProfile returns the controlplane section of the named profile. It never returns nil; absent profiles yield an empty struct.
func (*Config) Path ¶
Path returns the file this config was loaded from — the --config value when one was given, DefaultPath otherwise. A caller reporting on the config reads this rather than re-deriving the default, which under --config names a file the invocation is not reading.
func (*Config) ProfileNames ¶
ProfileNames returns the configured profile names, sorted.
func (*Config) ResolveProfile ¶
ResolveProfile returns the active profile name: flag > current_profile > "default".
func (*Config) Save ¶
Save writes the config back to its path with 0600 permissions, creating its directory (~/.pgedge/cli by default) with 0700 if needed.
func (*Config) SavePath ¶
SavePath is the file Save writes: Path, else the default. It keys a profile's keychain entry, so login and every later read agree on it. A nil Config answers the default.
func (*Config) SaveTo ¶
SaveTo writes the config to path and remembers path for any later Save call. It is how a test that builds a *Config by hand, rather than through Load, chooses where it lands. It shares writeTo with Save, so the 0700 directory and 0600 file hold through either entry point.
func (*Config) SetControlplaneProfile ¶
func (c *Config) SetControlplaneProfile(name string, cp *ControlplaneProfile)
SetControlplaneProfile stores the controlplane section under the named profile, creating maps as needed.
func (*Config) SetCurrentProfile ¶
SetCurrentProfile points current_profile at an existing profile. An unknown name is an error rather than a silent write, which would break every subsequent command with a confusing "no credentials" message once current_profile no longer names anything real.
func (*Config) SetStarfleetProfile ¶
func (c *Config) SetStarfleetProfile(name string, cp *StarfleetProfile)
SetStarfleetProfile stores the starfleet section under the named profile, creating maps as needed.
func (*Config) StarfleetProfile ¶
func (c *Config) StarfleetProfile(name string) *StarfleetProfile
StarfleetProfile returns the starfleet section of the named profile. It never returns nil; absent profiles yield an empty struct.
The result is always a fresh copy, so mutating it never persists and SetStarfleetProfile is the only write path. Handing back the live pointer would make mutate-then-Save persist on one path and not on another.
func (*Config) ValidateProfile ¶
ValidateProfile reports an error when name is not a key of c.Profiles, and nil when it is. It is the one place the unknown-profile text is written, so every caller emits it byte-identically.
SetCurrentProfile calls this directly; the read side (the profile guard, `profile show`, `profile list`'s resolved column) goes through internal/cli.CheckProfileName, which accepts the built-in "default" first. So `--profile default` and `profile show default` succeed on a config with no `default` section while `profile use default` fails: `use` selects a CONFIGURED profile, and the built-in is the absence of configuration. llms.txt and the pgedge skill both state this exception; it is deliberate.
With no profiles configured, the message names the commands that create one rather than an empty list, and names both because this package cannot tell which applies: a controlplane-only operator has no Starfleet credentials to log in with. Creating the profile they name is also why both carry cli.AnnotationProfileExempt.
type ControlplaneProfile ¶
type ControlplaneProfile struct {
BaseURL string `yaml:"base_url,omitempty"`
BaseURLs []string `yaml:"base_urls,omitempty"`
CACert string `yaml:"ca_cert,omitempty"`
ClientCert string `yaml:"client_cert,omitempty"`
ClientKey string `yaml:"client_key,omitempty"`
InsecureSkipVerify bool `yaml:"insecure_skip_verify,omitempty"`
Timeout string `yaml:"timeout,omitempty"`
}
ControlplaneProfile holds Control Plane module settings within a profile. The Control Plane has no login/token; connection is a base URL plus optional mTLS cert file paths.
func (*ControlplaneProfile) EffectiveBaseURLs ¶
func (p *ControlplaneProfile) EffectiveBaseURLs() []string
EffectiveBaseURLs returns the candidate Control Plane URLs for the profile: BaseURLs when set, else the legacy singular BaseURL as a one-element list, else nil (the caller applies the default).
type OutputPrefs ¶
type OutputPrefs struct {
Format string `yaml:"format,omitempty"`
}
OutputPrefs holds user output defaults.
type Profile ¶
type Profile struct {
Starfleet *StarfleetProfile `yaml:"starfleet,omitempty"`
Controlplane *ControlplaneProfile `yaml:"controlplane,omitempty"`
}
Profile is a named context carrying per-module sections.
type StarfleetProfile ¶
type StarfleetProfile struct {
APIURL string `yaml:"api_url,omitempty"`
ClientID string `yaml:"client_id,omitempty"`
ClientSecret string `yaml:"client_secret,omitempty"`
}
StarfleetProfile holds the Starfleet API connection for a profile. One product means one credential: the account-level commands, byoc and managed all read this section, exactly as they share one token on the wire.