L’interface est localisée ; les présentations et documents des Skills sont traduits automatiquement par IA dans votre langue. Le code, les commandes, chemins et termes techniques restent en version originale, et le document de l’auteur fait foi.
Explorer les Skills
Développement · SKILL.md

smart-calendar

smart-calendar

基于 macOS / iOS 苹果生态的智能日程与待办事项管理 skill。将非结构化输入(口语描述、聊天截图、邮件截图)自动解析为结构化任务,经用户确认后写入 Apple 日历 / 提醒事项,支持标签管理(工作 / 生活 / 自定义)、时间冲突检测、后续更新删除,以及按项目制自动生成工作周报(项目 - 进展 - 待办三级结构)。语言风格定位为专业正式书面语,也适用于其他需要专业书面表达的知识工作场景。单机版:每台 Mac 独立运行,数据本地存储,不做多端同步。

Independent GitHub snapshot · Automated classification · Original documentation governs

Documentation de la Skill

GitHub

name: smart-calendar description: 基于 macOS / iOS 苹果生态的智能日程与待办事项管理 skill。将非结构化输入(口语描述、聊天截图、邮件截图)自动解析为结构化任务,经用户确认后写入 Apple 日历 / 提醒事项,支持标签管理(工作 / 生活 / 自定义)、时间冲突检测、后续更新删除,以及按项目制自动生成工作周报(项目 - 进展 - 待办三级结构)。语言风格定位为专业正式书面语,也适用于其他需要专业书面表达的知识工作场景。单机版:每台 Mac 独立运行,数据本地存储,不做多端同步。 metadata: description_zh: 智能日程待办管理(单机版) description_en: Smart Calendar & Todo Manager (single-machine edition) version: 1.0-dist disable: false

smart-calendar(分发版 / 单机)

定位

单机版。每台 Mac 独立维护一份本地任务数据库(~/.smart-calendar/tasks.json)。日历事件和提醒事项本身会通过你已有的 iCloud 账号自动同步到其他 Apple 设备,但本 skill 的元数据(formal_title / 标签 / 项目 / 任务类型等)不跨机同步。如需跨设备保留完整上下文,请在同一台 Mac 上集中管理任务,或参考多机协同改造方案另行设计。

When to use

用户在以下场景触发:

  1. 输入待办事项的口语描述(如"明天之前把 A 项目方案改完发给协作方")
  2. 上传聊天截图、邮件截图等非结构化信息
  3. 要求更新或删除之前创建的日程 / 任务
  4. 要求生成工作周报
  5. 要求管理标签(添加 / 删除 / 修改任务标签)
  6. 任何涉及"把 XX 加到日历 / 提醒里"、"帮我排个日程"、"生成周报"的请求

Prerequisites

  • macOS 系统(操作 Calendar 和 Reminders app)
  • Calendar 和 Reminders app 需被允许脚本控制 — 首次运行时会弹出 系统设置 → 隐私与安全性 → 自动化 的权限请求,必须授权
  • Python 3 已安装(macOS 系统自带)
  • Apple Reminders 已建好「工作」和「生活」两个列表
  • Apple Calendar 已建好「工作」和「生活」两个 iCloud 日历

运作模型(v4.0 — Apple 当真源)

Apple Calendar / Reminders 是真源,本 skill 的 tasks.json 是本地缓存。

                     [写入]
用户 / agent ─────────────────────────► Apple Reminders / Calendar
                                              │
                                              │ 列表名 = 主标签的物理载体
                                              │ description / body 末尾 = metadata block
                                              │(project, task_type, aux_tags, formal_title)
                                              │
                          iCloud 跨设备同步 ◄──┘
                                              │
                     [读取 / sync]            ▼
tasks.json ◄───────────────────────  Mac / iPhone
(本地缓存,可重建)

核心规则:

  • 创建任务时,agent 决定主标签 --tag-major work|life → 自动写入对应列表 / 日历
  • 元数据(project / task_type / aux_tags / formal_title)走 metadata block 跟着事件本体同步
  • 跨机一致 + iPhone 友好(手动加到「工作」列表的任务也会被 skill 识别为「工作」)
  • sync 命令随时从 Apple 真源重建 tasks.json

Loop 层(可选自动心跳)

harness 让 agent 能干活,loop 让"同步 + 周报"被持续调度、验证、记录。默认不启用。

两个心跳命令(手动可跑,也可挂 launchd 自动跑 — 见 README「启用自动 loop」节):

