op-item-management — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited op-item-management (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
op item — item CRUDAPI Credential Bank Account Credit Card
Database Document Driver License
Email Account Identity Login
Membership Outdoor License Passport
Password Reward Program Secure Note
Server Social Security Number Software License
SSH Key Wireless RouterUse exactly these names with --category (case-insensitive, whitespace-insensitive). For SSH Keys see the op-ssh-keys sub-skill.
Syntax:
[<section>.]<field>[<fieldType>]=<value>fieldType in [brackets] for custom fields. Built-in fields don't need it.., =, \ in section/field NAMES with backslash. Don't escape values.Field types that go in brackets:
fieldType | Field |
|---|---|
text | plain string |
password | concealed |
email | |
url | URL |
phone | phone |
date | YYYY-MM-DD |
monthyear | YYYY/MM |
otp | otpauth://... URI |
file | path to file (attachment) |
Caveat: assignment values appear in the parent shell's argv (visible via ps, kept in shell history). For sensitive values, use a JSON template instead.
op item template get Login --out-file login.json
# edit login.json — set values for each field
op item create --template login.json
rm login.jsonThe same JSON shape returned by op item get <item> --format json works as a template. Use this to clone items between vaults or accounts:
op item get "My Login" --format json --account work | \
op item create --account personal --vault Personal -Pipe input replaces --template. Don't use both.
op item create --template login.json [email protected]Assignment statements override the template's values for those keys.
op item createop item create [- | --template <path>] [<assignment>...] [flags]| Flag | Purpose |
|---|---|
--category <name> | Set category. |
--title <title> | Set name. |
--vault <vault> | Target vault (defaults to Private/Personal/Employee). Required for service accounts. |
--url <url> | Set URL field (Login/Password/API Credential). |
--tags a,b,c | Comma-separated tags. |
--generate-password[=recipe] | Auto-generate. Default 32 chars w/ letters,digits,symbols. Recipe e.g. letters,digits,symbols,40 or letters,digits,20. Length must be 1–64. |
--ssh-generate-key <type> | ed25519 (default), rsa, rsa2048, rsa3072, rsa4096. |
--template <path> | JSON template. |
--favorite | Mark as favorite. |
--reveal | Print concealed values in output. |
--dry-run | Preview without creating. |
Login with generated password:
op item create --category=Login --title="Acme" --vault=Work \
--url=https://acme.example.com \
--generate-password=letters,digits,symbols,40 \
[email protected]API Credential with custom fields:
op item create --category="API Credential" --title="Stripe Live" --vault=Prod \
--tags=production,billing \
username=acct_123 \
credential=sk_live_xxx \
"Notes.Webhook URL[url]=https://hooks.acme.com/stripe"Database with section and OTP:
op item create --category=Database --title="Postgres prod" --vault=Prod \
type=postgresql \
username=app \
password=hunter2 \
"Server.host[text]=db.prod.example.com" \
"Server.port[text]=5432" \
"Server.database[text]=app_prod" \
"MFA.totp[otp]=otpauth://totp/Postgres?secret=JBSWY3DPEBLW64TMMQ&issuer=Acme"Login with file attachment:
op item create --category=Login --title="VPN" --vault=Work \
username=jane \
"config[file]=/etc/openvpn/client.ovpn"Secure Note:
op item create --category="Secure Note" --title="Recovery codes" --vault=Personal \
notesPlain="$(cat recovery.txt)"
rm recovery.txtop item editop item edit { <name> | <id> | <shareLink> } [<assignment>...] [flags]Same flags as create minus --category and --ssh-generate-key. Plus a few specifics:
field=newvaluefield[password]field[monthyear]=2026/04section.field[delete]. If a section ends up empty, the section is removed.username=Examples:
op item edit "Acme" --generate-password=letters,digits,symbols,32
op item edit "Acme" --tags=production,external,reviewed
op item edit "Acme" --title="Acme (rotated 2026-04)"
op item edit "Stripe Live" "Notes.Old Key[delete]"op item getop item get [{ <name> | <id> | <shareLink> | - }] [flags]| Flag | Purpose |
|---|---|
--vault <vault> | Limit search scope. Required for service accounts unless piping. |
--fields label=a,label=b | Return specific fields. Supports label=, type=. Comma-separated. |
--otp | Print primary OTP (no secret reference needed). |
--share-link | Print a shareable link for the item. |
--include-archive | Include archived items. |
--reveal | Show concealed values. |
Examples:
op item get "Acme" --fields label=username,label=password --reveal --format=json
op item get Google --otp # current 6-digit code
op item get "Acme" --share-link # shareable URL
op item list --tags work --format=json | op item get - # bulk get from listop item list (alias ls)op item list [flags]| Flag | Purpose | |
|---|---|---|
--vault <vault> | Filter to one vault. | |
--categories Login,Database | Plural, comma-separated. | |
--tags work/client-a | Tag filter; nested tags include children. | |
--favorite | Favorites only. | |
--include-archive | Include archived. | |
--long | More detailed output. | |
| `--format json\ | csv` | Machine-readable. |
op item list --vault Prod --categories Login,Database --format=json
op item list --tags onboarding --format=csvop item delete (aliases remove, rm)op item delete <item> [--archive] [--vault <vault>]--archive: move to Archive instead.op item moveop item move <item> --vault <source> --to-vault <dest>Creates a copy in the destination vault and deletes the original. Permissions on both vaults required.
op item shareop item share <item> [flags]| Flag | Purpose |
|---|---|
--emails [email protected],[email protected] | Restrict to these recipients (else anyone with the link). |
--expires-in 7d | Lifetime — s/m/h/d/w. Default 7d. |
--view-once | Expire after first view. |
--vault <vault> | Source vault. |
op item share "Customer credentials" [email protected] --expires-in=24h --view-onceLimitations: file attachments and Document items can't be shared. Subsequent edits to the item are not reflected in already-shared links.
op item templateop item template list # all categories
op item template get Login # JSON template for Login
op item template get Login --out-file l.jsonUse the template as a starting point for --template or as documentation of available built-in fields per category.
op document — files as itemsDocuments are file attachments stored as their own items. Different from a file field on another item.
op document create ./report.pdf --vault Work --tags 2026,Q1
op document get "report" --vault Work --out-file ./report-from-1pw.pdf
op document edit "report" --file-path ./report-v2.pdf
op document delete "report" --archive
op document listop document create - reads from stdin (use --file-name to set the saved name).
op item get (or pipe the item). They can't search across vaults like an interactive user.rm after.--template overwrites the passkey.--archive is permanent until manually restored.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.