Skip to content
All Skills

Today

Plan today's work using this repo's workflow. Use when the user asks for /today or phrases like "plan my day", "today's plan", "set my priorities", or "start my day".

Personal Productivity|v1|Updated 7/14/2026|GitHub source
MCP get_skill({ skillId: "today-af6c4cba" })

Use this skill with your agent

Create a free account and connect via MCP

Get Started Free
# Today Planning

Act like a personal assistant. Ask clarifying questions when anything is unclear. Always get confirmation before writing files.

**Flexible date support:** This workflow can plan for today OR a specific future date (e.g., "plan tomorrow", "plan for Thursday"). Adjust the target date accordingly while following the same workflow.

## Configuration

### VIP Contacts (customize these!)

**VIP Contacts (attendees)** - meetings with these people require advance preparation:
- manager@company.com (Manager)
- skip-manager@company.com (Skip manager)
- executive@company.com (Leadership)

**VIP Organizers** - meetings FROM these organizers require prep:
- team-rob-calendar@company.com (Team RoB Calendar)

### Calendar Access

Choose ONE of these methods (configure in "Calendar Setup" section below):
1. **iCal URL** (recommended) - No auth needed, read-only
2. **WorkIQ MCP** - If you have it configured, can also search Teams

### Timezone

Default: Pacific Standard Time. Change if needed.

### Folder Paths

- Daily notes: `work/daily/`
- Goals: `work/goals/`
- Reflections: `work/reflections/`
- Backlog: `work/backlog/BACKLOG.md`
- Meeting preferences: `work/context/meeting-preferences.md`

## Calendar Setup

### Option 1: iCal URL (Recommended)

Get your Outlook calendar's iCal URL:
1. Go to Outlook on the web → Settings → Calendar → Shared calendars
2. Under "Publish a calendar", select your calendar and "Can view all details"
3. Click "Publish" and copy the ICS link
4. Set it below:

**Your iCal URL:**
```
https://outlook.office365.com/owa/calendar/YOUR_CALENDAR_ID/YOUR_SECRET/calendar.ics
```

To fetch and parse the calendar (cross-platform — works on Windows, macOS, Linux):
```python
import re
import os
import tempfile
import urllib.request
from datetime import date

ical_url = 'YOUR_ICAL_URL'
ical_path = os.path.join(tempfile.gettempdir(), 'calendar.ics')
urllib.request.urlretrieve(ical_url, ical_path)
```

### Option 2: WorkIQ MCP

If WorkIQ is configured, query calendar directly:
```
Ask WorkIQ: "What meetings do I have on [date]? Include meeting titles, times, organizers, and attendees."
```

## Workflow

1) Read yesterday's daily note in `work/daily/` (account for weekends or time off).

2) Read the current quarter goals in `work/goals/` (most relevant goals file).

3) Read the most recent reflection in `work/reflections/` (by date in filename).

4) **Check for VIP meetings (next business day):**
   - Read VIP list from configuration above
   - Determine next business day (if Friday/weekend → Monday, else → tomorrow)
   - Fetch that day's calendar via iCal or WorkIQ
   - **For EACH meeting, check BOTH (do not skip!):**
     1. Check organizer against VIP organizer emails
     2. Check attendees against VIP contact emails
   - If either match found, alert prominently: "⚠️ VIP MEETING: [name] with [VIP] on [date] at [time] - prepare!"
   - Ask if user wants to add prep tasks to today's TODOs

5) **Check calendar for conflicts:**
   - Fetch calendar via iCal URL or WorkIQ
   - **CRITICAL: ALL times must be displayed in user's local timezone**
   - Filter out: cancelled, all-day events
   - Detect overlapping meetings (any two events where one starts before the other ends)
   - Group conflicts by time slot for cleaner presentation
   - **CRITICAL: Use markdown file for conflict decisions, NOT AskUserQuestion tool**
     - Create `work/daily/YYYY-MM-DD-triage.md` with checkbox format
     - User prefers batch decision-making in a single file over multiple dialog prompts
     - Open file in VS Code: `code <filepath>`
     - Wait for user to edit and confirm
   - Note: iCal is read-only. For declining meetings, user must do so manually in Outlook after reviewing the triage file.

6) Read `work/backlog/BACKLOG.md` and triage every item:
   - Pull into today's TODOs (tag `[pulled]`).
   - Delegate (ask who, tag `[delegated:Name]`).
   - Someday (tag `[someday:YYYY-MM-DD]`; if the user says "someday" without a date, default to the same day next month).
   - If a `[someday:YYYY-MM-DD]` item is due or past due, surface it again for triage.
   - Check for TODOs captured via hotkey (format: `- [ ] <text> (captured YYYY-MM-DD)` at end of file). Triage these too.