python3 .../task_manager.py loop-tick --mode daily    # 每日 sync
python3 .../task_manager.py loop-tick --mode weekly   # sync + 出周报
python3 .../task_manager.py loop-status               # 查看 loop 健康

A+B minimum viable loop:automation(launchd)+ skill(本 skill)+ state file(loop-state.json,含 30 条 history 滚动)+ gate(结构性断言:SYNC_DONE + tasks.json 可解析 + 报告 size>800 + 含必需段落;失败弹 Basso 通知 + 写 last_error + exit 1)。

设计原则:确定性机械操作用结构性断言 gate,不引 maker/checker;cron 单跑天然 hard-stop;失败必显式上报。判断类工作(哪些算重点、对外投递)不进 loop。

首次配置

首次使用时 skill 会自动创建默认配置(~/.smart-calendar/config.json)。建议确认 / 修改以下字段:

  1. 周报标题与团队名(默认标题为"个人工作周报",team_name 为空):

    # 个人使用:默认即"个人工作周报",无需配置;如需改名再 set-config
    python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py set-config \
      --key weekly_report.report_title --value "重点项目周报"
    # 团队 / 小组场景:设置 team_name,标题变成 "{team_name}{report_title}"
    python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py set-config \
      --key weekly_report.team_name --value "项目组"
    

    最终周报标题 = {team_name}{report_title};team_name 为空时只用 report_title。

  2. 周报输出目录(必须设置,否则周报只能输出到控制台):

    python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py set-config \
      --key weekly_report.output_dir \
      --value "/path/to/your/weekly/report/folder"
    
  3. 查看当前配置:

    python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py get-config
    
  4. 可选:自定义数据目录(指向 iCloud Drive 或其他位置,用于测试隔离):

    export SMART_CALENDAR_DATA_DIR="$HOME/Library/Mobile Documents/com~apple~CloudDocs/smart-calendar"
    

    ⚠️ 注意:iCloud Drive 跨机同步不是事务性的,两端同时写会产生 .conflicted 文件。单机版不建议把 DATA_DIR 放 iCloud Drive,仅作测试用途。

Steps

阶段一:解析输入

  1. 接收用户输入(文字或图片)。如果是图片,使用多模态能力提取文字内容。
  2. 从输入中提取以下结构化字段:
    • 任务标题(核心描述)
    • 任务类型:文件审阅 / 反馈 / 调研 / 文书撰写 / 会议 / 其他
    • 所属项目(用户根据自己业务确定,例如"A 项目"、"X 收购"、"客户 Y"等)
    • 截止时间(日期 + 可选时间)
    • 开始时间(如有明确起止时段则提取)
    • 结束时间(如有明确起止时段则提取)
    • 优先级:高 / 中 / 低
    • 相关人员(协作方 / 相关方 / 管理层等)
    • 备注(额外上下文)
  3. 信息不完整时(缺少截止时间、任务类型模糊、所属项目不明确),向用户确认。每个待确认字段提供"留白 / 不回答"选项。用户选择留白时基于已有信息和上下文推断默认值。

阶段二:主标签判定 + 次标签收集(v4.0 关键设计)

  1. 主标签:基于任务内容判断「工作」or「生活」。判断规则:
    • 涉及业务项目名、专业术语(方案、审阅、调研、评审会等)、工作相关人员(协作方、外部顾问、管理层)→ 工作
    • 涉及家庭、购物、健身、休闲、个人事务 → 生活
    • 无法明确判断时,主动询问用户:"这个任务属于工作还是生活?"
  2. 主标签的物理载体是 Apple 列表 / 日历(不是 tasks.json 字段):
    • 工作任务 → 写入「工作」列表 + 「工作」日历
    • 生活任务 → 写入「生活」列表 + 「生活」日历
    • 这是真源 — 即使在 iPhone 上把一条 reminder 从「工作」拖到「生活」,sync 后 skill 也会立即识别为「生活」
  3. 次标签(紧急、自定义)走 metadata block,与主标签分层:
    • 不为每个次标签建 Apple 列表(避免列表爆炸)
    • 次标签通过 --meta-aux-tags 写入 reminder body / event description 末尾的 metadata block
    • 用户可随时添加自定义次标签:
      python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py add-tag "紧急"
      

