Install
openclaw skills install @alan1527061/apple-calpalApple Calendar Pal —— 个人日程管家。导入课表/排班/考试等固定日程并推送 iPhone 日历; 聊天规划行程:查空闲、天气、日落、路程,倒推「几点必须出门」;查询/写入/取消 iCloud 日历(CalDAV 直连苹果服务器,手机几秒同步)。Use whenever the user mentions their 课表/排班/值班/考试安排, says they 想去哪/想做什么/约了谁, asks 有没有空/哪天合适/几点出门, or wants events added to, removed from, or checked in their Apple calendar.
openclaw skills install @alan1527061/apple-calpal管两类数据、做三个动作。所有能力通过 scripts/ 里的命令行脚本实现,
脚本全部纯 Python 标准库,零第三方依赖(NAS 上只要有 python3 就能跑)。
data/profile.json —— 家坐标(home)、两类日历的名字(calendars)。ls data/commitments/ 并读入全部承诺文件 —— 这是主人的固定日程,
规划时必须避让。用户的表达里出现"明天/下周三/这周末"时,先用当前日期换算成具体 YYYY-MM-DD, 拿不准当天星期几就先确认,不要猜。
| 承诺类 | 安排类 | |
|---|---|---|
| 来源 | 外部权威(学校/公司),批量导入 | 对话中产生,一次一条 |
| 变动 | 低频(换学期/换班才动) | 随时新增取消 |
| 例子 | 课表、排班、考试、例会 | 出游、约会、提醒 |
| 日历 | calendars.commitments | calendars.plans |
绝不动承诺日历(脚本层也拦截了),取消临时安排永远只碰行程日历。
触发:用户给课表 docx / 排班表截图 / 口述的固定安排。
weeks 数组,不要拆成多条;data/commitments/<名字>.json(如 2026秋课表.json)。python scripts/cal.py push data/commitments/<名字>.json(会自动展开周次为具体日期)。
推完告诉用户手机日历几秒内可见,换周次提醒已按 default_alarm_minutes.commitments 设置。spec 格式(也是 push 接受的输入格式):
{
"name": "2026秋课表",
"week1_monday": "2026-08-31",
"skip_dates": [],
"events": [
{"title": "计算机视觉", "teacher": "张丽", "location": "沙教2-505",
"weekday": 1, "start": "08:00", "end": "09:35", "weeks": [1,2,3],
"alarm_minutes": 25}
]
}
weekday:1=周一 … 7=周日。weeks 是学期周次。skip_dates 放全校放假日的
YYYY-MM-DD(展开时自动扣除)。alarm_minutes 缺省用 profile 里的默认值。
动作二、三用的临时安排走同一格式的精简版:事件不带 weeks,直接给 "date": "2026-10-03",
顶层不用 week1_monday,推送时 --calendar 行程(默认就是行程日历)。
用户说想去哪/想做什么:
python scripts/cal.py query --date <日期> —— 该日已有占用,含承诺和已有安排;python scripts/env_tools.py trip <地名> <日期> —— 坐标、开放时间、日出日落、天气一次拿全;amap_key:python scripts/route.py transit <家lat> <家lon> <终点lat> <终点lon>
和 driving 同理,两种方式都查(实测公交和驾车能差三倍,学生主要靠公交);
没配 key 就自己按距离保守估算,并明确告诉用户"这是估算"。open_hours(到了发现闭馆是最低级错误)。alarm_minutes: null),
除非用户明确说"提前 X 分钟提醒我";alarm_minutes = 开始时刻 − 出发时刻(倒推/用户指定的出发时间之前多少分钟);
用户明确指定提前量时以用户为准;python scripts/cal.py push <plan.json> 写入行程日历。
plan.json 是临时文件,写进 skill 目录外的临时路径即可。query --date 看那天有什么,把要删的列给用户确认,
再 python scripts/cal.py cancel --date <日期>(可加 --title 关键词 精确匹配)。
脚本只删 calpal- 前缀的事件,主人手工建的、旧管道写的课表不会被碰。python scripts/cal.py calendars # 列日历
python scripts/cal.py query --date D [--days N] [--calendar 名]
python scripts/cal.py push plan.json [--dry-run] [--calendar 名]
python scripts/cal.py cancel --date D [--title 词] / cancel --uid U
python scripts/env_tools.py geocode 地名 / sun lat lon 日期 / weather lat lon 日期 [16-20]
python scripts/env_tools.py trip 地名 日期 # 规划首选,一次拿全
python scripts/route.py driving|transit 家lat 家lon 终lat 终lon
脚本输出要么是人读的进度行,要么是 JSON;解析 JSON 时容忍 stderr 的进度提示。 所有脚本在 skill 目录外也能跑(路径基于脚本自身位置解析)。