Reading and managing macOS Calendar events. Use when checking schedules, finding events, creating meetings, or answering questions about availability.
Manages macOS Calendar events by reading, creating, updating, and deleting them via a Swift CLI.
npx claudepluginhub bendrucker/claudeThis skill is limited to using the following tools:
scripts/cal.swiftInteract with Calendar.app using a Swift CLI that wraps EventKit.
The CLI lives at @skills/calendar/scripts/cal.swift and is invoked via swift <path> <command> [options]. It uses EventKit's native date range predicates for efficient queries and returns JSON.
Calendar access must be granted to the terminal app (Ghostty, Terminal.app, etc.) in System Settings → Privacy & Security → Calendars.
EventKit requires TCC permissions tied to an app bundle. Over SSH, in tmux, or in any context where the responsible process has no app bundle, EventKit access is unavailable. Use a local terminal session launched directly from an app (not through a multiplexer).
List calendars:
timeout 5 swift @scripts/cal.swift calendars
Returns id, name, writable, and source (Google, iCloud, etc.) for each calendar. Use id or name to filter in other commands.
List events in a date range:
timeout 5 swift @scripts/cal.swift list --start 2026-01-27 --end 2026-01-28
Filter by calendar (by name or ID):
timeout 5 swift @scripts/cal.swift list --start 2026-01-27 --end 2026-02-03 --calendar Rides
Get event details by ID:
timeout 5 swift @scripts/cal.swift get "EVENT_ID"
Create event:
timeout 5 swift @scripts/cal.swift create \
--title "Team Meeting" \
--start "2026-01-28 14:00" \
--end "2026-01-28 15:00" \
--calendar Personal \
--location "Conference Room" \
--notes "Weekly sync"
Create all-day event:
timeout 5 swift @scripts/cal.swift create \
--title "Conference" \
--start 2026-02-01 \
--end 2026-02-02 \
--allDay true
Update event:
timeout 5 swift @scripts/cal.swift update "EVENT_ID" \
--title "Updated Title" \
--location "New Room"
Delete event:
timeout 5 swift @scripts/cal.swift delete "EVENT_ID"
All commands return JSON with these fields:
| Field | Type | Description |
|---|---|---|
id | string | EventKit identifier (use for get/update/delete) |
summary | string | Event title |
start | string | ISO 8601 start time |
end | string | ISO 8601 end time |
allDay | boolean | All-day event flag |
calendar | string | Calendar name |
location | string | Event location (if set) |
notes | string | Event notes (if set) |
attendees | string[] | Attendee names (if any) |
The CLI accepts:
YYYY-MM-DD — date only (for all-day events or date range queries)YYYY-MM-DD HH:MM — date and time (local timezone)2026-01-28T14:00:00ZWhen creating events with --calendar, the CLI tries:
For calendars with duplicate names (e.g., "Personal" on both Google and iCloud), use the calendar ID from the calendars command.
"Calendar access denied": Grant access in System Settings → Privacy & Security → Calendars for your terminal app.
"Calendar access denied" with "reason": "no-app-bundle": The responsible process has no app bundle context. This occurs in tmux, SSH, or similar environments where macOS cannot identify a bundled app to associate TCC permissions with. Switch to a direct terminal session (e.g., Ghostty or Terminal.app, not inside tmux).
"Event not found": Event IDs are EventKit identifiers returned by list and create. IDs from other tools (icalBuddy, JXA) are incompatible.
Times are in UTC: EventKit returns ISO 8601 in UTC. Convert to local time as needed.
Expert guidance for Next.js Cache Components and Partial Prerendering (PPR). **PROACTIVE ACTIVATION**: Use this skill automatically when working in Next.js projects that have `cacheComponents: true` in their next.config.ts/next.config.js. When this config is detected, proactively apply Cache Components patterns and best practices to all React Server Component implementations. **DETECTION**: At the start of a session in a Next.js project, check for `cacheComponents: true` in next.config. If enabled, this skill's patterns should guide all component authoring, data fetching, and caching decisions. **USE CASES**: Implementing 'use cache' directive, configuring cache lifetimes with cacheLife(), tagging cached data with cacheTag(), invalidating caches with updateTag()/revalidateTag(), optimizing static vs dynamic content boundaries, debugging cache issues, and reviewing Cache Component implementations.
Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand colors or style guidelines, visual formatting, or company design standards apply.
Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.