标签别名说明:内部规范用中文标签(工作 / 生活)。agent 用英文写入 work / Work / WORK / life / Life / LIFE 会自动归一化为对应中文。--tag-major 同样接受这些别名。

阶段三:确认与正式用语生成

  1. 将提取的结构化信息展示给用户:

    📋 识别到的任务信息
    ──────────────────────────────
    任务标题:[提取的标题]
    任务类型:[类型]
    所属项目:[项目名]
    截止时间:[日期 时间]
    优先级:[高/中/低]
    标签:[工作/生活/自定义]
    相关人员:[人员列表]
    备注:[备注]
    ──────────────────────────────
    🎯 将创建:提醒事项 / 日历事件 / 两者
    
  2. 用户确认后生成正式用语(专业书面语):

    • 标题正式化:口语化描述转专业书面语
    • 备注正式化:补充完整上下文,使用专业术语
    • 示例:"明天把 A 项目方案改完" → "A 项目方案修订及定稿 —— 根据内部审阅意见完成方案文本修订并发送协作方确认"

阶段四:冲突检测

  1. 写入前检查时间冲突:
    python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py check-conflict \
      --date "YYYY-MM-DD" [--time "HH:MM"] [--duration 60]
    
    • 给定 --time 时按 [time, time + duration) 区间做真正的重叠判断
    • 不给 --time 时返回当天全部事件
  2. 有冲突时展示详情并询问用户是否继续:
    ⚠️ 时间冲突提示
    该时段已有以下日程:
    - 14:00-15:30  A 项目内部讨论会
    是否继续创建?
    

阶段五:智能路由与写入

  1. 根据任务特征智能路由:

    • 仅提醒事项:只有截止时间、无明确起止时段的任务型工作(如"周五前提交审阅意见")
    • 仅日历事件:有明确起止时间的会议 / 约会(如"周三下午 2-4 点评审会")
    • 两者同时创建:有截止时间的复杂任务,提醒事项记录任务本身、日历事件预留工作时段
    • 默认偏好:任务型居多时路由到提醒事项;有明确时段时路由到日历
  2. 执行写入(v4.0:用 --tag-major + --meta-* 参数):

    # 创建提醒事项(不指定 --list 时自动按 --tag-major 选「工作」/「生活」列表)
    python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py create-reminder \
      --title "正式标题" \
      --tag-major work \
      --due "YYYY-MM-DD HH:MM" \
      --notes "正式备注" \
      --priority [1|2|3] \
      --meta-project "项目名" \
      --meta-task-type "文件审阅" \
      --meta-aux-tags "紧急,待审" \
      --meta-formal-title "正式标题"
    
    # 创建日历事件(同理,不指定 --calendar 时自动按 --tag-major 选)
    python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py create-event \
      --title "正式标题" \
      --tag-major work \
      --start "YYYY-MM-DD HH:MM" \
      --end "YYYY-MM-DD HH:MM" \
      --notes "正式备注" \
      --meta-project "项目名" \
      --meta-task-type "会议"
    

    --tag-major 接受 work / life / 工作 / 生活,自动归一化。 metadata block 会被追加到 reminder body / event description 末尾,跨机同步、跨端可读。

阶段六:本地索引(可选)+ sync

  1. v4.0 下 Apple 是真源,tasks.json 是本地缓存。如果只是创建任务,无需手动 save-task — 跑 sync 命令可随时从 Apple 重建 tasks.json。但如果想立即更新本地索引(避免下次跑 search 时漏掉刚创建的任务),可显式保存:
    python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py save-task \
      --task-id "auto-generated-uuid" \
      --user-input "原始输入" \
      --parsed-json '{...}' \
      --formal-title "..." \
      --formal-notes "..." \
      --calendar-event-id "..." \
      --reminder-id "..." \
      --project "项目名" \
      --task-type "类型" \
      --major-tag work \
      --aux-tags "紧急"
    
  2. sync 命令 — 从 Apple 真源重建 tasks.json(推荐定期跑,尤其在 iPhone 手动加任务后):
    python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py sync
    # 可选参数:
    #   --months-back 6 / --months-forward 3   日历事件扫描范围
    #   --dry-run                              只 print 不写盘
    
    sync 行为:
    • 扫白名单内的 Reminders 列表(work_lists + life_lists)的未完成 reminders
    • 扫白名单内的 Calendar 日历(work_calendars + life_calendars)的指定时间范围内事件
    • 解析每条 description / body 末尾的 metadata block 还原 project / task_type / aux_tags / formal_title
    • 主标签由所在列表 / 日历名物理推断(不读 metadata 里的 tags 字段)
    • 写盘前自动备份 tasks.json.bak
  3. 数据库路径:~/.smart-calendar/tasks.json(可通过 SMART_CALENDAR_DATA_DIR 环境变量覆盖)

