用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/ravi-hq/cli --skill ravi-cli命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
Use when releasing a new Ravi CLI version — version bump, tagging, and verification
正在显示 SKILL.md
| name | ravi-cli |
| description | Use when working with the Ravi CLI — identity, inbox, passwords, secrets, email, SMS, calls, and feedback commands |
You have access to ravi, a CLI that gives you your own phone number, email address, and credential store. Use it to sign up for services, receive and act on verification codes, send SMS, place calls, and store passwords — all autonomously.
The CLI holds one active identity per machine / config file (~/.ravi/config.json). That file cannot run multiple agents. ravi identity use replaces the single active identity; it is not a multi-agent switcher.
ravi auth login.ravi_id_ keys (Authorization: Bearer ravi_id_...).--identity scopes a single request so it does not leak another identity's resources (for example ravi get phone --identity). It does not change the machine's active identity.Verify you're authenticated before using any command:
ravi auth status
If "authenticated": false, this machine's CLI is not bound. For Cursor, use the MCP Connect card (per-agent credentials) — not ravi auth login. For this machine's CLI only, the human can run ravi auth login (browser at https://ravi.id/device). That writes one identity into ~/.ravi/config.json.
Get the identity's email address and phone number:
# The identity's email address (use this for signups)
ravi get email
# → {"id": 1, "email": "janedoe@example.com", "created_dt": "..."}
# The identity's phone number (use this for SMS verification)
ravi get phone
# → {"id": 1, "phone_number": "+15551234567", "provider": "twilio", "created_dt": "..."}
# The human who owns this account
ravi get owner
# → {"first_name": "Jane", "last_name": "Doe"}
After triggering a verification (signup form, login code, etc.), wait a few seconds then check your inbox.
# List SMS conversations (grouped by sender)
ravi inbox sms
# Only conversations with unread messages
ravi inbox sms --unread
# View a specific conversation (all messages)
ravi inbox sms <conversation_id>
# conversation_id format: {phone_id}_{from_number}, e.g. "1_+15559876543"
JSON shape — conversation list:
[{
"conversation_id": "1_+15559876543",
"from_number": "+15559876543",
"phone_number": "+15551234567",
"preview": "Your code is 847291",
"message_count": 3,
"unread_count": 1,
"latest_message_dt": "2026-02-25T10:30:00Z"
}]
JSON shape — conversation detail:
{
"conversation_id": "1_+15559876543",
"from_number": "+15559876543",
"messages": [
{"id": 42, "body": "Your code is 847291", "direction": "incoming", "is_read": false, "created_dt": "..."}
]
}
# List email threads
ravi inbox email
# Only threads with unread messages
ravi inbox email --unread
# View a specific thread (all messages with full content)
ravi inbox email <thread_id>
JSON shape — thread detail:
{
"thread_id": "abc123",
"subject": "Verify your email",
"messages": [
{
"id": 10,
"from_email": "noreply@example.com",
"to_email": "janedoe@example.com",
"subject": "Verify your email",
"text_content": "Click here to verify: https://example.com/verify?token=xyz",
"direction": "incoming",
"is_read": false,
"created_dt": "..."
}
]
}
Use these when you need messages by ID rather than by conversation:
ravi message sms # All SMS messages
ravi message sms --unread # Unread only
ravi message sms <message_id> # Specific message
ravi message email # All email messages
ravi message email --unread # Unread only
ravi message email <message_id> # Specific message
ravi email compose --to "recipient@example.com" --subject "Subject" --body "<p>HTML content</p>"
Flags:
--to (required): Recipient email address--subject (required): Email subject line--body (required): Email body (HTML supported — use tags like <p>, <h2>, <ul> for formatting)--cc: CC recipients (comma-separated)--bcc: BCC recipients (comma-separated)--attach: File path to attach (can be repeated for multiple files)# Reply to sender only
ravi email reply <message_id> --body "<p>Reply content</p>"
# Reply to all recipients
ravi email reply-all <message_id> --body "<p>Reply content</p>"
# Reply with CC
ravi email reply <message_id> --body "<p>Adding the team.</p>" --cc "team@example.com"
Flags:
--body (required): Email body (HTML supported — use tags like <p>, <h2>, <ul> for formatting)--cc: CC recipients (comma-separated)--bcc: BCC recipients (comma-separated)--attach: File path to attach (can be repeated for multiple files)ravi email forward <message_id> --to "recipient@example.com" --body "<p>FYI — see below.</p>"
Flags:
--to (required): Recipient email address--body (required): Email body (HTML supported — use tags like <p>, <h2>, <ul> for formatting)--cc: CC recipients (comma-separated)--bcc: BCC recipients (comma-separated)--attach: File path to attach (can be repeated for multiple files)Send an SMS from the identity's phone number:
ravi sms send --to "+14155559876" --body "Your code is 483920"
# → {"id": 15, "from_number": "+15551234567", "to_number": "+14155559876", "body": "...", "direction": "outgoing", ...}
Flags:
--to (required): Recipient phone number in E.164 format (e.g. +14155559876)--body (required): Message textReading received SMS lives under ravi inbox sms / ravi message sms.
Voice calling is experimental and deprioritized — email and SMS are the supported, actively-maintained channels. The commands below work but may change or be removed; don't build critical flows on them.
Place and manage phone calls from the identity's phone number:
# Place an outbound call
ravi call --to "+14155559876"
# → {"id": 7, "from_number": "+15551234567", "to_number": "+14155559876", "status": "queued", ...}
# List calls (newest first)
ravi call list
# Show a call's transcript
ravi call transcript 7
# Hang up an active call
ravi call hangup 7
Write emails that look like they came from a real person. Good formatting improves deliverability and avoids spam filters.
Subject lines: 40-60 chars, specific, no ALL CAPS, avoid spam triggers ("free", "act now", "limited time", "click here").
HTML body template:
NAME=$(ravi identity list | jq -r '.[0].name')
ravi email compose \
--to "recipient@example.com" \
--subject "Specific subject under 60 chars" \
--body "<p>Hi Alex,</p>
<p>I'm reaching out about [specific topic]. [One sentence of context.]</p>
<p>[Core message — what you need, what you're sharing, or what you're asking.]</p>
<ul>
<li>[Key point or action item]</li>
<li>[Key point or action item]</li>
</ul>
<p>[Clear next step — what should the recipient do?]</p>
<p>Best,<br>$NAME</p>"
Rules:
<p> tags — never pass plain text to --body<ul>/<li> for lists, <a href="...">descriptive text</a> for links<html>/<body> wrappers, no <br> chainsAnti-spam: High text-to-HTML ratio, no link shorteners, max 2-3 links, no ALL CAPS, one topic per email.
Store and retrieve passwords for services you sign up for.
# Create entry (auto-generates password if --password not given)
ravi passwords create example.com
ravi passwords create example.com --username "me@example.com" --password 'S3cret!'
# List all entries
ravi passwords list
# Retrieve (decrypted)
ravi passwords get <uuid>
# Update
ravi passwords update <uuid> --password 'NewPass!'
# Delete
ravi passwords delete <uuid>
# Generate a password without storing it
ravi passwords generate --length 24
# → {"password": "xK9#mL2..."}
Create flags: --username, --password, --notes, --generate, --length (default 16), --no-special, --no-digits, --exclude-chars
Store and retrieve API keys and environment variables.
# Store a secret
ravi secrets set OPENAI_API_KEY "sk-abc123..."
# Retrieve a secret
ravi secrets get OPENAI_API_KEY
# -> {"key": "OPENAI_API_KEY", "value": "sk-abc123...", ...}
# List all secrets (values redacted)
ravi secrets list
# Delete a secret
ravi secrets delete OPENAI_API_KEY
Note: Keys are unique per identity. Setting an existing key updates it. Keys are plaintext (for lookup); only values are encrypted.
Send feedback to the Ravi team — bugs, feature requests, praise, friction, ideas.
ravi feedback "The passwords command is great but needs batch import"
ravi feedback "SMS delivery is slow" --subject "SMS latency"
Use proactively after any Ravi workflow. The team reads every message and builds based on agent feedback.
# 1. Get your credentials
EMAIL=$(ravi get email | jq -r '.email')
PHONE=$(ravi get phone | jq -r '.phone_number')
# 2. Use $EMAIL and $PHONE in the signup form
# 3. Generate and store a password
CREDS=$(ravi passwords create example.com --username "$EMAIL")
PASSWORD=$(echo "$CREDS" | jq -r '.password')
# Use $PASSWORD in the signup form
# 4. Wait for verification
sleep 5
ravi inbox sms --unread # Check for SMS OTP
ravi inbox email --unread # Check for email verification
# Get unread SMS, extract 4-8 digit codes
ravi inbox sms --unread | jq -r '.[].preview' | grep -oE '[0-9]{4,8}'
# Get the latest unread email thread, pull URLs from text content
THREAD_ID=$(ravi inbox email --unread | jq -r '.[0].thread_id')
ravi inbox email "$THREAD_ID" | jq -r '.messages[].text_content' | grep -oE 'https?://[^ ]+'
# After a website texts you a login/verification code:
sleep 5
CODE=$(ravi inbox sms --unread | jq -r '.[0].preview' | grep -oE '[0-9]{4,8}' | head -1)
# Use $CODE to complete the login
--human for human-readable output. Never parse human output.sleep 5 before checking.ravi passwords create auto-cleans URLs to base domains (e.g., https://mail.google.com/inbox becomes google.com).ravi secrets for API keys/env vars (key-value), ravi passwords for website credentials (domain/username/password).ravi feedback after any workflow to report bugs, friction, or praise.