| name | todoist-due-drafts |
| description | Check Todoist for tasks due today (and overdue) that involve pinging, emailing, or following up with someone. Auto-draft the emails using meeting context and notify via WhatsApp. Use when running the daily due-drafts cron, or when user asks to process email tasks from Todoist. |
| version | 1.8.0 |
| license | MIT |
| author | Martin Gontovnikas <martin@hypergrowthpartners.com> |
| tags | ["business","todoist-due"] |
| allowed-tools | Read, Bash(gog:*), Bash(mcporter:*), Bash(todoist-cli:*), Bash(python3:*), Bash(source:*), Glob, Grep, Write |
| compatibility | Designed for Claude Code |
Todoist Due-Today Email Drafts
Config — read before starting
Read ../config/user.json (resolves to ~/executive-assistant-skills/config/user.json).
Extract and use throughout:
primary_email, work_email — Gmail accounts
whatsapp — for notification delivery
workspace — absolute path to OpenClaw workspace
signature — email signature
Debug Logging (MANDATORY)
Read ../config/DEBUG_LOGGING.md for the full convention. Use python3 {user.workspace}/scripts/skill_log.py todoist-due-drafts <level> "<message>" ['<details>'] at every key step. Log BEFORE and AFTER every external call (todoist-cli, gog, mcporter). On any error, log the full command and stderr before continuing.
Steps
1. Get today's due tasks from Todoist
source {user.workspace}/.env
todoist-cli today --json
Also check overdue tasks:
todoist-cli list --filter "overdue" --json
2. Identify email/ping tasks
Filter for tasks whose content matches outreach intent:
- Keywords:
ping, email, follow up, follow-up, send, reach out, text, message, intro, connect, check in, nudge, reply, respond, draft
- Pattern: any task that implies sending a communication to a specific person
Skip tasks that are clearly NOT outreach (e.g. "review doc", "read report", "build proposal").
3. For each outreach task, draft the email
Read and follow ~/executive-assistant-skills/email-drafting/SKILL.md for all drafting rules.
For each task:
-
Identify the recipient: Extract person/company name from task content + description
-
Pull meeting context (if available): If the task description references a meeting name, date, or was created by the action-items cron (check for Granola citation links or meeting metadata in description), retrieve the transcript via Granola/Grain. If no meeting reference exists in the task, skip directly to step 3 — draft from email history and task content alone.