morning-briefing by krishagel/geoffrey
npx skills add https://github.com/krishagel/geoffrey --skill morning-briefing生成每日晨间简报,并通过三种方式交付:
执行以下数据收集步骤:
cd /Users/hagelk/non-ic-code/geoffrey/skills/google-workspace && bun calendar/list_events.js psd --today
返回包含今日事件的 JSON,包括:
账户:使用 psd 作为工作日历
osascript -l JavaScript /Users/hagelk/non-ic-code/geoffrey/skills/morning-briefing/scripts/get_due_flagged.js
返回以下任务:
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
# 获取 Gmail 查询格式的昨天日期
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
返回近期收件箱消息,包含:
过滤:仅显示仍在收件箱中的邮件(尚未被标记/处理)。
理念:过去 24 小时内仍在收件箱中的任何邮件都需要关注,无论是否已读。
账户:使用 psd 作为工作邮箱
bun /Users/hagelk/non-ic-code/geoffrey/skills/freshservice-manager/scripts/list_tickets.js '{"workspace_id": 2, "filter": "new_and_my_open"}'
返回分配给用户或在技术工作区中由用户创建的开放工单。
bun /Users/hagelk/non-ic-code/geoffrey/skills/freshservice-manager/scripts/get_approvals.js requested
返回等待审批的服务请求。
使用 WebSearch:
Gig Harbor WA weather today forecast
提取:
使用 WebSearch:
K-12 education technology news past 24 hours January 2026
对于找到的每篇文章(3-5 篇):
新鲜度检查:在包含前验证文章日期。仅包含过去 24 小时内发布的文章。即使出现在结果中,也跳过较旧的文章。
涵盖主题:
使用 WebSearch:
artificial intelligence news past 24 hours January 2026 latest
对于找到的每篇文章(3-5 篇):
新鲜度检查:在包含前验证文章日期。仅包含过去 24 小时内发布的文章。即使出现在结果中,也跳过较旧的文章。
涵盖主题:
使用 WebSearch:
K-12 school leadership superintendent news past 24 hours January 2026
对于找到的每篇文章(2-3 篇):
新鲜度检查:在包含前验证文章日期。仅包含过去 24 小时内发布的文章。即使出现在结果中,也跳过较旧的文章。
涵盖主题:
使用 WebSearch:
K-12 school safety security news past 24 hours January 2026
对于找到的每篇文章(3 篇):
新鲜度检查:在包含前验证文章日期。仅包含过去 24 小时内发布的文章。即使出现在结果中,也跳过较旧的文章。
涵盖主题:
从技术员工空间获取日终签到消息:
cd /Users/hagelk/non-ic-code/geoffrey/skills/google-workspace && bun chat/get_eod_messages.js psd spaces/AAAAxOtpv10 last-business-day
关键 - 严禁虚构:
sender 字段中出现的姓名在提取团队数据之前:
sender 值关键:从每位团队成员的日终消息中提取完整细节。查找包含 "Today:" 前缀的消息 - 这些是详细的日终摘要。
对于每位发布了日终摘要的团队成员:
sender 字段中的姓名)从原始消息中提取的示例:
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
注意:如果今天是周一,“上一个工作日” = 周五(如果周一是假日,则为周四)。
从安全与安保员工空间获取日终签到消息:
cd /Users/hagelk/non-ic-code/geoffrey/skills/google-workspace && bun chat/get_eod_messages.js psd spaces/AAAAFpQaAnA last-business-day
空间:PSD 安全与安保团队
关键 - 严禁虚构:
sender 字段中出现的姓名在提取团队数据之前:
sender 值使用与技术团队相同的格式提取 - 姓名、地点、成就、问题。
注意:如果今天是周一,“上一个工作日” = 周五(如果周一是假日,则为周四)。
获取技术团队在上一个工作日关闭的工单:
# 首先获取上一个工作日
LAST_BIZ_DAY=$(bun /Users/hagelk/non-ic-code/geoffrey/skills/morning-briefing/scripts/get_last_business_day.js | jq -r '.date')
# 然后获取该日期的每日摘要
bun /Users/hagelk/non-ic-code/geoffrey/skills/freshservice-manager/scripts/get_daily_summary.js "$LAST_BIZ_DAY"
关键 - 严禁虚构:
byAgent 部分中出现的代理姓名在报告工单统计信息之前:
get_daily_summary.js 的原始 JSON 输出byAgent 字段中的确切代理姓名返回:
工作区:技术(workspace_id: 2)
将上一个工作日与前几天进行比较以分析趋势:
# 获取最近 5 个工作日的摘要以进行趋势分析
# get_daily_summary.js 脚本支持日期解析
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"
# 等等。
分析:
获取软件开发工作区中的开放工单:
bun /Users/hagelk/non-ic-code/geoffrey/skills/freshservice-manager/scripts/search_tickets.js "status:2 OR status:3" 13
返回软件开发工作区中所有开放(status:2)和待处理(status:3)的工单。
工作区 ID:13(软件开发) 注意:这是用户用于 AI Studio 和其他 PSD 应用程序的内部软件开发错误跟踪器。
获取自上一个工作日以来有活动的 K-12 教育法案:
# 获取回溯信息和要检查的法案
bun /Users/hagelk/non-ic-code/geoffrey/skills/legislative-tracker/scripts/get_recent_bill_activity.js --last-business-day
返回:
工作流程:
get_recent_bill_activity.js 的输出latest_action_date >= lookback_start 的法案在周一:回溯从周五开始(如果周一是假日,则更早),因此包括所有周末活动(听证会、投票、委员会行动)。
要 WebFetch 的示例 URL:
https://app.leg.wa.gov/billsummary?BillNumber=1020&Year=2025https://app.leg.wa.gov/billsummary?BillNumber=5038&Year=2025注意:仅包含实际有活动的法案。如果没有法案有进展,则输出“自 [日期] 以来无立法活动”。
审查收集的数据并识别:
使用以下结构:
# 每日简报 - [日期]
## 天气
[当前状况,最高/最低,降水]
## 今日日历
| 时间 | 事件 | 地点 |
|------|-------|----------|
| ... | ... | ... |
**冲突/备注**:[任何问题]
## 优先级任务
### 今日到期
- [ ] 任务 1
- [ ] 任务 2
### 已标记
- [ ] 任务 3
### 已逾期
- [ ] 任务 4(到期 [日期])
## 近期邮件(过去 24 小时)
[过去 24 小时收件箱中有 X 封邮件]
### 需要回复
- 发件人:[发件人] - [主题](摘要)
- 发件人:[发件人] - [主题](摘要)
### 供参考/通知
- [发件人] - [主题]
## Freshservice
### 技术工单:[数量] 个开放
[按优先级/工龄排序的前 3-5 个工单]
### 软件开发工单:[数量] 个开放
[列出软件开发工作区中的工单]
### 待处理审批:[数量]
[列出工单号、请求者、摘要]
## 团队活动(上一个工作日:[星期几, 日期])
**数据源验证(必需):**
- 技术日终脚本返回了:[X] 条消息,来自 [列出 JSON 中的确切发件人姓名]
- 安全与安日日终脚本返回了:[X] 条消息,来自 [列出 JSON 中的确切发件人姓名]
- Freshservice 每日摘要返回了:[X] 个工单,由 [列出 JSON 中的确切代理姓名] 处理
*仅使用上面列出的姓名。严禁虚构或意译姓名。*
### 技术团队日终摘要
**[来自发件人字段的姓名]** - [地点]
- [关键成就 1 - 具体说明他们做了什么]
- [关键成就 2]
- [重要事项:任何解决的有趣问题或项目]
**[来自发件人字段的姓名]** - [地点]
- [关键成就 1]
- [关键成就 2]
- [问题:提到的任何阻碍或问题]
*[为每位发布了日终摘要的团队成员继续]*
### 安全与安保团队日终摘要
**[来自发件人字段的姓名]** - [地点]
- [关键成就 1]
- [关键成就 2]
- [重要事项:处理的任何问题或事件]
*如果发件人显示为用户 ID(users/12345...),则显示:**未知 (users/12345...)** - [地点]*
*[为每位发布了日终摘要的团队成员继续]*
### 团队完成的工单:[数量]
| 代理 | 工单数 | 主要类别 |
|-------|---------|----------------|
| [来自 byAgent 字段的姓名] | X | 密码重置 (Y), Chromebook (Z) |
### 工单趋势
- 数量:与前几天相比 [上升/下降/稳定]
- 显著模式:[任何激增或异常]
## 教育科技新闻
### [文章标题 1] - [来源]
[2-3 句摘要:发生了什么,为什么重要,关键要点]
### [文章标题 2] - [来源]
[2-3 句摘要]
### [文章标题 3] - [来源]
[2-3 句摘要]
## AI 新闻
### [文章标题 1] - [来源]
[2-3 句摘要:是什么发展,行业影响,相关性]
### [文章标题 2] - [来源]
[2-3 句摘要]
### [文章标题 3] - [来源]
[2-3 句摘要]
## K-12 领导力新闻
### [文章标题 1] - [来源]
[2-3 句摘要:政策/领导力发展,影响,与技术领导力的相关性]
### [文章标题 2] - [来源]
[2-3 句摘要]
## 学校安全与安保新闻
### [文章标题 1] - [来源]
[2-3 句摘要:发生了什么,对安全实践的影响,学区的要点]
### [文章标题 2] - [来源]
[2-3 句摘要]
### [文章标题 3] - [来源]
[2-3 句摘要]
## 立法活动([上一个工作日] - 今天)
[X] 个教育法案有进展:
### 🔴 高优先级
#### [法案 ID] - [简短标题]
**行动**:[发生了什么 - 听证会、投票、委员会行动等]
**摘要**:[1-2 句话:法案的作用,潜在的学区影响]
### 🟡 中优先级
#### [法案 ID] - [简短标题]
**行动**:[发生了什么]
**摘要**:[1-2 句话]
### 🟢 低优先级
- [法案 ID]: [行动类型] - [一行摘要]
*自 [日期] 以来无立法活动* - 如果没有法案有进展
## 快速统计
- 日历事件:X
- 逾期任务:X | 今日到期:X | 已标记:X
- 开放工单(技术):X
- 开放工单(软件开发):X
- 待处理审批:X
- 近期邮件(24 小时):X
- 团队关闭的工单 [上一个工作日]:X
- 新闻文章:教育科技 (X) | AI (X) | 领导力 (X)
- 有活动的立法法案:X
将简报转换为全面的对话式音频脚本:
必需部分(按顺序):
关键 - 严禁虚构:
* 仅使用脚本输出 sender 字段中的姓名
* 仅使用 get_daily_summary.js 输出中的工单数量
* 如果脚本未返回任何消息,则说“未发布日终消息”
* 严禁虚构姓名、地点或成就
6. 教育科技新闻(约 200 字)
* 2-3 篇文章附摘要
* 每篇对 K-12 的重要性
7. AI 新闻(约 200 字)
* 2-3 篇文章附摘要
* 行业影响和相关性
8. K-12 领导力新闻(约 150 字)
* 1-2 篇文章附摘要
* 政策/领导力影响
8b. 学校安全与安保新闻(约 150 字)
风格指南:
保存到 /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 成本
关键:必须生成信息图。不要跳过此阶段。
使用 image-gen 技能创建视觉摘要信息图。
根据收集的数据,为信息图构建提示词:
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"
uv run /Users/hagelk/non-ic-code/geoffrey/skills/image-gen/scripts/generate.py \
"[infographic prompt]" \
~/Desktop/morning_briefing_[DATE].png \
16:9 \
2K
设置:
~/Desktop/morning_briefing_[DATE].pngcp ~/Desktop/morning_briefing_[DATE].png \
~/Library/Mobile\ Documents/iCloud~md~obsidian/Documents/Personal_Notes/Geoffrey/Daily\ Briefings/assets/
在简报顶部(标题之后),添加:

使用 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: [包含信息图嵌入的完整简报 markdown]
文件路径模式: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 邮件(非 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>
<!-- 信息图在顶部 - 通过 cid:briefing_image 引用 -->
<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>
<!-- 天气、统计、日历、任务、团队、新闻部分 -->
<!-- 完整结构请参见 templates/email.html -->
<div style="background: #e8f4f8; padding: 16px; border-radius: 8px; margin-top: 20px;">
<strong>附件:</strong><br>
🎧 音频播客(约 10-15 分钟)<br>
📊 信息图(如上所示)
</div>
<p style="text-align: center; color: #666; font-size: 12px;">
完整简报:Obsidian/Geoffrey/Daily Briefings/[DATE].md
</p>
</body>
</html>
关键:<img src="cid:briefing_image"> 在邮件顶部内嵌显示信息图。
保存到 /tmp/morning_briefing_email.html
cd /Users/hagelk/non-ic-code/geoffrey/skills/google-workspace && bun gmail/send_with_attachments.js psd \
--to "hagelk@psd401.net" \
--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 - 要附加的额外文件(播客)结果:
返回标准化摘要:
## 摘要
为 [日期] 生成了每日简报
## 操作
- 收集了日历事件:X
- 收集了任务:X(Y 个今日到期,Z 个已标记)
- 收集了技术工单:X 个开放,Y 个待处理审批
- 收集了软件开发工单:X 个开放
- 收集了团队日终消息:X 条,来自 [上一个工作日]
- 收集了团队完成的工单:X 个,来自 [上一个工作日]
- 天气:[状况]
- 新闻:X 条头条
- 生成了播客:~/Desktop/morning_briefing_[DATE].mp3
- 保存到 Obsidian:Geoffrey/Daily Briefings/[DATE].md
- 电子邮件:[已发送/已跳过 - 原因]
## 状态
[状态表情] [完成/部分完成]
## 快速查看
[2-3 行最重要项目的摘要]
如果日历/邮件脚本不存在:
Status: Partial
Note: OmniFocus not running - task data unavailable
Status: Partial
Note: Freshservice API error - ticket data unavailable
Status: Partial
Note: Audio generation failed - check mlx-audio setup
Briefing saved to Obsidian without podcast
| 技能/工具 | 所需功能 | 备用方案 |
|---|---|---|
| google-workspace | 日历、邮件、团队日终 | 跳过部分 |
| omnifocus-manager | 任务 | 跳过部分 |
| freshservice-manager | 工单、审批、团队统计 | 跳过部分 |
| local-tts | 音频播客 | 仅文本简报 |
| obsidian-vault (MCP) | 保存简报 | 仅显示 |
| WebSearch | 新闻、天气 | 跳过部分 |
用户可以请求:
每周安装次数
117
仓库
GitHub 星标数
3
首次出现
2026年1月29日
安全审计
安装于
openclaw104
codex103
gemini-cli102
opencode102
cursor100
kimi-cli96
Generates a daily morning briefing and delivers it three ways:
Execute these data gathering steps:
cd /Users/hagelk/non-ic-code/geoffrey/skills/google-workspace && bun calendar/list_events.js psd --today
Returns JSON with today's events including:
Account : Use psd for work calendar
osascript -l JavaScript /Users/hagelk/non-ic-code/geoffrey/skills/morning-briefing/scripts/get_due_flagged.js
Returns tasks that are:
# 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
Returns recent inbox messages with:
Filtering : Only show emails still in inbox (not already labeled/processed).
Philosophy : Any email still in inbox from last 24 hours needs attention, read or not.
Account : Use psd for work email
bun /Users/hagelk/non-ic-code/geoffrey/skills/freshservice-manager/scripts/list_tickets.js '{"workspace_id": 2, "filter": "new_and_my_open"}'
Returns open tickets assigned to or created by user in Technology workspace.
bun /Users/hagelk/non-ic-code/geoffrey/skills/freshservice-manager/scripts/get_approvals.js requested
Returns service requests awaiting approval.
Use WebSearch:
Gig Harbor WA weather today forecast
Extract:
Use WebSearch:
K-12 education technology news past 24 hours January 2026
For each article found (3-5 articles):
Freshness check : Verify article dates before including. Only include articles published within the last 24 hours. Skip older articles even if they appear in results.
Topics to cover:
Use WebSearch:
artificial intelligence news past 24 hours January 2026 latest
For each article found (3-5 articles):
Freshness check : Verify article dates before including. Only include articles published within the last 24 hours. Skip older articles even if they appear in results.
Topics to cover:
Use WebSearch:
K-12 school leadership superintendent news past 24 hours January 2026
For each article found (2-3 articles):
Freshness check : Verify article dates before including. Only include articles published within the last 24 hours. Skip older articles even if they appear in results.
Topics to cover:
Use WebSearch:
K-12 school safety security news past 24 hours January 2026
For each article found (3 articles):
Freshness check : Verify article dates before including. Only include articles published within the last 24 hours. Skip older articles even if they appear in results.
Topics to cover:
Get end-of-day check-in messages from the Technology Staff space:
cd /Users/hagelk/non-ic-code/geoffrey/skills/google-workspace && bun chat/get_eod_messages.js psd spaces/AAAAxOtpv10 last-business-day
CRITICAL - NO HALLUCINATION:
sender field of the script outputBefore extracting team data:
sender values returnedCRITICAL : Extract FULL details from each team member's EOD message. Look for messages that contain "Today:" prefix - these are the detailed EOD summaries.
For each team member who posted an EOD summary:
sender field)Example extraction from raw message:
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
Note : If today is Monday, "last business day" = Friday (or Thursday if Friday was a holiday).
Get end-of-day check-in messages from the Safety & Security Staff space:
cd /Users/hagelk/non-ic-code/geoffrey/skills/google-workspace && bun chat/get_eod_messages.js psd spaces/AAAAFpQaAnA last-business-day
Space : PSD Safety & Security Team
CRITICAL - NO HALLUCINATION:
sender field of the script outputBefore extracting team data:
sender values returnedExtract using same format as Technology Team - names, locations, accomplishments, issues.
Note : If today is Monday, "last business day" = Friday (or Thursday if Friday was a holiday).
Get tickets closed by the Technology team on the last business day:
# 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"
CRITICAL - NO HALLUCINATION:
byAgent section of script outputBefore reporting ticket stats:
get_daily_summary.jsbyAgent fieldReturns:
Workspace : Technology (workspace_id: 2)
Compare last business day to previous days for trends:
# 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.
Analyze for:
Get open tickets in the Software Development workspace:
bun /Users/hagelk/non-ic-code/geoffrey/skills/freshservice-manager/scripts/search_tickets.js "status:2 OR status:3" 13
Returns all open (status:2) and pending (status:3) tickets in the Software Development workspace.
Workspace ID : 13 (Software Development) Note : This is the user's internal software development bug tracker for AI Studio and other PSD applications.
Get K-12 education bills with activity since the last business day:
# 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
This returns:
Workflow:
get_recent_bill_activity.jsOn Monday : Lookback starts on Friday (or earlier if Friday was a holiday), so includes all weekend activity (hearings, votes, committee actions).
Example URLs to WebFetch:
https://app.leg.wa.gov/billsummary?BillNumber=1020&Year=2025https://app.leg.wa.gov/billsummary?BillNumber=5038&Year=2025Note : Only include bills that actually had activity. If no bills moved, output "No legislative activity since [date]".
Review gathered data and identify:
Use this structure:
# 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
Transform the briefing into a comprehensive conversational audio script:
Required Sections (in order):
Opening (~100 words)
Calendar & Schedule (~150 words)
Tasks & Priorities (~150 words)
Tickets & Service Desk (~150 words)
Team Activity - DETAILED (~400 words)
CRITICAL - NO HALLUCINATION:
* Use ONLY names from the script output `sender` fields
* Use ONLY ticket counts from the `get_daily_summary.js` output
* If script returned no messages, say "No EOD messages were posted"
* NEVER invent names, locations, or accomplishments
6. EdTech News (~200 words)
* 2-3 articles with synopses
* Why each matters for K-12
7. AI News (~200 words)
* 2-3 articles with synopses
* Industry impact and relevance
8. K-12 Leadership News (~150 words)
* 1-2 articles with synopses
* Policy/leadership implications
8b. School Safety & Security News (~150 words)
Legislative Update (~150 words)
Closing (~100 words)
* Top 3 priorities for the day
* Sign off
Style Guidelines:
Save to /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
Voice Selection : af_heart (warm, friendly - good for morning briefing) Note : Uses local MLX TTS (Kokoro model) - no API costs
CRITICAL: The infographic MUST be generated. Do not skip this phase.
Create a visual summary infographic using the image-gen skill.
Based on gathered data, construct a prompt for the infographic:
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"
uv run /Users/hagelk/non-ic-code/geoffrey/skills/image-gen/scripts/generate.py \
"[infographic prompt]" \
~/Desktop/morning_briefing_[DATE].png \
16:9 \
2K
Settings:
~/Desktop/morning_briefing_[DATE].pngcp ~/Desktop/morning_briefing_[DATE].png \
~/Library/Mobile\ Documents/iCloud~md~obsidian/Documents/Personal_Notes/Geoffrey/Daily\ Briefings/assets/
At the top of the briefing (after the title), add:

