Public/Get-PCSecret.ps1
|
function Get-PCSecret { <# .SYNOPSIS Retrieves a secret by service name. .DESCRIPTION Returns the API key for a service. Resolution order: 1. Environment variable (highest priority) 2. ~/.powercraft/secrets.json .PARAMETER Name Service name (e.g., 'openai', 'anthropic', 'brave-search'). .PARAMETER Property Specific property to retrieve. Defaults to 'apiKey'. .PARAMETER AsHashtable Return the full secret entry as a hashtable instead of a single value. .PARAMETER Required Throw an error if the secret is not found. .OUTPUTS [string] The secret value, or [hashtable] if -AsHashtable. .EXAMPLE Get-PCSecret -Name 'openai' # Returns: "sk-..." .EXAMPLE Get-PCSecret -Name 'openai' -AsHashtable # Returns: @{ apiKey = "sk-..."; envVar = "OPENAI_API_KEY" } .EXAMPLE Get-PCSecret -Name 'openai' -Required # Throws if not configured #> [CmdletBinding()] [OutputType([string], [hashtable])] param( [Parameter(Mandatory, Position = 0)] [string]$Name, [Parameter()] [string]$Property = 'apiKey', [Parameter()] [switch]$AsHashtable, [Parameter()] [switch]$Required ) # Check environment variable first $envVarName = Resolve-PCEnvVarName -Name $Name -SecretEntry $null $envValue = $null if (Test-Path "env:$envVarName") { $envValue = (Get-Item "env:$envVarName").Value Write-Verbose "Found $Name via environment variable $envVarName" } # Load from secrets file $secrets = Read-PCSecretsFile $entry = $secrets[$Name] # If we have an env value, resolve the proper envVar name using the entry if ($entry) { $envVarName = Resolve-PCEnvVarName -Name $Name -SecretEntry $entry if (-not $envValue -and (Test-Path "env:$envVarName")) { $envValue = (Get-Item "env:$envVarName").Value Write-Verbose "Found $Name via environment variable $envVarName" } } # Return full entry if requested if ($AsHashtable) { if ($entry) { # Overlay env value if present if ($envValue) { $entry[$Property] = $envValue } return $entry } elseif ($envValue) { return @{ $Property = $envValue } } elseif ($Required) { throw "Required secret not found: $Name. Run Set-PCSecret -Name '$Name' -ApiKey '<your-key>' or set `$env:$envVarName." } return $null } # Return single property $value = $envValue if (-not $value -and $entry) { $value = $entry[$Property] } if ($Required -and -not $value) { throw "Required secret not found: $Name.$Property. Run Set-PCSecret -Name '$Name' -ApiKey '<your-key>' or set `$env:$envVarName." } return $value } |