secrets
Securely manage secrets and sensitive configuration data.
Synopsis
xec secrets [subcommand] [args...] [options]
xec secret [subcommand] [args...] [options] # Alias
xec s [subcommand] [args...] [options] # Short alias
Description
The secrets
command provides secure storage and management of sensitive data like passwords, API keys, tokens, and certificates. Secrets are encrypted at rest and can be referenced in configuration files and scripts.
Subcommands
set
Set a secret value.
xec secrets set <key> [options]
Options:
-v, --value <value>
- Secret value (prompts securely if not provided)
Examples:
# Interactive mode (recommended - secure prompt)
xec secrets set DATABASE_PASSWORD
# Set with value (not recommended - visible in shell history)
xec secrets set API_KEY -v "sk-1234567890abcdef"
# Set complex secret
xec secrets set JWT_PRIVATE_KEY -v "$(cat private.key)"
get
Retrieve a secret value.
xec secrets get <key>
Examples:
# Get secret value (outputs to stdout)
xec secrets get DATABASE_PASSWORD
# Use in scripts
DB_PASS=$(xec secrets get DATABASE_PASSWORD)
# Use in other commands
curl -H "Authorization: Bearer $(xec secrets get API_TOKEN)" https://api.example.com
list
List all secret keys (values are never shown).
xec secrets list
xec secrets ls # Alias
Examples:
# List all secrets
xec secrets list
# Output:
# Found 3 secrets:
# • DATABASE_PASSWORD
# • API_KEY
# • JWT_PRIVATE_KEY
delete
Delete a secret.
xec secrets delete <key> [options]
xec secrets rm <key> [options] # Alias
Options:
-f, --force
- Skip confirmation prompt
Examples:
# Delete with confirmation
xec secrets delete OLD_API_KEY
# Force delete without confirmation
xec secrets delete OLD_API_KEY --force
generate
Generate a random secret.
xec secrets generate <key> [options]
Options:
-l, --length <length>
- Secret length (default: 32)-f, --force
- Overwrite existing secret without confirmation
Examples:
# Generate 32-character secret
xec secrets generate SESSION_SECRET
# Generate custom length
xec secrets generate API_SECRET -l 64
# Force overwrite existing
xec secrets generate TEMP_TOKEN -l 16 --force
export
Export secrets (WARNING: outputs plain text).
xec secrets export [options]
Options:
-f, --format <format>
- Output format: json, env (default: json)--force
- Skip confirmation warning
Examples:
# Export as JSON (with warning prompt)
xec secrets export
# Export as environment variables
xec secrets export -f env
# Skip confirmation (dangerous!)
xec secrets export --force
import
Import secrets from file or stdin.
xec secrets import [options]
Options:
-f, --file <file>
- Input file (uses stdin if not provided)--format <format>
- Input format: json, env (default: json)
Examples:
# Import from JSON file
xec secrets import -f secrets.json
# Import from environment format
xec secrets import -f .env --format env
# Import from stdin
cat secrets.json | xec secrets import
# Import environment variables from stdin
echo "SECRET_API_KEY=value123" | xec secrets import --format env
Interactive Mode
When called without arguments, the secrets command enters interactive mode:
xec secrets
Interactive mode provides a menu-driven interface for all secret operations with enhanced security prompts and validation.
Secret Storage
Encryption
Secrets are encrypted using industry-standard encryption:
- Algorithm: AES-256-GCM
- Key derivation: PBKDF2 with 100,000 iterations
- Salt: Unique per secret store
- IV: Unique per secret
Storage Location
Secrets are stored in the user's home directory:
~/.xec/secrets/
├── keyring.enc # Encrypted secret store
├── salt # Cryptographic salt
└── config # Storage configuration
Provider Support
The secrets system supports multiple storage providers:
- File (default): Encrypted files in
~/.xec/secrets/
- System Keyring: OS-native keyring (macOS Keychain, Windows Credential Store, Linux Secret Service)
- External: HashiCorp Vault, AWS Secrets Manager, etc.
Using Secrets in Configuration
Variable Interpolation
Reference secrets in configuration files:
# .xec/config.yaml
vars:
DATABASE_URL: "postgresql://user:${secret:DATABASE_PASSWORD}@localhost/myapp"
API_ENDPOINT: "https://api.example.com"
targets:
hosts:
production:
host: prod.example.com
username: deployer
privateKey: ~/.ssh/id_rsa
passphrase: "${secret:SSH_PASSPHRASE}"
Task Parameters
Use secrets in task definitions:
tasks:
deploy:
description: Deploy to production
steps:
- name: Deploy
command: |
docker run --rm \
-e DATABASE_PASSWORD="${secret:DATABASE_PASSWORD}" \
-e API_KEY="${secret:API_KEY}" \
myapp:latest