7) (Optional) Read mobile backlog from Apple Notes:
   ```bash
   osascript -e 'tell application "Notes" to get body of note "Work Todo Backlog"'
   ```
   Include any items from this note in the triage process alongside the repo backlog.

8) (Optional) **Search Teams for tagged commitments** (requires WorkIQ):
   - Use WorkIQ to search for messages containing custom tags like `#your-todo`
   - Query: "Search all my Teams chats and messages for #your-todo from the past week"
   - **IMPORTANT: Only include messages where user is the sender**
   - Surface any new items found and include in triage alongside backlog items
   - **Always include the Teams message link** for context
   - Format: `- [ ] [commitment text] ([link to message](url))`

9) **Generate triage markdown file** (`work/daily/YYYY-MM-DD-triage.md`):
   Create a markdown file for user to review and make decisions. Structure:
   ```markdown
   # Day Triage: YYYY-MM-DD

   ## Overview
   - Day of week, date
   - Count of meetings, conflicts, backlog items
   - Key highlights (VIP meetings, overdue items, etc.)

   ## VIP Alerts (Tomorrow)
   ⚠️ List any VIP meetings for next business day with prep recommendations

   ## Calendar Conflicts
   For each conflict slot, show:
   ### Slot N: HH:MM-HH:MM
   | Keep | Meeting | Time | Organizer | Attendees | Notes |
   |------|---------|------|-----------|-----------|-------|
   | [ ] | Meeting name | start-end | email | count | VIP/1:1/etc |

   **Recommendation:** [suggested keep] because [reason]
   **Your choice:** ___
   **Action needed:** Decline [meeting names] in Outlook

   ## Backlog Triage
   ### Overdue / Due Today
   - [ ] Item — Action: [pull/someday:date/delegate:name] ___

   ### New Items
   - [ ] Item — Action: ___

   ### Carried Over
   - [ ] Item — Action: ___

   ## Proposed TODOs
   Based on your goals and patterns, here's a suggested TODO list:
   - [ ] ...
   ```

   - Open the file in VS Code: `code work/daily/YYYY-MM-DD-triage.md`
   - Tell user: "I've created your triage file. Please review, mark your choices, and say 'ready' when done."

10) **Wait for user to edit and confirm** ("ready" or similar)

11) **Process decisions from triage file:**
    - Parse the triage markdown file
    - For calendar conflicts:
      - List meetings user needs to decline manually in Outlook
      - Remind user to decline the meetings they didn't mark as "keep"
    - For backlog items:
      - Update `work/backlog/BACKLOG.md` with appropriate tags
    - Update `work/context/meeting-preferences.md` with any new patterns learned

12) **Create today's daily note** (`work/daily/YYYY-MM-DD-notes.md`):
    - `# Notes for YYYY-MM-DD`
    - `## TODOs:` (bulleted list from confirmed triage)
    - `## Notes:` (freeform)
    - `## Links:` (important links)

## iCal Parsing Reference

To parse the iCal file for a specific date (cross-platform — works on Windows, macOS, Linux):

```python
import re
import os
import tempfile
import urllib.request
from datetime import date

# Fetch calendar to a cross-platform temp path
ical_url = 'YOUR_ICAL_URL'
ical_path = os.path.join(tempfile.gettempdir(), 'calendar.ics')
urllib.request.urlretrieve(ical_url, ical_path)

# Parse events for today (or pass a specific date as a string: 'YYYYMMDD')
target_date = date.today().strftime('%Y%m%d')

with open(ical_path, 'r', encoding='utf-8') as f:
    content = f.read()

events_raw = content.split('BEGIN:VEVENT')

for event in events_raw[1:]:
    if 'STATUS:CANCELLED' in event:
        continue

    summary = ''
    dtstart = ''
    organizer = ''

    for line in event.split('\n'):
        if line.startswith('SUMMARY:'):
            summary = line.replace('SUMMARY:', '').strip()
        if line.startswith('DTSTART'):
            dtstart = line
        if line.startswith('ORGANIZER'):
            organizer = line

    if target_date in dtstart:
        # Extract time and display
        match = re.search(r'T(\d{2})(\d{2})', dtstart)
        if match:
            hour, minute = int(match.group(1)), int(match.group(2))
            print(f"{hour:02d}:{minute:02d} - {summary}")
```

## Sources of Truth
- `work/daily/README.md` - Daily note format
- `work/goals/README.md` - Goals format
- `work/reflections/README.md` - Reflection format
- `work/backlog/README.md` - Backlog tags
- `work/backlog/BACKLOG.md` - Active backlog
- `work/context/meeting-preferences.md` - Learned patterns for conflict resolution
- Calendar: iCal URL or WorkIQ
#calendar#daily-planning#vip-meetings#todo#schedulingpythonbashfilesystem-accessvscode