skills/start-of-day/SKILL.md
--- Skill name: start-of-day Skill description: Morning triage of Slack unreads, Gmail inbox, Google Calendar, and comments/notifications from Figma, Google Drive, Linear, and Notion. Presents each item with options to reply, mark as read, save for later, or accept/decline events. Use when asked to start the day, check inbox, morning triage, or catch up. --- # Start of Day Triage Slack, Gmail, Google Calendar, and comments/notifications from Figma, Google Drive, Linear, and Notion in one inter
npx skillsauth add abhiroopb/synthetic-mind skills/start-of-dayInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Triage Slack, Gmail, Google Calendar, and comments/notifications from Figma, Google Drive, Linear, and Notion in one interactive session.
This skill auto-triggers if it hasn't run in the past 12 hours. The timestamp file is ~/.config/start-of-day/last-run.
After completing the full triage, write the current timestamp:
mkdir -p ~/.config/start-of-day && date -u +%Y-%m-%dT%H:%M:%SZ > ~/.config/start-of-day/last-run
Run through five sections in order:
stars.list + reminders.list APIs, falls back to screenshots for newer "Later" items)After presenting each section, pause and let the user act before moving to the next.
Do NOT ask "what would you like to do?" after presenting each section. Instead, immediately start going through items one by one, proactively drafting responses for each:
This creates a fast inbox-zero flow where the user just approves/edits/skips each item in sequence.
IMPORTANT: The user may have thousands of channels across workspaces. DO NOT iterate through all channels — it will time out and get rate-limited. Use the bundled hybrid search script instead.
Run the find-slack-unreads.py script which uses a fast hybrid strategy:
search.messages API to find recently active conversations (DMs, mentions, etc.)conversations.infouv run {{SKILL_DIR}}/scripts/find-slack-unreads.py workspace1 workspace2 workspace3
To scan only specific workspaces, pass them as arguments.
The output is JSON with this structure:
{
"ok": true,
"total_unreads": 5,
"total_channels": 4,
"unreads": [
{
"channel_id": "D06CVPY5N57",
"display_name": "Jane Doe",
"is_im": true,
"is_mpim": false,
"is_channel": false,
"unread_count": 1,
"latest_text": "how are you holding up?",
"latest_user_name": "Jane Doe",
"workspace": "workspace1"
}
]
}
For each unread conversation, fetch recent messages for preview:
your-slack-cli get-channel-messages \
--channel-id <CHANNEL_ID> --workspace <WS> --limit 5
Display unread Slack messages as a numbered list, grouped by workspace and channel/DM:
## 💬 Slack Unreads (5 messages across 2 workspaces)
### Workspace1 — #your-team-channel (2 unread)
1. **Sarah Kim** (2h ago): "Hey team, can someone review the PR for the new tip..."
2. **Mike Chen** (3h ago): "The staging deploy looks good, I tested the happy path..."
### Workspace1 — DM: Jane Doe (1 unread)
3. **Jane Doe** (1h ago): "Quick question about the redesign — are we still..."
### Workspace2 — #your-engineering-channel (2 unread)
4. **Bot: Monitoring** (30m ago): "[ALERT] Latency spike on your-service p99..."
5. **Alex Rivera** (1h ago): "Deployed the hotfix, monitoring now..."
Slack actions:
- Reply to a message (I'll draft a reply for you) — e.g., "reply to 3"
- Mark as read — e.g., "mark 1-2, 4 as read" or "mark all as read"
- Save for later — e.g., "save 3" (adds 🔖 reaction)
- Skip — move on to Gmail
Use your Slack CLI to mark the channel as read at the given message timestamp.
Use your Slack CLI to add a bookmark emoji reaction to the message.
Fetch both unread and read emails in the inbox. Make two parallel calls:
mcp__gmail__search_tool(label="Inbox", only_is_unread=true, max_results=25, timezone="America/Los_Angeles")
mcp__gmail__search_tool(label="Inbox", only_is_read=true, max_results=20, timezone="America/Los_Angeles")
Combine results into a single list. Unread emails come first, then read emails. De-duplicate by message ID if any overlap.
Display all inbox emails as a single numbered list, grouped by read status and then by importance. For each email show:
Categorize into sections:
## 📧 Gmail Inbox (12 emails — 3 unread, 9 read)
### 🔵 Unread
#### From People
1. 🔵 **Sarah Kim** <[email protected]> (2h ago)
"Re: Product redesign Q1 plan" — "Thanks for the updated timeline. One question about the..."
#### Automated / Notifications
2. 🔵 **GitHub** (1h ago) — "[your-org/your-repo] PR #4521 merged"
3. 🔵 **Monitoring** (3h ago) — "[ALERT] your-service latency p99 > 500ms"
### Read but Still in Inbox
#### From People
4. **External Contact** <[email protected]> (2d ago)
"Re: Feature not working" — "Login email: [email protected]..."
#### Automated / Notifications
5. **Figma** (2d ago) — "2 new comments in Your Design File"
6. **Google Docs** (2d ago) — "Your Document: ... Someone replied"
Go through each email one at a time (unread first, then read). For each email:
mcp__gmail__read_message_tool with the message ID.What do you want to do?
- Send reply (draft a reply)
- Mark as read (only shown for unread emails)
- Archive (remove from inbox)
- Save for later (labels "1. To Do" + archives)
- Skip (leave in inbox)
For bot/automated emails (GitHub, monitoring, Calendar invites, Figma notifications), skip the draft and just offer options 2–5.
mcp__gmail__create_draft_toolmcp__gmail__mark_as_read_tool(message_id=<ID>)
mcp__gmail__archive_tool(message_id=<ID>)
mcp__gmail__add_label_tool(message_id=<ID>, label="1. To Do")
mcp__gmail__archive_tool(message_id=<ID>)
mcp__gcal__list_events(calendarId="primary", timeMin=<today_start_iso>, timeMax=<today_end_iso>, timezone="America/Los_Angeles")
Display today's schedule as a timeline, flagging conflicts:
## 📅 Today's Schedule (7 events)
| Time | Event | Status |
|------|-------|--------|
| 9:00-9:30 | Standup | ✅ Accepted |
| 10:00-10:30 | 1:1 with Manager | ✅ Accepted |
| 10:30-11:00 | Design Review | ⚠️ Needs RSVP |
| 11:00-12:00 | ⚠️ CONFLICT: Sprint Planning + Customer Call | ❌ Overlap! |
| 1:00-2:00 | Lunch (blocked) | — |
| 2:00-3:00 | Engineering Sync | ✅ Accepted |
| 4:00-4:30 | New: Product Review | ⚠️ Needs RSVP |
For events needing RSVP:
Event: Design Review (10:30-11:00)
- Organizer: Jane Doe
- Description: "Review the latest mockups..."
(1) Accept (2) Decline (3) Tentative (4) Skip
mcp__gcal__respond_to_event(calendarId="primary", eventId=<ID>, response="accepted")
uv run {{SKILL_DIR}}/scripts/find-slack-saved.py
This script calls stars.list and reminders.list and returns both in a combined JSON output.
Compile saved items and active (non-completed) reminders into a numbered list:
## 🔖 Slack Saved & Later Items (X items)
### Active Reminders
1. 🔔 **Reminder** (overdue by 3d) — "#your-team-channel: Can someone review the PR..." — from **Sarah Kim**
2. 🔔 **Reminder** (due today) — "DM: Follow up with Martin about..."
### Saved Messages
3. 🔖 **#your-engineering-channel** — "Offline payments edge case discussion..." — **Team Member** (saved 2d ago)
4. 🔖 **DM: Colleague** — "Link to the design doc..." (saved 1w ago)
Actions:
- Complete reminder — e.g., "complete 1-2"
- Unstar/unsave — e.g., "unsave 3" (removes star)
- Reply via Slack — e.g., "reply to 4"
- Skip — move on
Use your Slack CLI to complete reminders, remove stars, or post replies.
Fetch recent unresolved comments and notifications from Figma, Google Drive, Linear, and Notion. Run all four fetches in parallel since they are independent.
Fetch comments from recently active Figma files. Use the user's Gmail to find recent Figma notification emails, then extract file keys:
FIGMA_TOKEN="$(cat ~/.config/figma/token 2>/dev/null)"
Search Gmail for recent Figma comment notifications to discover active files:
mcp__gmail__search_tool(from_sender="[email protected]", newer_than_days=7, max_results=10, label="all", timezone="America/Los_Angeles")
Extract Figma file keys from the email subjects/bodies (format: figma.com/design/<FILE_KEY>/...), then fetch comments for each file:
curl -sH "X-Figma-Token: $FIGMA_TOKEN" \
"https://api.figma.com/v1/files/<FILE_KEY>/comments" | python3 -c "
import json, sys
data = json.load(sys.stdin)
comments = [c for c in data.get('comments', []) if not c.get('resolved_at')]
for c in comments:
print(json.dumps({'id': c['id'], 'message': c['message'], 'user': c['user']['handle'], 'created': c['created_at'], 'file_key': '<FILE_KEY>'}))"
Search for recently modified Google Docs/Sheets/Slides, then fetch unresolved comments using your Google Drive CLI.
Filter to show only unresolved comments (where resolved is false/null) from the last 7 days.
Fetch issues assigned to the user or where the user was mentioned recently:
mcp__linear__linear_getViewer() → get the user's ID
mcp__linear__linear_searchIssues(assigneeId=<USER_ID>, limit=20)
For each issue, check for recent comments:
mcp__linear__linear_getComments(issueId=<ISSUE_ID>, limit=5)
Show comments from the last 7 days that were NOT authored by the user.
For recent Notion pages the user is active on, use the Notion MCP to fetch discussions:
mcp__notion__notion_fetch(id=<PAGE_ID>, include_discussions=true)
Search Gmail for Notion comment notifications to discover pages with activity:
mcp__gmail__search_tool(from_sender="[email protected]", newer_than_days=7, max_results=10, label="all", timezone="America/Los_Angeles")
Group comments by source, then by file/issue. Show only unresolved/recent items:
## 💬 Comments & Notifications (12 items across 4 sources)
### 🎨 Figma (3 comments)
1. **Designer** in "Your Design File v3" (2h ago)
"Can we move the selector above the total?" — node: Frame 42
### 📝 Google Docs (4 comments)
4. **Colleague** in "Your PRD" (1h ago)
"Should we include the fallback behavior for offline?" — unresolved
### 🔷 Linear (3 notifications)
7. **Team Member** on PROJ-142 "Add feature buttons" (30m ago)
"PR is ready for review — can you take a look at the API changes?"
### 📓 Notion (2 comments)
10. **Colleague** in "Your Roadmap" (1d ago)
"Can we add the dependency on the other team?" — discussion://abc123
Comment actions:
- Reply to a comment — e.g., "reply to 4" (I'll draft a reply)
- Resolve — e.g., "resolve 4-6" (marks Google Docs/Figma comments as resolved)
- Open — e.g., "open 1" (opens the file/issue in browser)
- Skip — move on
Open the source file/issue in the default browser:
open "https://www.figma.com/design/<FILE_KEY>?node-id=<NODE_ID>"
open "https://docs.google.com/document/d/<DOC_ID>"
open "https://linear.app/your-team/issue/<ISSUE_ID>"
open "https://www.notion.so/<PAGE_ID>"
America/Los_Angeles (Pacific) for all time displays.testing
Track TV shows and movies with Trakt.tv. Search, get watchlist, history, up-next, recommendations, trending, calendar, ratings, stats, add/remove from watchlist, mark watched, rate, and check in. Use when asked about what to watch, TV shows, movies, watch history, or Trakt.
development
Send and receive SMS messages via Twilio API. Used for text message notifications, forwarding important alerts, and two-way SMS communication.
documentation
Organizes files in the local Downloads folder into proper folders. Use when asked to organize, sort, or file downloaded documents.
tools
Book and manage appointments on Sutter Health MyHealth Online portal. Uses browser automation via Playwright MCP to interact with the patient portal.