OA0 = Omni AI 0
OA0 是一个探索 AI 的论坛
现在注册
已注册用户请  登录
OA0  ›  技能包  ›  daily-briefing:整合天气与日历的温馨紧凑型每日简报

daily-briefing:整合天气与日历的温馨紧凑型每日简报

 
  transfer ·  2026-02-05 08:52:42 · 3 次点击  · 0 条评论  

名称: daily-briefing
描述: 生成一份温暖、简洁的每日简报,包含天气、日历、提醒事项、生日和重要邮件,适用于 cron 或聊天交付。
元数据: {"openclaw":{"emoji":"🌅","requires":{"os":["darwin"],"bins":["curl","bash"]},"optional_bins":["icalpal","gog","himalaya"]}}
user-invocable: true


daily-briefing

生成一份简洁、温暖的每日消息,适合通过 cron 交付(标准输出/聊天回复)。即使在信息最少的情况下也能确保成功。


技能类型:系统技能(编排器模式)

此技能使用系统技能模式在 macOS 上执行。代理必须:

  1. 绝不直接运行原始 CLI 命令(获取天气的 curl 除外)。
  2. 始终调用运行脚本来收集数据。
  3. 脚本完成后,从 JSON 中读取收集的数据
  4. 使用代理自身能力生成简报文本

快速参考:

# 调用数据收集器(等待完成)
"{baseDir}/skills/daily-briefing/bin/run_daily_briefing.sh"

# 读取输出
cat /tmp/daily_briefing_data.json

输出契约(严格)

关键: 仅输出简报文本。不要前言、解释、"完成"、文件路径、工具输出,也不要在简报周围使用 Markdown 代码块。

第 1 行格式(必需)

第 1 行必须完全以适合时间的问候语开头:

{时间问候语} - 今天是{星期几}, {月份} {日}, {年}。{天气描述句}。
  • 使用完整的月份名称(例如,"February",而非 "Feb")。
  • 如果今天是用户的生日(通过联系人姓名匹配):将问候语替换为:
    🎉 生日快乐!今天是{星期几}, {月份} {日}, {年}。{天气描述句}。

问候语选择(本地时间)

时间范围 问候语
05:00–11:59 早上好
12:00–16:59 下午好
17:00–21:59 晚上好
22:00–04:59 晚安
未知 早上好(默认)

天气描述句规则

如果天气数据可用:

{天气状况},气温大约 {温度}°{时间子句}{最低温子句}{降水子句}。
  • 如果最高温可靠 → 时间子句:"今天下午"
  • 否则使用当前温度 → 时间子句:"现在"
  • 如果存在最低温:追加 ,最低温约 {最低温}°
  • 如果降水概率 ≥30%:追加 ,并有 {概率}% 的 {雨/雪/降水} 可能

如果天气数据不可用: 使用确切的备用句:

我现在无法获取天气信息。

布局规则

{第 1 行:包含天气描述句的问候语}

{生日部分 - 仅当今天或即将有生日时显示}

{日历事件部分 - 仅当有事件时显示}

{提醒事项部分 - 仅当有提醒时显示}

{重要邮件部分 - 仅当启用且有邮件时显示}

{锚点 - 仅当从上下文中能推断出真实优先级时显示}

{结束语 - 始终必需}
  • 第 1 行后始终包含一个空行
  • 每个部分(如果存在)之间用空行分隔。
  • 根据启用的集成,目标行数约为 5–15 行

氛围与语气

  • 送给一天的温柔礼物:温暖、平静、富有同情心、充满希望。
  • 不责备、不催促、不施加生产力压力。
  • 适合 Telegram:短行、宽松间距、易于浏览。

系统技能执行

步骤 1:检查模式(交互式 vs Cron)

如果是交互式模式且缺少关键信息(位置/时区/单位):
- 在生成简报前,简要提示缺少的信息。
- 提供集成功能的开关选项。
- 提及重要邮件功能:说明它使用 AI 驱动的语义分析来突出显示需要处理的邮件(交易、发货、安全警报等),可以通过配置中的 emails.enabled 启用;注意 iCloud 邮件需要应用专用密码 (emails.icloudPassword)。

如果是非交互式模式(cron/自动化):
- 不要提问(确保 cron 安全)。使用默认值。
- 不要创建或修改任何文件。
- 不要生成后台任务/子代理。
- 如果位置不可用,省略天气部分

步骤 2:调用数据收集器

"{baseDir}/skills/daily-briefing/bin/run_daily_briefing.sh"
  • 运行脚本会执行 scripts/daily_briefing_orchestrator.sh
  • TCC 权限已授予 Terminal.app(或调用进程)。

步骤 3:读取收集的数据

应用完成后,读取:

/tmp/daily_briefing_data.json

JSON 结构:

