在 macOS 上通过命令行管理 Apple Calendar 事件——创建、更新、删除、搜索、导出及检查空闲时间,并提供完整的 JSON 输出供代理使用。
accli manages Apple Calendar on macOS via EventKit. All commands support --json for structured output. Exit codes: 0=success, 1=runtime error, 2=validation error, 10=auth error.
First run: accli setup to grant Calendar permissions (Full Access required in System Settings > Privacy & Security > Calendars).
bash
accli calendars [--json]
Returns list of calendars with id, name, source, index, writable. Always prefer --calendar-id <id> over calendar name — IDs are stable, names are not.
bash
accli events [<calendarName>] [--calendar-id <id>] --from <date> --to <date> [--json]
Lists events in a date range. Calendar is required (use name, --calendar-id, or set a default via accli config set-default).
bash
accli event [<calendarName>] <eventId> [--calendar-id <id>] [--json]
Fetches full event detail including alerts array (minutes before start).
bash
accli create <calendarName> --summary <text> --start <datetime> --end <datetime> \
[--location <text>] [--description <text>] [--all-day] \
[--alert <minutes>] [--alert <minutes>] \
[--recur daily|weekly|monthly|yearly] [--recur-count <n>] [--recur-end <YYYY-MM-DD>] \
[--json]
--alert is repeatable — adds one alert per flag (minutes before start)--recur-end and --recur-count are mutually exclusiveYYYY-MM-DD for --start and --endYYYY-MM-DDTHH:mmbash
accli update <calendarName> <eventId> \
[--summary <text>] [--start <datetime>] [--end <datetime>] \
[--location <text>] [--description <text>] \
[--alert <minutes>] [--alert <minutes>] \
[--dry-run] [--json]
--alert on update replaces all existing alerts. Omit --alert to leave alerts unchanged.
--dry-run returns { dryRun: true, wouldUpdate: { eventId, changes } } without modifying anything.
bash
accli delete <calendarName> <eventId> [--dry-run] [--json]
--dry-run returns { dryRun: true, wouldDelete: { id, summary, calendar, start, end } } without deleting.
bash
accli search --query <text> [--from <date>] [--to <date>] [--calendar-id <id>] [--json]
Case-insensitive search across summary, location, and description. Searches all calendars unless --calendar-id is provided. Returns events with calendarId field for targeting.
bash
accli export --from <date> --to <date> [--calendar-id <id>] [--json]
Exports all events grouped by calendar. Response: { calendars: [{ id, name, source, events, truncated }], totalEvents, truncated }. Each calendar truncates at 500 events per calendar and sets truncated: true if hit.
bash
accli freebusy --from <datetime> --to <datetime> [--calendar-name <name>] [--json]
Returns busy time slots across calendars.
bash
accli config set-default --calendar-id <id> [--json]
accli config show [--json]
accli config clear [--json]
Persists default calendar to ~/.acclirc (override with ACCLI_CONFIG_PATH). Commands that require a calendar use the default when no calendar is specified.
YYYY-MM-DDTHH:mm or YYYY-MM-DDTHH:mm:ssYYYY-MM-DD--json for programmatic parsing--calendar-id not calendar name (stable across renames)--dry-run before destructive operations to confirm target eventaccli search to find event IDs before update/deleteok: false in JSON response before proceedingaccli export is suitable for full calendar backup; check truncated field--alert flag — e.g. --alert 5 --alert 15CodeMeaningNOT_AUTHORIZEDCalendar access not granted or set to Add OnlyCALENDAR_NOT_FOUNDCalendar ID or name not foundAMBIGUOUS_CALENDARMultiple calendars with same name — use --calendar-id``EVENT_NOT_FOUNDEvent ID not found in calendarMISSING_REQUIREDRequired flag missingINVALID_ARGUMENTInvalid flag valueINVALID_RANGEStart is after end