apple-smart-schedule · v0.1.0 · 2026-08-04 · sha256 8bd2ba35771b11eb

apple-smart-schedule v0.1.0A

Immutable. This exact content never changes and is served at /api/v1/blob/8bd2ba35771b11eb.

---
name: apple-smart-schedule
homepage: https://github.com/cat-xierluo/legal-skills
author: 杨卫薪律师(微信ywxlaw)
version: "0.1.0"
license: MIT
description: 把一句自然语言(机票/高铁/开庭/会议/截止日期/聚会/看病等)或一张票据截图,自动变成苹果「日历」事件 + 一串按事件类型智能提前的「提醒事项」。在 macOS 上运行、经 iCloud 同步到 iPhone/iPad。当用户说「帮我加个日程/提醒」「机票 MU5137 8:30 起飞提醒我」「下周三下午开庭提前提醒」「G1234 高铁」「上诉期 15 号截止」「提前 2 小时提醒我」「把这个行程加到日历」等任何要把时间安排写进苹果日历或提醒事项的场景,都必须用本 skill。仅 macOS。
---

# apple-smart-schedule · 苹果智能日程提醒

## ⚠️ 平台限制(先读)

本 skill **仅在 macOS 上运行**:它通过 `osascript`/`remindctl` 调用 Mac 自带的「日历」和「提醒事项」App 来创建日程。

- ✅ 创建结果经 **iCloud 自动同步**到你登录同一 Apple ID 的 iPhone / iPad。
- ❌ 不能直接在 Windows / Android / Linux 上用,也不能在 iPhone 上直接运行这些脚本。
- **授权(重要)**:首次运行脚本时,macOS 会弹出「xxx 想要控制「日历」/「提醒事项」」对话框,**点「好」即可**(只此一次)。**每换一个终端 App 或新环境首次用,都会再弹一次**——因为授权是按"调用的终端 App"分别记录的(Terminal 授权了不代表 iTerm 也授权了);点过就好,无需去设置里找。只有当弹窗没出现、或曾经点过"不允许"时,才去「系统设置 › 隐私与安全性 › 自动化」把对应终端的 Calendar / Reminders 开关手动打开。

## 它做什么

用户用大白话说一件事(或发张截图),本 skill:

1. 解析出 **事件标题、开始时间、结束时间(可选)、地点、事件类型**;
2. 按事件类型套用 **默认提前量**(飞机/高铁/开庭/会议/截止/社交 各不同);
3. 在苹果日历建 **1 个事件**,在提醒事项建 **一串提前提醒**;
4. 回执告诉用户建了什么。

通用场景(同一套逻辑,不限于出行):

| 类型 | 示例输入 | 智能默认提前量 |
|---|---|---|
| ✈️ 航班 | "东航 MU5137 7/20 8:30 浦东起飞" | 前1天9点 + 前3h + 前1h |
| 🚄 高铁 | "G1234 北京南→上海虹桥 8/1 14:00" | 前1h + 前30min |
| ⚖️ 开庭 | "下周三 14:00 开庭" | 前1天9点 + 前3h + 前1h |
| 💼 会议 | "明天上午 10 点开会" | 前1天9点 + 前1h |
| ⏰ 期限 | "15 号上诉期截止" | 前3天 + 前1天 + 当天9点 |
| 🍻 社交 | "周五晚和张总吃饭" | 前1天9点 + 前2h |
| 🎯 其他 | "后天上午去体检" | 前1h |

## 核心流程(AI 执行步骤)

### 第 0 步:读配置(每次都要)

读 `$SKILL_DIR/config/config.json`,拿到:时区、默认日历名 `default_calendar`、默认提醒清单名 `default_reminder_list`、各类事件提前量 `lead_times`。
再读 `$SKILL_DIR/references/lead-times.md`,掌握**事件类型判断规则**和**提前量计算方法**。

### 第 1 步:解析输入

- **文字输入**:直接从用户消息提取 时间(日期+时分)、事件、地点、航班号/车次 等。
- **截图输入**(机票确认页、12306、微信邀约等):用视觉能力读出上述字段。
- 时间按 `config.timezone`(默认 Asia/Shanghai)理解。含糊时(如"下周三"未指定时区、只说"下午"),按最常见理解并**在回执里点明你的理解**,让用户一眼能纠正。
- 没给结束时间 → 事件默认时长 60 分钟(会议/社交够用;航班/高铁若能推断时长更好)。

