Skip to content

feat(x): visual calendar with write support, multi-calendar, and assistant tools - #844

Open
hrsvrn wants to merge 3 commits into
mainfrom
calendar
Open

feat(x): visual calendar with write support, multi-calendar, and assistant tools#844
hrsvrn wants to merge 3 commits into
mainfrom
calendar

Conversation

@hrsvrn

@hrsvrn hrsvrn commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator

Summary

I replaced the flat Meetings list with a full visual calendar and took it from read-only to a complete scheduling surface: writes (create/edit/delete/RSVP), drag-to-reschedule, recurring-event handling, availability sharing, secondary Google calendars, a tray next-meeting countdown, and assistant calendar tools.

Visual calendar (2d66e5f)

  • New Calendar tab with month grid, week time-grid, and agenda mode, with directional slide transitions between views and periods.
  • Meetings view is folded into the calendar as agenda mode — the Meetings tab, sidebar entry, and view state are removed, and all old entry points (deep links, open-view, home, tour, credit rewards) land on calendar agenda.
  • Extracted shared calendar-event parsing/formatting into lib/calendar-events.ts + a use-calendar-events hook + a shared event details popover (behavior unchanged).
  • Widened calendar sync from -7/+14 days to ±60 and added pagination to events.list (it was silently capped at 250 events).

Calendar write (03eb64f)

  • Five new calendar:* IPC channels (getWriteStatus / createEvent / updateEvent / deleteEvent / respond) backed by core/knowledge/calendar_write.ts.
  • Drag/click quick-create in month and week grids; inline title/date/time editing, delete, and RSVP in the event details popover; meeting-note matching for event links.
  • Successful writes persist the returned event into calendar_sync/ for an instant UI refresh, then wake the sync loop to reconcile.
  • Write UI is gated by useCalendarWriteAccess, which re-checks after OAuth connects.

Upgrades (fc94ceb)

  • Keyboard shortcuts: T/J/K/arrows for navigation, D/W/M/A for views, C to create, S for availability.
  • Drag-to-reschedule and bottom-edge resize with optimistic updates.
  • Recurring-event awareness: series badge, this-event vs whole-series delete.
  • Availability sharing: drag free windows, copy formatted text with timezone.
  • Multi-calendar: secondary Google calendars sync (calendars.json, per-calendar colors, visibility toggles, calendarId-routed writes).
  • Tray next-meeting countdown with one-click "Join & take notes".
  • Assistant calendar tools (list / find-free-slots / create / update / delete / RSVP) behind a new calendar skill.

⚠️ Shipping dependency

OAuth scopes are upgraded from calendar.events.readonly to calendar.events, plus calendarlist.readonly for multi-calendar. The hosted rowboat-mode OAuth backend must add both scopes in lockstep before this ships. The sync loop accepts either grant, so legacy readonly connections keep syncing until the startup scope migration prompts a reconnect.

Test plan

  • date-grid unit tests added; tools catalog test updated
  • npm run deps, lint, typecheck pass
  • E2E pass over write flows (create/edit/delete/RSVP) against a real Google account

🤖 Generated with Claude Code

hrsvrn and others added 3 commits July 29, 2026 21:52
…d in

- New Calendar tab (sidebar + __rowboat_calendar__ tab) with month grid,
  week time-grid, and agenda mode; directional slide transitions between
  views and periods (motion/react).
- Meetings view folded into the calendar as agenda mode; Meetings tab,
  sidebar entry, and view state removed. Old entry points (deep link
  ?type=meetings, open-view meetings, home "All meetings", tour, credit
  rewards) land on calendar agenda.
- Shared calendar-event parsing/formatting extracted from meetings-view
  into lib/calendar-events.ts + use-calendar-events hook + shared event
  details popover; behavior unchanged.
- Calendar sync widened from -7/+14 days to ±60 and events.list now
  paginates (was silently capped at 250 events).
- date-grid unit tests; analytics view type + docs updated.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adds Google Calendar write support behind five new calendar:* IPC
channels (getWriteStatus, createEvent, updateEvent, deleteEvent,
respond), backed by core/knowledge/calendar_write.ts. All writes target
the primary calendar; successful writes persist the returned event into
calendar_sync/ for an instant UI refresh, then wake the sync loop to
reconcile.

Renderer: drag/click quick-create in month and week grids, inline
title/date/time editing plus delete and RSVP in the event details
popover, meeting-note matching for event links. Write UI is gated by
useCalendarWriteAccess, which re-checks after OAuth connects.

Scope upgrade: calendar.events.readonly → calendar.events in
providers.ts. The sync loop now accepts either grant so legacy readonly
connections keep syncing until the startup scope migration prompts a
reconnect. Note: the hosted rowboat-mode OAuth backend must add
calendar.events to its scope list in lockstep before this ships.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…vailability, multi-calendar, tray countdown, assistant tools

- Keyboard shortcuts (T/J/K/arrows, D/W/M/A views, C create, S availability)
- Drag-to-reschedule + bottom-edge resize with optimistic updates
- Recurring-event awareness: series badge, this-event vs whole-series delete
- Availability sharing: drag free windows, copy formatted text with timezone
- Multi-calendar: secondary Google calendars sync (calendars.json, per-calendar
  colors, visibility toggles, calendarId-routed writes, calendarlist scope)
- Tray next-meeting countdown with one-click Join & take notes
- Assistant calendar tools (list/find-free-slots/create/update/delete/RSVP)
  behind a new calendar skill

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant