From claude-pa
Place an outbound Vapi phone call to the user, their spouse, a named friend from the config, or an ad-hoc number. ALWAYS attaches a context-rich `reason` (what Claude is stuck on, why the user is needed) plus optional repo / idle-minutes / last-tag. Supports round-robin calling — Claude can dial through a list of friends in sequence until someone picks up. Use when the in-room escalation cascade has failed, when the user has explicitly asked to be phoned, or when Claude has a status update important enough to warrant a phone call. NEVER place a call without a real reason — a generic "they're not at their desk" call is worse than not calling.
How this skill is triggered — by the user, by Claude, or both
Slash command
/claude-pa:place-callThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
The dispatcher assistant in Vapi (`vapi.assistant_id` in config) only knows
The dispatcher assistant in Vapi (vapi.assistant_id in config) only knows
who it's calling and what about via the variables we pass at call time.
Without a reason, it falls back to a generic line. Always assemble a real
reason before firing the call.
user — rings the user's own phone (direct escalation)spouse — rings their spouse to passive-aggressively pass on the messagefriend — rings a named entry from config.friends[]adhoc — one-shot call to a number not in config (use sparingly)target: one of the abovereason (REQUIRED): one or two plain-English sentences. Examples:
friend: name (must match a friends[].name in config; case-insensitive)adhoc: name AND phone (E.164, e.g. +972...)repo, idle_minutes, last_tag.user — calling
the spouse or a friend is more invasive.$CLAUDE_PA_HOME/config.json and confirm the
named friend exists in .friends[]. If they don't, ask the user for the
phone number first and either add via /claude-pa:add-friend or use
target=adhoc for a one-shot call.cwd is usually enough)
Write it as a short, factual sentence — the assistant will paraphrase.$CLAUDE_PA_HOME/config.json:
vapi.assistant_id is set (otherwise tell the user to run
/claude-pa:setup-vapi-assistant first).*.enabled is true (or friends_calls.enabled for
friend/adhoc).$CLAUDE_PLUGIN_ROOT/bin/pa-phone-call.sh <target> --confirm \
--reason "<assembled reason>" \
[--name "<friend or adhoc name>"] \
[--phone "<E.164 number, adhoc only>"] \
[--repo "<repo>"] [--idle-minutes <N>] [--last-tag "<tag>"]
call_id returned by the script.When the user says "round-robin everyone" or "keep calling people until
someone picks up", iterate through .friends[] (and optionally spouse +
user) in order:
Bash with a sleep — but offer to skip the wait
if the user wants to fire all at once).$CLAUDE_PA_LOG_DIR/phone-calls.log and, if needed, the Vapi
dashboard to see if the previous call connected.The same reason string can be passed to every call, or you can tailor it
("you're being escalated to because nobody else picked up") on later calls.
Do NOT machine-gun every contact in parallel — that's a bad idea both socially and for the Vapi rate limit. One call at a time, with a beat in between.
--reason. The script will exit 15 if you try.user unless the user has explicitly asked to escalate further.VAPI_API_KEY into config or any repo file.npx claudepluginhub danielrosehill/claude-code-plugins --plugin claude-paCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.