### 第 2 步:判断事件类型

按 `references/lead-times.md` 的关键词表归类到 `flight / train / court / meeting / deadline / social / default` 之一。一条消息可能含多个事件(如出差=航班+到达后会议),分别处理。

### 第 3 步:算出每条提醒的绝对时间

从 `config.lead_times[类型]` 取数组,按 `lead-times.md` 的格式规则把每条换算成**绝对时间**(ISO,Asia/Shanghai)。

**用户当次覆盖优先**:若用户明说"提前 X 小时""只提醒一次",则当次只用用户指定的,忽略默认。

### 第 4 步:创建

调用脚本(路径用 `$SKILL_DIR/scripts/`):

```
# 建 1 个日历事件
$SKILL_DIR/scripts/create_event.sh "<标题>" "<default_calendar>" "<开始ISO>" ["<结束ISO>"] ["<地点>"] ["<备注>"]

# 对每个提前量,建一条提醒
$SKILL_DIR/scripts/create_reminder.sh "<标题>" "<default_reminder_list>" "<提醒绝对ISO>"
```

- 日历事件标题示例:`✈️ MU5137 上海浦东→北京首都`
- **航班/出行录关键字段**:参照 `references/lead-times.md` 的「航班详细字段录入模板」,把 航司/舱位/机型/飞行时长 整理进事件**备注**(create_event.sh 第6参数),航站楼进**地点**(第5参数)。**不录**乘客/机票号/订单号(没必要、有隐私顾虑)。
- 提醒标题加区分后缀,让用户在清单里一眼看清:`✈️ MU5137 值机打包(前1天)`、`🚄 G1234 该去车站了(前1h)`、`⚖️ 开庭准备(前3h)`。
- 脚本会自动降级:未装 `remindctl` 时用 `osascript`(提醒仍能创建,只是不能查/改/删)。

### 第 5 步:回执

给用户一个简短清单,例如:

```
已为你安排 ✈️ MU5137(2026-07-20 08:30,上海浦东 T2)
📅 日历事件已建 →「个人」日历
⏰ 提醒事项已建 3 条:
   • 07-19 09:00  值机打包(前1天)
   • 07-20 05:30  该去机场了(前3h)
   • 07-20 07:30  开始登机(前1h)
(经 iCloud 同步到你的 iPhone/iPad,稍等片刻可在手机上看到)
```

## 首次使用配置(重要)

1. 若 `config/config.json` 还不存在,从模板复制一份:
   ```
   cp config/config.example.json config/config.json
   ```
2. 跑自检,拿到你机器上真实的日历名和提醒清单名:
   ```
   bash $SKILL_DIR/scripts/setup_check.sh
   ```
3. 把输出里的**日历名**填进 `config.json` 的 `default_calendar`,**清单名**填进 `default_reminder_list`。填错不会报错——脚本会兜底落到第一个日历/默认清单,但名字对才会落到你想要的地方。

> `config.json` 是你的本地配置(被 .gitignore 忽略、不提交);`config.example.json` 是入库的默认模板。

想调整各类事件的提前量,直接改 `config.json` 的 `lead_times`(格式见 `references/lead-times.md`)。

## 安装更强后端(可选)

提醒事项默认用 `osascript`(只能创建)。装上 `remindctl` 后还能查/改/删:

```
brew install steipete/tap/remindctl
```

装不装不影响创建功能,本 skill 会自动探测。

## 脚本参考

| 脚本 | 作用 |
|---|---|
| `scripts/create_event.sh` | 建日历事件(osascript) |
| `scripts/create_reminder.sh` | 建提醒(remindctl 优先,降级 osascript) |
| `scripts/list_calendars.sh` | 列出所有日历名 |
| `scripts/list_reminder_lists.sh` | 列出所有提醒清单 |
| `scripts/setup_check.sh` | 首次自检:依赖、权限、日历/清单名 |

## 注意

- 这是改用户个人日历/提醒的操作。**创建**是安全的、可逆的(用户可在 App 里删);但如本 skill 未来扩展删除/批量操作,务必先和用户确认目标。
- 提醒数据是个人隐私,不要把日历/提醒内容发到网络或第三方服务。解析只在本地完成。
- 若用户其实想要的是飞书/钉钉/Outlook 等非苹果日历,本 skill 不适用——那些需要各自的工具。