Use Obsidian MCP tools:
Check if daily note exists :
mcp__obsidian-vault__get_vault_file
filename: "Geoffrey/Daily Briefings/[YYYY-MM-DD].md"
Create or update :
mcp__obsidian-vault__create_vault_file
filename: "Geoffrey/Daily Briefings/[YYYY-MM-DD].md"
content: [full briefing markdown with infographic embed]
File path pattern : Geoffrey/Daily Briefings/YYYY-MM-DD.md
Fallback (if MCP unavailable): Write directly to iCloud path:
/Users/hagelk/Library/Mobile Documents/iCloud~md~obsidian/Documents/Personal_Notes/Geoffrey/Daily Briefings/[YYYY-MM-DD].md
Create a professional HTML email (NOT markdown). Use the template at skills/morning-briefing/templates/email.html as reference.
Key HTML structure:
<!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>
<!-- Infographic at TOP - referenced via cid:briefing_image -->
<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>
<!-- Weather, Stats, Calendar, Tasks, Team, News sections -->
<!-- See templates/email.html for full structure -->
<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>
CRITICAL: The <img src="cid:briefing_image"> displays the infographic inline at the top of the email.
Save to /tmp/morning_briefing_email.html
cd /Users/hagelk/non-ic-code/geoffrey/skills/google-workspace && bun gmail/send_with_attachments.js psd \
--to "hagelk@psd401.net" \
--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"
Options explained:
--html - Treat body as HTML (required for formatting)--inline-image - Embeds image at top of email (referenced as cid:briefing_image)--attachments - Additional files to attach (podcast)Result:
Return standardized summary:
## 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]
If calendar/email scripts don't exist:
Status: Partial
Note: OmniFocus not running - task data unavailable
Status: Partial
Note: Freshservice API error - ticket data unavailable
Status: Partial
Note: Audio generation failed - check mlx-audio setup
Briefing saved to Obsidian without podcast
| Skill/Tool | Required For | Fallback |
|---|---|---|
| google-workspace | Calendar, email, team EOD | Skip sections |
| omnifocus-manager | Tasks | Skip section |
| freshservice-manager | Tickets, approvals, team stats | Skip section |
| local-tts | Audio podcast | Text-only briefing |
| obsidian-vault (MCP) | Save briefing | Display only |
| WebSearch | News, weather | Skip sections |
Users can request:
Weekly Installs
117
Repository
GitHub Stars
3
First Seen
Jan 29, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykWarn
Installed on
openclaw104
codex103
gemini-cli102
opencode102
cursor100
kimi-cli96
Azure RBAC 权限管理工具:查找最小角色、创建自定义角色与自动化分配
135,700 周安装