关于 morning-briefing
morning-briefing 是一项每日简报工作流,面向需要汇总个人日程、任务、工单和新闻的用户。它将多种数据源与团队动态纳入简报,并通过终端、Obsidian 和邮件交付。
主要功能
- 01汇总日历事件与 OmniFocus 任务
- 02筛选近 24 小时的邮件
- 03收集工单、待审批和团队动态
- 04检索并概述新闻与立法活动
- 05比较工单趋势并识别优先事项
- 06输出终端、Obsidian 和邮件简报
适用场景
- 01开始工作日时查看日程与待办事项
- 02跟进团队昨日工作和已结工单
- 03了解教育、AI、安全及政策相关新闻
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ krishagel/ geoffrey --skill morning-briefing安装后在 Claude Code 中输入/morning-briefing确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
pronunciation_guide.jsonreferences/podcast-script-template.mdscripts/apply_pronunciations.jsget_due_flagged.jsget_last_business_day.jstemplates/email.html详细介绍
Morning Briefing 工作流
概述
生成每日晨间简报,并通过以下三种方式发送:
- 终端:立即显示摘要
- Obsidian:将完整简报保存到每日笔记
- 电子邮件:简报文本 + 音频播客附件
位置
- Gig Harbor,WA - 用于天气查询
阶段 1:收集数据
执行以下数据收集步骤:
1.1 日历(今日活动)
cd /Users/hagelk/non-ic-code/geoffrey/skills/google-workspace && bun calendar/list_events.js psd --today
返回包含今日活动的 JSON,其中包括:
- 活动摘要、地点、开始/结束时间
- 参与者及其回复状态
- Hangout/会议链接
账户:工作日历使用 psd
1.2 OmniFocus 任务(到期和已标记)
osascript -l JavaScript /Users/hagelk/non-ic-code/geoffrey/skills/morning-briefing/scripts/get_due_flagged.js
返回符合以下条件的任务:
- 今日到期或已逾期
- 已标记
- 可用(未被阻止,也未推迟到未来)
1.3 最近的电子邮件(过去 24 小时)
# Get yesterday's date in Gmail query format
YESTERDAY=$(date -v-1d +%Y/%m/%d)
cd /Users/hagelk/non-ic-code/geoffrey/skills/google-workspace && bun gmail/list_messages.js psd --query "in:inbox after:$YESTERDAY" --max 15
返回最近的收件箱邮件,其中包括:
- 发件人、主题、日期、摘要
- 已读或未读状态
- 用于了解上下文的会话 ID
- 标签数组
筛选:仅显示仍在收件箱中的电子邮件(尚未添加标签/处理)。
- 带有自定义标签(Label_XXXXX)的电子邮件已分类,应排除
- 例外:包含 SaneCC 或 SaneLater 标签的电子邮件应纳入(值得留意)
- 系统标签(UNREAD、INBOX、CATEGORY_*、IMPORTANT)不算作“已处理”
原则:过去 24 小时内仍在收件箱中的任何电子邮件都需要关注,无论已读与否。
账户:工作电子邮件使用 psd
1.4 未结的 Freshservice 工单
bun /Users/hagelk/non-ic-code/geoffrey/skills/freshservice-manager/scripts/list_tickets.js '{"workspace_id": 2, "filter": "new_and_my_open"}'
返回 Technology 工作区中分配给用户或由用户创建的未结工单。
1.5 待审批事项
bun /Users/hagelk/non-ic-code/geoffrey/skills/freshservice-manager/scripts/get_approvals.js requested
返回等待审批的服务请求。
1.6 天气
使用 WebSearch:
Gig Harbor WA weather today forecast
提取:
- 当前天气状况
- 最高/最低气温
- 降水概率
- 任何预警
1.7 EdTech 新闻(含摘要)
使用 WebSearch:
K-12 education technology news past 24 hours January 2026
对于找到的每篇文章(3-5 篇):
- 使用 WebFetch 阅读全文
- 提取 2-3 句摘要,涵盖:
- 发生了什么 / 有哪些新进展
- 这对 K-12 教育为何重要
- 关键结论或行动事项
时效性检查:纳入文章前,确认文章日期。仅纳入过去 24 小时内发布的文章。即使较旧的文章出现在搜索结果中,也应跳过。
涵盖主题:
- EdTech 产品发布与更新
- 学校技术政策变化
- 学校网络安全
- 数字化学习趋势
1.8 AI 新闻(含摘要)
使用 WebSearch:
artificial intelligence news past 24 hours January 2026 latest
对于找到的每篇文章(3-5 篇):
- 使用 WebFetch 阅读全文
- 提取 2-3 句摘要,涵盖:
- 有哪些新进展
- 对行业的影响
- 与教育/工作的相关性
时效性检查:纳入文章前,确认文章日期。仅纳入过去 24 小时内发布的文章。即使较旧的文章出现在搜索结果中,也应跳过。
涵盖主题:
- 重要 AI 模型的发布及其能力
- AI 政策与监管
- 企业采用 AI 的情况
- AI 研究突破
1.9 K-12 领导力新闻(含摘要)
使用 WebSearch:
K-12 school leadership superintendent news past 24 hours January 2026
对于找到的每篇文章(2-3 篇):
- 使用 WebFetch 阅读全文
- 提取 2-3 句摘要,涵盖:
- 政策或领导力方面的新进展
- 对学区/学校的影响
- 与 CIO/技术领导力的相关性
时效性检查:纳入文章前,确认文章日期。仅纳入过去 24 小时内发布的文章。即使较旧的文章出现在搜索结果中,也应跳过。
涵盖主题:
- 州和联邦教育政策
- 学监和教育委员会新闻
- 学校资金与预算
- 人力和人员配置趋势
1.9b 学校安全与安保新闻(附摘要)
使用 WebSearch:
K-12 school safety security news past 24 hours January 2026
对于找到的每篇文章(3 篇):
- 使用 WebFetch 阅读文章全文
- 提取 2–3 句话的摘要,涵盖:
- 发生了什么/有哪些新进展
- 对学校安全措施的影响
- 对学区的重要启示
时效性检查:纳入文章前核实发布日期。仅纳入过去 24 小时内发布的文章。即使较早的文章出现在搜索结果中,也要跳过。
涵盖主题:
- 学校安保事件及应对措施
- 安全政策变更
- 应急准备
- 心理健康与威胁评估
- 实体安保技术
1.10 技术团队 EOD 消息(上一工作日)- 详细版
从 Technology Staff 空间获取每日结束时的签到消息:
cd /Users/hagelk/non-ic-code/geoffrey/skills/google-workspace && bun chat/get_eod_messages.js psd spaces/AAAAxOtpv10 last-business-day
重要——禁止编造:
- 仅使用脚本输出
sender字段中出现的姓名 - 如果脚本未返回消息,请说“No EOD messages found”
- 如果脚本返回的消息中是发送者 ID 而非姓名,请显示该 ID(例如:“users/12345...”)
- 绝不编造姓名、地点或成就
- 采用复制粘贴的方式:将脚本输出视为唯一事实来源
提取团队数据前:
- 检查脚本返回的原始 JSON 输出
- 列出返回的确切
sender值 - 仅使用这些姓名——不得改述或“润色”
重要:提取每位团队成员 EOD 消息中的完整详情。查找包含“Today:”前缀的消息——这些是详细的 EOD 总结。
对于每位发布了 EOD 总结的团队成员:
- 姓名:发布者(严格使用
sender字段中的姓名) - 地点:工作地点(WFH、DCRC、学校现场)
- 主要成就:已完成的具体任务(而非仅写“工单”)
- 值得关注的事项:解决的有趣问题、参与的项目
- 问题/阻碍:提及的任何问题
从原始消息中提取的示例:
Brad White:
- Location: TSD (Tech Services)
- Accomplished: Packaged Cinema 4D plugin for deployment, fixed OAuth blocking for Maxon App sign-in, created SwiftDialog notification for plugin installs, used Claude Code for first time to create Installomator label for Godot game engine
- Notable: Working on Unity deployment troubleshooting, burning comp time leaving early
注意:如果今天是星期一,“上一工作日”即星期五(如果星期五是假日,则为星期四)。
1.10b 安全与安保团队 EOD 消息(上一工作日)
从 Safety & Security Staff 空间获取每日结束时的签到消息:
cd /Users/hagelk/non-ic-code/geoffrey/skills/google-workspace && bun chat/get_eod_messages.js psd spaces/AAAAFpQaAnA last-business-day
空间:PSD Safety & Security Team
重要——禁止编造:
- 仅使用脚本输出
sender字段中出现的姓名 - 如果脚本未返回消息,请说“No EOD messages found”
- 如果脚本返回的消息中是发送者 ID(例如“users/12345...”)而非姓名:
- 显示为:Unknown (users/123456...) - [消息内容中的地点]
- 添加备注:“Name not in mapping - update chat_user_mapping.json”
- 绝不编造姓名、地点或成就
- 采用复制粘贴的方式:将脚本输出视为唯一事实来源
提取团队数据前:
- 检查脚本返回的原始 JSON 输出
- 列出返回的确切
sender值 - 仅使用这些姓名——不得改述或“润色”
按与技术团队相同的格式提取——姓名、地点、成就、问题。
注意:如果今天是星期一,“上一工作日”即星期五(如果星期五是假日,则为星期四)。
1.11 团队已完成工单(上一工作日)
获取技术团队在上一工作日关闭的工单:
# First get the last business day
LAST_BIZ_DAY=$(bun /Users/hagelk/non-ic-code/geoffrey/skills/morning-briefing/scripts/get_last_business_day.js | jq -r '.date')
# Then get daily summary for that date
bun /Users/hagelk/non-ic-code/geoffrey/skills/freshservice-manager/scripts/get_daily_summary.js "$LAST_BIZ_DAY"
重要——禁止编造:
- 仅使用脚本输出
byAgent部分中出现的 Agent 姓名 - 严格使用脚本返回的工单数量
- 绝不编造姓名或工单数量
- 如果 Agent 姓名显示为 ID 或电子邮件地址,请原样显示
报告工单统计前:
- 检查
get_daily_summary.js返回的原始 JSON 输出 - 列出
byAgent字段中的确切 Agent 姓名 - 仅使用这些姓名和数量
返回内容:
- 已关闭工单总数
- 按 Agent 划分的明细
- 按类别划分的明细(密码重置、Chromebook 等)
- 自动处理与 Agent 处理的工单
工作区:Technology(workspace_id:2)
1.12 工单趋势分析
将上一个工作日与之前的日期进行比较,分析趋势:
# Get last 5 business days of summaries for trend analysis
# The get_daily_summary.js script supports date parsing
bun /Users/hagelk/non-ic-code/geoffrey/skills/freshservice-manager/scripts/get_daily_summary.js "last monday"
bun /Users/hagelk/non-ic-code/geoffrey/skills/freshservice-manager/scripts/get_daily_summary.js "last tuesday"
# etc.
分析以下内容:
- 工单数量趋势(增加/减少)
- 类别激增(特定问题类型突然增加)
- Agent 工作负载分布
- 异常模式
1.13 软件开发工作区工单
获取软件开发工作区中的未关闭工单:
bun /Users/hagelk/non-ic-code/geoffrey/skills/freshservice-manager/scripts/search_tickets.js "status:2 OR status:3" 13
返回软件开发工作区中所有未关闭(状态:2)和待处理(状态:3)的工单。
工作区 ID:13(软件开发) 注意:这是用户用于跟踪 AI Studio 和其他 PSD 应用程序缺陷的内部软件开发工单系统。
1.14 立法动态(上一个工作日)
获取自上一个工作日起有动态的 K-12 教育法案:
# Get lookback info and bills to check
bun /Users/hagelk/non-ic-code/geoffrey/skills/legislative-tracker/scripts/get_recent_bill_activity.js --last-business-day
返回以下内容:
- 要检查的日期范围(上一个工作日 → 今天)
- 约 143 个已确认的教育法案 ID 列表
- 每项法案的 WebFetch 说明
工作流:
- 获取
get_recent_bill_activity.js的输出 - 使用 WebFetch 获取每项法案的 URL(为提高速度,每批并行处理 5-6 项)
- 从每项法案页面提取最新行动日期
- 筛选出
latest_action_date >= lookback_start的法案 - 应用优先级框架(根据对选区的影响划分为 HIGH/MEDIUM/LOW)
- 概述每项法案的内容
周一:回溯范围从周五开始(如果周五是假日,则从更早的日期开始),因此会包含整个周末的动态(听证会、投票、委员会行动)。
要使用 WebFetch 获取的示例 URL:
https://app.leg.wa.gov/billsummary?BillNumber=1020&Year=2025https://app.leg.wa.gov/billsummary?BillNumber=5038&Year=2025
注意:仅包含确实有动态的法案。如果没有法案进展,则输出“自 [date] 以来没有立法动态”。
第 2 阶段:生成简报
2.1 分析并确定优先级
查看收集到的数据并识别:
- 冲突:日历事件时间重叠
- 紧急事项:逾期任务、高优先级工单
- 主题:不同数据源中的模式
2.2 格式化 Markdown 简报
使用以下结构:
# Daily Briefing - [DATE]
## Weather
[Current conditions, high/low, precipitation]
## Today's Calendar
| Time | Event | Location |
|------|-------|----------|
| ... | ... | ... |
**Conflicts/Notes**: [any issues]
## Priority Tasks
### Due Today
- [ ] Task 1
- [ ] Task 2
### Flagged
- [ ] Task 3
### Overdue
- [ ] Task 4 (due [date])
## Recent Emails (Last 24h)
[X emails in inbox from last 24 hours]
### Needs Response
- From: [sender] - [subject] (snippet)
- From: [sender] - [subject] (snippet)
### FYI/Notifications
- [sender] - [subject]
## Freshservice
### Technology Tickets: [count] open
[Top 3-5 tickets by priority/age]
### Software Development Tickets: [count] open
[List tickets in Software Dev workspace]
### Pending Approvals: [count]
[List with ticket #, requester, summary]
## Team Activity (Last Business Day: [DAY, DATE])
**Data Source Verification (REQUIRED):**
- Technology EOD script returned: [X] messages from [list exact sender names from JSON]
- Safety & Security EOD script returned: [X] messages from [list exact sender names from JSON]
- Freshservice daily summary returned: [X] tickets by [list exact agent names from JSON]
*Use ONLY the names listed above. Never invent or paraphrase names.*
### Technology Team EOD Summaries
**[Name from sender field]** - [Location(s)]
- [Key accomplishment 1 - be specific about what they did]
- [Key accomplishment 2]
- [Notable: any interesting problems solved or projects]
**[Name from sender field]** - [Location(s)]
- [Key accomplishment 1]
- [Key accomplishment 2]
- [Issues: any blockers or problems mentioned]
*[Continue for each team member who posted an EOD summary]*
### Safety & Security Team EOD Summaries
**[Name from sender field]** - [Location(s)]
- [Key accomplishment 1]
- [Key accomplishment 2]
- [Notable: any issues or incidents handled]
*If sender shows as user ID (users/12345...), display: **Unknown (users/12345...)** - [Location]*
*[Continue for each team member who posted an EOD summary]*
### Tickets Completed by Team: [count]
| Agent | Tickets | Top Categories |
|-------|---------|----------------|
| [Name from byAgent field] | X | Password Reset (Y), Chromebook (Z) |
### Ticket Trends
- Volume: [up/down/stable] vs previous days
- Notable patterns: [any spikes or anomalies]
## EdTech News
### [Article Title 1] - [Source]
[2-3 sentence synopsis: what happened, why it matters, key takeaway]
### [Article Title 2] - [Source]
[2-3 sentence synopsis]
### [Article Title 3] - [Source]
[2-3 sentence synopsis]
## AI News
### [Article Title 1] - [Source]
[2-3 sentence synopsis: what's the development, industry impact, relevance]
### [Article Title 2] - [Source]
[2-3 sentence synopsis]
### [Article Title 3] - [Source]
[2-3 sentence synopsis]
## K-12 Leadership News
### [Article Title 1] - [Source]
[2-3 sentence synopsis: policy/leadership development, impact, relevance to tech leadership]
### [Article Title 2] - [Source]
[2-3 sentence synopsis]
## School Safety & Security News
### [Article Title 1] - [Source]
[2-3 sentence synopsis: what happened, impact on safety practices, takeaway for districts]
### [Article Title 2] - [Source]
[2-3 sentence synopsis]
### [Article Title 3] - [Source]
[2-3 sentence synopsis]
## Legislative Activity ([Last Biz Day] - Today)
[X] education bills had movement:
### 🔴 HIGH Priority
#### [Bill ID] - [Short Title]
**Action**: [What happened - hearing, vote, committee action, etc.]
**Summary**: [1-2 sentences: what the bill does, potential district impact]
### 🟡 MEDIUM Priority
#### [Bill ID] - [Short Title]
**Action**: [What happened]
**Summary**: [1-2 sentences]
### 🟢 LOW Priority
- [Bill ID]: [Action type] - [One line summary]
*No legislative activity since [date]* - if no bills moved
## Quick Stats
- Calendar events: X
- Tasks overdue: X | Due today: X | Flagged: X
- Open tickets (Tech): X
- Open tickets (Software Dev): X
- Pending approvals: X
- Recent emails (24h): X
- Team tickets closed [last biz day]: X
- News articles: EdTech (X) | AI (X) | Leadership (X)
- Legislative bills with activity: X
2.3 生成播客脚本(扩展格式)
将简报改写为内容全面、对话式的音频脚本:
- 使用第一人称,语气轻松而专业
- 朗读时长为 10-15 分钟(约 1500-2000 个单词)
- 直接面向听众(例如:“以下是今天你需要了解的内容……”)
必需章节(按顺序):
-
开场(约 100 个单词)
- 星期、日期、天气概况
- 简要预告重点内容
-
日历与日程安排(约 150 个单词)
- 介绍今天的活动及其背景
- 突出重要会议/活动
- 提醒日程冲突或需要提前准备的事项
-
任务与优先事项(约 150 个单词)
- 需要处理的逾期事项
- 今天到期的事项
- 标记的优先事项
-
工单与服务台(约 150 个单词)
- 未结的技术工单
- 软件开发工单
- 待审批事项
-
团队动态 - 详细内容(约 400 个单词)
- 技术团队在上一个工作日完成的工作
- 点名介绍 3-5 名团队成员及其具体工作
- 值得关注的项目和解决的棘手问题
- 安全与安保团队完成的工作
- 工单关闭总数
关键要求 - 禁止臆造:
- 只能使用脚本输出中
sender字段里的姓名 - 只能使用
get_daily_summary.js输出中的工单数量 - 如果脚本没有返回任何消息,请说“没有发布任何 EOD 消息”
- 绝不要臆造姓名、地点或工作成果
-
教育科技新闻(约 200 个单词)
- 介绍 2-3 篇文章并概述内容
- 说明每篇文章对 K-12 教育的重要性
-
AI 新闻(约 200 个单词)
- 介绍 2-3 篇文章并概述内容
- 分析行业影响及相关性
-
K-12 教育领导力新闻(约 150 个单词)
- 介绍 1-2 篇文章并概述内容
- 说明政策/领导力方面的影响
8b. 校园安全与安保新闻(约 150 个单词)
- 介绍 2-3 篇文章并概述内容
- 说明安全实践及对学区的影响
-
立法动态(约 150 个单词)
- 介绍自上一个工作日起举行听证会、表决或审议的法案
- 突出对学区有直接影响(财政、运营、人员配置)的法案
- 如有相关信息,注明即将举行的听证会日期
- 星期一时,概述周末动态
-
结尾(约 100 个单词)
- 列出当天最重要的 3 项优先事项
- 结束致辞
风格指南:
- 介绍团队成员的工作时,使用名字
- 提供具体细节(不要说“处理了工单”,而要说“解决了 34 台 Chromebook 的维修问题”)
- 各章节之间衔接自然
- 简要评论并分析新闻内容
保存到 /tmp/morning_briefing_podcast.txt
第三阶段:制作播客
uv run --with mlx-audio --with pydub /Users/hagelk/non-ic-code/geoffrey/skills/local-tts/scripts/generate_audio.py \
--file /tmp/morning_briefing_podcast.txt \
--voice af_heart \
--output ~/Desktop/morning_briefing_[DATE].mp3
语音选择:af_heart(温暖、友好,适合晨间简报) 注意:使用本地 MLX TTS(Kokoro 模型),无需支付 API 费用
第 3.5 阶段:生成信息图(必做)
关键要求: 必须生成信息图。不得跳过此阶段。
使用 image-gen 技能创建视觉摘要信息图。
3.5.1 编写信息图提示词
根据收集到的数据,为信息图构建提示词:
Create an infographic summarizing a daily work briefing for [DATE].
Visual concept: A clean dashboard layout with distinct sections for different data categories.
Key data to display:
- Weather: [conditions], High [X]°F, Low [Y]°F
- Calendar: [X] events today, highlight: [key meeting]
- Tasks: [X] overdue, [Y] due today, [Z] flagged
- Tickets: [X] Technology open, [Y] Software Dev open
- Team Activity: [X] tickets closed by team yesterday
- Emails: [X] in inbox from last 24h
Style: Professional, clean design with PSD brand colors (navy blue #003366, gold accent #FFD700).
Flat design, clear sections, modern sans-serif typography.
Layout: Horizontal 16:9, organized as a dashboard with weather top-left, calendar top-right,
tasks and tickets in middle row, team stats at bottom.
Title: "Daily Briefing - [DATE]"
Subtitle: "Gig Harbor, WA"
3.5.2 生成图像
uv run /Users/hagelk/non-ic-code/geoffrey/skills/image-gen/scripts/generate.py \
"[infographic prompt]" \
~/Desktop/morning_briefing_[DATE].png \
16:9 \
2K
设置:
- 宽高比:16:9(横向仪表板)
- 尺寸:2K(确保文字清晰易读)
- 输出:
~/Desktop/morning_briefing_[DATE].png
第四阶段:保存到 Obsidian
4.1 将信息图复制到 Obsidian 资源目录
cp ~/Desktop/morning_briefing_[DATE].png \
~/Library/Mobile\ Documents/iCloud~md~obsidian/Documents/Personal_Notes/Geoffrey/Daily\ Briefings/assets/
4.2 将信息图添加到简报 Markdown 文件
在简报顶部(标题之后)添加:

4.3 保存简报文件
使用 Obsidian MCP 工具:
-
检查每日笔记是否存在:
mcp__obsidian-vault__get_vault_file filename: "Geoffrey/Daily Briefings/[YYYY-MM-DD].md" -
创建或更新:
mcp__obsidian-vault__create_vault_file filename: "Geoffrey/Daily Briefings/[YYYY-MM-DD].md" content: [full briefing markdown with infographic embed]
文件路径格式:Geoffrey/Daily Briefings/YYYY-MM-DD.md
备用方案(若 MCP 不可用):直接写入 iCloud 路径:
/Users/hagelk/Library/Mobile Documents/iCloud~md~obsidian/Documents/Personal_Notes/Geoffrey/Daily Briefings/[YYYY-MM-DD].md
第五阶段:发送电子邮件(HTML 格式并内嵌信息图)
5.1 生成 HTML 邮件正文
创建一封专业的 HTML 邮件(不是 Markdown)。请参考 skills/morning-briefing/templates/email.html 中的模板。
关键 HTML 结构:
<!DOCTYPE html>
<html>
<head>
<style>
body { font-family: -apple-system, BlinkMacSystemFont, sans-serif; max-width: 600px; margin: 0 auto; }
.header { text-align: center; border-bottom: 2px solid #003366; padding: 16px; }
.stat-box { background: #f8f9fa; padding: 12px; text-align: center; }
/* ... more styles from template ... */
</style>
</head>
<body>
<img src="cid:briefing_image" alt="Daily Briefing" style="width: 100%; max-width: 600px; border-radius: 8px; margin-bottom: 20px;">
<div class="header">
<h1 style="color: #003366;">Daily Briefing</h1>
<p>[DAY_OF_WEEK], [DATE_FORMATTED]</p>
</div>
<div style="background: #e8f4f8; padding: 16px; border-radius: 8px; margin-top: 20px;">
<strong>Attachments:</strong><br>
🎧 Audio Podcast (~10-15 min)<br>
📊 Infographic (also shown above)
</div>
<p style="text-align: center; color: #666; font-size: 12px;">
Full briefing: Obsidian/Geoffrey/Daily Briefings/[DATE].md
</p>
</body>
</html>
重要: <img src="cid:briefing_image"> 会在邮件顶部以内嵌方式显示信息图。
保存到 /tmp/morning_briefing_email.html
5.2 发送邮件并内嵌图片 + 添加附件
cd /Users/hagelk/non-ic-code/geoffrey/skills/google-workspace && bun gmail/send_with_attachments.js psd \
--to "[email protected]" \
--subject "Daily Briefing - [DATE]" \
--body-file /tmp/morning_briefing_email.html \
--html \
--inline-image "~/Desktop/morning_briefing_[DATE].png" \
--attachments "~/Desktop/morning_briefing_[DATE].mp3"
选项说明:
--html- 将正文视为 HTML(格式化所必需)--inline-image- 在邮件顶部内嵌图片(引用为cid:briefing_image)--attachments- 添加其他附件(播客)
结果:
- 信息图会以内嵌方式显示在邮件顶部(无需下载即可查看)
- 播客作为附件,可供下载
- 邮件在 Gmail 中以专业样式美观呈现
输出
返回标准化摘要:
## Summary
Generated daily briefing for [DATE]
## Actions
- Gathered calendar events: X
- Gathered tasks: X (Y due today, Z flagged)
- Gathered Technology tickets: X open, Y approvals pending
- Gathered Software Dev tickets: X open
- Gathered team EOD messages: X from [last business day]
- Gathered team completed tickets: X from [last business day]
- Weather: [conditions]
- News: X headlines
- Generated podcast: ~/Desktop/morning_briefing_[DATE].mp3
- Saved to Obsidian: Geoffrey/Daily Briefings/[DATE].md
- Email: [sent/skipped - reason]
## Status
[Status emoji] [Complete/Partial]
## Quick View
[2-3 line summary of most important items]
错误处理
Google Workspace 脚本缺失
如果日历或邮件脚本不存在:
- 跳过相应部分
- 在输出中注明“集成待完成”
- 继续使用可用的数据源
OmniFocus 未运行
Status: Partial
Note: OmniFocus not running - task data unavailable
Freshservice API 错误
Status: Partial
Note: Freshservice API error - ticket data unavailable
本地 TTS 生成失败
Status: Partial
Note: Audio generation failed - check mlx-audio setup
Briefing saved to Obsidian without podcast
依赖项
| 技能/工具 | 必需用途 | 回退方案 |
|---|---|---|
| google-workspace | 日历、邮件、团队 EOD | 跳过相应部分 |
| omnifocus-manager | 任务 | 跳过相应部分 |
| freshservice-manager | 工单、审批、团队统计 | 跳过相应部分 |
| local-tts | 音频播客 | 仅提供文本简报 |
| obsidian-vault (MCP) | 保存简报 | 仅显示 |
| WebSearch | 新闻、天气 | 跳过相应部分 |
配置
用户偏好
- 位置:Gig Harbor, WA(天气)
- 工作邮箱:psd 账号
- 技术工作区:workspace_id: 2
- 软件开发工作区:workspace_id: 13
- 技术聊天空间:spaces/AAAAxOtpv10(Technology Staff Check-Ins & Logs)
- 安全与保障聊天空间:spaces/AAAAFpQaAnA(PSD Safety & Security Team)
- 语音:af_heart(温暖、友好 - 本地 Kokoro TTS)
- 播客时长:10-15 分钟(约 1500-2000 字)
自定义
用户可以提出以下要求:
- “跳过新闻” - 省略新闻部分
- “不要播客” - 仅提供文本
- “只要日历和任务” - 提供精简简报