configs/claude-code/skills/using-proton-pass-cli/SKILL.md
Interact with Proton Pass via the `pass-cli` command-line tool. Use this skill when the user wants to manage passwords, vaults, items, SSH keys, secret injection, or any credential management through the Proton Pass CLI. Triggers on mentions of pass-cli, proton pass, secret references, pass:// URIs, vault management, or SSH agent integration with Proton Pass.
npx skillsauth add poorrican/dotfiles using-proton-pass-cliInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use the pass-cli command-line tool to manage vaults, items, secrets, SSH keys, and sharing in Proton Pass.
pass-cli must be installed. If not installed, read the INSTALLATION.md file in this skill directory for platform-specific installation instructions.pass-cli test. If not authenticated, guide them through login.pass-cli login
Prints a URL to complete auth in a browser.
pass-cli login --interactive [email protected]
Prompts for password, TOTP (if enabled), and extra password (if configured).
Credentials are resolved in order: environment variable → file → interactive prompt.
export PROTON_PASS_PASSWORD='...'
export PROTON_PASS_TOTP='123456'
export PROTON_PASS_EXTRA_PASSWORD='...'
pass-cli login --interactive [email protected]
File-based variants: PROTON_PASS_PASSWORD_FILE, PROTON_PASS_TOTP_FILE, PROTON_PASS_EXTRA_PASSWORD_FILE.
pass-cli test # Verify session is valid
pass-cli info # Show user ID, username, email, release track
pass-cli user info # Detailed account info (plan, features, storage)
pass-cli logout # End session and remove local data
pass-cli logout --force # Force local cleanup even if remote logout fails
Configure a default vault and output format to reduce flags on every command:
pass-cli settings view # View current settings
pass-cli settings set default-vault --vault-name "Personal" # Set default vault
pass-cli settings set default-format json # Set default output format (human|json)
pass-cli settings unset default-vault # Clear default vault
pass-cli settings unset default-format # Clear default format
When a default vault is set, commands like item list, item create, item view, item update work without --share-id or --vault-name.
Vaults are containers that organize items. Most vault commands accept --share-id SHARE_ID or --vault-name NAME (mutually exclusive).
pass-cli vault list [--output json]
pass-cli vault create --name "My Vault"
pass-cli vault update --vault-name "Old" --name "New"
pass-cli vault delete --vault-name "Old Vault" # ⚠️ Permanent — deletes all items
pass-cli vault share --vault-name "Team" [email protected] --role editor
# Roles: viewer (default), editor, manager
pass-cli vault member list --vault-name "Team" [--output json]
pass-cli vault member update --share-id "..." --member-share-id "..." --role editor
pass-cli vault member remove --share-id "..." --member-share-id "..."
pass-cli vault transfer --vault-name "My Vault" "member_share_id"
Items are the fundamental data units: logins, notes, credit cards, aliases, SSH keys.
pass-cli item list # Uses default vault
pass-cli item list "Personal Vault" # By vault name
pass-cli item list --share-id "abc123" --output json
pass-cli item create login \
--title "GitHub" \
--username "myuser" \
--password "mypassword" \
--url "https://github.com"
# With generated password
pass-cli item create login --title "Account" --username "me" --generate-password
# Custom password generation: "length,uppercase,symbols"
pass-cli item create login --title "Account" --username "me" --generate-password="20,true,true"
# With passphrase
pass-cli item create login --title "Account" --username "me" --generate-passphrase="5"
pass-cli item create login --get-template > template.json
# Edit template.json
pass-cli item create login --from-template template.json --vault-name "Personal"
# Template JSON format:
# {"title":"...","username":"...","email":"...","password":"...","urls":["https://..."]}
pass-cli item view --vault-name "MyVault" --item-title "MyItem"
pass-cli item view --share-id "abc123" --item-id "item456"
pass-cli item view "pass://MyVault/MyItem" # By secret reference
pass-cli item view "pass://abc123/item456/password" # Specific field
pass-cli item view --share-id "abc123" --item-id "item456" --field "username"
pass-cli item update --vault-name "Personal" --item-title "GitHub" \
--field "password=newpass123"
# Multiple fields
pass-cli item update --share-id "abc123" --item-id "item456" \
--field "username=newuser" \
--field "password=newpass" \
--field "[email protected]"
# Custom fields (created if they don't exist)
pass-cli item update --share-id "abc123" --item-id "item456" \
--field "api_key=sk_live_abc123"
# Note: time and TOTP fields cannot be updated via CLI
pass-cli item delete --share-id "abc123" --item-id "item456" # ⚠️ Permanent
pass-cli item totp --item-title "WithTOTPs"
pass-cli item totp "pass://TOTP export/WithTOTPs"
pass-cli item totp "pass://TOTP export/WithTOTPs/TOTP 1"
pass-cli item totp "pass://vault/item" --output json | jq -r '."totp"'
pass-cli item alias create --prefix "shopping" --vault-name "Personal"
pass-cli item share --share-id "abc123" --item-id "item456" [email protected] --role editor
pass-cli item attachment download --share-id "abc123" --item-id "item456" --attachment-id "att789"
pass-cli item create ssh-key generate \
--title "GitHub Deploy Key" \
--key-type ed25519 # ed25519 (default), rsa2048, rsa4096
# With passphrase protection
pass-cli item create ssh-key generate --title "Key" --password
# Passphrase via env: PROTON_PASS_SSH_KEY_PASSWORD or PROTON_PASS_SSH_KEY_PASSWORD_FILE
pass-cli item create ssh-key import \
--from-private-key ~/.ssh/id_ed25519 \
--title "My SSH Key"
# Passphrase-protected key
pass-cli item create ssh-key import \
--from-private-key ~/.ssh/id_ed25519 \
--title "Protected Key" \
--password
# 1. Create unencrypted copy
cp ~/.ssh/id_ed25519 /tmp/id_ed25519_temp
ssh-keygen -p -f /tmp/id_ed25519_temp -N ""
# 2. Import
pass-cli item create ssh-key import --from-private-key /tmp/id_ed25519_temp --title "My Key"
# 3. Securely delete temp copy
shred -u /tmp/id_ed25519_temp # Linux
rm -P /tmp/id_ed25519_temp # macOS
pass-cli ssh-agent load # All vaults
pass-cli ssh-agent load --vault-name MySshKeysVault # Specific vault
Requires SSH_AUTH_SOCK to be set.
pass-cli ssh-agent start
# Then in another terminal:
export SSH_AUTH_SOCK=$HOME/.ssh/proton-pass-agent.sock
# Options:
pass-cli ssh-agent start --vault-name MySshKeysVault
pass-cli ssh-agent start --socket-path /custom/path.sock
pass-cli ssh-agent start --refresh-interval 7200 # Seconds between key scans
pass-cli ssh-agent start --create-new-identities MySshKeysVault # Auto-save ssh-add keys
pass://vault-identifier/item-identifier/field-name
username, password, email, url, note, totpview — Display a secret valuepass-cli item view "pass://Production/Database/password"
run — Inject secrets into environment variablesexport DB_PASSWORD='pass://Production/Database/password'
pass-cli run -- ./my-app
# With .env files
pass-cli run --env-file .env.secrets -- ./my-app
# Multiple env files (later overrides earlier)
pass-cli run --env-file base.env --env-file secrets.env -- node server.js
# Disable secret masking in stdout/stderr
pass-cli run --no-masking -- ./my-app
By default, secret values in stdout/stderr are masked as <concealed by Proton Pass>.
Multiple pass:// references can appear in a single env var value:
DATABASE_URL="postgresql://user:pass://vault/db/password@localhost/db"
inject — Process template filesTemplate syntax uses {{ pass://... }} (double braces required):
# config.yaml.template
database:
username: {{ pass://Production/Database/username }}
password: {{ pass://Production/Database/password }}
api:
key: {{ pass://Work/API Keys/api_key }}
# Plain pass:// URIs without {{ }} are ignored
pass-cli inject --in-file config.yaml.template --out-file config.yaml
pass-cli inject --in-file template.txt --out-file config.txt --force # Overwrite
pass-cli inject --in-file template.txt --out-file config.txt --file-mode 0644
# From stdin
cat template.txt | pass-cli inject
pass-cli inject << EOF
{"password": "{{ pass://Vault/Item/password }}"}
EOF
Default output file permissions: 0600.
pass-cli share list [--output json]
Shows all vault and item shares you have access to, with roles (Owner, Manager, Editor, Viewer).
pass-cli invite list [--output json]
pass-cli invite accept --invite-token "token123"
pass-cli invite reject --invite-token "token123"
These commands work without authentication.
# Random password
pass-cli password generate random
pass-cli password generate random --length 20 --uppercase true --symbols true
# Passphrase
pass-cli password generate passphrase
pass-cli password generate passphrase --count 5 --separator "-" --capitalize true --numbers true
# Score a password
pass-cli password score "mypassword123"
pass-cli password score "MyP@ss!" --output json
pass-cli update # Interactive update
pass-cli update --yes # Non-interactive
pass-cli update --set-track beta # Switch to beta track
pass-cli update --set-track stable # Switch back to stable
pass-cli info # Check current release track
updateand track switching only work for manual installations, not Homebrew/package manager installs.
if pass-cli test > /dev/null 2>&1; then
echo "Authenticated"
else
echo "Login required"
pass-cli login --interactive [email protected]
fi
#!/bin/bash
export PROTON_PASS_PASSWORD_FILE='/secure/creds/password.txt'
export PROTON_PASS_TOTP_FILE='/secure/creds/totp.txt'
pass-cli login --interactive [email protected]
pass-cli vault create --name "Deploy Keys"
pass-cli item create login --vault-name "Deploy Keys" \
--title "Production DB" --username "admin" --generate-password \
--url "https://db.example.com"
pass-cli run --env-file .env.production -- ./deploy.sh
pass-cli logout
pass-cli run --env-file .env.secrets -- ./deploy.sh
--share-id and --vault-name require exactly one (not both). Similarly for --item-id and --item-title.pass-cli settings set to avoid repeating vault and format flags.--output human (default) and --output json.vault delete and item delete are permanent and cannot be undone.pass://vault/item alone is invalid — a field name is always required: pass://vault/item/field.development
Implement multiple GitHub issues sequentially as stacked branches in separate worktrees, with an implementer sub-agent and an independent reviewer sub-agent per issue. Use when the user gives you two or more dependent issues and asks for them to be implemented in order, or says "stacked branches", "sequential issues", "issue chain", "do these in worktrees", or describes a parent epic with child issues that build on each other. Also reach for this whenever the user wants implementation and verification done by separate agents.
testing
Use when an agent needs to produce, update, validate, or normalize a standardized research proposal artifact without running an interview. Defines the canonical structure, confidence-tag semantics, decision logic, and completion checks for proposal.md-style research plans.
development
Conducts a structured Socratic interview to produce a comprehensive markdown research proposal that handles cascading uncertainty (fixed end-question, branching experiments). Use this skill whenever the user wants to write a research proposal, research plan, study design, experiment plan, thesis proposal, RFC, or "spec out" a research direction — even if they don't explicitly say "interview me." Trigger when the user says things like "help me plan this research", "I want to design experiments for X", "draft a proposal for...", "think through a research direction", or shares a half-formed research idea and asks for help structuring it. The skill interviews the user, challenges their priors with evidence requests and falsifiers, optionally uses sub-agents to explore prior art, and builds the proposal markdown incrementally so context stays clean and the document is always grounded.
testing
Use when an agent needs to produce, update, validate, or normalize a standardized experiment-log entry without running an interview. Defines the canonical structure, pre-registration rules, evidence/interpretation split, calibration tags, and append-only revision model for durable experiment records.