From ops
Full inbox management across all channels — WhatsApp (wacli), Email (Gmail MCP), Slack (MCP), Telegram (user-auth MCP). Scans FULL inbox (not just unread), identifies messages needing replies, archives handled conversations.
npx claudepluginhub auroracapital/claude-opsThis skill is limited to using the following tools:
```!
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Guides building MCP servers enabling LLMs to interact with external services via tools. Covers best practices, TypeScript/Node (MCP SDK), Python (FastMCP).
Share bugs, ideas, or general feedback.
${CLAUDE_PLUGIN_ROOT}/../../bin/ops-unread 2>/dev/null || echo '{}'
All channel credentials come from env vars or CLI auth — no hardcoded secrets.
| Variable | Default | Purpose |
|---|---|---|
GMAIL_ACCOUNT | auto-detect | Gmail account for gog CLI |
SLACK_MCP_ENABLED | false | Set true when Slack MCP server is configured |
TELEGRAM_ENABLED | false | Set true when Telegram user-auth MCP is configured |
WACLI_STORE | ~/.wacli | wacli store directory |
Do NOT just check unread. Scan the FULL recent inbox for each channel and classify every conversation:
For each channel, detect availability at runtime:
gog CLI first. If gog unavailable, try mcp__gog__gmail_* MCP tools. If neither, report unavailable.wacli CLI. Check wacli doctor for auth/connection status. If outdated (405 error), advise brew reinstall --HEAD steipete/tap/wacli or build from source.mcp__claude_ai_Slack__*). Check SLACK_MCP_ENABLED env var.TELEGRAM_ENABLED env var. Never use BotFather bots.Parse pre-gathered data for initial counts (unread is just a starting signal).
For each channel, run a FULL scan (not just unread):
in:inbox (not is:unread) via gog gmail search -a $GMAIL_ACCOUNT -j --results-only --no-input --max 30 "in:inbox". For each thread, read the last message to determine who sent it last. Check for DRAFT or SENT labels. Before suggesting to send a draft, verify no reply was already sent in the thread.wacli chats list --json to get all chats. Filter to non-archived chats with LastMessageTS in the last 7 days. For each, fetch last 3-5 messages via wacli messages list --chat <JID> --limit 5 --json. Parse data.messages[] with fields FromMe, Text, Timestamp, ChatName. Classify by last message FromMe field.Display the full inbox:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
OPS ► INBOX MANAGER
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📱 WhatsApp [N need reply] | [N waiting] | [N archive]
📧 Email [N need reply] | [N waiting] | [N FYI]
💬 Slack [N need reply] | [N waiting]
✈️ Telegram [N need reply] | [N waiting]
──────────────────────────────────────────────────────
Process:
a) All channels (fastest — one pass)
b) WhatsApp only
c) Email only
d) Slack only
e) Telegram only
f) Skip — already done
→ Pick a channel or letter
──────────────────────────────────────────────────────
Use AskUserQuestion. Then process the selected channel(s).
wacli chats list --jsonLastMessageTS in the last 7 dayswacli messages list --chat "<JID>" --limit 5 --jsondata.messages[] — fields: FromMe, Text, Timestamp, ChatName, SenderNameFromMe: false (they sent last)FromMe: true (you sent last)Display NEEDS REPLY chats first:
📱 WHATSAPP — NEEDS REPLY
1. [Contact] — [last msg preview] — [time ago]
2. [Contact] — [last msg preview] — [time ago]
📱 WHATSAPP — WAITING (no action needed)
3. [Contact] — you said: "[preview]" — [time ago]
For each NEEDS REPLY:
a) Read full thread + reply
b) Archive (no reply needed)
c) Skip
Reply via: wacli send --to "<JID>" --message "<msg>"
wacli troubleshooting:
@lid JIDs (linked device format) may return empty messages — run wacli sync to backfillcd /tmp && git clone https://github.com/steipete/wacli.git && cd wacli && go build -o wacli ./cmd/wacli/ && cp wacli /usr/local/bin/kill $(pgrep wacli)wacli auth logout && wacli authin:inbox (NOT is:unread) via gog gmail search -a $GMAIL_ACCOUNT -j --results-only --no-input --max 30 "in:inbox"gog gmail read -a $GMAIL_ACCOUNT -j --no-input "<thread_id>"From header and labelIds (SENT, DRAFT)Display NEEDS REPLY threads first:
📧 EMAIL — NEEDS REPLY
1. [Sender] — [Subject] — [time ago]
Preview: [first 100 chars]
📧 EMAIL — DRAFTS (unsent)
N. [Recipient] — [Subject] (draft ready to send)
📧 EMAIL — FYI / ARCHIVE
N. [Sender] — [Subject] (newsletter/notification)
For each NEEDS REPLY:
a) Read full thread + draft reply
b) Archive (no reply needed)
c) Skip
For FYI section:
x) Archive all FYI at once
Draft replies via gog gmail send. Archive via gog gmail labels modify --remove INBOX <thread_ids>.
Use Slack MCP tools with query: "is:unread" for mentions.
For each result, show channel, sender, preview. Read thread for context.
a) Read thread
b) Reply
c) Mark read / skip
Telegram integration must authenticate as the user's personal account (user-auth via tdlib/MTProto), NOT a BotFather bot. The goal is to manage real conversations just like WhatsApp via wacli.
Use the Telegram user-auth MCP server if available.
✈️ TELEGRAM — NEEDS REPLY
1. [Contact] — [preview] — [time ago]
a) Read thread + reply
b) Archive
c) Skip
If no Telegram user-auth tool is available, report: "Telegram not configured — needs user-auth MCP server (tdlib/MTProto)".
After all selected channels are processed, print:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
INBOX ZERO ✓ — [timestamp]
Processed: [N] messages | Replied: [N] | Archived: [N]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
If $ARGUMENTS specifies a channel (e.g. whatsapp), skip the menu and go directly to that channel.