{
  "generated_at": "ISO 时间戳",
  "system": {
    "timezone": "America/New_York",
    "local_time": "2024-02-03T08:30:00",
    "hour": 8
  },
  "config": {
    "location": "New York, NY",
    "units": "C",
    "birthdays_enabled": true,
    "birthdays_lookahead": 14,
    "calendar_google_enabled": true,
    "calendar_icloud_enabled": true,
    "calendar_lookahead": 0,
    "reminders_enabled": true,
    "reminders_due_filter": "today",
    "reminders_include_past_due": true,
    "emails_enabled": false,
    "emails_limit": 10,
    "emails_sort_newest": true,
    "emails_starred_first": true,
    "emails_unread_only": true
  },
  "birthdays": {
    "available": true,
    "user_birthday_today": false,
    "data": [
      {"name": "Jane Doe", "date": "2024-02-03", "days_until": 0},
      {"name": "John Smith", "date": "2024-02-05", "days_until": 2}
    ]
  },
  "calendar": {
    "available": true,
    "data": [
      {"title": "团队站会", "start": "09:00", "end": "09:30", "all_day": false, "date": "2024-02-03", "source": "google"},
      {"title": "医生预约", "start": null, "end": null, "all_day": true, "date": "2024-02-03", "source": "icloud"}
    ]
  },
  "reminders": {
    "available": true,
    "data": [
      {"title": "取处方药", "due": "2024-02-03"}
    ]
  },
  "emails": {
    "available": true,
    "data": [
      {"id": "abc123", "from": "Amazon", "from_email": "shipment@amazon.com", "subject": "您的订单已发货", "preview": "您的包裹正在运送中...", "starred": false, "unread": true, "date": "2024-02-03T07:30:00Z", "source": "gmail"},
      {"id": "def456", "from": "Chase", "from_email": "alerts@chase.com", "subject": "付款已收到", "preview": "我们已收到您的付款...", "starred": true, "unread": true, "date": "2024-02-03T06:15:00Z", "source": "icloud"}
    ]
  },
  "contacts": {
    "available": true,
    "data": [
      {"name": "Jane Doe", "email": "jane@example.com"},
      {"name": "John Smith", "email": "john@example.com"}
    ]
  }
}

步骤 4:获取天气(代理任务)

代理必须直接使用 curl 获取天气(不通过编排器):

curl -fsSL --max-time 12 "https://wttr.in/{编码后的位置}?format=j1"
  • 位置: 使用收集数据中的 config.location;如果为空/空值,则天气不可用。
  • 重试: 失败时重试一次。
  • 如果仍然失败或不可用: 天气不可用;使用备用描述句。

从 JSON 响应中解析:
- 天气状况:current_condition[0].weatherDesc[0].value
- 当前温度(C):current_condition[0].temp_C
- 当前温度(F):current_condition[0].temp_F
- 最高温度(C):weather[0].maxtempC
- 最高温度(F):weather[0].maxtempF
- 最低温度(C):weather[0].mintempC
- 最低温度(F):weather[0].mintempF
- 降水概率:weather[0].hourly[*].chanceofrain 的最大值(作为整数)

单位: 使用 config.units("C" 或 "F")。如果未知,默认为摄氏度。

关键: 不要输出原始的 curl/工具输出。不要使用 wttr.in 的单行格式。

步骤 5:分类重要邮件(代理任务)

仅当 config.emails_enabled 为 true 且 emails.available 为 true 时执行。

对于 emails.data 中的每封邮件,使用代理自身的语义分析来确定重要性。

重要邮件标准(符合任何一项即可):
- 来自收集的联系人列表中的联系人
- 订单发货通知
- 购买收据或交易确认
- 入账/出账交易提醒
- 退款相关消息
- 客户服务互动
- 即将到来的订阅续订通知
- 即将到来的付款提醒通知
- 技术通讯
- 求职申请更新
- 招聘人员消息(排除 WITCH 类外包公司)
- 银行警报
- 日历邀请
- 账户安全邮件(例如,"您的账户已被锁定")
- 共享项目(例如,Google Drive 共享)
- 愿望清单相关提醒
- 已加星标/标记的邮件(积极信号,非唯一决定因素)
- 任何其他上下文重要的邮件

排除项: 以下邮件绝不重要,即使符合其他标准:
- 促销/营销邮件
- LinkedIn 职位提醒邮件(LinkedIn 消息通知可以)
- 未经请求的招聘人员/职位发布邮件和批量招聘通知(例如,主题或正文包含 "hire"、"hiring"、"job"、"position"、"onsite"、"fulltime"、"recruiter"、"application" 等关键词,或明显是批量发送的邮件),除非发件人在用户的联系人中或邮件被加星标/明确识别为个人相关。
- 产品公告/产品更新邮件和供应商/平台通知(例如,"[产品更新]",发布公告,自动启用通知),除非发件人在用户的联系人中或邮件被明确加星标。
- 供应商通讯、社区公告和一般技术邮件列表帖子(例如,博客文章、发布说明、产品预览、摘要),除非明显是个人邮件或来自联系人。

失败行为: 如果语义分析失败,则静默省略整个邮件部分

