Claude-skill-registry calendar-scheduling
Calendar event formatting, conflict detection, meeting optimization, and smart scheduling. Use when creating calendar events, finding meeting times, or managing schedules.
git clone https://github.com/majiayu000/claude-skill-registry
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/calendar-scheduling" ~/.claude/skills/majiayu000-claude-skill-registry-calendar-scheduling && rm -rf "$T"
skills/data/calendar-scheduling/SKILL.mdCalendar Scheduling
Tools for calendar event management, conflict detection, and intelligent scheduling.
Quick Start
Format calendar event:
python scripts/format_event.py --title "Team Meeting" --start "2026-01-20 14:00" --duration "1h" --output event.json
Detect conflicts:
python scripts/detect_conflicts.py --events existing_events.json --new-event new_event.json
Find free time:
python scripts/find_free_time.py --calendars user1.json user2.json --duration "1h" --business-hours
Event Formatting
Standard Event Structure
Google Calendar format:
{ "summary": "Team Meeting", "description": "Weekly team sync", "start": { "dateTime": "2026-01-20T14:00:00-08:00", "timeZone": "America/Los_Angeles" }, "end": { "dateTime": "2026-01-20T15:00:00-08:00", "timeZone": "America/Los_Angeles" }, "attendees": [ {"email": "user1@example.com"}, {"email": "user2@example.com"} ], "location": "Conference Room A", "reminders": { "useDefault": false, "overrides": [ {"method": "popup", "minutes": 15} ] } }
Event Types
1. Meeting
{ "summary": "Product Review Meeting", "duration": "1h", "attendees": ["team@example.com"], "location": "Zoom", "reminders": [15] }
2. All-Day Event
{ "summary": "Company Holiday", "start": {"date": "2026-01-20"}, "end": {"date": "2026-01-21"} }
3. Recurring Event
{ "summary": "Weekly Standup", "recurrence": ["RRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR"], "start": "2026-01-20T09:00:00", "duration": "15m" }
4. Focus Time
{ "summary": "Focus: Deep Work", "transparency": "opaque", "visibility": "private", "duration": "2h" }
Conflict Detection
Detection Algorithm
def detect_conflicts(existing_events: list, new_event: dict) -> list: """ Detect scheduling conflicts. Returns list of conflicting events. """ conflicts = [] new_start = parse_datetime(new_event['start']) new_end = parse_datetime(new_event['end']) for event in existing_events: event_start = parse_datetime(event['start']) event_end = parse_datetime(event['end']) # Check for overlap if (new_start < event_end and new_end > event_start): conflicts.append(event) return conflicts
Conflict Types
Hard Conflicts:
- Overlapping meetings
- Double-booked time slots
- Events during blocked time
Soft Conflicts:
- Back-to-back meetings (no buffer)
- Meetings during preferred focus time
- Too many meetings in one day
- Meetings outside business hours
Buffer Time
Add buffer between meetings:
BUFFER_MINUTES = 15 def has_buffer(event1, event2, buffer_minutes=15): """Check if events have sufficient buffer.""" gap = event2_start - event1_end return gap.total_seconds() >= (buffer_minutes * 60)
Smart Scheduling
Find Free Time
Algorithm to find available time slots:
def find_free_time( calendars: list, duration_minutes: int, start_date: datetime, end_date: datetime, business_hours_only: bool = True ) -> list: """ Find available time slots across multiple calendars. Returns list of (start, end) tuples. """ # 1. Collect all busy times busy_times = [] for calendar in calendars: busy_times.extend(get_busy_times(calendar)) # 2. Sort busy times busy_times.sort(key=lambda x: x[0]) # 3. Find gaps free_slots = [] current_time = start_date for busy_start, busy_end in busy_times: # Check gap before this busy time if (busy_start - current_time).total_seconds() >= duration_minutes * 60: # Filter by business hours if business_hours_only: slot = filter_business_hours(current_time, busy_start) if slot: free_slots.append(slot) else: free_slots.append((current_time, busy_start)) current_time = max(current_time, busy_end) return free_slots
Business Hours
Default business hours:
BUSINESS_HOURS = { 'monday': {'start': '09:00', 'end': '17:00'}, 'tuesday': {'start': '09:00', 'end': '17:00'}, 'wednesday': {'start': '09:00', 'end': '17:00'}, 'thursday': {'start': '09:00', 'end': '17:00'}, 'friday': {'start': '09:00', 'end': '17:00'}, 'saturday': None, # Not a business day 'sunday': None # Not a business day }
Meeting Optimization
Optimal meeting times:
- Mid-morning (10:00-11:30): Good for focused discussions
- Early afternoon (13:00-14:30): Good for collaborative work
- Avoid:
- Early morning (before 9:00)
- Lunch time (12:00-13:00)
- Late afternoon (after 16:00)
- End of week (Friday afternoon)
Meeting length guidelines:
- Quick sync: 15 minutes
- Standard meeting: 30 minutes
- Deep dive: 60 minutes
- Workshop: 90-120 minutes
- All-hands: 30-45 minutes
Reminder Scheduling
Reminder Types
Time-based:
- 15 minutes before (default)
- 1 hour before
- 1 day before
- 1 week before (for important events)
Context-based:
- When leaving for meeting (travel time)
- When prep needed (read docs)
- When action required (submit materials)
Smart Reminders
def calculate_reminder_time(event: dict) -> int: """ Calculate optimal reminder time based on event type. Returns minutes before event. """ event_type = event.get('type', 'meeting') duration = event.get('duration_minutes', 30) if event_type == 'interview': return 60 # 1 hour before elif event_type == 'presentation': return 120 # 2 hours before (prep time) elif event_type == 'external_meeting': return 30 # 30 minutes before elif duration >= 60: return 30 # Long meetings: 30 min before else: return 15 # Short meetings: 15 min before
Scripts
format_event.py
Format a calendar event.
Usage:
python scripts/format_event.py \ --title "Team Meeting" \ --start "2026-01-20 14:00" \ --duration "1h" \ --attendees "user1@example.com,user2@example.com" \ --location "Conference Room A" \ --reminder 15 \ --output event.json
Arguments:
: Event title (required)--title
: Start date/time (YYYY-MM-DD HH:MM)--start
: Duration (e.g., "1h", "30m")--duration
: Comma-separated email addresses--attendees
: Meeting location or video link--location
: Reminder minutes before event--reminder
: Output JSON file--output
detect_conflicts.py
Detect scheduling conflicts.
Usage:
python scripts/detect_conflicts.py \ --events existing_events.json \ --new-event new_event.json \ --buffer 15
Arguments:
: JSON file with existing events--events
: JSON file with new event to check--new-event
: Required buffer minutes between events--buffer
Output:
{ "has_conflicts": true, "hard_conflicts": [ { "event": "Existing Meeting", "start": "2026-01-20T14:00:00", "end": "2026-01-20T15:00:00", "reason": "Overlapping time slot" } ], "soft_conflicts": [ { "event": "Previous Meeting", "reason": "No buffer time (back-to-back)" } ] }
find_free_time.py
Find available time slots.
Usage:
python scripts/find_free_time.py \ --calendars user1.json user2.json \ --duration "1h" \ --start "2026-01-20" \ --end "2026-01-27" \ --business-hours \ --timezone "America/Los_Angeles"
Arguments:
: JSON files with calendar events--calendars
: Required duration (e.g., "1h", "30m")--duration
: Start date to search from--start
: End date to search until--end
: Only suggest business hours--business-hours
: Timezone for results--timezone
Output:
{ "suggested_times": [ { "start": "2026-01-20T10:00:00-08:00", "end": "2026-01-20T11:00:00-08:00", "score": 95, "reason": "Optimal time (mid-morning)" }, { "start": "2026-01-20T14:00:00-08:00", "end": "2026-01-20T15:00:00-08:00", "score": 85, "reason": "Good time (early afternoon)" } ] }
Scheduling Rules
See
rules/scheduling_rules.md for detailed scheduling guidelines:
General Rules
1. Meeting Length
- Default to 25 or 50 minutes (not 30 or 60)
- Allows 5-10 minute buffer
- Prevents back-to-back fatigue
2. Meeting Frequency
- Max 4 hours of meetings per day
- Max 2 hours consecutive meetings
- One meeting-free day per week
3. Meeting Timing
- Schedule important meetings mid-morning
- Avoid Monday morning and Friday afternoon
- Respect timezones (for distributed teams)
4. Attendees
- Invite only necessary attendees
- Max 8 people for productive discussions
- Provide agenda in advance
Focus Time
Block focus time:
- Morning: 9:00-11:00 (deep work)
- Afternoon: 14:00-16:00 (focused tasks)
Protection:
- Mark as "busy" in calendar
- Decline meeting requests during focus time
- Schedule at least 2 hours per day
Time Zones
COMMON_TIMEZONES = { 'PT': 'America/Los_Angeles', 'ET': 'America/New_York', 'UTC': 'UTC', 'GMT': 'Europe/London', 'CET': 'Europe/Paris', 'IST': 'Asia/Kolkata', 'JST': 'Asia/Tokyo' } def find_overlap_hours(timezone1, timezone2): """Find overlapping business hours between timezones."""
Integration with Agents
Scheduling Agent
from calendar_scheduling import find_free_time, format_event # Find available time free_slots = find_free_time( calendars=[user1_calendar, user2_calendar], duration_minutes=60, business_hours_only=True ) # Format event event = format_event( title="Team Sync", start=free_slots[0]['start'], duration="1h", attendees=['user1@example.com', 'user2@example.com'] ) # Create in Google Calendar calendar_client.create_event(event)
Communication Agent
from calendar_scheduling import detect_conflicts # Check for conflicts before accepting invite conflicts = detect_conflicts(existing_events, new_invite) if conflicts['has_conflicts']: # Send message suggesting alternative time message = f"I have a conflict at that time. Alternative times: {suggest_alternatives()}" slack_client.send_message(message)
Best Practices
Event Creation
- Clear, descriptive titles
- Include agenda in description
- Add video link for remote meetings
- Set appropriate reminders
- Invite only necessary attendees
Conflict Management
- Check for conflicts before accepting
- Suggest alternative times
- Respect focus time blocks
- Decline unnecessary meetings
Meeting Hygiene
- Start and end on time
- Provide agenda in advance
- Take and share notes
- Follow up with action items
- Cancel if unnecessary
Calendar Maintenance
- Block focus time weekly
- Review and optimize calendar monthly
- Clean up old/canceled events
- Keep time zones updated
- Maintain consistent meeting patterns
Examples
- Weekly team meetingexamples/weekly_sync_event.json
- 1:1 meeting formatexamples/one_on_one_event.json
- Company all-handsexamples/all_hands_event.json