Owner Briefing Skill
Minimum Model
Any small model. Data collection is CLI-based. Formatting is simple.
When to Send (Decision Rules)
- - Weekday (Mon–Fri): Send at the scheduled time.
- Weekend / holiday: Skip unless owner explicitly requests it.
- Owner is travelling: Still send — adjust timezone in cron if needed.
- Data source fails (calendar/email/tasks): Send the briefing with that section marked "unavailable." Do NOT skip the whole briefing.
Briefing Format
CODEBLOCK0
Step 1 — Get Today's Calendar Events
CODEBLOCK1
Step 2 — Get Urgent Emails
CODEBLOCK2
Step 3 — Get Open Tasks (monday.com)
CODEBLOCK3
Step 4 — Assemble and Send the Briefing
Run Steps 1–3, save each output to a temp file, then combine:
CODEBLOCK4
Cron Schedule
CODEBLOCK5
- - Runs Monday–Friday at 07:30 in the owner's timezone.
- Change
"30 7" to adjust time. - Change
"timezone" to match the owner's location.
Customization Options
| Goal | Change |
|---|
| Only meetings after 9am | Filter events: INLINECODE2 |
| Skip internal standups |
Filter:
if 'standup' not in summary.lower() |
| Add weather | Call weather skill before building briefing |
| Highlight flagged emails | Change search to
is:starred or
is:important |
| Evening summary (tomorrow preview) | Change
TODAY/TOMORROW to tomorrow's dates |
What NOT to Include
The briefing is for action, not recap. Apply this filter before sending:
- - ❌ Don't recap things the owner already knows (decisions from yesterday, completed work)
- ❌ Don't list completed tasks from yesterday — they're done, move on
- ❌ Don't include calendar events more than 48h away — not actionable today
- ❌ Don't include low-priority emails that can wait (newsletters, FYIs, no-reply)
- ❌ Don't repeat the same item two days in a row if nothing changed
- ✅ Rule: if it doesn't need action TODAY, leave it out
A good briefing takes 30 seconds to read. If it's longer, cut more.
Cost Tips
- - Very cheap: Data collection is CLI-based — no LLM tokens for fetching.
- Small model OK: Formatting the briefing is simple — any model works.
- Avoid: Don't fetch 30 days of email history — search only
newer_than:1d. - Batch: Fetch calendar + email in one script run, not separate sessions.
- On failure: Send partial briefing — don't skip the whole thing.
所有者简报技能
最低模型要求
任何小型模型均可。数据采集基于命令行界面。格式排版简单。
发送时机(决策规则)
- - 工作日(周一至周五): 按预定时间发送。
- 周末/节假日: 跳过,除非所有者明确要求。
- 所有者出差: 仍发送——如有需要,可在定时任务中调整时区。
- 数据源故障(日历/邮件/任务): 发送简报,将对应部分标记为不可用。不要跳过整份简报。
简报格式
☀️ 早上好 [所有者姓名] — 以下是您今日安排:
📅 今日会议
• 09:30 — 站会(30分钟)
• 14:00 — 与 [某人] 一对一(1小时)
📬 待处理邮件
• [发件人] — [主题]
✅ 待办任务
• [来自monday.com或记忆中的任务]
⚠️ 提醒事项
• [截止日期、异常事项等]
祝您今天愉快!🙌
第一步 — 获取今日日历事件
bash
#!/bin/bash
set -e
计算今天和明天(UTC ISO格式)
TODAY=$(date -u +%Y-%m-%dT00:00:00Z)
TOMORROW=$(
date -u -d +1 day +%Y-%m-%dT00:00:00Z 2>/dev/null \
|| date -u -v+1d +%Y-%m-%dT00:00:00Z
)
通过gog从Google日历获取事件
GOG_ACCOUNT=owner@company.com gog calendar events primary \
--from $TODAY \
--to $TOMORROW \
2>/dev/null \
| python3 -c
import sys, json
解析JSON,出错时默认为空列表
try:
events = json.loads(sys.stdin.read().strip() or [])
except json.JSONDecodeError:
events = []
print(📅 今日会议)
if not events:
print(• 无事件)
else:
# 按开始时间排序,格式化每个事件
for e in sorted(events, key=lambda x: x.get(start, {}).get(dateTime, )):
start = e.get(start, {}).get(dateTime, )[:16].replace(T, )
title = e.get(summary, 未命名)
print(•, start, —, title)
第二步 — 获取紧急邮件
bash
#!/bin/bash
set -e
获取最近一天内最多5封未读邮件
GOG_ACCOUNT=owner@company.com gog gmail search \
is:unread newer_than:1d \
--max 5 \
2>/dev/null \
| python3 -c
import sys, json
解析JSON,出错时默认为空列表
try:
emails = json.loads(sys.stdin.read().strip() or [])
except json.JSONDecodeError:
emails = []
print(📬 待处理邮件)
if not emails:
print(• 无紧急邮件)
else:
for e in emails:
sender = e.get(from, 未知)
subject = e.get(subject, (无主题))
print(•, sender, —, \ + subject + \)
第三步 — 获取待办任务(monday.com)
bash
#!/bin/bash
set -e
TOKEN_FILE=$HOME/.credentials/monday-api-token.txt
如果令牌缺失,优雅跳过此部分
if [ ! -f $TOKEN_FILE ]; then
echo ✅ 待办任务
echo • (monday.com令牌未配置 — 跳过)
exit 0
fi
MONDAYTOKEN=$(cat $TOKENFILE)
BOARDID=BOARDID # 替换为实际看板ID
从看板获取前5个项目
RESPONSE=$(curl -s -X POST https://api.monday.com/v2 \
-H Content-Type: application/json \
-H Authorization: $MONDAY_TOKEN \
-d {\query\: \{ boards(ids: [$BOARD
ID]) { itemspage(limit: 5) { items { name state } } } }\})
打印未完成(非已完成)的项目
echo $RESPONSE | python3 -c
import sys, json
try:
d = json.loads(sys.stdin.read())
items = d[data][boards][0][items_page][items]
except (KeyError, IndexError, json.JSONDecodeError) as e:
print(✅ 待办任务)
print(• (无法获取:, e, ))
sys.exit(0)
过滤掉已完成的项目
open_items = [i for i in items if i.get(state) != done]
print(✅ 待办任务)
if not open_items:
print(• 无 — 全部完成!)
else:
for item in open_items:
print(•, item[name])
第四步 — 组装并发送简报
运行步骤1-3,将每个输出保存到临时文件,然后合并:
bash
#!/bin/bash
set -e
运行每个部分并捕获输出
CALENDAR_SECTION=$(bash step1-calendar.sh 2>/dev/null || echo 📅 今日会议\n• (不可用))
EMAIL_SECTION=$(bash step2-email.sh 2>/dev/null || echo 📬 待处理邮件\n• (不可用))
TASKS_SECTION=$(bash step3-tasks.sh 2>/dev/null || echo ✅ 待办任务\n• (不可用))
构建简报消息
BRIEFING=☀️ 早上好 — 以下是您今日安排:
$CALENDAR_SECTION
$EMAIL_SECTION
$TASKS_SECTION
选项A:通过WhatsApp发送
openclaw message send --to OWNER_PHONE --message $BRIEFING
选项B:通过邮件发送
GOG_ACCOUNT=owner@company.com gog gmail send \
--to owner@company.com \
--subject ☀️ 您的每日简报 — $(date +%A %B %d) \
--body $BRIEFING
定时任务计划
json
{
jobs: [
{
id: morning-briefing,
schedule: 30 7 1-5,
timezone: Asia/Jerusalem,
task: 生成并发送所有者的晨间简报:日历事件、紧急邮件和待办任务。使用所有者简报技能。,
delivery: {
mode: message,
channel: whatsapp,
to: OWNER_PHONE
}
}
]
}
- - 周一至周五,所有者时区07:30运行。
- 修改30 7调整时间。
- 修改timezone以匹配所有者所在地。
自定义选项
| 目标 | 修改方式 |
|---|
| 仅显示9点后的会议 | 过滤事件:if start_hour >= 9 |
| 跳过内部站会 |
过滤:if standup not in summary.lower() |
| 添加天气 | 在构建简报前调用天气技能 |
| 高亮标记邮件 | 将搜索改为is:starred或is:important |
| 晚间摘要(明日预览) | 将TODAY/TOMORROW改为明天的日期 |
不应包含的内容
简报用于行动,而非回顾。发送前应用此过滤器:
- - ❌ 不要回顾所有者已知的内容(昨天的决策、已完成的工作)
- ❌ 不要列出昨天已完成的任务——已完成就过去了
- ❌ 不要包含超过48小时的日历事件——今天不可操作
- ❌ 不要包含可等待的低优先级邮件(新闻通讯、仅供参考、无需回复)
- ❌ 如果同一事项无变化,不要连续两天重复
- ✅ 规则:如果今天不需要行动,就排除
一份好的简报应在30秒内读完。如果更长,就继续精简。
成本提示
- - 非常便宜: 数据采集基于命令行界面——获取数据无需LLM令牌。
- 小型模型可用: 简报格式排版简单——任何模型均可。
- 避免: 不要获取30天的邮件历史——仅搜索newer_than:1d。
- 批量处理: 在单次脚本运行中获取日历+邮件,而非分开执行。
- 失败时: 发送部分简报——不要跳过整份。