Skip to main content

calendar

Use for reviewing the owner's Google Calendar - listing the day's / week's events, flagging conflicts and overlaps, proposing reschedule slots, and creating calendar events from travel bookings. Part of the daily brief; also for ad-hoc "what's my day / find me a slot / is X on my calendar". Pairs with `ted-personal-assistant:mailbird`, `ted-personal-assistant:meeting-prep`, `ted-personal-assistant:daily-brief`.

Source facts

Repository
bbinoy/ted-personal-assistant
Last source activity
October 22, 2026 at 17:26
Detected SKILL.md language
English
Stars
2
Forks
0

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
calendar
description
Use for reviewing the owner's Google Calendar - listing the day's / week's events, flagging conflicts and overlaps, proposing reschedule slots, and creating calendar events from travel bookings. Part of the daily brief; also for ad-hoc "what's my day / find me a slot / is X on my calendar". Pairs with `ted-personal-assistant:mail`, `ted-personal-assistant:meeting-prep`, `ted-personal-assistant:daily-brief`.
# Calendar review ## Setup (from the owner's notes) Which calendars to check, the time zone and which calendar travel bookings go on are in the owner's `setup-calendars` note (the `setup` notes in your memory block or `MEMORY.md`). Use exactly those; do not guess calendar ids. **If the calendar tools (`list_calendars`, `list_events`) do not exist** (the connector is not connected in the owner's Claude account), say so plainly, never guess or invent calendar data, skip this part, and in an unattended run end the brief with one line: "🔌 <connector> isn't connected, so calendar was skipped." In chat, add how to fix it: connect it under Settings, Connectors in their Claude account, then message you again. **If there is no `setup-calendars` note:** - in chat, load `ted-personal-assistant:setup` and set it up with the owner now; - in an unattended run, call `list_calendars` and save the `setup-calendars` note yourself, as the setup skill says, then carry on and say so in one line. A work calendar shared into the owner's Google account is one more listed calendar, handled like the private one with the same rules. A meeting with colleagues or about work goes on the work calendar (`calendarId`), a private event on the private one; which is which follows the mail skill's "Work and private accounts". Google Calendar via MCP. Call `list_events` with an explicit start/end range and the owner's time zone, for **all of the listed calendars in the same turn** (they are independent). The note may list calendars that are **not** connected (a work account that cannot be added, say): those are invisible, so never assume the list is complete, and if a workday looks empty, say so. Event times in results are already in the owner's zone: read them as shown, never convert. ## Window - **Daily brief run:** today + tomorrow (forward), and back to the previous brief's send time (for the post-meeting pass handoff to `ted-personal-assistant:meeting-prep`). - **Heartbeat look:** the next 36 hours. Any run (a look or a chat turn) that reads the calendar for the next hours also tells code which meetings are coming with the `note_upcoming_meetings` tool (its instruction says how: the facts as the calendar gives them, you do not decide which deserve prep); code then sends the short prep shortly before each meeting with other people on it. Produce a clean event list for the window - time, title, attendees, location - and hand it to `ted-personal-assistant:meeting-prep`, which decides what needs prep. ## Conflicts and hygiene (flag in the brief; fix only the owner's own guest-less events, see Reschedules) - Overlapping events. - Back-to-back meetings with no gap, especially across locations. - A meeting that collides with travel, or with a task due that day. - An external meeting with no agenda / no video link. - A day that is wall-to-wall with no break. ## Reschedules If an email asks to move a meeting, or two things clash, propose 2-3 concrete alternative slots from the owner's actual free time (following the owner's `scheduling-` notes) in the brief. For an event with guests or other people, do **not** call `update_event` on your own - the owner decides, then asks. A clash among the owner's own guest-less events or placeholders is fixed with `update_event`, in any run; say so in one line. ## Bookings -> calendar (the automatic write) Any **confirmed** booking with a firm date and time that is **not already on the calendar** goes on the owner's own calendar, whichever run finds it (a look handling new mail, the daily brief's sweep, a chat): event and class tickets, orders for an event, restaurant and venue reservations, appointments, flights, trains, hotels, buses. The daily brief also scans recent booking confirmations via `ted-personal-assistant:mail` `search_conversations`. For each one: - "I booked X": find the mail in the newest inbox rows (`list_conversations`) as well as by keyword; the sender rarely uses the owner's words. - If the date or time is only in the mail's attachment (a ticket, a confirmation PDF), open it first (`ted-personal-assistant:mail`) and never ask the owner for it. - `create_event` on the calendar the setup note names for bookings (else the primary one; a work trip on the work calendar), with no guests: clear title ("Startup Nights 2026", "Flight ZRH -> BCN LX123", "Hotel: <name>, <city>", "Train <A> -> <B>", "Dinner at <place>"), correct start/end, location, and confirmation number + one-line summary in the description. Times: write each of `startTime` and `endTime` as a full ISO time with the UTC offset of the place it happens in (a flight ZRH 10:30 -> LHR 11:20 local on 3 May is `2026-05-03T10:30:00+02:00` to `2026-05-03T11:20:00+01:00`; a train within one time zone uses that zone's offset). Do NOT set `timeZone` (it overrides the offsets), and never send two local times without offsets: the two ends of a flight are in different time zones, and an event with mixed times is held back for the owner's approval. Use the booking's own times, else the owner's time zone. The offset differs by DATE as well as place (daylight saving): the UK clocks change on the last Sunday of October, so on 31 Oct 2026 London is `+00:00` while Zurich is `+01:00`, whereas on 3 May both are on summer time (London `+01:00`, Zurich `+02:00`). Work out each offset for the actual date and place. - Then load `ted-personal-assistant:follow-through`: the matching task, the confirmation mail, the travel time, the follow-up tasks. - Note each created event in the brief under "Changed by the assistant". - No firm date or time, or a likely duplicate: do not create. Keep the mail and mention it. ## Scheduling emails: think a step ahead (in chat, when the owner talks to you) When an email asks about availability, proposes a time, or answers a time the owner suggested, do not just report it and ask what to do. Do the whole job and ask once: 1. Check the owner's calendar yourself (`list_events`, the calendars in the setup note), including the travel time between the neighbouring events. 2. Draft the reply: if the proposed time is free, confirm it; if not, propose two or three concrete free slots. Write it in the owner's voice and language, ready to send. 3. Tell the owner in one short message what the mail says, what the calendar shows, the draft, and one thing worth knowing (a clash, a tight journey). End with one question: send it? 4. When the owner says yes, send, and add the matching event to their own calendar in the same step, without a second question. Say that you added it, so they can ask you to remove it. The one yes covers what you announced. Announce the calendar entry in the message from step 3. Never invite other people or change an event that has guests without asking; the "one yes" covers only a new entry on the owner's own calendar. **In a background run** (a look, the brief) nobody is asked: do steps 1 and 2, save the reply as an in-thread draft, put a tentative hold on the owner's own calendar (no guests, "Hold: <title>"), and `add_task` "send the reply to <name>" so it reaches the brief's "Focus today". The owner's later "send" is the only question. ## The owner's own events, nobody else on them (in chat) "Put the visit to Rosa in my calendar on Saturday" is a plain request: create it at once on the owner's own calendar, with no guests and no notifications, and do not ask first. When the day or the time is open, pick the most likely reading yourself (the coming Saturday; a sensible time for that kind of thing, or an all-day event when no time fits) and SAY in your reply which date and time you chose ("Saturday 9 May, 10:00-13:30; tell me if it's another time"), so the owner can correct it with one word. Moving or editing one of the owner's own events that has no guests works the same way. This is never a question to the owner: a wrong guess is fixed in a second. Inviting or notifying anyone, another person's or a shared calendar, and deleting stay as below. To invite someone by name ("invite Sam"), call `find_person` first, as your rules say; the invite still asks, with the guests shown. ## Cancelling, declining and deleting (in chat) Before you act on an event, look it up by day and title (`list_events` for that day, or `get_event`), so you know what it is and who organises it. Name it by title and time in anything you say ("the Embassy reception, Fri 15 May 18:00"), never by id. - "Cancel it" or "I can't make it" for an event **someone else organises**: respond to the invitation as declined (`respond_to_event`), with a short note in the owner's voice when it helps ("Sorry, I can't make it tonight."). The organiser is notified by that. Do not delete it: a delete tells the organiser nothing. - Delete only an event the owner organises, or one that is the owner's own entry (nobody else on it). - Deleting an event the owner organises that has guests: notify the guests (they would otherwise find out by themselves). It touches other people, so the owner is asked first; that is right. ## Guardrails - May, in any run: create, move or edit an event on the owner's own calendar with nobody invited and no notifications (bookings, holds, own plans), and mention it. - Stays a draft, task or suggestion: anything with guests or notifications, other people's events, invites and responses. Deleting stays a question (and `delete_event` is never unattended). - The agent's policy (`src/policy/policy.ts`) judges every calendar write: an event on the owner's own calendar with nobody invited is routine; one that invites or notifies people asks the owner, whatever this skill says. ## In the briefing - **Conflicts / reschedules** section - only if there is something; each as a suggestion. - Created travel events -> "Changed by the assistant". - The meeting list itself is rendered by `ted-personal-assistant:meeting-prep`.
View on GitHub