阶段七:更新 / 删除

  1. 用户要求更新 / 删除时:
    • 搜索本地数据库匹配关键词:
      python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py search "关键词"
      
    • 展示匹配结果,让用户选择要操作的记录
    • 执行更新或删除:
      python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py update \
        --task-id "xxx" --field "title" --value "新标题"
      
      python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py delete \
        --task-id "xxx"
      

阶段八:周报生成

  1. 用户主动触发周报(本版本不实现自动定时;如需周五自动提示请用 launchd / cron 自行配置):
    # 输出到控制台
    python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py weekly-report
    
    # 写入文件(使用配置的输出目录)
    python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py weekly-report \
      --output-dir "/path/to/output"
    
  2. 周报规则:
    • 时间范围:上周五 18:00 至 本周五 17:00(在 Mon-Thu 触发时返回上一个已结束的周期)
    • 过滤条件:只提取带"工作"标签的日程和待办
    • 结构:项目 - 进展 - 待办 三级结构
    • 进展:本周时间范围内有活动的任务(创建 / 更新 / 截止)
    • 待办:截止时间在本周期结束后、或没有截止时间但状态仍为 active 的任务
    • 期号计算:基于固定锚点(2026-01-02)按周递推,跨机一致
    • 输出格式:Markdown 文件
    • 文件名:{team_name}{report_title}(YYYY-MM-DD).md(默认 个人工作周报(YYYY-MM-DD).md)

Pitfalls

  1. Calendar / Reminders 权限:首次运行 AppleScript 会弹权限请求。用户拒绝后所有写入都会失败,且不会再次弹窗 — 需手动到 系统设置 → 隐私与安全性 → 自动化 重新授权。
  2. AppleScript 字符转义:标题 / 备注中的双引号、反斜杠、换行符都会被自动转义,但极少数情况可能仍需手动检查。
  3. 时间格式:AppleScript 的 date 构造对格式敏感,必须使用 YYYY-MM-DD HH:MM:SS 格式。
  4. 时区:Calendar 和 Reminders 使用系统时区。created_at / updated_at 落盘时带本地时区,周报范围判断已做 timezone-aware 处理。
  5. 并发写入:JSON 数据库采用原子重命名写入。单进程使用安全,但多进程并发写入仍有竞态风险(读 - 改 - 写之间不持锁)。单机交互式使用一般不会触发。
  6. 模糊时间解析:用户说"明天""下周一"等相对时间,需要 agent 根据当前日期正确计算绝对日期。
  7. 日历 / 列表名约定(v4.0 关键):skill 假设 Apple 已有「工作」和「生活」两个 Reminders 列表 + 两个 Calendar 日历(首次配置时必须建好)。默认 --tag-major work 写入「工作」列表 / 「工作」日历,不要手写 --list "提醒事项" 或 --calendar "Work"(v3 旧法,会落到错误列表)。如需 override 列表名,确认目标真实存在,并通过 work_lists / life_lists / work_calendars / life_calendars 配置白名单(允许多名共存)。第一次写入前可用 list-calendars / list-reminder-lists 验证。
  8. 截图解析失败:图片 OCR 可能识别错误,关键字段(尤其是时间和人名)必须向用户二次确认。
  9. 多端同步限制:本 skill 不做多端协同。Mac A 创建的任务在 Mac B 上跑搜索 / 更新 / 周报命令会完全看不到 — 因为元数据数据库 tasks.json 是本地文件。Apple 日历 / 提醒本身会跨设备同步,但脱离本 skill 的元数据上下文。如需多机协同,请按用户需求定制改造。

Verification

  1. 创建任务后,打开 Calendar / Reminders app 验证事件 / 提醒是否成功创建
  2. 检查 iPhone / iPad 上是否同步出现
  3. 运行 list-recent --limit 5 查看最近创建的记录
  4. 运行 list-tags 查看标签列表
  5. 周报生成后,核对任务数量与数据库记录是否一致,确认"生活"标签任务未被包含

数据持久化格式

任务记录

每个任务以 JSON 对象存储在 ~/.smart-calendar/tasks.json:

