macOS Calendar
Manage Apple Calendar events via $SKILL_DIR/scripts/calendar.sh. All date handling uses relative math (current date + N * days) to avoid locale issues (FR/EN/DE date formats).
Quick start
List calendars
Always list calendars first to find the correct calendar name:
CODEBLOCK0
Create an event
CODEBLOCK1
JSON fields:
| Field | Required | Default | Description |
|---|
| INLINECODE2 | yes | - | Event title |
| INLINECODE3 |
no | first calendar | Calendar name (from list-calendars) |
|
description | no | "" | Event notes |
|
offset_days | no | 0 | Days from today (0=today, 1=tomorrow, 7=next week) |
|
iso_date | no | - | Absolute date
YYYY-MM-DD (overrides offset_days) |
|
hour | no | 9 | Start hour (0-23) |
|
minute | no | 0 | Start minute (0-59) |
|
duration_minutes | no | 30 | Duration |
|
alarm_minutes | no | 0 | Alert N minutes before (0=no alarm) |
|
all_day | no | false | All-day event |
|
recurrence | no | - | iCal RRULE string. See
references/recurrence.md |
Interpreting natural language
Map user requests to JSON fields:
| User says | JSON |
|---|
| "tomorrow at 2pm" | INLINECODE14 |
| "in 3 days" |
offset_days: 3 |
| "next Monday at 10am" | Calculate offset_days from today to next Monday,
hour: 10 |
| "February 25 at 3:30pm" |
iso_date: "2026-02-25", hour: 15, minute: 30 |
| "every weekday at 9am" |
hour: 9, recurrence: "FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR" |
| "remind me 1 hour before" |
alarm_minutes: 60 |
| "all day event on March 1" |
iso_date: "2026-03-01", all_day: true |
For "next Monday", "next Friday" etc: compute the day offset using the current date. Use date command if needed:
CODEBLOCK2
Example prompts
These are real user prompts and the commands you should run:
"Remind me to call the dentist in 2 days"
"$SKILL_DIR/scripts/calendar.sh" list-calendars
Then:
CODEBLOCK4
"Schedule a team sync every Tuesday at 2pm with a 10-min reminder"
CODEBLOCK5
"Block July 15 as a vacation day"
CODEBLOCK6
"I have a doctor appointment next Thursday at 3:30pm, remind me 1 hour before"
# First compute offset_days to next Thursday (4=Thursday)
target=4; today=$(date +%u); offset=$(( (target - today + 7) % 7 )); [ "$offset" -eq 0 ] && offset=7
Then:
CODEBLOCK8
"Set up a daily standup at 9am on weekdays for the next 4 weeks"
CODEBLOCK9
"Add a biweekly 1-on-1 with my manager on Fridays at 11am"
CODEBLOCK10
Critical rules
- 1. Always list calendars first if the user hasn't specified one — calendars marked
[read-only] cannot be used for event creation - Never use hardcoded date strings in AppleScript — always use
offset_days or INLINECODE24 - Confirm the calendar name with the user if multiple personal calendars exist
- Never target a
[read-only] calendar — the script will reject it with an error - For recurring events, consult references/recurrence.md for RRULE syntax
- Pass JSON via stdin — never as a CLI argument (avoids leaking data in process list)
- All fields are validated by the script (type coercion, range checks, format validation) — invalid input is rejected with an error message
- All actions are logged to
logs/calendar.log with timestamp, command, calendar, and summary
macOS日历
通过 $SKILL_DIR/scripts/calendar.sh 管理 Apple 日历事件。所有日期处理均使用相对计算(当前日期 + N * 天)以避免区域设置问题(FR/EN/DE 日期格式)。
快速开始
列出日历
始终先列出日历以找到正确的日历名称:
bash
$SKILL_DIR/scripts/calendar.sh list-calendars
创建事件
bash
echo | $SKILL_DIR/scripts/calendar.sh create-event
JSON 字段:
| 字段 | 必填 | 默认值 | 描述 |
|---|
| summary | 是 | - | 事件标题 |
| calendar |
否 | 第一个日历 | 日历名称(来自 list-calendars) |
| description | 否 | | 事件备注 |
| offset_days | 否 | 0 | 从今天起的天数(0=今天,1=明天,7=下周) |
| iso
date | 否 | - | 绝对日期 YYYY-MM-DD(覆盖 offsetdays) |
| hour | 否 | 9 | 开始小时(0-23) |
| minute | 否 | 0 | 开始分钟(0-59) |
| duration_minutes | 否 | 30 | 持续时间 |
| alarm_minutes | 否 | 0 | 提前 N 分钟提醒(0=无提醒) |
| all_day | 否 | false | 全天事件 |
| recurrence | 否 | - | iCal RRULE 字符串。参见
references/recurrence.md |
自然语言解析
将用户请求映射到 JSON 字段:
| 用户表述 | JSON |
|---|
| 明天下午2点 | offsetdays: 1, hour: 14 |
| 3天后 |
offsetdays: 3 |
| 下周一上午10点 | 计算从今天到下周一的天数,hour: 10 |
| 2月25日下午3:30 | iso_date: 2026-02-25, hour: 15, minute: 30 |
| 每个工作日上午9点 | hour: 9, recurrence: FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR |
| 提前1小时提醒我 | alarm_minutes: 60 |
| 3月1日的全天活动 | iso
date: 2026-03-01, allday: true |
对于下周一、下周五等:使用当前日期计算天数偏移。必要时使用 date 命令:
bash
距离下周一的天数(1=周一)
target=1; today=$(date +%u); echo $(( (target - today + 7) % 7 ))
示例提示
以下是真实的用户提示及应运行的命令:
提醒我2天后给牙医打电话
bash
$SKILL_DIR/scripts/calendar.sh list-calendars
然后:
bash
echo {calendar:Personnel,summary:Call dentist,offsetdays:2,hour:9,durationminutes:15,alarmminutes:30} | $SKILLDIR/scripts/calendar.sh create-event
安排每周二下午2点的团队同步会议,提前10分钟提醒
bash
echo {calendar:Work,summary:Team sync,hour:14,durationminutes:60,recurrence:FREQ=WEEKLY;BYDAY=TU,alarmminutes:10} | $SKILL_DIR/scripts/calendar.sh create-event
将7月15日设为休假
bash
echo {calendar:Personnel,summary:Vacances,isodate:2026-07-15,allday:true} | $SKILL_DIR/scripts/calendar.sh create-event
我下周四下午3:30有医生预约,提前1小时提醒我
bash
首先计算到下周四的天数(4=周四)
target=4; today=$(date +%u); offset=$(( (target - today + 7) % 7 )); [ $offset -eq 0 ] && offset=7
然后:
bash
echo {\calendar\:\Personnel\,\summary\:\Doctor appointment\,\offsetdays\:$offset,\hour\:15,\minute\:30,\durationminutes\:60,\alarmminutes\:60} | $SKILLDIR/scripts/calendar.sh create-event
设置未来4周工作日上午9点的每日站会
bash
echo {calendar:Work,summary:Daily standup,hour:9,durationminutes:15,recurrence:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR;COUNT=20} | $SKILLDIR/scripts/calendar.sh create-event
添加与经理每两周一次周五上午11点的一对一会议
bash
echo {calendar:Work,summary:1-on-1 Manager,hour:11,durationminutes:30,recurrence:FREQ=WEEKLY;INTERVAL=2;BYDAY=FR,alarmminutes:5} | $SKILL_DIR/scripts/calendar.sh create-event
关键规则
- 1. 如果用户未指定日历,始终先列出日历 — 标记为 [read-only] 的日历不能用于创建事件
- 切勿在 AppleScript 中使用硬编码的日期字符串 — 始终使用 offsetdays 或 isodate
- 如果存在多个个人日历,请与用户确认日历名称
- 切勿针对 [read-only] 日历 — 脚本会拒绝并报错
- 对于重复事件,请查阅 references/recurrence.md 了解 RRULE 语法
- 通过标准输入传递 JSON — 切勿作为 CLI 参数(避免在进程列表中泄露数据)
- 所有字段均由脚本验证(类型强制转换、范围检查、格式验证)— 无效输入将被拒绝并显示错误信息
- 所有操作均记录到 logs/calendar.log,包含时间戳、命令、日历和摘要