About email-triage
email-triage is a Gmail Commander skill for classifying recent email by category and urgency. It documents the on-demand `/digest` pipeline and distinguishes it from the separate scheduled digest service.
Key features
- 01Groups mail into three categories
- 02Ranks urgency from critical to low
- 03Fetches recent email through Gmail CLI
- 04Filters contaminated model responses
- 05Formats results as a digest
Use cases
- 01Reviewing important email from recent hours
- 02Separating security alerts from work mail
- 03Requesting an on-demand digest in Telegram
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ terrylica/ cc-skills --skill email-triageAfter installing, type/email-triagein Claude Code to confirm it loaded.
Bundled filesreferences/evolution-log.md
Details
From the project READMEEmail Triage
How Gmail Commander sorts recent email into what needs attention, and where each digest actually comes from.
Self-Evolving Skill: This skill improves through use. If instructions are wrong, parameters drifted, or a workaround was needed — fix this file immediately, don't defer. Only update for real, reproducible issues.
Two different digests — do not confuse them
| Digest | Trigger | Code |
|---|---|---|
On-demand /digest [hours] | A user sends it to the bot (default 6 h) | This plugin: scripts/lib/commands.ts + scripts/lib/triage.ts |
| Scheduled digest | Several times a day, unattended | The private deployment's GmailDigest service — its own implementation |
The scheduled digest runs in a private Restate tenant on an always-on Mac mini and does not import this plugin's triage code. Its schedule, prompt, alerting and failures are operated through that deployment's own repository runbook.
This plugin no longer ships a scheduled digest entry point: the laptop launchd job com.example.gmail-commander-digest was retired on 2026-09-24, and its scripts/digest.ts (with the Kokoro podcast-style voice briefing in scripts/lib/tts-client.ts) was removed on 2026-09-26 once nothing imported it. Do not recreate either.
Mandatory Preflight
Step 1: Check the triage code exists
PLUGIN="$HOME/.claude/plugins/marketplaces/cc-skills/plugins/gmail-commander"
ls -la "$PLUGIN/scripts/lib/triage.ts" 2>/dev/null || echo "TRIAGE_NOT_FOUND"
Step 2: Verify the Gmail CLI binary (the triage input comes from it)
ls -la "$HOME/.claude/plugins/marketplaces/cc-skills/plugins/gmail-commander/scripts/gmail-cli/gmail" 2>/dev/null || echo "BINARY_NOT_FOUND"
If BINARY_NOT_FOUND: Build it from the committed lockfile:
cd "$HOME/.claude/plugins/marketplaces/cc-skills/plugins/gmail-commander/scripts/gmail-cli" && bun install --frozen-lockfile && bun run build
Three-Category Triage System
| Category | Examples |
|---|---|
| SYSTEM & SECURITY | Exchange alerts, 2FA codes, password resets, new device logins |
| WORK | Deadlines, invoices, contracts, GitHub PRs, professional requests |
| PERSONAL & FAMILY | Friends/family messages, appointments, vehicle service, health |
Urgency levels within each: CRITICAL > HIGH > MEDIUM > LOW. When nothing qualifies, the model answers exactly NO_SIGNIFICANT_EMAILS and the bot reports a quiet window.
Pipeline (/digest [hours])
fetchRecentEmails(hours)runsgmail search newer_than:<hours>h -n 50 --jsonthroughGMAIL_CLI_BIN.formatEmailsForTriage()renders the messages;ANTI_SKILL_PREFIXis prepended so the model ignores any skill or tool listings in its context.- One Agent SDK call with
TRIAGE_SYSTEM_PROMPTonHAIKU_MODEL(no tools, one turn). isSkillContaminated()discards a response that role-plays a skill instead of triaging.parseTriageResponse()turns the text into typed items, andformatDigestHtml()renders them with the category and urgency emoji maps.
Source Map
| Concern | File |
|---|---|
| System prompt, anti-skill prefix, parser | scripts/lib/triage.ts |
/digest command handler | scripts/lib/commands.ts |
| Category/urgency emoji maps, digest HTML | scripts/lib/telegram-format.ts |
| Gmail fetch | scripts/lib/gmail-client.ts |
Post-Change Checklist
- YAML frontmatter valid (no colons in description)
- Trigger keywords current
- Path patterns use $HOME not hardcoded paths
-
lib/triage.tsexports unchanged in shape (the bot and its deployment import them)
Post-Execution Reflection
After this skill completes, reflect before closing the task:
- Locate yourself. — Find this SKILL.md's canonical path before editing.
- What failed? — Fix the instruction that caused it.
- What worked better than expected? — Promote to recommended practice.
- What drifted? — Fix any script, reference, or dependency that no longer matches reality.
- Log it. — Evolution-log entry with trigger, fix, and evidence.
Do NOT defer. The next invocation inherits whatever you leave behind.