应用过滤和排序:
1. 如果 emails_unread_only 为 true,则过滤未读邮件
2. 如果 emails_starred_first 为 true,则优先显示已加星标的邮件
3. 根据 emails_sort_newest 按日期排序
4. 限制为 emails_limit 封邮件

步骤 6:生成简报

使用所有收集和处理的数据,按照输出契约撰写简报文本。

各部分格式:

生日:

🎂 **生日:**
• 今天:姓名
• 2月5日:姓名
  • 按日期分组
  • 今天的条目在前
  • 最多显示 5 个即将到来的生日(不包括今天)

日历事件:

📅 **今日安排:**
• 全天:事件标题
• 上午 9:00:事件标题
  • 单日:"今日安排"
  • 多日:"日程安排",并标注 "今天/明天/{月份} {日}"
  • 全天事件在前,然后按开始时间排序
  • 每天最多 3 个事件

提醒事项:

✅ **提醒事项:**
• 取处方药
  • 仅限今天到期的提醒
  • 最多 3 个提醒

重要邮件:

📧 **需要关注的邮件:**
• Amazon:您的订单已发货
• Chase:付款已收到
  • 格式:• 发件人:主题(必要时截断)

锚点:
- 仅当你能自信地从用户提供的上下文中推断出 1–3 个真实优先级时显示。
- 使用普通项目符号,无标题。
- 如果不真实/不确定,完全省略(不要编造)。

结束语:
- 必需。使用收集的 JSON 数据中的 quote 字段。
- 编排器每次运行都会提供一个随机的励志名言。

步骤 7:输出简报

仅返回简报文本。不要其他任何内容。


配置

配置从 ~/.openclaw/openclaw.json 的路径 skills.entries.daily-briefing.config 读取:

{
  "skills": {
    "entries": {
      "daily-briefing": {
        "config": {
          "location": "New York, NY",
          "timezone": "America/New_York",
          "units": "C",
          "birthdays": {
            "enabled": true,
            "lookahead": 14,
            "sources": ["contacts", "google"]
          },
          "calendar": {
            "enabled": true,
            "lookahead": 0,
            "sources": ["google", "icloud"]
          },
          "reminders": {
            "enabled": true
          },
          "emails": {
            "enabled": false,
            "icloudPassword": "",
            "limit": 10,
            "sortNewest": true,
            "starredFirst": true,
            "unreadOnly": true
          }
        }
      }
    }
  }
}

配置选项

选项 类型 默认值 描述
location 字符串 "" 天气位置(例如,"New York, NY")
timezone 字符串 系统时区 时区(例如,"America/New_York")
units 字符串 "C" 温度单位:"C" 或 "F"
birthdays.enabled 布尔值 true 启用生日跟踪
birthdays.lookahead 整数 14 提前显示未来多少天的生日
birthdays.sources 数组 ["contacts"] 来源:"contacts" (iCloud), "google"
calendar.enabled 布尔值 true 启用日历事件
calendar.lookahead 整数 0 提前天数(0 = 仅今天)
calendar.sources 数组 ["google", "icloud"] 日历来源
reminders.enabled 布尔值 true 启用 Apple 提醒事项
reminders.dueFilter 字符串 "today" 到期日过滤器:"today"、"week" 或 "all"
reminders.includePastDue 布尔值 true 包括过期/逾期的提醒
emails.enabled 布尔值 false 启用重要邮件功能
emails.icloudPassword 字符串 "" iCloud 邮件应用专用密码
emails.limit 整数 10 最多显示的邮件数
emails.sortNewest 布尔值 true 按最新排序
emails.starredFirst 布尔值 true 优先显示已加星标的邮件
emails.unreadOnly 布尔值 true 仅显示未读邮件

默认值

  • 时区: 用户的本地时区;如果未知,则回退到 UTC
  • 位置: 用户的位置(如果存在);在 cron 模式下如果不可用,则省略天气
  • 单位: 用户的偏好单位(如果已知);否则为摄氏度

依赖项

必需:
- curl — 用于获取天气
- bash — 用于编排器脚本

可选:
- gogbrew install steipete/tap/gogcli (Google 日历、Gmail、联系人)
- icalpalbrew install ajrosen/tap/icalpal (iCloud 日历)
- himalayabrew install himalaya (通过 IMAP 访问 iCloud 邮件)


文件结构

daily-briefing/
├── SKILL.md
├── README.md
├── install.sh
├── scripts/
│   └── daily_briefing_orchestrator.sh
└── bin/
    └── run_daily_briefing.sh (由 install.sh 创建)

示例输出

```
早上好 - 今天是星期六,2月3日,2024年。局部多云,今天下午气温大约 45°F,最低温约 32°F。

🎂 生日:
• 今天:Jane Doe
• 2月5日:John Smith

📅

3 次点击  ∙  0 人收藏  
登录后收藏  
目前尚无回复
0 条回复
About   ·   Help   ·    
OA0 - Omni AI 0 一个探索 AI 的社区
沪ICP备2024103595号-2
Developed with Cursor