mgonto/executive-assistant-skills/action-items-todoist
Claude Code and agent skill by mgonto/executive-assistant-skills
- community
Checking that the SKILL.md file is still in the repository.
Extract action items from today's Granola/Grain meetings, create Todoist tasks, complete fulfilled tasks, and draft meeting-triggered follow-up emails. Use when running the daily action items cron, post-meeting cron, or when user asks to process meeting action items. NOT for general email drafting without meeting context.
Install
npx vskill@latest install mgonto/executive-assistant-skills/action-items-todoistSKILL.md
Action Items → Todoist + Email Drafts
Config — read before starting
Read ../config/user.json (resolves to ~/executive-assistant-skills/config/user.json). Extract and use throughout:
name,full_name— to identify your action items in meeting notes (e.g. "Gonto (Martin)")whatsapp— for result deliveryworkspace— absolute path to OpenClaw workspace
Do not proceed until you have these values.
Debug Logging (MANDATORY)
Read ../config/DEBUG_LOGGING.md for the full convention. Use python3 {user.workspace}/scripts/skill_log.py action-items <level> "<message>" ['<details>'] at every key step. Log BEFORE and AFTER every external call (gog, mcporter, todoist-cli). On any error, log the full command and stderr before continuing.
Steps
0. Check today's calendar for meetings (BOTH accounts)
Before querying Granola, get today's actual meetings from BOTH calendars to know what to expect:
Log the results: python3 {user.workspace}/scripts/skill_log.py action-items DEBUG "Calendar events found" '{"primary": N, "work": M, "total": N+M}'
Merge events from both calendars. Filter for meetings with attendees (skip solo/personal events). This gives you the ground truth of what meetings happened today — use it to cross-check Granola results and catch any meetings Granola missed.
CRITICAL date syntax: Use explicit ISO8601 dates with -03:00 offset. Do NOT use relative expressions like +1 day, today, or tomorrow in gog flags — they may not be supported. Always compute the actual date strings.
1. Get today's meetings from Granola
Timezone note: Granola stores meeting times in UTC. For ART (UTC-3), querying "today" means using today's date AND tomorrow's date in UTC. E.g., for March 3 ART, query custom_start: "2026-03-03" and custom_end: "2026-03-04" to capture all ART-day meetings.
Collect meeting IDs and titles. Log: python3 {user.workspace}/scripts/skill_log.py action-items INFO "Granola meetings found" '{"count": N, "titles": [...]}'
Cross-check with calendar: Compare Granola meetings against the calendar events from Step 0. If a calendar meeting with attendees has no Granola match (by time overlap within 15 min), log a warning — it may not have been recorded. Proceed with what Granola has, but note unmatched meetings in the output.
Skip if no meetings (from either Granola or calendar).
2. Query Granola for MY action items + email triggers
Pass ALL meeting IDs. Preserve citation links.
3. Create Todoist tasks
Note: Load env in the same command — each shell call is a fresh session.
Read {user.workspace}/skills/todoist-api/SKILL.md for CLI usage. For each action item:
Task description MUST include:
- Meeting name (e.g. "Braintrust Weekly")
- Meeting date and time (e.g. "Wed Mar 5, 15:00 ART")
- Who requested / context
- Granola citation link
Rules:
- Only your actions: Granola summaries often list "next steps" without clear ownership. Be skeptical — if the action could belong to the other person (e.g. "digest their own content", "check availability", "get back to us"), do NOT create a task. When in doubt, create a FOLLOW-UP task ("Ping X about Y") rather than an ownership task.
- Capture commitments from others: If the other person said they'd do something (e.g. "I'll get back in 2 days"), create a follow-up/ping task with the appropriate due date, not a task to do the thing yourself.
- Specificity: Every task MUST include specific name of person/company/project
- Due dates: If implied deadline, use
--duewith natural language - Labels: Tag: intro, follow-up, email, urgent as appropriate
- Priority: 4=urgent/time-sensitive, 3=promised deliverables, 2=general follow-ups, 1=normal
No split tasks for sequential steps (MANDATORY)
Never create separate tasks for steps that are part of the same workflow. If the action is "prepare X then send X" — that's ONE task, not two. Examples:
- ❌ "Build proposal" + "Send proposal" → ✅ "Build and send proposal"
- ❌ "Write draft" + "Send email" → ✅ "Draft and send email to X"
- ❌ "Review deck" + "Share deck" → ✅ "Review and share deck with X"
One task per intent. The user will naturally do the steps in order.
Todo dedup (MANDATORY)
Before creating a task, run a duplicate check against open Todoist tasks:
- Normalize proposed title (lowercase, trim punctuation, collapse whitespace)
- Search open tasks (
source {user.workspace}/.env && todoist-cli list --filter "!completed") and compare normalized content - Treat near-identical intro tasks as duplicates (e.g., "Intro David to Marcos" vs "Intro David (n8n) to Marcos Nils")
- If duplicate exists: do NOT create a new task; append meeting context to the existing task description when useful
- In output, report dedup decisions under
Skipped as duplicates:
4. Draft follow-up emails
For ANY email that needs drafting (intros, follow-ups, VC replies, sending docs, etc.):
- Read and follow `~/executive-assistant-skills/email-drafting/SKILL.md` — it is the single source of truth for all drafting rules, style, templates, humanization, and delivery
- Identify draft triggers from meeting notes:
- Promised intros or follow-ups
- Promised docs/PDFs/decks
- First call with a VC or new lead
- Any promise to email someone
- When in doubt about whether to draft → DRAFT IT
- Exception: The proposal-only commitment rule below overrides this. If the commitment is to build a proposal first, do NOT draft — create a Todoist task only.
- HGP Deck:
{user.workspace}/assets/HGP_Deck_2025.pdf— attach via--attach {user.workspace}/assets/HGP_Deck_2025.pdf. Say "Hypergrowth Partners deck" in the email body (not "one-pager" or "our deck") - When drafting intros to known contacts: search sent emails for previous intros to them, use the same format, tone, and description
Intro-specific hard requirements (MANDATORY)
If action items include intros, follow this exactly:
- Create one separate intro draft per intro pair (never merge multiple intros into one generic follow-up).
- Subject must be explicit:
Intro: <Person A> <> <Person B>. - Body must include:
- one-line who each person is,
- one-line context for why this intro is happening,
- close with
I'll let you two take it from here.and{user.signature}.
- Never replace intro drafts with a generic recap email like "Great meeting today" when intros were promised.
- If recipient emails are known, create Gmail drafts immediately; if any email is missing, still generate the full draft text and report
MISSING_EMAIL: <name>. - In the WhatsApp result, include an
Intro drafts created:section listing each intro pair and whether it was drafted in Gmail or blocked by missing email.
First VC / first dealflow call follow-up (MANDATORY)
When the meeting is a FIRST call with a VC or dealflow company:
- Create a first-meeting follow-up draft (unless blocked by proposal-only rule below).
- Use meeting-specific context in the body (what was discussed, explicit next steps, concrete offers), not generic pleasantries.
- Include your positioning (how you work) and attach
{user.workspace}/assets/HGP_Deck_2025.pdfwhen relevant. - Allowed to use "Great meeting today" only for this first-meeting follow-up class.
Proposal-only commitment rule (MANDATORY)
If you committed to "build a proposal" (or equivalent: proposal/deck/scope draft to prepare first):
- Do NOT draft an outbound email yet.
- Create a single Todoist task to build AND send the proposal — e.g. "Build and send advisory proposal to Gabriel (BairesDev)".
- Do NOT create separate tasks for "build" and "send" — that's redundant. One task covers the full lifecycle.
5. Check if existing Todoist tasks were fulfilled in today's meetings
After processing action items, also check if any existing open Todoist tasks were addressed/completed during today's meetings:
- List open tasks:
source {user.workspace}/.env && todoist-cli list - For each meeting, check if the discussion covered or fulfilled any open task (e.g., "Share AI strategy with Colin" → discussed AI strategy directly with Colin in the call)
- If a task was clearly fulfilled in the meeting, complete it:
source {user.workspace}/.env && todoist-cli complete <task_id> - Report completed tasks in the output: "✅ Completed: [task] — fulfilled during [meeting name]"
This ensures Todoist stays clean and reflects what actually happened.
Error handling
- If
gog calendarfails: log the error with full command + stderr (python3 {user.workspace}/scripts/skill_log.py action-items ERROR "gog calendar failed" '{"command": "...", "stderr": "..."}'), continue with the other account and/or Granola-only. - If
mcporter call granolafails with auth errors: report "⚠️ Granola auth expired, runmcporter auth granola --reset" and stop. - If
todoist-clifails: verify.envis sourced and token is valid. Report error. - If Grain MCP is unavailable: proceed with Granola-only extraction, note in output "⚠️ Grain unavailable, results are Granola-only."
- If any step fails, continue with remaining steps when possible — don't abort the entire run for one failure.
Deduplication (CRITICAL — prevents duplicate tasks)
Meeting-level dedup
- FIRST STEP before any processing: Read
{user.workspace}/state/processed-meetings-YYYY-MM-DD.json(if it exists — array of Granola meeting IDs) - Skip any meetings whose ID is already in that list — do NOT re-process them
- Immediately after processing each meeting (before moving to the next), append its Granola meeting ID to the file. Do NOT wait until the end — write after each meeting to prevent races with other crons.
- This file is the single source of truth for "was this meeting already processed today?"
Note: Titles are fragile for recurring meetings that share the same name. Always dedup by Granola meeting ID.
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingaction-items-todoist/SKILL.md
Popularity
- Repository stars
- 118
- Repository forks
- 12
- 7-day trend score
- 24
Stars and forks are for the whole GitHub repository, not this skill alone. Refreshed 20 Mar 2026, 7 months ago.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/mgonto/executive-assistant-skills/action-items-todoist)