some incremental changes and using runna for workouts to factor into planning
This commit is contained in:
@@ -13,6 +13,12 @@ Use the Microsoft 365 connector's `outlook_calendar_search` tool to fetch tomorr
|
|||||||
|
|
||||||
🚨 TIMEZONE: The connector returns times in **UTC** (ISO strings ending in `Z`). Convert each to Eastern Time before displaying — EDT = UTC−4 (mid-Mar to early-Nov), EST = UTC−5 otherwise. Flag any `isAllDay` events (PTO/OOO) as out-of-office rather than meetings.
|
🚨 TIMEZONE: The connector returns times in **UTC** (ISO strings ending in `Z`). Convert each to Eastern Time before displaying — EDT = UTC−4 (mid-Mar to early-Nov), EST = UTC−5 otherwise. Flag any `isAllDay` events (PTO/OOO) as out-of-office rather than meetings.
|
||||||
|
|
||||||
|
## Step 1b: Check tomorrow's Runna workout
|
||||||
|
Fetch the Runna ical feed (see CLAUDE.md "Data Sources") with `curl -sL <url>` and find the `VEVENT` whose `DTSTART` is tomorrow's date.
|
||||||
|
* If one exists: the workout block is 9:00 AM + `X-WORKOUT-ESTIMATED-DURATION` (fall back to the high end of the duration range in `SUMMARY`/`DESCRIPTION` if that field is missing) + a 20-minute shower buffer after.
|
||||||
|
* Check that block against tomorrow's calendar events from Step 1. If clear, note AJ is free for the workout and what time he's clear by. If a meeting falls inside the block, flag it by name and time so AJ can decide whether to move, shorten, or skip the workout.
|
||||||
|
* If no workout is scheduled tomorrow, skip this silently — do not add a Workout section.
|
||||||
|
|
||||||
## Step 2: Under the **Agenda** heading
|
## Step 2: Under the **Agenda** heading
|
||||||
Format my calendar events in a simple Markdown table with columns: Time (ET), Event Name, Owner, and Duration
|
Format my calendar events in a simple Markdown table with columns: Time (ET), Event Name, Owner, and Duration
|
||||||
* Time should be the FIRST column
|
* Time should be the FIRST column
|
||||||
@@ -21,6 +27,7 @@ Format my calendar events in a simple Markdown table with columns: Time (ET), Ev
|
|||||||
* Do not include personal appointments that don't affect my work day
|
* Do not include personal appointments that don't affect my work day
|
||||||
* My work day goes from 9 AM ET to 5:30 PM ET. Use this to determine my availability.
|
* My work day goes from 9 AM ET to 5:30 PM ET. Use this to determine my availability.
|
||||||
Let me know how much unscheduled time I have.
|
Let me know how much unscheduled time I have.
|
||||||
|
* Directly beneath the Agenda table, if Step 1b found a workout scheduled tomorrow, add a one-line **Workout** note stating whether the 9 AM block is clear or naming the conflicting meeting.
|
||||||
|
|
||||||
## Step 3: Get task data
|
## Step 3: Get task data
|
||||||
This Notion MCP has no filter/query tool and `view://` URLs aren't fetchable, so use the search → fetch → filter pattern (see CLAUDE.md "HOW TO QUERY THESE DATABASES"). Do NOT try to fetch views and do NOT print any "falling back" message.
|
This Notion MCP has no filter/query tool and `view://` URLs aren't fetchable, so use the search → fetch → filter pattern (see CLAUDE.md "HOW TO QUERY THESE DATABASES"). Do NOT try to fetch views and do NOT print any "falling back" message.
|
||||||
@@ -35,6 +42,17 @@ Format the note with the following sections:
|
|||||||
2. Under **Key Projects** list this week's focus projects with their weekly goal.
|
2. Under **Key Projects** list this week's focus projects with their weekly goal.
|
||||||
- If a search legitimately returns no qualifying open tasks, say so plainly — never invent tasks to fill the list.
|
- If a search legitimately returns no qualifying open tasks, say so plainly — never invent tasks to fill the list.
|
||||||
|
|
||||||
|
## Step 4: Mark Top Tasks in Notion
|
||||||
|
The Tasks Tracker has a `Top Task` checkbox property and a `Top Tasks` view (filtered to `Top Task = true` AND `Status != Done`) for surfacing the current day's Big 3 at a glance. At most 3 tasks may be checked at any time.
|
||||||
|
|
||||||
|
1. Present the Suggested Tasks from Step 3 to AJ and let him confirm or swap any of them before finalizing.
|
||||||
|
2. `notion-search` the Tasks collection (`collection://2c0abd6c-450a-8085-80a0-000ba136a154`) filtered/queried for `Top Task` = true (or check the pages already known from recent notes) to find any tasks still marked from a prior day.
|
||||||
|
3. Any currently-marked task whose `Status` = "Done" gets `Top Task` set to false immediately — regardless of whether it's in today's agreed set (it can't be, since Step 3.4 already drops Done tasks). Don't wait for a replacement to unmark a completed task.
|
||||||
|
4. For each other currently-marked task that is NOT in today's agreed set, `notion-update-page` to set `Top Task` = false.
|
||||||
|
5. For each of the (up to 3) agreed tasks, `notion-update-page` to set `Top Task` = true.
|
||||||
|
6. Never have more than 3 tasks checked at once — unmark old ones before marking new ones.
|
||||||
|
|
||||||
|
Note: this only unchecks stale Done tasks when an evening-prep run touches them. It isn't real-time — if AJ marks a task Done in Notion outside of this flow, the checkbox stays checked until the next evening-prep pass (though the `Top Tasks` view already filters out `Status = Done`, so it won't show there regardless). True real-time un-checking would need a native Notion automation (Settings → Automations → when Status is set to Done → uncheck Top Task), which isn't something these tools can create.
|
||||||
|
|
||||||
## Formatting Rules
|
## Formatting Rules
|
||||||
* Always provide a tl;dr summary at the top of the note
|
* Always provide a tl;dr summary at the top of the note
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ Then add the following to the note
|
|||||||
Format the note with the following sections:
|
Format the note with the following sections:
|
||||||
1. **Priorities for this week** - List the three projects I selected with their weekly goal.
|
1. **Priorities for this week** - List the three projects I selected with their weekly goal.
|
||||||
2. **Key tasks** - List all tasks that are due this week. Order by due date and blocker status. Show the task name, related project, type, and effort level. Provide a link to the task in Notion.
|
2. **Key tasks** - List all tasks that are due this week. Order by due date and blocker status. Show the task name, related project, type, and effort level. Provide a link to the task in Notion.
|
||||||
|
3. **Workouts this week** - The table from Step 3b (omit this section entirely if no workouts are scheduled).
|
||||||
|
|
||||||
## Step 3: Review the week's calendar
|
## Step 3: Review the week's calendar
|
||||||
Use the Microsoft 365 connector's `outlook_calendar_search` tool to fetch the upcoming week's events:
|
Use the Microsoft 365 connector's `outlook_calendar_search` tool to fetch the upcoming week's events:
|
||||||
@@ -36,6 +37,11 @@ Use the Microsoft 365 connector's `outlook_calendar_search` tool to fetch the up
|
|||||||
|
|
||||||
Use AJ's work day (9 AM–5:30 PM ET) and these events to estimate how much unscheduled time exists across the week — this feeds the reading suggestions below.
|
Use AJ's work day (9 AM–5:30 PM ET) and these events to estimate how much unscheduled time exists across the week — this feeds the reading suggestions below.
|
||||||
|
|
||||||
|
## Step 3b: Check the week's Runna workouts
|
||||||
|
Fetch the Runna ical feed (see CLAUDE.md "Data Sources") with `curl -sL <url>`. For each `VEVENT` whose `DTSTART` falls Monday–Friday of this week, compute the 9 AM block: workout duration (`X-WORKOUT-ESTIMATED-DURATION`, falling back to the high end of the range in `SUMMARY`/`DESCRIPTION`) + a 20-minute shower buffer after, starting at 9:00 AM. Check each block against that day's calendar events from Step 3.
|
||||||
|
|
||||||
|
Add a **Workouts this week** section: a table with columns Date, Workout, Block (e.g. 9:00–9:50 AM), and Status (Clear, or "Conflict: <meeting name> <time>"). Skip days with no scheduled workout.
|
||||||
|
|
||||||
## Step 4: Generate my reading list
|
## Step 4: Generate my reading list
|
||||||
Using the same search → fetch → filter pattern: `notion-search` the Reading List collection `collection://2c4abd6c-450a-804a-809a-000bc77d02c1` with `page_size: 25`, `max_highlight_length: 0`. Fetch the returned pages in parallel and keep those with `Status` = "To Read" or "In Progress". (Don't fetch `view://` URLs.)
|
Using the same search → fetch → filter pattern: `notion-search` the Reading List collection `collection://2c4abd6c-450a-804a-809a-000bc77d02c1` with `page_size: 25`, `max_highlight_length: 0`. Fetch the returned pages in parallel and keep those with `Status` = "To Read" or "In Progress". (Don't fetch `view://` URLs.)
|
||||||
|
|
||||||
|
|||||||
11
CLAUDE.md
11
CLAUDE.md
@@ -80,6 +80,7 @@ When creating or modifying notes:
|
|||||||
* `notion-search` is **semantic** (ranked by relevance, not status), so seed `query` with this week's focus-project names plus terms like "blocking due this week" to surface the right open items. Relation fields like `Blocking` aren't text-searchable, so confirm them only after fetching the page.
|
* `notion-search` is **semantic** (ranked by relevance, not status), so seed `query` with this week's focus-project names plus terms like "blocking due this week" to surface the right open items. Relation fields like `Blocking` aren't text-searchable, so confirm them only after fetching the page.
|
||||||
* EFFICIENCY: the weekly focus projects + goals are written into the current Weekly Note every Sunday. In daily/evening planning, read those from the Weekly Note (a local `.md` file) instead of re-scanning the Projects DB.
|
* EFFICIENCY: the weekly focus projects + goals are written into the current Weekly Note every Sunday. In daily/evening planning, read those from the Weekly Note (a local `.md` file) instead of re-scanning the Projects DB.
|
||||||
* CRITICAL: Base ALL suggestions on this real fetched data, never on examples. When planning, prioritize: 1) tasks with `Blocking` populated (priority #1), 2) deadlines this week, 3) tasks tied to `Focus this week` projects, ignoring `Status` = "Done".
|
* CRITICAL: Base ALL suggestions on this real fetched data, never on examples. When planning, prioritize: 1) tasks with `Blocking` populated (priority #1), 2) deadlines this week, 3) tasks tied to `Focus this week` projects, ignoring `Status` = "Done".
|
||||||
|
* **Runna workouts (ical feed)**: `https://cal.runna.com/ea6ef385d5d2784fa479f622b91e308d.ics` — AJ's scheduled training plan (runs, strength sessions, etc). Fetch with `curl -sL <url>` (raw VCALENDAR/VEVENT text). Each `VEVENT` has `DTSTART`/`DTEND` (all-day, so the date only — Runna doesn't fix a time of day), `SUMMARY` (workout name + distance/duration range), `DESCRIPTION` (pace/session detail), and `X-WORKOUT-ESTIMATED-DURATION` (seconds — use this as the workout length estimate).
|
||||||
|
|
||||||
## Your job
|
## Your job
|
||||||
*When AJ asks "help me plan today" or "what should I focus on":
|
*When AJ asks "help me plan today" or "what should I focus on":
|
||||||
@@ -100,4 +101,12 @@ When helping plan the day:
|
|||||||
3. Estimate how much unscheduled time exists
|
3. Estimate how much unscheduled time exists
|
||||||
4. Suggest tasks that fit the available windows
|
4. Suggest tasks that fit the available windows
|
||||||
5. Warn if Daily Big 3 requires more time than available
|
5. Warn if Daily Big 3 requires more time than available
|
||||||
- I usually leave to pick up the kids at 5:30
|
- I usually leave to pick up the kids at 5:30
|
||||||
|
|
||||||
|
### Workouts (Runna)
|
||||||
|
When planning today or this week, check the Runna ical feed (see Data Sources) for a workout on the relevant date:
|
||||||
|
1. AJ works out at 9:00 AM. Block = 9:00 AM start + `X-WORKOUT-ESTIMATED-DURATION` (fall back to the high end of the duration range in `SUMMARY`/`DESCRIPTION` if missing) + 20 min shower buffer after. E.g. a 40-minute session blocks 9:00–9:40 workout + 9:40–10:00 shower = clear by 10:00 AM.
|
||||||
|
2. Compare that block against the day's calendar (meetings between 9:00 AM and the block's end time = conflict).
|
||||||
|
3. If clear: confirm AJ has time for the workout, note when they'll be free (end of shower buffer).
|
||||||
|
4. If a meeting falls inside the block: flag the conflict specifically (which meeting, what time) so AJ can decide whether to move the workout, shorten it, or skip.
|
||||||
|
5. No workout scheduled that day: skip this section silently.
|
||||||
Reference in New Issue
Block a user