#!/bin/bash # Create a new calendar event # Usage: cal-create.sh [location] [description] [allday] [recurrence] # Date format: "YYYY-MM-DD HH:MM" or "YYYY-MM-DD" for all-day events # Recurrence format: iCalendar RRULE (e.g., "FREQ=WEEKLY;COUNT=4" or "FREQ=DAILY;UNTIL=20260201") # Examples: # cal-create.sh Personal "Meeting" "2026-01-15 10:00" "2026-01-15 11:00" # cal-create.sh Personal "Vacation" "2026-02-01" "2026-02-05" "" "Beach trip" true # cal-create.sh Personal "Weekly Standup" "2026-01-20 09:00" "2026-01-20 09:30" "Zoom" "" false "FREQ=WEEKLY;COUNT=10" CALENDAR="${1:-}" SUMMARY="${2:-}" START_DATE="${3:-}" END_DATE="${4:-}" LOCATION="${5:-}" DESCRIPTION="${6:-}" ALL_DAY="${7:-false}" RECURRENCE="${8:-}" if [ -z "$CALENDAR" ] || [ -z "$SUMMARY" ] || [ -z "$START_DATE" ] || [ -z "$END_DATE" ]; then echo "Usage: cal-create.sh [location] [description] [allday] [recurrence]" echo "Date format: 'YYYY-MM-DD HH:MM' or 'YYYY-MM-DD' for all-day" exit 1 fi osascript - "$CALENDAR" "$SUMMARY" "$START_DATE" "$END_DATE" "$LOCATION" "$DESCRIPTION" "$ALL_DAY" "$RECURRENCE" <<'EOF' on splitString(theString, theDelimiter) set oldDelimiters to AppleScript's text item delimiters set AppleScript's text item delimiters to theDelimiter set theArray to every text item of theString set AppleScript's text item delimiters to oldDelimiters return theArray end splitString on parseDate(dateStr) set dateParts to my splitString(dateStr, " ") set ymdParts to my splitString(item 1 of dateParts, "-") set theDate to current date set year of theDate to (item 1 of ymdParts) as integer set month of theDate to (item 2 of ymdParts) as integer set day of theDate to (item 3 of ymdParts) as integer if (count of dateParts) > 1 then set timeParts to my splitString(item 2 of dateParts, ":") set hours of theDate to (item 1 of timeParts) as integer set minutes of theDate to (item 2 of timeParts) as integer set seconds of theDate to 0 else set hours of theDate to 0 set minutes of theDate to 0 set seconds of theDate to 0 end if return theDate end parseDate on run argv set calendarName to item 1 of argv as string set eventSummary to item 2 of argv as string set startDateStr to item 3 of argv as string set endDateStr to item 4 of argv as string set eventLocation to item 5 of argv as string set eventDescription to item 6 of argv as string set isAllDay to item 7 of argv as string set eventRecurrence to item 8 of argv as string set startDate to my parseDate(startDateStr) set endDate to my parseDate(endDateStr) tell application "Calendar" try set cal to calendar calendarName on error return "Error: Calendar '" & calendarName & "' not found" end try if not (writable of cal) then return "Error: Calendar '" & calendarName & "' is read-only" end if set eventProps to {summary:eventSummary, start date:startDate, end date:endDate} if isAllDay is "true" then set eventProps to eventProps & {allday event:true} end if set newEvent to make new event at end of events of cal with properties eventProps if eventLocation is not "" then set location of newEvent to eventLocation end if if eventDescription is not "" then set description of newEvent to eventDescription end if if eventRecurrence is not "" then set recurrence of newEvent to eventRecurrence end if return "Created event: " & (uid of newEvent) end tell end run EOF