Daily Briefing
每日简报
生成一条简洁、温馨的每日消息,适用于cron任务交付(标准输出/聊天回复)。即使在上下文信息极少的情况下,也始终能成功生成。
技能类型:系统技能(协调器模式)
此技能使用系统技能模式在macOS上执行。代理必须:
- 绝不直接运行原始CLI命令(除了
curl用于获取天气信息)。 - 始终调用运行器脚本来收集数据。
- 脚本完成后,从JSON中读取收集到的数据。
- 利用代理自身的能力生成简报文本。
快速参考:
# Invoke data gatherer (waits for completion)
"{baseDir}/skills/daily-briefing/bin/run_daily_briefing.sh"
# Read output
cat /tmp/daily_briefing_data.json
输出契约(严格)
关键:仅输出 only简报文本。无需前言,无需解释,无需"完成",无需文件路径,无需工具输出,简报周围无需markdown代码块。
第1行格式(必需)
第1行必须严格以符合当前时间的问候语开头:
Good {time_of_day} - Today is {Weekday}, {Month} {D}, {YYYY}. {Skies sentence}.
- 使用完整的月份名称(例如,"February",而非"Feb")。
- 如果今天是用户的生日(通过联系人姓名匹配):将问候语替换为:
🎉 Happy Birthday! Today is {Weekday}, {Month} {D}, {YYYY}. {Skies sentence}.
问候语选择(当地时间)
| 时间范围 | 问候语 |
|---|---|
| 05:00–11:59 | 早上好 |
| 12:00–16:59 | 下午好 |
| 17:00–21:59 | 晚上好 |
| 22:00–04:59 | 晚安 |
| 未知 | 早上好(默认) |
天气状况句子规则
如果天气数据可用:
{Conditions} skies, around {TEMP}°{time_clause}{low_clause}{precip_clause}.
- 使用最高气温若数据可靠 → 时间状语:"今天下午"
- 否则使用当前气温→ 时间状语:"当前时刻"
- 若存在最低气温:追加
,最低气温约{LOW}度 - 若降水概率≥30%:追加
,并有{CHANCE}%的{雨/雪/降水}概率
如果天气数据不可用:使用精确备用方案:
I can't access weather right now.
布局规则
{Line 1: Greeting with skies sentence}
{Birthdays section - only if any today or upcoming}
{Calendar events section - only if any}
{Reminders section - only if any}
{Important emails section - only if enabled and any}
{Anchors - only if real priorities from context}
{Closing line - always required}
- 始终在首行后包含一个空行。
- 各段落间若存在则以空行分隔。
- 目标长度约5至15行根据启用的集成功能而定。
氛围与基调
- 献给今日的温柔馈赠温暖、平静、富有同情心,带着安静的希望。
- 没有责备,没有紧迫感,没有生产力压力。
- 适用于Telegram风格:简短行文,宽松间距,易于浏览。
系统技能执行
步骤1:检查模式(交互式 vs 定时任务)
如果是交互式模式且缺少关键信息(位置/时区/单位):
- 在生成简报前,简要提示用户补充缺失信息。
- 提供集成功能的开关选项。
- 提及重要邮件功能:说明它使用AI驱动的语义分析来筛选出需要处理的邮件(交易、物流、安全警报等),并可通过配置中的 `emails.enabled` 启用。
`emails.enabled`;注意iCloud邮箱需要应用专用密码(配置中的 `emails.icloudPassword`)。`emails.icloudPassword`如果是非交互式模式(定时任务/自动化):
不要提问(确保定时任务安全)。使用默认设置。
- 不要创建或修改任何文件。
- 不要启动后台任务或子代理。
- Do NOT spawn background tasks/sub-agents.
- 省略天气信息若位置信息不可用。
步骤 2:调用数据收集器
"{baseDir}/skills/daily-briefing/bin/run_daily_briefing.sh"
- 运行脚本执行
scripts/daily_briefing_orchestrator.sh。 - 授予 Terminal.app(或调用进程)TCC 权限。
步骤 3:读取收集的数据
应用完成后,读取:
/tmp/daily_briefing_data.json
JSON 结构:
{
"generated_at": "ISO timestamp",
"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": "Team standup", "start": "09:00", "end": "09:30", "all_day": false, "date": "2024-02-03", "source": "google"},
{"title": "Doctor appointment", "start": null, "end": null, "all_day": true, "date": "2024-02-03", "source": "icloud"}
]
},
"reminders": {
"available": true,
"data": [
{"title": "Pick up prescription", "due": "2024-02-03"}
]
},
"emails": {
"available": true,
"data": [
{"id": "abc123", "from": "Amazon", "from_email": "shipment@amazon.com", "subject": "Your order has shipped", "preview": "Your package is on its way...", "starred": false, "unread": true, "date": "2024-02-03T07:30:00Z", "source": "gmail"},
{"id": "def456", "from": "Chase", "from_email": "alerts@chase.com", "subject": "Payment received", "preview": "We received your payment of...", "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/{ENCODED_LOCATION}?format=j1"
- 位置:使用
config.location从收集的数据中获取;若为空/无效,则天气信息不可用。 - 重试:失败时重试一次。
- 若仍失败或不可用:天气信息不可用;使用备用语句。
从JSON响应中解析:
- 天气状况:
current_condition[0].weatherDesc[0].value - 当前温度(摄氏度):
current_condition[0].temp_C - 当前温度(华氏度):
current_condition[0].temp_F - 最高温度(摄氏度):
weather[0].maxtempC - 最高温度(华氏度):
weather[0].maxtempF - 最低温度(摄氏度):
weather[0].mintempC - 最低温度(华氏度):
weather[0].mintempF - 降水概率:取以下数组中的最大值
weather[0].hourly[*].chanceofrain(作为整数处理)
单位:使用config.units("C" 或 "F")。如果未知,则默认使用摄氏度。
关键:请勿输出原始的curl/工具输出。请勿使用wttr.in单行格式。
步骤5:分类重要邮件(代理任务)
仅当config.emails_enabled为真且emails.available为真时执行。
对于emails.data中的每一封邮件,使用代理自身的语义分析来确定其重要性。
重要邮件标准(符合以下任意一条即视为重要):
- 来自已收集联系人列表中的联系人
- 订单发货通知
- 购买收据或交易确认
- 入账/出账交易提醒
- 退款相关消息
- 客户服务互动
- 即将到来的订阅续订通知
- 即将到来的付款提醒通知
- 技术通讯
- 求职申请更新
- 来自招聘人员的消息(排除类似WITCH的外包公司)
- 银行提醒
- 日历邀请
- 账户安全邮件(例如"您的账户已被锁定")
- 共享项目(例如Google云端硬盘共享)
- 心愿单相关提醒
- 星标/标记邮件(积极信号,非唯一判定标准)
- 其他任何上下文重要的邮件
排除项:以下邮件绝不重要(即使符合其他标准):
- 促销/营销邮件
- LinkedIn职位提醒邮件(LinkedIn消息通知可保留)
- 未经请求的招聘/职位发布邮件及批量招聘通知(例如主题或正文包含"招聘"、"雇用"、"职位"、"岗位"、"现场"、"全职"、"招聘人员"、"申请"等关键词或明显群发内容),除非发件人在用户联系人中,或邮件被星标/可明确识别为个人相关邮件
- 产品公告 / 产品更新邮件以及供应商/平台通知(例如"[产品更新]"、发布公告、自动启用通知),除非发件人在用户的联系人列表中或邮件被明确标星。
- 供应商新闻通讯、社区公告以及一般技术邮件列表帖子(例如,博客文章、发行说明、产品预览、摘要),除非明显是个人邮件或来自联系人。
失败行为:如果语义分析失败,则静默地省略整个邮件部分。
应用过滤和排序:
- 按
仅未读邮件进行过滤,如果为真 - 如果
星标邮件优先为真,则星标邮件优先 - 按日期排序,依据
邮件排序_最新 - 限制为
邮件限制数量
步骤 6:生成简报
使用所有已收集和处理的数据,按照输出约定撰写简报文本。
区块格式:
生日:
🎂 **Birthdays:**
• Today: Name
• Feb 5: Name
- 按日期分组多个条目
- 今日条目优先显示
- 最多显示5个即将到来的生日(今日除外)
日历事件:
📅 **Today's schedule:**
• All-day: Event title
• 9:00 AM: Event title
- 单日事件:显示为"今日日程"
- 多日事件:显示为"日程",并使用"今日/明日/{月} {日}"标签
- 全天事件优先,然后按开始时间排序
- 每天最多显示3个事件
提醒事项:
✅ **Reminders:**
• Pick up prescription
- 仅显示今日到期的提醒
- 最多显示3个提醒
重要邮件:
📧 **Emails needing attention:**
• Amazon: Your order has shipped
• Chase: Payment received
- 格式:
• 发件人:主题(必要时截断)
重点事项锚点:
- 仅在能够从用户提供的上下文信息中可靠推断出1-3个真实优先级事项时显示
- 使用普通项目符号,无标题
- 若非真实事项或无法确定则完全省略此部分(不要虚构)。
结束语:
- 必需。使用
quote字段,该字段来自收集的JSON数据。 - 编排器每次运行都会提供一个随机的励志名言。
步骤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") |
时区 | 字符串 | 系统 | 时区(例如:"America/New_York") |
单位 | 字符串 | "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——用于编排脚本
可选:
gog——brew install steipete/tap/gogcli(Google 日历、Gmail、联系人)icalpal——brew install ajrosen/tap/icalpal(iCloud 日历)himalaya——brew install himalaya(通过 IMAP 访问 iCloud 邮件)
文件结构
daily-briefing/
├── SKILL.md
├── README.md
├── install.sh
├── scripts/
│ └── daily_briefing_orchestrator.sh
└── bin/
└── run_daily_briefing.sh (created by install.sh)
示例输出
Good morning - Today is Saturday, February 3, 2024. Partly cloudy skies, around 45°F this afternoon, with a low around 32°F.
🎂 **Birthdays:**
• Today: Jane Doe
• Feb 5: John Smith
📅 **Today's schedule:**
• All-day: Doctor appointment
• 9:00 AM: Team standup
✅ **Reminders:**
• Pick up prescription
📧 **Emails needing attention:**
• Amazon: Your order has shipped
• Chase: Payment received
Take things one step at a time today—you've got this.
清理
"{baseDir}/skills/daily-briefing/bin/run_daily_briefing.sh" --cleanup


微信扫一扫,打赏作者吧~