{
  "task_id": "uuid-v4",
  "user_input": "用户原始输入",
  "parsed": {
    "title": "提取标题",
    "task_type": "文件审阅|反馈|调研|文书撰写|会议|其他",
    "project": "项目名",
    "deadline_date": "2026-05-22",
    "deadline_time": "17:00",
    "start_datetime": null,
    "end_datetime": null,
    "priority": "高|中|低",
    "related_people": ["人员1", "人员2"],
    "notes": "额外上下文"
  },
  "formal_title": "正式用语标题",
  "formal_notes": "正式用语备注",
  "calendar_event_id": "Apple Event UID 或 null",
  "reminder_id": "Apple Reminder ID 或 null",
  "tags": ["工作"],
  "created_at": "2026-05-20T14:30:00+08:00",
  "updated_at": "2026-05-20T14:30:00+08:00",
  "status": "active|completed|cancelled"
}

配置文件

~/.smart-calendar/config.json:

{
  "tags": ["工作", "生活"],
  "weekly_report": {
    "enabled": true,
    "output_dir": "",
    "generate_day": "friday",
    "generate_time": "17:00",
    "team_name": "",
    "report_title": "个人工作周报"
  },
  "first_run": true
}

CLI 命令速查

# 日历 / 提醒操作(v4.0:用 --tag-major + --meta-*)
python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py list-calendars
python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py list-reminder-lists
python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py create-event \
  --title "..." --tag-major work --start "YYYY-MM-DD HH:MM" --end "YYYY-MM-DD HH:MM" \
  --meta-project "..." --meta-task-type "..."
python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py create-reminder \
  --title "..." --tag-major work --due "YYYY-MM-DD HH:MM" \
  --meta-project "..." --meta-aux-tags "紧急" --meta-formal-title "..."

# v4.0:从 Apple 真源重建 tasks.json
python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py sync
python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py sync --dry-run

# 任务管理
python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py save-task \
  --task-id "..." --parsed-json '{...}' --tags "工作"
python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py search "关键词"
python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py update \
  --task-id "xxx" --field "status" --value "completed"
python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py delete --task-id "xxx"
python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py list-recent --limit 10

# 标签管理
python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py list-tags
python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py add-tag "紧急"
python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py remove-tag "紧急"
python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py set-task-tags \
  --task-id "xxx" --tags "工作,紧急"

# 冲突检测
python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py check-conflict \
  --date "YYYY-MM-DD" --time "HH:MM" --duration 60

# 周报
python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py weekly-report
python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py weekly-report \
  --output-dir "/path/to/output"

# 配置
python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py get-config
python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py set-config \
  --key weekly_report.team_name --value "项目组"
python3 ~/.claude/skills/smart-calendar/scripts/task_manager.py set-config \
  --key weekly_report.output_dir --value "/path"

文件结构

~/.claude/skills/smart-calendar/
├── SKILL.md                          # 本文件
├── README.md                         # 安装与定位说明
├── scripts/
│   ├── task_manager.py               # Python 核心控制器
│   └── smoke_test.py                 # 冒烟测试
├── references/
│   └── applescript_api.md            # AppleScript API 参考
└── templates/
    └── weekly_report.md              # 周报模板(参考用,当前由代码直接拼装)

~/.smart-calendar/          # 数据目录(运行时自动创建)
├── tasks.json                        # 任务数据库
├── config.json                       # 配置文件
└── tmp_*.scpt                        # 临时 AppleScript 文件(用完自动清理)

已知边界

v4.0 已实现方向 B(Apple 真源 + metadata block + sync),单机版上限大致到这里。剩余边界:

  • 写入并发锁:多进程同时写 tasks.json 仍有竞态风险(单进程交互使用不触发)
  • 周五自动触发:周报生成需用户或外部 scheduler(如 launchd / cron)触发,skill 不内嵌
  • Reminder 标记完成:update task status 到 completed 不会反向标记 Reminders.app 里的提醒
  • sync 性能:大型 Apple 库下首次 sync 可能 30~60 秒(实测:少量 active reminder + 几十 calendar event ≈ 51 秒)
  • 多机协同(部分实现):Apple Calendar / Reminders 通过 iCloud 跨机同步是真源;tasks.json 仍是各机本地缓存。如需在 Mac B 同样体验完整 skill,需另行安装本 skill 并跑一次 sync 重建本地缓存
Skills enregistrées